WatermarkResponseModel gains ImageSource so a client can identify logo-driven presets generically instead of matching a user-editable name. Additive under the frozen-additive /api/v1 contract (#286). Adding a positional record parameter is source-breaking for existing constructor call sites, so the two test files that built the DTO positionally are updated. WatermarkHandlerTests now seeds its two rows with DIFFERENT image sources so the round-trip assertion proves the field is actually carried through the mapper rather than matching a constant on both. Regenerated v1.json, endpoint-index.md and v1.d.ts; check:api clean. Stripped the inherited UTF-8 BOM from Mapper.cs (#311 fix-as-you-touch). Refs #67
77 lines
2.5 KiB
C#
77 lines
2.5 KiB
C#
using ErsatzTV.Application.Watermarks;
|
|
using ErsatzTV.Core.Api.Watermarks;
|
|
using ErsatzTV.Core.Domain;
|
|
using ErsatzTV.FFmpeg.State;
|
|
using ErsatzTV.Infrastructure.Data;
|
|
using ErsatzTV.Tests.Support;
|
|
using NUnit.Framework;
|
|
using Shouldly;
|
|
|
|
namespace ErsatzTV.Tests.Application.Watermarks;
|
|
|
|
[TestFixture]
|
|
public class WatermarkHandlerTests
|
|
{
|
|
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 GetAllWatermarksForApi_Should_Return_All_Watermarks()
|
|
{
|
|
await SeedWatermark(1, "Bug");
|
|
await SeedWatermark(2, "Logo", ChannelWatermarkImageSource.ChannelLogo);
|
|
|
|
var handler = new GetAllWatermarksForApiHandler(_db.Factory);
|
|
|
|
List<WatermarkResponseModel> result =
|
|
await handler.Handle(new GetAllWatermarksForApi(), CancellationToken.None);
|
|
|
|
result.Count.ShouldBe(2);
|
|
// Distinct image sources so the assertion proves ImageSource is actually carried through
|
|
// the mapper, rather than matching a constant on both rows.
|
|
result.ShouldContain(new WatermarkResponseModel(1, "Bug", ChannelWatermarkImageSource.Custom));
|
|
result.ShouldContain(new WatermarkResponseModel(2, "Logo", ChannelWatermarkImageSource.ChannelLogo));
|
|
}
|
|
|
|
[Test]
|
|
public async Task GetAllWatermarksForApi_Should_Return_Empty_List_When_None_Exist()
|
|
{
|
|
var handler = new GetAllWatermarksForApiHandler(_db.Factory);
|
|
|
|
List<WatermarkResponseModel> result =
|
|
await handler.Handle(new GetAllWatermarksForApi(), CancellationToken.None);
|
|
|
|
result.ShouldBeEmpty();
|
|
}
|
|
|
|
private async Task SeedWatermark(
|
|
int id,
|
|
string name,
|
|
ChannelWatermarkImageSource imageSource = ChannelWatermarkImageSource.Custom)
|
|
{
|
|
await using TvContext context = _db.CreateContext();
|
|
context.ChannelWatermarks.Add(new ChannelWatermark
|
|
{
|
|
Id = id,
|
|
Name = name,
|
|
Mode = ChannelWatermarkMode.Permanent,
|
|
ImageSource = imageSource,
|
|
Image = "watermark.png",
|
|
Location = WatermarkLocation.BottomRight,
|
|
Size = WatermarkSize.Scaled,
|
|
WidthPercent = 10,
|
|
HorizontalMarginPercent = 2,
|
|
VerticalMarginPercent = 2,
|
|
FrequencyMinutes = 15,
|
|
DurationSeconds = 30,
|
|
Opacity = 100
|
|
});
|
|
await context.SaveChangesAsync();
|
|
}
|
|
}
|