using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using System.Net; using System.Net.Http.Json; using Vegasco.Server.Api.Cars; using Vegasco.Server.Api.Consumptions; using Vegasco.Server.Api.Persistence; namespace Vegasco.Server.Api.Tests.Integration.Consumptions; [Collection(SharedTestCollection.Name)] public class GetConsumptionsTests : IAsyncLifetime { private readonly WebAppFactory _factory; private readonly IServiceScope _scope; private readonly ApplicationDbContext _dbContext; private readonly CarFaker _carFaker = new(); private readonly ConsumptionFaker _consumptionFaker = new(); public GetConsumptionsTests(WebAppFactory factory) { _factory = factory; _scope = _factory.Services.CreateScope(); _dbContext = _scope.ServiceProvider.GetRequiredService(); } [Fact] public async Task GetConsumptions_ShouldReturnConsumptions_WhenConsumptionsExist() { // Arrange List createdConsumptions = []; const int numberOfConsumptions = 3; for (int i = 0; i < numberOfConsumptions; i++) { CreateConsumption.Response createdConsumption = await CreateConsumptionAsync(); createdConsumptions.Add(createdConsumption); } // Act using HttpResponseMessage response = await _factory.HttpClient.GetAsync("v1/consumptions"); // Assert response.StatusCode.Should().Be(HttpStatusCode.OK); GetConsumptions.ApiResponse? apiResponse = await response.Content.ReadFromJsonAsync(); apiResponse.Should().NotBeNull(); apiResponse.Consumptions.Should().HaveCount(createdConsumptions.Count); apiResponse.Consumptions.Should().BeEquivalentTo(createdConsumptions, o => o.ExcludingMissingMembers()); apiResponse.Consumptions .Select(x => x.Car.Id) .Should() .BeEquivalentTo(createdConsumptions, o => o.ExcludingMissingMembers()); } [Fact] public async Task GetConsumptions_ShouldReturnEmptyList_WhenNoConsumptionsExist() { // Arrange // Act using HttpResponseMessage response = await _factory.HttpClient.GetAsync("v1/consumptions"); // Assert response.StatusCode.Should().Be(HttpStatusCode.OK); GetConsumptions.ApiResponse? apiResponse = await response.Content.ReadFromJsonAsync(); apiResponse!.Consumptions.Should().BeEmpty(); } private async Task CreateConsumptionAsync() { CreateCar.Response createdCarResponse = await CreateCarAsync(); CreateConsumption.Request createConsumptionRequest = _consumptionFaker.CreateConsumptionRequest(createdCarResponse.Id); using HttpResponseMessage response = await _factory.HttpClient.PostAsJsonAsync("v1/consumptions", createConsumptionRequest); response.EnsureSuccessStatusCode(); CreateConsumption.Response? createdConsumption = await response.Content.ReadFromJsonAsync(); return createdConsumption!; } private async Task CreateCarAsync() { CreateCar.Request createCarRequest = new CarFaker().CreateCarRequest(); using HttpResponseMessage createCarResponse = await _factory.HttpClient.PostAsJsonAsync("v1/cars", createCarRequest); createCarResponse.EnsureSuccessStatusCode(); CreateCar.Response? createdCarResponse = await createCarResponse.Content.ReadFromJsonAsync(); return createdCarResponse!; } public Task InitializeAsync() { FluentAssertionConfiguration.SetupGlobalConfig(); return Task.CompletedTask; } public async Task DisposeAsync() { _scope.Dispose(); await _dbContext.DisposeAsync(); await _factory.ResetDatabaseAsync(); } }