test(backend): add auth token and security policy tests

This commit is contained in:
Rafał Tyński
2026-10-04 02:12:00 +02:00
parent dcaa1a77db
commit c163db3029
2 changed files with 97 additions and 0 deletions
@@ -0,0 +1,34 @@
using TarninaHub.Application.Security;
using TarninaHub.Infrastructure.Auth;
namespace TarninaHub.Tests.Auth;
public class SecurityConstantsTests
{
[Theory]
[InlineData("user", true)]
[InlineData("jst", true)]
[InlineData("operator", true)]
[InlineData("manager", true)]
[InlineData("admin", true)]
[InlineData("guest", false)]
public void RoleNames_IsValid_RecognizesKnownRoles(string role, bool expected)
{
Assert.Equal(expected, RoleNames.IsValid(role));
}
[Fact]
public void AuthSettings_HasUsableSigningKey_RequiresAtLeast32Chars()
{
Assert.False(new AuthSettings { SigningKey = "short" }.HasUsableSigningKey);
Assert.True(new AuthSettings { SigningKey = new string('k', 32) }.HasUsableSigningKey);
}
[Fact]
public void ConsentScopes_ContainsExpectedLevels()
{
Assert.Contains(ConsentScopes.ByConsent, ConsentScopes.All);
Assert.Contains(ConsentScopes.Temporary, ConsentScopes.All);
Assert.Contains(ConsentScopes.Anonymized, ConsentScopes.All);
}
}
@@ -0,0 +1,63 @@
using System.IdentityModel.Tokens.Jwt;
using System.Text;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using TarninaHub.Application.Models;
using TarninaHub.Infrastructure.Auth;
namespace TarninaHub.Tests.Auth;
public class TokenServiceTests
{
private static AuthSettings CreateSettings() => new()
{
Issuer = "tarninahub",
Audience = "tarninahub",
SigningKey = new string('k', 40),
TokenLifetimeMinutes = 30,
};
[Fact]
public void CreateToken_IncludesSubjectAndRole()
{
var service = new TokenService(Options.Create(CreateSettings()));
var user = new UserAccount("user:ania", "+48000000001", "ania@example.test", "user", null);
var result = service.CreateToken(user);
var jwt = new JwtSecurityTokenHandler().ReadJwtToken(result.AccessToken);
Assert.Equal("user:ania", jwt.Claims.Single(claim => claim.Type == "sub").Value);
Assert.Equal("user", jwt.Claims.Single(claim => claim.Type == "role").Value);
Assert.Equal("tarninahub", jwt.Issuer);
Assert.True(result.ExpiresAt > DateTimeOffset.UtcNow);
}
[Fact]
public void CreateToken_IsValidatedByTheSameSigningKey()
{
var settings = CreateSettings();
var service = new TokenService(Options.Create(settings));
var user = new UserAccount("user:jst", "+48000000010", null, "jst", "organization:mops_krakow");
var result = service.CreateToken(user);
var parameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = settings.Issuer,
ValidateAudience = true,
ValidAudience = settings.Audience,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(settings.SigningKey)),
ValidateLifetime = true,
RoleClaimType = "role",
NameClaimType = "sub",
};
var handler = new JwtSecurityTokenHandler { MapInboundClaims = false };
var principal = handler.ValidateToken(result.AccessToken, parameters, out _);
Assert.Equal("jst", principal.FindFirst("role")?.Value);
Assert.Equal("user:jst", principal.FindFirst("sub")?.Value);
}
}