using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using FluentAssertions; using NUnit.Framework; using NzbDrone.Common.Serializer; using NzbDrone.Core.Datastore.Migration; using NzbDrone.Core.Languages; using NzbDrone.Core.Movies; using NzbDrone.Core.Profiles; using NzbDrone.Core.Qualities; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.Datastore.Migration { [TestFixture] public class fix_invalid_profile_referencesFixture : MigrationTest { private void AddDefaultProfile(fix_invalid_profile_references m, string name, int profileId) { var allowed = new Quality[] { Quality.WEBDL720p }; var items = Quality.DefaultQualityDefinitions .OrderBy(v => v.Weight) .Select(v => new { Quality = (int)v.Quality, Allowed = allowed.Contains(v.Quality) }) .ToList(); var profile = new { Id = profileId, Name = name, FormatItems = new List().ToJson(), Cutoff = (int)Quality.WEBDL720p, Items = items.ToJson(), Language = (int)Language.English, MinFormatScore = 0, CutoffFormatScore = 0 }; m.Insert.IntoTable("Profiles").Row(profile); } private void AddMovie(fix_invalid_profile_references m, string movieTitle, int tmdbId, int profileId) { var movie = new { Id = tmdbId, Monitored = true, Title = movieTitle, CleanTitle = movieTitle, Status = (int)MovieStatusType.Announced, MinimumAvailability = (int)MovieStatusType.Announced, Images = new[] { new { CoverType = "Poster" } }.ToJson(), Recommendations = new[] { 1 }.ToJson(), HasPreDBEntry = false, Runtime = 90, OriginalLanguage = 1, ProfileId = profileId, MovieFileId = 1, Path = string.Format("/Movies/{0}", movieTitle), TitleSlug = movieTitle, TmdbId = tmdbId }; m.Insert.IntoTable("Movies").Row(movie); } private void AddCustomFormat(fix_invalid_profile_references c, int id, string name) { var customFormat = new { Id = id, Name = name, Specifications = "[]" }; c.Insert.IntoTable("CustomFormats").Row(customFormat); } [Test] public void should_add_default_profiles_if_none_exist_but_movies_exist() { var profileId = 18; var db = WithMigrationTestDb(c => { AddMovie(c, "movie", 123456, profileId); }); var items = db.Query("SELECT \"Id\", \"ProfileId\" FROM \"Movies\""); var profiles = db.Query("SELECT \"Id\" FROM \"Profiles\""); items.Should().HaveCount(1); profiles.Should().HaveCount(6); items.First().ProfileId.Should().BeOneOf(profiles.Select(p => p.Id)); } [Test] public void should_not_add_default_profiles_if_one_exist() { var profileId = 18; var db = WithMigrationTestDb(c => { AddDefaultProfile(c, "My Custom Profile", profileId); AddMovie(c, "movie", 123456, 17); }); var items = db.Query("SELECT \"Id\", \"ProfileId\" FROM \"Movies\""); var profiles = db.Query("SELECT \"Id\" FROM \"Profiles\""); items.Should().HaveCount(1); profiles.Should().HaveCount(1); items.First().ProfileId.Should().BeOneOf(profiles.Select(p => p.Id)); } [Test] public void should_add_custom_formats_to_default_profiles_if_some_exist() { var profileId = 18; var formatId = 3; var db = WithMigrationTestDb(c => { AddCustomFormat(c, formatId, "SomeFormat"); AddMovie(c, "movie", 123456, profileId); }); var items = db.Query("SELECT \"Id\", \"ProfileId\" FROM \"Movies\""); var profiles = db.Query("SELECT \"Id\", \"FormatItems\" FROM \"Profiles\""); items.Should().HaveCount(1); profiles.Should().HaveCount(6); profiles.First().FormatItems.Should().HaveCount(1); profiles.First().FormatItems.First().Format.Should().Be(formatId); items.First().ProfileId.Should().BeOneOf(profiles.Select(p => p.Id)); } [Test] public void should_not_change_movies_with_valid_profile() { var profileId = 2; var db = WithMigrationTestDb(c => { AddDefaultProfile(c, "My Custom Profile", profileId); AddMovie(c, "movie", 123456, profileId); }); var items = db.Query("SELECT \"Id\", \"ProfileId\" FROM \"Movies\""); items.Should().HaveCount(1); items.First().ProfileId.Should().Be(profileId); } [Test] public void should_change_movies_with_bad_profile_id() { var profileId = 2; var db = WithMigrationTestDb(c => { AddDefaultProfile(c, "My Custom Profile", profileId); AddMovie(c, "movie", 123456, 1); }); var items = db.Query("SELECT \"Id\", \"ProfileId\" FROM \"Movies\""); items.Should().HaveCount(1); items.First().ProfileId.Should().Be(profileId); } [Test] public void should_change_to_most_common_valid_profile_in_library() { var commonProfileId = 2; var otherProfileId = 3; var db = WithMigrationTestDb(c => { AddDefaultProfile(c, "My Custom Profile", commonProfileId); AddDefaultProfile(c, "My Custom Profile 2", otherProfileId); AddMovie(c, "movie1", 123451, 1); AddMovie(c, "movie2", 123452, 1); AddMovie(c, "movie3", 123453, 1); AddMovie(c, "movie4", 123454, 1); AddMovie(c, "movie5", 123455, commonProfileId); AddMovie(c, "movie6", 123456, commonProfileId); AddMovie(c, "movie7", 123457, commonProfileId); AddMovie(c, "movie8", 123458, otherProfileId); AddMovie(c, "movie9", 123459, otherProfileId); }); var items = db.Query("SELECT \"Id\", \"ProfileId\" FROM \"Movies\""); items.Should().HaveCount(9); items.Where(x => x.ProfileId == commonProfileId).Should().HaveCount(7); } } public class Movie179 { public int Id { get; set; } public int ProfileId { get; set; } } public class Profile179 { public int Id { get; set; } public List FormatItems { get; set; } } public class ProfileFormatItem179 { public int Id { get; set; } public int Format { get; set; } public int Score { get; set; } } }