Files
Elternbeirat/Elternbeirat.Web.Tests/PocketBaseClientTests.cs
T

101 lines
3.2 KiB
C#

using Elternbeirat.PocketBase;
namespace Elternbeirat.Web.Tests;
/// <summary>
/// Tests the <see cref="PocketBaseClient"/> against a throwaway PocketBase container
/// with a known seed (see <see cref="PocketBaseFixture"/>). Because the data is fixed,
/// the tests assert on exact values, and they need no network to the live instance.
/// </summary>
[Collection(PocketBaseTestGroup.Name)]
public sealed class PocketBaseClientTests(PocketBaseFixture pocketBase)
{
[Fact]
public async Task Events_load_sorted_by_start()
{
var client = pocketBase.CreateClient();
var events = await client.GetEventsAsync();
// Two seeded events, earliest start first.
events.Select(e => e.Title).ShouldBe(["Elternbeiratssitzung", "Herbstbasar"]);
events.ShouldAllBe(e => e.Public);
}
[Fact]
public async Task Event_time_is_read_as_wall_clock_not_shifted()
{
var client = pocketBase.CreateClient();
var events = await client.GetEventsAsync();
// The meeting is seeded as 19:30; by the timezone convention the number is
// taken at face value, so no shift to 20:30/21:30 happens.
var meeting = events.FirstOrDefault(e =>
e.Title.Contains("Elternbeiratssitzung", StringComparison.Ordinal));
meeting.ShouldNotBeNull();
meeting.Start.Hour.ShouldBe(19);
meeting.Start.Minute.ShouldBe(30);
meeting.Start.Kind.ShouldBe(DateTimeKind.Unspecified);
}
[Fact]
public async Task Event_without_end_maps_to_null()
{
var client = pocketBase.CreateClient();
var events = await client.GetEventsAsync();
var meeting = events.Single(e => e.Title == "Elternbeiratssitzung");
var basar = events.Single(e => e.Title == "Herbstbasar");
meeting.End.ShouldBeNull(); // no end seeded
basar.End.ShouldNotBeNull(); // end seeded
}
[Fact]
public async Task Posts_load_newest_first()
{
var client = pocketBase.CreateClient();
var posts = await client.GetPostsAsync();
// Sorted by -date: March before January.
posts.Select(p => p.Title).ShouldBe(["Neuer Vorstand", "Neue Sporthalle"]);
}
[Fact]
public async Task Pages_exclude_non_public_records()
{
var client = pocketBase.CreateClient();
var pages = await client.GetPagesAsync();
// Three pages seeded, one with public=false; the draft must be filtered out.
pages.Select(p => p.Slug).ShouldBe(["home", "contact"]);
pages.ShouldNotContain(p => p.Slug == "draft");
}
[Fact]
public async Task Page_embed_is_read_as_list()
{
var client = pocketBase.CreateClient();
var pages = await client.GetPagesAsync();
var home = pages.Single(p => p.Slug == "home");
home.Embed.ShouldBe(["posts", "events"], ignoreOrder: true);
home.Location.ShouldBe("header");
}
[Fact]
public async Task Faqs_load_from_instance()
{
var client = pocketBase.CreateClient();
var faqs = await client.GetFaqsAsync();
faqs.Select(f => f.Topic).ShouldBe(["mensa", "schliessfach"], ignoreOrder: true);
faqs.ShouldAllBe(f => !string.IsNullOrWhiteSpace(f.Question));
}
}