feat(api): #288 wrap raw VMs, nullable-honest DTOs, search pageNum

24 #nullable enable flips across ErsatzTV.Core/Api; Collection/Schedule/
SmartCollection/Resolution VMs wrapped in ResponseModels (Version now
header-only, SPA-verified); pageNum threaded into GET /api/search.

Refs #288 #197

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 02:08:12 +02:00
co-authored by Claude Opus 4.8
parent 9e2d160884
commit fecf16d3d2
38 changed files with 189 additions and 45 deletions
@@ -54,7 +54,7 @@ public class SmartCollectionControllerTests
var created = result.ShouldBeOfType<CreatedResult>();
created.StatusCode.ShouldBe(201);
created.Location.ShouldBe("/api/smart-collections/7");
created.Value.ShouldBe(vm);
created.Value.ShouldBe(new SmartCollectionResponseModel(7, "Kids", "tag:family"));
}
[Test]
@@ -98,7 +98,8 @@ public class SmartCollectionControllerTests
new UpdateSmartCollectionRequest("Updated", "tag:updated"),
CancellationToken.None);
result.ShouldBeOfType<OkObjectResult>().Value.ShouldBe(vm);
result.ShouldBeOfType<OkObjectResult>().Value
.ShouldBe(new SmartCollectionResponseModel(8, "Updated", "tag:updated"));
await _mediator.Received(1).Send(
Arg.Is<UpdateSmartCollection>(c =>
c.Id == 8 && c.Name == "Updated" && c.Query == "tag:updated"),
@@ -166,7 +167,8 @@ public class SmartCollectionControllerTests
IActionResult result = await _controller.GetById(4, CancellationToken.None);
result.ShouldBeOfType<OkObjectResult>().Value.ShouldBe(vm);
result.ShouldBeOfType<OkObjectResult>().Value
.ShouldBe(new SmartCollectionResponseModel(4, "Kids", "tag:kids"));
}
[Test]