using ErsatzTV.Application.Graphics; using ErsatzTV.Core.Api.Graphics; using ErsatzTV.Core.Domain; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Tests.Support; using NUnit.Framework; using Shouldly; namespace ErsatzTV.Tests.Application.Graphics; [TestFixture] public class GraphicsElementHandlerTests { private InMemoryTvContext _db = null!; [SetUp] public async Task SetUp() => _db = await InMemoryTvContext.CreateAsync(); [TearDown] public async Task TearDown() => await _db.DisposeAsync(); [Test] public async Task GetAllGraphicsElementsForApi_Should_Return_All_Elements() { await SeedElement(1, "watermark.png", GraphicsElementKind.Image, "Custom Watermark"); await SeedElement(2, "clock.png", GraphicsElementKind.Image, string.Empty); var handler = new GetAllGraphicsElementsForApiHandler(_db.Factory); List result = await handler.Handle(new GetAllGraphicsElementsForApi(), CancellationToken.None); result.Count.ShouldBe(2); result.Select(e => e.Id).ShouldBe([1, 2]); } [Test] public async Task GetAllGraphicsElementsForApi_Should_Order_Named_Elements_Before_Unnamed() { // unnamed element's projected Name equals its FileName -> should sort after named elements await SeedElement(1, "aaa.png", GraphicsElementKind.Image, string.Empty); await SeedElement(2, "zzz.png", GraphicsElementKind.Image, "A Custom Name"); var handler = new GetAllGraphicsElementsForApiHandler(_db.Factory); List result = await handler.Handle(new GetAllGraphicsElementsForApi(), CancellationToken.None); result.Count.ShouldBe(2); result[0].Id.ShouldBe(2); result[1].Id.ShouldBe(1); } [Test] public async Task GetAllGraphicsElementsForApi_Should_Return_Empty_List_When_None_Exist() { var handler = new GetAllGraphicsElementsForApiHandler(_db.Factory); List result = await handler.Handle(new GetAllGraphicsElementsForApi(), CancellationToken.None); result.ShouldBeEmpty(); } private async Task SeedElement(int id, string path, GraphicsElementKind kind, string name) { await using TvContext context = _db.CreateContext(); context.GraphicsElements.Add(new GraphicsElement { Id = id, Path = path, Name = name, Kind = kind }); await context.SaveChangesAsync(); } }