From 759540c8372dc4be176bdaacb7f0c641a30899eb Mon Sep 17 00:00:00 2001 From: tidusjar Date: Wed, 9 Mar 2016 12:59:07 +0000 Subject: [PATCH] Added user logout method and unit tests to cover it --- PlexRequests.UI.Tests/UserLoginModuleTests.cs | 24 +++++++++++++++++++ PlexRequests.UI/Modules/LoginModule.cs | 11 ++++++--- PlexRequests.UI/Modules/UserLoginModule.cs | 11 +++++++++ PlexRequests.UI/Views/Shared/_Layout.cshtml | 11 ++++++--- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/PlexRequests.UI.Tests/UserLoginModuleTests.cs b/PlexRequests.UI.Tests/UserLoginModuleTests.cs index 06e115eb9..444f679be 100644 --- a/PlexRequests.UI.Tests/UserLoginModuleTests.cs +++ b/PlexRequests.UI.Tests/UserLoginModuleTests.cs @@ -330,5 +330,29 @@ namespace PlexRequests.UI.Tests PlexMock.Verify(x => x.SignIn(It.IsAny(), It.IsAny()), Times.Never); PlexMock.Verify(x => x.GetUsers(It.IsAny()), Times.Never); } + + [Test] + public void Logout() + { + var bootstrapper = new ConfigurableBootstrapper(with => + { + with.Module(); + with.Dependency(AuthMock.Object); + with.Dependency(PlexMock.Object); + with.RootPathProvider(); + }); + + bootstrapper.WithSession(new Dictionary { {SessionKeys.UsernameKey, "abc"} }); + + var browser = new Browser(bootstrapper); + var result = browser.Get("/userlogin/logout", with => + { + with.HttpRequest(); + with.Header("Accept", "application/json"); + }); + + Assert.That(HttpStatusCode.SeeOther, Is.EqualTo(result.StatusCode)); + Assert.That(result.Context.Request.Session[SessionKeys.UsernameKey], Is.Null); + } } } \ No newline at end of file diff --git a/PlexRequests.UI/Modules/LoginModule.cs b/PlexRequests.UI/Modules/LoginModule.cs index 692daa0fb..65af53578 100644 --- a/PlexRequests.UI/Modules/LoginModule.cs +++ b/PlexRequests.UI/Modules/LoginModule.cs @@ -32,10 +32,11 @@ using Nancy.Authentication.Forms; using Nancy.Extensions; using PlexRequests.Core; +using PlexRequests.UI.Models; namespace PlexRequests.UI.Modules { - public class LoginModule : BaseModule + public class LoginModule : NancyModule { public LoginModule() { @@ -54,17 +55,21 @@ namespace PlexRequests.UI.Modules Post["/login"] = x => { - var userId = UserMapper.ValidateUser((string)Request.Form.Username, (string)Request.Form.Password); + var username = (string)Request.Form.Username; + var password = (string)Request.Form.Password; + + var userId = UserMapper.ValidateUser(username, password); if (userId == null) { - return Context.GetRedirect("~/login?error=true&username=" + (string)Request.Form.Username); + return Context.GetRedirect("~/login?error=true&username=" + username); } DateTime? expiry = null; if (Request.Form.RememberMe.HasValue) { expiry = DateTime.Now.AddDays(7); } + Session[SessionKeys.UsernameKey] = username; return this.LoginAndRedirect(userId.Value, expiry); }; diff --git a/PlexRequests.UI/Modules/UserLoginModule.cs b/PlexRequests.UI/Modules/UserLoginModule.cs index 1f342a570..fba37f859 100644 --- a/PlexRequests.UI/Modules/UserLoginModule.cs +++ b/PlexRequests.UI/Modules/UserLoginModule.cs @@ -27,6 +27,7 @@ using System.Linq; using Nancy; +using Nancy.Extensions; using Nancy.Responses.Negotiation; using PlexRequests.Api.Interfaces; @@ -46,6 +47,7 @@ namespace PlexRequests.UI.Modules Api = api; Get["/"] = _ => Index(); Post["/"] = x => LoginUser(); + Get["/logout"] = x => Logout(); } private ISettingsService AuthService { get; } @@ -104,6 +106,15 @@ namespace PlexRequests.UI.Modules : new JsonResponseModel { Result = false, Message = "Incorrect User or Password"}); } + private Response Logout() + { + if (Session[SessionKeys.UsernameKey] != null) + { + Session.Delete(SessionKeys.UsernameKey); + } + return Context.GetRedirect("~/userlogin"); + } + private bool CheckIfUserIsInPlexFriends(string username, string authToken) { var users = Api.GetUsers(authToken); diff --git a/PlexRequests.UI/Views/Shared/_Layout.cshtml b/PlexRequests.UI/Views/Shared/_Layout.cshtml index ba80e6c3f..58a4d0baa 100644 --- a/PlexRequests.UI/Views/Shared/_Layout.cshtml +++ b/PlexRequests.UI/Views/Shared/_Layout.cshtml @@ -1,4 +1,6 @@ @using Nancy.Security +@using Nancy.Session +@using PlexRequests.UI.Models @inherits Nancy.ViewEngines.Razor.NancyRazorViewBase @@ -42,13 +44,16 @@