100 lines
3.2 KiB
C#
100 lines
3.2 KiB
C#
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<IUserRepository> _userRepo = new();
|
|
private readonly Mock<IJwtTokenService> _tokenService = new();
|
|
private readonly AuthService _sut;
|
|
private readonly PasswordHasher<User> _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<string>())).ReturnsAsync((User?)null);
|
|
|
|
var result = await _sut.LoginAsync(new LoginRequest("nobody", "pass"));
|
|
|
|
Assert.Null(result);
|
|
_tokenService.Verify(t => t.GenerateToken(It.IsAny<User>()), 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<User>()), 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<User>()), 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<string>())).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);
|
|
}
|
|
}
|