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 @@ -27,7 +27,7 @@ internal async Task Given_valid_event_published_Then_event_should_be_consumed()

private IEventBus GetEventBus() =>
_applicationInMemory.Services
.CreateScope()
.CreateScope()!
.ServiceProvider
.GetRequiredService<IEventBus>();
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace EvolutionaryArchitecture.Fitnet.IntegrationTests.Contracts.PrepareCont
public sealed class PrepareContractTests(
WebApplicationFactory<Program> applicationInMemoryFactory,
DatabaseContainer database) : IClassFixture<WebApplicationFactory<Program>>,
IClassFixture<DatabaseContainer>
IClassFixture<DatabaseContainer>, IAsyncLifetime
{
private readonly HttpClient _applicationHttpClient = applicationInMemoryFactory
.WithContainerDatabaseConfigured(database.ConnectionString!)
Expand All @@ -24,7 +24,7 @@ internal async Task Given_valid_contract_preparation_request_Then_should_return_
var requestParameters = PrepareContractRequestParameters.GetValid();

// Act
var prepareContractResponse = await PrepareCorrectContract(requestParameters);
using var prepareContractResponse = await PrepareCorrectContract(requestParameters);

// Assert
prepareContractResponse.StatusCode.ShouldBe(HttpStatusCode.Created);
Expand Down Expand Up @@ -61,7 +61,7 @@ internal async Task Given_contract_preparation_request_with_invalid_age_Then_sho
requestParameters.MaxAge, requestParameters.MinHeight, requestParameters.MaxHeight);

// Act
var prepareContractResponse =
using var prepareContractResponse =
await _applicationHttpClient.PostAsJsonAsync(ContractsApiPaths.Prepare, prepareContractRequest);

// Assert
Expand All @@ -82,7 +82,7 @@ internal async Task Given_contract_preparation_request_with_invalid_height_Then_
requestParameters.MaxAge, requestParameters.MinHeight, requestParameters.MaxHeight);

// Act
var prepareContractResponse =
using var prepareContractResponse =
await _applicationHttpClient.PostAsJsonAsync(ContractsApiPaths.Prepare, prepareContractRequest);

// Assert
Expand All @@ -103,7 +103,7 @@ internal async Task
await PrepareCorrectContract(requestParameters, customerId);

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

// Assert
prepareContractResponse.StatusCode.ShouldBe(HttpStatusCode.Conflict);
Expand All @@ -122,4 +122,12 @@ private async Task<HttpResponseMessage> PrepareCorrectContract(PrepareContractRe

return prepareContractResponse;
}

public Task InitializeAsync() => Task.CompletedTask;

public async Task DisposeAsync()
{
_applicationHttpClient.Dispose();
await applicationInMemoryFactory.DisposeAsync();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,29 @@ namespace EvolutionaryArchitecture.Fitnet.IntegrationTests.Contracts.SignContrac
using EvolutionaryArchitecture.Fitnet.Common.Events.EventBus;
using Microsoft.AspNetCore.Mvc;

public sealed class SignContractTests : IClassFixture<WebApplicationFactory<Program>>, IClassFixture<DatabaseContainer>
public sealed class SignContractTests : IClassFixture<WebApplicationFactory<Program>>, IClassFixture<DatabaseContainer>, IAsyncLifetime
{
private readonly HttpClient _applicationHttpClient;
private readonly IEventBus _fakeEventBus = Substitute.For<IEventBus>();
private readonly WebApplicationFactory<Program> _applicationInMemoryFactory;

public SignContractTests(WebApplicationFactory<Program> applicationInMemoryFactory,
DatabaseContainer database) =>
DatabaseContainer database)
{
_applicationInMemoryFactory = applicationInMemoryFactory;
_applicationHttpClient = applicationInMemoryFactory
.WithFakeEventBus(_fakeEventBus)
.WithContainerDatabaseConfigured(database.ConnectionString!)
.CreateClient();
}

public Task InitializeAsync() => Task.CompletedTask;

public async Task DisposeAsync()
{
_applicationHttpClient.Dispose();
await _applicationInMemoryFactory.DisposeAsync();
}

[Fact]
internal async Task Given_valid_contract_signature_request_Then_should_return_no_content_status_code()
Expand All @@ -30,7 +42,7 @@ internal async Task Given_valid_contract_signature_request_Then_should_return_no
var signContractRequest = new SignContractRequest(requestParameters.SignedAt);

// Act
var signContractResponse =
using var signContractResponse =
await _applicationHttpClient.PatchAsJsonAsync(requestParameters.Url, signContractRequest);

// Assert
Expand Down Expand Up @@ -63,7 +75,7 @@ internal async Task Given_contract_signature_request_with_not_existing_id_Then_s
var signContractRequest = new SignContractRequest(requestParameters.SignedAt);

// Act
var signContractResponse =
using var signContractResponse =
await _applicationHttpClient.PatchAsJsonAsync(requestParameters.Url, signContractRequest);

// Assert
Expand All @@ -81,7 +93,7 @@ internal async Task
var signContractRequest = new SignContractRequest(requestParameters.SignedAt);

// Act
var signContractResponse =
using var signContractResponse =
await _applicationHttpClient.PatchAsJsonAsync(requestParameters.Url, signContractRequest);

// Assert
Expand All @@ -97,7 +109,7 @@ private async Task<Guid> PrepareContract()
var requestParameters = PrepareContractRequestParameters.GetValid();
PrepareContractRequest prepareContractRequest = new PrepareContractRequestFaker(requestParameters.MinAge,
requestParameters.MaxAge, requestParameters.MinHeight, requestParameters.MaxHeight);
var prepareContractResponse =
using var prepareContractResponse =
await _applicationHttpClient.PostAsJsonAsync(ContractsApiPaths.Prepare, prepareContractRequest);
var preparedContractId = await prepareContractResponse.Content.ReadFromJsonAsync<Guid>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ public PrepareOfferTests(WebApplicationFactory<Program> applicationInMemoryFacto
_applicationInMemory = applicationInMemoryFactory
.WithFakeEventBus(_fakeEventBus)
.WithContainerDatabaseConfigured(database.ConnectionString!);

_applicationInMemory.CreateClient();
}

Expand All @@ -41,4 +40,4 @@ internal async Task Given_pass_expired_event_published_Then_new_offer_should_be_

private void EnsureThatOfferPreparedEventWasPublished() => _fakeEventBus.Received(1)
.PublishAsync(Arg.Any<OfferPrepareEvent>(), Arg.Any<CancellationToken>());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace EvolutionaryArchitecture.Fitnet.IntegrationTests.Passes.MarkPassAsExpi
using Fitnet.Passes.MarkPassAsExpired.Events;

public sealed class MarkPassAsExpiredTests : IClassFixture<WebApplicationFactory<Program>>,
IClassFixture<DatabaseContainer>
IClassFixture<DatabaseContainer>, IAsyncLifetime
{
private static readonly StringContent EmptyContent = new(string.Empty);

Expand Down Expand Up @@ -51,7 +51,7 @@ internal async Task Given_valid_mark_pass_as_expired_request_Then_should_publish
var url = BuildUrl(registeredPassId);

// Act
var markAsExpiredResponse = await _applicationHttpClient.PatchAsJsonAsync(url, EmptyContent);
using var markAsExpiredResponse = await _applicationHttpClient.PatchAsJsonAsync(url, EmptyContent);

// Assert
markAsExpiredResponse.StatusCode.ShouldBe(HttpStatusCode.NoContent);
Expand All @@ -65,7 +65,7 @@ internal async Task Given_mark_pass_as_expired_request_with_not_existing_id_Then
var url = BuildUrl(notExistingId);

// Act
var markAsExpiredResponse = await _applicationHttpClient.PatchAsJsonAsync(url, EmptyContent);
using var markAsExpiredResponse = await _applicationHttpClient.PatchAsJsonAsync(url, EmptyContent);

// Assert
markAsExpiredResponse.StatusCode.ShouldBe(HttpStatusCode.NotFound);
Expand All @@ -91,14 +91,23 @@ private async Task<Guid> GetCreatedPass(Guid customerId)

private async Task<PassDto?> CreatedPass(Guid customerId)
{
var getAllPassesResponse = await _applicationHttpClient.GetAsync(PassesApiPaths.GetAll);
using var getAllPassesResponse = await _applicationHttpClient.GetAsync(PassesApiPaths.GetAll);
var response = await getAllPassesResponse.Content.ReadFromJsonAsync<GetAllPassesResponse>();
var createdPass = response!.Passes.FirstOrDefault(pass => pass.CustomerId == customerId);

return createdPass;
}

private static string BuildUrl(Guid id) => PassesApiPaths.MarkPassAsExpired.Replace("{id}", id.ToString());

private void EnsureThatPassExpiredEventWasPublished() => _fakeEventBus.Received(1)
.PublishAsync(Arg.Any<PassExpiredEvent>(), Arg.Any<CancellationToken>());

public Task InitializeAsync() => Task.CompletedTask;

public async Task DisposeAsync()
{
_applicationHttpClient.Dispose();
await _applicationInMemoryFactory.DisposeAsync();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,27 @@ namespace EvolutionaryArchitecture.Fitnet.IntegrationTests.Passes.RegisterPass;
using Fitnet.Passes.RegisterPass.Events;
using EvolutionaryArchitecture.Fitnet.Common.Events.EventBus;

public sealed class RegisterPassTests : IClassFixture<WebApplicationFactory<Program>>,
IClassFixture<DatabaseContainer>
public sealed class RegisterPassTests : IClassFixture<WebApplicationFactory<Program>>, IClassFixture<DatabaseContainer>, IAsyncLifetime
{
private readonly WebApplicationFactory<Program> _applicationInMemory;
private readonly IEventBus _fakeEventBus = Substitute.For<IEventBus>();
private readonly HttpClient _applicationHttpClient;

public RegisterPassTests(WebApplicationFactory<Program> applicationInMemoryFactory,
DatabaseContainer database)
{
_applicationInMemory = applicationInMemoryFactory
.WithContainerDatabaseConfigured(database.ConnectionString!)
.WithFakeEventBus(_fakeEventBus);
_applicationInMemory.CreateClient();
.WithContainerDatabaseConfigured(database.ConnectionString!)
.WithFakeEventBus(_fakeEventBus);
_applicationHttpClient = _applicationInMemory.CreateClient();
}

public Task InitializeAsync() => Task.CompletedTask;

public async Task DisposeAsync()
{
_applicationHttpClient.Dispose();
await _applicationInMemory.DisposeAsync();
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
namespace EvolutionaryArchitecture.Fitnet.IntegrationTests.Reports.GenerateNewPassesPerMonthReport;

using System;
using Common.TestEngine.Configuration;
using Common.TestEngine.IntegrationEvents.Handlers;
using Common.TestEngine.Time;
Expand All @@ -9,7 +10,7 @@ namespace EvolutionaryArchitecture.Fitnet.IntegrationTests.Reports.GenerateNewPa
using Passes.RegisterPass;
using TestData;

public sealed class GenerateNewPassesPerMonthReportTests : IClassFixture<WebApplicationFactory<Program>>, IClassFixture<DatabaseContainer>
public sealed class GenerateNewPassesPerMonthReportTests : IClassFixture<WebApplicationFactory<Program>>, IClassFixture<DatabaseContainer>, IAsyncLifetime
{
private static readonly FakeTimeProvider FakeTimeProvider = new(ReportTestCases.FakeNowDate);
private readonly HttpClient _applicationHttpClient;
Expand All @@ -21,7 +22,6 @@ public GenerateNewPassesPerMonthReportTests(WebApplicationFactory<Program> appli
_applicationInMemoryFactory = applicationInMemoryFactory
.WithContainerDatabaseConfigured(database.ConnectionString!)
.WithTime(FakeTimeProvider);

_applicationHttpClient = _applicationInMemoryFactory.CreateClient();
}

Expand All @@ -34,7 +34,7 @@ internal async Task Given_valid_generate_new_report_request_Then_should_return_c
await RegisterPasses(passRegistrationDateRanges);

// Act
var getReportResult = await _applicationHttpClient.GetAsync(ReportsApiPaths.GenerateNewReport);
using var getReportResult = await _applicationHttpClient.GetAsync(ReportsApiPaths.GenerateNewReport);

// Assert
getReportResult.StatusCode.ShouldBe(HttpStatusCode.OK);
Expand All @@ -58,4 +58,12 @@ private async Task RegisterPass(DateTimeOffset from, DateTimeOffset to)
var @event = ContractSignedEventFaker.Create(from, to);
await integrationEventHandler.Handle(@event, CancellationToken.None);
}

public Task InitializeAsync() => Task.CompletedTask;

public async Task DisposeAsync()
{
_applicationHttpClient.Dispose();
await _applicationInMemoryFactory.DisposeAsync();
}
}
2 changes: 1 addition & 1 deletion Chapter-1-initial-architecture/Src/Fitnet/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
builder.Services.AddOffers(builder.Configuration);
builder.Services.AddReports();

var app = builder.Build();
await using var app = builder.Build();

if (app.Environment.IsDevelopment())
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ public IDbConnection Create()
{
return _connection;
}

_connection =
new NpgsqlConnection(configuration.GetConnectionString("Reports"));
_connection.Open();
Expand Down