using System.Net.Http.Json; using FamilyNido.Domain.HouseholdTasks; using FluentAssertions; namespace FamilyNido.Tests.Integration; /// /// Coverage for the manual digest preview endpoint /// (POST /api/notifications/digest/me) — focused on the rule that /// completed-today tasks must NOT appear in the email, while pending-today /// tasks must. /// public sealed class DigestTests : IntegrationTestBase { public DigestTests(IntegrationFixture fixture) : base(fixture) { } [Fact] public async Task Digest_excludes_tasks_that_are_already_completed_for_today() { var handle = await WithDbAsync(db => TestSeed.SeedFamilyAsync(db, Fixture.Factory.Services)); await TestSeed.LoginAsync(Client, "dan@example.com"); var today = DateOnly.FromDateTime(DateTime.UtcNow); await WithDbAsync(async db => { var task = new HouseholdTask { FamilyId = handle.Family.Id, Title = "Recoger el lavavajillas", Category = "Hogar", Recurrence = RecurrenceMode.None, StartDate = today, DueDate = today, IsFloating = false, Points = 3, CreatedByMemberId = handle.Member.Id, }; db.HouseholdTasks.Add(task); await db.SaveChangesAsync(); db.TaskCompletions.Add(new TaskCompletion { TaskId = task.Id, CompletedByMemberId = handle.Member.Id, OccurrenceDate = today, CompletedAt = DateTimeOffset.UtcNow, }); await db.SaveChangesAsync(); }); // The only thing seeded for today is a task that is already done. // The digest must therefore have nothing to report. var resp = await Client.PostAsync("/api/notifications/digest/me", content: null); resp.IsSuccessStatusCode.Should().BeTrue(); var body = await ReadAsync(resp); body!.IsEmpty.Should().BeTrue("a task already completed today should not appear in the digest"); } [Fact] public async Task Digest_includes_tasks_that_are_pending_for_today() { var handle = await WithDbAsync(db => TestSeed.SeedFamilyAsync(db, Fixture.Factory.Services)); await TestSeed.LoginAsync(Client, "dan@example.com"); var today = DateOnly.FromDateTime(DateTime.UtcNow); await WithDbAsync(async db => { db.HouseholdTasks.Add(new HouseholdTask { FamilyId = handle.Family.Id, Title = "Recoger la lavadora", Category = "Hogar", Recurrence = RecurrenceMode.None, StartDate = today, DueDate = today, IsFloating = false, Points = 3, CreatedByMemberId = handle.Member.Id, }); await db.SaveChangesAsync(); }); var resp = await Client.PostAsync("/api/notifications/digest/me", content: null); resp.IsSuccessStatusCode.Should().BeTrue(); var body = await ReadAsync(resp); body!.IsEmpty.Should().BeFalse("a pending task for today should be reported"); } private sealed record DigestResponse(string Email, bool IsEmpty); }