package co.smartreceipts.android.ocr.widget.configuration; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import co.smartreceipts.android.analytics.Analytics; import co.smartreceipts.android.identity.IdentityManager; import co.smartreceipts.android.identity.store.EmailAddress; import co.smartreceipts.android.ocr.purchases.OcrPurchaseTracker; import co.smartreceipts.android.purchases.PurchaseManager; import co.smartreceipts.android.purchases.model.AvailablePurchase; import co.smartreceipts.android.purchases.model.InAppPurchase; import co.smartreceipts.android.purchases.source.PurchaseSource; import co.smartreceipts.android.settings.UserPreferenceManager; import co.smartreceipts.android.settings.catalog.UserPreference; import io.reactivex.Observable; import io.reactivex.observers.TestObserver; import io.reactivex.subjects.PublishSubject; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) public class OcrConfigurationInteractorTest { @InjectMocks OcrConfigurationInteractor interactor; @Mock IdentityManager identityManager; @Mock OcrPurchaseTracker ocrPurchaseTracker; @Mock PurchaseManager purchaseManager; @Mock UserPreferenceManager userPreferenceManager; @Mock Analytics analytics; @Mock AvailablePurchase availablePurchase, availablePurchase2; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); } @Test public void getEmail() { final EmailAddress emailAddress = new EmailAddress("email"); when(identityManager.getEmail()).thenReturn(emailAddress); assertEquals(emailAddress, interactor.getEmail()); } @Test public void getRemainingScansStream() { final PublishSubject<Integer> scanSubject = PublishSubject.create(); when(ocrPurchaseTracker.getRemainingScansStream()).thenReturn(scanSubject); TestObserver<Integer> testObserver = interactor.getRemainingScansStream().test(); scanSubject.onNext(61); testObserver.assertValue(61); testObserver.assertNotComplete(); testObserver.assertNoErrors(); } @Test public void getAvailableOcrPurchasesOrdersByPrice() { when(availablePurchase.getInAppPurchase()).thenReturn(InAppPurchase.OcrScans50); when(availablePurchase2.getInAppPurchase()).thenReturn(InAppPurchase.OcrScans10); when(availablePurchase.getPriceAmountMicros()).thenReturn(500000L); when(availablePurchase2.getPriceAmountMicros()).thenReturn(100000L); final Set<AvailablePurchase> purchaseSet = new HashSet<>(Arrays.asList(availablePurchase, availablePurchase2)); when(purchaseManager.getAllAvailablePurchases()).thenReturn(Observable.just(purchaseSet)); TestObserver<List<AvailablePurchase>> testObserver = interactor.getAvailableOcrPurchases().test(); testObserver.awaitTerminalEvent(); testObserver.assertValue(Arrays.asList(availablePurchase2, availablePurchase)); testObserver.assertComplete(); testObserver.assertNoErrors(); } @Test public void startOcrPurchase() { when(availablePurchase.getInAppPurchase()).thenReturn(InAppPurchase.OcrScans50); interactor.startOcrPurchase(availablePurchase); verify(purchaseManager).initiatePurchase(InAppPurchase.OcrScans50, PurchaseSource.Ocr); } @Test public void getOcrIsEnabled() { when(userPreferenceManager.getObservable(UserPreference.Misc.OcrIsEnabled)).thenReturn(Observable.just(false)); final TestObserver<Boolean> testObserver1 = interactor.getOcrIsEnabled().test(); testObserver1.awaitTerminalEvent(); testObserver1.assertValue(false); testObserver1.assertComplete(); testObserver1.assertNoErrors(); when(userPreferenceManager.getObservable(UserPreference.Misc.OcrIsEnabled)).thenReturn(Observable.just(true)); final TestObserver<Boolean> testObserver2 = interactor.getOcrIsEnabled().test(); testObserver2.awaitTerminalEvent(); testObserver2.assertValue(true); testObserver2.assertComplete(); testObserver2.assertNoErrors(); } @Test public void setOcrIsEnabled() { interactor.setOcrIsEnabled(false); verify(userPreferenceManager).set(UserPreference.Misc.OcrIsEnabled, false); interactor.setOcrIsEnabled(true); verify(userPreferenceManager).set(UserPreference.Misc.OcrIsEnabled, true); } @Test public void getAllowUsToSaveImagesRemotely() { when(userPreferenceManager.getObservable(UserPreference.Misc.OcrIncognitoMode)).thenReturn(Observable.just(true)); final TestObserver<Boolean> testObserver1 = interactor.getAllowUsToSaveImagesRemotely().test(); testObserver1.awaitTerminalEvent(); testObserver1.assertValue(false); testObserver1.assertComplete(); testObserver1.assertNoErrors(); when(userPreferenceManager.getObservable(UserPreference.Misc.OcrIncognitoMode)).thenReturn(Observable.just(false)); final TestObserver<Boolean> testObserver2 = interactor.getAllowUsToSaveImagesRemotely().test(); testObserver2.awaitTerminalEvent(); testObserver2.assertValue(true); testObserver2.assertComplete(); testObserver2.assertNoErrors(); } @Test public void setAllowUsToSaveImagesRemotely() { interactor.setAllowUsToSaveImagesRemotely(false); verify(userPreferenceManager).set(UserPreference.Misc.OcrIncognitoMode, true); interactor.setAllowUsToSaveImagesRemotely(true); verify(userPreferenceManager).set(UserPreference.Misc.OcrIncognitoMode, false); } }