package com.sheetsj.workitem;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import com.sheetsj.car.Car;
import com.sheetsj.manufacturer.Manufacturer;
import com.sheetsj.provider.Provider;
@RunWith(MockitoJUnitRunner.class)
public class WorkItemServiceTest {
private DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
@Mock
private WorkItemRepository workItemRepository;
@InjectMocks
@Spy
private WorkItemService service = new WorkItemService();
@Test
public void testGetYearAsString_1999() throws ParseException {
String result = service.getYearAsString(dateFormat.parse("03/01/1999"));
assertThat(result, is("1999"));
assertThat(result, is(equalTo("1999")));
}
@Test
public void testGetYearAsString_2000() throws ParseException {
String result = service.getYearAsString(dateFormat.parse("03/01/2000"));
assertThat(result, is("2000"));
}
@Test
public void testGetYearAsString_199() throws ParseException {
String result = service.getYearAsString(dateFormat.parse("03/01/199"));
assertThat(result, is("199"));
}
@Test
public void testGetYearAsString_13() throws ParseException {
String result = service.getYearAsString(dateFormat.parse("03/01/13"));
assertThat(result, is("13"));
}
@Test
public void testGetYearAsString_2013() throws ParseException {
String result = service.getYearAsString(dateFormat.parse("03/01/2013"));
assertThat(result, is("2013"));
}
@Test
public void testSelectWorkItemsByMakeAndYear() throws ParseException {
Manufacturer ford = new Manufacturer("ford");
Manufacturer toyota = new Manufacturer("toyota");
Car focus = new Car(2008, ford, "Focus", "4 cylinder");
Car f150 = new Car(2010, ford, "F-150", "High HP");
Car camry = new Car(2011, toyota, "Camry", "Sedan");
Provider tiresPlus = new Provider("Tires Plus", "Bellevue");
WorkItem workItem1 = buildWorkItem("01/01/2012", focus, tiresPlus);
WorkItem workItem2 = buildWorkItem("12/31/2012", f150, tiresPlus);
WorkItem workItem3 = buildWorkItem("01/01/2013", camry, tiresPlus);
WorkItem workItem4 = buildWorkItem("12/31/2013", f150, tiresPlus);
WorkItem workItem5 = buildWorkItem("12/01/2013", focus, tiresPlus);
List<WorkItem> allWorkItems = Arrays.asList(workItem1, workItem2, workItem3, workItem4, workItem5);
Collection<WorkItem> results = service.selectWorkItemsByMakeAndYear("ford", "2013", allWorkItems);
assertThat(results, containsInAnyOrder(workItem3, workItem5));
results = service.selectWorkItemsByMakeAndYear("ford", "2012", allWorkItems);
assertThat(results, containsInAnyOrder(workItem1, workItem2));
results = service.selectWorkItemsByMakeAndYear("chevy", "2013", allWorkItems);
assertThat(results, empty());
results = service.selectWorkItemsByMakeAndYear("ford", "2014", allWorkItems);
assertThat(results, empty());
}
@Test
public void testFindAllByMakeAndYear() throws ParseException {
Manufacturer ford = new Manufacturer("ford");
Manufacturer toyota = new Manufacturer("toyota");
Car focus = new Car(2008, ford, "Focus", "4 cylinder");
Car f150 = new Car(2010, ford, "F-150", "High HP");
Car camry = new Car(2011, toyota, "Camry", "Sedan");
Provider tiresPlus = new Provider("Tires Plus", "Bellevue");
WorkItem workItem1 = buildWorkItem("01/01/2012", focus, tiresPlus);
WorkItem workItem2 = buildWorkItem("12/31/2012", f150, tiresPlus);
WorkItem workItem3 = buildWorkItem("01/01/2013", camry, tiresPlus);
WorkItem workItem4 = buildWorkItem("12/31/2013", f150, tiresPlus);
WorkItem workItem5 = buildWorkItem("12/01/2013", focus, tiresPlus);
List<WorkItem> allWorkItems = Arrays.asList(workItem1, workItem2, workItem3, workItem4, workItem5);
when(workItemRepository.findAll()).thenReturn(allWorkItems);
Collection<WorkItem> results = service.findAllByMakeAndYear("ford", "2013");
assertThat(results, containsInAnyOrder(workItem3, workItem5));
results = service.findAllByMakeAndYear("ford", "2012");
assertThat(results, containsInAnyOrder(workItem1, workItem2));
results = service.findAllByMakeAndYear("chevy", "2013");
assertThat(results, empty());
results = service.findAllByMakeAndYear("ford", "2014");
assertThat(results, empty());
}
@Test
public void testFindAllByMakeAndYear_spy() throws ParseException {
List<WorkItem> allWorkItems = Arrays.asList(new WorkItem(), new WorkItem());
when(workItemRepository.findAll()).thenReturn(allWorkItems);
//Uses a spy on the service. Usually recommend refactoring service, but sometimes this is necessary or just easier
WorkItem expected = new WorkItem();
List<WorkItem> expectedList = Arrays.asList(expected);
doReturn(expectedList).when(service).selectWorkItemsByMakeAndYear("bmw", "2008", allWorkItems);
Collection<WorkItem> results = service.findAllByMakeAndYear("bmw", "2008");
//Showing nested matchers in contains and sameInstance
assertThat(results, contains(sameInstance(expected)));
}
private WorkItem buildWorkItem(String date, Car focus, Provider tiresPlus) throws ParseException {
return new WorkItem(focus, dateFormat.parse(date), "new tires", tiresPlus, 1000L, 200.00, "");
}
}