Files
SIG-CM2.0/tests/SIGCM2.Api.Tests/Audit/TransactionScopeSpikeTests.cs
dmolinari e5b6c06f64 refactor(tests): Api.Tests apunta a SIGCM2_Test_Api via TestConnectionStrings
Todos los archivos de Api.Tests reemplazan la connection string hardcodeada
por TestConnectionStrings.ApiTestDb. Cada proyecto de tests ahora tiene su
propia base de datos aislada, eliminando la contención entre Application.Tests
y Api.Tests que causaba flakiness.
2026-04-18 21:44:40 -03:00

59 lines
2.1 KiB
C#

using System.Transactions;
using FluentAssertions;
using Microsoft.Data.SqlClient;
using Xunit;
namespace SIGCM2.Api.Tests.Audit;
/// UDT-010 Batch 0 — anti-MSDTC spike. Validates design decision #D-1:
/// TransactionScope with AsyncFlowEnabled must NOT escalate to MSDTC when
/// multiple SqlConnections share a single connection string. If this fails,
/// UDT-010 must pivot to explicit IUnitOfWork.
[Collection("ApiIntegration")]
public sealed class TransactionScopeSpikeTests
{
private const string ConnectionString = TestConnectionStrings.ApiTestDb;
[Fact]
public async Task TransactionScope_DoesNotEscalateToMSDTC_WithSingleConnectionString()
{
var txOptions = new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
};
using var tx = new TransactionScope(
TransactionScopeOption.Required,
txOptions,
TransactionScopeAsyncFlowOption.Enabled);
await using (var conn1 = new SqlConnection(ConnectionString))
{
await conn1.OpenAsync();
using var cmd1 = conn1.CreateCommand();
cmd1.CommandText = "SELECT 1";
var result1 = await cmd1.ExecuteScalarAsync();
result1.Should().Be(1);
}
await using (var conn2 = new SqlConnection(ConnectionString))
{
await conn2.OpenAsync();
using var cmd2 = conn2.CreateCommand();
cmd2.CommandText = "SELECT 1";
var result2 = await cmd2.ExecuteScalarAsync();
result2.Should().Be(1);
}
var current = Transaction.Current;
current.Should().NotBeNull("TransactionScope must set an ambient transaction");
current!.TransactionInformation.DistributedIdentifier
.Should().Be(Guid.Empty,
"SQL Server with a single connection string must NOT escalate to MSDTC. " +
"If this assertion fails, UDT-010 design must pivot to explicit IUnitOfWork " +
"(see sdd/udt-010-auditoria-trazabilidad/design #D-1).");
tx.Complete();
}
}