diff --git a/src/Services/Passenger/src/Passenger/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs b/src/Services/Passenger/src/Passenger/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs index 635004d..0d08a0d 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs @@ -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, +public record CompleteRegisterPassenger(string PassportNumber, Enums.PassengerType PassengerType, int Age) + : ICommand, 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,18 +45,25 @@ 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) => - { - var command = mapper.Map(request); + builder + .MapPost( + $"{EndpointConfig.BaseApiPath}/passenger/complete-registration", + async ( + CompleteRegisterPassengerRequestDto request, + IMapper mapper, + IMediator mediator, + CancellationToken cancellationToken + ) => + { + var command = mapper.Map(request); - var result = await mediator.Send(command, cancellationToken); + var result = await mediator.Send(command, cancellationToken); - var response = result.Adapt(); + var response = result.Adapt(); - return Results.Ok(response); - }) + return Results.Ok(response); + } + ) .RequireAuthorization(nameof(ApiScope)) .WithName("CompleteRegisterPassenger") .WithApiVersionSet(builder.NewApiVersionSet("Passenger").Build()) @@ -71,17 +84,19 @@ public class CompleteRegisterPassengerValidator : AbstractValidator 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 +internal class CompleteRegisterPassengerCommandHandler + : ICommandHandler { private readonly IMapper _mapper; private readonly PassengerDbContext _passengerDbContext; @@ -92,21 +107,30 @@ internal class CompleteRegisterPassengerCommandHandler : ICommandHandler Handle(CompleteRegisterPassenger request, - CancellationToken cancellationToken) + public async Task 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; @@ -114,4 +138,4 @@ internal class CompleteRegisterPassengerCommandHandler : ICommandHandler { - 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); } -} \ No newline at end of file +} diff --git a/src/Services/Passenger/tests/IntegrationTest/Fakes/FakePassenger.cs b/src/Services/Passenger/tests/IntegrationTest/Fakes/FakePassenger.cs new file mode 100644 index 0000000..16ba96d --- /dev/null +++ b/src/Services/Passenger/tests/IntegrationTest/Fakes/FakePassenger.cs @@ -0,0 +1,16 @@ +using AutoBogus; +using Passenger.Passengers.ValueObjects; + +namespace Integration.Test.Fakes; + +using MassTransit; + +public class FakePassenger : AutoFaker +{ + public FakePassenger() + { + RuleFor(r => r.Id, _ => PassengerId.Of(NewId.NextGuid())); + RuleFor(r => r.Name, _ => Name.Of("Sam")); + RuleFor(r => r.PassportNumber, _ => PassportNumber.Of("123456789")); + } +} diff --git a/src/Services/Passenger/tests/IntegrationTest/Fakes/FakeUserCreated.cs b/src/Services/Passenger/tests/IntegrationTest/Fakes/FakeUserCreated.cs deleted file mode 100644 index dee41e6..0000000 --- a/src/Services/Passenger/tests/IntegrationTest/Fakes/FakeUserCreated.cs +++ /dev/null @@ -1,16 +0,0 @@ -using AutoBogus; -using BuildingBlocks.Contracts.EventBus.Messages; - -namespace Integration.Test.Fakes; - -using MassTransit; - -public class FakeUserCreated : AutoFaker -{ - public FakeUserCreated() - { - RuleFor(r => r.Id, _ => NewId.NextGuid()); - RuleFor(r => r.Name, _ => "Sam"); - RuleFor(r => r.PassportNumber, _ => "123456789"); - } -} \ No newline at end of file diff --git a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs index 979c146..06adba4 100644 --- a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs +++ b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs @@ -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 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 - ); - } }