using System.IO; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.MediaFiles.MediaInfo; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Movies; using NzbDrone.Test.Common; using NzbDrone.Core.Configuration; namespace NzbDrone.Core.Test.MediaFiles.MediaInfo { [TestFixture] public class UpdateMediaInfoServiceFixture : CoreTest { private Movie _movie; [SetUp] public void Setup() { _movie = new Movie { Id = 1, Path = @"C:\movie".AsOsAgnostic() }; Mocker.GetMock() .SetupGet(s => s.EnableMediaInfo) .Returns(true); } private void GivenFileExists() { Mocker.GetMock() .Setup(v => v.FileExists(It.IsAny())) .Returns(true); } private void GivenSuccessfulScan() { Mocker.GetMock() .Setup(v => v.GetMediaInfo(It.IsAny())) .Returns(new MediaInfoModel()); } private void GivenFailedScan(string path) { Mocker.GetMock() .Setup(v => v.GetMediaInfo(path)) .Returns((MediaInfoModel)null); } [Test] public void should_skip_up_to_date_media_info() { var movieFiles = Builder.CreateListOfSize(3) .All() .With(v => v.RelativePath = "media.mkv") .TheFirst(1) .With(v => v.MediaInfo = new MediaInfoModel { SchemaRevision = VideoFileInfoReader.CURRENT_MEDIA_INFO_SCHEMA_REVISION }) .BuildList(); Mocker.GetMock() .Setup(v => v.GetFilesByMovie(1)) .Returns(movieFiles); GivenFileExists(); GivenSuccessfulScan(); Subject.Handle(new MovieScannedEvent(_movie)); Mocker.GetMock() .Verify(v => v.GetMediaInfo(Path.Combine(_movie.Path, "media.mkv")), Times.Exactly(2)); Mocker.GetMock() .Verify(v => v.Update(It.IsAny()), Times.Exactly(2)); } [Test] public void should_skip_not_yet_date_media_info() { var movieFiles = Builder.CreateListOfSize(3) .All() .With(v => v.RelativePath = "media.mkv") .TheFirst(1) .With(v => v.MediaInfo = new MediaInfoModel { SchemaRevision = VideoFileInfoReader.MINIMUM_MEDIA_INFO_SCHEMA_REVISION }) .BuildList(); Mocker.GetMock() .Setup(v => v.GetFilesByMovie(1)) .Returns(movieFiles); GivenFileExists(); GivenSuccessfulScan(); Subject.Handle(new MovieScannedEvent(_movie)); Mocker.GetMock() .Verify(v => v.GetMediaInfo(Path.Combine(_movie.Path, "media.mkv")), Times.Exactly(2)); Mocker.GetMock() .Verify(v => v.Update(It.IsAny()), Times.Exactly(2)); } [Test] public void should_update_outdated_media_info() { var movieFiles = Builder.CreateListOfSize(3) .All() .With(v => v.RelativePath = "media.mkv") .TheFirst(1) .With(v => v.MediaInfo = new MediaInfoModel()) .BuildList(); Mocker.GetMock() .Setup(v => v.GetFilesByMovie(1)) .Returns(movieFiles); GivenFileExists(); GivenSuccessfulScan(); Subject.Handle(new MovieScannedEvent(_movie)); Mocker.GetMock() .Verify(v => v.GetMediaInfo(Path.Combine(_movie.Path, "media.mkv")), Times.Exactly(3)); Mocker.GetMock() .Verify(v => v.Update(It.IsAny()), Times.Exactly(3)); } [Test] public void should_ignore_missing_files() { var movieFiles = Builder.CreateListOfSize(2) .All() .With(v => v.RelativePath = "media.mkv") .BuildList(); Mocker.GetMock() .Setup(v => v.GetFilesByMovie(1)) .Returns(movieFiles); GivenSuccessfulScan(); Subject.Handle(new MovieScannedEvent(_movie)); Mocker.GetMock() .Verify(v => v.GetMediaInfo("media.mkv"), Times.Never()); Mocker.GetMock() .Verify(v => v.Update(It.IsAny()), Times.Never()); } [Test] public void should_continue_after_failure() { var movieFiles = Builder.CreateListOfSize(2) .All() .With(v => v.RelativePath = "media.mkv") .TheFirst(1) .With(v => v.RelativePath = "media2.mkv") .BuildList(); Mocker.GetMock() .Setup(v => v.GetFilesByMovie(1)) .Returns(movieFiles); GivenFileExists(); GivenSuccessfulScan(); GivenFailedScan(Path.Combine(_movie.Path, "media2.mkv")); Subject.Handle(new MovieScannedEvent(_movie)); Mocker.GetMock() .Verify(v => v.GetMediaInfo(Path.Combine(_movie.Path, "media.mkv")), Times.Exactly(1)); Mocker.GetMock() .Verify(v => v.Update(It.IsAny()), Times.Exactly(1)); } [Test] public void should_not_update_files_if_media_info_disabled() { var movieFiles = Builder.CreateListOfSize(2) .All() .With(v => v.RelativePath = "media.mkv") .TheFirst(1) .With(v => v.RelativePath = "media2.mkv") .BuildList(); Mocker.GetMock() .Setup(v => v.GetFilesByMovie(1)) .Returns(movieFiles); Mocker.GetMock() .SetupGet(s => s.EnableMediaInfo) .Returns(false); GivenFileExists(); GivenSuccessfulScan(); Subject.Handle(new MovieScannedEvent(_movie)); Mocker.GetMock() .Verify(v => v.GetMediaInfo(It.IsAny()), Times.Never()); Mocker.GetMock() .Verify(v => v.Update(It.IsAny()), Times.Never()); } [Test] public void should_not_update_if_media_info_disabled() { var movieFile = Builder.CreateNew() .With(v => v.RelativePath = "media.mkv") .Build(); Mocker.GetMock() .SetupGet(s => s.EnableMediaInfo) .Returns(false); GivenFileExists(); GivenSuccessfulScan(); Subject.Update(movieFile, _movie); Mocker.GetMock() .Verify(v => v.GetMediaInfo(It.IsAny()), Times.Never()); Mocker.GetMock() .Verify(v => v.Update(It.IsAny()), Times.Never()); } [Test] public void should_update_media_info() { var movieFile = Builder.CreateNew() .With(v => v.RelativePath = "media.mkv") .With(e => e.MediaInfo = new MediaInfoModel{SchemaRevision = 3}) .Build(); GivenFileExists(); GivenSuccessfulScan(); Subject.Update(movieFile, _movie); Mocker.GetMock() .Verify(v => v.GetMediaInfo(Path.Combine(_movie.Path, "media.mkv")), Times.Once()); Mocker.GetMock() .Verify(v => v.Update(movieFile), Times.Once()); } [Test] public void should_not_update_media_info_if_new_info_is_null() { var movieFile = Builder.CreateNew() .With(v => v.RelativePath = "media.mkv") .With(e => e.MediaInfo = new MediaInfoModel{SchemaRevision = 3}) .Build(); GivenFileExists(); GivenFailedScan(Path.Combine(_movie.Path, "media.mkv")); Subject.Update(movieFile, _movie); movieFile.MediaInfo.Should().NotBeNull(); } [Test] public void should_not_save_movie_file_if_new_info_is_null() { var movieFile = Builder.CreateNew() .With(v => v.RelativePath = "media.mkv") .With(e => e.MediaInfo = new MediaInfoModel{SchemaRevision = 3}) .Build(); GivenFileExists(); GivenFailedScan(Path.Combine(_movie.Path, "media.mkv")); Subject.Update(movieFile, _movie); Mocker.GetMock() .Verify(v => v.Update(movieFile), Times.Never()); } } }