101 lines
3.2 KiB
C#
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));
|
|
}
|
|
}
|