package org.atlasapi.persistence.content; import java.util.concurrent.TimeUnit; import org.atlasapi.media.entity.Item; import org.atlasapi.media.entity.Person; import org.atlasapi.media.entity.Publisher; import org.atlasapi.persistence.content.people.PersonStore; import org.atlasapi.persistence.content.people.QueuingPersonWriter; import org.atlasapi.persistence.logging.SystemOutAdapterLog; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.integration.junit4.JMock; import org.jmock.integration.junit4.JUnit4Mockery; import org.jmock.lib.concurrent.DeterministicScheduler; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import com.google.common.base.Optional; @RunWith(JMock.class) public class QueuingPersonWriterTest { private Mockery context = new JUnit4Mockery(); private final PersonStore personStore = context.mock(PersonStore.class); private final Person person1 = new Person("person1", "person1", Publisher.BBC); private final Person person2 = new Person("person2", "person2", Publisher.BBC); private final Item item1 = new Item("item1", "item1", Publisher.BBC); private final Item item2 = new Item("item2", "item2", Publisher.BBC); private final DeterministicScheduler scheduler = new DeterministicScheduler(); private QueuingPersonWriter writer; @Before public void setUp() { writer = new QueuingPersonWriter(personStore, new SystemOutAdapterLog(), scheduler); } @Test public void shouldWritePersonOnlyOnce() { writer.addItemToPerson((Person) person1.copy(), item1); writer.addItemToPerson((Person) person2.copy(), item1); writer.addItemToPerson((Person) person1.copy(), item2); writer.addItemToPerson((Person) person2.copy(), item2); context.checking(new Expectations() {{ oneOf(personStore).person(person1.getCanonicalUri()); will(returnValue(Optional.absent())); oneOf(personStore).person(person2.getCanonicalUri()); will(returnValue(Optional.of(person2))); oneOf(personStore).createOrUpdatePerson(person1); allowing(personStore).updatePersonItems(person1); allowing(personStore).updatePersonItems(person2); }}); scheduler.tick(15, TimeUnit.MINUTES); } }