@Test public void testMergesHDandSDforFilms() { BtVodEntry btVodEntrySD = filmRow("About Alex"); btVodEntrySD.setProductTargetBandwidth("SD"); BtVodEntry btVodEntryHD = filmRow("About Alex - HD"); btVodEntryHD.setGuid(PRODUCT_GUID + "_HD"); btVodEntryHD.setProductTargetBandwidth("HD"); when(imageExtractor.imagesFor(Matchers.<BtVodEntry>any())).thenReturn(ImmutableSet.<Image>of()); when(btVodBrandProvider.brandRefFor(btVodEntrySD)).thenReturn(Optional.<ParentRef>absent()); when(btVodBrandProvider.brandRefFor(btVodEntryHD)).thenReturn(Optional.<ParentRef>absent()); when(seriesProvider.seriesFor(btVodEntryHD)).thenReturn(Optional.<Series>absent()); when(seriesProvider.seriesFor(btVodEntrySD)).thenReturn(Optional.<Series>absent()); itemExtractor.process(btVodEntrySD); itemExtractor.process(btVodEntryHD); Item writtenItem = Iterables.getOnlyElement(itemExtractor.getProcessedItems().values()); assertThat(writtenItem.getTitle(), is("About Alex")); assertThat(writtenItem.getDescription(), is(SYNOPSIS)); assertThat(writtenItem.getVersions().size(), is(2)); Version hdVersion = Iterables.get(writtenItem.getVersions(), 0); Version sdVersion = Iterables.get(writtenItem.getVersions(), 1); assertThat( Iterables.getOnlyElement(sdVersion.getManifestedAs()).getHighDefinition(), is(false)); assertThat(Iterables.getOnlyElement(hdVersion.getManifestedAs()).getHighDefinition(), is(true)); }
@Test public void testMergesImagesAndDescriptionsForHDAndSD() { BtVodEntry btVodEntrySD = filmRow("About Alex"); btVodEntrySD.setProductTargetBandwidth("SD"); btVodEntrySD.setDescription("sd"); btVodEntrySD.setProductLongDescription("sdLong"); BtVodEntry btVodEntryHD = filmRow("About Alex - HD"); btVodEntryHD.setGuid(PRODUCT_GUID + "_HD"); btVodEntryHD.setProductTargetBandwidth("HD"); btVodEntryHD.setDescription("hd"); btVodEntryHD.setProductLongDescription("hdLong"); Image sdImage = new Image("sdImage"); Image hdImage = new Image("hdImage"); when(imageExtractor.imagesFor(btVodEntrySD)).thenReturn(ImmutableSet.of(sdImage)); when(imageExtractor.imagesFor(btVodEntryHD)).thenReturn(ImmutableSet.of(hdImage)); when(btVodBrandProvider.brandRefFor(btVodEntrySD)).thenReturn(Optional.<ParentRef>absent()); when(btVodBrandProvider.brandRefFor(btVodEntryHD)).thenReturn(Optional.<ParentRef>absent()); when(seriesProvider.seriesFor(btVodEntryHD)).thenReturn(Optional.<Series>absent()); when(seriesProvider.seriesFor(btVodEntrySD)).thenReturn(Optional.<Series>absent()); itemExtractor.process(btVodEntrySD); itemExtractor.process(btVodEntryHD); Item item = Iterables.get(itemExtractor.getProcessedItems().values(), 0); verify(descriptionAndImageUpdater) .updateDescriptionsAndImages( eq(item), eq(btVodEntryHD), eq(ImmutableSet.of(hdImage)), anySet()); }
@Test public void testDoesntMergeEpisodesWithSameTitleAcrossDifferentBrands() { BtVodEntry btVodEntry = episodeRow(SERIES_TITLE + ": S1 S1-E9 " + REAL_EPISODE_TITLE, PRODUCT_GUID); BtVodEntry btVodEntryFromDifferentSeries = episodeRow("A different " + SERIES_TITLE + ": S1 S1-E9 " + REAL_EPISODE_TITLE, "99999"); ParentRef parentRef = new ParentRef(BRAND_URI); ParentRef parentRefDiffSeries = new ParentRef(URI_PREFIX + "brands/a-different-1234"); Series series = new Series(); series.setCanonicalUri("seriesUri"); series.withSeriesNumber(1); when(seriesProvider.seriesFor(btVodEntry)).thenReturn(Optional.of(series)); when(imageExtractor.imagesFor(Matchers.<BtVodEntry>any())).thenReturn(ImmutableSet.<Image>of()); when(btVodBrandProvider.brandRefFor(btVodEntry)).thenReturn(Optional.of(parentRef)); when(btVodBrandProvider.brandRefFor(btVodEntryFromDifferentSeries)) .thenReturn(Optional.of(parentRefDiffSeries)); when(seriesProvider.seriesFor(btVodEntry)).thenReturn(Optional.of(series)); when(seriesProvider.seriesFor(btVodEntryFromDifferentSeries)).thenReturn(Optional.of(series)); itemExtractor.process(btVodEntry); itemExtractor.process(btVodEntryFromDifferentSeries); assertThat(itemExtractor.getProcessedItems().size(), is(2)); }
@Test public void testMergesFilmsFromCurzon() { BtVodEntry btVodEntrySD = filmRow("Amour"); BtVodEntry btVodEntryHD = filmRow("Amour (Curzon)"); btVodEntryHD.setGuid(PRODUCT_GUID + "Curzon"); BtVodEntry btVodEntryHDCurzon = filmRow("Amour (Curzon) - HD"); btVodEntryHDCurzon.setGuid(PRODUCT_GUID + "Curzon_HD"); when(imageExtractor.imagesFor(Matchers.<BtVodEntry>any())).thenReturn(ImmutableSet.<Image>of()); when(btVodBrandProvider.brandRefFor(btVodEntrySD)).thenReturn(Optional.<ParentRef>absent()); when(btVodBrandProvider.brandRefFor(btVodEntryHD)).thenReturn(Optional.<ParentRef>absent()); when(btVodBrandProvider.brandRefFor(btVodEntryHDCurzon)) .thenReturn(Optional.<ParentRef>absent()); when(seriesProvider.seriesFor(btVodEntrySD)).thenReturn(Optional.<Series>absent()); when(seriesProvider.seriesFor(btVodEntryHD)).thenReturn(Optional.<Series>absent()); when(seriesProvider.seriesFor(btVodEntryHDCurzon)).thenReturn(Optional.<Series>absent()); itemExtractor.process(btVodEntrySD); itemExtractor.process(btVodEntryHD); itemExtractor.process(btVodEntryHDCurzon); Item writtenItem = Iterables.getOnlyElement(itemExtractor.getProcessedItems().values()); assertThat(writtenItem.getTitle(), is("Amour")); assertThat(writtenItem.getDescription(), is(SYNOPSIS)); assertThat(writtenItem.getVersions().size(), is(3)); }
@Test public void testMergesAndDedupesTopicsAcrossVariants() { BtVodEntry btVodEntrySD = episodeRow(FULL_EPISODE_TITLE, PRODUCT_GUID); ParentRef parentRef = new ParentRef(BRAND_URI); Series series = new Series(); series.setCanonicalUri("seriesUri"); series.withSeriesNumber(1); BtVodEntry btVodEntryHD = episodeRow(FULL_EPISODE_TITLE, PRODUCT_GUID); btVodEntryHD.setTitle(FULL_EPISODE_TITLE + " - HD"); btVodEntryHD.setGuid(PRODUCT_GUID + "_HD"); when(seriesProvider.seriesFor(btVodEntrySD)).thenReturn(Optional.of(series)); when(seriesProvider.seriesFor(btVodEntryHD)).thenReturn(Optional.of(series)); when(imageExtractor.imagesFor(Matchers.<BtVodEntry>any())).thenReturn(ImmutableSet.<Image>of()); when(btVodBrandProvider.brandRefFor(btVodEntrySD)).thenReturn(Optional.of(parentRef)); when(btVodBrandProvider.brandRefFor(btVodEntryHD)).thenReturn(Optional.of(parentRef)); when(newTopicContentMatchingPredicate.apply(isA(VodEntryAndContent.class))).thenReturn(true); when(kidsTopicPredicate.apply(argThat(new VodEntryHasGuid(btVodEntryHD.getGuid())))) .thenReturn(true); itemExtractor.process(btVodEntrySD); itemExtractor.process(btVodEntryHD); Item writtenItem = Iterables.getOnlyElement(itemExtractor.getProcessedItems().values()); assertThat(writtenItem.getTopicRefs().size(), is(2)); }
@Test public void testMergesVersionsForHDandSD() { BtVodEntry btVodEntrySD = episodeRow(FULL_EPISODE_TITLE, PRODUCT_GUID); ParentRef parentRef = new ParentRef(BRAND_URI); Series series = new Series(); series.setCanonicalUri("seriesUri"); series.withSeriesNumber(1); BtVodEntry btVodEntryHD = episodeRow(FULL_EPISODE_TITLE, PRODUCT_GUID); btVodEntryHD.setTitle(FULL_EPISODE_TITLE + " - HD"); btVodEntryHD.setGuid(PRODUCT_GUID + "_HD"); when(seriesProvider.seriesFor(btVodEntrySD)).thenReturn(Optional.of(series)); when(seriesProvider.seriesFor(btVodEntryHD)).thenReturn(Optional.of(series)); when(imageExtractor.imagesFor(Matchers.<BtVodEntry>any())).thenReturn(ImmutableSet.<Image>of()); when(btVodBrandProvider.brandRefFor(btVodEntrySD)).thenReturn(Optional.of(parentRef)); when(btVodBrandProvider.brandRefFor(btVodEntryHD)).thenReturn(Optional.of(parentRef)); itemExtractor.process(btVodEntrySD); itemExtractor.process(btVodEntryHD); Item writtenItem = Iterables.getOnlyElement(itemExtractor.getProcessedItems().values()); assertThat(writtenItem.getTitle(), is(REAL_EPISODE_TITLE)); assertThat(writtenItem.getDescription(), is(SYNOPSIS)); assertThat(writtenItem.getContainer(), is(parentRef)); assertThat(writtenItem.getVersions().size(), is(2)); assertThat(writtenItem.getClips().size(), is(2)); }
@Test public void testExtractsEpisode() { BtVodEntry btVodEntry = episodeRow(FULL_EPISODE_TITLE, PRODUCT_GUID); ParentRef parentRef = new ParentRef(BRAND_URI); Series series = new Series(); series.setCanonicalUri("seriesUri"); series.withSeriesNumber(1); when(seriesProvider.seriesFor(btVodEntry)).thenReturn(Optional.of(series)); when(imageExtractor.imagesFor(Matchers.<BtVodEntry>any())).thenReturn(ImmutableSet.<Image>of()); when(btVodBrandProvider.brandRefFor(btVodEntry)).thenReturn(Optional.of(parentRef)); itemExtractor.process(btVodEntry); Item writtenItem = Iterables.getOnlyElement(itemExtractor.getProcessedItems().values()); assertThat(writtenItem.getTitle(), is(REAL_EPISODE_TITLE)); assertThat(writtenItem.getDescription(), is(SYNOPSIS)); assertThat(writtenItem.getContainer(), is(parentRef)); Location location = Iterables.getOnlyElement( Iterables.getOnlyElement( Iterables.getOnlyElement(writtenItem.getVersions()).getManifestedAs()) .getAvailableAt()); DateTime expectedAvailabilityStart = new DateTime(2013, DateTimeConstants.APRIL, 1, 0, 0, 0, 0, DateTimeZone.UTC); DateTime expectedAvailabilityEnd = new DateTime(2014, DateTimeConstants.APRIL, 30, 0, 0, 0, 0, DateTimeZone.UTC); assertThat(location.getPolicy().getAvailabilityStart(), is(expectedAvailabilityStart)); assertThat(location.getPolicy().getAvailabilityEnd(), is(expectedAvailabilityEnd)); assertThat( location.getPolicy().getSubscriptionPackages(), is((Set<String>) ImmutableSet.of(SUBSCRIPTION_CODE))); assertThat( Iterables.getOnlyElement(writtenItem.getClips()), is(new Clip(TRAILER_URI, TRAILER_URI, Publisher.BT_VOD))); Set<Alias> expectedAliases = ImmutableSet.of( new Alias(BT_VOD_GUID_NAMESPACE, btVodEntry.getGuid()), new Alias(BT_VOD_ID_NAMESPACE, btVodEntry.getId())); assertThat(writtenItem.getAliases(), is(expectedAliases)); assertThat( Iterables.getOnlyElement(location.getPolicy().getAvailableCountries()).code(), is("GB")); assertThat(location.getPolicy().getRevenueContract(), is(RevenueContract.SUBSCRIPTION)); }
@Test public void testDoesNotCreatePayToXLocationsWithZeroPrice() { BtVodEntry btVodEntry = episodeRow(SERIES_TITLE + ": S1 S1-E9 " + REAL_EPISODE_TITLE, PRODUCT_GUID); btVodEntry.setProductOfferingType("type-EST"); BtVodProductPricingPlan pricingPlan = new BtVodProductPricingPlan(); BtVodProductPricingTier pricingTier = new BtVodProductPricingTier(); pricingTier.setProductAbsoluteStart(DateTime.now().minusMonths(2).getMillis()); pricingTier.setProductAbsoluteEnd(DateTime.now().plusMonths(2).getMillis()); BtVodProductAmounts productAmounts = new BtVodProductAmounts(); productAmounts.setGBP(0D); pricingTier.setProductAmounts(productAmounts); pricingPlan.setProductPricingTiers(Lists.newArrayList(pricingTier)); btVodEntry.setProductPricingPlan(pricingPlan); ParentRef parentRef = new ParentRef(BRAND_URI); Series series = new Series(); series.setCanonicalUri("seriesUri"); series.withSeriesNumber(1); when(seriesProvider.seriesFor(btVodEntry)).thenReturn(Optional.of(series)); when(imageExtractor.imagesFor(Matchers.<BtVodEntry>any())).thenReturn(ImmutableSet.<Image>of()); when(btVodBrandProvider.brandRefFor(btVodEntry)).thenReturn(Optional.of(parentRef)); when(seriesProvider.seriesFor(btVodEntry)).thenReturn(Optional.of(series)); itemExtractor.process(btVodEntry); assertThat(itemExtractor.getProcessedItems().size(), is(1)); Item item = Iterables.getOnlyElement(itemExtractor.getProcessedItems().values()); Version version = Iterables.getOnlyElement(item.getVersions()); Encoding encoding = Iterables.getOnlyElement(version.getManifestedAs()); assertThat(encoding.getAvailableAt().size(), is(1)); Location location = Iterables.getOnlyElement(encoding.getAvailableAt()); assertThat( location.getCanonicalUri().contains(RevenueContract.PAY_TO_BUY.toString()), is(false)); assertThat( location.getCanonicalUri().contains(RevenueContract.PAY_TO_RENT.toString()), is(false)); }
@Test @Ignore // Ingored until we have real data which allows us to // correctly implement availability criteria public void testOnlyExtractsTrailerWhenMatchesCriteria() { BtVodEntry btVodEntry = episodeRow(FULL_EPISODE_TITLE, PRODUCT_GUID); ParentRef parentRef = new ParentRef(BRAND_URI); when(imageExtractor.imagesFor(Matchers.<BtVodEntry>any())).thenReturn(ImmutableSet.<Image>of()); when(seriesProvider.seriesFor(btVodEntry)).thenReturn(Optional.of(mock(Series.class))); when(btVodBrandProvider.brandRefFor(btVodEntry)).thenReturn(Optional.of(parentRef)); btVodEntry.setProductTags(ImmutableList.<BtVodPlproduct$productTag>of()); Item writtenItem = Iterables.getOnlyElement(itemExtractor.getProcessedItems().values()); assertTrue(writtenItem.getClips().isEmpty()); }
private void testHdSdMerging(String hdTitle, String sdTitle, String extractedTitle) { BtVodEntry btVodEntrySD = episodeRow(FULL_EPISODE_TITLE, PRODUCT_GUID); btVodEntrySD.setTitle(sdTitle); ParentRef parentRef = new ParentRef(BRAND_URI); btVodEntrySD.setProductTargetBandwidth("SD"); BtVodEntry btVodEntryHD = episodeRow(FULL_EPISODE_TITLE, PRODUCT_GUID); btVodEntryHD.setTitle(hdTitle); btVodEntryHD.setGuid(PRODUCT_GUID + "_HD"); btVodEntryHD.setProductTargetBandwidth("HD"); Series series = new Series(); series.setCanonicalUri("seriesUri"); series.withSeriesNumber(1); when(seriesProvider.seriesFor(btVodEntrySD)).thenReturn(Optional.of(series)); when(seriesProvider.seriesFor(btVodEntryHD)).thenReturn(Optional.of(series)); when(imageExtractor.imagesFor(Matchers.<BtVodEntry>any())).thenReturn(ImmutableSet.<Image>of()); when(btVodBrandProvider.brandRefFor(btVodEntrySD)).thenReturn(Optional.of(parentRef)); when(btVodBrandProvider.brandRefFor(btVodEntryHD)).thenReturn(Optional.of(parentRef)); itemExtractor.process(btVodEntrySD); itemExtractor.process(btVodEntryHD); Item writtenItem = Iterables.getOnlyElement(itemExtractor.getProcessedItems().values()); assertThat(writtenItem.getTitle(), is(extractedTitle)); assertThat(writtenItem.getDescription(), is(SYNOPSIS)); assertThat(writtenItem.getContainer(), is(parentRef)); assertThat(writtenItem.getVersions().size(), is(2)); Version hdVersion = Iterables.get(writtenItem.getVersions(), 0); Version sdVersion = Iterables.get(writtenItem.getVersions(), 1); assertThat( Iterables.getOnlyElement(sdVersion.getManifestedAs()).getHighDefinition(), is(false)); assertThat(Iterables.getOnlyElement(hdVersion.getManifestedAs()).getHighDefinition(), is(true)); assertThat( Iterables.getFirst(writtenItem.getClips(), null), is(new Clip(TRAILER_URI, TRAILER_URI, Publisher.BT_VOD))); }
@Test public void testUpdatesBrandAndSeriesFromEpisode() { BtVodEntry btVodEntry = episodeRow(FULL_EPISODE_TITLE, PRODUCT_GUID); ParentRef parentRef = new ParentRef(BRAND_URI); Series series = mock(Series.class); when(series.getCanonicalUri()).thenReturn("seriesUri"); when(series.getSeriesNumber()).thenReturn(1); when(seriesProvider.seriesFor(btVodEntry)).thenReturn(Optional.of(series)); when(imageExtractor.imagesFor(Matchers.<BtVodEntry>any())).thenReturn(ImmutableSet.<Image>of()); when(btVodBrandProvider.brandRefFor(btVodEntry)).thenReturn(Optional.of(parentRef)); when(newTopicContentMatchingPredicate.apply(isA(VodEntryAndContent.class))).thenReturn(true); itemExtractor.process(btVodEntry); Item writtenItem = Iterables.getOnlyElement(itemExtractor.getProcessedItems().values()); assertThat(writtenItem.getTopicRefs().contains(newTopicRef), is(true)); verify(btVodBrandProvider).updateBrandFromEpisode(btVodEntry, (Episode) writtenItem); verify(seriesProvider).updateSeriesFromEpisode(btVodEntry, (Episode) writtenItem); }