package pl.edu.icm.saos.enrichment.reference;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.IOException;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import pl.edu.icm.saos.common.json.JsonFormatter;
import pl.edu.icm.saos.common.json.JsonStringParser;
import pl.edu.icm.saos.persistence.enrichment.EnrichmentTagRepository;
import pl.edu.icm.saos.persistence.enrichment.model.EnrichmentTag;
import pl.edu.icm.saos.persistence.repository.JudgmentRepository;
import com.google.common.collect.Lists;
/**
* @author madryk
*/
@RunWith(MockitoJUnitRunner.class)
public class TagModifyingJudgmentReferenceRemoverTest {
@Mock
private TagModifyingJudgmentReferenceRemover<Object> tagModifyingJudgmentReferenceRemover;
@Mock
private EnrichmentTagRepository enrichmentTagRepository;
@Mock
private JsonStringParser<Object> jsonStringParser;
@Mock
private JsonFormatter jsonFormatter;
@Mock
private EntityManager entityManager;
@Mock
private JudgmentRepository judgmentRepository;
@Before
public void setUp() throws IOException {
doCallRealMethod().when(tagModifyingJudgmentReferenceRemover).setEnrichmentTagRepository(any());
doCallRealMethod().when(tagModifyingJudgmentReferenceRemover).setJudgmentRepository(any());
doCallRealMethod().when(tagModifyingJudgmentReferenceRemover).setEntityManager(any());
doCallRealMethod().when(tagModifyingJudgmentReferenceRemover).setJsonStringParser(any());
doCallRealMethod().when(tagModifyingJudgmentReferenceRemover).setJsonFormatter(any());
doCallRealMethod().when(tagModifyingJudgmentReferenceRemover).removeReferences(any());
tagModifyingJudgmentReferenceRemover.setEnrichmentTagRepository(enrichmentTagRepository);
tagModifyingJudgmentReferenceRemover.setJudgmentRepository(judgmentRepository);
tagModifyingJudgmentReferenceRemover.setEntityManager(entityManager);
tagModifyingJudgmentReferenceRemover.setJsonStringParser(jsonStringParser);
tagModifyingJudgmentReferenceRemover.setJsonFormatter(jsonFormatter);
}
//------------------------ TESTS --------------------------
@Test
public void removeReference() throws IOException {
// given
Object value1 = new Object();
EnrichmentTag tag1 = new EnrichmentTag();
tag1.setValue("et1value");
tag1.setJudgmentId(7);
Object value2 = new Object();
EnrichmentTag tag2 = new EnrichmentTag();
tag2.setValue("et2value");
tag2.setJudgmentId(8);
Query query = mock(Query.class);
when(query.getResultList()).thenReturn(Lists.newArrayList(tag1, tag2));
when(tagModifyingJudgmentReferenceRemover.buildSelectQuery()).thenReturn("query");
when(entityManager.createNativeQuery("query", EnrichmentTag.class)).thenReturn(query);
when(jsonStringParser.parseAndValidate("et1value")).thenReturn(value1);
when(jsonStringParser.parseAndValidate("et2value")).thenReturn(value2);
when(jsonFormatter.formatObject(value1)).thenReturn("et1value_changed");
when(jsonFormatter.formatObject(value2)).thenReturn("et2value_changed");
// execute
tagModifyingJudgmentReferenceRemover.removeReferences(Lists.newArrayList(2L, 3L));
// assert
verify(entityManager).createNativeQuery("query", EnrichmentTag.class);
verify(query).setParameter("judgmentIds", Lists.newArrayList("2", "3"));
verify(tagModifyingJudgmentReferenceRemover).removeReference(value1, Lists.newArrayList(2L, 3L));
verify(tagModifyingJudgmentReferenceRemover).removeReference(value2, Lists.newArrayList(2L, 3L));
verify(judgmentRepository).markAsNotIndexed(Lists.newArrayList(7L, 8L));
assertEquals("et1value_changed", tag1.getValue());
assertEquals("et2value_changed", tag2.getValue());
}
}