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);
}
}