package com.truckmuncher.app.vendor;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import com.squareup.otto.Bus;
import com.truckmuncher.api.trucks.Truck;
import com.truckmuncher.api.trucks.TruckService;
import com.truckmuncher.api.trucks.TrucksForVendorRequest;
import com.truckmuncher.api.trucks.TrucksForVendorResponse;
import com.truckmuncher.app.authentication.UserAccount;
import com.truckmuncher.app.data.PublicContract;
import com.truckmuncher.app.data.sql.Tables;
import com.truckmuncher.app.data.sync.ApiExceptionResolver;
import com.truckmuncher.testlib.ReadableRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.Arrays;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
@RunWith(ReadableRobolectricTestRunner.class)
public class VendorTruckStateResolverTest {
@Mock
TruckService truckService;
@Mock
ApiExceptionResolver exceptionResolver;
@Mock
SQLiteDatabase database;
@Mock
UserAccount userAccount;
@Mock
Bus bus;
VendorTruckStateResolver resolver;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
resolver = new VendorTruckStateResolver(truckService, exceptionResolver, database, userAccount, bus);
}
@Test
public void resultsAreNotStoredWhenRequestCreatesNewTruck() {
TrucksForVendorResponse response = new TrucksForVendorResponse.Builder()
.isNew(true)
.build();
when(truckService.getTrucksForVendor(any(TrucksForVendorRequest.class))).thenReturn(response);
resolver.resolveState();
verifyZeroInteractions(database);
}
@Test
public void oldDataGetsClearedAndNewDataGetsStored() {
TrucksForVendorResponse response = new TrucksForVendorResponse.Builder()
.trucks(Arrays.asList(new Truck.Builder()
.id("ID")
.name("My Truck")
.imageUrl("http://truckmuncher/images/my_truck")
.keywords(Arrays.asList("food"))
.primaryColor("#000000")
.secondaryColor("#FFFFFF")
.build()
)
)
.isNew(false)
.build();
when(truckService.getTrucksForVendor(any(TrucksForVendorRequest.class))).thenReturn(response);
when(userAccount.getUserId()).thenReturn("User ID");
resolver.resolveState();
ArgumentCaptor<String> tableCaptor = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<ContentValues> valuesCaptor = ArgumentCaptor.forClass(ContentValues.class);
ArgumentCaptor<String> whereClauseCaptor = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<String[]> whereArgsCaptor = ArgumentCaptor.forClass(String[].class);
verify(database, times(2)).update(tableCaptor.capture(), valuesCaptor.capture(), whereClauseCaptor.capture(), whereArgsCaptor.capture());
// Make sure that all old items are cleared
assertThat(tableCaptor.getAllValues().get(0)).isEqualTo(Tables.TRUCK_PROPERTIES);
assertThat(valuesCaptor.getAllValues().get(0).getAsString(PublicContract.Truck.OWNER_ID)).isNull();
assertThat(whereClauseCaptor.getAllValues().get(0)).isNull();
assertThat(whereArgsCaptor.getAllValues().get(0)).isNull();
// Make sure that the new item is added
assertThat(tableCaptor.getAllValues().get(1)).isEqualTo(Tables.TRUCK_PROPERTIES);
assertThat(valuesCaptor.getAllValues().get(1).getAsString(PublicContract.Truck.OWNER_ID)).isEqualTo("User ID");
assertThat(whereClauseCaptor.getAllValues().get(1)).isEqualTo("id=?");
assertThat(whereArgsCaptor.getAllValues().get(1)).containsExactly("ID");
}
}