using Xunit; using Moq; using KArtSell.Modules.IdentityAccess.ManageIdentityAndRoles.Features.RegisterIdentity; namespace KArtSell.IdentityAccess.UnitTests.ManageIdentityAndRoles; public class RegisterIdentityHandlerTests { private readonly Mock _sqlMock; private readonly RegisterIdentityHandler _handler; public RegisterIdentityHandlerTests() { _sqlMock = new Mock(); _handler = new RegisterIdentityHandler(_sqlMock.Object); } [Fact] public async Task HandleAsync_ValidRequest_CreatesIdentity() { var request = new RegisterIdentityRequest { Email = "test@example.com", DisplayName = "Test User" }; var identityId = Guid.NewGuid(); _sqlMock.Setup(s => s.EmailExistsAsync("test@example.com", It.IsAny())) .ReturnsAsync(false); _sqlMock.Setup(s => s.CreateIdentityAsync(It.IsAny(), "test@example.com", "Test User", It.IsAny(), It.IsAny())) .ReturnsAsync(identityId); _sqlMock.Setup(s => s.GetIdentityAsync(identityId, It.IsAny())) .ReturnsAsync((identityId, "test@example.com", "Test User", Domain.IdentityState.Active)); var response = await _handler.HandleAsync(request, CancellationToken.None); Assert.NotNull(response); Assert.Equal(identityId, response.Id); Assert.Equal("test@example.com", response.Email); Assert.Equal(Domain.IdentityState.Active, response.State); } [Fact] public async Task HandleAsync_InvalidEmail_ThrowsValidationException() { var request = new RegisterIdentityRequest { Email = "invalid-email", DisplayName = "Test User" }; await Assert.ThrowsAsync(() => _handler.HandleAsync(request, CancellationToken.None)); } [Fact] public async Task HandleAsync_EmailExists_ThrowsValidationException() { var request = new RegisterIdentityRequest { Email = "existing@example.com", DisplayName = "Test User" }; _sqlMock.Setup(s => s.EmailExistsAsync("existing@example.com", It.IsAny())) .ReturnsAsync(true); await Assert.ThrowsAsync(() => _handler.HandleAsync(request, CancellationToken.None)); } [Fact] public async Task HandleAsync_EmptyDisplayName_ThrowsValidationException() { var request = new RegisterIdentityRequest { Email = "test@example.com", DisplayName = "" }; await Assert.ThrowsAsync(() => _handler.HandleAsync(request, CancellationToken.None)); } }