diff --git a/.github/workflows/ci2.yml b/.github/workflows/ci2.yml new file mode 100644 index 0000000..76071fb --- /dev/null +++ b/.github/workflows/ci2.yml @@ -0,0 +1,24 @@ +name: Build and Test + +on: + workflow_dispatch: + pull_request: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup dotnet + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.x + dotnet-quality: 'preview' + - name: Build + run: dotnet build --configuration Release + - name: Test + run: dotnet test --configuration Release --no-build --no-restore diff --git a/Directory.Packages.props b/Directory.Packages.props index 1feea90..9027184 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,12 +3,12 @@ true true - + - + @@ -16,6 +16,7 @@ + @@ -27,5 +28,5 @@ - - \ No newline at end of file + + diff --git a/tests/QuerySpecification.EntityFrameworkCore.Tests/Fixture/TestFactory.cs b/tests/QuerySpecification.EntityFrameworkCore.Tests/Fixture/TestFactory.cs index 013bb60..ade3288 100644 --- a/tests/QuerySpecification.EntityFrameworkCore.Tests/Fixture/TestFactory.cs +++ b/tests/QuerySpecification.EntityFrameworkCore.Tests/Fixture/TestFactory.cs @@ -1,11 +1,16 @@ using MartinCostello.SqlLocalDb; using Respawn; +using Testcontainers.MsSql; namespace Tests.Fixture; public class TestFactory : IAsyncLifetime { + // Flag to force using Docker SQL Server. Update it manually if you want to avoid localDb locally. + private const bool _forceDocker = false; + private string _connectionString = default!; + private MsSqlContainer? _dbContainer = null; private Respawner _respawner = default!; public DbContextOptions DbContextOptions { get; private set; } = default!; @@ -16,9 +21,16 @@ public async Task InitializeAsync() { using (var localDB = new SqlLocalDbApi()) { - _connectionString = localDB.IsLocalDBInstalled() - ? $"Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=QuerySpecificationTestsDB;Integrated Security=SSPI;TrustServerCertificate=True;" - : $"Data Source=databaseEF;Initial Catalog=QuerySpecificationTestsDB;PersistSecurityInfo=True;User ID=sa;Password=P@ssW0rd!;Encrypt=False;TrustServerCertificate=True;"; + if (_forceDocker || !localDB.IsLocalDBInstalled()) + { + _dbContainer = CreateContainer(); + await _dbContainer.StartAsync(); + _connectionString = _dbContainer.GetConnectionString(); + } + else + { + _connectionString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=QuerySpecificationTestsDB;Integrated Security=SSPI;TrustServerCertificate=True;"; + } } Console.WriteLine($"Connection string: {_connectionString}"); @@ -43,11 +55,22 @@ public async Task InitializeAsync() await ResetDatabase(); } - public Task DisposeAsync() => Task.CompletedTask; + public async Task DisposeAsync() + { + if (_dbContainer is not null) + { + await _dbContainer.StopAsync(); + } + else + { + //using var dbContext = new TestDbContext(DbContextOptions); + //await dbContext.Database.EnsureDeletedAsync(); + } + } - //public async Task DisposeAsync() - //{ - // using var dbContext = new TestDbContext(DbContextOptions); - // await dbContext.Database.EnsureDeletedAsync(); - //} + private static MsSqlContainer CreateContainer() => new MsSqlBuilder() + .WithImage("mcr.microsoft.com/mssql/server:2022-latest") + .WithName("QuerySpecificationTestsDB") + .WithPassword("P@ssW0rd!") + .Build(); } diff --git a/tests/QuerySpecification.EntityFrameworkCore.Tests/QuerySpecification.EntityFrameworkCore.Tests.csproj b/tests/QuerySpecification.EntityFrameworkCore.Tests/QuerySpecification.EntityFrameworkCore.Tests.csproj index bd8178d..ca78723 100644 --- a/tests/QuerySpecification.EntityFrameworkCore.Tests/QuerySpecification.EntityFrameworkCore.Tests.csproj +++ b/tests/QuerySpecification.EntityFrameworkCore.Tests/QuerySpecification.EntityFrameworkCore.Tests.csproj @@ -5,6 +5,7 @@ +