package pl.edu.icm.saos.webapp.judgment.search; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.hasProperty; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.web.context.WebApplicationContext; import pl.edu.icm.saos.common.testcommon.category.SlowTest; import pl.edu.icm.saos.persistence.common.TestInMemoryObjectFactory; import pl.edu.icm.saos.persistence.model.CommonCourt.CommonCourtType; import pl.edu.icm.saos.persistence.model.Judgment; import pl.edu.icm.saos.persistence.model.LawJournalEntry; import pl.edu.icm.saos.persistence.repository.JudgmentRepository; import pl.edu.icm.saos.persistence.repository.LawJournalEntryRepository; import pl.edu.icm.saos.persistence.service.LawJournalEntryCodeExtractor; import pl.edu.icm.saos.search.search.model.JudgmentSearchResult; import pl.edu.icm.saos.search.search.model.SearchResults; import pl.edu.icm.saos.webapp.WebappTestConfiguration; import pl.edu.icm.saos.webapp.common.search.CourtDataModelCreator; import pl.edu.icm.saos.webapp.court.CcListService; import pl.edu.icm.saos.webapp.court.ScListService; import pl.edu.icm.saos.webapp.court.SimpleCommonCourt; import pl.edu.icm.saos.webapp.court.SimpleEntity; import pl.edu.icm.saos.webapp.court.TestCourtsFactory; import pl.edu.icm.saos.webapp.judgment.JudgmentCriteriaForm; import com.google.common.collect.Lists; /** * * @author Łukasz Pawełczak * */ @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(classes = WebappTestConfiguration.class) @Category(SlowTest.class) public class JudgmentSearchControllerTest { @Autowired private WebApplicationContext webApplicationCtx; private MockMvc mockMvc; @Autowired @InjectMocks private JudgmentSearchController judgmentSearchController; @Mock private CcListService ccListService; @Mock private ScListService scListService; @Mock private JudgmentWebSearchService judgmentsWebSearchService; @Mock private LawJournalEntryRepository lawJournalEntryRepository; @Mock private LawJournalEntryCodeExtractor lawJournalEntryCodeExtractor; @Mock private JudgmentRepository judgmentRepository; @InjectMocks private CourtDataModelCreator courtDataModelCreator; @Autowired private TestCourtsFactory testCourtsFactory; private List<SimpleEntity> simpleEntities; private List<SimpleCommonCourt> commonCourts = createTestCommonCourts(); private List<SimpleEntity> scChambers = getTestScChamber(); private List<SimpleEntity> scJudgmentForms = getTestScJudgmentForm(); private SearchResults<JudgmentSearchResult> results; private LawJournalEntry lawJournalEntry = getTestLawJournalEntry(); @Before public void setUp() { MockitoAnnotations.initMocks(this); judgmentSearchController.setCourtDataModelCreator(courtDataModelCreator); simpleEntities = testCourtsFactory.createSimpleEntities(); results = new SearchResults<JudgmentSearchResult>(); results.addResult(new JudgmentSearchResult()); when(judgmentsWebSearchService.search(Mockito.any(JudgmentCriteriaForm.class), Mockito.any(Pageable.class))).thenReturn(results); when(ccListService.findCommonCourts()).thenReturn(commonCourts); when(scListService.findScChambers()).thenReturn(scChambers); when(scListService.findScJudgmentForms()).thenReturn(scJudgmentForms); mockMvc = webAppContextSetup(webApplicationCtx) .build(); } //------------------------ TESTS -------------------------- @Test public void judgmentSearchResults_empty_search_form() throws Exception { mockMvc.perform(get("/search")) .andExpect(status().isOk()) .andExpect(view().name("judgmentSearch")) .andExpect(model().attribute("pageable", instanceOf(Pageable.class))) .andExpect(model().attribute("searchResults", results)) ; verify(ccListService, times(0)).findCommonCourts(); verify(scListService, times(0)).findScChambers(); verify(scListService, times(0)).findScJudgmentForms(); } @Test public void judgmentSearchResults_search_form_contains_commonCourtId() throws Exception { Integer commonCourtId = 1; when(ccListService.findCcDivisions(commonCourtId)).thenReturn(simpleEntities); mockMvc.perform(get("/search").param("courtCriteria.ccCourtId", commonCourtId.toString()).param("courtCriteria.courtType", "COMMON")) .andExpect(status().isOk()) .andExpect(view().name("judgmentSearch")) .andExpect(model().attribute("commonCourtDivisions", simpleEntities)) .andExpect(model().attribute("commonCourtDivisions", hasSize(2))) .andExpect(model().attribute("commonCourtDivisions", hasItem( allOf( hasProperty("id", is(simpleEntities.get(0).getId())), hasProperty("name", is(simpleEntities.get(0).getName())) ) ))) .andExpect(model().attribute("commonCourtDivisions", hasItem( allOf( hasProperty("id", is(simpleEntities.get(1).getId())), hasProperty("name", is(simpleEntities.get(1).getName())) ) ))) ; verify(ccListService, times(1)).findCcDivisions(commonCourtId); } @Test public void judgmentSearchResults_search_form_contains_supremeChamberId() throws Exception { Integer supremeChamberId = 1; when(scListService.findScChamberDivisions(supremeChamberId)).thenReturn(simpleEntities); mockMvc.perform(get("/search").param("courtCriteria.scCourtChamberId", supremeChamberId.toString()).param("courtCriteria.courtType", "SUPREME")) .andExpect(status().isOk()) .andExpect(view().name("judgmentSearch")) .andExpect(model().attribute("supremeChamberDivisions", simpleEntities)) .andExpect(model().attribute("supremeChamberDivisions", hasSize(2))) .andExpect(model().attribute("supremeChamberDivisions", hasItem( allOf( hasProperty("id", is(simpleEntities.get(0).getId())), hasProperty("name", is(simpleEntities.get(0).getName())) ) ))) .andExpect(model().attribute("supremeChamberDivisions", hasItem( allOf( hasProperty("id", is(simpleEntities.get(1).getId())), hasProperty("name", is(simpleEntities.get(1).getName())) ) ))) ; verify(scListService, times(1)).findScChamberDivisions(supremeChamberId); } @Test public void judgmentSearchResults_search_form_scJudgmentForm() throws Exception { mockMvc.perform(get("/search").param("courtCriteria.courtType", "SUPREME")) .andExpect(status().isOk()) .andExpect(view().name("judgmentSearch")) .andExpect(model().attribute("scJudgmentForms", scJudgmentForms)) .andExpect(model().attribute("scJudgmentForms", hasSize(2))) .andExpect(model().attribute("scJudgmentForms", hasItem( allOf( hasProperty("id", is(scJudgmentForms.get(0).getId())), hasProperty("name", is(scJudgmentForms.get(0).getName())) ) ))) .andExpect(model().attribute("scJudgmentForms", hasItem( allOf( hasProperty("id", is(scJudgmentForms.get(1).getId())), hasProperty("name", is(scJudgmentForms.get(1).getName())) ) ))) ; verify(scListService, times(1)).findScJudgmentForms(); } @Test public void judgmentSearchResults_search_form_contains_lawJournalEntryCode() throws Exception { String lawJournalEntryCode = "2000/18"; when(lawJournalEntryCodeExtractor.extractYear(lawJournalEntryCode)).thenReturn(2000); when(lawJournalEntryCodeExtractor.extractEntry(lawJournalEntryCode)).thenReturn(18); when(lawJournalEntryRepository.findOneByYearAndEntry(2000, 18)).thenReturn(lawJournalEntry); mockMvc.perform(get("/search").param("lawJournalEntryCode", lawJournalEntryCode)) .andExpect(status().isOk()) .andExpect(view().name("judgmentSearch")) .andExpect(model().attribute("lawJournalEntry", lawJournalEntry)) ; verify(lawJournalEntryCodeExtractor, times(1)).extractYear(lawJournalEntryCode); verify(lawJournalEntryCodeExtractor, times(1)).extractEntry(lawJournalEntryCode); verify(lawJournalEntryRepository, times(1)).findOneByYearAndEntry(2000, 18); } @Test public void judgmentSearchResults_search_form_contains_referenced_judgment() throws Exception { Judgment judgment = TestInMemoryObjectFactory.createSimpleCcJudgment(); when(judgmentRepository.findOneAndInitialize(12L)).thenReturn(judgment); ResultActions result = mockMvc.perform(get("/search").param("referencedCourtCaseId", "12")); result .andExpect(status().isOk()) .andExpect(view().name("judgmentSearch")) .andExpect(model().attribute("referencedJudgment", is(judgment) )); } //------------------------ PRIVATE -------------------------- private List<SimpleCommonCourt> createTestCommonCourts() { SimpleCommonCourt commonCourtOne = new SimpleCommonCourt(); SimpleCommonCourt commonCourtTwo = new SimpleCommonCourt(); commonCourtOne.setId(13); commonCourtOne.setName("Sąd Rejonowy w Radomiu"); commonCourtOne.setType(CommonCourtType.DISTRICT); commonCourtOne.setId(14); commonCourtTwo.setName("Sąd Okręgowy w Toruniu"); commonCourtTwo.setType(CommonCourtType.REGIONAL); return Lists.newArrayList(commonCourtOne, commonCourtTwo); } private List<SimpleEntity> getTestScChamber() { SimpleEntity scChamberOne = new SimpleEntity(); SimpleEntity scChamberTwo = new SimpleEntity(); scChamberOne.setId(8); scChamberOne.setName("Izba Cywilna"); scChamberTwo.setId(43); scChamberTwo.setName("Izba Karna"); return Lists.newArrayList(scChamberOne, scChamberTwo); } private List<SimpleEntity> getTestScJudgmentForm() { SimpleEntity scJudgmentFormOne = new SimpleEntity(); SimpleEntity scJudgmentFormTwo = new SimpleEntity(); scJudgmentFormOne.setId(24); scJudgmentFormOne.setName("wyrok SN"); scJudgmentFormTwo.setId(34); scJudgmentFormTwo.setName("uchwała SN"); return Lists.newArrayList(scJudgmentFormOne, scJudgmentFormTwo); } private LawJournalEntry getTestLawJournalEntry() { return new LawJournalEntry(2000, 1, 18, "Ustawa karna i cywilna"); } }