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
}
}