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 @@
+