package co.smartreceipts.android.persistence.database.tables.adapters; import android.content.ContentValues; import android.database.Cursor; 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.model.Column; import co.smartreceipts.android.model.ColumnDefinitions; import co.smartreceipts.android.model.Receipt; import co.smartreceipts.android.model.impl.columns.ConstantColumn; import co.smartreceipts.android.persistence.database.operations.DatabaseOperationMetadata; import co.smartreceipts.android.persistence.database.operations.OperationFamilyType; import co.smartreceipts.android.persistence.database.tables.keys.PrimaryKey; import co.smartreceipts.android.sync.model.SyncState; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) public class ColumnDatabaseAdapterTest { private static final String ID_COLUMN = "id_column"; private static final String NAME_COLUMN = "name_column"; private static final int ID = 5; private static final int PRIMARY_KEY_ID = 11; private static final String NAME = "abcd"; // Class under test ColumnDatabaseAdapter mColumnDatabaseAdapter; @Mock Cursor mCursor; @Mock Column<Receipt> mColumn; @Mock PrimaryKey<Column<Receipt>, Integer> mPrimaryKey; @Mock ColumnDefinitions<Receipt> mReceiptColumnDefinitions; @Mock SyncStateAdapter mSyncStateAdapter; @Mock SyncState mSyncState, mGetSyncState; Column<Receipt> mIdColumn; Column<Receipt> mPrimaryKeyIdColumn; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); final int idIndex = 1; final int nameIndex = 2; when(mCursor.getColumnIndex(ID_COLUMN)).thenReturn(idIndex); when(mCursor.getColumnIndex(NAME_COLUMN)).thenReturn(nameIndex); when(mCursor.getInt(idIndex)).thenReturn(ID); when(mCursor.getString(nameIndex)).thenReturn(NAME); when(mColumn.getId()).thenReturn(ID); when(mColumn.getName()).thenReturn(NAME); when(mColumn.getSyncState()).thenReturn(mSyncState); mIdColumn = new ConstantColumn<>(ID, NAME, mSyncState); mPrimaryKeyIdColumn = new ConstantColumn<>(PRIMARY_KEY_ID, NAME, mGetSyncState); when(mReceiptColumnDefinitions.getColumn(ID, NAME, mSyncState)).thenReturn(mIdColumn); when(mReceiptColumnDefinitions.getColumn(PRIMARY_KEY_ID, NAME, mGetSyncState)).thenReturn(mPrimaryKeyIdColumn); when(mPrimaryKey.getPrimaryKeyValue(mColumn)).thenReturn(PRIMARY_KEY_ID); when(mSyncStateAdapter.read(mCursor)).thenReturn(mSyncState); when(mSyncStateAdapter.get(any(SyncState.class), any(DatabaseOperationMetadata.class))).thenReturn(mGetSyncState); mColumnDatabaseAdapter = new ColumnDatabaseAdapter(mReceiptColumnDefinitions, ID_COLUMN, NAME_COLUMN, mSyncStateAdapter); } @Test public void read() throws Exception { assertEquals(mIdColumn, mColumnDatabaseAdapter.read(mCursor)); } @Test public void write() throws Exception { final String sync = "sync"; final ContentValues syncValues = new ContentValues(); syncValues.put(sync, sync); when(mSyncStateAdapter.writeUnsynced(mSyncState)).thenReturn(syncValues); final ContentValues contentValues = mColumnDatabaseAdapter.write(mColumn, new DatabaseOperationMetadata()); assertEquals(NAME, contentValues.getAsString(NAME_COLUMN)); assertEquals(sync, contentValues.getAsString(sync)); assertFalse(contentValues.containsKey(ID_COLUMN)); } @Test public void writeUnsycned() throws Exception { final String sync = "sync"; final ContentValues syncValues = new ContentValues(); syncValues.put(sync, sync); when(mSyncStateAdapter.write(mSyncState)).thenReturn(syncValues); final ContentValues contentValues = mColumnDatabaseAdapter.write(mColumn, new DatabaseOperationMetadata(OperationFamilyType.Sync)); assertEquals(NAME, contentValues.getAsString(NAME_COLUMN)); assertEquals(sync, contentValues.getAsString(sync)); assertFalse(contentValues.containsKey(ID_COLUMN)); } @Test public void build() throws Exception { assertEquals(mPrimaryKeyIdColumn, mColumnDatabaseAdapter.build(mColumn, mPrimaryKey, mock(DatabaseOperationMetadata.class))); assertEquals(mPrimaryKeyIdColumn.getSyncState(), mColumnDatabaseAdapter.build(mColumn, mPrimaryKey, mock(DatabaseOperationMetadata.class)).getSyncState()); } }