package org.atlasapi.persistence.content;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import org.atlasapi.media.entity.Item;
import org.atlasapi.media.entity.Publisher;
import org.atlasapi.persistence.lookup.InMemoryLookupEntryStore;
import org.atlasapi.persistence.lookup.LookupWriter;
import org.atlasapi.persistence.lookup.TransitiveLookupWriter;
import org.atlasapi.persistence.lookup.entry.LookupEntry;
import org.atlasapi.persistence.lookup.entry.LookupEntryStore;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
public class EquivalenceWritingContentWriterTest {
private final LookupEntryStore lookupEntryStore = new InMemoryLookupEntryStore();
private final ContentWriter delegate = mock(ContentWriter.class);
private final LookupWriter lookupWriter = TransitiveLookupWriter.explicitTransitiveLookupWriter(lookupEntryStore);
private final EquivalenceWritingContentWriter contentWriter = new EquivalenceWritingContentWriter(delegate, lookupWriter);
@Test
public void testWritingContentWithEquivalencesWritesEquivalences() {
Item firstSubjectItem = new Item("subjectUri", "curie", Publisher.METABROADCAST);
LookupEntry subject = LookupEntry.lookupEntryFrom(firstSubjectItem);
lookupEntryStore.store(subject);
Item generatedEquivalent = new Item("generatedUri", "curie", Publisher.FIVE);
LookupEntry generatedEquiv = LookupEntry.lookupEntryFrom(generatedEquivalent);
Item explicitEquivalent = new Item("equivUri", "durie", Publisher.BBC);
LookupEntry explicitEquiv = LookupEntry.lookupEntryFrom(explicitEquivalent)
.copyWithDirectEquivalents(ImmutableList.of(generatedEquiv.lookupRef()))
.copyWithEquivalents(ImmutableList.of(generatedEquiv.lookupRef()));
lookupEntryStore.store(explicitEquiv);
generatedEquiv = generatedEquiv
.copyWithDirectEquivalents(ImmutableList.of(explicitEquiv.lookupRef()))
.copyWithExplicitEquivalents(ImmutableList.of(explicitEquiv.lookupRef()));
lookupEntryStore.store(generatedEquiv);
firstSubjectItem.setEquivalentTo(ImmutableSet.of(explicitEquiv.lookupRef()));
contentWriter.createOrUpdate(firstSubjectItem);
verify(delegate).createOrUpdate(firstSubjectItem);
LookupEntry first = Iterables.getOnlyElement(lookupEntryStore.entriesForCanonicalUris(ImmutableSet.of(firstSubjectItem.getCanonicalUri())));
assertTrue(first.explicitEquivalents().contains(explicitEquiv.lookupRef()));
assertTrue(first.equivalents().contains(explicitEquiv.lookupRef()));
LookupEntry explicit = Iterables.getOnlyElement(lookupEntryStore.entriesForCanonicalUris(ImmutableSet.of(explicitEquivalent.getCanonicalUri())));
assertTrue(explicit.explicitEquivalents().contains(subject.lookupRef()));
assertTrue(explicit.directEquivalents().contains(generatedEquiv.lookupRef()));
assertTrue(explicit.equivalents().contains(subject.lookupRef()));
assertTrue(explicit.equivalents().contains(generatedEquiv.lookupRef()));
LookupEntry generated = Iterables.getOnlyElement(lookupEntryStore.entriesForCanonicalUris(ImmutableSet.of(generatedEquivalent.getCanonicalUri())));
assertTrue(generated.directEquivalents().contains(explicitEquiv.lookupRef()));
assertTrue(generated.equivalents().contains(subject.lookupRef()));
assertTrue(generated.equivalents().contains(explicitEquiv.lookupRef()));
Item secondSubjectItem = new Item("secondUri", "eurie", Publisher.C4);
LookupEntry secondSubject = LookupEntry.lookupEntryFrom(secondSubjectItem);
lookupEntryStore.store(secondSubject);
secondSubjectItem.setEquivalentTo(ImmutableSet.of(explicitEquiv.lookupRef()));
contentWriter.createOrUpdate(secondSubjectItem);
verify(delegate).createOrUpdate(secondSubjectItem);
LookupEntry second = Iterables.getOnlyElement(lookupEntryStore.entriesForCanonicalUris(ImmutableSet.of(secondSubjectItem.getCanonicalUri())));
assertTrue(second.explicitEquivalents().contains(explicitEquiv.lookupRef()));
assertTrue(second.equivalents().contains(explicitEquiv.lookupRef()));
assertTrue(second.equivalents().contains(subject.lookupRef()));
assertTrue(second.equivalents().contains(generatedEquiv.lookupRef()));
first = Iterables.getOnlyElement(lookupEntryStore.entriesForCanonicalUris(ImmutableSet.of(firstSubjectItem.getCanonicalUri())));
assertTrue(first.explicitEquivalents().contains(explicitEquiv.lookupRef()));
assertTrue(first.equivalents().contains(explicitEquiv.lookupRef()));
assertTrue(first.equivalents().contains(secondSubject.lookupRef()));
assertTrue(first.equivalents().contains(generatedEquiv.lookupRef()));
explicit = Iterables.getOnlyElement(lookupEntryStore.entriesForCanonicalUris(ImmutableSet.of(explicitEquivalent.getCanonicalUri())));
assertTrue(explicit.explicitEquivalents().contains(subject.lookupRef()));
assertTrue(explicit.explicitEquivalents().contains(secondSubject.lookupRef()));
assertTrue(explicit.equivalents().contains(subject.lookupRef()));
assertTrue(explicit.equivalents().contains(secondSubject.lookupRef()));
assertTrue(explicit.equivalents().contains(generatedEquiv.lookupRef()));
generated = Iterables.getOnlyElement(lookupEntryStore.entriesForCanonicalUris(ImmutableSet.of(generatedEquivalent.getCanonicalUri())));
assertTrue(explicit.equivalents().contains(subject.lookupRef()));
assertTrue(explicit.equivalents().contains(secondSubject.lookupRef()));
assertTrue(explicit.equivalents().contains(explicitEquiv.lookupRef()));
}
}