Skip to content

Single Test Runner

Single Test Runner #11

name: Single Test Runner
on:
workflow_dispatch:
inputs:
test_env:
description: 'Testing Environment'
required: true
default: 'test'
type: choice
options:
- test
- test2
- test3
- test4
- stage1
- stage2
- stage3
- stage4
- prod
test_file:
description: 'Test File'
required: true
default: 'login.spec.ts'
type: choice
options:
- login.spec.ts
- navbar.spec.ts
- profile.spec.ts
- registrationSidebar.spec.ts
- search.spec.ts
- user.spec.ts
browser:
description: 'Browser'
required: true
default: 'All'
type: choice
options:
- All
- chromium
- firefox
- edge
- webkit
env:
HEADLESS: 'true'
NEW_USER_EMAIL: ${{ secrets.NEW_USER_EMAIL }}
USER_ONE: ${{ secrets.USER_ONE }}
USER_ONE_PASSWORD: ${{ secrets.USER_ONE_PASSWORD }}
USER_TWO: ${{ secrets.USER_TWO }}
USER_TWO_PASSWORD: ${{ secrets.USER_TWO_PASSWORD }}
DEACTIVATED_USER: ${{ secrets.DEACTIVATED_USER }}
DEACTIVATED_USER_PASSWORD: ${{ secrets.DEACTIVATED_USER_PASSWORD }}
UNCONFIRMED_USER: ${{ secrets.UNCONFIRMED_USER }}
UNCONFIRMED_USER_PASSWORD: ${{ secrets.UNCONFIRMED_USER_PASSWORD }}
CAS_2FA_USER: ${{ secrets.CAS_2FA_USER }}
CAS_2FA_USER_PASSWORD: ${{ secrets.CAS_2FA_USER_PASSWORD }}
CAS_TOS_USER: ${{ secrets.CAS_TOS_USER }}
CAS_TOS_USER_PASSWORD: ${{ secrets.CAS_TOS_USER_PASSWORD }}
DEVAPP_CLIENT_ID: ${{ secrets.DEVAPP_CLIENT_ID }}
DEVAPP_CLIENT_SECRET: ${{ secrets.DEVAPP_CLIENT_SECRET }}
IMAP_EMAIL: ${{ secrets.IMAP_EMAIL }}
IMAP_EMAIL_PASSWORD: ${{ secrets.IMAP_EMAIL_PASSWORD }}
IMAP_HOST: ${{ secrets.IMAP_HOST }}
REGISTRATIONS_USER: ${{ secrets.REGISTRATIONS_USER }}
REGISTRATIONS_USER_PASSWORD: ${{ secrets.REGISTRATIONS_USER_PASSWORD }}
PREFERRED_NODE: ${{ secrets.PREFERRED_NODE }}
POPULAR_PAGES: ${{ secrets.POPULAR_PAGES }}
PROFILE_USER: ${{ secrets.PROFILE_USER }}
PROFILE_USER_PASSWORD: ${{ secrets.PROFILE_USER_PASSWORD }}
USER_ONE_STAGE1_PAT: ${{ secrets.USER_ONE_STAGE1_PAT }}
USER_ONE_STAGE2_PAT: ${{ secrets.USER_ONE_STAGE2_PAT }}
USER_ONE_STAGE3_PAT: ${{ secrets.USER_ONE_STAGE3_PAT }}
USER_ONE_STAGE4_PAT: ${{ secrets.USER_ONE_STAGE4_PAT }}
USER_ONE_TEST_PAT: ${{ secrets.USER_ONE_TEST_PAT }}
USER_ONE_TEST2_PAT: ${{ secrets.USER_ONE_TEST2_PAT }}
USER_ONE_TEST3_PAT: ${{ secrets.USER_ONE_TEST3_PAT }}
USER_ONE_TEST4_PAT: ${{ secrets.USER_ONE_TEST4_PAT }}
USER_ONE_PAT: ${{ secrets.USER_ONE_PAT }}
MENDELEY_EMAIL: ${{ secrets.MENDELEY_EMAIL }}
MENDELEY_PASSWORD: ${{ secrets.MENDELEY_PASSWORD }}
ZOTERO_USER: ${{ secrets.ZOTERO_USER }}
ZOTERO_PASSWORD: ${{ secrets.ZOTERO_PASSWORD }}
DATAVERSE_URL: ${{ secrets.DATAVERSE_URL }}
DATAVERSE_API_TOKEN: ${{ secrets.DATAVERSE_API_TOKEN }}
ADMIN_USER: ${{ secrets.ADMIN_USER }}
ADMIN_USER_PASSWORD: ${{ secrets.ADMIN_USER_PASSWORD }}
WRITE_USER: ${{ secrets.WRITE_USER }}
WRITE_USER_PASSWORD: ${{ secrets.WRITE_USER_PASSWORD }}
READ_USER: ${{ secrets.READ_USER }}
READ_USER_PASSWORD: ${{ secrets.READ_USER_PASSWORD }}
jobs:
# Playwright's own browser matrix (chromium/firefox/edge/webkit) replaces the Python
# suite's BrowserStack-backed chrome/firefox/edge/safari matrix, so browsers are
# installed locally per-leg below rather than dispatched to a remote grid.
set_matrix:
name: Set Matrix of Browser Values
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set_matrix.outputs.matrix }}
steps:
- id: set_matrix
run: |
if [ "${{ github.event.inputs.browser }}" = "All" ]; then
echo 'matrix=["chromium","firefox","edge","webkit"]' >> "$GITHUB_OUTPUT"
else
echo "matrix=[\"${{ github.event.inputs.browser }}\"]" >> "$GITHUB_OUTPUT"
fi
single_file_test:
name: Single Test File Runner (${{ matrix.browser }})
needs: [set_matrix]
runs-on: ubuntu-latest
strategy:
fail-fast: false
max-parallel: 1 # run in series, mirrors the Python suite's BrowserStack concurrency limit
matrix:
browser: ${{ fromJson(needs.set_matrix.outputs.matrix) }}
steps:
- name: Git checkout
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '22.x'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Install Playwright browser
run: |
if [ "${{ matrix.browser }}" = "edge" ]; then
npx playwright install --with-deps msedge
else
npx playwright install --with-deps ${{ matrix.browser }}
fi
- name: Run test file
env:
TEST_ENV: ${{ github.event.inputs.test_env }}
run: npx playwright test "tests/${{ github.event.inputs.test_file }}" --project=${{ matrix.browser }}
- name: Write failed tests summary
if: always()
run: node scripts/write-failure-summary.js test-results/results.json >> "$GITHUB_STEP_SUMMARY"
- name: Upload Playwright report
if: always()
id: upload_report
uses: actions/upload-artifact@v4
with:
name: playwright-report-${{ matrix.browser }}
path: playwright-report/
retention-days: 7
- name: Upload test results (traces/videos/screenshots)
if: failure()
id: upload_results
uses: actions/upload-artifact@v4
with:
name: test-results-${{ matrix.browser }}
path: test-results/
retention-days: 7
- name: Add report/trace links to summary
if: always()
run: |
{
echo "### 📊 Reports (${{ matrix.browser }})"
echo "- [Playwright HTML report](${{ steps.upload_report.outputs.artifact-url }}) - unzip, then run \`npx playwright show-report <folder>\` for the full report with pass/fail per test."
if [ -n "${{ steps.upload_results.outputs.artifact-url }}" ]; then
echo "- [Raw test results / traces / videos](${{ steps.upload_results.outputs.artifact-url }}) - unzip, then run \`npx playwright show-trace <path-to-a-trace.zip>\` to open the trace viewer for one failed test directly."
fi
} >> "$GITHUB_STEP_SUMMARY"