using System.Collections.Generic; using System.IO; using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles.EpisodeImport; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Profiles; using NzbDrone.Core.Qualities; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.MediaFiles { [TestFixture] public class ImportApprovedEpisodesFixture : CoreTest { private List _rejectedDecisions; private List _approvedDecisions; [SetUp] public void Setup() { _rejectedDecisions = new List(); _approvedDecisions = new List(); var series = Builder.CreateNew() .With(e => e.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities() }) .With(s => s.Path = @"C:\Test\TV\30 Rock".AsOsAgnostic()) .Build(); var episodes = Builder.CreateListOfSize(5) .Build(); _rejectedDecisions.Add(new ImportDecision(new LocalEpisode(), "Rejected!")); _rejectedDecisions.Add(new ImportDecision(new LocalEpisode(), "Rejected!")); _rejectedDecisions.Add(new ImportDecision(new LocalEpisode(), "Rejected!")); foreach (var episode in episodes) { _approvedDecisions.Add(new ImportDecision ( new LocalEpisode { Series = series, Episodes = new List {episode}, Path = Path.Combine(series.Path, "30 Rock - S01E01 - Pilot.avi"), Quality = new QualityModel(Quality.Bluray720p), ParsedEpisodeInfo = new ParsedEpisodeInfo { ReleaseGroup = "DRONE" } })); } Mocker.GetMock() .Setup(s => s.UpgradeEpisodeFile(It.IsAny(), It.IsAny(), false)) .Returns(new EpisodeFileMoveResult()); } [Test] public void should_not_import_any_if_there_are_no_approved_decisions() { Subject.Import(_rejectedDecisions, false).Where(i => i.Result == ImportResultType.Imported).Should().BeEmpty(); Mocker.GetMock().Verify(v => v.Add(It.IsAny()), Times.Never()); } [Test] public void should_import_each_approved() { Subject.Import(_approvedDecisions, false).Should().HaveCount(5); } [Test] public void should_only_import_approved() { var all = new List(); all.AddRange(_rejectedDecisions); all.AddRange(_approvedDecisions); var result = Subject.Import(all, false); result.Should().HaveCount(all.Count); result.Where(i => i.Result == ImportResultType.Imported).Should().HaveCount(_approvedDecisions.Count); } [Test] public void should_only_import_each_episode_once() { var all = new List(); all.AddRange(_approvedDecisions); all.Add(new ImportDecision(_approvedDecisions.First().LocalEpisode)); var result = Subject.Import(all, false); result.Where(i => i.Result == ImportResultType.Imported).Should().HaveCount(_approvedDecisions.Count); } [Test] public void should_move_new_downloads() { Subject.Import(new List {_approvedDecisions.First()}, true); Mocker.GetMock() .Verify(v => v.UpgradeEpisodeFile(It.IsAny(), _approvedDecisions.First().LocalEpisode, false), Times.Once()); } [Test] public void should_publish_EpisodeImportedEvent_for_new_downloads() { Subject.Import(new List { _approvedDecisions.First() }, true); Mocker.GetMock() .Verify(v => v.PublishEvent(It.IsAny()), Times.Once()); } [Test] public void should_not_move_existing_files() { Subject.Import(new List { _approvedDecisions.First() }, false); Mocker.GetMock() .Verify(v => v.UpgradeEpisodeFile(It.IsAny(), _approvedDecisions.First().LocalEpisode, false), Times.Never()); } [Test] public void should_import_larger_files_first() { var fileDecision = _approvedDecisions.First(); fileDecision.LocalEpisode.Size = 1.Gigabytes(); var sampleDecision = new ImportDecision (new LocalEpisode { Series = fileDecision.LocalEpisode.Series, Episodes = new List {fileDecision.LocalEpisode.Episodes.First()}, Path = @"C:\Test\TV\30 Rock\30 Rock - S01E01 - Pilot.avi".AsOsAgnostic(), Quality = new QualityModel(Quality.Bluray720p), Size = 80.Megabytes() }); var all = new List(); all.Add(fileDecision); all.Add(sampleDecision); var results = Subject.Import(all, false); results.Should().HaveCount(all.Count); results.Should().ContainSingle(d => d.Result == ImportResultType.Imported); results.Should().ContainSingle(d => d.Result == ImportResultType.Imported && d.ImportDecision.LocalEpisode.Size == fileDecision.LocalEpisode.Size); } } }