0
0
mirror of https://github.com/alex289/CleanArchitecture.git synced 2025-06-30 10:33:43 +00:00

Add query handler tests

This commit is contained in:
alex289 2023-03-07 23:26:33 +01:00
parent 7b31d2dd1b
commit 305e6320f0
No known key found for this signature in database
GPG Key ID: 573F77CD2D87F863
7 changed files with 100 additions and 5 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ riderModule.iml
/_ReSharper.Caches/ /_ReSharper.Caches/
.idea .idea
.vs .vs
CleanArchitecture.sln.DotSettings.user

View File

@ -9,7 +9,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="FluentAssertions" Version="6.10.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="MockQueryable.Moq" Version="7.0.0" />
<PackageReference Include="Moq" Version="4.18.4" /> <PackageReference Include="Moq" Version="4.18.4" />
<PackageReference Include="xunit" Version="2.4.2" /> <PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">

View File

@ -1,5 +1,7 @@
using CleanArchitecture.Application.Queries.Users.GetAll; using CleanArchitecture.Application.Queries.Users.GetAll;
using CleanArchitecture.Domain.Entities;
using CleanArchitecture.Domain.Interfaces.Repositories; using CleanArchitecture.Domain.Interfaces.Repositories;
using MockQueryable.Moq;
using Moq; using Moq;
namespace CleanArchitecture.Application.Tests.Fixtures.Queries.Users; namespace CleanArchitecture.Application.Tests.Fixtures.Queries.Users;
@ -8,11 +10,30 @@ public sealed class GetAllUsersTestFixture : QueryHandlerBaseFixture
{ {
public Mock<IUserRepository> UserRepository { get; } public Mock<IUserRepository> UserRepository { get; }
public GetAllUsersQueryHandler Handler { get; } public GetAllUsersQueryHandler Handler { get; }
public Guid ExistingUserId { get; } = Guid.NewGuid();
public GetAllUsersTestFixture() public GetAllUsersTestFixture()
{ {
UserRepository = new(); UserRepository = new();
SetupUserRepositoryGetAllAsync();
Handler = new(UserRepository.Object); Handler = new(UserRepository.Object);
} }
private void SetupUserRepositoryGetAllAsync()
{
var user = new Mock<User>(() =>
new User(
ExistingUserId,
"max@mustermann.com",
"Max",
"Mustermann"));
var query = new[] { user.Object }.AsQueryable().BuildMock();
UserRepository
.Setup(x => x.GetAllNoTracking())
.Returns(query);
}
} }

View File

@ -1,7 +1,7 @@
using CleanArchitecture.Application.Queries.Users.GetAll;
using CleanArchitecture.Application.Queries.Users.GetUserById; using CleanArchitecture.Application.Queries.Users.GetUserById;
using CleanArchitecture.Domain.Interfaces; using CleanArchitecture.Domain.Entities;
using CleanArchitecture.Domain.Interfaces.Repositories; using CleanArchitecture.Domain.Interfaces.Repositories;
using MockQueryable.Moq;
using Moq; using Moq;
namespace CleanArchitecture.Application.Tests.Fixtures.Queries.Users; namespace CleanArchitecture.Application.Tests.Fixtures.Queries.Users;
@ -10,11 +10,30 @@ public sealed class GetUserByIdTestFixture : QueryHandlerBaseFixture
{ {
public Mock<IUserRepository> UserRepository { get; } public Mock<IUserRepository> UserRepository { get; }
public GetUserByIdQueryHandler Handler { get; } public GetUserByIdQueryHandler Handler { get; }
public Guid ExistingUserId { get; } = Guid.NewGuid();
public GetUserByIdTestFixture() public GetUserByIdTestFixture()
{ {
UserRepository = new(); UserRepository = new();
SetupUserRepositoryGetAllAsync();
Handler = new(UserRepository.Object, Bus.Object); Handler = new(UserRepository.Object, Bus.Object);
} }
private void SetupUserRepositoryGetAllAsync()
{
var user = new Mock<User>(() =>
new User(
ExistingUserId,
"max@mustermann.com",
"Max",
"Mustermann"));
var query = new[] { user.Object }.AsQueryable().BuildMock();
UserRepository
.Setup(x => x.GetAllNoTracking())
.Returns(query);
}
} }

View File

@ -1,6 +1,24 @@
using CleanArchitecture.Application.Tests.Fixtures.Queries.Users;
using FluentAssertions;
using Xunit;
namespace CleanArchitecture.Application.Tests.Queries.Users; namespace CleanArchitecture.Application.Tests.Queries.Users;
public sealed class GetAllUsersQueryHandlerTests 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);
}
} }

View File

@ -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; namespace CleanArchitecture.Application.Tests.Queries.Users;
public sealed class GetUserByIdQueryHandlerTests 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();
}
} }

View File

@ -26,8 +26,7 @@ public sealed class GetUserByIdQueryHandler :
{ {
var user = _userRepository var user = _userRepository
.GetAllNoTracking() .GetAllNoTracking()
.Where(x => x.Id == request.UserId) .FirstOrDefault(x => x.Id == request.UserId);
.FirstOrDefault();
if (user == null) if (user == null)
{ {