package pl.edu.icm.saos.importer.commoncourt.judgment.process;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.hamcrest.Matchers;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import pl.edu.icm.saos.importer.common.JudgmentKeywordCreator;
import pl.edu.icm.saos.importer.common.converter.JudgeConverter;
import pl.edu.icm.saos.importer.common.correction.ImportCorrectionList;
import pl.edu.icm.saos.importer.commoncourt.judgment.xml.SourceCcJudgment;
import pl.edu.icm.saos.persistence.model.CommonCourt;
import pl.edu.icm.saos.persistence.model.CommonCourtDivision;
import pl.edu.icm.saos.persistence.model.CommonCourtJudgment;
import pl.edu.icm.saos.persistence.model.CourtCase;
import pl.edu.icm.saos.persistence.model.CourtType;
import pl.edu.icm.saos.persistence.model.Judge;
import pl.edu.icm.saos.persistence.model.JudgmentResult;
import pl.edu.icm.saos.persistence.model.JudgmentTextContent;
import pl.edu.icm.saos.persistence.model.JudgmentTextContent.ContentType;
import pl.edu.icm.saos.persistence.model.MeansOfAppeal;
import pl.edu.icm.saos.persistence.model.Judge.JudgeRole;
import pl.edu.icm.saos.persistence.model.Judgment.JudgmentType;
import pl.edu.icm.saos.persistence.model.JudgmentKeyword;
import pl.edu.icm.saos.persistence.model.JudgmentReferencedRegulation;
import pl.edu.icm.saos.persistence.model.LawJournalEntry;
import pl.edu.icm.saos.persistence.repository.CcDivisionRepository;
import pl.edu.icm.saos.persistence.repository.CommonCourtRepository;
import com.google.common.collect.Lists;
/**
* @author Łukasz Dumiszewski
*/
public class SourceCcJudgmentExtractorTest {
private SourceCcJudgmentExtractor sourceCcJudgmentExtractor = new SourceCcJudgmentExtractor();
@Mock private CommonCourtRepository commonCourtRepository;
@Mock private CcDivisionRepository ccDivisionRepository;
@Mock private JudgmentKeywordCreator ccJudgmentKeywordCreator;
@Mock private LawJournalEntryCreator lawJournalEntryCreator;
@Mock private LawJournalEntryExtractor lawJournalEntryExtractor;
@Mock private JudgeConverter judgeConverter;
private SourceCcJudgment sJudgment = new SourceCcJudgment();
private ImportCorrectionList correctionList = new ImportCorrectionList();
@Before
public void before() {
MockitoAnnotations.initMocks(this);
sourceCcJudgmentExtractor.setCcDivisionRepository(ccDivisionRepository);
sourceCcJudgmentExtractor.setCcJudgmentKeywordCreator(ccJudgmentKeywordCreator);
sourceCcJudgmentExtractor.setCommonCourtRepository(commonCourtRepository);
sourceCcJudgmentExtractor.setLawJournalEntryCreator(lawJournalEntryCreator);
sourceCcJudgmentExtractor.setLawJournalEntryExtractor(lawJournalEntryExtractor);
sourceCcJudgmentExtractor.setJudgeConverter(judgeConverter);
}
//------------------------ LOGIC --------------------------
@Test
public void createNewJudgment() {
CommonCourtJudgment ccJudgment = sourceCcJudgmentExtractor.createNewJudgment();
assertNotNull(ccJudgment);
}
@Test
public void extractCourtCases() {
sJudgment.setSignature("CASE 211w/121");
List<CourtCase> courtCases = sourceCcJudgmentExtractor.extractCourtCases(sJudgment, correctionList);
assertEquals(1, courtCases.size());
assertEquals(sJudgment.getSignature(), courtCases.get(0).getCaseNumber());
}
@Test
public void extractCourtReporters() {
sJudgment.setRecorder("Jan Moller");
List<String> courtReporters = sourceCcJudgmentExtractor.extractCourtReporters(sJudgment, correctionList);
assertEquals(1, courtReporters.size());
assertEquals(sJudgment.getRecorder(), courtReporters.get(0));
}
@Test
public void extractCourtReporters_Null() {
sJudgment.setRecorder(null);
List<String> courtReporters = sourceCcJudgmentExtractor.extractCourtReporters(sJudgment, correctionList);
assertNotNull(courtReporters);
assertEquals(0, courtReporters.size());
}
@Test
public void extractDecision() {
sJudgment.setDecision("11234");
String decision = sourceCcJudgmentExtractor.extractDecision(sJudgment, correctionList);
assertEquals(sJudgment.getDecision(), decision);
}
@Test
public void extractPublisher() {
sJudgment.setPublisher("Jan nowak z");
String publisher = sourceCcJudgmentExtractor.extractPublisher(sJudgment, correctionList);
assertEquals(sJudgment.getPublisher(), publisher);
}
@Test
public void extractReviser() {
sJudgment.setReviser("Jan Nowak z");
String reviser = sourceCcJudgmentExtractor.extractReviser(sJudgment, correctionList);
assertEquals(sJudgment.getReviser(), reviser);
}
@Test
public void extractSourceJudgmentId() {
sJudgment.setId("1221212121222 ");
String sourceJudgmentId = sourceCcJudgmentExtractor.extractSourceJudgmentId(sJudgment, correctionList);
assertEquals(sJudgment.getId(), sourceJudgmentId);
}
@Test
public void extractSourceJudgmentUrl() {
sJudgment.setSourceUrl("www.www.pl");
String sourceJudgmentUrl = sourceCcJudgmentExtractor.extractSourceJudgmentUrl(sJudgment, correctionList);
assertEquals(sJudgment.getSourceUrl(), sourceJudgmentUrl);
}
@Test
public void extractSummary() {
sJudgment.setThesis("www.www.pl");
String summary = sourceCcJudgmentExtractor.extractSummary(sJudgment, correctionList);
assertEquals(sJudgment.getThesis(), summary);
}
@Test
public void extractTextContent() {
sJudgment.setTextContent("sdlsdklskd <sbfmd ck dkjcd kjcdkj cndjc\n fdfdf");
JudgmentTextContent textContent = sourceCcJudgmentExtractor.extractTextContent(sJudgment, correctionList);
assertEquals(sJudgment.getTextContent(), textContent.getRawTextContent());
assertEquals(ContentType.HTML, textContent.getType());
}
@Test
public void extractJudgmentDate() {
sJudgment.setJudgmentDate(new LocalDate());
LocalDate judgmentDate = sourceCcJudgmentExtractor.extractJudgmentDate(sJudgment, correctionList);
assertEquals(sJudgment.getJudgmentDate(), judgmentDate);
}
@Test
public void extractPublicationDate() {
sJudgment.setPublicationDate(new DateTime());
DateTime publicationDate = sourceCcJudgmentExtractor.extractPublicationDate(sJudgment, correctionList);
assertEquals(sJudgment.getPublicationDate(), publicationDate);
}
@Test
public void extractJudges() {
// given
String janOlkowski = "Jan Olkowski";
String adamNowak = "Adam Nowak";
String wrongName = "!! 11";
String nullName = null;
sJudgment.setChairman(janOlkowski);
sJudgment.setJudges(Lists.newArrayList(janOlkowski, adamNowak, wrongName, nullName));
Judge judgeJanOlkowski = new Judge(janOlkowski, JudgeRole.PRESIDING_JUDGE);
Judge judgeAdamNowak = new Judge(adamNowak);
when(judgeConverter.convertJudge(janOlkowski, Lists.newArrayList(JudgeRole.PRESIDING_JUDGE), correctionList)).thenReturn(judgeJanOlkowski);
when(judgeConverter.convertJudge(adamNowak, correctionList)).thenReturn(judgeAdamNowak);
when(judgeConverter.convertJudge(wrongName, correctionList)).thenReturn(null); // shouldn't be added nor cause NullPointer
when(judgeConverter.convertJudge(nullName, correctionList)).thenReturn(null); // shouldn't be added nor cause NullPointer
// execute
List<Judge> judges = sourceCcJudgmentExtractor.extractJudges(sJudgment, correctionList);
// assert
assertEquals(2, judges.size());
assertThat(judges, Matchers.containsInAnyOrder(judgeJanOlkowski, judgeAdamNowak));
for (Judge judge : judges) {
if (judge.getName().equals(janOlkowski)) {
assertEquals(1, judge.getSpecialRoles().size());
assertEquals(JudgeRole.PRESIDING_JUDGE, judge.getSpecialRoles().get(0));
} else {
assertEquals(0, judge.getSpecialRoles().size());
}
}
verify(judgeConverter).convertJudge(janOlkowski, Lists.newArrayList(JudgeRole.PRESIDING_JUDGE), correctionList);
verify(judgeConverter).convertJudge(adamNowak, correctionList);
verify(judgeConverter).convertJudge(wrongName, correctionList);
verify(judgeConverter).convertJudge(nullName, correctionList);
verifyNoMoreInteractions(judgeConverter);
}
@Test
public void extractJudges_chairmanIncorrect() {
// given
String wrongName = "!! 11";
sJudgment.setChairman(wrongName);
when(judgeConverter.convertJudge(wrongName, correctionList)).thenReturn(null); // shouldn't be added nor cause NullPointer
// execute
List<Judge> judges = sourceCcJudgmentExtractor.extractJudges(sJudgment, correctionList);
// assert
assertEquals(0, judges.size());
}
@Test
public void extractJudges_JudgeAddedTwice() {
// given
String janOlkowski = "Jan Olkowski";
String adamNowak = "Adam Nowak";
sJudgment.setChairman(janOlkowski);
sJudgment.setJudges(Lists.newArrayList(janOlkowski, janOlkowski, adamNowak, adamNowak));
Judge judgeJanOlkowski = new Judge(janOlkowski, JudgeRole.PRESIDING_JUDGE);
Judge judgeNotPresidingJanOlkowski = new Judge(janOlkowski);
Judge judgeAdamNowak = new Judge(adamNowak);
when(judgeConverter.convertJudge(janOlkowski, Lists.newArrayList(JudgeRole.PRESIDING_JUDGE), correctionList)).thenReturn(judgeJanOlkowski);
when(judgeConverter.convertJudge(janOlkowski, correctionList)).thenReturn(judgeNotPresidingJanOlkowski);
when(judgeConverter.convertJudge(adamNowak, correctionList)).thenReturn(judgeAdamNowak);
// execute
List<Judge> judges = sourceCcJudgmentExtractor.extractJudges(sJudgment, correctionList);
// assert
assertEquals(sJudgment.getJudges().size(), judges.size());
List<Judge> presidingJudges = judges.stream().filter(j->j.getSpecialRoles().contains(JudgeRole.PRESIDING_JUDGE)).collect(Collectors.toList());
assertEquals(1, presidingJudges.size());
assertEquals(sJudgment.getChairman(), presidingJudges.get(0).getName());
List<String> commonJudges = judges.stream().filter(j->j.getSpecialRoles().isEmpty()).map(j->j.getName()).collect(Collectors.toList());
assertEquals(3, commonJudges.size());
assertThat(commonJudges, Matchers.containsInAnyOrder(janOlkowski, adamNowak, adamNowak));
}
@Test
public void extractJudgmentType_SENTENCE_REASON() {
sJudgment.setTypes(Lists.newArrayList("sentence","reason"));
JudgmentType judgmentType = sourceCcJudgmentExtractor.extractJudgmentType(sJudgment, correctionList);
assertEquals(JudgmentType.SENTENCE, judgmentType);
}
@Test
public void extractJudgmentType_REGULATION_REASON() {
sJudgment.setTypes(Lists.newArrayList("regulation","reasons"));
JudgmentType judgmentType = sourceCcJudgmentExtractor.extractJudgmentType(sJudgment, correctionList);
assertEquals(JudgmentType.REGULATION, judgmentType);
}
@Test
public void extractLegalBases() {
sJudgment.setLegalBases(Lists.newArrayList("asasasasadfc43f ", "sdsdsade4d$EDFECFDC "));
List<String> legalBases = sourceCcJudgmentExtractor.extractLegalBases(sJudgment, correctionList);
assertEquals(sJudgment.getLegalBases(), legalBases);
}
@Test
public void extractReferencedRegulations() {
// given
List<String> references = Lists.newArrayList("Ustawa z dnia 29 sierpnia 1997 r. o usługach turystycznych (Dz. U. z 1997 r. Nr 133, poz. 884 - art. 11 a; art. 11 a ust. 1; art. 14; art. 14 ust. 6; art. 14 ust. 7)",
"Ustawa z dnia 17 listopada 1964 r. - Kodeks postępowania cywilnego (Dz. U. z 1964 r. Nr 43, poz. 296 - art. 230; art. 479(42); art. 479(44); art. 98; art. 99)",
"Ustawa z dnia 28 lipca 2005 r. o kosztach sądowych w sprawach cywilnych (Dz. U. z 2005 r. Nr 167, poz. 1398 - art. 113; art. 113 ust. 1; art. 96; art. 96 ust. 1; art. 96 ust. 1 pkt. 3)",
"Ustawa z dnia 23 kwietnia 1964 r. - Kodeks cywilny (Dz. U. z 1964 r. Nr 16, poz. 93 - art. 385; art. 385 ┬ž 2; art. 385(1); art. 385(1) ┬ž 1; art. 385(1) ┬ž 4; art. 385(3); art. 385(3) pkt. 13; art. 385(3) pkt. 2; art. 385(3) pkt. 9)",
"Ustawa z dnia");
sJudgment.setReferences(references);
List<LawJournalEntry> lawJournalEntries = createLawJournalEntries(references);
// execute
List<JudgmentReferencedRegulation> refRegulations = sourceCcJudgmentExtractor.extractReferencedRegulations(sJudgment, correctionList);
// assert
for (int i=0; i<references.size(); i++) {
assertReferencedRegulation(refRegulations.get(i), lawJournalEntries.get(i), references.get(i));
}
}
@Test
public void extractReceiptDate() {
// execute
LocalDate retReceiptDate = sourceCcJudgmentExtractor.extractReceiptDate(sJudgment, correctionList);
// assert
assertNull(retReceiptDate);
}
@Test
public void extractLowerCourtJudgments() {
// execute
List<String> retLowerCourtJudgments = sourceCcJudgmentExtractor.extractLowerCourtJudgments(sJudgment, correctionList);
// assert
assertThat(retLowerCourtJudgments, Matchers.empty());
}
@Test
public void extractMeansOfAppeal() {
// execute
MeansOfAppeal retMeansOfAppeal = sourceCcJudgmentExtractor.extractMeansOfAppeal(sJudgment, correctionList);
// assert
assertNull(retMeansOfAppeal);
}
@Test
public void extractJudgmentResult() {
// execute
JudgmentResult retJudgmentResult = sourceCcJudgmentExtractor.extractJudgmentResult(sJudgment, correctionList);
// assert
assertNull(retJudgmentResult);
}
@Test
public void convertSpecific_Keywords() {
// given
String COURT_ID = "15050505";
String DIVISION_CODE = "0000521";
createCourtDivision(COURT_ID, DIVISION_CODE);
sJudgment.setCourtId(COURT_ID);
sJudgment.setDepartmentId(DIVISION_CODE);
List<String> themePhrases = Lists.newArrayList("QWERTY", "KKKKOOOOLLLl");
sJudgment.setThemePhrases(themePhrases);
List<JudgmentKeyword> keywords = createKeywords(themePhrases);
for (int i = 0; i < themePhrases.size(); i++) {
when(ccJudgmentKeywordCreator.getOrCreateJudgmentKeyword(CourtType.COMMON, themePhrases.get(i).trim())).thenReturn(keywords.get(i));
}
CommonCourtJudgment ccJudgment = new CommonCourtJudgment();
// execute
sourceCcJudgmentExtractor.convertSpecific(ccJudgment, sJudgment, correctionList);
// assert
assertEquals(themePhrases.size(), ccJudgment.getKeywords().size());
for (String phrase : sJudgment.getThemePhrases()) {
assertTrue(ccJudgment.containsKeyword(phrase));
}
}
@Test
public void convertSpecific_Court() {
// given
String COURT_ID = "15050505";
String DIVISION_CODE = "0000521";
createCourtDivision(COURT_ID, DIVISION_CODE);
sJudgment.setCourtId(COURT_ID);
sJudgment.setDepartmentId(DIVISION_CODE);
CommonCourtJudgment ccJudgment = new CommonCourtJudgment();
// execute
sourceCcJudgmentExtractor.convertSpecific(ccJudgment, sJudgment, correctionList);
// assert
assertEquals(sJudgment.getDepartmentId(), ccJudgment.getCourtDivision().getCode());
assertEquals(sJudgment.getCourtId(), ccJudgment.getCourtDivision().getCourt().getCode());
}
//------------------------ PRIVATE --------------------------
private List<LawJournalEntry> createLawJournalEntries(List<String> references) {
LawJournalEntryData lawJournalEntryData0 = new LawJournalEntryData(1997, 133, 884, "Ustawa z dnia 29 sierpnia 1997 r. o usługach turystycznych");
LawJournalEntryData lawJournalEntryData1 = new LawJournalEntryData(1964, 43, 296, "Ustawa z dnia 17 listopada 1964 r. - Kodeks postępowania cywilnego");
LawJournalEntryData lawJournalEntryData2 = new LawJournalEntryData(2005, 167, 1398, "Ustawa z dnia 28 lipca 2005 r. o kosztach sądowych w sprawach cywilnych");
LawJournalEntryData lawJournalEntryData3 = new LawJournalEntryData(1964, 16, 93, "Ustawa z dnia 23 kwietnia 1964 r. - Kodeks cywilny");
LawJournalEntryData lawJournalEntryData4 = null;
List<LawJournalEntryData> lawJournalEntryDataList = Lists.newArrayList(lawJournalEntryData0, lawJournalEntryData1, lawJournalEntryData2, lawJournalEntryData3, lawJournalEntryData4);
List<LawJournalEntry> lawJournalEntries = Lists.newArrayList();
for (LawJournalEntryData entryData : lawJournalEntryDataList) {
if (entryData == null) {
lawJournalEntries.add(null);
} else {
lawJournalEntries.add(new LawJournalEntry(entryData.getYear(), entryData.getJournalNo(), entryData.getEntry(), entryData.getTitle()));
}
}
for (int i = 0; i < references.size(); i++) {
when(lawJournalEntryExtractor.extractLawJournalEntry(Mockito.eq(references.get(i)))).thenReturn(lawJournalEntryDataList.get(i));
when(lawJournalEntryCreator.getOrCreateLawJournalEntry(Mockito.eq(lawJournalEntryDataList.get(i)))).thenReturn(lawJournalEntries.get(i));
}
return lawJournalEntries;
}
private void assertReferencedRegulation(JudgmentReferencedRegulation regulation, LawJournalEntry expectedLawJournalEntry, String expectedRawText) {
assertEquals(expectedRawText, regulation.getRawText());
if (expectedLawJournalEntry == null) {
assertNull(regulation.getLawJournalEntry());
} else {
assertEquals(expectedLawJournalEntry.getYear(), regulation.getLawJournalEntry().getYear());
assertEquals(expectedLawJournalEntry.getJournalNo(), regulation.getLawJournalEntry().getJournalNo());
assertEquals(expectedLawJournalEntry.getEntry(), regulation.getLawJournalEntry().getEntry());
assertEquals(expectedLawJournalEntry.getTitle(), regulation.getLawJournalEntry().getTitle());
}
}
private List<JudgmentKeyword> createKeywords(List<String> themePhrases) {
List<JudgmentKeyword> keywords = Lists.newArrayList();
for (String themePhrase : themePhrases) {
JudgmentKeyword keyword = new JudgmentKeyword(CourtType.COMMON, themePhrase);
keywords.add(keyword);
}
return keywords;
}
private void createCourtDivision(String COURT_ID, String DIVISION_CODE) {
CommonCourt court = new CommonCourt();
court.setCode("15050505");
when(commonCourtRepository.findOneByCode(Mockito.eq(COURT_ID))).thenReturn(court);
CommonCourtDivision division = new CommonCourtDivision();
division.setCode(DIVISION_CODE);
division.setCourt(court);
when(ccDivisionRepository.findOneByCourtIdAndCode(Mockito.eq(court.getId()), Mockito.eq(StringUtils.leftPad(DIVISION_CODE, 7, '0')))).thenReturn(division);
}
}