diff --git a/tests/SIGCM2.TestSupport/SqlTestFixture.cs b/tests/SIGCM2.TestSupport/SqlTestFixture.cs index 411a78b..828bd42 100644 --- a/tests/SIGCM2.TestSupport/SqlTestFixture.cs +++ b/tests/SIGCM2.TestSupport/SqlTestFixture.cs @@ -47,6 +47,9 @@ public sealed class SqlTestFixture : IAsyncLifetime // V014 (ADM-009): ensure dbo.TipoDeIva + dbo.IngresosBrutos + temporal + seed + permiso fiscal. await EnsureV014SchemaAsync(); + // V015 (UDT-011): ensure dbo.v_AuditEvent_Local + dbo.v_SecurityEvent_Local views exist. + await EnsureV015SchemaAsync(); + _respawner = await Respawner.CreateAsync(_connection, new RespawnerOptions { DbAdapter = DbAdapter.SqlServer, @@ -774,4 +777,62 @@ public sealed class SqlTestFixture : IAsyncLifetime // Permiso 'administracion:fiscal:gestionar' y asignacion a admin se siembran // desde SeedPermisosCanonicalAsync / SeedRolPermisosCanonicalAsync (post-respawn). } + + /// + /// UDT-011 (V015): applies dbo.v_AuditEvent_Local + dbo.v_SecurityEvent_Local views + /// idempotently to the test database. Mirrors V015__create_local_timezone_views.sql. + /// Views expose OccurredAtLocal (DateTimeOffset, offset -03:00 Argentina Standard Time). + /// Note: CREATE VIEW cannot be inside IF...BEGIN...END directly — uses EXEC('CREATE VIEW ...'). + /// + private async Task EnsureV015SchemaAsync() + { + const string createAuditEventLocal = """ + IF OBJECT_ID('dbo.v_AuditEvent_Local', 'V') IS NULL + BEGIN + EXEC(' + CREATE VIEW dbo.v_AuditEvent_Local AS + SELECT + Id, + OccurredAt, + OccurredAt AT TIME ZONE ''UTC'' AT TIME ZONE ''Argentina Standard Time'' AS OccurredAtLocal, + ActorUserId, + ActorRoleId, + Action, + TargetType, + TargetId, + CorrelationId, + IpAddress, + UserAgent, + Metadata + FROM dbo.AuditEvent; + '); + END + """; + + const string createSecurityEventLocal = """ + IF OBJECT_ID('dbo.v_SecurityEvent_Local', 'V') IS NULL + BEGIN + EXEC(' + CREATE VIEW dbo.v_SecurityEvent_Local AS + SELECT + Id, + OccurredAt, + OccurredAt AT TIME ZONE ''UTC'' AT TIME ZONE ''Argentina Standard Time'' AS OccurredAtLocal, + ActorUserId, + AttemptedUsername, + SessionId, + Action, + Result, + FailureReason, + IpAddress, + UserAgent, + Metadata + FROM dbo.SecurityEvent; + '); + END + """; + + await _connection.ExecuteAsync(createAuditEventLocal); + await _connection.ExecuteAsync(createSecurityEventLocal); + } }