test(udt-011): T400.40 — update tests for TimeProvider injection and explicit now params

Fix all test compilation errors caused by T400.10/T400.20/T400.30:
- Handler constructors: add TimeProvider.System as last argument
- Domain mutator calls: add DateTime.UtcNow as explicit 'now' argument
- AuditLogger/SecurityEventLogger Build() helpers: add TimeProvider.System
- JwtService test constructors: add TimeProvider.System
Cat2 coverage already present in TimeProviderArgentinaExtensionsTests.cs:
FakeTimeProvider proves GetArgentinaToday() returns ART civil date, not UTC.
This commit is contained in:
2026-04-18 10:12:32 -03:00
parent a9838427a4
commit 9bc191c3ae
35 changed files with 79 additions and 75 deletions

View File

@@ -44,7 +44,7 @@ public class LoginCommandHandlerTests
_handler = new LoginCommandHandler(
_repository, _hasher, _jwtService,
_refreshRepo, _refreshGenerator, _clientCtx, _authOptions,
_rolPermisoRepo, _security, _logger);
_rolPermisoRepo, _security, _logger, TimeProvider.System);
}
// Scenario: valid credentials → returns token response with usuario populated

View File

@@ -13,7 +13,7 @@ public class LogoutCommandHandlerTests
public LogoutCommandHandlerTests()
{
_handler = new LogoutCommandHandler(_refreshRepo, _security);
_handler = new LogoutCommandHandler(_refreshRepo, _security, TimeProvider.System);
}
[Fact]

View File

@@ -36,7 +36,8 @@ public class RefreshCommandHandlerTests
_generator.Generate().Returns("new_raw_token_value_xyz");
_handler = new RefreshCommandHandler(
_refreshRepo, _usuarioRepo, _jwtService, _generator, _clientCtx, _authOptions, _security);
_refreshRepo, _usuarioRepo, _jwtService, _generator, _clientCtx, _authOptions, _security,
TimeProvider.System);
}
// Helper: build an active stored RefreshToken with a matching principal

View File

@@ -95,7 +95,7 @@ public class IngresosBrutosTests
{
var original = MakeIIBB(descripcion: "Original");
var updated = original.WithDescripcion("Actualizado");
var updated = original.WithDescripcion("Actualizado", DateTime.UtcNow);
updated.Should().NotBeSameAs(original);
updated.Descripcion.Should().Be("Actualizado");
@@ -107,7 +107,7 @@ public class IngresosBrutosTests
{
var original = MakeIIBB(activo: true);
var deactivated = original.Deactivate();
var deactivated = original.Deactivate(DateTime.UtcNow);
deactivated.Activo.Should().BeFalse();
deactivated.Alicuota.Should().Be(original.Alicuota);
@@ -119,7 +119,7 @@ public class IngresosBrutosTests
{
var original = MakeIIBB(activo: false);
var reactivated = original.Reactivate();
var reactivated = original.Reactivate(DateTime.UtcNow);
reactivated.Activo.Should().BeTrue();
}
@@ -130,7 +130,7 @@ public class IngresosBrutosTests
var original = MakeIIBB(vigenciaHasta: null);
var hasta = new DateOnly(2026, 5, 31);
var cerrado = original.CerrarVigencia(hasta);
var cerrado = original.CerrarVigencia(hasta, DateTime.UtcNow);
cerrado.VigenciaHasta.Should().Be(hasta);
cerrado.Alicuota.Should().Be(original.Alicuota);
@@ -143,7 +143,7 @@ public class IngresosBrutosTests
{
var predecesora = MakeIIBB(id: 5, alicuota: 2.5m, vigenciaDesde: Desde2020, vigenciaHasta: null);
var (cerrada, nueva) = predecesora.NuevaVersion(3.0m, Desde2026);
var (cerrada, nueva) = predecesora.NuevaVersion(3.0m, Desde2026, DateTime.UtcNow);
cerrada.Id.Should().Be(5);
cerrada.VigenciaHasta.Should().Be(Desde2026.AddDays(-1));
@@ -166,7 +166,7 @@ public class IngresosBrutosTests
vigenciaDesde: Desde2020,
vigenciaHasta: new DateOnly(2025, 12, 31));
var act = () => predecesora.NuevaVersion(4.0m, Desde2026);
var act = () => predecesora.NuevaVersion(4.0m, Desde2026, DateTime.UtcNow);
act.Should().Throw<InvalidOperationException>();
}
@@ -176,7 +176,7 @@ public class IngresosBrutosTests
{
var predecesora = MakeIIBB(vigenciaDesde: Desde2020, vigenciaHasta: null);
var act = () => predecesora.NuevaVersion(4.0m, Desde2020);
var act = () => predecesora.NuevaVersion(4.0m, Desde2020, DateTime.UtcNow);
act.Should().Throw<ArgumentException>()
.WithParameterName("vigenciaDesde");
@@ -187,7 +187,7 @@ public class IngresosBrutosTests
{
var predecesora = MakeIIBB(vigenciaDesde: Desde2020, vigenciaHasta: null);
var act = () => predecesora.NuevaVersion(-1m, Desde2026);
var act = () => predecesora.NuevaVersion(-1m, Desde2026, DateTime.UtcNow);
act.Should().Throw<ArgumentException>()
.WithParameterName("nuevaAlicuota");
@@ -198,7 +198,7 @@ public class IngresosBrutosTests
{
var predecesora = MakeIIBB(vigenciaDesde: Desde2020, vigenciaHasta: null);
var act = () => predecesora.NuevaVersion(101m, Desde2026);
var act = () => predecesora.NuevaVersion(101m, Desde2026, DateTime.UtcNow);
act.Should().Throw<ArgumentException>()
.WithParameterName("nuevaAlicuota");

View File

@@ -150,7 +150,7 @@ public class TipoDeIvaTests
{
var original = MakeTipoDeIva(descripcion: "Original");
var updated = original.WithDescripcion("Nueva descripcion");
var updated = original.WithDescripcion("Nueva descripcion", DateTime.UtcNow);
updated.Should().NotBeSameAs(original);
updated.Descripcion.Should().Be("Nueva descripcion");
@@ -162,7 +162,7 @@ public class TipoDeIvaTests
{
var original = MakeTipoDeIva(codigo: "IVA_21");
var updated = original.WithCodigo("NO_GRAVADO");
var updated = original.WithCodigo("NO_GRAVADO", DateTime.UtcNow);
updated.Codigo.Should().Be("NO_GRAVADO");
updated.Porcentaje.Should().Be(original.Porcentaje);
@@ -174,7 +174,7 @@ public class TipoDeIvaTests
{
var original = MakeTipoDeIva(aplicaIVA: true);
var updated = original.WithAplicaIVA(false);
var updated = original.WithAplicaIVA(false, DateTime.UtcNow);
updated.AplicaIVA.Should().BeFalse();
updated.Porcentaje.Should().Be(original.Porcentaje);
@@ -185,7 +185,7 @@ public class TipoDeIvaTests
{
var original = MakeTipoDeIva(activo: true);
var deactivated = original.Deactivate();
var deactivated = original.Deactivate(DateTime.UtcNow);
deactivated.Activo.Should().BeFalse();
deactivated.Porcentaje.Should().Be(original.Porcentaje);
@@ -197,7 +197,7 @@ public class TipoDeIvaTests
{
var original = MakeTipoDeIva(activo: false);
var reactivated = original.Reactivate();
var reactivated = original.Reactivate(DateTime.UtcNow);
reactivated.Activo.Should().BeTrue();
}
@@ -208,7 +208,7 @@ public class TipoDeIvaTests
var original = MakeTipoDeIva(vigenciaHasta: null);
var hasta = new DateOnly(2026, 5, 31);
var cerrado = original.CerrarVigencia(hasta);
var cerrado = original.CerrarVigencia(hasta, DateTime.UtcNow);
cerrado.VigenciaHasta.Should().Be(hasta);
cerrado.Porcentaje.Should().Be(original.Porcentaje);
@@ -222,7 +222,7 @@ public class TipoDeIvaTests
{
var predecesora = MakeTipoDeIva(id: 5, porcentaje: 21m, vigenciaDesde: Desde2020, vigenciaHasta: null);
var (cerrada, nueva) = predecesora.NuevaVersion(23.5m, Desde2026);
var (cerrada, nueva) = predecesora.NuevaVersion(23.5m, Desde2026, DateTime.UtcNow);
cerrada.Id.Should().Be(5);
cerrada.VigenciaHasta.Should().Be(Desde2026.AddDays(-1), "predecesora queda cerrada el día anterior");
@@ -244,7 +244,7 @@ public class TipoDeIvaTests
var predecesora = MakeTipoDeIva(porcentaje: 10.5m, vigenciaDesde: Desde2020);
var nuevaVigencia = new DateOnly(2025, 1, 1);
var (_, nueva) = predecesora.NuevaVersion(21m, nuevaVigencia);
var (_, nueva) = predecesora.NuevaVersion(21m, nuevaVigencia, DateTime.UtcNow);
nueva.Porcentaje.Should().Be(21m);
predecesora.Porcentaje.Should().Be(10.5m, "predecesora no muta");
@@ -259,7 +259,7 @@ public class TipoDeIvaTests
vigenciaDesde: Desde2020,
vigenciaHasta: new DateOnly(2025, 12, 31)); // ya cerrada
var act = () => predecesora.NuevaVersion(23.5m, Desde2026);
var act = () => predecesora.NuevaVersion(23.5m, Desde2026, DateTime.UtcNow);
act.Should().Throw<InvalidOperationException>();
}
@@ -269,7 +269,7 @@ public class TipoDeIvaTests
{
var predecesora = MakeTipoDeIva(vigenciaDesde: Desde2020, vigenciaHasta: null);
var act = () => predecesora.NuevaVersion(23.5m, Desde2020); // igual a VigenciaDesde predecesora
var act = () => predecesora.NuevaVersion(23.5m, Desde2020, DateTime.UtcNow); // igual a VigenciaDesde predecesora
act.Should().Throw<ArgumentException>()
.WithParameterName("vigenciaDesde");
@@ -281,7 +281,7 @@ public class TipoDeIvaTests
var predecesora = MakeTipoDeIva(vigenciaDesde: Desde2026, vigenciaHasta: null);
var vigenciaAnterior = new DateOnly(2020, 1, 1);
var act = () => predecesora.NuevaVersion(23.5m, vigenciaAnterior);
var act = () => predecesora.NuevaVersion(23.5m, vigenciaAnterior, DateTime.UtcNow);
act.Should().Throw<ArgumentException>()
.WithParameterName("vigenciaDesde");
@@ -292,7 +292,7 @@ public class TipoDeIvaTests
{
var predecesora = MakeTipoDeIva(vigenciaDesde: Desde2020, vigenciaHasta: null);
var act = () => predecesora.NuevaVersion(-1m, Desde2026);
var act = () => predecesora.NuevaVersion(-1m, Desde2026, DateTime.UtcNow);
act.Should().Throw<ArgumentException>()
.WithParameterName("nuevoPorcentaje");
@@ -303,7 +303,7 @@ public class TipoDeIvaTests
{
var predecesora = MakeTipoDeIva(vigenciaDesde: Desde2020, vigenciaHasta: null);
var act = () => predecesora.NuevaVersion(101m, Desde2026);
var act = () => predecesora.NuevaVersion(101m, Desde2026, DateTime.UtcNow);
act.Should().Throw<ArgumentException>()
.WithParameterName("nuevoPorcentaje");
@@ -326,7 +326,7 @@ public class TipoDeIvaTests
{
var original = MakeTipoDeIva(id: 99, porcentaje: 21m, vigenciaDesde: Desde2020);
var updated = original.WithDescripcion("Nueva");
var updated = original.WithDescripcion("Nueva", DateTime.UtcNow);
updated.Id.Should().Be(99);
updated.Porcentaje.Should().Be(21m);

View File

@@ -43,7 +43,7 @@ public class PuntoDeVentaTests
{
var original = MakePdv(id: 10, nombre: "Original");
var updated = original.WithUpdatedProfile(nombre: "Actualizado", numeroAFIP: 7, descripcion: "Desc");
var updated = original.WithUpdatedProfile(nombre: "Actualizado", numeroAFIP: 7, descripcion: "Desc", now: DateTime.UtcNow);
Assert.NotSame(original, updated);
Assert.Equal("Actualizado", updated.Nombre);
@@ -56,7 +56,7 @@ public class PuntoDeVentaTests
{
var original = MakePdv(id: 10, medioId: 5);
var updated = original.WithUpdatedProfile("Nuevo", 2, null);
var updated = original.WithUpdatedProfile("Nuevo", 2, null, DateTime.UtcNow);
Assert.Equal(10, updated.Id);
Assert.Equal(5, updated.MedioId);
@@ -69,7 +69,7 @@ public class PuntoDeVentaTests
{
var original = MakePdv();
var updated = original.WithUpdatedProfile("Nuevo", 2, null);
var updated = original.WithUpdatedProfile("Nuevo", 2, null, DateTime.UtcNow);
Assert.NotNull(updated.FechaModificacion);
}
@@ -81,7 +81,7 @@ public class PuntoDeVentaTests
{
var pdv = MakePdv(activo: true);
var deactivated = pdv.WithActivo(false);
var deactivated = pdv.WithActivo(false, DateTime.UtcNow);
Assert.False(deactivated.Activo);
Assert.NotSame(pdv, deactivated);
@@ -92,7 +92,7 @@ public class PuntoDeVentaTests
{
var pdv = MakePdv(activo: false);
var reactivated = pdv.WithActivo(true);
var reactivated = pdv.WithActivo(true, DateTime.UtcNow);
Assert.True(reactivated.Activo);
}
@@ -102,7 +102,7 @@ public class PuntoDeVentaTests
{
var pdv = MakePdv(id: 99, medioId: 3);
var toggled = pdv.WithActivo(false);
var toggled = pdv.WithActivo(false, DateTime.UtcNow);
Assert.Equal(99, toggled.Id);
Assert.Equal(3, toggled.MedioId);

View File

@@ -101,7 +101,7 @@ public class UsuarioTests
public void WithUpdatedProfile_Returns_NewInstance()
{
var u = MakeUsuario();
var updated = u.WithUpdatedProfile("NuevoNombre", "NuevoApellido", "new@x.com", "cajero", true);
var updated = u.WithUpdatedProfile("NuevoNombre", "NuevoApellido", "new@x.com", "cajero", true, DateTime.UtcNow);
Assert.NotSame(u, updated);
}
@@ -109,7 +109,7 @@ public class UsuarioTests
public void WithUpdatedProfile_Sets_Fields_Correctly()
{
var u = MakeUsuario();
var updated = u.WithUpdatedProfile("Pedro", "Gómez", "p@g.com", "cajero", false);
var updated = u.WithUpdatedProfile("Pedro", "Gómez", "p@g.com", "cajero", false, DateTime.UtcNow);
Assert.Equal("Pedro", updated.Nombre);
Assert.Equal("Gómez", updated.Apellido);
Assert.Equal("p@g.com", updated.Email);
@@ -121,8 +121,9 @@ public class UsuarioTests
public void WithUpdatedProfile_Sets_FechaModificacion_To_UtcNow()
{
var before = DateTime.UtcNow.AddSeconds(-1);
var now = DateTime.UtcNow;
var u = MakeUsuario();
var updated = u.WithUpdatedProfile("A", "B", null, "admin", true);
var updated = u.WithUpdatedProfile("A", "B", null, "admin", true, now);
Assert.NotNull(updated.FechaModificacion);
Assert.True(updated.FechaModificacion >= before);
}
@@ -131,7 +132,7 @@ public class UsuarioTests
public void WithUpdatedProfile_Preserves_Immutable_Fields()
{
var u = MakeUsuario();
var updated = u.WithUpdatedProfile("X", "Y", null, "cajero", true);
var updated = u.WithUpdatedProfile("X", "Y", null, "cajero", true, DateTime.UtcNow);
Assert.Equal(u.Id, updated.Id);
Assert.Equal(u.Username, updated.Username);
Assert.Equal(u.PasswordHash, updated.PasswordHash);
@@ -143,7 +144,7 @@ public class UsuarioTests
public void WithNewPasswordHash_Returns_NewInstance()
{
var u = MakeUsuario();
var updated = u.WithNewPasswordHash("newhash", mustChangePassword: false);
var updated = u.WithNewPasswordHash("newhash", mustChangePassword: false, DateTime.UtcNow);
Assert.NotSame(u, updated);
}
@@ -151,7 +152,7 @@ public class UsuarioTests
public void WithNewPasswordHash_Sets_Hash_And_MustChange()
{
var u = MakeUsuario();
var updated = u.WithNewPasswordHash("newhash", mustChangePassword: true);
var updated = u.WithNewPasswordHash("newhash", mustChangePassword: true, DateTime.UtcNow);
Assert.Equal("newhash", updated.PasswordHash);
Assert.True(updated.MustChangePassword);
}
@@ -160,7 +161,7 @@ public class UsuarioTests
public void WithNewPasswordHash_Clears_MustChange_When_False()
{
var u = MakeUsuario(mustChangePassword: true);
var updated = u.WithNewPasswordHash("hash2", mustChangePassword: false);
var updated = u.WithNewPasswordHash("hash2", mustChangePassword: false, DateTime.UtcNow);
Assert.False(updated.MustChangePassword);
}
@@ -168,8 +169,9 @@ public class UsuarioTests
public void WithNewPasswordHash_Sets_FechaModificacion()
{
var before = DateTime.UtcNow.AddSeconds(-1);
var now = DateTime.UtcNow;
var u = MakeUsuario();
var updated = u.WithNewPasswordHash("hash2", false);
var updated = u.WithNewPasswordHash("hash2", false, now);
Assert.NotNull(updated.FechaModificacion);
Assert.True(updated.FechaModificacion >= before);
}
@@ -208,7 +210,7 @@ public class UsuarioTests
public void WithMustChangePassword_Sets_Value_True()
{
var u = MakeUsuario(mustChangePassword: false);
var updated = u.WithMustChangePassword(true);
var updated = u.WithMustChangePassword(true, DateTime.UtcNow);
Assert.True(updated.MustChangePassword);
}
@@ -216,8 +218,9 @@ public class UsuarioTests
public void WithMustChangePassword_Sets_FechaModificacion()
{
var before = DateTime.UtcNow.AddSeconds(-1);
var now = DateTime.UtcNow;
var u = MakeUsuario();
var updated = u.WithMustChangePassword(true);
var updated = u.WithMustChangePassword(true, now);
Assert.NotNull(updated.FechaModificacion);
Assert.True(updated.FechaModificacion >= before);
}

View File

@@ -22,7 +22,7 @@ public sealed class AuditLoggerTests
repo ??= Substitute.For<IAuditEventRepository>();
options ??= new AuditOptions();
var optsWrapper = Options.Create(options);
return new AuditLogger(context, repo, optsWrapper);
return new AuditLogger(context, repo, optsWrapper, TimeProvider.System);
}
[Fact]

View File

@@ -20,7 +20,7 @@ public sealed class SecurityEventLoggerTests
repo ??= Substitute.For<ISecurityEventRepository>();
context ??= Substitute.For<IAuditContext>();
options ??= new AuditOptions();
return new SecurityEventLogger(repo, context, Options.Create(options));
return new SecurityEventLogger(repo, context, Options.Create(options), TimeProvider.System);
}
[Fact]

View File

@@ -22,7 +22,7 @@ public class JwtServiceTests : IDisposable
Audience = "sigcm2.web",
AccessTokenMinutes = 60
};
_jwtService = new JwtService(_rsa, _options);
_jwtService = new JwtService(_rsa, _options, TimeProvider.System);
}
public void Dispose() => _rsa.Dispose();
@@ -219,7 +219,7 @@ public class JwtServiceTests : IDisposable
// Sign with a different RSA key
using var otherRsa = System.Security.Cryptography.RSA.Create(2048);
var otherOptions = new JwtOptions { Issuer = "sigcm2.api", Audience = "sigcm2.web", AccessTokenMinutes = 60 };
var otherService = new JwtService(otherRsa, otherOptions);
var otherService = new JwtService(otherRsa, otherOptions, TimeProvider.System);
var tokenFromOtherKey = otherService.GenerateAccessToken(MakeUsuario());
// Validating with the correct key should throw

View File

@@ -21,7 +21,7 @@ public class CreateIngresosBrutosCommandHandlerTests
public CreateIngresosBrutosCommandHandlerTests()
{
_handler = new CreateIngresosBrutosCommandHandler(_repo, _audit);
_handler = new CreateIngresosBrutosCommandHandler(_repo, _audit, TimeProvider.System);
_repo.InsertAsync(Arg.Any<IibbEntity>(), Arg.Any<CancellationToken>()).Returns(55);
}

View File

@@ -24,7 +24,7 @@ public class DeactivateIngresosBrutosCommandHandlerTests
public DeactivateIngresosBrutosCommandHandlerTests()
{
_handler = new DeactivateIngresosBrutosCommandHandler(_repo, _audit);
_handler = new DeactivateIngresosBrutosCommandHandler(_repo, _audit, TimeProvider.System);
_repo.GetByIdAsync(1, Arg.Any<CancellationToken>()).Returns(MakeEntity());
_repo.SetActivoAsync(Arg.Any<int>(), Arg.Any<bool>(), Arg.Any<CancellationToken>()).Returns(true);
}

View File

@@ -31,7 +31,7 @@ public class NuevaVersionIngresosBrutosCommandHandlerTests
public NuevaVersionIngresosBrutosCommandHandlerTests()
{
_handler = new NuevaVersionIngresosBrutosCommandHandler(_repo, _audit);
_handler = new NuevaVersionIngresosBrutosCommandHandler(_repo, _audit, TimeProvider.System);
_repo.GetByIdAsync(1, Arg.Any<CancellationToken>()).Returns(MakePredecesora());
_repo.UpdateCierreVigenciaAsync(Arg.Any<int>(), Arg.Any<DateOnly>(), Arg.Any<CancellationToken>()).Returns(true);
_repo.InsertAsync(Arg.Any<IibbEntity>(), Arg.Any<CancellationToken>()).Returns(88);

View File

@@ -24,7 +24,7 @@ public class ReactivateIngresosBrutosCommandHandlerTests
public ReactivateIngresosBrutosCommandHandlerTests()
{
_handler = new ReactivateIngresosBrutosCommandHandler(_repo, _audit);
_handler = new ReactivateIngresosBrutosCommandHandler(_repo, _audit, TimeProvider.System);
_repo.GetByIdAsync(1, Arg.Any<CancellationToken>()).Returns(MakeEntity());
_repo.SetActivoAsync(Arg.Any<int>(), Arg.Any<bool>(), Arg.Any<CancellationToken>()).Returns(true);
}

View File

@@ -27,7 +27,7 @@ public class UpdateIngresosBrutosCommandHandlerTests
public UpdateIngresosBrutosCommandHandlerTests()
{
_handler = new UpdateIngresosBrutosCommandHandler(_repo, _audit);
_handler = new UpdateIngresosBrutosCommandHandler(_repo, _audit, TimeProvider.System);
_repo.GetByIdAsync(1, Arg.Any<CancellationToken>()).Returns(MakeEntity());
_repo.UpdateCosmeticoAsync(Arg.Any<int>(), Arg.Any<string>(), Arg.Any<bool>(),
Arg.Any<CancellationToken>()).Returns(true);

View File

@@ -18,7 +18,7 @@ public class DeactivateMedioCommandHandlerTests
public DeactivateMedioCommandHandlerTests()
{
_handler = new DeactivateMedioCommandHandler(_repo, _audit);
_handler = new DeactivateMedioCommandHandler(_repo, _audit, TimeProvider.System);
}
// ── not found → throws ──────────────────────────────────────────────────

View File

@@ -148,7 +148,7 @@ public class MedioRepositoryTests : IAsyncLifetime
var id = await _repository.AddAsync(Medio.ForCreation("UPD01", "Original", TipoMedio.Diario, null));
var original = await _repository.GetByIdAsync(id);
var updated = original!.WithUpdatedProfile("Actualizado", TipoMedio.Radio, 7);
var updated = original!.WithUpdatedProfile("Actualizado", TipoMedio.Radio, 7, DateTime.UtcNow);
await _repository.UpdateAsync(updated);
var result = await _repository.GetByIdAsync(id);
@@ -167,7 +167,7 @@ public class MedioRepositoryTests : IAsyncLifetime
var id = await _repository.AddAsync(Medio.ForCreation("HIST01", "Historial", TipoMedio.Diario, null));
var original = await _repository.GetByIdAsync(id);
var updated = original!.WithUpdatedProfile("Historial v2", TipoMedio.Web, null);
var updated = original!.WithUpdatedProfile("Historial v2", TipoMedio.Web, null, DateTime.UtcNow);
await _repository.UpdateAsync(updated);
var historyCount = await _connection.ExecuteScalarAsync<int>(
@@ -186,7 +186,7 @@ public class MedioRepositoryTests : IAsyncLifetime
// Deactivate second medio
var inact = await _repository.GetByIdAsync(idInact);
await _repository.UpdateAsync(inact!.WithActivo(false));
await _repository.UpdateAsync(inact!.WithActivo(false, DateTime.UtcNow));
var result = await _repository.GetPagedAsync(new(Page: 1, PageSize: 50, Activo: true, Tipo: null, Search: null));

View File

@@ -19,7 +19,7 @@ public class ReactivateMedioCommandHandlerTests
public ReactivateMedioCommandHandlerTests()
{
_handler = new ReactivateMedioCommandHandler(_repo, _audit);
_handler = new ReactivateMedioCommandHandler(_repo, _audit, TimeProvider.System);
}
// ── not found → throws ──────────────────────────────────────────────────

View File

@@ -24,7 +24,7 @@ public class UpdateMedioCommandHandlerTests
public UpdateMedioCommandHandlerTests()
{
_handler = new UpdateMedioCommandHandler(_repo, _audit);
_handler = new UpdateMedioCommandHandler(_repo, _audit, TimeProvider.System);
}
// ── not found → throws ──────────────────────────────────────────────────

View File

@@ -22,7 +22,7 @@ public class DeactivatePuntoDeVentaCommandHandlerTests
public DeactivatePuntoDeVentaCommandHandlerTests()
{
_handler = new DeactivatePuntoDeVentaCommandHandler(_repo, _medioRepo, _audit);
_handler = new DeactivatePuntoDeVentaCommandHandler(_repo, _medioRepo, _audit, TimeProvider.System);
_medioRepo.GetByIdAsync(Arg.Any<int>(), Arg.Any<CancellationToken>()).Returns(MakeMedio(5, true));
}

View File

@@ -23,7 +23,7 @@ public class ReactivatePuntoDeVentaCommandHandlerTests
public ReactivatePuntoDeVentaCommandHandlerTests()
{
_handler = new ReactivatePuntoDeVentaCommandHandler(_repo, _medioRepo, _audit);
_handler = new ReactivatePuntoDeVentaCommandHandler(_repo, _medioRepo, _audit, TimeProvider.System);
_medioRepo.GetByIdAsync(Arg.Any<int>(), Arg.Any<CancellationToken>()).Returns(MakeMedio(5, true));
}

View File

@@ -25,7 +25,7 @@ public class UpdatePuntoDeVentaCommandHandlerTests
public UpdatePuntoDeVentaCommandHandlerTests()
{
_handler = new UpdatePuntoDeVentaCommandHandler(_repo, _medioRepo, _audit);
_handler = new UpdatePuntoDeVentaCommandHandler(_repo, _medioRepo, _audit, TimeProvider.System);
_repo.GetByIdAsync(10, Arg.Any<CancellationToken>()).Returns(MakePdv(10));
_medioRepo.GetByIdAsync(5, Arg.Any<CancellationToken>()).Returns(MakeMedio(5));
_repo.ExistsByNumeroAFIPInMedioAsync(Arg.Any<int>(), Arg.Any<short>(), Arg.Any<int?>(), Arg.Any<CancellationToken>()).Returns(false);

View File

@@ -22,7 +22,7 @@ public class DeactivateSeccionCommandHandlerTests
public DeactivateSeccionCommandHandlerTests()
{
_handler = new DeactivateSeccionCommandHandler(_repo, _medioRepo, _audit);
_handler = new DeactivateSeccionCommandHandler(_repo, _medioRepo, _audit, TimeProvider.System);
// Default: medio is active
_medioRepo.GetByIdAsync(Arg.Any<int>(), Arg.Any<CancellationToken>()).Returns(MakeMedio(1, true));
}

View File

@@ -23,7 +23,7 @@ public class ReactivateSeccionCommandHandlerTests
public ReactivateSeccionCommandHandlerTests()
{
_handler = new ReactivateSeccionCommandHandler(_repo, _medioRepo, _audit);
_handler = new ReactivateSeccionCommandHandler(_repo, _medioRepo, _audit, TimeProvider.System);
// Default: medio is active
_medioRepo.GetByIdAsync(Arg.Any<int>(), Arg.Any<CancellationToken>()).Returns(MakeMedio(1, true));
}

View File

@@ -150,7 +150,7 @@ public class SeccionRepositoryTests : IAsyncLifetime
var id = await _repository.AddAsync(Seccion.ForCreation(_medioId, "UPD01", "Original", "clasificados"));
var original = await _repository.GetByIdAsync(id);
var updated = original!.WithUpdatedProfile("Actualizado", "notables");
var updated = original!.WithUpdatedProfile("Actualizado", "notables", DateTime.UtcNow);
await _repository.UpdateAsync(updated);
var result = await _repository.GetByIdAsync(id);
@@ -168,7 +168,7 @@ public class SeccionRepositoryTests : IAsyncLifetime
var id = await _repository.AddAsync(Seccion.ForCreation(_medioId, "HIST01", "Historial", "clasificados"));
var original = await _repository.GetByIdAsync(id);
var updated = original!.WithUpdatedProfile("Historial v2", "suplementos");
var updated = original!.WithUpdatedProfile("Historial v2", "suplementos", DateTime.UtcNow);
await _repository.UpdateAsync(updated);
var historyCount = await _connection.ExecuteScalarAsync<int>(
@@ -213,7 +213,7 @@ public class SeccionRepositoryTests : IAsyncLifetime
var inactId = await _repository.AddAsync(Seccion.ForCreation(_medioId, "INACT01", "Inactiva", "clasificados"));
var inact = await _repository.GetByIdAsync(inactId);
await _repository.UpdateAsync(inact!.WithActivo(false));
await _repository.UpdateAsync(inact!.WithActivo(false, DateTime.UtcNow));
var result = await _repository.GetPagedAsync(new(Page: 1, PageSize: 50, MedioId: _medioId, Tipo: null, Activo: true, Search: null));

View File

@@ -27,7 +27,7 @@ public class UpdateSeccionCommandHandlerTests
public UpdateSeccionCommandHandlerTests()
{
_handler = new UpdateSeccionCommandHandler(_repo, _medioRepo, _audit);
_handler = new UpdateSeccionCommandHandler(_repo, _medioRepo, _audit, TimeProvider.System);
// Default: medio is active
_medioRepo.GetByIdAsync(Arg.Any<int>(), Arg.Any<CancellationToken>()).Returns(MakeMedio(1, true));
}

View File

@@ -22,7 +22,7 @@ public class CreateTipoDeIvaCommandHandlerTests
public CreateTipoDeIvaCommandHandlerTests()
{
_handler = new CreateTipoDeIvaCommandHandler(_repo, _audit);
_handler = new CreateTipoDeIvaCommandHandler(_repo, _audit, TimeProvider.System);
_repo.InsertAsync(Arg.Any<TipoDeIva>(), Arg.Any<CancellationToken>()).Returns(42);
}

View File

@@ -20,7 +20,7 @@ public class DeactivateTipoDeIvaCommandHandlerTests
public DeactivateTipoDeIvaCommandHandlerTests()
{
_handler = new DeactivateTipoDeIvaCommandHandler(_repo, _audit);
_handler = new DeactivateTipoDeIvaCommandHandler(_repo, _audit, TimeProvider.System);
_repo.GetByIdAsync(1, Arg.Any<CancellationToken>()).Returns(MakeEntity());
_repo.SetActivoAsync(Arg.Any<int>(), Arg.Any<bool>(), Arg.Any<CancellationToken>()).Returns(true);
}

View File

@@ -34,7 +34,7 @@ public class NuevaVersionTipoDeIvaCommandHandlerTests
public NuevaVersionTipoDeIvaCommandHandlerTests()
{
_handler = new NuevaVersionTipoDeIvaCommandHandler(_repo, _audit);
_handler = new NuevaVersionTipoDeIvaCommandHandler(_repo, _audit, TimeProvider.System);
_repo.GetByIdAsync(1, Arg.Any<CancellationToken>()).Returns(MakePredecesora());
_repo.UpdateCierreVigenciaAsync(Arg.Any<int>(), Arg.Any<DateOnly>(), Arg.Any<CancellationToken>())
.Returns(true);

View File

@@ -20,7 +20,7 @@ public class ReactivateTipoDeIvaCommandHandlerTests
public ReactivateTipoDeIvaCommandHandlerTests()
{
_handler = new ReactivateTipoDeIvaCommandHandler(_repo, _audit);
_handler = new ReactivateTipoDeIvaCommandHandler(_repo, _audit, TimeProvider.System);
_repo.GetByIdAsync(1, Arg.Any<CancellationToken>()).Returns(MakeEntity());
_repo.SetActivoAsync(Arg.Any<int>(), Arg.Any<bool>(), Arg.Any<CancellationToken>()).Returns(true);
}

View File

@@ -35,7 +35,7 @@ public class UpdateTipoDeIvaCommandHandlerTests
public UpdateTipoDeIvaCommandHandlerTests()
{
_handler = new UpdateTipoDeIvaCommandHandler(_repo, _audit);
_handler = new UpdateTipoDeIvaCommandHandler(_repo, _audit, TimeProvider.System);
_repo.GetByIdAsync(1, Arg.Any<CancellationToken>()).Returns(MakeEntity());
_repo.UpdateCosmeticoAsync(Arg.Any<int>(), Arg.Any<string>(), Arg.Any<string>(),
Arg.Any<bool>(), Arg.Any<bool>(), Arg.Any<CancellationToken>())

View File

@@ -17,7 +17,7 @@ public class DeactivateUsuarioCommandHandlerTests
public DeactivateUsuarioCommandHandlerTests()
{
_handler = new DeactivateUsuarioCommandHandler(_repo, _refreshRepo, _audit);
_handler = new DeactivateUsuarioCommandHandler(_repo, _refreshRepo, _audit, TimeProvider.System);
_repo.CountActiveAdminsAsync(Arg.Any<CancellationToken>()).Returns(2);
}

View File

@@ -16,7 +16,7 @@ public class ReactivateUsuarioCommandHandlerTests
public ReactivateUsuarioCommandHandlerTests()
{
_handler = new ReactivateUsuarioCommandHandler(_repo, _audit);
_handler = new ReactivateUsuarioCommandHandler(_repo, _audit, TimeProvider.System);
}
private static Usuario MakeUser(int id = 5, bool activo = false)

View File

@@ -18,7 +18,7 @@ public class ResetUsuarioPasswordCommandHandlerTests
public ResetUsuarioPasswordCommandHandlerTests()
{
_handler = new ResetUsuarioPasswordCommandHandler(_repo, _hasher, _refreshRepo, _audit);
_handler = new ResetUsuarioPasswordCommandHandler(_repo, _hasher, _refreshRepo, _audit, TimeProvider.System);
_hasher.Hash(Arg.Any<string>()).Returns(args => "$2a$12$hashof_" + args[0]);
}

View File

@@ -20,7 +20,7 @@ public class UpdateUsuarioCommandHandlerTests
public UpdateUsuarioCommandHandlerTests()
{
_handler = new UpdateUsuarioCommandHandler(_repo, _rolRepo, _refreshRepo, _audit);
_handler = new UpdateUsuarioCommandHandler(_repo, _rolRepo, _refreshRepo, _audit, TimeProvider.System);
// Default: rol exists and is active
_rolRepo.ExistsActiveByCodigoAsync(Arg.Any<string>(), Arg.Any<CancellationToken>()).Returns(true);