From ca8b9f20f11f7400e6b13ee1372c768caee2250c Mon Sep 17 00:00:00 2001 From: tidusjar Date: Tue, 15 Mar 2016 13:00:54 +0000 Subject: [PATCH] Added more tests --- PlexRequests.UI.Tests/AdminModuleTests.cs | 236 ++++++++++++++++++++-- PlexRequests.UI/Modules/AdminModule.cs | 49 +++-- 2 files changed, 245 insertions(+), 40 deletions(-) diff --git a/PlexRequests.UI.Tests/AdminModuleTests.cs b/PlexRequests.UI.Tests/AdminModuleTests.cs index e95bde6ce..41e915069 100644 --- a/PlexRequests.UI.Tests/AdminModuleTests.cs +++ b/PlexRequests.UI.Tests/AdminModuleTests.cs @@ -36,7 +36,6 @@ using Newtonsoft.Json; using NUnit.Framework; using PlexRequests.Api.Interfaces; -using PlexRequests.Api.Models; using PlexRequests.Api.Models.Plex; using PlexRequests.Core; using PlexRequests.Core.SettingModels; @@ -48,57 +47,254 @@ namespace PlexRequests.UI.Tests [TestFixture] public class AdminModuleTests { + private Mock> PlexRequestMock { get; set; } + private Mock> CpMock { get; set; } private Mock> AuthMock { get; set; } + private Mock> PlexSettingsMock { get; set; } + private Mock> SonarrSettingsMock { get; set; } + private Mock> EmailMock { get; set; } private Mock PlexMock { get; set; } + private Mock SonarrApiMock { get; set; } + + private ConfigurableBootstrapper Bootstrapper { get; set; } [SetUp] public void Setup() { AuthMock = new Mock>(); + var expectedSettings = new AuthenticationSettings { UserAuthentication = false, PlexAuthToken = "abc" }; + AuthMock.Setup(x => x.GetSettings()).Returns(expectedSettings); + PlexMock = new Mock(); - } + PlexMock.Setup(x => x.SignIn("Username1", "Password1")) + .Returns(new PlexAuthentication { user = new User { authentication_token = "abc", username = "Username1" } }); - [Test] - [Ignore("Need to finish")] - public void RequestAuthTokenTest() - { - var expectedSettings = new AuthenticationSettings {UserAuthentication = false, PlexAuthToken = "abc"}; - AuthMock.Setup(x => x.GetSettings()).Returns(expectedSettings); + PlexRequestMock = new Mock>(); + CpMock = new Mock>(); + PlexSettingsMock = new Mock>(); + SonarrApiMock = new Mock(); + SonarrSettingsMock = new Mock>(); + EmailMock = new Mock>(); - var bootstrapper = new ConfigurableBootstrapper(with => + Bootstrapper = new ConfigurableBootstrapper(with => { - with.Module(); + with.Module(); with.Dependency(AuthMock.Object); + with.Dependency(PlexRequestMock.Object); + with.Dependency(CpMock.Object); + with.Dependency(PlexSettingsMock.Object); + with.Dependency(SonarrApiMock.Object); + with.Dependency(SonarrSettingsMock.Object); with.Dependency(PlexMock.Object); + with.Dependency(EmailMock.Object); with.RootPathProvider(); with.RequestStartup((container, pipelines, context) => { - context.CurrentUser = new UserIdentity { UserName = "user"}; + context.CurrentUser = new UserIdentity { UserName = "user" }; }); }); - bootstrapper.WithSession(new Dictionary()); + Bootstrapper.WithSession(new Dictionary()); + } + + [Test] + public void RequestAuthTokenTestNewSettings() + { + var browser = new Browser(Bootstrapper); - var browser = new Browser(bootstrapper); - var result = browser.Post("/admin/requestauth", with => { with.HttpRequest(); with.Header("Accept", "application/json"); - with.FormValue("username", "abc"); - with.FormValue("password","pass"); - + with.FormValue("username", "Username1"); + with.FormValue("password", "Password1"); + }); Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); - Assert.That(result.Context.Request.Session[SessionKeys.UsernameKey], Is.EqualTo("abc")); var body = JsonConvert.DeserializeObject(result.Body.AsString()); Assert.That(body.Result, Is.EqualTo(true)); + PlexMock.Verify(x => x.SignIn("Username1", "Password1"), Times.Once); AuthMock.Verify(x => x.GetSettings(), Times.Once); - PlexMock.Verify(x => x.SignIn(It.IsAny(), It.IsAny()), Times.Never); - PlexMock.Verify(x => x.GetUsers(It.IsAny()), Times.Never); + AuthMock.Verify(x => x.SaveSettings(It.IsAny()), Times.Once); + } + + [Test] + public void RequestAuthTokenTestEmptyCredentials() + { + var browser = new Browser(Bootstrapper); + + var result = browser.Post("/admin/requestauth", with => + { + with.HttpRequest(); + with.Header("Accept", "application/json"); + with.FormValue("username", string.Empty); + with.FormValue("password", "Password1"); + + }); + + Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); + + var body = JsonConvert.DeserializeObject(result.Body.AsString()); + Assert.That(body.Result, Is.EqualTo(false)); + Assert.That(body.Message, Is.Not.Empty); + + PlexMock.Verify(x => x.SignIn("Username1", "Password1"), Times.Never); + AuthMock.Verify(x => x.GetSettings(), Times.Never); + AuthMock.Verify(x => x.SaveSettings(It.IsAny()), Times.Never); + } + + [Test] + public void RequestAuthTokenTesPlexSignInFail() + { + var browser = new Browser(Bootstrapper); + + var result = browser.Post("/admin/requestauth", with => + { + with.HttpRequest(); + with.Header("Accept", "application/json"); + with.FormValue("username", "Badusername"); + with.FormValue("password", "Password1"); + + }); + + Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); + + var body = JsonConvert.DeserializeObject(result.Body.AsString()); + Assert.That(body.Result, Is.EqualTo(false)); + Assert.That(body.Message, Is.Not.Empty); + + PlexMock.Verify(x => x.SignIn("Badusername", "Password1"), Times.Once); + AuthMock.Verify(x => x.GetSettings(), Times.Never); + AuthMock.Verify(x => x.SaveSettings(It.IsAny()), Times.Never); } + [Test] + public void RequestAuthTokenTestExistingSettings() + { + AuthMock.Setup(x => x.GetSettings()).Returns(() => null); + var browser = new Browser(Bootstrapper); + + var result = browser.Post("/admin/requestauth", with => + { + with.HttpRequest(); + with.Header("Accept", "application/json"); + with.FormValue("username", "Username1"); + with.FormValue("password", "Password1"); + + }); + + Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); + + var body = JsonConvert.DeserializeObject(result.Body.AsString()); + Assert.That(body.Result, Is.EqualTo(true)); + + PlexMock.Verify(x => x.SignIn("Username1", "Password1"), Times.Once); + AuthMock.Verify(x => x.GetSettings(), Times.Once); + AuthMock.Verify(x => x.SaveSettings(It.IsAny()), Times.Once); + } + + [Test] + public void GetUsersSuccessfully() + { + var users = new PlexFriends { User = new[] { new UserFriends { Username = "abc2" }, } }; + PlexMock.Setup(x => x.GetUsers(It.IsAny())).Returns(users); + var browser = new Browser(Bootstrapper); + + var result = browser.Get("/admin/getusers", with => + { + with.HttpRequest(); + with.Header("Accept", "application/json"); + with.FormValue("username", "Username1"); + with.FormValue("password", "Password1"); + + }); + + Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); + + var body = result.Body.AsString(); + Assert.That(body, Is.Not.Null); + Assert.That(body, Contains.Substring("abc2")); + + PlexMock.Verify(x => x.GetUsers(It.IsAny()), Times.Once); + AuthMock.Verify(x => x.GetSettings(), Times.Once); + } + + [Test] + public void GetUsersReturnsNoUsers() + { + var users = new PlexFriends(); + PlexMock.Setup(x => x.GetUsers(It.IsAny())).Returns(users); + var browser = new Browser(Bootstrapper); + + var result = browser.Get("/admin/getusers", with => + { + with.HttpRequest(); + with.Header("Accept", "application/json"); + with.FormValue("username", "Username1"); + with.FormValue("password", "Password1"); + + }); + + Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); + + var body = JsonConvert.DeserializeObject(result.Body.AsString()); + Assert.That(body, Is.Not.Null); + Assert.That(string.IsNullOrWhiteSpace(body), Is.True); + + PlexMock.Verify(x => x.GetUsers(It.IsAny()), Times.Once); + AuthMock.Verify(x => x.GetSettings(), Times.Once); + } + + [Test] + public void GetUsersReturnsNull() + { + PlexMock.Setup(x => x.GetUsers(It.IsAny())).Returns(() => null); + var browser = new Browser(Bootstrapper); + + var result = browser.Get("/admin/getusers", with => + { + with.HttpRequest(); + with.Header("Accept", "application/json"); + with.FormValue("username", "Username1"); + with.FormValue("password", "Password1"); + + }); + + Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); + + var body = JsonConvert.DeserializeObject(result.Body.AsString()); + Assert.That(body, Is.Not.Null); + Assert.That(string.IsNullOrWhiteSpace(body), Is.True); + + PlexMock.Verify(x => x.GetUsers(It.IsAny()), Times.Once); + AuthMock.Verify(x => x.GetSettings(), Times.Once); + } + + [Test] + public void GetUsersTokenIsNull() + { + AuthMock.Setup(x => x.GetSettings()).Returns(new AuthenticationSettings()); + var browser = new Browser(Bootstrapper); + + var result = browser.Get("/admin/getusers", with => + { + with.HttpRequest(); + with.Header("Accept", "application/json"); + with.FormValue("username", "Username1"); + with.FormValue("password", "Password1"); + + }); + + Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); + + var body = JsonConvert.DeserializeObject(result.Body.AsString()); + Assert.That(body, Is.Not.Null); + Assert.That(string.IsNullOrWhiteSpace(body), Is.True); + + PlexMock.Verify(x => x.GetUsers(It.IsAny()), Times.Never); + AuthMock.Verify(x => x.GetSettings(), Times.Once); + } } } \ No newline at end of file diff --git a/PlexRequests.UI/Modules/AdminModule.cs b/PlexRequests.UI/Modules/AdminModule.cs index 7ac0bba95..52c67eb08 100644 --- a/PlexRequests.UI/Modules/AdminModule.cs +++ b/PlexRequests.UI/Modules/AdminModule.cs @@ -35,7 +35,6 @@ using Nancy.Security; using NLog; -using PlexRequests.Api; using PlexRequests.Api.Interfaces; using PlexRequests.Core; using PlexRequests.Core.SettingModels; @@ -46,22 +45,24 @@ namespace PlexRequests.UI.Modules { public class AdminModule : NancyModule { - private ISettingsService RpService { get; set; } - private ISettingsService CpService { get; set; } - private ISettingsService AuthService { get; set; } - private ISettingsService PlexService { get; set; } - private ISettingsService SonarrService { get; set; } - private ISettingsService EmailService { get; set; } - private ISonarrApi SonarrApi { get; set; } + private ISettingsService RpService { get; } + private ISettingsService CpService { get; } + private ISettingsService AuthService { get; } + private ISettingsService PlexService { get; } + private ISettingsService SonarrService { get; } + private ISettingsService EmailService { get; } + private IPlexApi PlexApi { get; } + private ISonarrApi SonarrApi { get; } private static Logger Log = LogManager.GetCurrentClassLogger(); public AdminModule(ISettingsService rpService, ISettingsService cpService, - ISettingsService auth - , ISettingsService plex, + ISettingsService auth, + ISettingsService plex, ISettingsService sonarr, ISonarrApi sonarrApi, - ISettingsService email) : base("admin") + ISettingsService email, + IPlexApi plexApi) : base("admin") { RpService = rpService; CpService = cpService; @@ -70,6 +71,7 @@ namespace PlexRequests.UI.Modules SonarrService = sonarr; SonarrApi = sonarrApi; EmailService = email; + PlexApi = plexApi; #if !DEBUG this.RequiresAuthentication(); @@ -124,7 +126,7 @@ namespace PlexRequests.UI.Modules var settings = RpService.GetSettings(); Log.Trace("Getting Settings:"); Log.Trace(settings.DumpJson()); - + return View["Settings", settings]; } @@ -147,10 +149,9 @@ namespace PlexRequests.UI.Modules return Response.AsJson(new { Result = false, Message = "Please provide a valid username and password" }); } - var plex = new PlexApi(); - var model = plex.SignIn(user.username, user.password); + var model = PlexApi.SignIn(user.username, user.password); - if (model.user == null) + if (model?.user == null) { return Response.AsJson(new { Result = false, Message = "Incorrect username or password!" }); } @@ -176,15 +177,23 @@ namespace PlexRequests.UI.Modules private Response GetUsers() { - var token = AuthService.GetSettings().PlexAuthToken; + var settings = AuthService.GetSettings(); + + var token = settings?.PlexAuthToken; if (token == null) { return Response.AsJson(string.Empty); } - var api = new PlexApi(); - var users = api.GetUsers(token); + + var users = PlexApi.GetUsers(token); if (users == null) - { return Response.AsJson(string.Empty); } + { + return Response.AsJson(string.Empty); + } + if (users.User == null || users.User?.Length == 0) + { + return Response.AsJson(string.Empty); + } var usernames = users.User.Select(x => x.Username); return Response.AsJson(usernames); @@ -251,7 +260,7 @@ namespace PlexRequests.UI.Modules private Negotiator EmailNotifications() { var settings = EmailService.GetSettings(); - return View["EmailNotifications",settings]; + return View["EmailNotifications", settings]; } private Response SaveEmailNotifications()