diff --git a/HANDOFF.md b/HANDOFF.md index b678930..867081f 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,24 +1,23 @@ -# HANDOFF — 2026-11-02 (current-launch Logs tab) +# HANDOFF — 2026-11-02 (test failure follow-up) ## State -- `main`; scene-local ticker commit `20f0594` is local, not pushed. -- Logs tab work is in progress: non-edit panel has Live Chat first/default and Logs second. Logs - reads only the process-local AppLog buffer (newest 500, newest first); file logging and rotation - remain unchanged, and prior-launch file contents are not loaded. -- The Logs-panel integration test passes; clean app build is 0 warnings and scope check passes. +- `main`; Logs tabs committed as `9fa06c6`, local and not pushed. +- First test-failure task: `ChannelStatsServiceTests` now uses dates relative to UTC so the 90-day + upload assertion does not expire with the calendar. Focused test passes. +- Clean app build is 0 warnings. Full suite: 12 failed / 510 passed of 522; the remaining UI/content + failures are being handled one task and one local commit at a time. ## Next action -Run the declared-scope verification and commit the Logs-tab unit. Then resolve the outstanding -UI/content test failures one issue at a time, with a separate local commit for each resolved task. -Do not push absent a milestone/checkpoint request. +Commit the date-relative YPP test fix, then take the next remaining failure. Do not push absent a +milestone/checkpoint request. ## Landmines - Build/test with Windows `dotnet.exe`; the full suite can hang in WASAPI teardown. -- Full suite after Logs changes: 13 failed / 509 passed of 522; the same UI/content failures remain - (none in Logs or ticker tests). They are the next queued work, not to be masked or added here. +- `verify.sh` cannot pass until the remaining 12 suite failures are resolved; scope checks are run + separately when that gate exits early. - Any integration test constructing `MainWindow` must set `LayoutPathOverride` to a temporary DB - and clear it in `finally`; AppLog path overrides are also process-wide and are serialized here. + and clear it in `finally`. - Bundled FFmpeg stays outside the single-file exe (`ExcludeFromSingleFile="true"`). diff --git a/ytLive.Tests/ChannelStatsServiceTests.cs b/ytLive.Tests/ChannelStatsServiceTests.cs index a9268ca..5206727 100644 --- a/ytLive.Tests/ChannelStatsServiceTests.cs +++ b/ytLive.Tests/ChannelStatsServiceTests.cs @@ -40,6 +40,9 @@ public class ChannelStatsServiceTests [Fact] public async Task CaptureCurrent_RequestsNoAuditDetails_AndStillParsesTheSnapshot() { + var recentUpload = DateTime.UtcNow.AddDays(-10).ToString("O"); + var olderUpload = DateTime.UtcNow.AddDays(-80).ToString("O"); + var outsideWindow = DateTime.UtcNow.AddDays(-100).ToString("O"); var auth = new YouTubeAuthService("test-client", "test-secret"); auth.SetSession(new Models.YouTubeChannel { @@ -55,11 +58,11 @@ public class ChannelStatsServiceTests {"items":[{"id":"UC-1","statistics":{"subscriberCount":"350","viewCount":"12345","videoCount":"42"}, "contentDetails":{"relatedPlaylists":{"uploads":"UPL"}}}]} """ - : """ + : $$$$""" {"items":[ - {"snippet":{"publishedAt":"2026-08-01T00:00:00Z"}}, - {"snippet":{"publishedAt":"2026-09-01T00:00:00Z"}}, - {"snippet":{"publishedAt":"2025-01-01T00:00:00Z"}} + {"snippet":{"publishedAt":"{{{{recentUpload}}}}"}}, + {"snippet":{"publishedAt":"{{{{olderUpload}}}}"}}, + {"snippet":{"publishedAt":"{{{{outsideWindow}}}}"}} ]} """, }; @@ -81,4 +84,4 @@ public class ChannelStatsServiceTests Assert.Equal(2, snapshot.UploadsLast90Days); Assert.False(DateTime.UtcNow - snapshot.CapturedAtUtc > TimeSpan.FromMinutes(1)); } -} \ No newline at end of file +}