using TeleWave.Domain.Broadcast; using Xunit; namespace TeleWave.Domain.Tests.Broadcast; public class ChannelTests { private static readonly DateTimeOffset Epoch = new(2026, 1, 1, 0, 0, 0, TimeSpan.Zero); private static Channel NewChannel() => Channel.Create("News", "news", Epoch); [Fact] public void Create_SetsDefaults_AndSeedsDefaultBumperTemplate() { var channel = NewChannel(); Assert.NotEqual(Guid.Empty, channel.Id); Assert.Equal("News", channel.Name); Assert.Equal("news", channel.Slug); Assert.True(channel.IsEnabled); Assert.Equal(Epoch, channel.EpochUtc); Assert.Equal(AdInsertion.BetweenBlocks, channel.AdInsertion); Assert.False(channel.BumpersEnabled); Assert.Equal(BumperSelection.Rotation, channel.BumperSelection); Assert.Equal(1.0, channel.BumperShowChangeChance); Assert.Equal(1.0, channel.BumperEpisodeChangeChance); var template = Assert.Single(channel.BumperTemplates); Assert.True(template.IsDefault); Assert.Equal(0, template.Position); Assert.Single(template.Variants); // дефолтный подблок } [Fact] public void UpdateSettings_ChangesFields() { var channel = NewChannel(); var filler = Guid.NewGuid(); channel.UpdateSettings("N2", false, AdInsertion.BetweenEpisodes, 4, true, filler); Assert.Equal("N2", channel.Name); Assert.False(channel.IsEnabled); Assert.Equal(AdInsertion.BetweenEpisodes, channel.AdInsertion); Assert.Equal(4, channel.AdsPerBreak); Assert.True(channel.BumpersEnabled); Assert.Equal(filler, channel.FillerAssetId); } [Theory] [InlineData(-1, 2.0, -5.0, 1.0, 0.0)] [InlineData(30, 0.3, 0.9, 0.3, 0.9)] public void UpdateBumperSettings_ClampsChancesAndInterval( int interval, double show, double episode, double expectedShow, double expectedEpisode ) { var channel = NewChannel(); channel.UpdateBumperSettings( BumperFont.Serif, interval, BumperSelection.WeightedRandom, show, episode ); Assert.Equal(BumperFont.Serif, channel.BumperFont); Assert.Equal(Math.Max(0, interval), channel.BumperMinIntervalMinutes); Assert.Equal(BumperSelection.WeightedRandom, channel.BumperSelection); Assert.Equal(expectedShow, channel.BumperShowChangeChance); Assert.Equal(expectedEpisode, channel.BumperEpisodeChangeChance); } [Fact] public void AddBumperTemplate_AppendsWithNextPosition() { var channel = NewChannel(); var t1 = channel.AddBumperTemplate("Block 2"); var t2 = channel.AddBumperTemplate("Block 3"); Assert.Equal(1, t1.Position); Assert.Equal(2, t2.Position); Assert.False(t1.IsDefault); Assert.Equal(3, channel.BumperTemplates.Count); Assert.Equal(t1, channel.FindBumperTemplate(t1.Id)); Assert.Null(channel.FindBumperTemplate(Guid.NewGuid())); } [Fact] public void RemoveBumperTemplate_CannotRemoveDefault_CanRemoveOthers() { var channel = NewChannel(); var def = channel.BumperTemplates[0]; var extra = channel.AddBumperTemplate("Block 2"); Assert.False(channel.RemoveBumperTemplate(def.Id)); Assert.True(channel.RemoveBumperTemplate(extra.Id)); Assert.False(channel.RemoveBumperTemplate(Guid.NewGuid())); Assert.Single(channel.BumperTemplates); } [Fact] public void Shows_AddFindRemoveHas() { var channel = NewChannel(); var showId = Guid.NewGuid(); var cs = channel.AddShow(showId, 5, BlockMode.Count, 3); Assert.Equal(showId, cs.ShowId); Assert.Equal(5, cs.Weight); Assert.True(channel.HasShow(showId)); Assert.Equal(cs, channel.FindShow(cs.Id)); Assert.True(channel.RemoveShow(cs.Id)); Assert.False(channel.RemoveShow(cs.Id)); Assert.False(channel.HasShow(showId)); } [Fact] public void Ads_AppendWithPosition_AndRemove() { var channel = NewChannel(); var a1 = channel.AddAd(Guid.NewGuid()); var a2 = channel.AddAd(Guid.NewGuid()); Assert.Equal(0, a1.Position); Assert.Equal(1, a2.Position); Assert.True(channel.HasAd(a1.MediaAssetId)); Assert.True(channel.RemoveAd(a1.Id)); Assert.False(channel.RemoveAd(a1.Id)); } [Fact] public void AddOverride_OneTime_AndWeekly() { var channel = NewChannel(); var one = channel.AddOverride(OverrideMode.Exclusive, Epoch, Epoch.AddHours(2)); Assert.Equal(OverrideRecurrence.OneTime, one.Recurrence); Assert.Equal(Epoch, one.StartsAtUtc); var weekly = channel.AddWeeklyOverride(OverrideMode.Boost, 6, 600, 720); Assert.Equal(OverrideRecurrence.Weekly, weekly.Recurrence); Assert.Equal(6, weekly.DayOfWeek); Assert.Equal(600, weekly.StartMinute); Assert.Equal(2, channel.Overrides.Count); Assert.True(channel.RemoveOverride(one.Id)); Assert.False(channel.RemoveOverride(Guid.NewGuid())); } [Fact] public void Cursors_AreMovedBySetters() { var channel = NewChannel(); channel.SetNextAdIndex(7); channel.SetNextBumperIndex(3); Assert.Equal(7, channel.NextAdIndex); Assert.Equal(3, channel.NextBumperIndex); } }