package org.atlasapi.persistence.event;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.math.BigInteger;
import org.atlasapi.media.entity.Event;
import org.atlasapi.media.entity.Publisher;
import org.atlasapi.messaging.v3.EntityUpdatedMessage;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.google.common.primitives.Longs;
import com.metabroadcast.common.ids.SubstitutionTableNumberCodec;
import com.metabroadcast.common.queue.MessageSender;
import com.metabroadcast.common.time.Timestamp;
import com.metabroadcast.common.time.Timestamper;
@RunWith(MockitoJUnitRunner.class)
public class MessageQueueingEventWriterTest {
@Captor
public ArgumentCaptor<EntityUpdatedMessage> messageCaptor;
private MessageQueueingEventWriter messageQueueingEventWriter;
private @Mock EventStore delegate;
private @Mock MessageSender<EntityUpdatedMessage> sender;
private @Mock Timestamper timestamper;
private @Mock SubstitutionTableNumberCodec eventIdCodec;
private Timestamp timestamp;
private long id;
private String entityId;
@Before
public void setUp() throws Exception {
messageQueueingEventWriter = new MessageQueueingEventWriter(
delegate, sender, timestamper, eventIdCodec
);
timestamp = Timestamp.of(0L);
id = 0L;
entityId = "entityId";
when(timestamper.timestamp()).thenReturn(timestamp);
when(eventIdCodec.encode(BigInteger.valueOf(id))).thenReturn(entityId);
}
@Test
public void testEnqueueMessageWhenEventChanges() throws Exception {
Event event = Event.builder().withTitle("title").withPublisher(Publisher.BBC).build();
event.setId(id);
messageQueueingEventWriter.createOrUpdate(event);
verify(sender).sendMessage(messageCaptor.capture(), eq(Longs.toByteArray(id)));
EntityUpdatedMessage message = messageCaptor.getValue();
assertThat(message.getEntityId(), is(entityId));
assertThat(message.getEntitySource(), is(Publisher.BBC.key()));
assertThat(message.getEntityType(), is(event.getClass().getSimpleName().toLowerCase()));
assertThat(message.getTimestamp(), is(timestamp));
assertThat(message.getMessageId(), not(nullValue()));
}
}