package pl.pola_app.ui.activity; import android.os.Bundle; import android.util.Log; import com.squareup.otto.Bus; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.annotation.Config; import pl.pola_app.TestApplication; import pl.pola_app.helpers.EventLogger; import pl.pola_app.helpers.SessionId; import pl.pola_app.model.SearchResult; import pl.pola_app.network.Api; import pl.pola_app.testutil.SearchUtil; import pl.pola_app.ui.adapter.ProductList; import pl.pola_app.ui.event.ReportButtonClickedEvent; import retrofit.Call; import retrofit.Response; import static org.junit.Assert.fail; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @Config(application = TestApplication.class) @RunWith(RobolectricGradleTestRunner.class) public class MainPresenterTest { private MainViewBinder viewBinder; private ProductList productList; private MainPresenter presenter; private Api api; private Bus eventBus; private EventLogger logger; private SessionId sessionId; @Before public void setUp() throws Exception { viewBinder = mock(MainViewBinder.class); productList = mock(ProductList.class); api = mock(Api.class); logger = mock(EventLogger.class); sessionId = mock(SessionId.class); eventBus = mock(Bus.class); presenter = new MainPresenter(viewBinder, productList, api, logger, sessionId, eventBus); } @Test public void testRegisterBus() throws Exception { presenter.register(); verify(eventBus).register(presenter); } @Test public void testUnregisterBus() throws Exception { presenter.unregister(); verify(eventBus).unregister(presenter); } @Test public void testCallCanceledOnUnregister() throws Exception { //noinspection unchecked Call<SearchResult> resultCall = mock(Call.class); when(api.getByCode(anyString(), anyString())).thenReturn(resultCall); presenter.onBarcode("code"); presenter.unregister(); verify(resultCall).cancel(); } @Test public void testDontAddExistingProduct() throws Exception { when(productList.itemExists("itemA")).thenReturn(true); presenter.onBarcode("itemA"); verify(productList, never()).createProductPlaceholder(); verifyNoMoreInteractions(api); } @Test public void testAddProduct() throws Exception { when(sessionId.get()).thenReturn("sessionId"); //noinspection unchecked when(api.getByCode(anyString(), anyString())).thenReturn(mock(Call.class)); presenter.onBarcode("barcode"); verify(productList).createProductPlaceholder(); verify(api).getByCode("barcode", "sessionId"); } @Test public void testProductAddedOnResponse() throws Exception { final SearchResult searchResult = SearchUtil.createSearchResult(1); presenter.onResponse(Response.success(searchResult), null); verify(productList).addProduct(searchResult); verifyNoMoreInteractions(productList); } @Test public void testResumeScanningOnResponse() throws Exception { final SearchResult searchResult = SearchUtil.createSearchResult(1); presenter.onResponse(Response.success(searchResult), null); verify(viewBinder).resumeScanning(); } @Test public void testResponseForUnsupportedBarCodes() throws Exception { final SearchResult searchResult = SearchUtil.createSearchResult(1); searchResult.product_id = null; try { presenter.onResponse(Response.success(searchResult), null); } catch (Exception e) { fail(Log.getStackTraceString(e)); } } @Test public void testPlaceholderRemovedOnFailedRequest() throws Exception { presenter.onFailure(new Throwable("msg")); verify(productList).removeProductPlaceholder(); verifyNoMoreInteractions(productList); } @Test public void testResumeScanningOnFailure() throws Exception { presenter.onFailure(new Throwable("msg")); verify(viewBinder).resumeScanning(); } @Test public void testShowErrorMessageOnFailure() throws Exception { presenter.onFailure(new Throwable("msg")); verify(viewBinder).showErrorMessage("msg"); } @Test public void testShowNoConnectionMessage() throws Exception { final String noConnectionMessage = "Unable to resolve host \"www.pola-app.pl\": No address associated with hostname"; presenter.onFailure(new Throwable(noConnectionMessage)); verify(viewBinder).showNoConnectionMessage(); } @Test public void testOpenProductDetailsOnClick() throws Exception { final SearchResult searchResult = SearchUtil.createSearchResult(1); presenter.onItemClicked(searchResult); verify(viewBinder).openProductDetails(searchResult); verify(viewBinder).turnOffTorch(); } @Test public void testDismissDetailsView() throws Exception { presenter.productDetailsFragmentDismissed(null); verify(viewBinder).dismissProductDetailsView(); } @Test public void testLaunchReportActivity() throws Exception { final SearchResult searchResult = SearchUtil.createSearchResult(1); searchResult.product_id = 123; presenter.reportButtonClicked(new ReportButtonClickedEvent(searchResult)); verify(viewBinder).launchReportActivity("123"); } @Test public void testSaveState() throws Exception { Bundle bundle = new Bundle(); presenter.onSaveState(bundle); verify(productList).writeToBundle(bundle); } }