using GameAuthApi.Controllers; using GameAuthApi.Models; using GameAuthApi.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Text; public class AuthControllerTests { private static IConfiguration GetConfig() { var inMemory = new Dictionary { {"Jwt:Key", "testkeytestkeytestkey"}, {"Jwt:Issuer", "issuer"}, {"MongoDB:ConnectionString", "mongodb://localhost"}, {"MongoDB:DatabaseName", "test"} }; return new ConfigurationBuilder().AddInMemoryCollection(inMemory!).Build(); } [Fact] public async Task Register_UserExists_ReturnsBadRequest() { var mockUser = new Mock(GetConfig()); mockUser.Setup(u => u.GetByUsernameAsync("exists")).ReturnsAsync(new User()); var mockBlacklist = new Mock(GetConfig()); var controller = new AuthController(mockUser.Object, GetConfig(), mockBlacklist.Object); var result = await controller.Register(new RegisterRequest { Username = "exists", Password = "p" }); Assert.IsType(result); } [Fact] public async Task Login_InvalidPassword_ReturnsUnauthorized() { var user = new User { Username = "user", PasswordHash = BCrypt.Net.BCrypt.HashPassword("other") }; var mockUser = new Mock(GetConfig()); mockUser.Setup(u => u.GetByUsernameAsync("user")).ReturnsAsync(user); var controller = new AuthController(mockUser.Object, GetConfig(), new Mock(GetConfig()).Object); var result = await controller.Login(new LoginRequest { Username = "user", Password = "bad" }); Assert.IsType(result); } [Fact] public async Task Login_EmailIdentifier_ReturnsTokens() { var config = new ConfigurationBuilder().AddInMemoryCollection(new Dictionary { ["Jwt:Key"] = "abcdefghijklmnopqrstuvwxyz123456", ["Jwt:Issuer"] = "issuer", ["MongoDB:ConnectionString"] = "mongodb://localhost", ["MongoDB:DatabaseName"] = "test" }).Build(); var user = new User { Id = "507f1f77bcf86cd799439011", Username = "student", Email = "student@example.com", PasswordHash = BCrypt.Net.BCrypt.HashPassword("password123"), Role = "USER" }; var users = new Mock(config); users.Setup(x => x.GetByLoginAsync("student@example.com")).ReturnsAsync(user); users.Setup(x => x.UpdateAsync(user)).Returns(Task.CompletedTask); var controller = new AuthController(users.Object, config, new Mock(config).Object); var result = await controller.Login(new LoginRequest { Username = "student@example.com", Password = "password123" }); Assert.IsType(result); Assert.False(string.IsNullOrWhiteSpace(user.RefreshToken)); } [Fact] public async Task Register_DuplicateEmail_ReturnsBadRequest() { var config = GetConfig(); var users = new Mock(config); users.Setup(x => x.GetByLoginAsync("new_user")).ReturnsAsync((User?)null); users.Setup(x => x.GetByLoginAsync("used@example.com")).ReturnsAsync(new User()); var controller = new AuthController(users.Object, config, new Mock(config).Object); var result = await controller.Register(new RegisterRequest { Username = "new_user", Email = "used@example.com", Password = "password123" }); Assert.IsType(result); } [Fact] public async Task Refresh_InvalidToken_ReturnsUnauthorized() { var user = new User { Username = "user", RefreshToken = "r", RefreshTokenExpiry = DateTime.UtcNow.AddMinutes(-1) }; var mockUser = new Mock(GetConfig()); mockUser.Setup(u => u.GetByUsernameAsync("user")).ReturnsAsync(user); var controller = new AuthController(mockUser.Object, GetConfig(), new Mock(GetConfig()).Object); var result = await controller.Refresh(new AuthController.RefreshRequest { Username = "user", RefreshToken = "bad" }); Assert.IsType(result); } [Fact] public async Task Logout_BlacklistsToken() { var mockUser = new Mock(GetConfig()); var blacklist = new Mock(GetConfig()); blacklist.Setup(b => b.AddToBlacklistAsync(It.IsAny(), It.IsAny())).Returns(Task.CompletedTask).Verifiable(); var controller = new AuthController(mockUser.Object, GetConfig(), blacklist.Object); controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }; var tokenHandler = new JwtSecurityTokenHandler(); var keyString = "abcdefghijklmnopqrstuvwxyz123456"; var key = Encoding.UTF8.GetBytes(keyString); var token = tokenHandler.WriteToken(new JwtSecurityToken( "issuer", "issuer", null, expires: DateTime.UtcNow.AddMinutes(1), signingCredentials: new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256))); controller.Request.Headers["Authorization"] = $"Bearer {token}"; var result = await controller.Logout(); Assert.IsType(result); blacklist.Verify(); } [Fact] public async Task ChangeUserRole_InvalidRole_ReturnsBadRequest() { var svc = new Mock(GetConfig()); var controller = new AuthController(svc.Object, GetConfig(), new Mock(GetConfig()).Object); var result = await controller.ChangeUserRole(new ChangeRoleRequest { Username="u", NewRole="BAD" }); Assert.IsType(result); } [Fact] public async Task GetAllUsers_ReturnsOk() { var users = new List(); var svc = new Mock(GetConfig()); svc.Setup(s => s.GetAllAsync()).ReturnsAsync(users); var controller = new AuthController(svc.Object, GetConfig(), new Mock(GetConfig()).Object); var result = await controller.GetAllUsers(); var ok = Assert.IsType(result); Assert.Equal(users, ok.Value); } }