Files
Verspakketten-API/Lutra/Lutra.API.IntegrationTests/Controllers/SupermarktenControllerTests.cs

158 lines
5.8 KiB
C#

using System.Net;
using System.Net.Http.Json;
using FluentAssertions;
using Lutra.API.IntegrationTests.Infrastructure;
using Lutra.Application.Supermarkten;
using Lutra.Domain.Entities;
namespace Lutra.API.IntegrationTests.Controllers;
public class SupermarktenControllerTests(LutraApiFactory factory)
: IntegrationTestBase(factory)
{
// ── GET /api/supermarkten ─────────────────────────────────────────────────
[Fact]
public async Task Get_ReturnsOk_WithEmptyList_WhenNoDataExists()
{
var response = await Client.GetAsync("/api/supermarkten");
response.StatusCode.Should().Be(HttpStatusCode.OK);
var body = await response.Content.ReadFromJsonAsync<GetSupermarkten.Response>();
body.Should().NotBeNull();
body!.Supermarkten.Should().BeEmpty();
}
[Fact]
public async Task Get_ReturnsSeededSupermarkt()
{
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Albert Heijn",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow
});
var response = await Client.GetAsync("/api/supermarkten");
response.StatusCode.Should().Be(HttpStatusCode.OK);
var body = await response.Content.ReadFromJsonAsync<GetSupermarkten.Response>();
body!.Supermarkten.Should().HaveCount(1);
body.Supermarkten.First().Naam.Should().Be("Albert Heijn");
}
[Fact]
public async Task Get_ReturnsAllSeededSupermarkten()
{
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Albert Heijn",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow
});
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Jumbo",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow
});
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Picnic",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow
});
var response = await Client.GetAsync("/api/supermarkten");
response.StatusCode.Should().Be(HttpStatusCode.OK);
var body = await response.Content.ReadFromJsonAsync<GetSupermarkten.Response>();
body!.Supermarkten.Should().HaveCount(3);
}
// ── GET /api/supermarkten — pagination ────────────────────────────────────
[Fact]
public async Task Get_Pagination_ReturnsCorrectPage()
{
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Albert Heijn",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow
});
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Jumbo",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow
});
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Picnic",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow
});
var response = await Client.GetAsync("/api/supermarkten?skip=1&take=1");
response.StatusCode.Should().Be(HttpStatusCode.OK);
var body = await response.Content.ReadFromJsonAsync<GetSupermarkten.Response>();
body!.Supermarkten.Should().HaveCount(1);
// Handler orders by Naam ascending, so skip=1 skips "Albert Heijn" and returns "Jumbo".
body.Supermarkten.First().Naam.Should().Be("Jumbo");
}
[Fact]
public async Task Get_Pagination_ReturnsEmptyList_WhenSkipExceedsTotalCount()
{
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Albert Heijn",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow
});
var response = await Client.GetAsync("/api/supermarkten?skip=10&take=50");
response.StatusCode.Should().Be(HttpStatusCode.OK);
var body = await response.Content.ReadFromJsonAsync<GetSupermarkten.Response>();
body!.Supermarkten.Should().BeEmpty();
}
// ── GET /api/supermarkten — sorting ───────────────────────────────────────
[Fact]
public async Task Get_ReturnsSupermarkten_OrderedByNaamAscending()
{
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Picnic",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow
});
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Albert Heijn",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow
});
var response = await Client.GetAsync("/api/supermarkten");
response.StatusCode.Should().Be(HttpStatusCode.OK);
var body = await response.Content.ReadFromJsonAsync<GetSupermarkten.Response>();
var namen = body!.Supermarkten.Select(s => s.Naam).ToList();
namen.Should().BeInAscendingOrder();
}
// ── Soft-delete behaviour ─────────────────────────────────────────────────
[Fact]
public async Task Get_DoesNotReturn_SoftDeletedSupermarkt()
{
await SeedAsync(new Supermarkt
{
Id = Guid.NewGuid(), Naam = "Verwijderd",
CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow,
DeletedAt = DateTime.UtcNow
});
var response = await Client.GetAsync("/api/supermarkten");
response.StatusCode.Should().Be(HttpStatusCode.OK);
var body = await response.Content.ReadFromJsonAsync<GetSupermarkten.Response>();
body!.Supermarkten.Should().BeEmpty();
}
}