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

View File

@ -4,13 +4,12 @@ using Passenger.Passengers.Enums;
namespace Integration.Test.Fakes;
using global::Passenger.Passengers.Features.CompletingRegisterPassenger.V1;
using MassTransit;
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.PassengerType, _ => PassengerType.Male);
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()
{
// 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(userCreated.PassportNumber).Generate();
var command = new FakeCompleteRegisterPassengerCommand(passenger.PassportNumber, passenger.Id).Generate();
// Act
var response = await Fixture.SendAsync(command);
// Assert
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?.PassengerType.ToString().Should().Be(command.PassengerType.ToString());
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
);
}
}