Skip to content

Merge pull request #151 from HyperionGray/dependabot/pip/bandit-1.7.10 #386

Merge pull request #151 from HyperionGray/dependabot/pip/bandit-1.7.10

Merge pull request #151 from HyperionGray/dependabot/pip/bandit-1.7.10 #386

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']
});
}