using ErsatzTV.Application.Channels; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Graphics; using ErsatzTV.FFmpeg.State; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Tests.Support; using LanguageExt; using Microsoft.EntityFrameworkCore; using NUnit.Framework; using Shouldly; namespace ErsatzTV.Tests.Application.Channels; /// /// #732: the On Now / Next overlay is a default rather than an opt-in, so a channel created after /// that decision gets the built-in element without the operator toggling anything. /// [TestFixture] public class CreateChannelDefaultGraphicsElementTests : ChannelHandlerTestBase { private CreateChannelHandler MakeHandler() => new(Worker, Db.Factory, SearchTargets, RemoteLogoCacher); private async Task SeedBuiltInElement() { await using TvContext context = Db.CreateContext(); var element = new GraphicsElement { Path = $"/templates/text/{GraphicsElementDefaults.OnNowNextFileName}", Kind = GraphicsElementKind.Text }; context.GraphicsElements.Add(element); await context.SaveChangesAsync(); return element.Id; } private async Task> AttachedElementIds(int channelId) { await using TvContext context = Db.CreateContext(); Channel reloaded = await context.Channels .Include(c => c.ChannelGraphicsElements) .SingleAsync(c => c.Id == channelId); return reloaded.ChannelGraphicsElements.Select(x => x.GraphicsElementId).ToList(); } [Test] public async Task Attaches_The_Built_In_Element_To_A_New_Channel() { await SeedFFmpegProfile(); int elementId = await SeedBuiltInElement(); Either result = await MakeHandler().Handle(MakeCreate(), CancellationToken.None); result.IsRight.ShouldBeTrue(); int channelId = result.RightToSeq().Head().ChannelId; (await AttachedElementIds(channelId)).ShouldBe([elementId]); } [Test] public async Task Leaves_An_Hls_Direct_Channel_Alone_Because_Nothing_Can_Render_There() { await SeedFFmpegProfile(); await SeedBuiltInElement(); Either result = await MakeHandler().Handle( MakeCreate(streamingMode: StreamingMode.HttpLiveStreamingDirect), CancellationToken.None); result.IsRight.ShouldBeTrue(); int channelId = result.RightToSeq().Head().ChannelId; (await AttachedElementIds(channelId)).ShouldBeEmpty(); } [Test] public async Task Creates_The_Channel_Even_When_The_Built_In_Element_Does_Not_Exist() { await SeedFFmpegProfile(); Either result = await MakeHandler().Handle(MakeCreate(), CancellationToken.None); result.IsRight.ShouldBeTrue(); int channelId = result.RightToSeq().Head().ChannelId; (await AttachedElementIds(channelId)).ShouldBeEmpty(); } }