namespace RpgRoller.Tests; public sealed class ServiceAuthTests { [Fact] public void Register_ValidatesRequiredFieldsAndDuplicates() { using var harness = ServiceTestSupport.CreateHarness(); var service = harness.Service; var invalidUsername = service.Register(new RegisterCommand("", "Password123", "Display")); var invalidDisplay = service.Register(new RegisterCommand("user", "Password123", "")); var invalidPassword = service.Register(new RegisterCommand("user", "short", "Display")); var valid = service.Register(new RegisterCommand("user", "Password123", "Display")); var duplicate = service.Register(new RegisterCommand("user", "Password123", "Display 2")); Assert.False(invalidUsername.Succeeded); Assert.False(invalidDisplay.Succeeded); Assert.False(invalidPassword.Succeeded); Assert.True(valid.Succeeded); Assert.False(duplicate.Succeeded); } [Fact] public void Login_ValidatesCredentialsAndSessionLookup() { using var harness = ServiceTestSupport.CreateHarness(); var service = harness.Service; service.Register(new RegisterCommand("user", "Password123", "Display")); var invalidUser = service.Login(new LoginCommand("missing", "Password123")); var invalidPassword = service.Login(new LoginCommand("user", "bad-password")); var valid = service.Login(new LoginCommand("user", "Password123")); Assert.False(invalidUser.Succeeded); Assert.False(invalidPassword.Succeeded); Assert.True(valid.Succeeded); var sessionUser = service.GetUserBySession(valid.Value.SessionToken); Assert.NotNull(sessionUser); service.Logout(valid.Value.SessionToken); Assert.Null(service.GetUserBySession(valid.Value.SessionToken)); } [Fact] public void Login_RehashesPasswordWhenHasherRequestsIt() { var hasher = new ServiceTestSupport.RehashingPasswordHasher(); using var harness = ServiceTestSupport.CreateHarness(hasher); var service = harness.Service; service.Register(new RegisterCommand("user", "Password123", "Display")); var login = service.Login(new LoginCommand("user", "Password123")); Assert.True(login.Succeeded); Assert.Equal(2, hasher.HashCalls); } }