< Summary

Information
Class: Nabs.Tests.DatabaseTests.DatabaseContainerRunOnce
Assembly: Nabs.Tests.DatabaseTests
File(s): /home/runner/work/Nabs/Nabs/src/Nabs.Tests.DatabaseTests/DatabaseContainerRunOnce.cs
Tag: 90_14636759620
Line coverage
81%
Covered lines: 30
Uncovered lines: 7
Coverable lines: 37
Total lines: 71
Line coverage: 81%
Branch coverage
83%
Covered branches: 5
Total branches: 6
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Dispose()100%11100%
StartContainerAndEnsureReady()83.33%8665%

File(s)

/home/runner/work/Nabs/Nabs/src/Nabs.Tests.DatabaseTests/DatabaseContainerRunOnce.cs

#LineLine coverage
 1namespace Nabs.Tests.DatabaseTests;
 2
 3public sealed class DatabaseContainerRunOnce : XunitTestFramework, IDisposable
 4{
 5    public const string RunOnceFqn = "Nabs.Tests.DatabaseTests.DatabaseContainerRunOnce";
 6    public const string RunOnceAssemblyName = "Nabs.Tests.DatabaseTests";
 7
 8    private readonly MsSqlContainer _container;
 9
 10    public DatabaseContainerRunOnce(IMessageSink messageSink)
 111        : base(messageSink)
 12    {
 113        DiagnosticMessageSink.OnMessage(new DiagnosticMessage("Container starting ..."));
 14
 115        _container = new MsSqlBuilder()
 116            .WithImage("mcr.microsoft.com/mssql/server:2019-latest")
 117            .WithName("nabs-test-mssql-db")
 118            .WithPortBinding(14331, 1433)
 119            .WithPassword("Password123")
 120            .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(1433))
 121            .Build();
 22
 123        StartContainerAndEnsureReady().GetAwaiter().GetResult();
 24
 125    }
 26
 27    public new void Dispose()
 28    {
 129        DiagnosticMessageSink.OnMessage(new DiagnosticMessage("Container stopping ..."));
 130        _container.StopAsync().GetAwaiter().GetResult();
 131        GC.SuppressFinalize(this);
 132        base.Dispose();
 133        DiagnosticMessageSink.OnMessage(new DiagnosticMessage("Container stopped!"));
 134    }
 35
 36    private async Task StartContainerAndEnsureReady()
 37    {
 138        await _container.StartAsync();
 39
 140        var retryCount = 1;
 141        var maxRetries = 5;
 142        var delay = TimeSpan.FromSeconds(10);
 143        var isReady = false;
 44
 145        while (retryCount <= maxRetries && !isReady)
 46        {
 47            try
 48            {
 149                using var connection = new SqlConnection(_container.GetConnectionString());
 150                await connection.OpenAsync();
 151                isReady = true;
 152            }
 053            catch
 54            {
 055                DiagnosticMessageSink.OnMessage(new DiagnosticMessage($"Connection failed on attempt {retryCount}. Waiti
 56                // If connection fails, wait for a while and then retry
 057                await Task.Delay(delay);
 058                retryCount++;
 59            }
 60        }
 61
 162        if (!isReady)
 63        {
 064            var failureMessage = $"Failed to establish a connection to the SQL Server container after {maxRetries} retri
 065            DiagnosticMessageSink.OnMessage(new DiagnosticMessage(failureMessage));
 066            throw new InvalidOperationException(failureMessage);
 67        }
 68
 169        DiagnosticMessageSink.OnMessage(new DiagnosticMessage("Container is ready!"));
 170    }
 71}