|
|
@@ -1,6 +1,9 @@
|
|
|
name: Tests
|
|
|
|
|
|
on:
|
|
|
+ push:
|
|
|
+ branches:
|
|
|
+ - main
|
|
|
workflow_dispatch:
|
|
|
pull_request:
|
|
|
branches:
|
|
|
@@ -14,7 +17,45 @@ permissions:
|
|
|
pull-requests: write # Needed to add comments/annotations to PRs
|
|
|
|
|
|
jobs:
|
|
|
+ quality-checks:
|
|
|
+ runs-on: ubuntu-latest
|
|
|
+ name: Quality Checks
|
|
|
+ steps:
|
|
|
+ - name: Checkout code
|
|
|
+ uses: actions/checkout@v4
|
|
|
+
|
|
|
+ - name: Setup Node.js environment
|
|
|
+ uses: actions/setup-node@v4
|
|
|
+ with:
|
|
|
+ node-version: 22
|
|
|
+
|
|
|
+ - name: Cache root dependencies
|
|
|
+ uses: actions/cache@v4
|
|
|
+ id: root-cache
|
|
|
+ with:
|
|
|
+ path: node_modules
|
|
|
+ key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }}
|
|
|
+
|
|
|
+ - name: Cache webview-ui dependencies
|
|
|
+ uses: actions/cache@v4
|
|
|
+ id: webview-cache
|
|
|
+ with:
|
|
|
+ path: webview-ui/node_modules
|
|
|
+ key: ${{ runner.os }}-npm-webview-${{ hashFiles('webview-ui/package-lock.json') }}
|
|
|
+
|
|
|
+ - name: Install root dependencies
|
|
|
+ if: steps.root-cache.outputs.cache-hit != 'true'
|
|
|
+ run: npm ci
|
|
|
+
|
|
|
+ - name: Install webview-ui dependencies
|
|
|
+ if: steps.webview-cache.outputs.cache-hit != 'true'
|
|
|
+ run: cd webview-ui && npm ci
|
|
|
+
|
|
|
+ - name: Run Quality Checks (Parallel)
|
|
|
+ run: npm run ci:check-all
|
|
|
+
|
|
|
test:
|
|
|
+ needs: quality-checks
|
|
|
strategy:
|
|
|
fail-fast: false
|
|
|
matrix:
|
|
|
@@ -33,18 +74,6 @@ jobs:
|
|
|
with:
|
|
|
node-version: 22
|
|
|
|
|
|
- # Setup Python for coverage script
|
|
|
- - name: Setup Python
|
|
|
- uses: actions/setup-python@v4
|
|
|
- with:
|
|
|
- python-version: "3.10"
|
|
|
-
|
|
|
- - name: Install Python dependencies
|
|
|
- run: |
|
|
|
- python -m pip install --upgrade pip
|
|
|
- pip install requests
|
|
|
-
|
|
|
- # Cache root dependencies - only reuse if package-lock.json exactly matches
|
|
|
- name: Cache root dependencies
|
|
|
uses: actions/cache@v4
|
|
|
id: root-cache
|
|
|
@@ -52,7 +81,6 @@ jobs:
|
|
|
path: node_modules
|
|
|
key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }}
|
|
|
|
|
|
- # Cache webview-ui dependencies - only reuse if package-lock.json exactly matches
|
|
|
- name: Cache webview-ui dependencies
|
|
|
uses: actions/cache@v4
|
|
|
id: webview-cache
|
|
|
@@ -68,60 +96,60 @@ jobs:
|
|
|
if: steps.webview-cache.outputs.cache-hit != 'true'
|
|
|
run: cd webview-ui && npm ci
|
|
|
|
|
|
- - name: Install xvfb on Linux
|
|
|
- if: runner.os == 'Linux'
|
|
|
- run: sudo apt-get update && sudo apt-get install -y xvfb
|
|
|
-
|
|
|
- name: Set up NPM on Windows
|
|
|
if: runner.os == 'Windows'
|
|
|
run: |
|
|
|
npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"
|
|
|
|
|
|
- - name: Type Check
|
|
|
- run: npm run check-types
|
|
|
-
|
|
|
- - name: Lint Check
|
|
|
- run: npm run lint
|
|
|
-
|
|
|
- - name: Format Check
|
|
|
- run: npm run format
|
|
|
-
|
|
|
- # Build the extension before running tests
|
|
|
+ # Build the extension and tests (without redundant checks)
|
|
|
- name: Build Tests and Extension
|
|
|
- run: npm run pretest
|
|
|
+ run: npm run ci:build
|
|
|
|
|
|
- - name: Unit Tests (with coverage on Linux)
|
|
|
+ - name: Unit Tests with coverage - Linux
|
|
|
+ id: unit_tests_linux
|
|
|
+ continue-on-error: true
|
|
|
+ if: runner.os == 'Linux'
|
|
|
run: |
|
|
|
- if [ "${{ runner.os }}" = "Linux" ]; then
|
|
|
- npm install --no-save nyc
|
|
|
npx nyc --nycrc-path .nycrc.unit.json --reporter=lcov npm run test:unit
|
|
|
- else
|
|
|
- npm run test:unit
|
|
|
- fi
|
|
|
|
|
|
- # Run extension tests with coverage
|
|
|
- - name: Extension Integration Tests with Coverage
|
|
|
- id: extension_coverage
|
|
|
+ - name: Unit Tests - Non-Linux
|
|
|
+ id: unit_tests_non_linux
|
|
|
continue-on-error: true
|
|
|
+ if: runner.os != 'Linux'
|
|
|
run: |
|
|
|
- node ./scripts/test-ci.js 2>&1 | tee extension_coverage.txt
|
|
|
- # Default the encoding to UTF-8 - It's not the default on Windows
|
|
|
- PYTHONUTF8=1 PYTHONPATH=.github/scripts python -m coverage_check extract-coverage extension_coverage.txt --type=extension --github-output --verbose
|
|
|
+ npm run test:unit
|
|
|
+
|
|
|
+ - name: Extension Integration Tests - Linux
|
|
|
+ id: integration_tests_linux
|
|
|
+ continue-on-error: true
|
|
|
+ if: runner.os == 'Linux'
|
|
|
+ run: xvfb-run -a npm run test:coverage
|
|
|
+
|
|
|
+ - name: Extension Integration Tests - Non-Linux
|
|
|
+ id: integration_tests_non_linux
|
|
|
+ continue-on-error: true
|
|
|
+ if: runner.os != 'Linux'
|
|
|
+ run: npm run test:integration
|
|
|
|
|
|
- # Run webview tests with coverage
|
|
|
- name: Webview Tests with Coverage
|
|
|
- id: webview_coverage
|
|
|
+ id: webview_tests
|
|
|
continue-on-error: true
|
|
|
run: |
|
|
|
cd webview-ui
|
|
|
- # Ensure coverage dependency is installed
|
|
|
- npm install --no-save @vitest/coverage-v8
|
|
|
- npm run test:coverage 2>&1 | tee webview_coverage.txt
|
|
|
- cd ..
|
|
|
- # Default the encoding to UTF-8 - It's not the default on Windows
|
|
|
- PYTHONUTF8=1 PYTHONPATH=.github/scripts python -m coverage_check extract-coverage webview-ui/webview_coverage.txt --type=webview --github-output --verbose
|
|
|
-
|
|
|
- # Save coverage reports as artifacts (workflow-scoped)
|
|
|
+ npm run test:coverage
|
|
|
+
|
|
|
+ - name: Check Test Results
|
|
|
+ if: always()
|
|
|
+ run: |
|
|
|
+ failed=""
|
|
|
+ [[ "${{ steps.unit_tests_linux.outcome }}" == "failure" && "${{ runner.os }}" == "Linux" ]] && failed="$failed unit_tests_linux"
|
|
|
+ [[ "${{ steps.unit_tests_non_linux.outcome }}" == "failure" && "${{ runner.os }}" != "Linux" ]] && failed="$failed unit_tests_non_linux"
|
|
|
+ [[ "${{ steps.integration_tests_linux.outcome }}" == "failure" && "${{ runner.os }}" == "Linux" ]] && failed="$failed integration_tests_linux"
|
|
|
+ [[ "${{ steps.integration_tests_non_linux.outcome }}" == "failure" && "${{ runner.os }}" != "Linux" ]] && failed="$failed integration_tests_non_linux"
|
|
|
+ [[ "${{ steps.webview_tests.outcome }}" == "failure" ]] && failed="$failed webview_tests"
|
|
|
+ [[ -n "$failed" ]] && { echo "❌ The following test suites failed:$failed"; exit 1; }
|
|
|
+ echo "✅ All tests passed"
|
|
|
+
|
|
|
- name: Save Coverage Reports
|
|
|
uses: actions/upload-artifact@v4
|
|
|
# Only upload artifacts on Linux - We only need coverage from one OS
|
|
|
@@ -129,27 +157,11 @@ jobs:
|
|
|
with:
|
|
|
name: pr-coverage-reports
|
|
|
path: |
|
|
|
- extension_coverage.txt
|
|
|
- webview-ui/webview_coverage.txt
|
|
|
coverage-unit/lcov.info
|
|
|
webview-ui/coverage/lcov.info
|
|
|
|
|
|
- # Set the check as failed if any of the tests failed
|
|
|
- - name: Check for test failures
|
|
|
- run: |
|
|
|
- # Check if any of the test steps failed
|
|
|
- # https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/accessing-contextual-information-about-workflow-runs#steps-context
|
|
|
- if [ "${{ steps.extension_coverage.outcome }}" != "success" ]; then
|
|
|
- echo "Extension Integration Tests failed, see previous step for test output."
|
|
|
- fi
|
|
|
- if [ "${{ steps.webview_coverage.outcome }}" != "success" ]; then
|
|
|
- echo "Webview Tests failed, see previous step for test output."
|
|
|
- fi
|
|
|
- if [ "${{ steps.extension_coverage.outcome }}" != "success" ] || [ "${{ steps.webview_coverage.outcome }}" != "success" ]; then
|
|
|
- exit 1
|
|
|
- fi
|
|
|
-
|
|
|
test-platform-integration:
|
|
|
+ needs: quality-checks
|
|
|
runs-on: ubuntu-latest
|
|
|
steps:
|
|
|
- name: Checkout code
|
|
|
@@ -212,85 +224,6 @@ jobs:
|
|
|
name: test-platform-integration-core-coverage
|
|
|
path: coverage/**/lcov.info
|
|
|
|
|
|
- coverage:
|
|
|
- needs: test
|
|
|
- runs-on: ubuntu-latest
|
|
|
- # Only run on PRs to main branch
|
|
|
- if: github.event_name == 'pull_request' && github.base_ref == 'main'
|
|
|
- steps:
|
|
|
- - name: Checkout code
|
|
|
- uses: actions/checkout@v4
|
|
|
- with:
|
|
|
- fetch-depth: 0 # Fetch all history for accurate comparison
|
|
|
-
|
|
|
- # Setup Python for coverage script
|
|
|
- - name: Setup Python
|
|
|
- uses: actions/setup-python@v4
|
|
|
- with:
|
|
|
- python-version: "3.10"
|
|
|
-
|
|
|
- - name: Install Python dependencies
|
|
|
- run: |
|
|
|
- python -m pip install --upgrade pip
|
|
|
- pip install requests
|
|
|
-
|
|
|
- - name: Setup Node.js environment
|
|
|
- uses: actions/setup-node@v4
|
|
|
- with:
|
|
|
- node-version: 22
|
|
|
-
|
|
|
- # Cache root dependencies - only reuse if package-lock.json exactly matches
|
|
|
- - name: Cache root dependencies
|
|
|
- uses: actions/cache@v4
|
|
|
- id: root-cache
|
|
|
- with:
|
|
|
- path: node_modules
|
|
|
- key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }}
|
|
|
-
|
|
|
- # Cache webview-ui dependencies - only reuse if package-lock.json exactly matches
|
|
|
- - name: Cache webview-ui dependencies
|
|
|
- uses: actions/cache@v4
|
|
|
- id: webview-cache
|
|
|
- with:
|
|
|
- path: webview-ui/node_modules
|
|
|
- key: ${{ runner.os }}-npm-webview-${{ hashFiles('webview-ui/package-lock.json') }}
|
|
|
-
|
|
|
- - name: Install root dependencies
|
|
|
- if: steps.root-cache.outputs.cache-hit != 'true'
|
|
|
- run: npm ci
|
|
|
-
|
|
|
- - name: Install webview-ui dependencies
|
|
|
- if: steps.webview-cache.outputs.cache-hit != 'true'
|
|
|
- run: cd webview-ui && npm ci
|
|
|
-
|
|
|
- # Build the extension before running tests
|
|
|
- - name: Build Extension
|
|
|
- run: npm run compile
|
|
|
-
|
|
|
- # Download coverage artifacts from test job
|
|
|
- - name: Download Coverage Reports
|
|
|
- uses: actions/download-artifact@v4
|
|
|
- with:
|
|
|
- name: pr-coverage-reports
|
|
|
- path: . # Download to root directory to match expected paths
|
|
|
-
|
|
|
- # Process coverage workflow
|
|
|
- - name: Process coverage workflow
|
|
|
- id: coverage
|
|
|
- run: |
|
|
|
- # Extract PR number from GITHUB_REF
|
|
|
- PR_NUMBER=$(echo "$GITHUB_REF" | sed -e 's/refs\/pull\///' -e 's/\/merge//')
|
|
|
-
|
|
|
- # Run the coverage workflow from root directory
|
|
|
- PYTHONPATH=.github/scripts python -m coverage_check process-workflow \
|
|
|
- --base-branch ${{ github.base_ref }} \
|
|
|
- --pr-number $PR_NUMBER \
|
|
|
- --repo $GITHUB_REPOSITORY \
|
|
|
- --token ${{ secrets.GITHUB_TOKEN }} \
|
|
|
- --verbose
|
|
|
- env:
|
|
|
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
-
|
|
|
qlty:
|
|
|
needs: [test, test-platform-integration]
|
|
|
runs-on: ubuntu-latest
|
|
|
@@ -298,8 +231,6 @@ jobs:
|
|
|
steps:
|
|
|
- name: Checkout code
|
|
|
uses: actions/checkout@v4
|
|
|
- with:
|
|
|
- fetch-depth: 0 # Fetch all history for accurate comparison
|
|
|
|
|
|
- name: Download unit tests coverage reports
|
|
|
uses: actions/download-artifact@v4
|