Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Update="SonarAnalyzer.CSharp" Version="9.32.0.97167" />
<PackageReference Update="SonarAnalyzer.CSharp" Version="10.14.0.120626" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ namespace EvolutionaryArchitecture.Fitnet.IntegrationTests.Contracts.PrepareCont
using EvolutionaryArchitecture.Fitnet.Contracts.PrepareContract;
using Common.TestEngine;
using Common.TestEngine.Configuration;
using Fitnet.Contracts.SignContract;
using Microsoft.AspNetCore.Mvc;
using SignContract;

public sealed class PrepareContractTests(
WebApplicationFactory<Program> applicationInMemoryFactory,
Expand All @@ -28,6 +30,27 @@ internal async Task Given_valid_contract_preparation_request_Then_should_return_
prepareContractResponse.StatusCode.ShouldBe(HttpStatusCode.Created);
}

[Fact]
internal async Task Given_valid_contract_preparation_request_When_preparing_new_contract_for_same_customer_after_previous_contract_was_signed_Then_should_return_created_status_code()
{
// Arrange
var customerId = Guid.NewGuid();
var requestParameters = PrepareContractRequestParameters.GetValid();
var prepareContractResponse = await PrepareCorrectContract(requestParameters, customerId);
var preparedContractId = await prepareContractResponse.Content.ReadFromJsonAsync<Guid>();
var signContractRequestParameters = SignContractRequestParameters.GetValid(preparedContractId);
var signContractRequest = new SignContractRequest(signContractRequestParameters.SignedAt);
var signContractResponse =
await _applicationHttpClient.PatchAsJsonAsync(signContractRequestParameters.Url, signContractRequest);
signContractResponse.StatusCode.ShouldBe(HttpStatusCode.NoContent);

// Act
var secondContractPreparationResponse = await PrepareCorrectContract(requestParameters, customerId);

// Assert
secondContractPreparationResponse.StatusCode.ShouldBe(HttpStatusCode.Created);
}

[Fact]
internal async Task Given_contract_preparation_request_with_invalid_age_Then_should_return_conflict_status_code()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Update="SonarAnalyzer.CSharp" Version="9.32.0.97167" />
<PackageReference Update="SonarAnalyzer.CSharp" Version="10.14.0.120626" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,40 @@ namespace EvolutionaryArchitecture.Fitnet.Contracts.PrepareContract;
using Common.Validation.Requests;
using Data;
using Data.Database;
using FluentValidation;
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Models;

internal static class PrepareContractEndpoint
{
internal static void MapPrepareContract(this IEndpointRouteBuilder app) => app.MapPost(ContractsApiPaths.Prepare,
async (PrepareContractRequest request, IValidator<PrepareContractRequest> validator,
ContractsPersistence persistence,
CancellationToken cancellationToken) =>
{
var previousContract =
await GetPreviousForCustomerAsync(persistence, request.CustomerId, cancellationToken);
var contract = Contract.Prepare(request.CustomerId, request.CustomerAge, request.CustomerHeight,
request.PreparedAt, previousContract?.Signed);
await persistence.Contracts.AddAsync(contract, cancellationToken);
await persistence.SaveChangesAsync(cancellationToken);
internal static void MapPrepareContract(this IEndpointRouteBuilder app) =>
app.MapPost(ContractsApiPaths.Prepare,
async (PrepareContractRequest request,
ContractsPersistence persistence,
CancellationToken cancellationToken) =>
{
var previousContract =
await GetPreviousForCustomerAsync(persistence, request.CustomerId, cancellationToken);
var contract = Contract.Prepare(
request.CustomerId,
request.CustomerAge,
request.CustomerHeight,
request.PreparedAt,
previousContract?.Signed);
await persistence.Contracts.AddAsync(contract, cancellationToken);
await persistence.SaveChangesAsync(cancellationToken);

return Results.Created($"/{ContractsApiPaths.Prepare}/{contract.Id}", contract.Id);
return Results.Created($"/{ContractsApiPaths.Prepare}/{contract.Id}", contract.Id);
})
.ValidateRequest<PrepareContractRequest>()
.WithOpenApi(operation => new OpenApiOperation(operation)
{
Summary = "Triggers preparation of a new contract for new or existing customer",
Description =
"This endpoint is used to prepare a new contract for new and existing customers."
})
.ValidateRequest<PrepareContractRequest>()
.WithOpenApi(operation => new(operation)
{
Summary = "Triggers preparation of a new contract for new or existing customer",
Description =
"This endpoint is used to prepare a new contract for new and existing customers.",
})
.Produces<string>(StatusCodes.Status201Created)
.Produces(StatusCodes.Status409Conflict)
.Produces(StatusCodes.Status500InternalServerError);
.Produces<string>(StatusCodes.Status201Created)
.Produces(StatusCodes.Status409Conflict)
.Produces(StatusCodes.Status500InternalServerError);

private static async Task<Contract?> GetPreviousForCustomerAsync(ContractsPersistence persistence, Guid customerId,
CancellationToken cancellationToken = default) =>
Expand Down
2 changes: 1 addition & 1 deletion Chapter-1-initial-architecture/Src/Fitnet/Fitnet.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0-rc.2.24474.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.0-rc.2" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="7.0.0" />
<PackageReference Update="SonarAnalyzer.CSharp" Version="9.32.0.97167" />
<PackageReference Update="SonarAnalyzer.CSharp" Version="10.14.0.120626" />
</ItemGroup>

<ItemGroup>
Expand Down