diff --git a/tests/SIGCM2.Api.Tests/Json/DateOnlyJsonConverterTests.cs b/tests/SIGCM2.Api.Tests/Json/DateOnlyJsonConverterTests.cs new file mode 100644 index 0000000..51fb8bd --- /dev/null +++ b/tests/SIGCM2.Api.Tests/Json/DateOnlyJsonConverterTests.cs @@ -0,0 +1,54 @@ +using System.Text.Json; +using FluentAssertions; +using SIGCM2.Api.Json; + +namespace SIGCM2.Api.Tests.Json; + +/// +/// UDT-011 T300.30 — Unit tests for DateOnlyJsonConverter. +/// Verifies round-trip serialization as "yyyy-MM-dd" ISO string. +/// No DB, no HTTP. +/// +public sealed class DateOnlyJsonConverterTests +{ + private readonly JsonSerializerOptions _options = new() + { + Converters = { new DateOnlyJsonConverter() } + }; + + /// [REQ-BE-JSON-001] DateOnly serializes as "yyyy-MM-dd" string. + [Fact] + public void Serialize_DateOnly_WritesYyyyMmDdString() + { + var date = new DateOnly(2026, 5, 1); + var json = JsonSerializer.Serialize(date, _options); + json.Should().Be("\"2026-05-01\""); + } + + /// [REQ-BE-JSON-002] "yyyy-MM-dd" string deserializes back to DateOnly. + [Fact] + public void Deserialize_YyyyMmDdString_ReturnsDateOnly() + { + var json = "\"2026-05-01\""; + var date = JsonSerializer.Deserialize(json, _options); + date.Should().Be(new DateOnly(2026, 5, 1)); + } + + /// [REQ-BE-JSON-003] Invalid date format (dd/MM/yyyy) throws on deserialize. + [Fact] + public void Deserialize_InvalidFormat_ThrowsFormatException() + { + var json = "\"01/05/2026\""; // formato dd/MM/yyyy — inválido + var act = () => JsonSerializer.Deserialize(json, _options); + act.Should().Throw(); + } + + /// JSON null is not valid for non-nullable DateOnly — must throw. + [Fact] + public void Deserialize_Null_ThrowsException() + { + var json = "null"; + var act = () => JsonSerializer.Deserialize(json, _options); + act.Should().Throw(); // JsonException desde GetString() null path + } +}