From a941f3c7128668f0bed60ea86ab3a47e9428f38b Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 1 May 2018 15:43:47 -0700 Subject: [PATCH] Add some more functional tests (Cookies/PathSelection/DynamicSchemes) (#42) * Add some cookie tests * Add more functional tests Cookes + PathSchemeSelection + DynamicScheme tests --- samples/DynamicSchemes/DynamicSchemes.csproj | 1 - .../CookiesTests.cs | 60 +++++++++++++++-- .../DynamicSchemeTests.cs | 65 ++++++++++++++++++- .../PathSchemeSelectionTests.cs | 58 ++++++++++++++++- .../AuthSamples.FunctionalTests/TestAssert.cs | 4 +- 5 files changed, 174 insertions(+), 14 deletions(-) diff --git a/samples/DynamicSchemes/DynamicSchemes.csproj b/samples/DynamicSchemes/DynamicSchemes.csproj index e2868a989a..0b5ce2d0a2 100644 --- a/samples/DynamicSchemes/DynamicSchemes.csproj +++ b/samples/DynamicSchemes/DynamicSchemes.csproj @@ -14,7 +14,6 @@ - diff --git a/test/AuthSamples.FunctionalTests/CookiesTests.cs b/test/AuthSamples.FunctionalTests/CookiesTests.cs index c8e9dd93a6..decee7a8fb 100644 --- a/test/AuthSamples.FunctionalTests/CookiesTests.cs +++ b/test/AuthSamples.FunctionalTests/CookiesTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Threading.Tasks; @@ -12,9 +13,7 @@ namespace AuthSamples.FunctionalTests public class CookiesTests : IClassFixture> { public CookiesTests(WebApplicationFactory fixture) - { - Client = fixture.CreateDefaultClient(); - } + => Client = fixture.CreateClient(); public HttpClient Client { get; } @@ -37,8 +36,59 @@ namespace AuthSamples.FunctionalTests var content = await response.Content.ReadAsStringAsync(); // Assert - Assert.Equal(HttpStatusCode.Redirect, response.StatusCode); - Assert.Equal("http://localhost/account/login?ReturnUrl=%2FHome%2FMyClaims", response.Headers.Location.ToString()); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("http://localhost/account/login?ReturnUrl=%2FHome%2FMyClaims", response.RequestMessage.RequestUri.ToString()); + } + + [Fact] + public async Task MyClaimsShowsClaimsWhenLoggedIn() + { + // Arrange & Act & Assert + await SignIn("Dude"); + await CheckMyClaims("Dude"); + } + + [Fact] + public async Task LogoutClearsCookie() + { + // Arrange & Act + await SignIn("Dude"); + await CheckMyClaims("Dude"); + + var response = await Client.GetAsync("/Account/Logout"); + var content = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + response = await Client.GetAsync("/Home/MyClaims"); + content = await response.Content.ReadAsStringAsync(); + + // Assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Contains("Log in", content); + } + + internal async Task CheckMyClaims(string userName) + { + var response = await Client.GetAsync("/Home/MyClaims"); + var content = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Contains("

HttpContext.User.Claims

", content); + Assert.Contains($"
{userName}
", content); // Ensure user name shows up as a claim + } + + internal async Task SignIn(string userName) + { + var goToSignIn = await Client.GetAsync("/account/login"); + var signIn = await TestAssert.IsHtmlDocumentAsync(goToSignIn); + + var form = TestAssert.HasForm(signIn); + await Client.SendAsync(form, new Dictionary() + { + ["username"] = userName, + ["password"] = userName // this test doesn't care what the password is + }); + + Assert.Equal(HttpStatusCode.OK, signIn.StatusCode); } } } diff --git a/test/AuthSamples.FunctionalTests/DynamicSchemeTests.cs b/test/AuthSamples.FunctionalTests/DynamicSchemeTests.cs index 6b36267df5..e4ffcdd783 100644 --- a/test/AuthSamples.FunctionalTests/DynamicSchemeTests.cs +++ b/test/AuthSamples.FunctionalTests/DynamicSchemeTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Threading.Tasks; @@ -13,7 +14,7 @@ namespace AuthSamples.FunctionalTests { public DynamicSchemeTests(WebApplicationFactory fixture) { - Client = fixture.CreateDefaultClient(); + Client = fixture.CreateClient(); } public HttpClient Client { get; } @@ -29,6 +30,66 @@ namespace AuthSamples.FunctionalTests Assert.Equal(HttpStatusCode.OK, response.StatusCode); } - // TODO: add tests verifying add works, remove works + [Fact] + public async Task CanAddUpdateRemoveSchemes() + { + // Arrange & Act + var response = await AddScheme("New1", "NewOne"); + var content = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Contains("New1", content); + Assert.Contains("NewOne", content); + + response = await AddScheme("New2", "NewTwo"); + content = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Contains("New1", content); + Assert.Contains("NewOne", content); + Assert.Contains("New2", content); + Assert.Contains("NewTwo", content); + + response = await AddScheme("New2", "UpdateTwo"); + content = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Contains("New1", content); + Assert.Contains("NewOne", content); + Assert.Contains("New2", content); + Assert.DoesNotContain("NewTwo", content); + Assert.Contains("UpdateTwo", content); + + // Now remove all the schemes one at a time + response = await Client.GetAsync("/Auth/Remove?scheme=New1"); + content = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.DoesNotContain("New1", content); + Assert.DoesNotContain("NewOne", content); + Assert.Contains("New2", content); + Assert.DoesNotContain("NewTwo", content); + Assert.Contains("UpdateTwo", content); + + response = await Client.GetAsync("/Auth/Remove?scheme=New2"); + content = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.DoesNotContain("New1", content); + Assert.DoesNotContain("NewOne", content); + Assert.DoesNotContain("New2", content); + Assert.DoesNotContain("NewTwo", content); + Assert.DoesNotContain("UpdateTwo", content); + } + + private async Task AddScheme(string name, string message) + { + var goToSignIn = await Client.GetAsync("/"); + var signIn = await TestAssert.IsHtmlDocumentAsync(goToSignIn); + + var form = TestAssert.HasForm(signIn); + return await Client.SendAsync(form, new Dictionary() + { + ["scheme"] = name, + ["OptionsMessage"] = message, + }); + + } + } } diff --git a/test/AuthSamples.FunctionalTests/PathSchemeSelectionTests.cs b/test/AuthSamples.FunctionalTests/PathSchemeSelectionTests.cs index 9a3246575e..fb9e871dc8 100644 --- a/test/AuthSamples.FunctionalTests/PathSchemeSelectionTests.cs +++ b/test/AuthSamples.FunctionalTests/PathSchemeSelectionTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Threading.Tasks; @@ -13,7 +14,7 @@ namespace AuthSamples.FunctionalTests { public PathSchemeSelectionTests(WebApplicationFactory fixture) { - Client = fixture.CreateDefaultClient(); + Client = fixture.CreateClient(); } public HttpClient Client { get; } @@ -40,6 +41,7 @@ namespace AuthSamples.FunctionalTests Assert.Equal(HttpStatusCode.OK, response.StatusCode); } + [Fact] public async Task MyClaimsRedirectsToLoginPageWhenNotLoggedIn() { @@ -48,8 +50,8 @@ namespace AuthSamples.FunctionalTests var content = await response.Content.ReadAsStringAsync(); // Assert - Assert.Equal(HttpStatusCode.Redirect, response.StatusCode); - Assert.Equal("http://localhost/account/login?ReturnUrl=%2FHome%2FMyClaims", response.Headers.Location.ToString()); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("http://localhost/account/login?ReturnUrl=%2FHome%2FMyClaims", response.RequestMessage.RequestUri.ToString()); } [Fact] @@ -65,5 +67,55 @@ namespace AuthSamples.FunctionalTests Assert.Contains("Hao", content); // expected name claim } + [Fact] + public async Task MyClaimsShowsClaimsWhenLoggedIn() + { + // Arrange & Act + await SignIn("Dude"); + await CheckMyClaims("Dude"); + } + + [Fact] + public async Task LogoutClearsCookie() + { + // Arrange & Act + await SignIn("Dude"); + await CheckMyClaims("Dude"); + + var response = await Client.GetAsync("/Account/Logout"); + var content = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + response = await Client.GetAsync("/Home/MyClaims"); + content = await response.Content.ReadAsStringAsync(); + + // Assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.DoesNotContain("Logout", content); + } + + internal async Task CheckMyClaims(string userName) + { + var response = await Client.GetAsync("/Home/MyClaims"); + var content = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Contains("

HttpContext.User.Claims (Scheme: Cookies)

", content); + Assert.Contains($"
{userName}
", content); // Ensure user name shows up as a claim + } + + internal async Task SignIn(string userName) + { + var goToSignIn = await Client.GetAsync("/account/login"); + var signIn = await TestAssert.IsHtmlDocumentAsync(goToSignIn); + + var form = TestAssert.HasForm(signIn); + await Client.SendAsync(form, new Dictionary() + { + ["username"] = userName, + ["password"] = userName // this test doesn't care what the password is + }); + + Assert.Equal(HttpStatusCode.OK, signIn.StatusCode); + } } } diff --git a/test/AuthSamples.FunctionalTests/TestAssert.cs b/test/AuthSamples.FunctionalTests/TestAssert.cs index 6e884e3d69..bd8e3e73b8 100644 --- a/test/AuthSamples.FunctionalTests/TestAssert.cs +++ b/test/AuthSamples.FunctionalTests/TestAssert.cs @@ -104,8 +104,6 @@ namespace AuthSamples.FunctionalTests } internal static void IsOK(HttpResponseMessage download) - { - Assert.Equal(HttpStatusCode.OK, download.StatusCode); - } + => Assert.Equal(HttpStatusCode.OK, download.StatusCode); } }