using System.IdentityModel.Tokens.Jwt;
using System.Net.Http.Json;
using System.Security.Claims;
namespace ColaFlow.Modules.Identity.IntegrationTests.Infrastructure;
///
/// Helper class for authentication-related test operations
/// Provides utilities for registration, login, token parsing, and common test scenarios
///
public static class TestAuthHelper
{
///
/// Register a new tenant and return the access token and refresh token
///
public static async Task<(string accessToken, string refreshToken)> RegisterAndGetTokensAsync(
HttpClient client,
string? tenantSlug = null,
string? email = null,
string? password = null)
{
var slug = tenantSlug ?? $"test-{Guid.NewGuid():N}";
var adminEmail = email ?? $"admin-{Guid.NewGuid():N}@test.com";
var adminPassword = password ?? "Admin@1234";
var request = new
{
tenantName = "Test Corp",
tenantSlug = slug,
subscriptionPlan = "Professional",
adminEmail,
adminPassword,
adminFullName = "Test Admin"
};
var response = await client.PostAsJsonAsync("/api/tenants/register", request);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync();
return (result!.AccessToken, result.RefreshToken);
}
///
/// Login with credentials and return tokens
///
public static async Task<(string accessToken, string refreshToken)> LoginAndGetTokensAsync(
HttpClient client,
string tenantSlug,
string email,
string password)
{
var request = new
{
tenantSlug,
email,
password
};
var response = await client.PostAsJsonAsync("/api/auth/login", request);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync();
return (result!.AccessToken, result.RefreshToken);
}
///
/// Parse JWT token and extract claims
///
public static IEnumerable ParseJwtToken(string token)
{
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadJwtToken(token);
return jwtToken.Claims;
}
///
/// Get specific claim value from token
///
public static string? GetClaimValue(string token, string claimType)
{
var claims = ParseJwtToken(token);
return claims.FirstOrDefault(c => c.Type == claimType)?.Value;
}
///
/// Verify token contains expected role
///
public static bool HasRole(string token, string role)
{
var claims = ParseJwtToken(token);
return claims.Any(c => c.Type == "role" && c.Value == role) ||
claims.Any(c => c.Type == "tenant_role" && c.Value == role);
}
}
// Response DTOs
public record RegisterResponse(string AccessToken, string RefreshToken);
public record LoginResponse(string AccessToken, string RefreshToken);
public record RefreshResponse(string AccessToken, string RefreshToken);
public record UserInfoResponse(
string UserId,
string TenantId,
string Email,
string FullName,
string TenantSlug,
string TenantRole);