diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7c710468..686b5829 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,11 +7,15 @@ on: branches: [ main ] workflow_dispatch: inputs: - reason: - description: 'Reason' + reason: + description: 'Reason' required: false default: 'Manual run' +concurrency: + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }} + cancel-in-progress: true + env: DOTNET_NOLOGO: true INCLUDE_SYMBOLS: true @@ -118,6 +122,139 @@ jobs: env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + # Cross-OS build + unit test matrix (#191). + # + # This is deliberately ADDITIVE to `pr-checks` above, not a replacement for it: + # - `pr-checks` (ubuntu-only) remains the merge-gating job and is the only job that runs the + # FULL test suite, including Testcontainers/live-DB/real-efcpt integration tests, and + # publishes code coverage. Its job id/name is unchanged. + # - `build-test-matrix` proves the library actually builds and its non-integration unit/logic + # test suite actually passes on windows-latest and macos-latest, not just ubuntu - catching + # path-separator, line-ending, and other OS-specific behavior that an ubuntu-only pipeline + # can never surface. + # - Integration tests (Testcontainers, live cloud secrets, the real `efcpt` CLI, and the + # net472 Framework-MSBuild host tests) are excluded on EVERY leg here via + # `--filter "Category!=Integration"` - they require Docker with Linux containers and/or the + # efcpt tool and are not run on windows/macos GitHub-hosted runners. That coverage (including + # the net472 MSBuild-host task-loading path) stays on the ubuntu `pr-checks` job, which runs + # the full suite. See tests tagged `[Trait("Category", "Integration")]`. + build-test-matrix: + name: build-test-matrix + if: github.event_name == 'pull_request' + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + runs-on: ${{ matrix.os }} + timeout-minutes: 30 + steps: + - name: Checkout + uses: actions/checkout@v7 + + - name: Setup .NET + uses: actions/setup-dotnet@v5 + with: + dotnet-version: | + 8.0.x + 9.0.x + 10.0.x + + - name: Restore + run: dotnet restore JD.Efcpt.Build.sln --use-lock-file + + - name: Build (Release) + run: dotnet build JD.Efcpt.Build.sln --configuration Release --no-restore /p:ContinuousIntegrationBuild=true + + # Category!=Integration excludes Testcontainers/live-DB/real-efcpt tests (they require + # Docker with Linux containers and/or the erikej.efcorepowertools.cli global tool, neither + # of which is installed on this leg - those tests keep running on ubuntu via `pr-checks`). + - name: Test (excluding integration) + run: dotnet test JD.Efcpt.Build.sln --configuration Release --no-build --filter "Category!=Integration" + + # Samples build (#191): proves the documentation samples under samples/ actually compile in CI, + # without a live database. Every sample is built with -p:EfcptEnabled=false, which fully + # short-circuits the JD.Efcpt.Build/JD.Efcpt.Sdk generation pipeline (see + # src/JD.Efcpt.Build/buildTransitive/JD.Efcpt.Build.props) so no DB connection, DACPAC query, or + # `efcpt` invocation ever happens - this job only proves the sample *projects* are well-formed + # and reference real, resolvable packages/SDKs, not that generation works end to end (that is + # covered by the integration tests in `pr-checks`). + samples-build: + name: samples-build + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - name: Checkout + uses: actions/checkout@v7 + + - name: Setup .NET + uses: actions/setup-dotnet@v5 + with: + dotnet-version: | + 8.0.x + 9.0.x + 10.0.x + + - name: Restore and build library + run: | + dotnet restore JD.Efcpt.Build.sln --use-lock-file + dotnet build JD.Efcpt.Build.sln --configuration Release --no-restore /p:ContinuousIntegrationBuild=true + + # Packs the just-built library into ./artifacts (and ./pkg for the JD.Efcpt.Sdk MSBuild SDK), + # which each sample's nuget.config consumes as a local source. These packages carry the + # default 1.0.0 version, and samples reference them via Version="*" - this assumes the + # locally-packed 1.0.0 sorts at or above any version already published to nuget.org. Revisit + # this pin when a real >=1.0 release exists (a future 1.x on nuget.org would out-sort the + # local 1.0.0 and the samples could silently resolve the published package instead). + - name: Pack local NuGet feed consumed by samples + run: | + dotnet pack JD.Efcpt.Build.sln --configuration Release --no-build -o ./artifacts -p:ContinuousIntegrationBuild=true + mkdir -p pkg + cp artifacts/JD.Efcpt.Sdk.*.nupkg pkg/ + + # samples/Samples.sln aggregates a stale project reference (simple-sql-integration, removed + # from the repo) and cannot currently be restored as a whole; build each sample + # solution/project individually instead (see samples/README.md for what each demonstrates). + # + # Each restore passes the local packed feed EXPLICITLY via --source (which overrides the + # NuGet.config for the restore) so it never depends on a given sample's + # per-sample nuget.config resolving the right relative path. This is belt-and-suspenders with + # the samples/NuGet.config fix: e.g. sdk-zero-config's nuget.config has no and used + # to inherit samples/NuGet.config's bogus "../packages" source -> NU1301. nuget.org is + # included for the samples' EF Core / Aspire / SQL SDK dependencies; the artifacts feed + # (repo root, populated by the Pack step above) supplies JD.Efcpt.Build / JD.Efcpt.Sdk. + - name: Build samples (EfcptEnabled=false - no live DB required) + shell: bash + run: | + set -euo pipefail + FEED="$GITHUB_WORKSPACE/artifacts" + declare -a SAMPLES=( + "samples/sdk-zero-config/SdkZeroConfigSample.sln" + "samples/dacpac-zero-config/ZeroConfigDacpac.sln" + "samples/microsoft-build-sql-zero-config/ZeroConfigMsBuildSql.sln" + "samples/simple-generation/SimpleGenerationSample.sln" + "samples/msbuild-sdk-sql-proj-generation/SimpleGenerationSample.sln" + "samples/schema-organization/SchemaOrganization.sln" + "samples/custom-renaming/CustomRenaming.sln" + "samples/database-first-sql-generation/DatabaseFirstSqlProj.sln" + "samples/connection-string-sqlite/ConnectionStringSqliteSample.sln" + "samples/connection-string-mssql/ConnectionStringMssql.sln" + "samples/aspnet-core-appsettings/AspNetCoreAppSettings.sln" + "samples/split-data-and-models-between-multiple-projects/SampleApp.slnx" + ) + for sample in "${SAMPLES[@]}"; do + echo "::group::Build $sample" + dotnet restore "$sample" \ + --source "https://api.nuget.org/v3/index.json" \ + --source "$FEED" + dotnet build "$sample" --configuration Release --no-restore -p:EfcptEnabled=false + echo "::endgroup::" + done + + # NOTE: samples/custom-provider/Acme.Efcpt.Mongo is intentionally NOT built here - it is + # a member of JD.Efcpt.Build.sln and is already compiled by the "Restore and build + # library" step above, so building it again would be redundant. + release: if: github.event_name == 'push' && github.ref == 'refs/heads/main' runs-on: ubuntu-latest diff --git a/samples/Directory.Build.props b/samples/Directory.Build.props new file mode 100644 index 00000000..5fdc0442 --- /dev/null +++ b/samples/Directory.Build.props @@ -0,0 +1,11 @@ + + + + false + + diff --git a/samples/Directory.Packages.props b/samples/Directory.Packages.props new file mode 100644 index 00000000..a2a3950b --- /dev/null +++ b/samples/Directory.Packages.props @@ -0,0 +1,12 @@ + + + + false + + diff --git a/samples/NuGet.config b/samples/NuGet.config index 03e648eb..0bb00e58 100644 --- a/samples/NuGet.config +++ b/samples/NuGet.config @@ -2,7 +2,13 @@ - + + diff --git a/samples/aspnet-core-appsettings/MyApp.Api/MyApp.Api.csproj b/samples/aspnet-core-appsettings/MyApp.Api/MyApp.Api.csproj index 25da737c..4ae451d3 100644 --- a/samples/aspnet-core-appsettings/MyApp.Api/MyApp.Api.csproj +++ b/samples/aspnet-core-appsettings/MyApp.Api/MyApp.Api.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 enable enable diff --git a/samples/connection-string-mssql/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj b/samples/connection-string-mssql/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj index 03611aa5..9f71769a 100644 --- a/samples/connection-string-mssql/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj +++ b/samples/connection-string-mssql/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 enable enable diff --git a/samples/custom-renaming/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj b/samples/custom-renaming/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj index f89bad5a..548a9686 100644 --- a/samples/custom-renaming/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj +++ b/samples/custom-renaming/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable diff --git a/samples/dacpac-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj b/samples/dacpac-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj index e821cc2e..9e4ab296 100644 --- a/samples/dacpac-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj +++ b/samples/dacpac-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj @@ -1,6 +1,6 @@ - net8.0 + net10.0 enable enable diff --git a/samples/database-first-sql-generation/nuget.config b/samples/database-first-sql-generation/nuget.config index cdfce7de..322d235e 100644 --- a/samples/database-first-sql-generation/nuget.config +++ b/samples/database-first-sql-generation/nuget.config @@ -2,7 +2,7 @@ - + diff --git a/samples/microsoft-build-sql-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj b/samples/microsoft-build-sql-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj index 423fd0d1..8a73621e 100644 --- a/samples/microsoft-build-sql-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj +++ b/samples/microsoft-build-sql-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj @@ -1,6 +1,6 @@ - net8.0 + net10.0 enable enable diff --git a/samples/schema-organization/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj b/samples/schema-organization/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj index ad1df2f4..4bf2b787 100644 --- a/samples/schema-organization/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj +++ b/samples/schema-organization/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable diff --git a/samples/sdk-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj b/samples/sdk-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj index be9acea4..ded83aaa 100644 --- a/samples/sdk-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj +++ b/samples/sdk-zero-config/EntityFrameworkCoreProject/EntityFrameworkCoreProject.csproj @@ -13,7 +13,7 @@ --> - net8.0 + net10.0 enable enable diff --git a/tests/JD.Efcpt.Build.ConnectionStrings.AwsSecretsManager.Tests/AwsSecretsManagerConnectionStringSourceTests.cs b/tests/JD.Efcpt.Build.ConnectionStrings.AwsSecretsManager.Tests/AwsSecretsManagerConnectionStringSourceTests.cs index 509e024c..e2ae3c7d 100644 --- a/tests/JD.Efcpt.Build.ConnectionStrings.AwsSecretsManager.Tests/AwsSecretsManagerConnectionStringSourceTests.cs +++ b/tests/JD.Efcpt.Build.ConnectionStrings.AwsSecretsManager.Tests/AwsSecretsManagerConnectionStringSourceTests.cs @@ -292,6 +292,7 @@ await Given("a context whose client returns an empty value", () => BuildContext( #region Real Endpoint (skipped by default) [SkippableFact] + [Trait("Category", "Integration")] public void Real_secrets_manager_endpoint_resolves_secret() { var secretId = Environment.GetEnvironmentVariable("EFCPT_TEST_AWS_SECRET_ID"); diff --git a/tests/JD.Efcpt.Build.ConnectionStrings.AzureKeyVault.Tests/AzureKeyVaultConnectionStringSourceTests.cs b/tests/JD.Efcpt.Build.ConnectionStrings.AzureKeyVault.Tests/AzureKeyVaultConnectionStringSourceTests.cs index 0e1b7af9..8893cccd 100644 --- a/tests/JD.Efcpt.Build.ConnectionStrings.AzureKeyVault.Tests/AzureKeyVaultConnectionStringSourceTests.cs +++ b/tests/JD.Efcpt.Build.ConnectionStrings.AzureKeyVault.Tests/AzureKeyVaultConnectionStringSourceTests.cs @@ -266,6 +266,7 @@ await Given("a context whose client returns an empty value", () => BuildContext( #region Real Endpoint (skipped by default) [SkippableFact] + [Trait("Category", "Integration")] public void Real_key_vault_endpoint_resolves_secret() { var vaultUri = Environment.GetEnvironmentVariable("EFCPT_TEST_AZURE_KEYVAULT_URI"); diff --git a/tests/JD.Efcpt.Build.Tests/DirectDacpacTests.cs b/tests/JD.Efcpt.Build.Tests/DirectDacpacTests.cs index 313f9046..a90d2e62 100644 --- a/tests/JD.Efcpt.Build.Tests/DirectDacpacTests.cs +++ b/tests/JD.Efcpt.Build.Tests/DirectDacpacTests.cs @@ -285,6 +285,7 @@ await Given("pre-built DACPAC file", SetupWithPrebuiltDacpac) [Scenario("Pipeline succeeds with real efcpt using direct DACPAC")] [Fact] + [Trait("Category", "Integration")] public async Task Pipeline_succeeds_with_direct_dacpac_real_efcpt() { await Given("pre-built DACPAC file", SetupWithPrebuiltDacpac) diff --git a/tests/JD.Efcpt.Build.Tests/Integration/EndToEndReverseEngineeringTests.cs b/tests/JD.Efcpt.Build.Tests/Integration/EndToEndReverseEngineeringTests.cs index 021d0580..e5c664e4 100644 --- a/tests/JD.Efcpt.Build.Tests/Integration/EndToEndReverseEngineeringTests.cs +++ b/tests/JD.Efcpt.Build.Tests/Integration/EndToEndReverseEngineeringTests.cs @@ -12,6 +12,7 @@ namespace JD.Efcpt.Build.Tests.Integration; [Feature("End-to-End Reverse Engineering: generates and compiles EF models from SQL Server using Testcontainers")] [Collection(nameof(AssemblySetup))] +[Trait("Category", "Integration")] public sealed partial class EndToEndReverseEngineeringTests(ITestOutputHelper output) : TinyBddXunitBase(output) { private sealed record TestContext( diff --git a/tests/JD.Efcpt.Build.Tests/Integration/FirebirdSchemaIntegrationTests.cs b/tests/JD.Efcpt.Build.Tests/Integration/FirebirdSchemaIntegrationTests.cs index a9683391..66b8ab0c 100644 --- a/tests/JD.Efcpt.Build.Tests/Integration/FirebirdSchemaIntegrationTests.cs +++ b/tests/JD.Efcpt.Build.Tests/Integration/FirebirdSchemaIntegrationTests.cs @@ -17,6 +17,7 @@ namespace JD.Efcpt.Build.Tests.Integration; /// [Feature("FirebirdSchemaReader: reads and fingerprints Firebird schema using Testcontainers")] [Collection(nameof(AssemblySetup))] +[Trait("Category", "Integration")] public sealed partial class FirebirdSchemaIntegrationTests(ITestOutputHelper output) : TinyBddXunitBase(output) { private sealed record TestContext( diff --git a/tests/JD.Efcpt.Build.Tests/Integration/MySqlSchemaIntegrationTests.cs b/tests/JD.Efcpt.Build.Tests/Integration/MySqlSchemaIntegrationTests.cs index ae6eae94..a824d689 100644 --- a/tests/JD.Efcpt.Build.Tests/Integration/MySqlSchemaIntegrationTests.cs +++ b/tests/JD.Efcpt.Build.Tests/Integration/MySqlSchemaIntegrationTests.cs @@ -12,6 +12,7 @@ namespace JD.Efcpt.Build.Tests.Integration; [Feature("MySqlSchemaReader: reads and fingerprints MySQL schema using Testcontainers")] [Collection(nameof(AssemblySetup))] +[Trait("Category", "Integration")] public sealed partial class MySqlSchemaIntegrationTests(ITestOutputHelper output) : TinyBddXunitBase(output) { private sealed record TestContext( diff --git a/tests/JD.Efcpt.Build.Tests/Integration/OracleSchemaIntegrationTests.cs b/tests/JD.Efcpt.Build.Tests/Integration/OracleSchemaIntegrationTests.cs index 186768a1..085f9c09 100644 --- a/tests/JD.Efcpt.Build.Tests/Integration/OracleSchemaIntegrationTests.cs +++ b/tests/JD.Efcpt.Build.Tests/Integration/OracleSchemaIntegrationTests.cs @@ -21,6 +21,7 @@ namespace JD.Efcpt.Build.Tests.Integration; /// [Feature("OracleSchemaReader: reads and fingerprints Oracle schema using Testcontainers")] [Collection(nameof(AssemblySetup))] +[Trait("Category", "Integration")] public sealed partial class OracleSchemaIntegrationTests(ITestOutputHelper output) : TinyBddXunitBase(output) { private sealed record TestContext( diff --git a/tests/JD.Efcpt.Build.Tests/Integration/PostgreSqlSchemaIntegrationTests.cs b/tests/JD.Efcpt.Build.Tests/Integration/PostgreSqlSchemaIntegrationTests.cs index 1c320f07..14837efc 100644 --- a/tests/JD.Efcpt.Build.Tests/Integration/PostgreSqlSchemaIntegrationTests.cs +++ b/tests/JD.Efcpt.Build.Tests/Integration/PostgreSqlSchemaIntegrationTests.cs @@ -12,6 +12,7 @@ namespace JD.Efcpt.Build.Tests.Integration; [Feature("PostgreSqlSchemaReader: reads and fingerprints PostgreSQL schema using Testcontainers")] [Collection(nameof(AssemblySetup))] +[Trait("Category", "Integration")] public sealed partial class PostgreSqlSchemaIntegrationTests(ITestOutputHelper output) : TinyBddXunitBase(output) { private sealed record TestContext( diff --git a/tests/JD.Efcpt.Build.Tests/Integration/QuerySchemaMetadataIntegrationTests.cs b/tests/JD.Efcpt.Build.Tests/Integration/QuerySchemaMetadataIntegrationTests.cs index 89760605..3e30b87b 100644 --- a/tests/JD.Efcpt.Build.Tests/Integration/QuerySchemaMetadataIntegrationTests.cs +++ b/tests/JD.Efcpt.Build.Tests/Integration/QuerySchemaMetadataIntegrationTests.cs @@ -12,6 +12,7 @@ namespace JD.Efcpt.Build.Tests.Integration; [Feature("QuerySchemaMetadata task: queries real SQL Server database schema")] [Collection(nameof(AssemblySetup))] +[Trait("Category", "Integration")] public sealed partial class QuerySchemaMetadataIntegrationTests(ITestOutputHelper output) : TinyBddXunitBase(output) { private sealed record TestContext( diff --git a/tests/JD.Efcpt.Build.Tests/Integration/SnowflakeSchemaIntegrationTests.cs b/tests/JD.Efcpt.Build.Tests/Integration/SnowflakeSchemaIntegrationTests.cs index c69648f5..a2ce8376 100644 --- a/tests/JD.Efcpt.Build.Tests/Integration/SnowflakeSchemaIntegrationTests.cs +++ b/tests/JD.Efcpt.Build.Tests/Integration/SnowflakeSchemaIntegrationTests.cs @@ -31,6 +31,7 @@ namespace JD.Efcpt.Build.Tests.Integration; /// [Feature("SnowflakeSchemaReader: reads and fingerprints Snowflake schema using LocalStack")] [Collection(nameof(AssemblySetup))] +[Trait("Category", "Integration")] public sealed partial class SnowflakeSchemaIntegrationTests(ITestOutputHelper output) : TinyBddXunitBase(output) { private static readonly string? LocalStackAuthToken = diff --git a/tests/JD.Efcpt.Build.Tests/Integration/SqlServerSchemaIntegrationTests.cs b/tests/JD.Efcpt.Build.Tests/Integration/SqlServerSchemaIntegrationTests.cs index 580b91b8..f76aec7c 100644 --- a/tests/JD.Efcpt.Build.Tests/Integration/SqlServerSchemaIntegrationTests.cs +++ b/tests/JD.Efcpt.Build.Tests/Integration/SqlServerSchemaIntegrationTests.cs @@ -12,6 +12,7 @@ namespace JD.Efcpt.Build.Tests.Integration; [Feature("SqlServerSchemaReader: reads and fingerprints SQL Server schema using Testcontainers")] [Collection(nameof(AssemblySetup))] +[Trait("Category", "Integration")] public sealed partial class SqlServerSchemaIntegrationTests(ITestOutputHelper output) : TinyBddXunitBase(output) { private sealed record TestContext( diff --git a/tests/JD.Efcpt.Build.Tests/PipelineTests.cs b/tests/JD.Efcpt.Build.Tests/PipelineTests.cs index 0c3fa45a..862d665a 100644 --- a/tests/JD.Efcpt.Build.Tests/PipelineTests.cs +++ b/tests/JD.Efcpt.Build.Tests/PipelineTests.cs @@ -251,6 +251,7 @@ await Given("folders with existing dacpac", () => SetupWithExistingDacpac(SetupF [Scenario("End-to-end builds real dacpac and runs real efcpt CLI")] [Fact] + [Trait("Category", "Integration")] public Task End_to_end_generates_dacpac_and_runs_real_efcpt() => Given("folders setup", SetupFolders) .When("resolve inputs", ResolveInputs) diff --git a/tests/JD.Efcpt.Sdk.IntegrationTests/CodeGenerationTests.cs b/tests/JD.Efcpt.Sdk.IntegrationTests/CodeGenerationTests.cs index 2c762fb8..18cd60f9 100644 --- a/tests/JD.Efcpt.Sdk.IntegrationTests/CodeGenerationTests.cs +++ b/tests/JD.Efcpt.Sdk.IntegrationTests/CodeGenerationTests.cs @@ -7,6 +7,7 @@ namespace JD.Efcpt.Sdk.IntegrationTests; /// Detailed tests for code generation output. /// [Collection("Code Generation Tests")] +[Trait("Category", "Integration")] public class CodeGenerationTests : IDisposable { private readonly SdkPackageTestFixture _fixture; diff --git a/tests/JD.Efcpt.Sdk.IntegrationTests/DesignTimeBuildTests.cs b/tests/JD.Efcpt.Sdk.IntegrationTests/DesignTimeBuildTests.cs index fd4d59b5..feb034b9 100644 --- a/tests/JD.Efcpt.Sdk.IntegrationTests/DesignTimeBuildTests.cs +++ b/tests/JD.Efcpt.Sdk.IntegrationTests/DesignTimeBuildTests.cs @@ -9,6 +9,7 @@ namespace JD.Efcpt.Sdk.IntegrationTests; /// unless the user opts back in via EfcptRunDuringDesignTimeBuild=true. /// [Collection("Design-Time Build Tests")] +[Trait("Category", "Integration")] public class DesignTimeBuildTests : IDisposable { private const string SkippedMessage = "[Efcpt] Skipping EF Core Power Tools generation pipeline"; diff --git a/tests/JD.Efcpt.Sdk.IntegrationTests/FrameworkMsBuildTests.cs b/tests/JD.Efcpt.Sdk.IntegrationTests/FrameworkMsBuildTests.cs index f674544b..ceaa56a8 100644 --- a/tests/JD.Efcpt.Sdk.IntegrationTests/FrameworkMsBuildTests.cs +++ b/tests/JD.Efcpt.Sdk.IntegrationTests/FrameworkMsBuildTests.cs @@ -15,6 +15,7 @@ namespace JD.Efcpt.Sdk.IntegrationTests; /// fallback mechanism - this is the primary validation that VS builds work. /// [Collection("Framework MSBuild Tests")] +[Trait("Category", "Integration")] public class FrameworkMsBuildTests : IDisposable { private readonly SdkPackageTestFixture _fixture; diff --git a/tests/JD.Efcpt.Sdk.IntegrationTests/SdkIntegrationTests.cs b/tests/JD.Efcpt.Sdk.IntegrationTests/SdkIntegrationTests.cs index 44a92dae..2611e607 100644 --- a/tests/JD.Efcpt.Sdk.IntegrationTests/SdkIntegrationTests.cs +++ b/tests/JD.Efcpt.Sdk.IntegrationTests/SdkIntegrationTests.cs @@ -6,6 +6,7 @@ namespace JD.Efcpt.Sdk.IntegrationTests; #region Net8.0 SDK Tests [Collection("SDK Net8.0 Tests")] +[Trait("Category", "Integration")] public class SdkNet80Tests : IDisposable { private readonly SdkPackageTestFixture _fixture; @@ -113,6 +114,7 @@ public async Task Sdk_Net80_CleanRemovesGeneratedFiles() #region Net9.0 SDK Tests [Collection("SDK Net9.0 Tests")] +[Trait("Category", "Integration")] public class SdkNet90Tests : IDisposable { private readonly SdkPackageTestFixture _fixture; @@ -163,6 +165,7 @@ public async Task Sdk_Net90_GeneratesEntityModels() #region Net10.0 SDK Tests [Collection("SDK Net10.0 Tests")] +[Trait("Category", "Integration")] public class SdkNet100Tests : IDisposable { private readonly SdkPackageTestFixture _fixture; @@ -213,6 +216,7 @@ public async Task Sdk_Net100_GeneratesEntityModels() #region PackageReference (JD.Efcpt.Build) Tests [Collection("Build Package Tests")] +[Trait("Category", "Integration")] public class BuildPackageTests : IDisposable { private readonly SdkPackageTestFixture _fixture; diff --git a/tests/JD.Efcpt.Sdk.IntegrationTests/SqlGenerationIntegrationTests.cs b/tests/JD.Efcpt.Sdk.IntegrationTests/SqlGenerationIntegrationTests.cs index 65a70b50..2e4c91a3 100644 --- a/tests/JD.Efcpt.Sdk.IntegrationTests/SqlGenerationIntegrationTests.cs +++ b/tests/JD.Efcpt.Sdk.IntegrationTests/SqlGenerationIntegrationTests.cs @@ -15,6 +15,7 @@ namespace JD.Efcpt.Sdk.IntegrationTests; /// 2. DataAccessProject (EF Core) - generates models from DatabaseProject's DACPAC /// [Collection("SQL Generation Tests")] +[Trait("Category", "Integration")] public class SqlGenerationIntegrationTests : IAsyncDisposable { private readonly SdkPackageTestFixture _fixture; diff --git a/tests/JD.Efcpt.Sdk.IntegrationTests/SqlProjectTargetDiagnosticTests.cs b/tests/JD.Efcpt.Sdk.IntegrationTests/SqlProjectTargetDiagnosticTests.cs index 31aa60e9..775b97f2 100644 --- a/tests/JD.Efcpt.Sdk.IntegrationTests/SqlProjectTargetDiagnosticTests.cs +++ b/tests/JD.Efcpt.Sdk.IntegrationTests/SqlProjectTargetDiagnosticTests.cs @@ -9,6 +9,7 @@ namespace JD.Efcpt.Sdk.IntegrationTests; /// These tests will use binlog and detailed logging to trace target execution. /// [Collection("SQL Generation Tests")] +[Trait("Category", "Integration")] public class SqlProjectTargetDiagnosticTests : IAsyncDisposable { private readonly SdkPackageTestFixture _fixture; diff --git a/tests/JD.Efcpt.Sdk.IntegrationTests/TemplateTests.cs b/tests/JD.Efcpt.Sdk.IntegrationTests/TemplateTests.cs index 654a83f4..2de6197e 100644 --- a/tests/JD.Efcpt.Sdk.IntegrationTests/TemplateTests.cs +++ b/tests/JD.Efcpt.Sdk.IntegrationTests/TemplateTests.cs @@ -8,6 +8,7 @@ namespace JD.Efcpt.Sdk.IntegrationTests; /// Tests validate that the template creates projects with the expected structure and that they build correctly. /// [Collection("Template Tests")] +[Trait("Category", "Integration")] public partial class TemplateTests : IDisposable { private readonly TemplateTestFixture _fixture;