Skip to content

Commit 18f67a3

Browse files
committed
add Dapper and Smoke tests
1 parent 5dcddf7 commit 18f67a3

17 files changed

+759
-11
lines changed

.github/workflows/build.yml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: Build
2+
3+
on:
4+
push:
5+
branches: [ main, master ]
6+
pull_request:
7+
branches: [ "*" ]
8+
9+
permissions:
10+
contents: read
11+
12+
jobs:
13+
# Regular tests (exclude provider smoke tests)
14+
unit-and-integration:
15+
if: github.actor != 'dependabot[bot]'
16+
runs-on: ubuntu-latest
17+
timeout-minutes: 20
18+
steps:
19+
- uses: actions/checkout@v4
20+
21+
- uses: actions/setup-dotnet@v4
22+
with:
23+
dotnet-version: '8.0.x'
24+
25+
- name: Restore
26+
run: dotnet restore KeelMatrix.QueryWatch.sln
27+
28+
- name: Build
29+
run: dotnet build KeelMatrix.QueryWatch.sln -c Release --no-restore
30+
31+
# IMPORTANT: exclude the provider smoke tests here so they only run in the dedicated job below
32+
- name: Test (exclude smoke)
33+
run: >
34+
dotnet test KeelMatrix.QueryWatch.sln -c Release --no-build
35+
--filter "FullyQualifiedName!~KeelMatrix.QueryWatch.Providers.SmokeTests"
36+
37+
# Provider smoke tests (run in isolation; DBs auto up/down via Directory.Build.targets)
38+
smoke-tests:
39+
if: github.actor != 'dependabot[bot]'
40+
runs-on: ubuntu-latest
41+
timeout-minutes: 20
42+
steps:
43+
- uses: actions/checkout@v4
44+
45+
- uses: actions/setup-dotnet@v4
46+
with:
47+
dotnet-version: '8.0.x'
48+
49+
# No manual docker steps needed; tests/Directory.Build.targets handles compose up/down
50+
- name: Run smoke tests
51+
run: >
52+
dotnet test --configuration Release
53+
--filter "FullyQualifiedName~KeelMatrix.QueryWatch.Providers.SmokeTests"

.github/workflows/ci.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@ jobs:
2929
- name: Build
3030
run: dotnet build --configuration Release --no-restore
3131
- name: Test
32-
run: dotnet test --configuration Release --no-build --collect:"XPlat Code Coverage" --results-directory ./artifacts/TestResults
32+
run: >
33+
dotnet test --configuration Release --no-build
34+
--collect:"XPlat Code Coverage"
35+
--results-directory ./artifacts/TestResults
36+
--filter "FullyQualifiedName!~KeelMatrix.QueryWatch.Providers.SmokeTests"
3337
- name: QueryWatch gate (optional - JSON)
3438
shell: pwsh
3539
run: |

Directory.Packages.props

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,9 @@
2020
<PackageVersion Include="Microsoft.Data.Sqlite" Version="8.0.8" />
2121
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.8" /> <PackageVersion Include="Dapper" Version="2.1.35" />
2222
<PackageVersion Include="BenchmarkDotNet" Version="0.13.12" />
23+
<PackageVersion Include="Microsoft.Data.SqlClient" Version="5.2.0" />
24+
<PackageVersion Include="Npgsql" Version="8.0.3" />
25+
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.8" />
26+
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4" />
2327
</ItemGroup>
2428
</Project>

KeelMatrix.QueryWatch.sln

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeelMatrix.QueryWatch.Redac
3131
EndProject
3232
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeelMatrix.QueryWatch.Benchmarks", "bench\KeelMatrix.QueryWatch.Benchmarks\KeelMatrix.QueryWatch.Benchmarks.csproj", "{F483136B-5F73-44F1-8BA3-718B200B258A}"
3333
EndProject
34+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeelMatrix.QueryWatch.Dapper.Tests", "tests\KeelMatrix.QueryWatch.Dapper.Tests\KeelMatrix.QueryWatch.Dapper.Tests.csproj", "{13D2376F-FFB3-4263-93A1-907D2A974393}"
35+
EndProject
36+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeelMatrix.QueryWatch.Providers.SmokeTests", "tests\KeelMatrix.QueryWatch.Providers.SmokeTests\KeelMatrix.QueryWatch.Providers.SmokeTests.csproj", "{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}"
37+
EndProject
38+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{61864139-D205-400F-82D4-252426688579}"
39+
ProjectSection(SolutionItems) = preProject
40+
tests\Shared\SmokePlaceholder.cs = tests\Shared\SmokePlaceholder.cs
41+
EndProjectSection
42+
EndProject
3443
Global
3544
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3645
Debug|Any CPU = Debug|Any CPU
@@ -161,6 +170,30 @@ Global
161170
{F483136B-5F73-44F1-8BA3-718B200B258A}.Release|x64.Build.0 = Release|Any CPU
162171
{F483136B-5F73-44F1-8BA3-718B200B258A}.Release|x86.ActiveCfg = Release|Any CPU
163172
{F483136B-5F73-44F1-8BA3-718B200B258A}.Release|x86.Build.0 = Release|Any CPU
173+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
174+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Debug|Any CPU.Build.0 = Debug|Any CPU
175+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Debug|x64.ActiveCfg = Debug|Any CPU
176+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Debug|x64.Build.0 = Debug|Any CPU
177+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Debug|x86.ActiveCfg = Debug|Any CPU
178+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Debug|x86.Build.0 = Debug|Any CPU
179+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Release|Any CPU.ActiveCfg = Release|Any CPU
180+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Release|Any CPU.Build.0 = Release|Any CPU
181+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Release|x64.ActiveCfg = Release|Any CPU
182+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Release|x64.Build.0 = Release|Any CPU
183+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Release|x86.ActiveCfg = Release|Any CPU
184+
{13D2376F-FFB3-4263-93A1-907D2A974393}.Release|x86.Build.0 = Release|Any CPU
185+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
186+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
187+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Debug|x64.ActiveCfg = Debug|Any CPU
188+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Debug|x64.Build.0 = Debug|Any CPU
189+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Debug|x86.ActiveCfg = Debug|Any CPU
190+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Debug|x86.Build.0 = Debug|Any CPU
191+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
192+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Release|Any CPU.Build.0 = Release|Any CPU
193+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Release|x64.ActiveCfg = Release|Any CPU
194+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Release|x64.Build.0 = Release|Any CPU
195+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Release|x86.ActiveCfg = Release|Any CPU
196+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE}.Release|x86.Build.0 = Release|Any CPU
164197
EndGlobalSection
165198
GlobalSection(SolutionProperties) = preSolution
166199
HideSolutionNode = FALSE
@@ -176,6 +209,9 @@ Global
176209
{5BE6CC64-5276-4832-ADB1-AD0D334D26D1} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
177210
{FE18583F-2A73-43C3-9EAF-94CA8292F5B8} = {760AB15A-8938-8D9B-BEDE-5CE1484B84C3}
178211
{F483136B-5F73-44F1-8BA3-718B200B258A} = {760AB15A-8938-8D9B-BEDE-5CE1484B84C3}
212+
{13D2376F-FFB3-4263-93A1-907D2A974393} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
213+
{B54B2F7C-A17E-4C4B-96FE-6244B10F41CE} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
214+
{61864139-D205-400F-82D4-252426688579} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
179215
EndGlobalSection
180216
GlobalSection(ExtensibilityGlobals) = postSolution
181217
SolutionGuid = {B433EB21-BD3B-4E85-9645-38C1E8BDC563}

SmokePlaceholder.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using KeelMatrix.QueryWatch.Providers.SmokeTests;
2+
3+
using Xunit;
4+
namespace KeelMatrix.QueryWatch.Providers.SmokeTests
5+
{
6+
// Ensures solution-root filtering finds at least one test in every project.
7+
public static class SmokePlaceholder
8+
{
9+
[Fact(Skip = "Local run: placeholder to suppress 'No test matches' warnings.")]
10+
public static void __smoke_placeholder__() { }
11+
}
12+
}

tests/Directory.Build.targets

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<Project>
2+
<PropertyGroup>
3+
<DbComposeFile>$(MSBuildThisFileDirectory)docker-compose.db.yml</DbComposeFile>
4+
<!-- Limit compose orchestration to the smoke test project -->
5+
<RunDbCompose Condition="'$(MSBuildProjectName)'=='KeelMatrix.QueryWatch.Providers.SmokeTests'">true</RunDbCompose>
6+
</PropertyGroup>
7+
8+
<!-- Bring containers up exactly once per smoke test run -->
9+
<Target Name="ComposeUpForTests"
10+
BeforeTargets="VSTest"
11+
Condition="'$(RunDbCompose)'=='true' and Exists('$(DbComposeFile)')">
12+
<Message Text="Starting DB containers for smoke tests via docker compose." Importance="High" />
13+
<Exec Command="docker compose version" />
14+
<Exec Command="docker compose -f &quot;$(DbComposeFile)&quot; down -v --remove-orphans" IgnoreExitCode="true" />
15+
<Exec Command="docker compose -f &quot;$(DbComposeFile)&quot; up -d --wait" ConsoleToMSBuild="true">
16+
<Output TaskParameter="ConsoleOutput" PropertyName="ComposeOut" />
17+
</Exec>
18+
<Message Text="$(ComposeOut)" Importance="High" />
19+
</Target>
20+
21+
<!-- Tear down after the actual test run -->
22+
<Target Name="ComposeDownAfterTests"
23+
AfterTargets="VSTest"
24+
Condition="'$(RunDbCompose)'=='true' and Exists('$(DbComposeFile)')">
25+
<Message Text="Stopping DB containers for smoke tests." Importance="High" />
26+
<Exec Command="docker compose -f &quot;$(DbComposeFile)&quot; down -v --remove-orphans" IgnoreExitCode="true" />
27+
</Target>
28+
29+
<ItemGroup Condition="'$(IsTestProject)'=='true'
30+
and '$(IncludeSmokePlaceholder)'!='false'
31+
and '$(BuildingInsideVisualStudio)'=='true'">
32+
<Compile Include="$([System.IO.Path]::Combine('$(MSBuildThisFileDirectory)','Shared','SmokePlaceholder.cs'))">
33+
<Link>SmokePlaceholder.cs</Link>
34+
</Compile>
35+
</ItemGroup>
36+
</Project>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) KeelMatrix
2+
#nullable enable
3+
using System.Data;
4+
using System.Diagnostics.CodeAnalysis;
5+
using FluentAssertions;
6+
using KeelMatrix.QueryWatch.Ado;
7+
using Xunit;
8+
9+
namespace KeelMatrix.QueryWatch.Dapper.Tests {
10+
public class DapperWrapperBehaviorTests {
11+
[Fact]
12+
public void WithQueryWatch_Returns_Ado_Wrapper_For_DbConnection() {
13+
using var session = new QueryWatchSession();
14+
IDbConnection raw = new MiniDbConnection();
15+
16+
var wrapped = raw.WithQueryWatch(session);
17+
18+
wrapped.Should().BeOfType<QueryWatchConnection>();
19+
}
20+
21+
// Minimal DbConnection just for this test
22+
private sealed class MiniDbConnection : System.Data.Common.DbConnection {
23+
public override string Database => "Fake";
24+
public override string DataSource => "Fake";
25+
public override string ServerVersion => "0.0";
26+
public override ConnectionState State => ConnectionState.Closed;
27+
public override void ChangeDatabase(string databaseName) { }
28+
public override void Close() { }
29+
public override void Open() { }
30+
protected override System.Data.Common.DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) => throw new NotSupportedException();
31+
protected override System.Data.Common.DbCommand CreateDbCommand() => throw new NotSupportedException();
32+
[AllowNull]
33+
public override string ConnectionString { get; set; } = "Fake";
34+
}
35+
}
36+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<TargetFramework>net8.0</TargetFramework>
4+
<IsPackable>false</IsPackable>
5+
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
6+
<GenerateDocumentationFile>false</GenerateDocumentationFile>
7+
<Nullable>enable</Nullable>
8+
<ImplicitUsings>enable</ImplicitUsings>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<PackageReference Include="xunit" />
13+
<PackageReference Include="xunit.runner.visualstudio" />
14+
<PackageReference Include="coverlet.collector" />
15+
<PackageReference Include="FluentAssertions" />
16+
<PackageReference Include="Microsoft.NET.Test.Sdk" />
17+
</ItemGroup>
18+
19+
<ItemGroup>
20+
<ProjectReference Include="..\..\src\KeelMatrix.QueryWatch\KeelMatrix.QueryWatch.csproj" />
21+
</ItemGroup>
22+
</Project>

0 commit comments

Comments
 (0)