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("", "Password123", "Display"); var invalidDisplay = service.Register("user", "Password123", ""); var invalidPassword = service.Register("user", "short", "Display"); var valid = service.Register("user", "Password123", "Display"); var duplicate = service.Register("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("user", "Password123", "Display"); var invalidUser = service.Login("missing", "Password123"); var invalidPassword = service.Login("user", "bad-password"); var valid = service.Login("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("user", "Password123", "Display"); var login = service.Login("user", "Password123"); Assert.True(login.Succeeded); Assert.Equal(2, hasher.HashCalls); } [Fact] public void GetUsernames_RequiresAuthAndReturnsSortedUsernames() { using var harness = ServiceTestSupport.CreateHarness(); var service = harness.Service; service.Register("zoe", "Password123", "Zoe"); service.Register("amy", "Password123", "Amy"); service.Register("bob", "Password123", "Bob"); var unauthorized = service.GetUsernames(string.Empty); Assert.False(unauthorized.Succeeded); var session = ServiceTestSupport.GetValue(service.Login("bob", "Password123")).SessionToken; var usernames = ServiceTestSupport.GetValue(service.GetUsernames(session)); Assert.Equal(["amy", "bob", "zoe"], usernames); } [Fact] public void UpdateThemePreference_RequiresAuthAndPersistsSupportedTheme() { using var harness = ServiceTestSupport.CreateHarness(); var service = harness.Service; service.Register("theme-user", "Password123", "Theme User"); var session = ServiceTestSupport.GetValue(service.Login("theme-user", "Password123")).SessionToken; var unauthorized = service.UpdateThemePreference(string.Empty, "dark"); var invalid = service.UpdateThemePreference(session, "sepia"); var updated = service.UpdateThemePreference(session, "DARK"); Assert.False(unauthorized.Succeeded); Assert.False(invalid.Succeeded); Assert.True(updated.Succeeded); Assert.Equal("dark", ServiceTestSupport.GetValue(updated).ThemePreference); var me = ServiceTestSupport.GetValue(service.GetMe(session)); Assert.Equal("dark", me.User.ThemePreference); } }