diff --git a/.github/workflows/run-integration-tests.yml b/.github/workflows/run-integration-tests.yml deleted file mode 100644 index 8de1899e0dfa..000000000000 --- a/.github/workflows/run-integration-tests.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Run integration tests - -on: - push: - branches: [develop, master] - pull_request: - types: [opened,reopened,synchronize] - -jobs: - test-integration: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup environment - uses: metamask/github-tools/.github/actions/setup-environment@main - - - name: test:integration:coverage - run: yarn test:integration:coverage diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml new file mode 100644 index 000000000000..a0240346af64 --- /dev/null +++ b/.github/workflows/run-tests.yml @@ -0,0 +1,142 @@ +name: Run tests + +on: + push: + branches: + - develop + - master + pull_request: + types: + - opened + - reopened + - synchronize + +jobs: + test-unit: + name: Unit tests + runs-on: ubuntu-latest + strategy: + matrix: + shard: [1, 2, 3, 4, 5, 6] + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup environment + uses: metamask/github-tools/.github/actions/setup-environment@main + + - name: test:unit:coverage + run: yarn test:unit:coverage --shard=${{ matrix.shard }}/${{ strategy.job-total }} + + - name: Rename coverage + run: mv coverage/unit/coverage-final.json coverage/unit/coverage-unit-${{matrix.shard}}.json + + - uses: actions/upload-artifact@v4 + with: + name: coverage-unit-${{matrix.shard}} + path: coverage/unit/coverage-unit-${{matrix.shard}}.json + + test-webpack: + name: Webpack tests + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup environment + uses: metamask/github-tools/.github/actions/setup-environment@main + + - name: test:unit:webpack:coverage + run: yarn test:unit:webpack:coverage + + - name: Rename coverage + run: mv coverage/webpack/coverage-final.json coverage/webpack/coverage-webpack.json + + - uses: actions/upload-artifact@v4 + with: + name: coverage-webpack + path: coverage/webpack/coverage-webpack.json + + test-integration: + name: Integration tests + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup environment + uses: metamask/github-tools/.github/actions/setup-environment@main + + - name: test:integration:coverage + run: yarn test:integration:coverage + + - name: Rename coverage + run: mv coverage/integration/coverage-final.json coverage/integration/coverage-integration.json + + - uses: actions/upload-artifact@v4 + with: + name: coverage-integration + path: coverage/integration/coverage-integration.json + + sonarcloud: + name: SonarCloud + runs-on: ubuntu-latest + needs: + - test-unit + - test-webpack + - test-integration + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Shallow clones should be disabled for better relevancy of analysis + + - name: Setup environment + uses: metamask/github-tools/.github/actions/setup-environment@main + + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: coverage + merge-multiple: true + + - name: Merge coverage reports + run: yarn nyc merge coverage .nyc_output/coverage-final.json && yarn nyc report --reporter lcov + + - uses: actions/upload-artifact@v4 + with: + name: lcov.info + path: coverage/lcov.info + + - name: Get Sonar coverage + id: get-sonar-coverage + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: | + projectKey=$(grep 'sonar.projectKey=' sonar-project.properties | cut -d'=' -f2) + sonar_coverage=$(curl --silent --header "Authorization: Bearer $SONAR_TOKEN" "https://sonarcloud.io/api/measures/component?component=$projectKey&metricKeys=coverage" | jq -r '.component.measures[0].value // 0') + echo "The Sonar coverage of $projectKey is $sonar_coverage%." + echo 'SONAR_COVERAGE='"$sonar_coverage" >> "$GITHUB_OUTPUT" + + - name: Validate test coverage + env: + SONAR_COVERAGE: ${{ steps.get-sonar-coverage.outputs.SONAR_COVERAGE }} + run: | + coverage=$(yarn nyc report --reporter=text-summary | grep 'Lines' | awk '{gsub(/%/, ""); print $3}') + if [ -z "$coverage" ]; then + echo "::error::Could not retrieve test coverage." + exit 1 + fi + if (( $(echo "$coverage < $SONAR_COVERAGE" | bc -l) )); then + echo "::error::Quality gate failed for test coverage. Current test coverage is $coverage%, please increase coverage to at least $SONAR_COVERAGE%." + exit 1 + else + echo "Test coverage is $coverage%. Quality gate passed." + fi + + - name: SonarCloud Scan + # This is SonarSource/sonarcloud-github-action@v2.0.0 + uses: SonarSource/sonarcloud-github-action@4b4d7634dab97dcee0b75763a54a6dc92a9e6bc1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/run-unit-tests.yml b/.github/workflows/run-unit-tests.yml deleted file mode 100644 index 6765352f5d7d..000000000000 --- a/.github/workflows/run-unit-tests.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: Run unit tests - -on: - push: - branches: [develop, master] - pull_request: - types: [opened,reopened,synchronize] - -jobs: - test-unit: - runs-on: ubuntu-latest - strategy: - matrix: - shard: [1, 2, 3, 4, 5, 6] - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup environment - uses: metamask/github-tools/.github/actions/setup-environment@main - - - name: test:unit:coverage - run: yarn test:unit:coverage --shard=${{ matrix.shard }}/${{ strategy.job-total }} - - - name: Rename coverage to shard coverage - run: mv coverage/coverage-final.json coverage/coverage-${{matrix.shard}}.json - - - uses: actions/upload-artifact@v4 - with: - name: coverage-${{matrix.shard}} - path: coverage/coverage-${{matrix.shard}}.json - - test-webpack: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup environment - uses: metamask/github-tools/.github/actions/setup-environment@main - - - name: test:unit:webpack:coverage - run: yarn test:unit:webpack:coverage - - - name: Rename coverage - run: mv coverage/coverage-final.json coverage/coverage-webpack.json - - - uses: actions/upload-artifact@v4 - with: - name: coverage-webpack - path: coverage/coverage-webpack.json - - report-coverage: - runs-on: ubuntu-latest - needs: - - test-unit - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Download coverage from shards - uses: actions/download-artifact@v4 - with: - path: coverage - pattern: coverage-* - merge-multiple: true - - - name: Upload coverage to Codecov - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 - with: - token: ${{ secrets.CODECOV_TOKEN }} - fail_ci_if_error: true diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml deleted file mode 100644 index f5e1a0552dd1..000000000000 --- a/.github/workflows/sonar.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Sonar -on: - push: - branches: - - develop - pull_request: - branches: - - develop - -jobs: - sonarcloud: - name: SonarCloud - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # Shallow clones should be disabled for better relevancy of analysis - - name: SonarCloud Scan - # This is SonarSource/sonarcloud-github-action@v2.0.0 - uses: SonarSource/sonarcloud-github-action@4b4d7634dab97dcee0b75763a54a6dc92a9e6bc1 - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/jest.config.js b/jest.config.js index 605848626405..dbfb0522cff7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -6,9 +6,9 @@ module.exports = { '/development/build/transforms/**/*.js', '/test/unit-global/**/*.test.(js|ts|tsx)', ], - coverageDirectory: './coverage', + coverageDirectory: './coverage/unit', coveragePathIgnorePatterns: ['.stories.*', '.snap'], - coverageReporters: process.env.CI ? ['json'] : ['html', 'json'], + coverageReporters: ['html', 'json'], reporters: [ 'default', [ diff --git a/package.json b/package.json index 51d5ac234bbc..4cee6dcdd7b0 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "test:unit:watch": "jest --watch", "test:unit:coverage": "jest --coverage", "test:unit:webpack": "tsx --test development/webpack/test/*.test.ts", - "test:unit:webpack:coverage": "nyc --reporter=html --reporter=json --reporter=text tsx --test development/webpack/test/*.test.ts", + "test:unit:webpack:coverage": "nyc --reporter=html --reporter=json --reporter=text --report-dir=./coverage/webpack tsx --test development/webpack/test/*.test.ts", "test:integration": "jest --config jest.integration.config.js", "test:integration:coverage": "jest --config jest.integration.config.js --coverage", "test:e2e:chrome": "SELENIUM_BROWSER=chrome node test/e2e/run-all.js", diff --git a/sonar-project.properties b/sonar-project.properties index 0455fa9634e2..3b8ff8dfba9f 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,5 +1,5 @@ -sonar.projectKey=metamask-extension-private -sonar.organization=metamask +sonar.projectKey=metamask-extension +sonar.organization=consensys # Source sonar.sources=app,development,offscreen,shared,types,ui @@ -8,7 +8,8 @@ sonar.exclusions=**/*.test.**,**/*.spec.**,app/images # Tests sonar.tests=app,test,development,offscreen,shared,types,ui sonar.test.inclusions=**/*.test.**,**/*.spec.** -sonar.javascript.lcov.reportPaths=tests/coverage/lcov.info + +sonar.javascript.lcov.reportPaths=coverage/lcov.info # Fail CI job if quality gate failures -sonar.qualitygate.wait=false \ No newline at end of file +sonar.qualitygate.wait=true