Compare commits
3 Commits
4db35dbdb5
...
d6c75654b0
| Author | SHA1 | Date | |
|---|---|---|---|
| d6c75654b0 | |||
| 136dd2311d | |||
| 351a1a4635 |
@@ -1 +1 @@
|
|||||||
docker run --rm -d -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres postgres:16.3-alpine
|
docker run -d -p 5432:5432 --restart always --name vegasco-test-db -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres postgres:16.3-alpine
|
||||||
@@ -1,27 +1,46 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.AspNetCore.Http.HttpResults;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Vegasco.WebApi.Persistence;
|
using Vegasco.WebApi.Persistence;
|
||||||
|
|
||||||
namespace Vegasco.WebApi.Cars;
|
namespace Vegasco.WebApi.Cars;
|
||||||
|
|
||||||
public static class GetCars
|
public static class GetCars
|
||||||
{
|
{
|
||||||
public record Response(Guid Id, string Name);
|
public class ApiResponse
|
||||||
|
{
|
||||||
|
public IEnumerable<ResponseDto> Cars { get; set; } = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public record ResponseDto(Guid Id, string Name);
|
||||||
|
|
||||||
|
public class Request
|
||||||
|
{
|
||||||
|
[FromQuery(Name = "page")] public int? Page { get; set; }
|
||||||
|
[FromQuery(Name = "pageSize")] public int? PageSize { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
{
|
{
|
||||||
return builder
|
return builder
|
||||||
.MapGet("cars", Endpoint)
|
.MapGet("cars", Endpoint)
|
||||||
|
.WithDescription("Returns all cars")
|
||||||
.WithTags("Cars");
|
.WithTags("Cars");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<IResult> Endpoint(
|
private static async Task<Ok<ApiResponse>> Endpoint(
|
||||||
|
[AsParameters] Request request,
|
||||||
ApplicationDbContext dbContext,
|
ApplicationDbContext dbContext,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var cars = await dbContext.Cars
|
List<ResponseDto> cars = await dbContext.Cars
|
||||||
.Select(x => new Response(x.Id.Value, x.Name))
|
.Select(x => new ResponseDto(x.Id.Value, x.Name))
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
return TypedResults.Ok(cars);
|
var response = new ApiResponse
|
||||||
|
{
|
||||||
|
Cars = cars
|
||||||
|
};
|
||||||
|
return TypedResults.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ public static class DependencyInjectionExtensions
|
|||||||
.TrimStart('.');
|
.TrimStart('.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fullClassName = fullClassName.Replace('+', '_');
|
||||||
return fullClassName;
|
return fullClassName;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,27 +1,53 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.AspNetCore.Http.HttpResults;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Vegasco.WebApi.Persistence;
|
using Vegasco.WebApi.Persistence;
|
||||||
|
|
||||||
namespace Vegasco.WebApi.Consumptions;
|
namespace Vegasco.WebApi.Consumptions;
|
||||||
|
|
||||||
public static class GetConsumptions
|
public static class GetConsumptions
|
||||||
{
|
{
|
||||||
public record Response(Guid Id, DateTimeOffset DateTime, double Distance, double Amount, bool IgnoreInCalculation, Guid CarId);
|
public class ApiResponse
|
||||||
|
{
|
||||||
|
public IEnumerable<ResponseDto> Consumptions { get; set; } = [];
|
||||||
|
}
|
||||||
|
|
||||||
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
public record ResponseDto(
|
||||||
{
|
Guid Id,
|
||||||
return builder
|
DateTimeOffset DateTime,
|
||||||
.MapGet("consumptions", Endpoint)
|
double Distance,
|
||||||
.WithTags("Consumptions");
|
double Amount,
|
||||||
}
|
bool IgnoreInCalculation,
|
||||||
|
Guid CarId);
|
||||||
|
|
||||||
private static async Task<IResult> Endpoint(
|
public class Request
|
||||||
ApplicationDbContext dbContext,
|
{
|
||||||
CancellationToken cancellationToken)
|
[FromQuery(Name = "page")] public int? Page { get; set; }
|
||||||
{
|
[FromQuery(Name = "pageSize")] public int? PageSize { get; set; }
|
||||||
var consumptions = await dbContext.Consumptions
|
}
|
||||||
.Select(x => new Response(x.Id.Value, x.DateTime, x.Distance, x.Amount, x.IgnoreInCalculation, x.CarId.Value))
|
|
||||||
.ToListAsync(cancellationToken);
|
|
||||||
|
|
||||||
return TypedResults.Ok(consumptions);
|
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
}
|
{
|
||||||
|
return builder
|
||||||
|
.MapGet("consumptions", Endpoint)
|
||||||
|
.WithDescription("Returns all consumption entries")
|
||||||
|
.WithTags("Consumptions");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task<Ok<ApiResponse>> Endpoint(
|
||||||
|
[AsParameters] Request request,
|
||||||
|
ApplicationDbContext dbContext,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
List<ResponseDto> consumptions = await dbContext.Consumptions
|
||||||
|
.Select(x =>
|
||||||
|
new ResponseDto(x.Id.Value, x.DateTime, x.Distance, x.Amount, x.IgnoreInCalculation, x.CarId.Value))
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
|
var apiResponse = new ApiResponse
|
||||||
|
{
|
||||||
|
Consumptions = consumptions
|
||||||
|
};
|
||||||
|
return TypedResults.Ok(apiResponse);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -23,12 +23,12 @@ public class GetCarsTests : IAsyncLifetime
|
|||||||
// Arrange
|
// Arrange
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var response = await _factory.HttpClient.GetAsync("v1/cars");
|
using HttpResponseMessage response = await _factory.HttpClient.GetAsync("v1/cars");
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
||||||
var cars = await response.Content.ReadFromJsonAsync<IEnumerable<GetCars.Response>>();
|
var apiResponse = await response.Content.ReadFromJsonAsync<GetCars.ApiResponse>();
|
||||||
cars.Should().BeEmpty();
|
apiResponse!.Cars.Should().BeEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@@ -40,8 +40,8 @@ public class GetCarsTests : IAsyncLifetime
|
|||||||
const int numberOfCars = 5;
|
const int numberOfCars = 5;
|
||||||
for (var i = 0; i < numberOfCars; i++)
|
for (var i = 0; i < numberOfCars; i++)
|
||||||
{
|
{
|
||||||
var createCarRequest = _carFaker.CreateCarRequest();
|
CreateCar.Request createCarRequest = _carFaker.CreateCarRequest();
|
||||||
var createCarResponse = await _factory.HttpClient.PostAsJsonAsync("v1/cars", createCarRequest);
|
HttpResponseMessage createCarResponse = await _factory.HttpClient.PostAsJsonAsync("v1/cars", createCarRequest);
|
||||||
createCarResponse.EnsureSuccessStatusCode();
|
createCarResponse.EnsureSuccessStatusCode();
|
||||||
|
|
||||||
var createdCar = await createCarResponse.Content.ReadFromJsonAsync<CreateCar.Response>();
|
var createdCar = await createCarResponse.Content.ReadFromJsonAsync<CreateCar.Response>();
|
||||||
@@ -49,12 +49,12 @@ public class GetCarsTests : IAsyncLifetime
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var response = await _factory.HttpClient.GetAsync("v1/cars");
|
using HttpResponseMessage response = await _factory.HttpClient.GetAsync("v1/cars");
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
||||||
var cars = await response.Content.ReadFromJsonAsync<IEnumerable<GetCars.Response>>();
|
var apiResponse = await response.Content.ReadFromJsonAsync<GetCars.ApiResponse>();
|
||||||
cars.Should().BeEquivalentTo(createdCars);
|
apiResponse!.Cars.Should().BeEquivalentTo(createdCars);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task InitializeAsync() => Task.CompletedTask;
|
public Task InitializeAsync() => Task.CompletedTask;
|
||||||
|
|||||||
@@ -42,8 +42,8 @@ public class GetConsumptionsTests : IAsyncLifetime
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
||||||
var consumptions = await response.Content.ReadFromJsonAsync<List<GetConsumptions.Response>>();
|
var apiResponse = await response.Content.ReadFromJsonAsync<GetConsumptions.ApiResponse>();
|
||||||
consumptions.Should().BeEquivalentTo(createdConsumptions);
|
apiResponse!.Consumptions.Should().BeEquivalentTo(createdConsumptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@@ -56,8 +56,8 @@ public class GetConsumptionsTests : IAsyncLifetime
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
||||||
var consumptions = await response.Content.ReadFromJsonAsync<List<GetConsumptions.Response>>();
|
var apiResponse = await response.Content.ReadFromJsonAsync<GetConsumptions.ApiResponse>();
|
||||||
consumptions.Should().BeEmpty();
|
apiResponse!.Consumptions.Should().BeEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<CreateConsumption.Response> CreateConsumptionAsync()
|
private async Task<CreateConsumption.Response> CreateConsumptionAsync()
|
||||||
|
|||||||
Reference in New Issue
Block a user