Merge pull request #152 from HyperionGray/dependabot/pip/websockets-13.1 #388
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: "Comprehensive Test Review with Playwright" | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - master | |
| pull_request: | |
| types: [opened, synchronize, reopened] | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| checks: write | |
| jobs: | |
| test-review-and-execution: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| browser: [chromium, firefox, webkit] | |
| mode: [headed, headless] | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@main | |
| - name: Setup Node.js | |
| uses: actions/setup-node@main | |
| with: | |
| node-version: '20' | |
| cache: 'npm' | |
| continue-on-error: true | |
| - name: Setup Python | |
| uses: actions/setup-python@main | |
| with: | |
| python-version: '3.11' | |
| cache: 'pip' | |
| continue-on-error: true | |
| - name: Install Node.js dependencies | |
| run: | | |
| if [ -f "package.json" ]; then | |
| npm install | |
| npm install -D @playwright/test playwright | |
| fi | |
| continue-on-error: true | |
| - name: Install Python dependencies | |
| run: | | |
| if [ -f "requirements.txt" ]; then | |
| pip install -r requirements.txt | |
| fi | |
| pip install pytest playwright pytest-playwright | |
| continue-on-error: true | |
| - name: Install Playwright browsers | |
| run: | | |
| npx playwright install --with-deps ${{ matrix.browser }} || python -m playwright install --with-deps ${{ matrix.browser }} | |
| continue-on-error: true | |
| - name: Verify Playwright installation | |
| run: | | |
| echo "Checking Playwright installation..." | |
| npx playwright --version || python -m playwright --version || echo "Playwright not installed" | |
| - name: Run Playwright Tests (Headless) | |
| if: matrix.mode == 'headless' | |
| run: | | |
| if [ -f "playwright.config.ts" ] || [ -f "playwright.config.js" ]; then | |
| npx playwright test --browser=${{ matrix.browser }} | |
| elif [ -d "tests" ] && find tests -name "*test*.py" -o -name "*_test.py" | grep -q .; then | |
| pytest tests/ --browser ${{ matrix.browser }} --headed=false | |
| else | |
| echo "No Playwright tests found - this is OK if not a web project" | |
| fi | |
| env: | |
| CI: true | |
| continue-on-error: true | |
| - name: Run Playwright Tests (Headed) | |
| if: matrix.mode == 'headed' | |
| run: | | |
| if [ -f "playwright.config.ts" ] || [ -f "playwright.config.js" ]; then | |
| npx playwright test --browser=${{ matrix.browser }} --headed | |
| elif [ -d "tests" ] && find tests -name "*test*.py" -o -name "*_test.py" | grep -q .; then | |
| pytest tests/ --browser ${{ matrix.browser }} --headed=true | |
| else | |
| echo "No Playwright tests found - this is OK if not a web project" | |
| fi | |
| env: | |
| CI: true | |
| DISPLAY: :99 | |
| continue-on-error: true | |
| - name: Upload Playwright Test Results | |
| uses: actions/upload-artifact@main | |
| if: always() | |
| with: | |
| name: playwright-results-${{ matrix.browser }}-${{ matrix.mode }} | |
| path: | | |
| playwright-report/ | |
| test-results/ | |
| playwright-traces/ | |
| retention-days: 30 | |
| continue-on-error: true | |
| - name: Upload Playwright Screenshots on Failure | |
| uses: actions/upload-artifact@main | |
| if: failure() | |
| with: | |
| name: playwright-screenshots-${{ matrix.browser }}-${{ matrix.mode }} | |
| path: | | |
| screenshots/ | |
| test-results/**/screenshots/ | |
| retention-days: 7 | |
| continue-on-error: true | |
| test-coverage-review: | |
| runs-on: ubuntu-latest | |
| needs: test-review-and-execution | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@main | |
| - name: Analyze Test Coverage | |
| id: coverage | |
| run: | | |
| echo "## Test Coverage Analysis" > /tmp/test-analysis.md | |
| echo "" >> /tmp/test-analysis.md | |
| # Find test files | |
| echo "### Test Files Found:" >> /tmp/test-analysis.md | |
| find . -type f \( -name "*test*.js" -o -name "*test*.ts" -o -name "*test*.py" -o -name "*spec*.js" -o -name "*spec*.ts" \) \ | |
| ! -path "*/node_modules/*" \ | |
| ! -path "*/dist/*" \ | |
| ! -path "*/.venv/*" \ | |
| -exec echo "- {}" \; >> /tmp/test-analysis.md || echo "No test files found" >> /tmp/test-analysis.md | |
| echo "" >> /tmp/test-analysis.md | |
| echo "### Source Files Without Tests:" >> /tmp/test-analysis.md | |
| # Find source files that might need tests | |
| for file in $(find . -type f \( -name "*.js" -o -name "*.ts" -o -name "*.py" \) \ | |
| ! -path "*/node_modules/*" \ | |
| ! -path "*/dist/*" \ | |
| ! -path "*/build/*" \ | |
| ! -path "*/.venv/*" \ | |
| ! -path "*/vendor/*" \ | |
| ! -name "*test*" \ | |
| ! -name "*spec*"); do | |
| basename=$(basename "$file" | sed 's/\.[^.]*$//') | |
| # Check if corresponding test file exists | |
| if ! find . -name "*${basename}*test*" -o -name "*${basename}*spec*" 2>/dev/null | grep -q .; then | |
| echo "- $file (no corresponding test found)" >> /tmp/test-analysis.md | |
| fi | |
| done | |
| cat /tmp/test-analysis.md | |
| # Note: GitHub Copilot CLI action is not available as a public action | |
| # Test analysis is already performed in the previous step | |
| - name: Create or Update Test Review Issue | |
| uses: actions/github-script@main | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const fs = require('fs'); | |
| const analysis = fs.readFileSync('/tmp/test-analysis.md', 'utf8'); | |
| const date = new Date().toISOString().split('T')[0]; | |
| const title = `Test Coverage Review - ${date}`; | |
| const body = `# Comprehensive Test Review | |
| This automated review ensures proper test coverage with Playwright for web tests. | |
| ${analysis} | |
| ## Playwright Test Status | |
| ✅ Tests run in multiple browsers: Chromium, Firefox, WebKit | |
| ✅ Tests run in both headed and headless modes | |
| ## Recommendations | |
| 1. **Add Playwright tests** for all web-based functionality | |
| 2. **Migrate existing web tests** to Playwright if not already using it | |
| 3. **Add tests** for source files without coverage | |
| 4. **Review test quality** and maintainability | |
| 5. **Fix flaky tests** and timing issues | |
| 6. **Ensure CI/CD integration** for all tests | |
| ## Action Items | |
| - [ ] Review files without tests and add coverage | |
| - [ ] Migrate non-Playwright web tests to Playwright | |
| - [ ] Fix any failing tests | |
| - [ ] Add documentation for test setup and execution | |
| --- | |
| *This issue was automatically generated by the Test Review workflow.* | |
| `; | |
| // Check if similar issue exists | |
| const issues = await github.rest.issues.listForRepo({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| state: 'open', | |
| labels: ['test-coverage', 'automated'], | |
| per_page: 10 | |
| }); | |
| const recentIssue = issues.data.find(issue => { | |
| const createdAt = new Date(issue.created_at); | |
| const daysSinceCreation = (Date.now() - createdAt) / (1000 * 60 * 60 * 24); | |
| return daysSinceCreation < 7; | |
| }); | |
| if (recentIssue) { | |
| console.log(`Recent issue found: #${recentIssue.number}, updating`); | |
| await github.rest.issues.createComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: recentIssue.number, | |
| body: `## Updated Analysis (${date})\n\n${analysis}` | |
| }); | |
| } else { | |
| await github.rest.issues.create({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| title: title, | |
| body: body, | |
| labels: ['test-coverage', 'automated', 'playwright', 'needs-review'] | |
| }); | |
| } |