using System.Security.Claims; using GameList.Domain; using GameList.Infrastructure; using GameList.Tests.Support; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.Extensions.DependencyInjection.Extensions; namespace GameList.Tests; public class IdentityTests { [Fact] public async Task Sign_in_sets_claims_and_cookie() { using var factory = new TestWebApplicationFactory(); var ctx = BuildAuthContext(factory.Services); var player = new Player { Id = Guid.NewGuid(), Username = "claimuser", NormalizedUsername = "claimuser", PasswordHash = new byte[] { 1 }, PasswordSalt = new byte[] { 1 }, DisplayName = "Claim", IsAdmin = true }; await PlayerIdentityExtensions.SignInPlayerAsync(ctx, player); var cookies = ctx.Response.Headers["Set-Cookie"]; Assert.NotNull(cookies); Assert.Contains(cookies!, v => v.Contains(PlayerIdentityExtensions.PlayerCookieName)); } [Fact] public async Task Sign_out_clears_principal() { using var factory = new TestWebApplicationFactory(); var ctx = BuildAuthContext(factory.Services); var player = new Player(); await PlayerIdentityExtensions.SignInPlayerAsync(ctx, player); await PlayerIdentityExtensions.SignOutPlayerAsync(ctx); Assert.False(ctx.User.Identity?.IsAuthenticated ?? false); } private static DefaultHttpContext BuildAuthContext(IServiceProvider services) { var serviceCollection = new ServiceCollection(); serviceCollection.AddSingleton(); serviceCollection.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Name = PlayerIdentityExtensions.PlayerCookieName; }); serviceCollection.AddLogging(); var provider = serviceCollection.BuildServiceProvider(); return new DefaultHttpContext { RequestServices = provider, Response = { Body = new MemoryStream() } }; } }