package org.atlasapi.persistence.content.mongo; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Set; import com.metabroadcast.applications.client.model.internal.Application; import com.metabroadcast.applications.client.model.internal.ApplicationConfiguration; import org.atlasapi.application.v3.DefaultApplication; import org.atlasapi.media.entity.Alias; import org.atlasapi.media.entity.Content; import org.atlasapi.media.entity.Item; import org.atlasapi.media.entity.LookupRef; import org.atlasapi.media.entity.Publisher; import org.atlasapi.media.entity.testing.ComplexItemTestDataBuilder; import org.atlasapi.output.Annotation; import org.atlasapi.persistence.audit.NoLoggingPersistenceAuditLog; import org.atlasapi.persistence.audit.PerHourAndDayMongoPersistenceAuditLog; import org.atlasapi.persistence.audit.PersistenceAuditLog; import org.atlasapi.persistence.content.DefaultEquivalentContentResolver; import org.atlasapi.persistence.content.EquivalenceWritingContentWriter; import org.atlasapi.persistence.content.LookupResolvingContentResolver; import org.atlasapi.persistence.lookup.TransitiveLookupWriter; import org.atlasapi.persistence.lookup.entry.LookupEntry; import org.atlasapi.persistence.lookup.mongo.MongoLookupEntryStore; import org.atlasapi.persistence.player.PlayerResolver; import org.atlasapi.persistence.service.ServiceResolver; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.metabroadcast.common.persistence.MongoTestHelper; import com.metabroadcast.common.persistence.mongo.DatabasedMongo; import com.metabroadcast.common.time.SystemClock; import com.mongodb.DBCollection; import com.mongodb.ReadPreference; @RunWith( MockitoJUnitRunner.class ) public class MongoContentPurgerTest { private static final String MB_ITEM_URI = "http://metabroadcast.com/programmes/item"; private static final String BBC_ITEM_URI = "http://www.bbc.co.uk/programmes/item"; private DatabasedMongo db; private EquivalenceWritingContentWriter contentWriter; private MongoContentPurger mongoContentPurger; private DefaultEquivalentContentResolver contentResolver; private MongoLookupEntryStore entryStore; private PersistenceAuditLog persistenceAuditLog; private final ServiceResolver serviceResolver = mock(ServiceResolver.class); private final PlayerResolver playerResolver = mock(PlayerResolver.class); private Application application = mock(Application.class); @Before public void setUp() { db = MongoTestHelper.anEmptyTestDatabase(); persistenceAuditLog = new PerHourAndDayMongoPersistenceAuditLog(db); DBCollection lookupCollection = db.collection("lookup"); entryStore = new MongoLookupEntryStore(lookupCollection, new NoLoggingPersistenceAuditLog(), ReadPreference.primary()); contentWriter = new EquivalenceWritingContentWriter( new MongoContentWriter(db, entryStore, persistenceAuditLog, playerResolver, serviceResolver, new SystemClock()), TransitiveLookupWriter.explicitTransitiveLookupWriter(entryStore)); contentResolver = new DefaultEquivalentContentResolver(new MongoContentResolver(db, entryStore), entryStore); mongoContentPurger = new MongoContentPurger(new MongoContentLister(db, new MongoContentResolver(db, entryStore)), new LookupResolvingContentResolver(new MongoContentResolver(db, entryStore), entryStore), contentWriter, new MongoContentTables(db), lookupCollection, TransitiveLookupWriter.explicitTransitiveLookupWriter(entryStore), TransitiveLookupWriter.generatedTransitiveLookupWriter(entryStore)); when(application.getConfiguration()).thenReturn( ApplicationConfiguration.builder() .withPrecedence(ImmutableList.of(Publisher.BBC, Publisher.METABROADCAST)) .withEnabledWriteSources(ImmutableList.of()) .build() ); } @Test public void testRemovesContentAndUpdatesEquivalences() { Item item1 = testItem(Publisher.BBC, BBC_ITEM_URI); Item item2 = testItem(Publisher.METABROADCAST, MB_ITEM_URI); item2.setEquivalentTo(ImmutableSet.of(LookupRef.from(item1))); contentWriter.createOrUpdate(item1); contentWriter.createOrUpdate(item2); LookupEntry lookup = Iterables.getOnlyElement(entryStore.entriesForCanonicalUris(ImmutableSet.of(BBC_ITEM_URI))); assertEquals(2, lookup.explicitEquivalents().size()); mongoContentPurger.purge(Publisher.METABROADCAST, ImmutableSet.of(Publisher.BBC)); lookup = Iterables.getOnlyElement(entryStore.entriesForCanonicalUris(ImmutableSet.of(BBC_ITEM_URI))); assertEquals(1, lookup.explicitEquivalents().size()); assertEquals(0, contentResolver.resolveUris(ImmutableSet.of(BBC_ITEM_URI), application, ImmutableSet.<Annotation>of(), false).get(MB_ITEM_URI).size()); Content queried = Iterables.getOnlyElement(contentResolver.resolveUris(ImmutableSet.of(BBC_ITEM_URI), application, ImmutableSet.<Annotation>of(), false).get(BBC_ITEM_URI)); assertEquals(new Alias(MongoContentPurger.ATLAS_EQUIVALENCE_ALIAS, MB_ITEM_URI), Iterables.getOnlyElement(queried.getAliases())); } @Test public void testRestoresEquivs() { Item bbcItem = testItem(Publisher.BBC, BBC_ITEM_URI); Item mbItem = testItem(Publisher.METABROADCAST, MB_ITEM_URI); mbItem.setEquivalentTo(ImmutableSet.of(LookupRef.from(bbcItem))); contentWriter.createOrUpdate(bbcItem); contentWriter.createOrUpdate(mbItem); mongoContentPurger.purge(Publisher.METABROADCAST, ImmutableSet.of(Publisher.BBC)); Item newMbItem = testItem(Publisher.METABROADCAST, MB_ITEM_URI); contentWriter.createOrUpdate(newMbItem); mongoContentPurger.restoreEquivalences(Publisher.BBC); Set<Content> content = contentResolver.resolveUris(ImmutableSet.of(BBC_ITEM_URI), application, ImmutableSet.<Annotation>of(), false).get(BBC_ITEM_URI); assertEquals(2, content.size()); assertEquals(0, Iterables.getFirst(content, null).getAliases().size()); } private Item testItem(Publisher publisher, String uri) { Item item = ComplexItemTestDataBuilder.complexItem().withUri(uri).build(); item.setPublisher(publisher); return item; } }