using Distribution.Features.Auth; using Distribution.Features.User; using Distribution.Infra.Authorization; using Distribution.Models; using Microsoft.AspNetCore.Identity; using Moq; using Xunit; namespace Distribution.Tests.Services; public class AuthServiceTests { private readonly Mock _userRepo = new(); private readonly Mock _tokenService = new(); private readonly AuthService _sut; private readonly PasswordHasher _hasher = new(); public AuthServiceTests() { _sut = new AuthService(_userRepo.Object, _tokenService.Object); } private User ActiveUserWithPassword(string password) => new() { Id = Guid.NewGuid(), Username = "testuser", FullName = "Test User", IsActive = true, FK_RoleId = Guid.NewGuid(), PasswordHash = _hasher.HashPassword(null!, password), Role = new Role { Name = "Sales", Level = 10 } }; // LoginAsync [Fact] public async Task LoginAsync_ReturnsNull_WhenUserNotFound() { _userRepo.Setup(r => r.GetByUsernameAsync(It.IsAny())).ReturnsAsync((User?)null); var result = await _sut.LoginAsync(new LoginRequest("nobody", "pass")); Assert.Null(result); _tokenService.Verify(t => t.GenerateToken(It.IsAny()), Times.Never); } [Fact] public async Task LoginAsync_ReturnsNull_WhenUserIsInactive() { var user = ActiveUserWithPassword("secret"); user.IsActive = false; _userRepo.Setup(r => r.GetByUsernameAsync("testuser")).ReturnsAsync(user); var result = await _sut.LoginAsync(new LoginRequest("testuser", "secret")); Assert.Null(result); _tokenService.Verify(t => t.GenerateToken(It.IsAny()), Times.Never); } [Fact] public async Task LoginAsync_ReturnsNull_WhenPasswordIsWrong() { var user = ActiveUserWithPassword("correct"); _userRepo.Setup(r => r.GetByUsernameAsync("testuser")).ReturnsAsync(user); var result = await _sut.LoginAsync(new LoginRequest("testuser", "wrong")); Assert.Null(result); _tokenService.Verify(t => t.GenerateToken(It.IsAny()), Times.Never); } [Fact] public async Task LoginAsync_ReturnsLoginResponse_WhenCredentialsAreValid() { var user = ActiveUserWithPassword("secret"); _userRepo.Setup(r => r.GetByUsernameAsync("testuser")).ReturnsAsync(user); _tokenService.Setup(t => t.GenerateToken(user)).Returns("jwt-token"); var result = await _sut.LoginAsync(new LoginRequest("testuser", "secret")); Assert.NotNull(result); Assert.Equal("jwt-token", result.Token); Assert.Equal(user.Id, result.UserId); Assert.Equal("testuser", result.Username); Assert.Equal("Sales", result.RoleName); } [Fact] public async Task LoginAsync_CallsGenerateToken_OnSuccess() { var user = ActiveUserWithPassword("pass"); _userRepo.Setup(r => r.GetByUsernameAsync(It.IsAny())).ReturnsAsync(user); _tokenService.Setup(t => t.GenerateToken(user)).Returns("token"); await _sut.LoginAsync(new LoginRequest("testuser", "pass")); _tokenService.Verify(t => t.GenerateToken(user), Times.Once); } }