package co.smartreceipts.android.sync.drive.listeners; 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 java.io.File; import co.smartreceipts.android.model.Receipt; import co.smartreceipts.android.persistence.database.operations.DatabaseOperationMetadata; import co.smartreceipts.android.persistence.database.operations.OperationFamilyType; import co.smartreceipts.android.sync.drive.managers.DriveDatabaseManager; import co.smartreceipts.android.sync.drive.managers.DriveReceiptsManager; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) public class ReceiptBackupListenerTest { // Class under test ReceiptBackupListener mListener; @Mock DriveDatabaseManager mDriveDatabaseManager; @Mock DriveReceiptsManager mDriveReceiptsManager; @Mock Receipt mReceipt; @Mock Receipt mOldReceipt; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mListener = new ReceiptBackupListener(mDriveDatabaseManager, mDriveReceiptsManager); } @Test public void onInsertSuccess() { mListener.onInsertSuccess(mReceipt, new DatabaseOperationMetadata()); verify(mDriveDatabaseManager).syncDatabase(); verify(mDriveReceiptsManager).handleInsertOrUpdate(mReceipt); } @Test public void onSyncInsertSuccess() { mListener.onInsertSuccess(mReceipt, new DatabaseOperationMetadata(OperationFamilyType.Sync)); verify(mDriveDatabaseManager, never()).syncDatabase(); verify(mDriveReceiptsManager, never()).handleInsertOrUpdate(any(Receipt.class)); } @Test public void onUpdateSuccess() { mListener.onUpdateSuccess(mOldReceipt, mReceipt, new DatabaseOperationMetadata()); verify(mDriveDatabaseManager, never()).syncDatabase(); verify(mDriveReceiptsManager).handleInsertOrUpdate(mReceipt); } @Test public void onSyncUpdateSuccess() { mListener.onUpdateSuccess(mOldReceipt, mReceipt, new DatabaseOperationMetadata(OperationFamilyType.Sync)); verify(mDriveDatabaseManager, never()).syncDatabase(); verify(mDriveReceiptsManager, never()).handleInsertOrUpdate(any(Receipt.class)); } @Test public void onSyncUpdateSuccessForReceiptWithFile() { // We always try to sync database changes when they include a receipt file to ensure we update this stuff immediately when(mReceipt.getFile()).thenReturn(mock(File.class)); mListener.onUpdateSuccess(mOldReceipt, mReceipt, new DatabaseOperationMetadata(OperationFamilyType.Sync)); verify(mDriveDatabaseManager).syncDatabase(); verify(mDriveReceiptsManager, never()).handleInsertOrUpdate(any(Receipt.class)); } @Test public void onDeleteSuccess() { mListener.onDeleteSuccess(mReceipt, new DatabaseOperationMetadata()); verify(mDriveDatabaseManager).syncDatabase(); verify(mDriveReceiptsManager).handleDelete(mReceipt); } @Test public void onSyncDeleteSuccess() { mListener.onDeleteSuccess(mReceipt, new DatabaseOperationMetadata(OperationFamilyType.Sync)); verify(mDriveDatabaseManager, never()).syncDatabase(); verify(mDriveReceiptsManager, never()).handleDelete(any(Receipt.class)); } }