diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e527e30..02d4ef7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,13 +25,14 @@ jobs: - name: Install dependencies run: | dart pub global activate melos + dart pub global activate coverage melos bootstrap - name: Setup integration test run: ./scripts/setup_integration_tests.sh - - name: Run tests - run: melos run test + - name: Run tests with coverage + run: melos run test:coverage - name: Run petstore integration tests run: | @@ -140,3 +141,56 @@ jobs: cd integration_test/server_variables/server_variables_test dart pub get dart test --concurrency=1 + - name: Format and merge coverage reports + if: matrix.sdk == 'stable' + run: | + # Ensure output directory exists before format_coverage writes files + mkdir -p coverage + + # Process each package separately to maintain correct source file paths (packages/*/lib) + dart pub global run coverage:format_coverage \ + --lcov \ + --in=packages/tonik/coverage \ + --out=coverage/tonik.lcov.info \ + --report-on=packages/tonik/lib \ + --check-ignore || true + + dart pub global run coverage:format_coverage \ + --lcov \ + --in=packages/tonik_core/coverage \ + --out=coverage/tonik_core.lcov.info \ + --report-on=packages/tonik_core/lib \ + --check-ignore || true + + dart pub global run coverage:format_coverage \ + --lcov \ + --in=packages/tonik_generate/coverage \ + --out=coverage/tonik_generate.lcov.info \ + --report-on=packages/tonik_generate/lib \ + --check-ignore || true + + dart pub global run coverage:format_coverage \ + --lcov \ + --in=packages/tonik_parse/coverage \ + --out=coverage/tonik_parse.lcov.info \ + --report-on=packages/tonik_parse/lib \ + --check-ignore || true + + dart pub global run coverage:format_coverage \ + --lcov \ + --in=packages/tonik_util/coverage \ + --out=coverage/tonik_util.lcov.info \ + --report-on=packages/tonik_util/lib \ + --check-ignore || true + + # Combine per-package reports into single file for codecov upload + cat coverage/*.lcov.info > coverage/lcov.info 2>/dev/null || echo "No coverage files found" + + - name: Upload coverage to Codecov + if: matrix.sdk == 'stable' + uses: codecov/codecov-action@v5 + with: + files: ./coverage/lcov.info + fail_ci_if_error: false + disable_search: true + token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..97ccf9d --- /dev/null +++ b/codecov.yml @@ -0,0 +1,48 @@ +codecov: + require_ci_to_pass: false + +coverage: + precision: 2 + round: down + range: "0...100" + + status: + project: + default: + informational: true + target: auto + + patch: + default: + informational: true + target: auto + +ignore: + - "integration_test/**" + - "**/test/**" + - "**/*.g.dart" + - "**/*.freezed.dart" + +comment: + layout: "reach,diff,flags,tree,files" + behavior: default + require_changes: false + require_base: false + require_head: true + +flags: + tonik: + paths: + - packages/tonik/lib + tonik_core: + paths: + - packages/tonik_core/lib + tonik_generate: + paths: + - packages/tonik_generate/lib + tonik_parse: + paths: + - packages/tonik_parse/lib + tonik_util: + paths: + - packages/tonik_util/lib diff --git a/pubspec.yaml b/pubspec.yaml index 20aa257..0f1f364 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,6 +18,7 @@ dependencies: path: ^1.9.1 dev_dependencies: + coverage: ^1.10.0 melos: ^7.3.0 test: ^1.28.0 timezone: ^0.11.0 @@ -29,6 +30,11 @@ melos: run: dart test exec: concurrency: 1 + + test:coverage: + run: dart test --coverage=coverage + exec: + concurrency: 1 generate: run: flutter pub run build_runner build --delete-conflicting-outputs