From f01ffc6254dfc5e8a6a30f046a0832ad8f1f1438 Mon Sep 17 00:00:00 2001 From: Timothy Date: Thu, 2 Jul 2026 19:50:19 +0200 Subject: [PATCH] test(api): enforce nullable channel now playing schema --- .../OpenApiErrorResponseContractTests.cs | 27 ++++++++++++++++++- ErsatzTV/wwwroot/openapi/v1.json | 9 ++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/ErsatzTV.Tests/Controllers/OpenApiErrorResponseContractTests.cs b/ErsatzTV.Tests/Controllers/OpenApiErrorResponseContractTests.cs index b402dede9..5585cc4f7 100644 --- a/ErsatzTV.Tests/Controllers/OpenApiErrorResponseContractTests.cs +++ b/ErsatzTV.Tests/Controllers/OpenApiErrorResponseContractTests.cs @@ -71,7 +71,32 @@ public class OpenApiErrorResponseContractTests stateProperties.TryGetProperty("channelId", out _).ShouldBeTrue(); stateProperties.TryGetProperty("channelNumber", out _).ShouldBeTrue(); stateProperties.TryGetProperty("onAir", out _).ShouldBeTrue(); - stateProperties.TryGetProperty("nowPlaying", out _).ShouldBeTrue(); + stateProperties.TryGetProperty("nowPlaying", out JsonElement nowPlaying).ShouldBeTrue(); + + JsonElement nowPlayingOneOf = nowPlaying.GetProperty("oneOf"); + nowPlayingOneOf.EnumerateArray().Count().ShouldBe(2); + nowPlayingOneOf.EnumerateArray() + .Any(s => s.TryGetProperty("type", out JsonElement type) && type.GetString() == "null") + .ShouldBeTrue(); + nowPlayingOneOf.EnumerateArray() + .Any(s => s.TryGetProperty("$ref", out JsonElement schemaRef) && + schemaRef.GetString() == "#/components/schemas/ChannelNowPlayingResponseModel") + .ShouldBeTrue(); + + JsonElement nowPlayingProperties = document.RootElement + .GetProperty("components") + .GetProperty("schemas") + .GetProperty("ChannelNowPlayingResponseModel") + .GetProperty("properties"); + + nowPlayingProperties.TryGetProperty("title", out _).ShouldBeTrue(); + nowPlayingProperties.TryGetProperty("startUtc", out JsonElement startUtc).ShouldBeTrue(); + nowPlayingProperties.TryGetProperty("finishUtc", out JsonElement finishUtc).ShouldBeTrue(); + + startUtc.GetProperty("type").GetString().ShouldBe("string"); + startUtc.GetProperty("format").GetString().ShouldBe("date-time"); + finishUtc.GetProperty("type").GetString().ShouldBe("string"); + finishUtc.GetProperty("format").GetString().ShouldBe("date-time"); } [TestCase("/api/channels/{id}", "get", "404")] diff --git a/ErsatzTV/wwwroot/openapi/v1.json b/ErsatzTV/wwwroot/openapi/v1.json index f384422d3..a8393a7cc 100644 --- a/ErsatzTV/wwwroot/openapi/v1.json +++ b/ErsatzTV/wwwroot/openapi/v1.json @@ -3568,7 +3568,14 @@ "type": "boolean" }, "nowPlaying": { - "$ref": "#/components/schemas/ChannelNowPlayingResponseModel" + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/ChannelNowPlayingResponseModel" + } + ] } } },