From 7e4a096f246ee151752ff8b9ccd7204f5bd49b35 Mon Sep 17 00:00:00 2001 From: dmolinari Date: Sat, 18 Apr 2026 09:43:28 -0300 Subject: [PATCH] test(udt-011): TimeProvider Argentina extension tests with FakeTimeProvider (Red) --- .../TimeProviderArgentinaExtensionsTests.cs | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tests/SIGCM2.Application.Tests/Common/TimeProviderArgentinaExtensionsTests.cs diff --git a/tests/SIGCM2.Application.Tests/Common/TimeProviderArgentinaExtensionsTests.cs b/tests/SIGCM2.Application.Tests/Common/TimeProviderArgentinaExtensionsTests.cs new file mode 100644 index 0000000..8fb8261 --- /dev/null +++ b/tests/SIGCM2.Application.Tests/Common/TimeProviderArgentinaExtensionsTests.cs @@ -0,0 +1,77 @@ +using FluentAssertions; +using Microsoft.Extensions.Time.Testing; +using SIGCM2.Application.Common; + +namespace SIGCM2.Application.Tests.Common; + +/// +/// SUITE-BE-CLOCK — UDT-011 T300.10 +/// Unit tests for TimeProviderArgentinaExtensions.GetArgentinaToday. +/// Uses FakeTimeProvider for deterministic UTC control. +/// +public sealed class TimeProviderArgentinaExtensionsTests +{ + /// + /// 22:30 ART del 30/04 = 01:30 UTC del 01/05. + /// UTC lleva al día siguiente, ART debe ser el día anterior. + /// + [Fact] + public void GetArgentinaToday_A22_30UTCdel01Mayo_Retorna30AbrilArgentina() + { + // 22:30 ART del 30/04 = 01:30 UTC del 01/05 + var fake = new FakeTimeProvider(); + fake.SetUtcNow(new DateTimeOffset(2026, 5, 1, 1, 30, 0, TimeSpan.Zero)); + + var result = fake.GetArgentinaToday(); + + result.Should().Be(new DateOnly(2026, 4, 30)); + } + + /// + /// 00:30 ART del 01/05 = 03:30 UTC del 01/05. + /// Ambos UTC y ART son el mismo día civil. + /// + [Fact] + public void GetArgentinaToday_A00_30ARTdel01Mayo_Retorna01MayoArgentina() + { + // 00:30 ART del 01/05 = 03:30 UTC del 01/05 + var fake = new FakeTimeProvider(); + fake.SetUtcNow(new DateTimeOffset(2026, 5, 1, 3, 30, 0, TimeSpan.Zero)); + + var result = fake.GetArgentinaToday(); + + result.Should().Be(new DateOnly(2026, 5, 1)); + } + + /// + /// Fin de mes en año bisiesto: 22:30 ART del 28/02/2024 = 01:30 UTC del 29/02/2024. + /// UTC cae en día bisiesto 29/02, ART debe devolver 28/02. + /// + [Fact] + public void GetArgentinaToday_BisiestoEnFinDeMesArgentina_RetornaCorrectoAR() + { + // 22:30 ART del 28/02/2024 (año bisiesto) = 01:30 UTC del 29/02/2024 + var fake = new FakeTimeProvider(); + fake.SetUtcNow(new DateTimeOffset(2024, 2, 29, 1, 30, 0, TimeSpan.Zero)); + + var result = fake.GetArgentinaToday(); + + result.Should().Be(new DateOnly(2024, 2, 28)); + } + + /// + /// Cruce de año: 22:30 ART del 31/12/2026 = 01:30 UTC del 01/01/2027. + /// UTC es año nuevo, ART debe ser el 31/12 del año anterior. + /// + [Fact] + public void GetArgentinaToday_FinDeAnio_22_30ARTdel31Dic_Retorna31Dic() + { + // 22:30 ART del 31/12/2026 = 01:30 UTC del 01/01/2027 + var fake = new FakeTimeProvider(); + fake.SetUtcNow(new DateTimeOffset(2027, 1, 1, 1, 30, 0, TimeSpan.Zero)); + + var result = fake.GetArgentinaToday(); + + result.Should().Be(new DateOnly(2026, 12, 31)); + } +}