fix(tests): add missing columns to ScheduledMessages schema for MySQL… #408
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: SonarCloud Analysis | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| types: [opened, synchronize, reopened] | |
| workflow_dispatch: | |
| env: | |
| DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true | |
| DOTNET_NOLOGO: true | |
| DOTNET_CLI_TELEMETRY_OPTOUT: true | |
| jobs: | |
| # Build job - shared by coverage and analysis | |
| build: | |
| name: Build | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 15 | |
| permissions: | |
| contents: read | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: actions/setup-dotnet@v5 | |
| with: | |
| dotnet-version: 10.0.x | |
| - name: Cache NuGet packages | |
| uses: actions/cache@v5 | |
| with: | |
| path: ~/.nuget/packages | |
| key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props') }} | |
| restore-keys: | | |
| ${{ runner.os }}-nuget- | |
| - name: Restore and Build | |
| run: | | |
| dotnet restore Encina.slnx | |
| dotnet build Encina.slnx --configuration Release --no-restore | |
| - name: Upload build artifacts | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: build-output | |
| path: | | |
| **/bin/Release/** | |
| **/obj/**/*.assets.json | |
| retention-days: 1 | |
| # Coverage collection - parallel shards (same as CI for full coverage) | |
| coverage: | |
| name: Coverage (${{ matrix.shard.name }}) | |
| needs: build | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 20 | |
| permissions: | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| shard: | |
| - name: Testing | |
| filter: "FullyQualifiedName~Encina.UnitTests.Testing" | |
| - name: Messaging | |
| filter: "FullyQualifiedName~Encina.UnitTests.Messaging|FullyQualifiedName~Encina.UnitTests.Caching" | |
| - name: Data | |
| filter: "FullyQualifiedName~Encina.UnitTests.EntityFrameworkCore|FullyQualifiedName~Encina.UnitTests.Dapper|FullyQualifiedName~Encina.UnitTests.ADO|FullyQualifiedName~Encina.UnitTests.MongoDB|FullyQualifiedName~Encina.UnitTests.Marten" | |
| - name: Cloud | |
| filter: "FullyQualifiedName~Encina.UnitTests.AzureFunctions|FullyQualifiedName~Encina.UnitTests.AzureServiceBus|FullyQualifiedName~Encina.UnitTests.Polly|FullyQualifiedName~Encina.UnitTests.AwsLambda|FullyQualifiedName~Encina.UnitTests.Aspire|FullyQualifiedName~Encina.UnitTests.OpenTelemetry" | |
| - name: Remaining | |
| filter: "FullyQualifiedName~Encina.UnitTests.Core|FullyQualifiedName~Encina.UnitTests.DomainModeling|FullyQualifiedName~Encina.UnitTests.AspNetCore|FullyQualifiedName~Encina.UnitTests.gRPC|FullyQualifiedName~Encina.UnitTests.SignalR|FullyQualifiedName~Encina.UnitTests.GuardClauses|FullyQualifiedName~Encina.UnitTests.MQTT|FullyQualifiedName~Encina.UnitTests.NATS|FullyQualifiedName~Encina.UnitTests.RabbitMQ|FullyQualifiedName~Encina.UnitTests.AmazonSQS|FullyQualifiedName~Encina.UnitTests.Kafka|FullyQualifiedName~Encina.UnitTests.Workflows|FullyQualifiedName~Encina.UnitTests.MiniValidator|FullyQualifiedName~Encina.UnitTests.FluentValidation|FullyQualifiedName~Encina.UnitTests.DataAnnotations|FullyQualifiedName~Encina.UnitTests.Quartz|FullyQualifiedName~Encina.UnitTests.Hangfire|FullyQualifiedName~Encina.UnitTests.Extensions|FullyQualifiedName~Encina.UnitTests.Refit|FullyQualifiedName~Encina.UnitTests.Cli" | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: actions/setup-dotnet@v5 | |
| with: | |
| dotnet-version: 10.0.x | |
| - name: Cache NuGet packages | |
| uses: actions/cache@v5 | |
| with: | |
| path: ~/.nuget/packages | |
| key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props') }} | |
| restore-keys: | | |
| ${{ runner.os }}-nuget- | |
| - uses: actions/download-artifact@v7 | |
| with: | |
| name: build-output | |
| - name: Restore test dependencies | |
| run: dotnet restore tests/Encina.UnitTests/Encina.UnitTests.csproj | |
| - name: Run tests with coverage | |
| run: | | |
| dotnet test tests/Encina.UnitTests/Encina.UnitTests.csproj \ | |
| --no-build -c Release \ | |
| --filter "${{ matrix.shard.filter }}" \ | |
| --collect:"XPlat Code Coverage" \ | |
| --settings coverlet.runsettings \ | |
| --results-directory artifacts/coverage \ | |
| --logger "console;verbosity=minimal" | |
| continue-on-error: true | |
| - name: List coverage files | |
| run: find artifacts -name "*.xml" -type f 2>/dev/null || echo "No XML files found" | |
| - name: Upload coverage | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: coverage-${{ matrix.shard.name }} | |
| path: artifacts/coverage/**/coverage.opencover.xml | |
| retention-days: 1 | |
| if-no-files-found: warn | |
| # SonarCloud analysis - runs after coverage collection | |
| sonarcloud: | |
| name: SonarCloud Analysis | |
| needs: [build, coverage] | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 20 | |
| permissions: | |
| contents: read | |
| pull-requests: read | |
| if: always() && needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: actions/setup-dotnet@v5 | |
| with: | |
| dotnet-version: 10.0.x | |
| - name: Cache NuGet packages | |
| uses: actions/cache@v5 | |
| with: | |
| path: ~/.nuget/packages | |
| key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props') }} | |
| restore-keys: | | |
| ${{ runner.os }}-nuget- | |
| - name: Install SonarScanner | |
| run: dotnet tool install --global dotnet-sonarscanner | |
| - name: Download all coverage reports | |
| uses: actions/download-artifact@v7 | |
| with: | |
| pattern: coverage-* | |
| path: artifacts/coverage | |
| merge-multiple: true | |
| - name: Find coverage reports | |
| id: coverage | |
| run: | | |
| COVERAGE_FILES=$(find artifacts/coverage -name "coverage.opencover.xml" -type f 2>/dev/null | tr '\n' ',' | sed 's/,$//') | |
| if [ -n "$COVERAGE_FILES" ]; then | |
| echo "paths=$COVERAGE_FILES" >> $GITHUB_OUTPUT | |
| echo "Found coverage reports: $COVERAGE_FILES" | |
| else | |
| echo "paths=" >> $GITHUB_OUTPUT | |
| echo "No coverage reports found" | |
| fi | |
| - name: Restore source projects | |
| run: dotnet restore Encina.Source.sln | |
| - name: Begin SonarCloud analysis | |
| env: | |
| SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} | |
| run: | | |
| COVERAGE_ARG="" | |
| if [ -n "${{ steps.coverage.outputs.paths }}" ]; then | |
| COVERAGE_ARG="/d:sonar.cs.opencover.reportsPaths=${{ steps.coverage.outputs.paths }}" | |
| echo "Using coverage reports: ${{ steps.coverage.outputs.paths }}" | |
| else | |
| echo "No coverage reports available" | |
| fi | |
| # Exclusions: Integration code that requires external services (not testable with unit tests) | |
| COVERAGE_EXCLUSIONS="src/Encina.Testing*/**/*.cs,\ | |
| src/Encina.Aspire*/**/*.cs,\ | |
| src/Encina.AspNetCore/**/*.cs,\ | |
| src/Encina.AzureFunctions/**/*.cs,\ | |
| src/Encina.AwsLambda/**/*.cs,\ | |
| src/Encina.AmazonSQS/**/*.cs,\ | |
| src/Encina.AzureServiceBus/**/*.cs,\ | |
| src/Encina.Cli/**/*.cs,\ | |
| src/Encina.DomainModeling/**/*.cs,\ | |
| src/Encina.FluentValidation/**/*.cs,\ | |
| src/Encina.DataAnnotations/**/*.cs,\ | |
| src/Encina.MiniValidator/**/*.cs,\ | |
| src/Encina.Dapper*/**/*.cs,\ | |
| src/Encina.ADO*/**/*.cs,\ | |
| src/Encina.MongoDB/**/*.cs,\ | |
| src/Encina.Marten/**/*.cs,\ | |
| src/Encina.DistributedLock*/**/*.cs,\ | |
| src/Encina.Caching*/**/*.cs,\ | |
| src/Encina.Redis.PubSub/**/*.cs,\ | |
| src/Encina.Hangfire/**/*.cs,\ | |
| src/Encina.Quartz/**/*.cs,\ | |
| src/Encina.SignalR/**/*.cs,\ | |
| src/Encina.gRPC/**/*.cs,\ | |
| src/Encina.GraphQL/**/*.cs,\ | |
| src/Encina.RabbitMQ/**/*.cs,\ | |
| src/Encina.Kafka/**/*.cs,\ | |
| src/Encina.MQTT/**/*.cs,\ | |
| src/Encina.NATS/**/*.cs,\ | |
| src/Encina.OpenTelemetry/**/*.cs,\ | |
| src/Encina.Polly/**/*.cs,\ | |
| src/Encina.Refit/**/*.cs,\ | |
| src/Encina.Workflows/**/*.cs,\ | |
| src/Encina.Extensions.Resilience/**/*.cs,\ | |
| src/Encina.InMemory/**/*.cs,\ | |
| src/Encina.EntityFrameworkCore/**/*.cs,\ | |
| src/Encina/Modules/**/*.cs,\ | |
| src/Encina/Pipeline/Behaviors/*Activity*.cs,\ | |
| src/Encina/Pipeline/Behaviors/*Metrics*.cs,\ | |
| src/Encina/Dispatchers/Strategies/**/*.cs,\ | |
| src/Encina/Pipeline/Stream*.cs,\ | |
| src/Encina/Core/StreamDispatcher.cs,\ | |
| src/Encina/Core/Encina.Stream.cs,\ | |
| src/Encina/Pipeline/EncinaBehaviorGuards.cs,\ | |
| src/Encina.Messaging/Recoverability/**/*.cs,\ | |
| src/Encina.Messaging/DeadLetter/**/*.cs,\ | |
| src/Encina.Messaging/Sagas/SagaNotFoundDispatcher.cs,\ | |
| src/Encina.Messaging/*ServiceCollectionExtensions.cs,\ | |
| src/Encina.Messaging/ScatterGather/**/*.cs,\ | |
| src/Encina.Messaging/Health/**/*.cs,\ | |
| src/Encina/Diagnostics/**/*.cs,\ | |
| src/Encina/Pipeline/*Guards.cs,\ | |
| **/Scripts/*.sql" | |
| CPD_EXCLUSIONS="src/Encina.Dapper.*/**/*.cs,src/Encina.Dapper.*/Scripts/*.sql,src/Encina.ADO.*/**/*.cs,src/Encina.ADO.*/Scripts/*.sql,src/Encina.Testing*/**/*.cs" | |
| dotnet sonarscanner begin \ | |
| /k:"dlrivada_Encina" \ | |
| /o:"dlrivada" \ | |
| /d:sonar.token="${{ secrets.SONAR_TOKEN }}" \ | |
| /d:sonar.host.url="https://sonarcloud.io" \ | |
| $COVERAGE_ARG \ | |
| /d:sonar.coverage.exclusions="$COVERAGE_EXCLUSIONS" \ | |
| /d:sonar.cpd.exclusions="$CPD_EXCLUSIONS" \ | |
| /d:sonar.exclusions="**/Migrations/**,**/*.g.cs,**/obj/**,**/bin/**,tests/**/*" \ | |
| /d:sonar.issue.ignore.multicriteria=e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e30,e31,e32,e33,e34,e35,e36,e37,e38 \ | |
| /d:sonar.issue.ignore.multicriteria.e1.ruleKey=csharpsquid:S2077 \ | |
| /d:sonar.issue.ignore.multicriteria.e1.resourceKey="src/Encina.Dapper.*/**/*Store*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e2.ruleKey=csharpsquid:S2077 \ | |
| /d:sonar.issue.ignore.multicriteria.e2.resourceKey="src/Encina.ADO.*/**/*Store*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e3.ruleKey=plsql:S1523 \ | |
| /d:sonar.issue.ignore.multicriteria.e3.resourceKey="src/**/Scripts/*.sql" \ | |
| /d:sonar.issue.ignore.multicriteria.e4.ruleKey=csharpsquid:S1135 \ | |
| /d:sonar.issue.ignore.multicriteria.e4.resourceKey="src/Encina.Testing/**/NeedsMutationCoverageAttribute.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e5.ruleKey=csharpsquid:S1135 \ | |
| /d:sonar.issue.ignore.multicriteria.e5.resourceKey="src/Encina.Cli/**/CodeGenerator.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e6.ruleKey=csharpsquid:S101 \ | |
| /d:sonar.issue.ignore.multicriteria.e6.resourceKey="src/Encina.ADO.*/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e7.ruleKey=csharpsquid:S101 \ | |
| /d:sonar.issue.ignore.multicriteria.e7.resourceKey="src/Encina.AmazonSQS/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e8.ruleKey=csharpsquid:S101 \ | |
| /d:sonar.issue.ignore.multicriteria.e8.resourceKey="src/Encina.MQTT/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e9.ruleKey=csharpsquid:S101 \ | |
| /d:sonar.issue.ignore.multicriteria.e9.resourceKey="src/Encina.NATS/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e10.ruleKey=csharpsquid:S4136 \ | |
| /d:sonar.issue.ignore.multicriteria.e10.resourceKey="src/Encina.Testing*/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e11.ruleKey=csharpsquid:S4136 \ | |
| /d:sonar.issue.ignore.multicriteria.e11.resourceKey="src/Encina.DomainModeling/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e12.ruleKey=csharpsquid:S4136 \ | |
| /d:sonar.issue.ignore.multicriteria.e12.resourceKey="src/Encina.GuardClauses/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e13.ruleKey=csharpsquid:S3267 \ | |
| /d:sonar.issue.ignore.multicriteria.e13.resourceKey="src/Encina.Marten/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e14.ruleKey=csharpsquid:S3220 \ | |
| /d:sonar.issue.ignore.multicriteria.e14.resourceKey="src/Encina.Marten/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e15.ruleKey=csharpsquid:S3267 \ | |
| /d:sonar.issue.ignore.multicriteria.e15.resourceKey="src/Encina.DomainModeling/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e16.ruleKey=csharpsquid:S3267 \ | |
| /d:sonar.issue.ignore.multicriteria.e16.resourceKey="src/Encina.Messaging/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e17.ruleKey=csharpsquid:S2737 \ | |
| /d:sonar.issue.ignore.multicriteria.e17.resourceKey="src/Encina.Testing*/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e18.ruleKey=csharpsquid:S1694 \ | |
| /d:sonar.issue.ignore.multicriteria.e18.resourceKey="src/Encina.DomainModeling/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e19.ruleKey=csharpsquid:S6667 \ | |
| /d:sonar.issue.ignore.multicriteria.e19.resourceKey="src/Encina.DomainModeling/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e20.ruleKey=csharpsquid:S1210 \ | |
| /d:sonar.issue.ignore.multicriteria.e20.resourceKey="src/Encina.DomainModeling/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e21.ruleKey=csharpsquid:S1192 \ | |
| /d:sonar.issue.ignore.multicriteria.e21.resourceKey="src/Encina.Cli/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e22.ruleKey=csharpsquid:S6612 \ | |
| /d:sonar.issue.ignore.multicriteria.e22.resourceKey="src/Encina.Marten/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e23.ruleKey=csharpsquid:S3236 \ | |
| /d:sonar.issue.ignore.multicriteria.e23.resourceKey="src/Encina.Messaging/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e24.ruleKey=csharpsquid:S1192 \ | |
| /d:sonar.issue.ignore.multicriteria.e24.resourceKey="src/Encina.ADO.*/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e25.ruleKey=csharpsquid:S1192 \ | |
| /d:sonar.issue.ignore.multicriteria.e25.resourceKey="src/Encina.AmazonSQS/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e26.ruleKey=csharpsquid:S1192 \ | |
| /d:sonar.issue.ignore.multicriteria.e26.resourceKey="src/Encina.OpenTelemetry/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e27.ruleKey=csharpsquid:S1694 \ | |
| /d:sonar.issue.ignore.multicriteria.e27.resourceKey="src/Encina/Core/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e28.ruleKey=csharpsquid:S3267 \ | |
| /d:sonar.issue.ignore.multicriteria.e28.resourceKey="src/Encina/Core/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e29.ruleKey=csharpsquid:S3241 \ | |
| /d:sonar.issue.ignore.multicriteria.e29.resourceKey="src/Encina/Dispatchers/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e30.ruleKey=csharpsquid:S3220 \ | |
| /d:sonar.issue.ignore.multicriteria.e30.resourceKey="src/Encina/Dispatchers/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e31.ruleKey=csharpsquid:S6608 \ | |
| /d:sonar.issue.ignore.multicriteria.e31.resourceKey="src/Encina/Dispatchers/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e32.ruleKey=csharpsquid:S1192 \ | |
| /d:sonar.issue.ignore.multicriteria.e32.resourceKey="src/Encina/Pipeline/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e33.ruleKey=csharpsquid:S1133 \ | |
| /d:sonar.issue.ignore.multicriteria.e33.resourceKey="src/Encina.Testing*/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e34.ruleKey=csharpsquid:S1192 \ | |
| /d:sonar.issue.ignore.multicriteria.e34.resourceKey="src/Encina.Dapper.*/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e35.ruleKey=csharpsquid:S3267 \ | |
| /d:sonar.issue.ignore.multicriteria.e35.resourceKey="src/Encina/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e36.ruleKey=csharpsquid:S3220 \ | |
| /d:sonar.issue.ignore.multicriteria.e36.resourceKey="src/Encina/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e37.ruleKey=csharpsquid:S6608 \ | |
| /d:sonar.issue.ignore.multicriteria.e37.resourceKey="src/Encina/**/*.cs" \ | |
| /d:sonar.issue.ignore.multicriteria.e38.ruleKey=csharpsquid:S3241 \ | |
| /d:sonar.issue.ignore.multicriteria.e38.resourceKey="src/Encina/**/*.cs" \ | |
| /d:sonar.verbose=false | |
| - name: Build for SonarCloud analysis | |
| run: dotnet build Encina.Source.sln --configuration Release --no-restore | |
| - name: End SonarCloud analysis | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} | |
| run: dotnet sonarscanner end /d:sonar.token="$SONAR_TOKEN" |