Add versioned legal consent to authentication
Deploy Promiscuity Auth API / deploy (push) Successful in 1m29s
k8s smoke test / test (push) Successful in 20s

This commit is contained in:
2026-07-20 02:16:02 -05:00
parent 4121c59484
commit 94ffe6e7b7
9 changed files with 189 additions and 9 deletions
@@ -0,0 +1,61 @@
using AuthApi.Models;
using AuthApi.Services;
using Microsoft.Extensions.Configuration;
using Xunit;
namespace AuthApi.Tests;
public sealed class LegalPolicyTests
{
private static LegalPolicy Policy(string version = "2026-07-20") => new(
new ConfigurationBuilder().AddInMemoryCollection(new Dictionary<string, string?>
{
["Legal:TermsVersion"] = version,
["Legal:PrivacyVersion"] = version,
["Legal:EffectiveUtc"] = "2026-07-20T00:00:00Z"
}).Build());
[Fact]
public void ExistingUserWithoutAcceptanceRequiresAgreement()
{
Assert.True(Policy().Status(new User()).RequiresLegalAcceptance);
}
[Fact]
public void AcceptRecordsVersionsTimestampAndSource()
{
var user = new User();
var acceptedUtc = new DateTime(2026, 7, 20, 12, 0, 0, DateTimeKind.Utc);
Policy().Accept(user, "password_registration", acceptedUtc);
Assert.Equal("2026-07-20", user.TermsAcceptedVersion);
Assert.Equal("2026-07-20", user.PrivacyAcceptedVersion);
Assert.Equal(acceptedUtc, user.LegalAcceptedUtc);
var acceptance = Assert.Single(user.LegalAcceptances);
Assert.Equal("password_registration", acceptance.Source);
}
[Fact]
public void AcceptIsIdempotentForCurrentVersions()
{
var user = new User();
var policy = Policy();
var first = new DateTime(2026, 7, 20, 12, 0, 0, DateTimeKind.Utc);
policy.Accept(user, "registration", first);
policy.Accept(user, "prompt", first.AddHours(1));
Assert.Single(user.LegalAcceptances);
Assert.Equal(first, user.LegalAcceptedUtc);
}
[Fact]
public void NewPolicyVersionRequiresAcceptanceAgain()
{
var user = new User();
Policy().Accept(user, "registration");
Assert.True(Policy("2026-08-01").Status(user).RequiresLegalAcceptance);
}
}