package org.atlasapi.persistence.media.entity;
import static org.hamcrest.Matchers.closeTo;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import java.util.List;
import java.util.Set;
import org.atlasapi.media.entity.Actor;
import org.atlasapi.media.entity.Broadcast;
import org.atlasapi.media.entity.Clip;
import org.atlasapi.media.entity.ContentGroupRef;
import org.atlasapi.media.entity.CrewMember;
import org.atlasapi.media.entity.Encoding;
import org.atlasapi.media.entity.Episode;
import org.atlasapi.media.entity.Item;
import org.atlasapi.media.entity.Location;
import org.atlasapi.media.entity.Policy;
import org.atlasapi.media.entity.Publisher;
import org.atlasapi.media.entity.ReleaseDate;
import org.atlasapi.media.entity.TopicRef;
import org.atlasapi.media.entity.Version;
import org.joda.time.Duration;
import org.joda.time.LocalDate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.metabroadcast.common.ids.SubstitutionTableNumberCodec;
import com.metabroadcast.common.intl.Countries;
import com.metabroadcast.common.persistence.MongoTestHelper;
import com.metabroadcast.common.persistence.mongo.MongoQueryBuilder;
import com.metabroadcast.common.time.Clock;
import com.metabroadcast.common.time.SystemClock;
import com.mongodb.BasicDBList;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import junit.framework.TestCase;
public class ItemTranslatorTest extends TestCase {
private final Clock clock = new SystemClock();
private final ItemTranslator itemTranslator = new ItemTranslator(new SubstitutionTableNumberCodec());
@SuppressWarnings("unchecked")
public void testConvertFromItem() throws Exception {
Item item = new Item("canonicalUri", "curie", Publisher.BBC);
item.setTitle("title");
ReleaseDate releaseDate = new ReleaseDate(new LocalDate(2010, 3, 20), Countries.ALL, ReleaseDate.ReleaseType.GENERAL);
item.setReleaseDates(Lists.newArrayList(releaseDate));
Location loc = new Location();
loc.setAvailable(true);
Encoding enc = new Encoding();
enc.setAdvertisingDuration(1);
enc.addAvailableAt(loc);
Duration duration = Duration.standardSeconds(1);
Broadcast br = new Broadcast("channel", clock.now(), duration);
br.setScheduleDate(new LocalDate(2010, 3, 20));
Version version = new Version();
version.setDuration(duration);
version.addManifestedAs(enc);
version.addBroadcast(br);
item.addVersion(version);
Set<String> tags = Sets.newHashSet();
tags.add("tag");
item.setTags(tags);
TopicRef topic1 = new TopicRef(1l, 0.01f, true, TopicRef.Relationship.ABOUT);
TopicRef topic2 = new TopicRef(2l, 0.02f, false, TopicRef.Relationship.ABOUT);
item.setTopicRefs(ImmutableList.of(topic1, topic2));
DBObject dbObject = itemTranslator.toDBObject(null, item);
assertEquals("canonicalUri", dbObject.get(IdentifiedTranslator.ID));
assertEquals("title", dbObject.get("title"));
List<String> t = (List<String>) dbObject.get("tags");
assertFalse(t.isEmpty());
for (String tag: t) {
assertTrue(tags.contains(tag));
}
BasicDBList rs = (BasicDBList) dbObject.get("releases");
assertEquals(1, rs.size());
DBObject r = (DBObject) rs.get(0);
assertEquals(releaseDate.date().toString(), r.get("date"));
BasicDBList vs = (BasicDBList) dbObject.get("versions");
assertEquals(1, vs.size());
DBObject v = (DBObject) vs.get(0);
assertEquals(version.getDuration(), v.get("duration"));
BasicDBList bs = (BasicDBList) v.get("broadcasts");
assertEquals(1, bs.size());
DBObject b = (DBObject) bs.get(0);
assertEquals(br.getScheduleDate().toString(), b.get("scheduleDate"));
BasicDBList ma = (BasicDBList) v.get("manifestedAs");
assertEquals(1, ma.size());
DBObject e = (DBObject) ma.get(0);
assertEquals(enc.getAdvertisingDuration(), e.get("advertisingDuration"));
BasicDBList ls = (BasicDBList) e.get("availableAt");
assertEquals(1, ls.size());
DBObject l = (DBObject) ls.get(0);
assertEquals(loc.getAvailable(), l.get("available"));
List<DBObject> ts = (List<DBObject>) dbObject.get("topics");
assertEquals(2, ts.size());
DBObject t1 = (DBObject) ts.iterator().next();
assertEquals(topic1.getTopic(), t1.get("topic"));
assertThat(topic1.getWeighting().doubleValue(), is(closeTo((Double)t1.get("weighting"), 0.0001)));
assertEquals(topic1.isSupervised(), t1.get("supervised"));
assertEquals(topic1.getRelationship().name(), t1.get("relationship"));
}
public void testConvertToItem() throws Exception {
MongoTestHelper.ensureMongoIsRunning();
DBCollection collection = MongoTestHelper.anEmptyTestDatabase().collection("test");
Item item = new Item("canonicalUri", "curie", Publisher.BBC);
item.setTitle("title");
ReleaseDate releaseDate = new ReleaseDate(new LocalDate(2010, 3, 20), Countries.ALL, ReleaseDate.ReleaseType.GENERAL);
item.setReleaseDates(Lists.newArrayList(releaseDate));
Location loc = new Location();
loc.setAvailable(true);
Encoding enc = new Encoding();
enc.setAdvertisingDuration(1);
enc.addAvailableAt(loc);
Duration duration = Duration.standardSeconds(1);
Broadcast br = new Broadcast("channel", clock.now(), duration);
br.setScheduleDate(new LocalDate(2010, 3, 20));
Version version = new Version();
version.setDuration(duration);
version.addManifestedAs(enc);
version.addBroadcast(br);
item.addVersion(version);
Actor actor = Actor.actor("an_id", "blah", "some guy", Publisher.BBC);
item.addPerson(actor);
Set<String> tags = Sets.newHashSet();
tags.add("tag");
item.setTags(tags);
TopicRef topic1 = new TopicRef(1l, 0.01f, true, TopicRef.Relationship.ABOUT);
TopicRef topic2 = new TopicRef(2l, 0.02f, false, TopicRef.Relationship.ABOUT);
item.setTopicRefs(ImmutableList.of(topic1, topic2));
ContentGroupRef contentGroup1 = new ContentGroupRef(1L, "uri");
item.addContentGroup(contentGroup1);
DBObject dbObject = itemTranslator.toDBObject(null, item);
collection.save(dbObject);
Item i = itemTranslator.fromDBObject(collection.findOne(new MongoQueryBuilder().idEquals(item.getCanonicalUri()).build()), null);
assertEquals(i.getCanonicalUri(), item.getCanonicalUri());
assertEquals(i.getCurie(), item.getCurie());
Set<String> t = i.getTags();
for (String tag: t) {
assertTrue(item.getTags().contains(tag));
}
ReleaseDate r = Iterables.getOnlyElement(item.getReleaseDates());
assertEquals(releaseDate.date(), r.date());
Set<Version> vs = item.getVersions();
assertEquals(1, vs.size());
Version v = vs.iterator().next();
assertEquals(version.getDuration(), v.getDuration());
Set<Broadcast> bs = v.getBroadcasts();
assertEquals(1, bs.size());
Broadcast b = bs.iterator().next();
assertEquals(br.getScheduleDate(), b.getScheduleDate());
Set<Encoding> ma = v.getManifestedAs();
assertEquals(1, ma.size());
Encoding e = ma.iterator().next();
assertEquals(enc.getAdvertisingDuration(), e.getAdvertisingDuration());
Set<Location> ls = e.getAvailableAt();
assertEquals(1, ls.size());
assertEquals(loc.getAvailable(), ls.iterator().next().getAvailable());
List<CrewMember> people = i.people();
assertEquals(1, people.size());
assertEquals("some guy", ((Actor) Iterables.getFirst(people, null)).character());
assertEquals(item.getTopicRefs(), i.getTopicRefs());
assertEquals(item.getContentGroupRefs(), i.getContentGroupRefs());
}
public void testConvertFromEpisode() throws Exception {
Item item = new Episode("canonicalUri", "curie", Publisher.BBC);
item.setTitle("title");
ReleaseDate releaseDate = new ReleaseDate(new LocalDate(2010, 3, 20), Countries.ALL, ReleaseDate.ReleaseType.GENERAL);
item.setReleaseDates(Lists.newArrayList(releaseDate));
Location loc = new Location();
loc.setAvailable(true);
Encoding enc = new Encoding();
enc.setAdvertisingDuration(1);
enc.addAvailableAt(loc);
Duration duration = Duration.standardSeconds(1);
Broadcast br = new Broadcast("channel", clock.now(), duration);
br.setScheduleDate(new LocalDate(2010, 3, 20));
Version version = new Version();
version.setDuration(duration);
version.addManifestedAs(enc);
version.addBroadcast(br);
item.addVersion(version);
Set<String> tags = Sets.newHashSet();
tags.add("tag");
item.setTags(tags);
item.setShortDescription("Hello");
item.setMediumDescription("Hello World");
item.setLongDescription("Hello World Testing");
DBObject dbObject = itemTranslator.toDBObject(null, item);
assertEquals(item.getShortDescription(), dbObject.get("shortDescription"));
assertEquals(item.getMediumDescription(), dbObject.get("mediumDescription"));
assertEquals(item.getLongDescription(), dbObject.get("longDescription"));
}
public void testConvertToEpisode() throws Exception {
MongoTestHelper.ensureMongoIsRunning();
DBCollection collection = MongoTestHelper.anEmptyTestDatabase().collection("test");
Item item = new Episode("canonicalUri", "curie", Publisher.BBC);
item.setTitle("title");
ReleaseDate releaseDate = new ReleaseDate(new LocalDate(2010, 3, 20), Countries.ALL, ReleaseDate.ReleaseType.GENERAL);
item.setReleaseDates(Lists.newArrayList(releaseDate));
Location loc = new Location();
loc.setAvailable(true);
Encoding enc = new Encoding();
enc.setAdvertisingDuration(1);
enc.addAvailableAt(loc);
Duration duration = Duration.standardSeconds(1);
Version version = new Version();
version.setDuration(duration);
version.addManifestedAs(enc);
item.addVersion(version);
Set<String> tags = Sets.newHashSet();
tags.add("tag");
item.setTags(tags);
item.setShortDescription("Hello");
item.setMediumDescription("Hello World");
item.setLongDescription("Hello World Testing");
DBObject dbObject = itemTranslator.toDBObject(null, item);
collection.save(dbObject);
Item i = itemTranslator.fromDBObject(collection.findOne(new MongoQueryBuilder().idEquals(item.getCanonicalUri()).build()), null);
assertEquals(item.getShortDescription(), i.getShortDescription());
assertEquals(item.getMediumDescription(), i.getMediumDescription());
assertEquals(item.getLongDescription(), i.getLongDescription());
}
@SuppressWarnings("unchecked")
public void testRemovesLastUpdatedFromClipsForHashcode() {
Item item = new Item("testUri", "testCurie", Publisher.BBC);
createModel(item);
Clip clip = new Clip();
createModel(clip);
item.addClip(clip);
DBObject dbo = itemTranslator.toDB(item);
itemTranslator.removeFieldsForHash(dbo);
assertTimesAreNull(dbo);
DBObject clipDbo = Iterables.getOnlyElement((Iterable<DBObject>) dbo.get("clips"));
assertTimesAreNull(clipDbo);
}
@SuppressWarnings("unchecked")
public void assertTimesAreNull(DBObject dbo) {
assertNull(dbo.get(DescribedTranslator.LAST_FETCHED_KEY));
assertNull(dbo.get(DescribedTranslator.THIS_OR_CHILD_LAST_UPDATED_KEY));
assertLastUpdatedNull(dbo);
assertNull(Iterables.getOnlyElement((Iterable<DBObject>) dbo.get("people")).get(IdentifiedTranslator.LAST_UPDATED));
DBObject versionDbo = Iterables.getOnlyElement((Iterable<DBObject>) dbo.get("versions"));
assertLastUpdatedNull(versionDbo);
DBObject broadcastDbo = Iterables.getOnlyElement((Iterable<DBObject>) versionDbo.get("broadcasts"));
assertLastUpdatedNull(broadcastDbo);
DBObject encodingDbo = Iterables.getOnlyElement((Iterable<DBObject>) versionDbo.get("manifestedAs"));
assertLastUpdatedNull(encodingDbo);
DBObject locationDbo = Iterables.getOnlyElement((Iterable<DBObject>) encodingDbo.get("availableAt"));
assertLastUpdatedNull(locationDbo);
DBObject policyDbo = (DBObject) locationDbo.get("policy");
assertLastUpdatedNull(policyDbo);
}
public void assertLastUpdatedNull(DBObject dbo) {
assertNull(dbo.get(IdentifiedTranslator.LAST_UPDATED));
}
public void createModel(Item item) {
item.setLastUpdated(clock.now());
item.setThisOrChildLastUpdated(clock.now());
item.setLastFetched(clock.now());
Actor person = new Actor("personUri","personCurie",Publisher.BBC);
person.setLastUpdated(clock.now());
item.addPerson(person);
Version version = new Version();
version.setLastUpdated(clock.now());
item.addVersion(version);
Broadcast broadcast = new Broadcast("http://www.bbc.co.uk/bbcone", clock.now(), clock.now());
broadcast.setLastUpdated(clock.now());
version.addBroadcast(broadcast);
Encoding encoding = new Encoding();
encoding.setLastUpdated(clock.now());
version.addManifestedAs(encoding);
Location location = new Location();
location.setLastUpdated(clock.now());
encoding.addAvailableAt(location);
Policy policy = new Policy();
policy.setAvailabilityStart(clock.now());
policy.setLastUpdated(clock.now());
location.setPolicy(policy);
}
}