fix: fix ci failed for tests

This commit is contained in:
Meysam Hadeli 2026-02-20 20:57:26 +03:30
parent 8d4819624e
commit 23d4babd52
5 changed files with 78 additions and 70 deletions

View File

@ -17,17 +17,23 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Passenger.Passengers.ValueObjects; using ValueObjects;
public record CompleteRegisterPassenger public record CompleteRegisterPassenger(string PassportNumber, Enums.PassengerType PassengerType, int Age)
(string PassportNumber, Enums.PassengerType PassengerType, int Age) : ICommand<CompleteRegisterPassengerResult>, : ICommand<CompleteRegisterPassengerResult>,
IInternalCommand IInternalCommand
{ {
public Guid Id { get; init; } = NewId.NextGuid(); public Guid Id { get; init; } = NewId.NextGuid();
} }
public record PassengerRegistrationCompletedDomainEvent(Guid Id, string Name, string PassportNumber, public record PassengerRegistrationCompletedDomainEvent(
Enums.PassengerType PassengerType, int Age, bool IsDeleted = false) : IDomainEvent; Guid Id,
string Name,
string PassportNumber,
Enums.PassengerType PassengerType,
int Age,
bool IsDeleted = false
) : IDomainEvent;
public record CompleteRegisterPassengerResult(PassengerDto PassengerDto); public record CompleteRegisterPassengerResult(PassengerDto PassengerDto);
@ -39,18 +45,25 @@ public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
{ {
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder) public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
{ {
builder.MapPost($"{EndpointConfig.BaseApiPath}/passenger/complete-registration", async ( builder
CompleteRegisterPassengerRequestDto request, IMapper mapper, .MapPost(
IMediator mediator, CancellationToken cancellationToken) => $"{EndpointConfig.BaseApiPath}/passenger/complete-registration",
{ async (
var command = mapper.Map<CompleteRegisterPassenger>(request); CompleteRegisterPassengerRequestDto request,
IMapper mapper,
IMediator mediator,
CancellationToken cancellationToken
) =>
{
var command = mapper.Map<CompleteRegisterPassenger>(request);
var result = await mediator.Send(command, cancellationToken); var result = await mediator.Send(command, cancellationToken);
var response = result.Adapt<CompleteRegisterPassengerResponseDto>(); var response = result.Adapt<CompleteRegisterPassengerResponseDto>();
return Results.Ok(response); return Results.Ok(response);
}) }
)
.RequireAuthorization(nameof(ApiScope)) .RequireAuthorization(nameof(ApiScope))
.WithName("CompleteRegisterPassenger") .WithName("CompleteRegisterPassenger")
.WithApiVersionSet(builder.NewApiVersionSet("Passenger").Build()) .WithApiVersionSet(builder.NewApiVersionSet("Passenger").Build())
@ -71,17 +84,19 @@ public class CompleteRegisterPassengerValidator : AbstractValidator<CompleteRegi
{ {
RuleFor(x => x.PassportNumber).NotNull().WithMessage("The PassportNumber is required!"); RuleFor(x => x.PassportNumber).NotNull().WithMessage("The PassportNumber is required!");
RuleFor(x => x.Age).GreaterThan(0).WithMessage("The Age must be greater than 0!"); RuleFor(x => x.Age).GreaterThan(0).WithMessage("The Age must be greater than 0!");
RuleFor(x => x.PassengerType).Must(p => p.GetType().IsEnum && RuleFor(x => x.PassengerType)
p == Enums.PassengerType.Baby || .Must(p =>
p == Enums.PassengerType.Female || p.GetType().IsEnum && p == Enums.PassengerType.Baby
p == Enums.PassengerType.Male || || p == Enums.PassengerType.Female
p == Enums.PassengerType.Unknown) || p == Enums.PassengerType.Male
|| p == Enums.PassengerType.Unknown
)
.WithMessage("PassengerType must be Male, Female, Baby or Unknown"); .WithMessage("PassengerType must be Male, Female, Baby or Unknown");
} }
} }
internal class CompleteRegisterPassengerCommandHandler : ICommandHandler<CompleteRegisterPassenger, internal class CompleteRegisterPassengerCommandHandler
CompleteRegisterPassengerResult> : ICommandHandler<CompleteRegisterPassenger, CompleteRegisterPassengerResult>
{ {
private readonly IMapper _mapper; private readonly IMapper _mapper;
private readonly PassengerDbContext _passengerDbContext; private readonly PassengerDbContext _passengerDbContext;
@ -92,21 +107,30 @@ internal class CompleteRegisterPassengerCommandHandler : ICommandHandler<Complet
_passengerDbContext = passengerDbContext; _passengerDbContext = passengerDbContext;
} }
public async Task<CompleteRegisterPassengerResult> Handle(CompleteRegisterPassenger request, public async Task<CompleteRegisterPassengerResult> Handle(
CancellationToken cancellationToken) CompleteRegisterPassenger request,
CancellationToken cancellationToken
)
{ {
Guard.Against.Null(request, nameof(request)); Guard.Against.Null(request, nameof(request));
var passenger = await _passengerDbContext.Passengers.SingleOrDefaultAsync( var passenger = await _passengerDbContext.Passengers.SingleOrDefaultAsync(
x => x.PassportNumber.Value == request.PassportNumber, cancellationToken); x => x.PassportNumber.Value == request.PassportNumber,
cancellationToken
);
if (passenger is null) if (passenger is null)
{ {
throw new PassengerNotExist(); throw new PassengerNotExist();
} }
passenger.CompleteRegistrationPassenger(passenger.Id, passenger.Name, passenger.CompleteRegistrationPassenger(
passenger.PassportNumber, request.PassengerType, Age.Of(request.Age)); passenger.Id,
passenger.Name,
passenger.PassportNumber,
request.PassengerType,
Age.Of(request.Age)
);
var updatePassenger = _passengerDbContext.Passengers.Update(passenger).Entity; var updatePassenger = _passengerDbContext.Passengers.Update(passenger).Entity;
@ -114,4 +138,4 @@ internal class CompleteRegisterPassengerCommandHandler : ICommandHandler<Complet
return new CompleteRegisterPassengerResult(passengerDto); return new CompleteRegisterPassengerResult(passengerDto);
} }
} }

View File

@ -4,15 +4,14 @@ using Passenger.Passengers.Enums;
namespace Integration.Test.Fakes; namespace Integration.Test.Fakes;
using global::Passenger.Passengers.Features.CompletingRegisterPassenger.V1; using global::Passenger.Passengers.Features.CompletingRegisterPassenger.V1;
using MassTransit;
public sealed class FakeCompleteRegisterPassengerCommand : AutoFaker<CompleteRegisterPassenger> public sealed class FakeCompleteRegisterPassengerCommand : AutoFaker<CompleteRegisterPassenger>
{ {
public FakeCompleteRegisterPassengerCommand(string passportNumber) public FakeCompleteRegisterPassengerCommand(string passportNumber, Guid passengerId)
{ {
RuleFor(r => r.Id, _ => NewId.NextGuid()); RuleFor(r => r.Id, _ => passengerId);
RuleFor(r => r.PassportNumber, _ => passportNumber); RuleFor(r => r.PassportNumber, _ => passportNumber);
RuleFor(r => r.PassengerType, _ => PassengerType.Male); RuleFor(r => r.PassengerType, _ => PassengerType.Male);
RuleFor(r => r.Age, _ => 30); RuleFor(r => r.Age, _ => 30);
} }
} }

View File

@ -0,0 +1,16 @@
using AutoBogus;
using Passenger.Passengers.ValueObjects;
namespace Integration.Test.Fakes;
using MassTransit;
public class FakePassenger : AutoFaker<global::Passenger.Passengers.Models.Passenger>
{
public FakePassenger()
{
RuleFor(r => r.Id, _ => PassengerId.Of(NewId.NextGuid()));
RuleFor(r => r.Name, _ => Name.Of("Sam"));
RuleFor(r => r.PassportNumber, _ => PassportNumber.Of("123456789"));
}
}

View File

@ -1,16 +0,0 @@
using AutoBogus;
using BuildingBlocks.Contracts.EventBus.Messages;
namespace Integration.Test.Fakes;
using MassTransit;
public class FakeUserCreated : AutoFaker<UserCreated>
{
public FakeUserCreated()
{
RuleFor(r => r.Id, _ => NewId.NextGuid());
RuleFor(r => r.Name, _ => "Sam");
RuleFor(r => r.PassportNumber, _ => "123456789");
}
}

View File

@ -17,39 +17,24 @@ public class CompleteRegisterPassengerTests : PassengerIntegrationTestBase
public async Task should_complete_register_passenger_and_update_to_db() public async Task should_complete_register_passenger_and_update_to_db()
{ {
// Arrange // Arrange
var userCreated = new FakeUserCreated().Generate(); var passenger = new FakePassenger().Generate();
await Fixture.Publish(userCreated); await Fixture.ExecuteDbContextAsync(db =>
{
db.Passengers.Add(passenger);
return db.SaveChangesAsync();
});
(await WaitUntilPassengerCreatedAsync(userCreated.PassportNumber)).Should().BeTrue(); var command = new FakeCompleteRegisterPassengerCommand(passenger.PassportNumber, passenger.Id).Generate();
var command = new FakeCompleteRegisterPassengerCommand(userCreated.PassportNumber).Generate();
// Act // Act
var response = await Fixture.SendAsync(command); var response = await Fixture.SendAsync(command);
// Assert // Assert
response.Should().NotBeNull(); response.Should().NotBeNull();
response?.PassengerDto?.Name.Should().Be(userCreated.Name); response?.PassengerDto?.Name.Should().Be(passenger.Name);
response?.PassengerDto?.PassportNumber.Should().Be(command.PassportNumber); response?.PassengerDto?.PassportNumber.Should().Be(command.PassportNumber);
response?.PassengerDto?.PassengerType.ToString().Should().Be(command.PassengerType.ToString()); response?.PassengerDto?.PassengerType.ToString().Should().Be(command.PassengerType.ToString());
response?.PassengerDto?.Age.Should().Be(command.Age); response?.PassengerDto?.Age.Should().Be(command.Age);
} }
private Task<bool> WaitUntilPassengerCreatedAsync(string passportNumber)
{
var timeout = TimeSpan.FromSeconds(30);
var pollInterval = TimeSpan.FromMilliseconds(500);
return Fixture.WaitUntilAsync(
async () =>
{
return await Fixture.ExecuteDbContextAsync(db =>
ValueTask.FromResult(db.Passengers.Any(p => p.PassportNumber.Value == passportNumber))
);
},
timeout: timeout,
pollInterval: pollInterval
);
}
} }