Files
pos-system/services/iam-service-net/tests/IamService.UnitTests/Application/Commands/ChangePasswordCommandHandlerTests.cs
Ho Ngoc Hai bb4cf4884c feat(redis): Implement Redis caching and update configuration
- Added Redis caching support to the IAM service, including configuration settings in `appsettings.json` and environment variables.
- Introduced `ICacheService` interface for caching operations and implemented `RedisCacheService`.
- Updated documentation to include Redis setup instructions and usage examples for caching user data and token management.
- Enhanced user account management by adding an `Activate` method to the `ApplicationUser` class.
- Fixed assertions in unit tests to reflect the updated user status after activation.
2026-01-12 18:45:31 +07:00

91 lines
3.2 KiB
C#

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;
/// <summary>
/// EN: Unit tests for ChangePasswordCommandHandler.
/// VI: Unit tests cho ChangePasswordCommandHandler.
/// </summary>
public class ChangePasswordCommandHandlerTests
{
private readonly Mock<UserManager<ApplicationUser>> _userManagerMock;
private readonly Mock<ILogger<ChangePasswordCommandHandler>> _loggerMock;
private readonly ChangePasswordCommandHandler _handler;
public ChangePasswordCommandHandlerTests()
{
var store = new Mock<IUserStore<ApplicationUser>>();
_userManagerMock = new Mock<UserManager<ApplicationUser>>(
store.Object, null!, null!, null!, null!, null!, null!, null!, null!);
_loggerMock = new Mock<ILogger<ChangePasswordCommandHandler>>();
_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<DomainException>(() =>
_handler.Handle(command, CancellationToken.None));
}
[Fact]
public async Task Handle_WithWrongCurrentPassword_ShouldThrowException()
{
// 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 & Assert
await Assert.ThrowsAsync<InvalidOperationException>(() =>
_handler.Handle(command, CancellationToken.None));
}
}