package org.atlasapi.media.channel;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.isIn;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.atlasapi.media.entity.Publisher;
import org.joda.time.LocalDate;
import org.junit.BeforeClass;
import org.junit.Test;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.metabroadcast.common.intl.Countries;
import com.metabroadcast.common.persistence.MongoTestHelper;
import com.metabroadcast.common.persistence.mongo.DatabasedMongo;
public class MongoChannelGroupStoreTest {
private static final DatabasedMongo mongo = MongoTestHelper.anEmptyTestDatabase();
private static final MongoChannelGroupStore store = new MongoChannelGroupStore(mongo);
private static Long platformId;
private static Long newPlatformId;
private static Long region1Id;
private static Long region2Id;
private static Long region3Id;
@BeforeClass
public static void setup() {
platformId = store.createOrUpdate(createPlatform()).getId();
newPlatformId = store.createOrUpdate(createPlatform()).getId();
region1Id = store.createOrUpdate(createRegion("region1")).getId();
region2Id = store.createOrUpdate(createRegion("region2")).getId();
region3Id = store.createOrUpdate(createRegion("region3")).getId();
}
private static Platform createPlatform() {
Platform platform = new Platform();
return platform;
}
private static Region createRegion(String title) {
Region region = new Region();
region.setAvailableCountries(ImmutableSet.of(Countries.GB));
region.addTitle(title);
region.setPublisher(Publisher.METABROADCAST);
return region;
}
@Test
public void testStoresAndRetrievesChannelGroup() {
Optional<ChannelGroup> group = store.channelGroupFor(platformId);
assertTrue(group.isPresent());
assertThat(group.get().getId(), is(platformId));
}
@Test
public void testRetrievesGroupsForIds() {
ImmutableList<Long> requestedIds = ImmutableList.of(region1Id, platformId);
Iterable<ChannelGroup> groups = store.channelGroupsFor(requestedIds);
assertThat(Iterables.size(groups), is(2));
assertThat(Iterables.get(groups, 0).getId(), isIn(requestedIds));
assertThat(Iterables.get(groups, 1).getId(), isIn(requestedIds));
}
@Test
public void testRetrievesAllGroups() {
Iterable<ChannelGroup> groups = store.channelGroups();
ImmutableList<Long> ids = ImmutableList.of(platformId, newPlatformId, region1Id, region2Id, region3Id);
assertThat(Iterables.size(groups), is(5));
assertThat(Iterables.get(groups, 0).getId(), isIn(ids));
assertThat(Iterables.get(groups, 1).getId(), isIn(ids));
assertThat(Iterables.get(groups, 2).getId(), isIn(ids));
assertThat(Iterables.get(groups, 3).getId(), isIn(ids));
}
@Test
public void testAddMultipleNumberings() {
ChannelGroup platform = store.channelGroupFor(platformId).get();
ChannelNumbering numbering = ChannelNumbering.builder()
.withStartDate(new LocalDate(2011, 1, 1))
.withChannel(1234L)
.withChannelGroup(platform)
.withChannelNumber("1")
.build();
platform.addChannelNumbering(numbering);
platform = store.createOrUpdate(platform);
assertThat(platform.getChannelNumberings().size(), is(1));
platform.addChannelNumbering(numbering);
platform = store.createOrUpdate(platform);
assertThat(platform.getChannelNumberings().size(), is(1));
numbering = ChannelNumbering.builder()
.withStartDate(new LocalDate(2011, 1, 1))
.withChannel(1234L)
.withChannelGroup(platform)
.withChannelNumber("2")
.build();
platform.addChannelNumbering(numbering);
platform = store.createOrUpdate(platform);
assertThat(platform.getChannelNumberings().size(), is(2));
}
@Test
public void testChangeOfPlatform() {
Region region = (Region)store.channelGroupFor(region1Id).get();
region.setPlatform(platformId);
region = (Region)store.createOrUpdate(region);
Platform platform = (Platform)store.channelGroupFor(platformId).get();
Platform newPlatform = (Platform)store.channelGroupFor(newPlatformId).get();
assertEquals(platformId, region.getPlatform());
assertEquals(ImmutableSet.of(region.getId()), platform.getRegions());
assertEquals(ImmutableSet.of(), newPlatform.getRegions());
region.setPlatform(newPlatformId);
region = (Region)store.createOrUpdate(region);
platform = (Platform)store.channelGroupFor(platformId).get();
newPlatform = (Platform)store.channelGroupFor(newPlatformId).get();
assertEquals(newPlatformId, region.getPlatform());
assertEquals(ImmutableSet.of(), platform.getRegions());
assertEquals(ImmutableSet.of(region.getId()), newPlatform.getRegions());
}
}