using System; using Xunit; using ytLive.Models; namespace ytLive.Tests; /// The quiet-by-default rule: watch hours only during a live stream (Analytics is a daily /// figure and test/record sessions have no public audience), subscribers whenever the app is /// working, and silence when idle. public class ScoreboardCadenceTests { [Fact] public void Analytics_polls_only_when_live_and_subscribers_poll_during_any_session() { var now = new DateTime(2026, 10, 30, 12, 0, 0, DateTimeKind.Utc); var old = now.AddHours(-2); // Idle: silent, even if everything is stale. Assert.Equal(ScoreboardPoll.None, ScoreboardCadence.Due(SessionPhase.Idle, old, old, now)); // Live with stale figures: both. Assert.Equal(ScoreboardPoll.Both, ScoreboardCadence.Due(SessionPhase.Live, old, old, now)); // Test / recording: subscribers only — no public audience, so no analytics. Assert.Equal(ScoreboardPoll.SubscribersOnly, ScoreboardCadence.Due(SessionPhase.Test, old, old, now)); Assert.Equal(ScoreboardPoll.SubscribersOnly, ScoreboardCadence.Due(SessionPhase.Recording, old, old, now)); // Fresh figures: nothing is due. Assert.Equal(ScoreboardPoll.None, ScoreboardCadence.Due(SessionPhase.Live, now, now, now)); // Analytics alone never polls (it is not a kind the poller knows). Assert.Equal(ScoreboardPoll.None, ScoreboardCadence.Due(SessionPhase.Live, old, now.AddSeconds(-10), now)); // The master switch beats every other rule: off means silent, whatever the session is. Assert.Equal(ScoreboardPoll.None, ScoreboardCadence.Due(SessionPhase.Live, old, old, now, enabled: false)); Assert.Equal(ScoreboardPoll.None, ScoreboardCadence.Due(SessionPhase.Test, old, old, now, enabled: false)); Assert.Equal(ScoreboardPoll.None, ScoreboardCadence.Due(SessionPhase.Recording, old, old, now, enabled: false)); // Subscribers alone mid-window. Assert.Equal(ScoreboardPoll.SubscribersOnly, ScoreboardCadence.Due(SessionPhase.Live, now, old, now)); } }