package org.atlasapi.persistence.audit;
import static org.junit.Assert.assertEquals;
import org.atlasapi.media.entity.Brand;
import org.atlasapi.media.entity.Item;
import org.atlasapi.media.entity.Publisher;
import org.atlasapi.media.entity.testing.ComplexItemTestDataBuilder;
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Iterables;
import com.metabroadcast.common.persistence.MongoTestHelper;
import com.metabroadcast.common.persistence.mongo.DatabasedMongo;
import com.metabroadcast.common.persistence.mongo.MongoQueryBuilder;
import com.metabroadcast.common.time.TimeMachine;
import com.mongodb.DBObject;
public class PerHourAndDayMongoPersistenceAuditLogTest {
private final TimeMachine clock = new TimeMachine();
private DatabasedMongo mongo;
private PerHourAndDayMongoPersistenceAuditLog auditLog;
@Before
public void setUp() {
mongo = MongoTestHelper.anEmptyTestDatabase();
auditLog = new PerHourAndDayMongoPersistenceAuditLog(mongo, clock);
}
@Test
public void testWrites() {
clock.jumpTo(new DateTime(2014, DateTimeConstants.JANUARY, 1, 3, 0, 0, 0));
auditLog.logWrite(createItem(Publisher.BBC));
auditLog.logWrite(createItem(Publisher.BBC));
auditLog.logNoWrite(createItem(Publisher.BBC));
auditLog.logNoWrite(createItem(Publisher.BBC));
auditLog.logNoWrite(createItem(Publisher.BBC));
auditLog.logNoWrite(createItem(Publisher.BBC));
auditLog.logWrite(createBrand(Publisher.BBC));
auditLog.logWrite(createItem(Publisher.METABROADCAST));
auditLog.logNoWrite(createItem(Publisher.METABROADCAST));
DBObject perDayBbc = Iterables.getOnlyElement(mongo.collection("perDayWriteLog").find(
new MongoQueryBuilder()
.fieldEquals("publisher", Publisher.BBC.key().toLowerCase())
.fieldEquals("timeBucket", "2014-01-01")
.build()));
assertBbcWrites(perDayBbc);
DBObject perHour = Iterables.getOnlyElement(mongo.collection("perHourWriteLog").find(
new MongoQueryBuilder()
.fieldEquals("publisher", Publisher.BBC.key().toLowerCase())
.fieldEquals("timeBucket", "2014-01-01T03")
.build()));
assertBbcWrites(perHour);
DBObject perDayMbst = Iterables.getOnlyElement(mongo.collection("perDayWriteLog").find(
new MongoQueryBuilder()
.fieldEquals("publisher", Publisher.METABROADCAST.key().toLowerCase())
.fieldEquals("timeBucket", "2014-01-01")
.build()));
assertMbstWrites(perDayMbst);
DBObject perHourMbst = Iterables.getOnlyElement(mongo.collection("perHourWriteLog").find(
new MongoQueryBuilder()
.fieldEquals("publisher", Publisher.METABROADCAST.key().toLowerCase())
.fieldEquals("timeBucket", "2014-01-01T03")
.build()));
assertMbstWrites(perHourMbst);
}
private void assertBbcWrites(DBObject dbo) {
DBObject noWrites = (DBObject) dbo.get("noWrite");
//temporarily disabled
//assertEquals(4, noWrites.get("item"));
DBObject writes = (DBObject) dbo.get("write");
assertEquals(2, writes.get("item"));
assertEquals(1, writes.get("brand"));
}
private void assertMbstWrites(DBObject dbo) {
//temporarily disabled
//DBObject noWrites = (DBObject) dbo.get("noWrite");
//assertEquals(1, noWrites.get("item"));
DBObject writes = (DBObject) dbo.get("write");
assertEquals(1, writes.get("item"));
}
private Item createItem(Publisher publisher) {
Item item = ComplexItemTestDataBuilder.complexItem().build();
item.setPublisher(publisher);
return item;
}
private Brand createBrand(Publisher publisher) {
return new Brand(null, null, publisher);
}
}