mirror of
https://github.com/meysamhadeli/booking-microservices.git
synced 2026-04-11 02:20:20 +08:00
fix: fix ci failed for tests
This commit is contained in:
parent
8d4819624e
commit
23d4babd52
@ -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;
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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"));
|
||||
}
|
||||
}
|
||||
@ -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");
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user