test project created
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user