package co.smartreceipts.android.ocr.widget.tooltip; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import co.smartreceipts.android.activities.NavigationHandler; import co.smartreceipts.android.analytics.Analytics; import co.smartreceipts.android.identity.IdentityManager; import co.smartreceipts.android.ocr.purchases.OcrPurchaseTracker; import io.reactivex.Single; import io.reactivex.observers.TestObserver; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) public class OcrInformationalTooltipInteractorTest { // Class under test OcrInformationalTooltipInteractor interactor; @Mock NavigationHandler navigationHandler; @Mock Analytics analytics; @Mock OcrInformationalTooltipStateTracker stateTracker; @Mock OcrPurchaseTracker ocrPurchaseTracker; @Mock IdentityManager identityManager; @Before public void setUp() { MockitoAnnotations.initMocks(this); interactor = new OcrInformationalTooltipInteractor(navigationHandler, analytics, stateTracker, ocrPurchaseTracker, identityManager); } @Test public void getShowOcrTooltipForLotsOfPurchasesWhenSetToShowTooltip() { when(stateTracker.shouldShowOcrInfo()).thenReturn(Single.just(true)); when(ocrPurchaseTracker.getRemainingScans()).thenReturn(6); when(ocrPurchaseTracker.hasAvailableScans()).thenReturn(true); when(identityManager.isLoggedIn()).thenReturn(true); TestObserver<OcrTooltipMessageType> testObserver = interactor.getShowOcrTooltip().test(); testObserver.awaitTerminalEvent(); testObserver.assertNoValues(); testObserver.assertComplete(); testObserver.assertNoErrors(); verify(stateTracker, never()).setShouldShowOcrInfo(true); } @Test public void getShowOcrTooltipForLimitedPurchasesWhenSetToShowTooltip() { when(stateTracker.shouldShowOcrInfo()).thenReturn(Single.just(true)); when(ocrPurchaseTracker.getRemainingScans()).thenReturn(5); when(identityManager.isLoggedIn()).thenReturn(true); TestObserver<OcrTooltipMessageType> testObserver = interactor.getShowOcrTooltip().test(); testObserver.awaitTerminalEvent(); testObserver.assertValue(OcrTooltipMessageType.LimitedScansRemaining); testObserver.assertComplete(); testObserver.assertNoErrors(); verify(stateTracker).setShouldShowOcrInfo(true); } @Test public void getShowOcrTooltipForLimitedPurchasesWhenNotSetToShowTooltip() { when(stateTracker.shouldShowOcrInfo()).thenReturn(Single.just(false)); when(ocrPurchaseTracker.getRemainingScans()).thenReturn(5); when(identityManager.isLoggedIn()).thenReturn(true); TestObserver<OcrTooltipMessageType> testObserver = interactor.getShowOcrTooltip().test(); testObserver.awaitTerminalEvent(); testObserver.assertValue(OcrTooltipMessageType.LimitedScansRemaining); testObserver.assertComplete(); testObserver.assertNoErrors(); verify(stateTracker).setShouldShowOcrInfo(true); } @Test public void getShowOcrTooltipForNotConfiguredWhenSetToShowTooltip() { when(stateTracker.shouldShowOcrInfo()).thenReturn(Single.just(true)); TestObserver<OcrTooltipMessageType> testObserver = interactor.getShowOcrTooltip().test(); testObserver.awaitTerminalEvent(); testObserver.assertValue(OcrTooltipMessageType.NotConfigured); testObserver.assertComplete(); testObserver.assertNoErrors(); verify(stateTracker, never()).setShouldShowOcrInfo(true); } @Test public void getShowOcrTooltipForNotConfiguredWhenNotSetToShowTooltip() { when(stateTracker.shouldShowOcrInfo()).thenReturn(Single.just(false)); TestObserver<OcrTooltipMessageType> testObserver = interactor.getShowOcrTooltip().test(); testObserver.awaitTerminalEvent(); testObserver.assertNoValues(); testObserver.assertComplete(); testObserver.assertNoErrors(); verify(stateTracker, never()).setShouldShowOcrInfo(true); } @Test public void getShowOcrTooltipForNoRemainingPurchasesWhenSetToShowTooltip() { when(stateTracker.shouldShowOcrInfo()).thenReturn(Single.just(true)); when(ocrPurchaseTracker.hasAvailableScans()).thenReturn(false); when(identityManager.isLoggedIn()).thenReturn(true); TestObserver<OcrTooltipMessageType> testObserver = interactor.getShowOcrTooltip().test(); testObserver.awaitTerminalEvent(); testObserver.assertValue(OcrTooltipMessageType.NoScansRemaining); testObserver.assertComplete(); testObserver.assertNoErrors(); verify(stateTracker, never()).setShouldShowOcrInfo(true); } @Test public void getShowOcrTooltipForNoRemainingPurchasesWhenNotSetToShowTooltip() { when(stateTracker.shouldShowOcrInfo()).thenReturn(Single.just(false)); when(ocrPurchaseTracker.hasAvailableScans()).thenReturn(false); when(identityManager.isLoggedIn()).thenReturn(true); TestObserver<OcrTooltipMessageType> testObserver = interactor.getShowOcrTooltip().test(); testObserver.awaitTerminalEvent(); testObserver.assertNoValues(); testObserver.assertComplete(); testObserver.assertNoErrors(); verify(stateTracker, never()).setShouldShowOcrInfo(true); } @Test public void dismissTooltip() { interactor.dismissTooltip(); verify(stateTracker).setShouldShowOcrInfo(false); verifyZeroInteractions(navigationHandler); } @Test public void showOcrInformation() { interactor.showOcrConfiguration(); verify(navigationHandler).navigateToOcrConfigurationFragment(); } }