using Xunit;
using Moq;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using IamService.API.Application.Commands.Auth;
using IamService.Domain.AggregatesModel.UserAggregate;
using IamService.Domain.Exceptions;
namespace IamService.UnitTests.Application.Commands;
///
/// EN: Unit tests for ChangePasswordCommandHandler.
/// VI: Unit tests cho ChangePasswordCommandHandler.
///
public class ChangePasswordCommandHandlerTests
{
private readonly Mock> _userManagerMock;
private readonly Mock> _loggerMock;
private readonly ChangePasswordCommandHandler _handler;
public ChangePasswordCommandHandlerTests()
{
var store = new Mock>();
_userManagerMock = new Mock>(
store.Object, null!, null!, null!, null!, null!, null!, null!, null!);
_loggerMock = new Mock>();
_handler = new ChangePasswordCommandHandler(_userManagerMock.Object, _loggerMock.Object);
}
[Fact]
public async Task Handle_WithValidData_ShouldChangePassword()
{
// Arrange
var userId = Guid.NewGuid();
var user = new ApplicationUser("test@example.com", "John", "Doe");
var command = new ChangePasswordCommand(userId, "OldPassword123!", "NewPassword123!");
_userManagerMock
.Setup(x => x.FindByIdAsync(userId.ToString()))
.ReturnsAsync(user);
_userManagerMock
.Setup(x => x.ChangePasswordAsync(user, command.CurrentPassword, command.NewPassword))
.ReturnsAsync(IdentityResult.Success);
// Act
var result = await _handler.Handle(command, CancellationToken.None);
// Assert
Assert.True(result.Success);
}
[Fact]
public async Task Handle_WithInvalidUserId_ShouldThrowDomainException()
{
// Arrange
var userId = Guid.NewGuid();
var command = new ChangePasswordCommand(userId, "OldPassword123!", "NewPassword123!");
_userManagerMock
.Setup(x => x.FindByIdAsync(userId.ToString()))
.ReturnsAsync((ApplicationUser?)null);
// Act & Assert
await Assert.ThrowsAsync(() =>
_handler.Handle(command, CancellationToken.None));
}
[Fact]
public async Task Handle_WithWrongCurrentPassword_ShouldReturnFailure()
{
// Arrange
var userId = Guid.NewGuid();
var user = new ApplicationUser("test@example.com", "John", "Doe");
var command = new ChangePasswordCommand(userId, "WrongPassword!", "NewPassword123!");
_userManagerMock
.Setup(x => x.FindByIdAsync(userId.ToString()))
.ReturnsAsync(user);
_userManagerMock
.Setup(x => x.ChangePasswordAsync(user, command.CurrentPassword, command.NewPassword))
.ReturnsAsync(IdentityResult.Failed(
new IdentityError { Code = "PasswordMismatch", Description = "Incorrect password" }));
// Act
var result = await _handler.Handle(command, CancellationToken.None);
// Assert
Assert.False(result.Success);
Assert.Contains("Incorrect password", result.Message);
}
}