using System; using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Common.Extensions; using NzbDrone.Core.Music; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.MusicTests.AlbumMonitoredServiceTests { [TestFixture] public class SetAlbumMontitoredFixture : CoreTest { private Artist _artist; private List _albums; [SetUp] public void Setup() { const int albums = 4; _artist = Builder.CreateNew() .Build(); _albums = Builder.CreateListOfSize(albums) .All() .With(e => e.Monitored = true) .With(e => e.ReleaseDate = DateTime.UtcNow.AddDays(-7)) // Future .TheFirst(1) .With(e => e.ReleaseDate = DateTime.UtcNow.AddDays(7)) // Future/TBA .TheNext(1) .With(e => e.ReleaseDate = null) .Build() .ToList(); Mocker.GetMock() .Setup(s => s.GetAlbumsByArtist(It.IsAny())) .Returns(_albums); Mocker.GetMock() .Setup(s => s.GetArtistAlbumsWithFiles(It.IsAny())) .Returns(new List()); Mocker.GetMock() .Setup(s => s.GetTracksByAlbum(It.IsAny())) .Returns(new List()); } [Test] public void should_be_able_to_monitor_artist_without_changing_albums() { Subject.SetAlbumMonitoredStatus(_artist, null); Mocker.GetMock() .Verify(v => v.UpdateArtist(It.IsAny(), It.IsAny()), Times.Once()); Mocker.GetMock() .Verify(v => v.UpdateMany(It.IsAny>()), Times.Never()); } [Test] public void should_be_able_to_monitor_albums_when_passed_in_artist() { var albumsToMonitor = new List { _albums.First().ForeignAlbumId }; Subject.SetAlbumMonitoredStatus(_artist, new MonitoringOptions { Monitored = true, AlbumsToMonitor = albumsToMonitor }); Mocker.GetMock() .Verify(v => v.UpdateArtist(It.IsAny(), It.IsAny()), Times.Once()); VerifyMonitored(e => e.ForeignAlbumId == _albums.First().ForeignAlbumId); VerifyNotMonitored(e => e.ForeignAlbumId != _albums.First().ForeignAlbumId); } [Test] public void should_be_able_to_monitor_all_albums() { Subject.SetAlbumMonitoredStatus(_artist, new MonitoringOptions { Monitor = MonitorTypes.All }); Mocker.GetMock() .Verify(v => v.UpdateMany(It.Is>(l => l.All(e => e.Monitored)))); } [Test] public void should_be_able_to_monitor_new_albums_only() { var monitoringOptions = new MonitoringOptions { Monitor = MonitorTypes.Future }; Subject.SetAlbumMonitoredStatus(_artist, monitoringOptions); VerifyMonitored(e => e.ReleaseDate.HasValue && e.ReleaseDate.Value.After(DateTime.UtcNow)); VerifyMonitored(e => !e.ReleaseDate.HasValue); VerifyNotMonitored(e => e.ReleaseDate.HasValue && e.ReleaseDate.Value.Before(DateTime.UtcNow)); } private void VerifyMonitored(Func predicate) { Mocker.GetMock() .Verify(v => v.UpdateMany(It.Is>(l => l.Where(predicate).All(e => e.Monitored)))); } private void VerifyNotMonitored(Func predicate) { Mocker.GetMock() .Verify(v => v.UpdateMany(It.Is>(l => l.Where(predicate).All(e => !e.Monitored)))); } } }