public void ApplyEnhancements_DuplicateEnhancementRequestsMade_OnlyUniqueResultsAddedToIdentity(
            string filePath,
            TvReleaseIdentity identity,
            TvDbEnhancement tvDbEnhancement,
            SubDbFileHashEnhancement subDbFileHashEnhancement,
            IEpisodeSubtitleDownloader downloader,
            IEnhancementProvider enhancementProvider
            )
        {
            var expectedEnhancements = new IEnhancement[] {tvDbEnhancement, subDbFileHashEnhancement};
            var downloaders = new[] {downloader};
            var enhancementRequests = new IEnhancementRequest[]
            {
                new EnhancementRequest<TvDbEnhancement>(),
                new EnhancementRequest<TvDbEnhancement>(),
                new EnhancementRequest<SubDbFileHashEnhancement>()
            };
            A.CallTo(() => downloader.EnhancementRequests).Returns(enhancementRequests);
            A.CallTo(
                () =>
                    enhancementProvider.GetEnhancement(A<Type>.That.IsEqualTo(typeof (TvDbEnhancement)), filePath,
                        identity))
                .Returns(tvDbEnhancement);
            A.CallTo(
                () =>
                    enhancementProvider.GetEnhancement(A<Type>.That.IsEqualTo(typeof (SubDbFileHashEnhancement)),
                        filePath, identity))
                .Returns(subDbFileHashEnhancement);
            var sut = new EnhancementApplicator(downloaders, enhancementProvider);

            sut.ApplyEnhancements(filePath, identity);

            Assert.That(identity.Enhancements, Is.EquivalentTo(expectedEnhancements));
        }
        public void ApplyEnhancements_EnhancementRequestsMade_ResultsAddedToIdentity(
            string filePath,
            TvReleaseIdentity identity,
            IEnumerable<IEnhancementRequest> enhancementRequests,
            IEnhancement[] enhancements,
            IEpisodeSubtitleDownloader downloader,
            IEnhancementProvider enhancementProvider
            )
        {
            var downloaders = new[] {downloader};
            A.CallTo(() => downloader.EnhancementRequests).Returns(enhancementRequests);
            A.CallTo(() => enhancementProvider.GetEnhancement(A<Type>._, filePath, identity))
                .ReturnsNextFromSequence(enhancements);
            var sut = new EnhancementApplicator(downloaders, enhancementProvider);

            sut.ApplyEnhancements(filePath, identity);

            Assert.That(identity.Enhancements, Is.EquivalentTo(enhancements));
        }
        public void DownloadSubtitle_MatchingSubtitlesDownloaderSucceeds_DownloaderShouldDownloadFirstLanguage(
            string file,
            Subtitle[] matches,
            TvReleaseIdentity identity,
            ISubtitleRanker subtitleRanker,
            IEpisodeSubtitleDownloader fakeDownloader,
            IEnhancementProvider enhancementProvider
            )
        {
            var languages = matches.Skip(1).Select(m => m.Language);
            var expectedLanguage = languages.First();
            A.CallTo(() => fakeDownloader.SearchSubtitle(A<TvReleaseIdentity>._, A<Language[]>._)).Returns(matches);
            A.CallTo(() => fakeDownloader.TryDownloadSubtitle(A<Subtitle>._, A<string>._)).Returns(true);
            A.CallTo(() => fakeDownloader.CanHandleAtLeastOneOf(A<Language[]>._)).Returns(true);
            var downloaders = new[] { fakeDownloader };
            var service = new SubtitleDownloadService(downloaders, enhancementProvider, subtitleRanker);

            service.DownloadSubtitle(file, identity, languages);

            A.CallTo(() => fakeDownloader.TryDownloadSubtitle(A<Subtitle>.That.Matches(s => s.Language == expectedLanguage), A<string>._))
                .MustHaveHappened(Repeated.Exactly.Once);
        }
        public void DownloadSubtitle_MatchingSubtitlesDownloaderSucceeds_ShouldReturnTrue(
            string file,
            TvReleaseIdentity identity,
            Subtitle[] matches,
            ISubtitleRanker subtitleRanker,
            IEpisodeSubtitleDownloader fakeDownloader,
            IEnhancementProvider enhancementProvider
            )
        {
            var languages = matches.Select(m => m.Language);
            A.CallTo(() => fakeDownloader.SearchSubtitle(A<TvReleaseIdentity>._, A<Language[]>._)).Returns(matches);
            A.CallTo(() => fakeDownloader.TryDownloadSubtitle(A<Subtitle>._, A<string>._)).Returns(true);
            A.CallTo(() => fakeDownloader.CanHandleAtLeastOneOf(A<Language[]>._)).Returns(true);
            var downloaders = new[] { fakeDownloader };
            var service = new SubtitleDownloadService(downloaders, enhancementProvider, subtitleRanker);

            bool success = service.DownloadSubtitle(file, identity, languages);

            Assert.That(success, Is.True);
        }
 public DownloaderMatch(IEpisodeSubtitleDownloader downloader, Subtitle subtitle)
 {
     Downloader = downloader;
     Subtitle = subtitle;
 }