#region Copyright // /************************************************************************ // Copyright (c) 2016 Jamie Rees // File: PlexAvailabilityCheckerTests.cs // Created By: Jamie Rees // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // ************************************************************************/ #endregion using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; using Moq; using NUnit.Framework; using PlexRequests.Api.Interfaces; using PlexRequests.Api.Models.Plex; using PlexRequests.Core; using PlexRequests.Core.SettingModels; using PlexRequests.Services.Interfaces; using PlexRequests.Helpers; using PlexRequests.Services.Jobs; using PlexRequests.Services.Models; using PlexRequests.Services.Notification; using PlexRequests.Store.Models; using PlexRequests.Store.Repository; using Ploeh.AutoFixture; namespace PlexRequests.Services.Tests { [TestFixture] public class PlexAvailabilityCheckerTests { public IAvailabilityChecker Checker { get; set; } private Fixture F { get; set; } = new Fixture(); private Mock> SettingsMock { get; set; } private Mock> AuthMock { get; set; } private Mock RequestMock { get; set; } private Mock PlexMock { get; set; } private Mock CacheMock { get; set; } private Mock NotificationMock { get; set; } private Mock JobRec { get; set; } private Mock> NotifyUsers { get; set; } private Mock> PlexEpisodes { get; set; } private Mock Engine { get; set; } [SetUp] public void Setup() { SettingsMock = new Mock>(); AuthMock = new Mock>(); RequestMock = new Mock(); PlexMock = new Mock(); NotificationMock = new Mock(); CacheMock = new Mock(); NotifyUsers = new Mock>(); PlexEpisodes = new Mock>(); JobRec = new Mock(); Engine = new Mock(); Checker = new PlexAvailabilityChecker(SettingsMock.Object, RequestMock.Object, PlexMock.Object, CacheMock.Object, NotificationMock.Object, JobRec.Object, NotifyUsers.Object, PlexEpisodes.Object, Engine.Object); } [Test] public void InvalidSettings() { Checker.CheckAndUpdateAll(); PlexMock.Verify(x => x.GetLibrary(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); PlexMock.Verify(x => x.GetAccount(It.IsAny()), Times.Never); PlexMock.Verify(x => x.GetLibrarySections(It.IsAny(), It.IsAny()), Times.Never); PlexMock.Verify(x => x.GetStatus(It.IsAny(), It.IsAny()), Times.Never); PlexMock.Verify(x => x.GetUsers(It.IsAny()), Times.Never); } [TestCaseSource(nameof(IsMovieAvailableTestData))] public bool IsMovieAvailableTest(string title, string year) { var movies = new List { new PlexMovie {Title = title, ProviderId = null, ReleaseYear = year} }; var result = Checker.IsMovieAvailable(movies.ToArray(), "title", "2011"); return result; } private static IEnumerable IsMovieAvailableTestData { get { yield return new TestCaseData("title", "2011").Returns(true).SetName("IsMovieAvailable True"); yield return new TestCaseData("title2", "2011").Returns(false).SetName("IsMovieAvailable False different title"); yield return new TestCaseData("title", "2001").Returns(false).SetName("IsMovieAvailable False different year"); } } [TestCaseSource(nameof(IsMovieAvailableAdvancedTestData))] public bool IsMovieAvailableAdvancedTest(string title, string year, string providerId) { var movies = new List { new PlexMovie {Title = title, ProviderId = providerId, ReleaseYear = year } }; var result = Checker.IsMovieAvailable(movies.ToArray(), "title", "2011", 9999.ToString()); return result; } private static IEnumerable IsMovieAvailableAdvancedTestData { get { yield return new TestCaseData("title", "2011", "9999").Returns(true).SetName("Advanced IsMovieAvailable True"); yield return new TestCaseData("title2", "2011", "99929").Returns(false).SetName("Advanced IsMovieAvailable False different title"); yield return new TestCaseData("title", "2001", "99939").Returns(false).SetName("Advanced IsMovieAvailable False different year"); yield return new TestCaseData("title", "2001", "44445").Returns(false).SetName("Advanced IsMovieAvailable False different providerID"); } } [TestCaseSource(nameof(IsTvAvailableTestData))] public bool IsTvAvailableTest(string title, string year) { var tv = new List { new PlexTvShow {Title = title, ProviderId = null, ReleaseYear = year} }; var result = Checker.IsTvShowAvailable(tv.ToArray(), "title", "2011"); return result; } private static IEnumerable IsTvAvailableTestData { get { yield return new TestCaseData("title", "2011").Returns(true).SetName("IsTvAvailable True"); yield return new TestCaseData("title2", "2011").Returns(false).SetName("IsTvAvailable False different title"); yield return new TestCaseData("title", "2001").Returns(false).SetName("IsTvAvailable False different year"); } } [TestCaseSource(nameof(IsTvAvailableAdvancedTestData))] public bool IsTvAvailableAdvancedTest(string title, string year, string providerId) { var movies = new List { new PlexTvShow {Title = title, ProviderId = providerId, ReleaseYear = year } }; var result = Checker.IsTvShowAvailable(movies.ToArray(), "title", "2011", 9999.ToString()); return result; } private static IEnumerable IsTvAvailableAdvancedTestData { get { yield return new TestCaseData("title", "2011", "9999").Returns(true).SetName("Advanced IsTvAvailable True"); yield return new TestCaseData("title2", "2011", "99929").Returns(false).SetName("Advanced IsTvAvailable False different title"); yield return new TestCaseData("title", "2001", "99939").Returns(false).SetName("Advanced IsTvAvailable False different year"); yield return new TestCaseData("title", "2001", "44445").Returns(false).SetName("Advanced IsTvAvailable False different providerID"); } } [TestCaseSource(nameof(IsTvAvailableAdvancedSeasonsTestData))] public bool IsTvAvailableAdvancedSeasonsTest(string title, string year, string providerId, int[] seasons) { var movies = new List { new PlexTvShow {Title = title, ProviderId = providerId, ReleaseYear = year , Seasons = seasons} }; var result = Checker.IsTvShowAvailable(movies.ToArray(), "title", "2011", 9999.ToString(), new[] { 1, 2, 3 }); return result; } private static IEnumerable IsTvAvailableAdvancedSeasonsTestData { get { yield return new TestCaseData("title", "2011", "9999", new[] { 1, 2, 3 }).Returns(true).SetName("Advanced IsTvSeasonsAvailable True"); yield return new TestCaseData("title2", "2011", "99929", new[] { 5, 6 }).Returns(false).SetName("Advanced IsTvSeasonsAvailable False no seasons"); yield return new TestCaseData("title2", "2011", "9999", new[] { 1, 6 }).Returns(true).SetName("Advanced IsTvSeasonsAvailable true one season"); } } [TestCaseSource(nameof(IsEpisodeAvailableTestData))] public bool IsEpisodeAvailableTest(string providerId, int season, int episode) { var expected = new List { new PlexEpisodes {EpisodeNumber = 1, ShowTitle = "The Flash",ProviderId = 23.ToString(), SeasonNumber = 1, EpisodeTitle = "Pilot"} }; PlexEpisodes.Setup(x => x.Custom(It.IsAny>>())).Returns(expected); var result = Checker.IsEpisodeAvailable(providerId, season, episode); return result; } private static IEnumerable IsEpisodeAvailableTestData { get { yield return new TestCaseData("23", 1, 1).Returns(true).SetName("IsEpisodeAvailable True S01E01"); yield return new TestCaseData("23", 1, 2).Returns(false).SetName("IsEpisodeAvailable False S01E02"); yield return new TestCaseData("23", 99, 99).Returns(false).SetName("IsEpisodeAvailable False S99E99"); yield return new TestCaseData("230", 99, 99).Returns(false).SetName("IsEpisodeAvailable False Incorrect ProviderId"); } } [Test] public void GetPlexMoviesTests() { var cachedMovies = F.Build().Without(x => x.Directory).CreateMany().ToList(); cachedMovies.Add(new PlexSearch { Video = new List