using System; using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Core.ImportLists; using NzbDrone.Core.Lifecycle; using NzbDrone.Core.Music; using NzbDrone.Core.Profiles.Metadata; using NzbDrone.Core.RootFolders; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.Profiles.Metadata { [TestFixture] public class MetadataProfileServiceFixture : CoreTest { [Test] public void init_should_add_default_profiles() { Subject.Handle(new ApplicationStartedEvent()); Mocker.GetMock() .Verify(v => v.Insert(It.IsAny()), Times.Exactly(2)); } [Test] // This confirms that new profiles are added only if no other profiles exists. // We don't want to keep adding them back if a user deleted them on purpose. public void Init_should_skip_if_any_profiles_already_exist() { Mocker.GetMock() .Setup(s => s.All()) .Returns(Builder.CreateListOfSize(2).Build().ToList()); Subject.Handle(new ApplicationStartedEvent()); Mocker.GetMock() .Verify(v => v.Insert(It.Is(x => x.Name == "Standard")), Times.Never()); } [Test] public void init_should_add_none_profile_if_it_doesnt_exist() { Mocker.GetMock() .Setup(s => s.All()) .Returns(Builder.CreateListOfSize(2).Build().ToList()); Subject.Handle(new ApplicationStartedEvent()); Mocker.GetMock() .Verify(v => v.Insert(It.Is(x => x.Name == "None")), Times.Once()); } [Test] public void init_should_move_existing_none_profile() { var profiles = Builder.CreateListOfSize(2) .TheFirst(1) .With(x => x.Name = MetadataProfileService.NONE_PROFILE_NAME) .With(x => x.PrimaryAlbumTypes = new List { new ProfilePrimaryAlbumTypeItem { PrimaryAlbumType = PrimaryAlbumType.Album, Allowed = true } }) .BuildList(); Mocker.GetMock() .Setup(s => s.All()) .Returns(profiles); Subject.Handle(new ApplicationStartedEvent()); Mocker.GetMock() .Verify(v => v.Update(It.Is(x => x.Id == profiles.First().Id && x.Name == "None.1")), Times.Once()); Mocker.GetMock() .Verify(v => v.Insert(It.Is(x => x.Name == "None")), Times.Once()); } [Test] public void should_not_be_able_to_edit_none_profile() { var profile = Builder.CreateNew() .With(p => p.Name = MetadataProfileService.NONE_PROFILE_NAME) .Build(); Assert.Throws(() => Subject.Update(profile)); } [Test] public void should_not_be_able_to_delete_none_profile() { var profile = Builder.CreateNew() .With(p => p.Name = MetadataProfileService.NONE_PROFILE_NAME) .Build(); Mocker.GetMock().Setup(c => c.Get(profile.Id)).Returns(profile); Assert.Throws(() => Subject.Delete(profile.Id)); } [Test] public void should_not_be_able_to_delete_profile_if_assigned_to_artist() { var profile = Builder.CreateNew() .With(p => p.Id = 2) .Build(); var artistList = Builder.CreateListOfSize(3) .Random(1) .With(c => c.MetadataProfileId = profile.Id) .Build().ToList(); var importLists = Builder.CreateListOfSize(2) .All() .With(c => c.MetadataProfileId = 1) .Build().ToList(); var rootFolders = Builder.CreateListOfSize(2) .All() .With(f => f.DefaultMetadataProfileId = 1) .BuildList(); Mocker.GetMock().Setup(c => c.GetAllArtists()).Returns(artistList); Mocker.GetMock().Setup(c => c.All()).Returns(importLists); Mocker.GetMock().Setup(c => c.All()).Returns(rootFolders); Mocker.GetMock().Setup(c => c.Get(profile.Id)).Returns(profile); Assert.Throws(() => Subject.Delete(profile.Id)); Mocker.GetMock().Verify(c => c.Delete(It.IsAny()), Times.Never()); } [Test] public void should_not_be_able_to_delete_profile_if_assigned_to_import_list() { var profile = Builder.CreateNew() .With(p => p.Id = 2) .Build(); var artistList = Builder.CreateListOfSize(3) .All() .With(c => c.MetadataProfileId = 1) .Build().ToList(); var importLists = Builder.CreateListOfSize(2) .Random(1) .With(c => c.MetadataProfileId = profile.Id) .Build().ToList(); var rootFolders = Builder.CreateListOfSize(2) .All() .With(f => f.DefaultMetadataProfileId = 1) .BuildList(); Mocker.GetMock().Setup(c => c.GetAllArtists()).Returns(artistList); Mocker.GetMock().Setup(c => c.All()).Returns(importLists); Mocker.GetMock().Setup(c => c.All()).Returns(rootFolders); Mocker.GetMock().Setup(c => c.Get(profile.Id)).Returns(profile); Assert.Throws(() => Subject.Delete(profile.Id)); Mocker.GetMock().Verify(c => c.Delete(It.IsAny()), Times.Never()); } [Test] public void should_not_be_able_to_delete_profile_if_assigned_to_root_folder() { var profile = Builder.CreateNew() .With(p => p.Id = 2) .Build(); var artistList = Builder.CreateListOfSize(3) .All() .With(c => c.MetadataProfileId = 1) .Build().ToList(); var importLists = Builder.CreateListOfSize(2) .All() .With(c => c.MetadataProfileId = 1) .Build().ToList(); var rootFolders = Builder.CreateListOfSize(2) .Random(1) .With(f => f.DefaultMetadataProfileId = profile.Id) .BuildList(); Mocker.GetMock().Setup(c => c.GetAllArtists()).Returns(artistList); Mocker.GetMock().Setup(c => c.All()).Returns(importLists); Mocker.GetMock().Setup(c => c.All()).Returns(rootFolders); Mocker.GetMock().Setup(c => c.Get(profile.Id)).Returns(profile); Assert.Throws(() => Subject.Delete(profile.Id)); Mocker.GetMock().Verify(c => c.Delete(It.IsAny()), Times.Never()); } [Test] public void should_delete_profile_if_not_assigned_to_artist_import_list_or_root_folder() { var profile = Builder.CreateNew() .With(p => p.Id = 1) .Build(); var artistList = Builder.CreateListOfSize(3) .All() .With(c => c.MetadataProfileId = 2) .Build().ToList(); var importLists = Builder.CreateListOfSize(2) .All() .With(c => c.MetadataProfileId = 2) .Build().ToList(); var rootFolders = Builder.CreateListOfSize(2) .All() .With(f => f.DefaultMetadataProfileId = 2) .BuildList(); Mocker.GetMock().Setup(c => c.GetAllArtists()).Returns(artistList); Mocker.GetMock().Setup(c => c.All()).Returns(importLists); Mocker.GetMock().Setup(c => c.All()).Returns(rootFolders); Mocker.GetMock().Setup(c => c.Get(profile.Id)).Returns(profile); Subject.Delete(1); Mocker.GetMock().Verify(c => c.Delete(1), Times.Once()); } } }