From 305e6320f0efc69ac7e9a170cd9d7f44cadb5477 Mon Sep 17 00:00:00 2001 From: alex289 Date: Tue, 7 Mar 2023 23:26:33 +0100 Subject: [PATCH] Add query handler tests --- .gitignore | 1 + ...CleanArchitecture.Application.Tests.csproj | 2 ++ .../Queries/Users/GetAllUsersTestFixture.cs | 21 +++++++++++ .../Queries/Users/GetUserByIdTestFixture.cs | 23 ++++++++++-- .../Users/GetAllUsersQueryHandlerTests.cs | 20 ++++++++++- .../Users/GetUserByIdQueryHandlerTests.cs | 35 +++++++++++++++++++ .../GetUserById/GetUserByIdQueryHandler.cs | 3 +- 7 files changed, 100 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 47d875a..0899f53 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ riderModule.iml /_ReSharper.Caches/ .idea .vs +CleanArchitecture.sln.DotSettings.user diff --git a/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj b/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj index 0b18234..129ebce 100644 --- a/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj +++ b/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj @@ -9,7 +9,9 @@ + + diff --git a/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetAllUsersTestFixture.cs b/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetAllUsersTestFixture.cs index a9b9e5d..0d0d27f 100644 --- a/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetAllUsersTestFixture.cs +++ b/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetAllUsersTestFixture.cs @@ -1,5 +1,7 @@ using CleanArchitecture.Application.Queries.Users.GetAll; +using CleanArchitecture.Domain.Entities; using CleanArchitecture.Domain.Interfaces.Repositories; +using MockQueryable.Moq; using Moq; namespace CleanArchitecture.Application.Tests.Fixtures.Queries.Users; @@ -8,11 +10,30 @@ public sealed class GetAllUsersTestFixture : QueryHandlerBaseFixture { public Mock UserRepository { get; } public GetAllUsersQueryHandler Handler { get; } + public Guid ExistingUserId { get; } = Guid.NewGuid(); public GetAllUsersTestFixture() { UserRepository = new(); + + SetupUserRepositoryGetAllAsync(); Handler = new(UserRepository.Object); } + + private void SetupUserRepositoryGetAllAsync() + { + var user = new Mock(() => + new User( + ExistingUserId, + "max@mustermann.com", + "Max", + "Mustermann")); + + var query = new[] { user.Object }.AsQueryable().BuildMock(); + + UserRepository + .Setup(x => x.GetAllNoTracking()) + .Returns(query); + } } \ No newline at end of file diff --git a/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetUserByIdTestFixture.cs b/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetUserByIdTestFixture.cs index 8d110f3..45bc4dd 100644 --- a/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetUserByIdTestFixture.cs +++ b/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetUserByIdTestFixture.cs @@ -1,7 +1,7 @@ -using CleanArchitecture.Application.Queries.Users.GetAll; using CleanArchitecture.Application.Queries.Users.GetUserById; -using CleanArchitecture.Domain.Interfaces; +using CleanArchitecture.Domain.Entities; using CleanArchitecture.Domain.Interfaces.Repositories; +using MockQueryable.Moq; using Moq; namespace CleanArchitecture.Application.Tests.Fixtures.Queries.Users; @@ -10,11 +10,30 @@ public sealed class GetUserByIdTestFixture : QueryHandlerBaseFixture { public Mock UserRepository { get; } public GetUserByIdQueryHandler Handler { get; } + public Guid ExistingUserId { get; } = Guid.NewGuid(); public GetUserByIdTestFixture() { UserRepository = new(); + SetupUserRepositoryGetAllAsync(); + Handler = new(UserRepository.Object, Bus.Object); } + + private void SetupUserRepositoryGetAllAsync() + { + var user = new Mock(() => + new User( + ExistingUserId, + "max@mustermann.com", + "Max", + "Mustermann")); + + var query = new[] { user.Object }.AsQueryable().BuildMock(); + + UserRepository + .Setup(x => x.GetAllNoTracking()) + .Returns(query); + } } \ No newline at end of file diff --git a/CleanArchitecture.Application.Tests/Queries/Users/GetAllUsersQueryHandlerTests.cs b/CleanArchitecture.Application.Tests/Queries/Users/GetAllUsersQueryHandlerTests.cs index 98aec9a..61519cb 100644 --- a/CleanArchitecture.Application.Tests/Queries/Users/GetAllUsersQueryHandlerTests.cs +++ b/CleanArchitecture.Application.Tests/Queries/Users/GetAllUsersQueryHandlerTests.cs @@ -1,6 +1,24 @@ +using CleanArchitecture.Application.Tests.Fixtures.Queries.Users; +using FluentAssertions; +using Xunit; + namespace CleanArchitecture.Application.Tests.Queries.Users; public sealed class GetAllUsersQueryHandlerTests { - + private readonly GetAllUsersTestFixture _fixture = new(); + + [Fact] + public async Task Should_Get_All_Users() + { + var result = await _fixture.Handler.Handle( + new(), + default); + + _fixture.VerifyNoDomainNotification(); + + result.Should().NotBeNull(); + result.Should().ContainSingle(); + result.FirstOrDefault().Id.Should().Be(_fixture.ExistingUserId); + } } \ No newline at end of file diff --git a/CleanArchitecture.Application.Tests/Queries/Users/GetUserByIdQueryHandlerTests.cs b/CleanArchitecture.Application.Tests/Queries/Users/GetUserByIdQueryHandlerTests.cs index 045d8b6..c26ab85 100644 --- a/CleanArchitecture.Application.Tests/Queries/Users/GetUserByIdQueryHandlerTests.cs +++ b/CleanArchitecture.Application.Tests/Queries/Users/GetUserByIdQueryHandlerTests.cs @@ -1,6 +1,41 @@ +using CleanArchitecture.Application.Queries.Users.GetUserById; +using CleanArchitecture.Application.Tests.Fixtures.Queries.Users; +using CleanArchitecture.Domain.Errors; +using FluentAssertions; +using Xunit; + namespace CleanArchitecture.Application.Tests.Queries.Users; public sealed class GetUserByIdQueryHandlerTests { + private readonly GetUserByIdTestFixture _fixture = new(); + + [Fact] + public async Task Should_Get_Existing_User() + { + var result = await _fixture.Handler.Handle( + new(_fixture.ExistingUserId), + default); + + _fixture.VerifyNoDomainNotification(); + + result.Should().NotBeNull(); + result!.Id.Should().Be(_fixture.ExistingUserId); + } + [Fact] + public async Task Should_Raise_Notification_For_No_User() + { + var request = new GetUserByIdQuery(Guid.NewGuid()); + var result = await _fixture.Handler.Handle( + request, + default); + + _fixture.VerifyExistingNotification( + nameof(GetUserByIdQuery), + ErrorCodes.ObjectNotFound, + $"User with id {request.UserId} could not be found"); + + result.Should().BeNull(); + } } \ No newline at end of file diff --git a/CleanArchitecture.Application/Queries/Users/GetUserById/GetUserByIdQueryHandler.cs b/CleanArchitecture.Application/Queries/Users/GetUserById/GetUserByIdQueryHandler.cs index 3a96b7b..dfcb036 100644 --- a/CleanArchitecture.Application/Queries/Users/GetUserById/GetUserByIdQueryHandler.cs +++ b/CleanArchitecture.Application/Queries/Users/GetUserById/GetUserByIdQueryHandler.cs @@ -26,8 +26,7 @@ public sealed class GetUserByIdQueryHandler : { var user = _userRepository .GetAllNoTracking() - .Where(x => x.Id == request.UserId) - .FirstOrDefault(); + .FirstOrDefault(x => x.Id == request.UserId); if (user == null) {