diff --git a/CleanArchitecture.Api/Controllers/UserController.cs b/CleanArchitecture.Api/Controllers/UserController.cs index aa66217..3aac047 100644 --- a/CleanArchitecture.Api/Controllers/UserController.cs +++ b/CleanArchitecture.Api/Controllers/UserController.cs @@ -56,7 +56,6 @@ public sealed class UserController : ApiController } [HttpPost] - [AllowAnonymous] [SwaggerOperation("Create a new user")] [SwaggerResponse(200, "Request successful", typeof(ResponseMessage))] public async Task CreateUserAsync([FromBody] CreateUserViewModel viewModel) diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandHandlerTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandHandlerTests.cs index 0151fd4..0f0e7d6 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandHandlerTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandHandlerTests.cs @@ -1,7 +1,9 @@ using System; using CleanArchitecture.Domain.Commands.Users.CreateUser; +using CleanArchitecture.Domain.Enums; using CleanArchitecture.Domain.Errors; using CleanArchitecture.Domain.Events.User; +using NSubstitute; using Xunit; namespace CleanArchitecture.Domain.Tests.CommandHandler.User.CreateUser; @@ -13,7 +15,6 @@ public sealed class CreateUserCommandHandlerTests [Fact] public void Should_Create_User() { - // Todo: Fix tests _fixture.SetupCurrentUser(); var user = _fixture.SetupUser(); @@ -60,6 +61,41 @@ public sealed class CreateUserCommandHandlerTests DomainErrorCodes.User.UserAlreadyExists, $"There is already a user with Id {command.UserId}"); } + + [Fact] + public void Should_Not_Create_Already_Existing_Email() + { + _fixture.SetupCurrentUser(); + + _fixture.UserRepository + .GetByEmailAsync(Arg.Is(y => y == "test@email.com")) + .Returns(new Entities.User( + Guid.NewGuid(), + Guid.NewGuid(), + "max@mustermann.com", + "Max", + "Mustermann", + "Password", + UserRole.User)); + + var command = new CreateUserCommand( + Guid.NewGuid(), + Guid.NewGuid(), + "test@email.com", + "Test", + "Email", + "Po=PF]PC6t.?8?ks)A6W"); + + _fixture.CommandHandler.Handle(command, default).Wait(); + + _fixture + .VerifyNoCommit() + .VerifyNoRaisedEvent() + .VerifyAnyDomainNotification() + .VerifyExistingNotification( + DomainErrorCodes.User.UserAlreadyExists, + $"There is already a user with email {command.Email}"); + } [Fact] public void Should_Not_Create_User_Tenant_Does_Not_Exist() diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandTestFixture.cs b/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandTestFixture.cs index 812257f..3cf3a09 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandTestFixture.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandTestFixture.cs @@ -1,7 +1,6 @@ using System; using CleanArchitecture.Domain.Commands.Users.CreateUser; using CleanArchitecture.Domain.Enums; -using CleanArchitecture.Domain.Interfaces; using CleanArchitecture.Domain.Interfaces.Repositories; using NSubstitute; @@ -10,15 +9,13 @@ namespace CleanArchitecture.Domain.Tests.CommandHandler.User.CreateUser; public sealed class CreateUserCommandTestFixture : CommandHandlerFixtureBase { public CreateUserCommandHandler CommandHandler { get; } - private IUserRepository UserRepository { get; } + public IUserRepository UserRepository { get; } private ITenantRepository TenantRepository { get; } - private IUser User { get; } public CreateUserCommandTestFixture() { UserRepository = Substitute.For(); TenantRepository = Substitute.For(); - User = Substitute.For(); CommandHandler = new CreateUserCommandHandler( Bus, diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandHandlerTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandHandlerTests.cs index 1e65782..95d2569 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandHandlerTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandHandlerTests.cs @@ -42,4 +42,24 @@ public sealed class DeleteUserCommandHandlerTests ErrorCodes.ObjectNotFound, $"There is no user with Id {command.UserId}"); } + + [Fact] + public void Should_Not_Delete_User_Insufficient_Permissions() + { + var user = _fixture.SetupUser(); + + _fixture.SetupCurrentUser(); + + var command = new DeleteUserCommand(user.Id); + + _fixture.CommandHandler.Handle(command, default).Wait(); + + _fixture + .VerifyNoCommit() + .VerifyNoRaisedEvent() + .VerifyAnyDomainNotification() + .VerifyExistingNotification( + ErrorCodes.InsufficientPermissions, + $"No permission to delete user {command.UserId}"); + } } \ No newline at end of file diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandTestFixture.cs b/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandTestFixture.cs index 96f7d5d..bdd73f9 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandTestFixture.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandTestFixture.cs @@ -40,4 +40,9 @@ public sealed class DeleteUserCommandTestFixture : CommandHandlerFixtureBase return user; } + + public void SetupCurrentUser() + { + User.GetUserRole().Returns(UserRole.User); + } } \ No newline at end of file diff --git a/CleanArchitecture.IntegrationTests/Infrastructure/CleanArchitectureWebApplicationFactory.cs b/CleanArchitecture.IntegrationTests/Infrastructure/CleanArchitectureWebApplicationFactory.cs index 6328d21..da21af7 100644 --- a/CleanArchitecture.IntegrationTests/Infrastructure/CleanArchitectureWebApplicationFactory.cs +++ b/CleanArchitecture.IntegrationTests/Infrastructure/CleanArchitectureWebApplicationFactory.cs @@ -57,7 +57,7 @@ public sealed class CleanArchitectureWebApplicationFactory : WebApplicationFacto { options.DefaultAuthenticateScheme = "Testing"; options.DefaultChallengeScheme = "Testing"; - }).AddTestAuthentication(options => { }); + }).AddTestAuthentication(_ => { }); } var sp = services.BuildServiceProvider();