package pl.edu.icm.saos.enrichment.apply;
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 pl.edu.icm.saos.persistence.common.TestInMemoryEnrichmentTagFactory.createEnrichmentTag;
import java.math.BigDecimal;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.springframework.beans.factory.annotation.Autowired;
import pl.edu.icm.saos.common.testcommon.category.SlowTest;
import pl.edu.icm.saos.enrichment.EnrichmentTestSupport;
import pl.edu.icm.saos.persistence.common.GeneratedEntityMergeException;
import pl.edu.icm.saos.persistence.common.GeneratedEntityPersistException;
import pl.edu.icm.saos.persistence.common.TestPersistenceObjectFactory;
import pl.edu.icm.saos.persistence.enrichment.EnrichmentTagRepository;
import pl.edu.icm.saos.persistence.enrichment.model.EnrichmentTag;
import pl.edu.icm.saos.persistence.enrichment.model.EnrichmentTagTypes;
import pl.edu.icm.saos.persistence.model.Judgment;
import pl.edu.icm.saos.persistence.model.JudgmentReferencedRegulation;
import pl.edu.icm.saos.persistence.model.ReferencedCourtCase;
import pl.edu.icm.saos.persistence.repository.JudgmentRepository;
import com.google.common.collect.Lists;
/**
* @author Łukasz Dumiszewski
*/
@Category(SlowTest.class)
public class JudgmentEnrichmentServiceIntTest extends EnrichmentTestSupport {
@Autowired
private JudgmentEnrichmentService judgmentEnrichmentService;
@Autowired
private TestPersistenceObjectFactory testPersistenceObjectFactory;
@Autowired
private EnrichmentTagRepository enrichmentTagRepository;
@Autowired
private JudgmentRepository judgmentRepository;
@Autowired
private EntityManager entityManager;
private Judgment judgment;
@Before
public void before() {
judgment = testPersistenceObjectFactory.createCcJudgment();
createAndSaveEnrichmentTags(judgment);
}
@Test
public void findOneAndEnrich() {
// execute
Judgment enrichedJudgment = judgmentEnrichmentService.findOneAndEnrich(judgment.getId());
// assert
assertEquals(0, judgment.getReferencedCourtCases().size());
assertEquals(2, enrichedJudgment.getReferencedCourtCases().size());
assertEquals(2, enrichedJudgment.getReferencedCourtCases().stream().filter(rcc->rcc.isGenerated()).count());
assertThat(getReferencedCourtCase(enrichedJudgment, "1234/12").getJudgmentIds(), Matchers.containsInAnyOrder(1234l, 12l));
assertEquals(0, getReferencedCourtCase(enrichedJudgment, "AAA").getJudgmentIds().size());
assertNotNull(enrichedJudgment.getMaxMoneyAmount());
assertEquals(new BigDecimal("123000.27"), enrichedJudgment.getMaxMoneyAmount().getAmount());
assertEquals("123 tys zł 27 gr", enrichedJudgment.getMaxMoneyAmount().getText());
assertEquals(3, judgment.getReferencedRegulations().size());
assertEquals(4, enrichedJudgment.getReferencedRegulations().size());
assertEquals(1, enrichedJudgment.getReferencedRegulations().stream().filter(rr->rr.isGenerated()).count());
JudgmentReferencedRegulation generatedRefRegulation = enrichedJudgment.getReferencedRegulations().stream().filter(rr->rr.isGenerated()).findFirst().get();
assertEquals("Ustawa (art.103)", generatedRefRegulation.getRawText());
assertEquals(1998, generatedRefRegulation.getLawJournalEntry().getYear());
assertEquals(162, generatedRefRegulation.getLawJournalEntry().getJournalNo());
assertEquals(1118, generatedRefRegulation.getLawJournalEntry().getEntry());
assertEquals("Ustawa", generatedRefRegulation.getLawJournalEntry().getTitle());
}
@Test
public void unenrichAndSave() {
// given
Judgment enrichedJudgment = judgmentEnrichmentService.findOneAndEnrich(judgment.getId());
// execute
judgmentEnrichmentService.unenrichAndSave(enrichedJudgment);
// assert
Judgment unenrichedJudgment = judgmentRepository.findOneAndInitialize(judgment.getId());
assertEquals(0, judgment.getReferencedCourtCases().size());
assertEquals(0, unenrichedJudgment.getReferencedCourtCases().size());
assertNull(unenrichedJudgment.getMaxMoneyAmount());
assertEquals(3, judgment.getReferencedRegulations().size());
assertEquals(3, unenrichedJudgment.getReferencedRegulations().size());
assertEquals(0, unenrichedJudgment.getReferencedRegulations().stream().filter(rr->rr.isGenerated()).count());
}
@Test(expected = GeneratedEntityMergeException.class)
public void findOneAndEnrich_GENERATED_SAVE_EXCEPTION() {
// given
Judgment enrichedJudgment = judgmentEnrichmentService.findOneAndEnrich(judgment.getId());
// execute
judgmentRepository.save(enrichedJudgment);
}
@Test(expected = GeneratedEntityPersistException.class)
@Transactional
public void findOneAndEnrich_GENERATED_SAVE_EXCEPTION_ON_REF_REGULATION() {
// given
Judgment enrichedJudgment = judgmentEnrichmentService.findOneAndEnrich(judgment.getId());
JudgmentReferencedRegulation generatedRefRegulation = enrichedJudgment.getReferencedRegulations().stream().filter(jrr -> jrr.isGenerated()).findFirst().get();
// execute
entityManager.persist(generatedRefRegulation.getLawJournalEntry()); // save LawJournalEntry first to prevent TransientPropertyValueException in next line
entityManager.persist(generatedRefRegulation);
entityManager.flush();
}
//------------------------ PRIVATE --------------------------
private void createAndSaveEnrichmentTags(Judgment judgment) {
long nonExistentJudgmentId = judgment.getId() + 1;
EnrichmentTag enrichmentTag1 = createEnrichmentTag(judgment.getId(), EnrichmentTagTypes.REFERENCED_COURT_CASES, "[{caseNumber:' 1234/12', judgmentIds:[1234, 12]}, {caseNumber: 'AAA', judgmentIds:[]}]");
EnrichmentTag enrichmentTag2 = createEnrichmentTag(nonExistentJudgmentId, EnrichmentTagTypes.REFERENCED_COURT_CASES, "[{caseNumber:'1234/12', judgmentIds:[]}]");
EnrichmentTag enrichmentTag3 = createEnrichmentTag(judgment.getId(), EnrichmentTagTypes.MAX_REFERENCED_MONEY, "{amount: 123000.27, text: '123 tys zł 27 gr'}");
EnrichmentTag enrichmentTag4 = createEnrichmentTag(judgment.getId(), EnrichmentTagTypes.REFERENCED_REGULATIONS,
"[{journalTitle:'Ustawa', journalNo:162, journalYear:1998, journalEntry:1118, text:'Ustawa (art.103)'}]");
enrichmentTagRepository.save(Lists.newArrayList(enrichmentTag1, enrichmentTag2, enrichmentTag3, enrichmentTag4));
}
private ReferencedCourtCase getReferencedCourtCase(Judgment judgment, String caseNumber) {
return judgment.getReferencedCourtCases().stream().filter(rcc->rcc.getCaseNumber().equals(caseNumber)).findFirst().get();
}
}