From 44429cc916e2b8c01399a28725496dc42aab23e2 Mon Sep 17 00:00:00 2001 From: Craig Morten Date: Wed, 27 Dec 2023 15:33:29 +0000 Subject: [PATCH] feat: move away from allure (#10) --- .github/workflows/{test.yml => lint.yml} | 4 +- .github/workflows/preview.yml | 100 +++----- .github/workflows/{nvda.yml => report.yml} | 196 +++++++++++---- .github/workflows/voiceover.yml | 227 ------------------ .gitignore | 3 - macos.config.ts | 21 +- package.json | 12 +- src/annotate.ts | 8 - src/annotateIssue.ts | 10 + src/assert.ts | 13 +- ...tAllureRecording.ts => attachRecording.ts} | 26 +- src/log.ts | 7 + src/macOsVoiceOver.spec.ts | 39 +-- src/nvdaTest.ts | 2 + src/record.ts | 5 +- src/report.ts | 18 ++ src/setAllureMetadata.ts | 54 ----- src/setMetadata.ts | 78 ++++++ src/setup.ts | 12 +- src/windowsNvda.spec.ts | 39 +-- windows.config.ts | 13 +- yarn.lock | 133 +++++++--- 22 files changed, 497 insertions(+), 523 deletions(-) rename .github/workflows/{test.yml => lint.yml} (93%) rename .github/workflows/{nvda.yml => report.yml} (53%) delete mode 100644 .github/workflows/voiceover.yml delete mode 100644 src/annotate.ts create mode 100644 src/annotateIssue.ts rename src/{setAllureRecording.ts => attachRecording.ts} (53%) create mode 100644 src/log.ts create mode 100644 src/report.ts delete mode 100644 src/setAllureMetadata.ts create mode 100644 src/setMetadata.ts diff --git a/.github/workflows/test.yml b/.github/workflows/lint.yml similarity index 93% rename from .github/workflows/test.yml rename to .github/workflows/lint.yml index 3f69d85..417f831 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/lint.yml @@ -1,4 +1,4 @@ -name: Test +name: Lint on: push: @@ -7,7 +7,7 @@ on: branches: [main] jobs: - build: + lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index e2a7b62..d117ff8 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -1,4 +1,4 @@ -name: Screen Reader Test Preview +name: Screen Reader Tests Preview Report on: pull_request: @@ -16,7 +16,7 @@ permissions: # Allow one concurrent deployment concurrency: - group: "aria-at-tests-preview" + group: "aria-at-tests-preview-report" cancel-in-progress: true jobs: @@ -117,7 +117,7 @@ jobs: run: yarn test:generate test-voiceover-preview: - name: Playwright VoiceOver Reduced Tests (${{ matrix.shardIndex }}) + name: Playwright VoiceOver Reduced Tests (${{ matrix.shardIndex }} / 1) needs: macos-install runs-on: macos-12 strategy: @@ -162,7 +162,7 @@ jobs: run: yarn test ./src/macOsVoiceOver.spec.ts --config macos.config.ts --shard ${{ matrix.shardIndex }}/2000 continue-on-error: true - - name: Archive Playwright Artifacts + - name: Upload Playwright Artifacts uses: actions/upload-artifact@v4 if: always() continue-on-error: true @@ -172,16 +172,16 @@ jobs: ./test-results ./recordings - - name: Archive Allure Artifacts + - name: Upload HTML Report Artifacts uses: actions/upload-artifact@v4 if: always() continue-on-error: true with: - name: allure-results-macos-voiceover-${{ matrix.shardIndex }} - path: ./allure-results + name: playwright-report-macos-voiceover-${{ matrix.shardIndex }} + path: ./playwright-report test-nvda-preview: - name: Playwright NVDA Reduced Tests (${{ matrix.shardIndex }}) + name: Playwright NVDA Reduced Tests (${{ matrix.shardIndex }} / 1) needs: windows-install runs-on: windows-2022 strategy: @@ -226,7 +226,7 @@ jobs: run: yarn test ./src/windowsNvda.spec.ts --config windows.config.ts --shard ${{ matrix.shardIndex }}/2000 continue-on-error: true - - name: Archive Playwright Artifacts + - name: Upload Playwright Artifacts uses: actions/upload-artifact@v4 if: always() continue-on-error: true @@ -236,19 +236,22 @@ jobs: ./test-results ./recordings - - name: Archive Allure Artifacts + - name: Upload HTML Report Artifacts uses: actions/upload-artifact@v4 if: always() continue-on-error: true with: - name: allure-results-windows-nvda-${{ matrix.shardIndex }} - path: ./allure-results + name: playwright-report-windows-nvda-${{ matrix.shardIndex }} + path: ./playwright-report publish-preview-html-report: - name: Publish Preview HTML Report To Vercel + name: Publish Preview HTML Report if: always() needs: [test-voiceover-preview, test-nvda-preview] runs-on: ubuntu-latest + environment: + name: aria-at-tests-preview-report + url: ${{ steps.deploy-pages.outputs.page_url }} steps: - name: Clear Space run: | @@ -279,33 +282,10 @@ jobs: with: node-version: 20 - - name: Update Deployment Status - Start - uses: bobheadxi/deployments@v1 - id: deployment - with: - step: start - env: aria-at-tests-preview - token: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/download-artifact@v4 with: - pattern: allure-results-* - path: ./allure-results - - - name: Move Allure results into one directory - run: | - mkdir allure-results-final - for i in allure-results-macos-voiceover-{1..30}; do - if [ -d "$i" ]; then - mv $i/* allure-results-final/ - fi - done - for i in allure-results-windows-nvda-{1..30}; do - if [ -d "$i" ]; then - mv $i/* allure-results-final/ - fi - done - working-directory: ./allure-results + pattern: playwright-report-* + path: ./playwright-report - name: Cache node_modules uses: actions/cache@v3 @@ -315,30 +295,30 @@ jobs: node_modules key: macos-modules-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} - - name: Create Allure Test Report - run: npx allure generate ./allure-results/allure-results-final --clean -o ./allure-report + - name: Create Test Report + run: yarn test:report - name: Cleanup Downloads - run: rm -rf ./allure-results || true + run: rm -rf ./playwright-report || true - - name: Deploy to Vercel - uses: amondnet/vercel-action@v25 - id: vercel-action + - name: Setup Pages + uses: actions/configure-pages@v4 + + - name: Upload HTML Report + uses: actions/upload-pages-artifact@v3 with: - vercel-token: ${{ secrets.VERCEL_TOKEN }} - vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} - vercel-project-id: ${{ secrets.PREVIEW_VERCEL_PROJECT_ID }} - github-comment: true - github-token: ${{ secrets.GITHUB_TOKEN }} - working-directory: allure-report - - - name: Update Deployment Status - Finish - uses: bobheadxi/deployments@v1 - if: always() + path: html-report + + - name: Deploy to GitHub Pages + id: deploy-pages + uses: actions/deploy-pages@v4 + + - name: PR Comment + if: ${{ always() && github.event_name == 'pull_request' }} + uses: thollander/actions-comment-pull-request@v2 with: - step: finish - token: ${{ secrets.GITHUB_TOKEN }} - status: ${{ job.status }} - deployment_id: ${{ steps.deployment.outputs.deployment_id }} - env: ${{ steps.deployment.outputs.env }} - env_url: ${{ steps.vercel-action.outputs.preview-url }} + message: | + Playwright Test Report: ${{steps.deploy-pages.outputs.page_url}} + comment_tag: "Playwright Test Report" + pr_number: ${{ inputs.pr_number }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/nvda.yml b/.github/workflows/report.yml similarity index 53% rename from .github/workflows/nvda.yml rename to .github/workflows/report.yml index 52d0e8e..7c250f4 100644 --- a/.github/workflows/nvda.yml +++ b/.github/workflows/report.yml @@ -1,4 +1,4 @@ -name: NVDA Screen Reader Test +name: Screen Reader Tests Report on: push: @@ -16,10 +16,58 @@ permissions: # Allow one concurrent deployment concurrency: - group: "aria-at-tests-nvda" + group: "aria-at-tests-report" cancel-in-progress: true jobs: + macos-install: + name: MacOS Install + runs-on: macos-12 + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Cache node_modules + uses: actions/cache@v3 + id: cache-macos-node-modules + with: + path: | + node_modules + key: macos-modules-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} + + - name: Cache Playwright binaries + uses: actions/cache@v3 + id: cache-macos-playwright + with: + path: | + ~/Library/Caches/ms-playwright + key: macos-playwright-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} + + - name: Cache Test Suites + uses: actions/cache@v3 + id: cache-macos-test-suites + with: + path: | + testSuites.json + key: macos-testSuites-${{ hashFiles('aria-at') }}-${{ hashFiles('ignoredTests.json') }} + + - name: Install Dependencies + if: steps.cache-macos-node-modules.outputs.cache-hit != 'true' + run: yarn install --frozen-lockfile + + - name: Install Playwright Browsers + if: steps.cache-macos-playwright.outputs.cache-hit != 'true' + run: yarn test:install + + - name: Generate Test Suites + if: steps.cache-macos-test-suites.outputs.cache-hit != 'true' + run: yarn test:generate + windows-install: name: Windows Install runs-on: windows-2022 @@ -68,6 +116,70 @@ jobs: if: steps.cache-windows-test-suites.outputs.cache-hit != 'true' run: yarn test:generate + test-voiceover: + name: Playwright VoiceOver Tests (${{ matrix.shardIndex }} / 10) + needs: macos-install + runs-on: macos-12 + strategy: + fail-fast: false + matrix: + shardIndex: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Guidepup Setup + uses: guidepup/setup-action@0.13.0 + + - name: Cache node_modules + uses: actions/cache@v3 + with: + path: | + node_modules + key: macos-modules-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} + + - name: Cache Playwright + uses: actions/cache@v3 + with: + path: | + ~/Library/Caches/ms-playwright + key: macos-playwright-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} + + - name: Cache Test Suites + uses: actions/cache@v3 + with: + path: | + testSuites.json + key: macos-testSuites-${{ hashFiles('aria-at') }}-${{ hashFiles('ignoredTests.json') }} + + - name: Run Tests + run: yarn test ./src/macOsVoiceOver.spec.ts --config macos.config.ts --shard ${{ matrix.shardIndex }}/10 + continue-on-error: true + + - name: Upload Playwright Artifacts + uses: actions/upload-artifact@v4 + if: always() + continue-on-error: true + with: + name: artifacts-macos-voiceover-${{ matrix.shardIndex }} + path: | + ./test-results + ./recordings + + - name: Upload HTML Report Artifacts + uses: actions/upload-artifact@v4 + if: always() + continue-on-error: true + with: + name: playwright-report-macos-voiceover-${{ matrix.shardIndex }} + path: ./playwright-report + test-nvda: name: Playwright NVDA Tests (${{ matrix.shardIndex }} / 20) needs: windows-install @@ -136,7 +248,7 @@ jobs: run: yarn test ./src/windowsNvda.spec.ts --config windows.config.ts --shard ${{ matrix.shardIndex }}/20 continue-on-error: true - - name: Archive Playwright Artifacts + - name: Upload Playwright Artifacts uses: actions/upload-artifact@v4 if: always() continue-on-error: true @@ -146,19 +258,22 @@ jobs: ./test-results ./recordings - - name: Archive Allure Artifacts + - name: Upload HTML Report Artifacts uses: actions/upload-artifact@v4 if: always() continue-on-error: true with: - name: allure-results-windows-nvda-${{ matrix.shardIndex }} - path: ./allure-results + name: playwright-report-windows-nvda-${{ matrix.shardIndex }} + path: ./playwright-report publish-html-report: - name: Publish HTML Report To Vercel + name: Publish HTML Report if: always() - needs: [test-nvda] + needs: [test-voiceover, test-nvda] runs-on: ubuntu-latest + environment: + name: aria-at-tests-report + url: ${{ steps.deploy-pages.outputs.page_url }} steps: - name: Clear Space run: | @@ -189,56 +304,33 @@ jobs: with: node-version: 20 - - name: Update Deployment Status - Start - uses: bobheadxi/deployments@v1 - id: deployment - with: - step: start - env: aria-at-tests-nvda - token: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/download-artifact@v4 with: - pattern: allure-results-windows-nvda-* - path: ./allure-results + pattern: playwright-report-* + path: ./playwright-report - - name: Move Allure results into one directory - run: | - mkdir allure-results-final - for i in allure-results-windows-nvda-{1..30}; do - if [ -d "$i" ]; then - mv $i/* allure-results-final/ - fi - done - working-directory: ./allure-results - - - name: Install Dependencies - run: yarn install --frozen-lockfile + - name: Cache node_modules + uses: actions/cache@v3 + id: cache-macos-node-modules + with: + path: | + node_modules + key: macos-modules-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} - - name: Create Allure Test Report - run: npx allure generate ./allure-results/allure-results-final --clean -o ./allure-report + - name: Create Test Report + run: yarn test:report - name: Cleanup Downloads - run: rm -rf ./allure-results || true + run: rm -rf ./playwright-report || true - - name: Deploy to Vercel - uses: amondnet/vercel-action@v25 - id: vercel-action - with: - vercel-token: ${{ secrets.VERCEL_TOKEN }} - vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} - vercel-project-id: ${{ secrets.NVDA_VERCEL_PROJECT_ID }} - github-comment: false - vercel-args: "--prod" - working-directory: allure-report + - name: Setup Pages + uses: actions/configure-pages@v4 - - name: Update Deployment Status - Finish - uses: bobheadxi/deployments@v1 - if: always() + - name: Upload HTML Report + uses: actions/upload-pages-artifact@v3 with: - step: finish - token: ${{ secrets.GITHUB_TOKEN }} - status: ${{ job.status }} - deployment_id: ${{ steps.deployment.outputs.deployment_id }} - env: ${{ steps.deployment.outputs.env }} - env_url: ${{ steps.vercel-action.outputs.preview-url }} + path: html-report + + - name: Deploy to GitHub Pages + id: deploy-pages + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/voiceover.yml b/.github/workflows/voiceover.yml deleted file mode 100644 index 41e2066..0000000 --- a/.github/workflows/voiceover.yml +++ /dev/null @@ -1,227 +0,0 @@ -name: VoiceOver Screen Reader Test - -on: - push: - branches: [main] - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - deployments: write - pages: write - id-token: write - pull-requests: write - -# Allow one concurrent deployment -concurrency: - group: "aria-at-tests-voiceover" - cancel-in-progress: true - -jobs: - macos-install: - name: MacOS Install - runs-on: macos-12 - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Cache node_modules - uses: actions/cache@v3 - id: cache-macos-node-modules - with: - path: | - node_modules - key: macos-modules-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} - - - name: Cache Playwright binaries - uses: actions/cache@v3 - id: cache-macos-playwright - with: - path: | - ~/Library/Caches/ms-playwright - key: macos-playwright-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} - - - name: Cache Test Suites - uses: actions/cache@v3 - id: cache-macos-test-suites - with: - path: | - testSuites.json - key: macos-testSuites-${{ hashFiles('aria-at') }}-${{ hashFiles('ignoredTests.json') }} - - - name: Install Dependencies - if: steps.cache-macos-node-modules.outputs.cache-hit != 'true' - run: yarn install --frozen-lockfile - - - name: Install Playwright Browsers - if: steps.cache-macos-playwright.outputs.cache-hit != 'true' - run: yarn test:install - - - name: Generate Test Suites - if: steps.cache-macos-test-suites.outputs.cache-hit != 'true' - run: yarn test:generate - - test-voiceover: - name: Playwright VoiceOver Tests (${{ matrix.shardIndex }} / 10) - needs: macos-install - runs-on: macos-12 - strategy: - fail-fast: false - matrix: - shardIndex: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Guidepup Setup - uses: guidepup/setup-action@0.13.0 - - - name: Cache node_modules - uses: actions/cache@v3 - with: - path: | - node_modules - key: macos-modules-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} - - - name: Cache Playwright - uses: actions/cache@v3 - with: - path: | - ~/Library/Caches/ms-playwright - key: macos-playwright-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} - - - name: Cache Test Suites - uses: actions/cache@v3 - with: - path: | - testSuites.json - key: macos-testSuites-${{ hashFiles('aria-at') }}-${{ hashFiles('ignoredTests.json') }} - - - name: Run Tests - run: yarn test ./src/macOsVoiceOver.spec.ts --config macos.config.ts --shard ${{ matrix.shardIndex }}/10 - continue-on-error: true - - - name: Archive Playwright Artifacts - uses: actions/upload-artifact@v4 - if: always() - continue-on-error: true - with: - name: artifacts-macos-voiceover-${{ matrix.shardIndex }} - path: | - ./test-results - ./recordings - - - name: Archive Allure Artifacts - uses: actions/upload-artifact@v4 - if: always() - continue-on-error: true - with: - name: allure-results-macos-voiceover-${{ matrix.shardIndex }} - path: ./allure-results - - publish-html-report: - name: Publish HTML Report To Vercel - if: always() - needs: [test-voiceover] - runs-on: ubuntu-latest - steps: - - name: Clear Space - run: | - sudo rm -rf /usr/share/dotnet - sudo rm -rf /usr/local/lib/android - sudo rm -rf /opt/ghc - sudo rm -rf /opt/hostedtoolcache/CodeQL - sudo docker image prune --all --force - sudo apt-get purge -y \ - '^llvm-.*' \ - 'php.*' \ - '^mongodb-.*' \ - '^mysql-.*' \ - azure-cli \ - google-chrome-stable \ - firefox \ - powershell \ - microsoft-edge-stable \ - mono-devel - sudo apt-get autoremove -y - sudo apt-get clean - - - uses: actions/checkout@v3 - with: - submodules: recursive - - - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Update Deployment Status - Start - uses: bobheadxi/deployments@v1 - id: deployment - with: - step: start - env: production - token: ${{ secrets.GITHUB_TOKEN }} - - - uses: actions/download-artifact@v4 - with: - pattern: allure-results-macos-voiceover-* - path: ./allure-results - - - name: Move Allure results into one directory - run: | - mkdir allure-results-final - for i in allure-results-macos-voiceover-{1..30}; do - if [ -d "$i" ]; then - mv $i/* allure-results-final/ - fi - done - working-directory: ./allure-results - - - name: Install Dependencies From Cache - uses: actions/cache@v3 - id: cache-macos-node-modules - with: - path: | - node_modules - key: macos-modules-${{ hashFiles('yarn.lock') }}-${{ hashFiles('package.json') }} - - - name: Create Allure Test Report - run: npx allure generate ./allure-results/allure-results-final --clean -o ./allure-report - - - name: Cleanup Downloads - run: rm -rf ./allure-results || true - - - name: Deploy to Vercel - uses: amondnet/vercel-action@v25 - id: vercel-action - with: - vercel-token: ${{ secrets.VERCEL_TOKEN }} - vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} - vercel-project-id: ${{ secrets.VOICEOVER_VERCEL_PROJECT_ID }} - github-comment: false - vercel-args: "--prod" - working-directory: allure-report - - - name: Update Deployment Status - Finish - uses: bobheadxi/deployments@v1 - if: always() - with: - step: finish - token: ${{ secrets.GITHUB_TOKEN }} - status: ${{ job.status }} - deployment_id: ${{ steps.deployment.outputs.deployment_id }} - env: ${{ steps.deployment.outputs.env }} - env_url: ${{ steps.vercel-action.outputs.preview-url }} diff --git a/.gitignore b/.gitignore index 73ff313..9874cdb 100644 --- a/.gitignore +++ b/.gitignore @@ -110,8 +110,5 @@ recordings playwright-report html-report testSuites.json -blob-report -allure-report -allure-results .vercel diff --git a/macos.config.ts b/macos.config.ts index 0439484..bde3a2d 100644 --- a/macos.config.ts +++ b/macos.config.ts @@ -13,18 +13,17 @@ const config: PlaywrightTestConfig = { name: "webkit", use: { ...devices["Desktop Safari"], headless: false }, }, - { - name: "firefox", - use: { ...devices["Desktop Firefox"], headless: false }, - }, - { - name: "chromium", - use: { ...devices["Desktop Chrome"], headless: false }, - }, + // TODO: Enable once figure out storage size situation. + // { + // name: "firefox", + // use: { ...devices["Desktop Firefox"], headless: false }, + // }, + // { + // name: "chromium", + // use: { ...devices["Desktop Chrome"], headless: false }, + // }, ], - reporter: process.env.CI - ? [["github"], ["allure-playwright", { outputDir: "allure-results" }]] - : "list", + reporter: process.env.CI ? [["github"], ["html", { open: "never" }]] : "list", }; export default config; diff --git a/package.json b/package.json index cd33b51..ae09959 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "aria-at", "playwright", "screen-reader", - "voiceover" + "voiceover", + "nvda" ], "scripts": { "ci": "yarn lint", @@ -31,17 +32,16 @@ "test:report": "ts-node src/report.ts" }, "dependencies": { - "@guidepup/guidepup": "^0.20.0", - "@guidepup/playwright": "^0.11.0", + "@guidepup/guidepup": "^0.21.0", + "@guidepup/playwright": "^0.12.0", "@playwright/test": "^1.40.1", - "csvtojson": "^2.0.10" + "csvtojson": "^2.0.10", + "playwright-merge-html-reports": "^0.2.8" }, "devDependencies": { "@types/node": "^20.10.5", "@typescript-eslint/eslint-plugin": "^6.16.0", "@typescript-eslint/parser": "^6.16.0", - "allure-commandline": "^2.25.0", - "allure-playwright": "^2.10.0", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "ts-node": "^10.9.2", diff --git a/src/annotate.ts b/src/annotate.ts deleted file mode 100644 index 51277c6..0000000 --- a/src/annotate.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const annotate = ({ test, warning }) => { - console.log(warning); - - test.info().annotations.push({ - type: "issue", - description: warning, - }); -}; diff --git a/src/annotateIssue.ts b/src/annotateIssue.ts new file mode 100644 index 0000000..06500ed --- /dev/null +++ b/src/annotateIssue.ts @@ -0,0 +1,10 @@ +import { warn } from "./log"; + +export const annotateIssue = ({ test, issue }) => { + warn(issue); + + test.info().annotations.push({ + type: "⚠️ issue", + description: issue, + }); +}; diff --git a/src/assert.ts b/src/assert.ts index 7128bc9..10e5290 100644 --- a/src/assert.ts +++ b/src/assert.ts @@ -1,7 +1,8 @@ import { ScreenReader } from "@guidepup/guidepup"; import { test as playwrightTest } from "@playwright/test"; import { expect } from "@playwright/test"; -import { annotate } from "./annotate"; +import { annotateIssue } from "./annotateIssue"; +import { log } from "./log"; /* * Explanation of the regular expression: @@ -106,9 +107,9 @@ export async function assert({ const phrase = (matches?.at(1) ?? matches?.at(2) ?? matches?.at(3))?.trim(); if (!phrase) { - annotate({ + annotateIssue({ test, - warning: `Unable to perform assertion: "${assertion}"`, + issue: `Unable to perform assertion: "${assertion}"`, }); continue; @@ -121,18 +122,18 @@ export async function assert({ const matchRegex = new RegExp(phraseRegex, "gi"); - console.log(`Performing assertion: "${assertion}"`); + log(`Performing assertion: "${assertion}"`); const found = !!spokenPhraseLog.find((spokenPhrase) => matchRegex.test(withRoleReplacements(spokenPhrase)) ); if (!found) { - console.log( + log( `Assertion "${assertion}" failed. Unable to find phrase "${phrase}" in spoken phrase log.` ); } else { - console.log(`Assertion "${assertion}" succeeded.`); + log(`Assertion "${assertion}" succeeded.`); } expect diff --git a/src/setAllureRecording.ts b/src/attachRecording.ts similarity index 53% rename from src/setAllureRecording.ts rename to src/attachRecording.ts index 535f847..58ff3fd 100644 --- a/src/setAllureRecording.ts +++ b/src/attachRecording.ts @@ -1,6 +1,6 @@ -import { accessSync, constants, readFileSync } from "fs"; +import { accessSync, constants } from "fs"; import { basename } from "path"; -import { allure } from "allure-playwright"; +import { test as playwrightTest } from "@playwright/test"; import { delay } from "./delay"; const MP4 = "video/mp4"; @@ -9,20 +9,27 @@ const MOV = "video/quicktime"; const EXISTS_RETRIES = 20; const EXISTS_WAIT = 100; -export const setAllureRecording = async ({ +export const attachRecording = async ({ osPlatform, - recordingFilePath, + path, + test, }: { osPlatform: NodeJS.Platform; - recordingFilePath: string; + path: string; + test: typeof playwrightTest; }) => { - if (!recordingFilePath) { + if (!path) { + return; + } + + // Only attach failed test recordings + if (!test.info().errors?.length) { return; } for (let i = 0; i < EXISTS_RETRIES; i++) { try { - accessSync(recordingFilePath, constants.F_OK); + accessSync(path, constants.F_OK); break; } catch (e) { @@ -34,9 +41,8 @@ export const setAllureRecording = async ({ await delay(EXISTS_WAIT); } - const buffer = readFileSync(recordingFilePath); - const name = basename(recordingFilePath); + const name = basename(path); const contentType = osPlatform === "darwin" ? MOV : MP4; - await allure.attachment(name, buffer, contentType); + await test.info().attach(name, { contentType, path }); }; diff --git a/src/log.ts b/src/log.ts new file mode 100644 index 0000000..618c79b --- /dev/null +++ b/src/log.ts @@ -0,0 +1,7 @@ +export const log = (...messages) => + console.log(`[${new Date().toUTCString()}]`, ...messages); + +export const warn = (...messages) => + console.warn(`[${new Date().toUTCString()}]`, ...messages); + +export const table = (...messages) => console.table(...messages); diff --git a/src/macOsVoiceOver.spec.ts b/src/macOsVoiceOver.spec.ts index cde5b9e..3295f0a 100644 --- a/src/macOsVoiceOver.spec.ts +++ b/src/macOsVoiceOver.spec.ts @@ -8,12 +8,13 @@ import { setup } from "./setup"; import { readTestSuitesCacheSync, TestSuite } from "./testSuites"; import { assert } from "./assert"; import { mapCommandToGuidepupKeys } from "./mapCommandToGuidepupKeys"; -import { annotate } from "./annotate"; +import { annotateIssue } from "./annotateIssue"; import { getTestDetails } from "./getTestDetails"; import { getScreenReaderTests } from "./getScreenReaderTests"; import { applicationNameMap } from "./applicationNameMap"; -import { setAllureMetadata } from "./setAllureMetadata"; -import { setAllureRecording } from "./setAllureRecording"; +import { setMetadata } from "./setMetadata"; +import { attachRecording } from "./attachRecording"; +import { log, table } from "./log"; // Allow sharding across describe blocks test.describe.configure({ mode: "parallel" }); @@ -96,16 +97,20 @@ const executeCommandSequence = async ({ const rawCommands = command.split(","); for (const rawCommand of rawCommands) { - console.log(`Performing command: "${rawCommand}".`); + log(`Performing command: "${rawCommand}".`); const { voiceOverCommand, mappedCommand, error } = mapCommand(rawCommand); if (error) { - annotate({ + const issue = `Unable to parse command: "${command}"`; + + annotateIssue({ test, - warning: `Unable to parse command: "${command}"`, + issue, }); + test.info().fixme(true, issue); + return; } @@ -126,7 +131,7 @@ const executeCommandSequence = async ({ const lastSpokenPhrase = await voiceOver.lastSpokenPhrase(); - console.log(`Screen reader output: "${lastSpokenPhrase}".`); + log(`Screen reader output: "${lastSpokenPhrase}".`); } }; @@ -142,14 +147,14 @@ const generateTestSuite = ({ test.describe(`@macos @voiceOver ${references.title}`, () => { test.beforeEach(({ browserName, browser }) => { - console.table({ + table({ browserName, browserVersion: browser.version(), osPlatform, osRelease, }); - console.table(references); + table(references); }); for (const screenReaderTest of screenReaderTests) { @@ -165,7 +170,7 @@ const generateTestSuite = ({ let stopRecording: () => string; test.beforeEach(async ({ page, voiceOver }) => { - console.table(screenReaderTest); + table(screenReaderTest); try { stopRecording = record({ @@ -173,7 +178,7 @@ const generateTestSuite = ({ screenReaderName, }); } catch { - annotate({ test, warning: "Screen recording failed." }); + annotateIssue({ test, issue: "Screen recording failed." }); } await setup({ @@ -194,27 +199,27 @@ const generateTestSuite = ({ browserName, voiceOver, }) => { - await setAllureMetadata({ + await setMetadata({ browserName, browserVersion: browser.version(), osPlatform, osRelease, references, screenReaderTest, + test, testUrl, }); await executeCommandSequence({ browserName, command, voiceOver }); await assert({ assertions, screenReader: voiceOver, test }); try { - const recordingFilePath = stopRecording?.(); - - await setAllureRecording({ + await attachRecording({ osPlatform, - recordingFilePath, + path: stopRecording?.(), + test, }); } catch { - annotate({ test, warning: "Screen recording failed." }); + annotateIssue({ test, issue: "Screen recording failed." }); } }); } diff --git a/src/nvdaTest.ts b/src/nvdaTest.ts index 4d381f5..ae35298 100644 --- a/src/nvdaTest.ts +++ b/src/nvdaTest.ts @@ -38,6 +38,8 @@ const nvdaTest = test.extend<{ nvda: typeof nvda }>({ } if (nvdaStartRetryCount === 3) { + test.info().fixme(true, error.message); + throw error; } } diff --git a/src/record.ts b/src/record.ts index 7fc2bc2..f9f0386 100644 --- a/src/record.ts +++ b/src/record.ts @@ -2,6 +2,7 @@ import { macOSRecord, windowsRecord } from "@guidepup/guidepup"; import { test as playwrightTest } from "@playwright/test"; import { platform, release } from "os"; import { join } from "path"; +import { table } from "./log"; export function record({ screenReaderName, @@ -24,7 +25,7 @@ export function record({ const recordingFileName = `test_${platformName}_${release()}_${screenReaderName}_${sanitizedTitle}_attempt_${retry}.mov`; const recordingFilePath = join("./recordings/", recordingFileName); - console.table({ recordingFileName }); + table({ recordingFileName }); const stopRecording = macOSRecord(recordingFilePath); @@ -38,7 +39,7 @@ export function record({ const recordingFileName = `test_${platformName}_${release()}_${screenReaderName}_${sanitizedTitle}_attempt_${retry}.mp4`; const recordingFilePath = join("./recordings/", recordingFileName); - console.table({ recordingFileName }); + table({ recordingFileName }); const stopRecording = windowsRecord(recordingFilePath); diff --git a/src/report.ts b/src/report.ts new file mode 100644 index 0000000..7bd2a39 --- /dev/null +++ b/src/report.ts @@ -0,0 +1,18 @@ +import { readdirSync } from "fs"; +import { join } from "path"; +import { mergeHTMLReports } from "playwright-merge-html-reports"; + +const reportPathsToMerge = readdirSync( + join(process.cwd(), "playwright-report"), + { + withFileTypes: true, + } +) + .filter( + (item) => item.isDirectory() && item.name.startsWith("playwright-report") + ) + .map(({ name }) => join(process.cwd(), "playwright-report", name)); + +mergeHTMLReports(reportPathsToMerge, { + outputFolderName: "html-report", +}); diff --git a/src/setAllureMetadata.ts b/src/setAllureMetadata.ts deleted file mode 100644 index dd7222d..0000000 --- a/src/setAllureMetadata.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { allure } from "allure-playwright"; -import { References, Test } from "./types"; - -export const setAllureMetadata = async ({ - browserName, - browserVersion, - osPlatform, - osRelease, - references, - screenReaderTest, - testUrl, -}: { - browserName: string; - browserVersion: string; - osPlatform: NodeJS.Platform; - osRelease: string; - references: References; - screenReaderTest: Test; - testUrl: string; -}) => { - const { - author, - authorEmail, - title: epic, - designPattern, - example, - ...additionalReferences - } = references; - - const { title: story, task, instructions } = screenReaderTest; - - await allure.epic(epic); - await allure.story(story); - - await allure.parameter("browserName", browserName); - await allure.parameter("browserVersion", browserVersion); - await allure.parameter("osPlatform", osPlatform); - await allure.parameter("osRelease", osRelease); - - await allure.parameter("author", author); - await allure.parameter("authorEmail", authorEmail); - await allure.parameter("task", task); - await allure.parameter("instructions", instructions); - - await allure.link(testUrl, "reference"); - await allure.link(designPattern, "designPattern"); - await allure.link(example, "example"); - - for (const [key, value] of Object.entries(additionalReferences)) { - if (value.startsWith("https://")) { - await allure.link(value, key); - } - } -}; diff --git a/src/setMetadata.ts b/src/setMetadata.ts new file mode 100644 index 0000000..a1afb8b --- /dev/null +++ b/src/setMetadata.ts @@ -0,0 +1,78 @@ +import { test as playwrightTest } from "@playwright/test"; +import { References, Test } from "./types"; + +export const setMetadata = async ({ + browserName, + browserVersion, + osPlatform, + osRelease, + references, + screenReaderTest, + test, + testUrl, +}: { + browserName: string; + browserVersion: string; + osPlatform: NodeJS.Platform; + osRelease: string; + references: References; + screenReaderTest: Test; + test: typeof playwrightTest; + testUrl: string; +}) => { + const { + title: referenceTitle, + // Use the `testUrl` instead as more useful. + // eslint-disable-next-line @typescript-eslint/no-unused-vars + reference: _, + ...additionalReferences + } = references; + + const { title: testTitle, task, instructions } = screenReaderTest; + + test.info().annotations.push( + { + type: "referenceTitle", + description: referenceTitle, + }, + { + type: "testTitle", + description: testTitle, + }, + { + type: "browserName", + description: browserName, + }, + { + type: "browserVersion", + description: browserVersion, + }, + { + type: "osPlatform", + description: osPlatform, + }, + { + type: "osRelease", + description: osRelease, + }, + { + type: "task", + description: task, + }, + { + type: "instructions", + description: instructions, + }, + { + type: "reference", + description: testUrl, + } + ); + + for (const [key, value] of Object.entries(additionalReferences)) { + test.info().annotations.push({ + type: key, + description: value, + }); + } +}; diff --git a/src/setup.ts b/src/setup.ts index b6f8e94..0e3c16f 100644 --- a/src/setup.ts +++ b/src/setup.ts @@ -2,6 +2,7 @@ import { Page } from "@playwright/test"; import { delay } from "./delay"; import { ScreenReader } from "@guidepup/guidepup"; import { Test } from "./types"; +import { log } from "./log"; const PAGE_LOAD_DELAY = 250; @@ -28,7 +29,7 @@ export async function setup({ }) => void | Promise; testUrl: string; }): Promise { - console.log(`Navigating to URL: "${testUrl}".`); + log(`Navigating to URL: "${testUrl}".`); await page.goto(testUrl, { waitUntil: "load" }); await delay(PAGE_LOAD_DELAY); @@ -38,16 +39,17 @@ export async function setup({ await screenReader.clearItemTextLog(); if (hasSetupScript) { - console.log(`Running test setup.`); + log("Running test setup."); await screenReader.act(); const lastSpokenPhrase = await screenReader.lastSpokenPhrase(); - console.log(`Screen reader output: "${lastSpokenPhrase}".`); - console.log(`Running test steps.`); + log(`Screen reader output: "${lastSpokenPhrase}".`); + log("Running test steps."); } else { - console.log(`No test setup configured. Running test steps.`); + log("No test setup configured."); + log("Running test steps."); } await setMode({ mode, screenReader }); diff --git a/src/windowsNvda.spec.ts b/src/windowsNvda.spec.ts index 2341bbd..f6a52b5 100644 --- a/src/windowsNvda.spec.ts +++ b/src/windowsNvda.spec.ts @@ -8,12 +8,13 @@ import { setup } from "./setup"; import { readTestSuitesCacheSync, TestSuite } from "./testSuites"; import { assert } from "./assert"; import { mapCommandToGuidepupKeys } from "./mapCommandToGuidepupKeys"; -import { annotate } from "./annotate"; +import { annotateIssue } from "./annotateIssue"; import { getTestDetails } from "./getTestDetails"; import { getScreenReaderTests } from "./getScreenReaderTests"; -import { setAllureMetadata } from "./setAllureMetadata"; -import { setAllureRecording } from "./setAllureRecording"; +import { setMetadata } from "./setMetadata"; +import { attachRecording } from "./attachRecording"; import { Test } from "./types"; +import { log, table } from "./log"; // Allow sharding across describe blocks test.describe.configure({ mode: "parallel" }); @@ -83,14 +84,18 @@ const executeCommandSequence = async ({ for (const rawCommand of rawCommands) { const { mappedCommand, error } = mapCommand(rawCommand); - console.log(`Performing command: "${rawCommand}"`); + log(`Performing command: "${rawCommand}"`); if (error) { - annotate({ + const issue = `Unable to parse command: "${command}"`; + + annotateIssue({ test, - warning: `Unable to parse command: "${command}"`, + issue, }); + test.info().fixme(true, issue); + return; } @@ -98,7 +103,7 @@ const executeCommandSequence = async ({ const lastSpokenPhrase = await nvda.lastSpokenPhrase(); - console.log(`Screen reader output: "${lastSpokenPhrase}".`); + log(`Screen reader output: "${lastSpokenPhrase}".`); } }; @@ -114,14 +119,14 @@ const generateTestSuite = ({ test.describe(`@windows @nvda ${references.title}`, () => { test.beforeEach(({ browserName, browser }) => { - console.table({ + table({ browserName, browserVersion: browser.version(), osPlatform, osRelease, }); - console.table(references); + table(references); }); for (const screenReaderTest of screenReaderTests) { @@ -137,7 +142,7 @@ const generateTestSuite = ({ let stopRecording: () => string; test.beforeEach(async ({ page, nvda }) => { - console.table(screenReaderTest); + table(screenReaderTest); try { stopRecording = record({ @@ -145,7 +150,7 @@ const generateTestSuite = ({ screenReaderName, }); } catch { - annotate({ test, warning: "Screen recording failed." }); + annotateIssue({ test, issue: "Screen recording failed." }); } await setup({ @@ -165,27 +170,27 @@ const generateTestSuite = ({ browserName, nvda, }) => { - await setAllureMetadata({ + await setMetadata({ browserName, browserVersion: browser.version(), osPlatform, osRelease, references, screenReaderTest, + test, testUrl, }); await executeCommandSequence({ command, nvda }); await assert({ assertions, screenReader: nvda, test }); try { - const recordingFilePath = stopRecording?.(); - - await setAllureRecording({ + await attachRecording({ osPlatform, - recordingFilePath, + path: stopRecording?.(), + test, }); } catch { - annotate({ test, warning: "Screen recording failed." }); + annotateIssue({ test, issue: "Screen recording failed." }); } }); } diff --git a/windows.config.ts b/windows.config.ts index 1574e06..252432d 100644 --- a/windows.config.ts +++ b/windows.config.ts @@ -9,18 +9,17 @@ const config: PlaywrightTestConfig = { timeout: 5 * 60 * 1000, retries: 1, projects: [ - { - name: "firefox", - use: { ...devices["Desktop Firefox"], headless: false }, - }, { name: "chromium", use: { ...devices["Desktop Chrome"], headless: false }, }, + // TODO: Enable once figure out storage size situation. + // { + // name: "firefox", + // use: { ...devices["Desktop Firefox"], headless: false }, + // }, ], - reporter: process.env.CI - ? [["github"], ["allure-playwright", { outputDir: "allure-results" }]] - : "list", + reporter: process.env.CI ? [["github"], ["html", { open: "never" }]] : "list", }; export default config; diff --git a/yarn.lock b/yarn.lock index c57a45c..267ce36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,22 +56,20 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== -"@guidepup/guidepup@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@guidepup/guidepup/-/guidepup-0.20.0.tgz#9715beda0731f089082b225a263de3a23aacd78d" - integrity sha512-ak2xEM4t2uBWmUFmZgjrHSBBEqlP68p3c2gm2GeLeONepYisOfoQDiohUQh79jA13s3H7oRzQZ1J80hOKLDgMw== +"@guidepup/guidepup@^0.21.0": + version "0.21.0" + resolved "https://registry.yarnpkg.com/@guidepup/guidepup/-/guidepup-0.21.0.tgz#bccf8bd7c5a08b4f8b70578eba1a8f835bdb8e5d" + integrity sha512-gO7c2rT2nG/VgAhMlk7FmEbU4HI8DoS8FYsohAcCVWaCHZM/I6vUh4FLTHMZ3p+ZTtHubNwqprxAHmzQoxM3Cg== dependencies: ffmpeg-static "^5.2.0" regedit "5.1.2" semver "^7.3.8" shelljs "^0.8.5" -"@guidepup/playwright@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@guidepup/playwright/-/playwright-0.11.0.tgz#113b77e88947bbaec5e047ea816d977da2627c69" - integrity sha512-6d0ki20Gl7c8iCS5dNtvi9SqzAohP9/jlhC6RZ1OOZXV/iDvT8oCavbzcsm5JQtlVMwpXPZxBC/iTJuNaU7qOg== - dependencies: - "@guidepup/guidepup" "^0.20.0" +"@guidepup/playwright@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@guidepup/playwright/-/playwright-0.12.0.tgz#ba2a3778fd31d4c966fdd2f90f9900457f0d2993" + integrity sha512-mSII0K8djfqkTr2CCvHYsiXjHrDkbnZAnQXoCmi3VXX1fO11EQ08k0jmmV420d/I+pEyoXPboQmU4YI6in7HIg== "@humanwhocodes/config-array@^0.11.13": version "0.11.13" @@ -308,25 +306,6 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -allure-commandline@^2.25.0: - version "2.25.0" - resolved "https://registry.yarnpkg.com/allure-commandline/-/allure-commandline-2.25.0.tgz#46a42b91a5fdeb70a4d2a077bed93515b1c7dd65" - integrity sha512-HYMQwuX/8ySTrXqgr6ZY830c6xgRbSusxVwZIBbDyNTCDb3mqK2b1ENjsD8yhl/7/8S02NZCDAwJFxt3f8qL9Q== - -allure-js-commons@2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/allure-js-commons/-/allure-js-commons-2.10.0.tgz#59edd18ac283bd58d848e47fc7e625342921a43a" - integrity sha512-DgACWBU2dchQD8tQOo5Y0MXx08SSzdgCnKBdwrOu29vITYBXih+0r8SbmrFYQhjAbn8eKMM+mXq+rKtjZRa2oA== - dependencies: - properties "^1.2.1" - -allure-playwright@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/allure-playwright/-/allure-playwright-2.10.0.tgz#f5ff5a1dcc946ed92b056a1d45d7aa3c55b391ca" - integrity sha512-zDljPJ/Fnyd2fn7msChtZebwkSVmAGLe/oWK7okGi0Ed+iHZ0E5Vwe5Z5MtUdfLjnT/OkOduwmS7R/DHeTXFSA== - dependencies: - allure-js-commons "2.10.0" - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -386,6 +365,11 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -790,6 +774,11 @@ ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -811,7 +800,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@~2.0.1: +inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -860,6 +849,11 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -882,6 +876,16 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +jszip@^3.7.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -890,6 +894,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -989,6 +1000,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -1036,6 +1052,14 @@ playwright-core@1.40.1: resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.40.1.tgz#442d15e86866a87d90d07af528e0afabe4c75c05" integrity sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ== +playwright-merge-html-reports@^0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/playwright-merge-html-reports/-/playwright-merge-html-reports-0.2.8.tgz#9ac4892314bdf1bac5cc79c4b02257f9acdca881" + integrity sha512-uiu198+KYq5DeVPso8JIsi8cY7BPpUkCQx8XpCgIBu92k3AY7BNl3vjgq5g1mOp40VcRccun0gd6uykQAlaiWQ== + dependencies: + jszip "^3.7.1" + yazl "^2.5.1" + playwright@1.40.1: version "1.40.1" resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.40.1.tgz#a11bf8dca15be5a194851dbbf3df235b9f53d7ae" @@ -1050,16 +1074,16 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/properties/-/properties-1.2.1.tgz#0ee97a7fc020b1a2a55b8659eda4aa8d869094bd" - integrity sha512-qYNxyMj1JeW54i/EWEFsM1cVwxJbtgPp8+0Wg9XjNaK6VE/c4oRi6PNu5p7w1mNXEIQIjV5Wwn8v8Gz82/QzdQ== - punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -1089,6 +1113,19 @@ readable-stream@^3.0.2: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -1139,6 +1176,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -1158,6 +1200,11 @@ semver@^7.5.4: dependencies: lru-cache "^6.0.0" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -1201,6 +1248,13 @@ string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1310,7 +1364,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -1342,6 +1396,13 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yazl@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35" + integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== + dependencies: + buffer-crc32 "~0.2.3" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"