using Elternbeirat.Contracts; using Elternbeirat.Web.Features.Events; using Elternbeirat.Web.Shared; namespace Elternbeirat.Web.Tests; /// /// Unit tests for the "what is coming up?" rule and the Berlin day behind it. Pure /// logic, no PocketBase needed. /// public class UpcomingEventsTests { private static Event Event(string title, DateTime start) => new() { Id = "test", Title = title, Start = start }; [Fact] public void Keeps_today_and_later_ordered_by_start() { var events = new[] { Event("Basar", new DateTime(2026, 11, 22, 9, 0, 0)), Event("Gestern", new DateTime(2026, 9, 30, 19, 30, 0)), Event("Heute früh", new DateTime(2026, 10, 1, 7, 0, 0)), // already begun, still today Event("Sitzung", new DateTime(2026, 10, 8, 19, 30, 0)), }; var upcoming = UpcomingEvents.From(events, new DateOnly(2026, 10, 1)); upcoming.Select(@event => @event.Title).ShouldBe(["Heute früh", "Sitzung", "Basar"]); } [Fact] public void Nothing_upcoming_gives_an_empty_list() => UpcomingEvents.From([Event("Vorbei", new DateTime(2026, 1, 1))], new DateOnly(2026, 10, 1)) .ShouldBeEmpty(); [Fact] public void Berlin_day_starts_before_the_UTC_day() { // 22:30 UTC on 30 September is 00:30 on 1 October in Berlin (summer time). var time = new FixedTimeProvider(new DateTimeOffset(2026, 9, 30, 22, 30, 0, TimeSpan.Zero)); BerlinClock.Today(time).ShouldBe(new DateOnly(2026, 10, 1)); } }