diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 00000000..ce730d72 --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,74 @@ +# e2e test for transcoder + +name: CI for Transcoder + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the main branch + # push: + # branches: + # - automation/playwright + # - action/directUrl + pull_request: + branches: + - automation/playwright + - action/directUrl + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: +jobs: + Run-wpe2e-TestCase: + # The type of runner that the job will run on + name: Run Transcoder Jobs + runs-on: ubuntu-latest + env: + SHA: ${{ github.event.pull_request.head.sha }} + COMMIT_SHA: ${{ github.sha }} + PR_NUMBER: ${{ github.event.pull_request.number }} + working-directory: ./tests/e2e-playwright + TESRESULT_TOKEN: ${{ secrets.TESRESULT_TOKEN }} + TOKEN: ${{ secrets.GITHUB_TOKEN }} + + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 17 + cache: "npm" + cache-dependency-path: tests/e2e-playwright/package-lock.json + + - name: Install npm dependencies + run: npm install + working-directory: ${{env.working-directory}} + + - name: Build Playwright utils dependencies + run: npm run build + working-directory: ${{env.working-directory}} + + - name: Install browser + run: npx playwright install chromium + working-directory: ${{env.working-directory}} + + - name: Run End to End tests + run: npm run test-e2e:playwright -- test + working-directory: ${{env.working-directory}} + + - name: run PR status + if: ${{ always() }} + run: node ./tests/e2e-playwright/bin/pr-status.js + working-directory: ${{env.working_directory}} + + - name: Make reports available + uses: actions/upload-artifact@v2 + if: success() || failure() + with: + name: playwright-report + retention-days: 2 + path: | + ${{ github.workspace }}/playwright-report \ No newline at end of file diff --git a/tests/e2e-playwright/artifacts/storage-states/admin.json b/tests/e2e-playwright/artifacts/storage-states/admin.json index 6b8f92e2..24691449 100644 --- a/tests/e2e-playwright/artifacts/storage-states/admin.json +++ b/tests/e2e-playwright/artifacts/storage-states/admin.json @@ -1 +1 @@ -{"cookies":[{"name":"wordpress_test_cookie","value":"WP%20Cookie%20check","domain":"alvi-tazwar.rt.gw","path":"/","expires":-1,"httpOnly":false,"secure":true,"sameSite":"Lax"},{"name":"wordpress_sec_191e09a7a9040b4b9e012813e9020ebe","value":"automation%7C1670599253%7CxsDvHbIRbZvNp0dchukSXY4BQqM5SV7R5HssyOKoVDn%7Cf176d4f6e0004583ceac1882e7c53a0c3d2797f205b6eaaa295010c73f3ec0ca","domain":"alvi-tazwar.rt.gw","path":"/wp-content/plugins","expires":-1,"httpOnly":true,"secure":true,"sameSite":"Lax"},{"name":"wordpress_sec_191e09a7a9040b4b9e012813e9020ebe","value":"automation%7C1670599253%7CxsDvHbIRbZvNp0dchukSXY4BQqM5SV7R5HssyOKoVDn%7Cf176d4f6e0004583ceac1882e7c53a0c3d2797f205b6eaaa295010c73f3ec0ca","domain":"alvi-tazwar.rt.gw","path":"/wp-admin","expires":-1,"httpOnly":true,"secure":true,"sameSite":"Lax"},{"name":"wordpress_logged_in_191e09a7a9040b4b9e012813e9020ebe","value":"automation%7C1670599253%7CxsDvHbIRbZvNp0dchukSXY4BQqM5SV7R5HssyOKoVDn%7C397e7a773ae12136b44bc578558097c04c26d85c04e8fd5fc73a5d7170e2776a","domain":"alvi-tazwar.rt.gw","path":"/","expires":-1,"httpOnly":true,"secure":true,"sameSite":"Lax"},{"name":"wp-settings-time-2","value":"1670426457","domain":"alvi-tazwar.rt.gw","path":"/","expires":1701962458.467,"httpOnly":false,"secure":true,"sameSite":"Lax"}],"nonce":"ac6291720e","rootURL":"https://alvi-tazwar.rt.gw/wp-json/"} \ No newline at end of file +{"cookies":[{"name":"wordpress_test_cookie","value":"WP%20Cookie%20check","domain":"transcoder-test.rt.gw","path":"/","expires":-1,"httpOnly":false,"secure":true,"sameSite":"Lax"},{"name":"wordpress_sec_96f90609ac816b029eb88122fe5d3b9e","value":"automation%7C1671884843%7Cbc7ZN49lhuDs3uIlaLgFzJIPzjW8vYqmQVYyh2BtzTF%7Ce3c97628fff04353330e9f1728e6d0c7b8ef0f8f42bb87da895d100cc3e38531","domain":"transcoder-test.rt.gw","path":"/wp-content/plugins","expires":-1,"httpOnly":true,"secure":true,"sameSite":"Lax"},{"name":"wordpress_sec_96f90609ac816b029eb88122fe5d3b9e","value":"automation%7C1671884843%7Cbc7ZN49lhuDs3uIlaLgFzJIPzjW8vYqmQVYyh2BtzTF%7Ce3c97628fff04353330e9f1728e6d0c7b8ef0f8f42bb87da895d100cc3e38531","domain":"transcoder-test.rt.gw","path":"/wp-admin","expires":-1,"httpOnly":true,"secure":true,"sameSite":"Lax"},{"name":"wordpress_logged_in_96f90609ac816b029eb88122fe5d3b9e","value":"automation%7C1671884843%7Cbc7ZN49lhuDs3uIlaLgFzJIPzjW8vYqmQVYyh2BtzTF%7C05cc51cb43aeab2c266b9a25821cb1b6060d05937a22ee9265c6e9b3e4c8730f","domain":"transcoder-test.rt.gw","path":"/","expires":-1,"httpOnly":true,"secure":true,"sameSite":"Lax"},{"name":"wp-settings-time-2","value":"1671712044","domain":"transcoder-test.rt.gw","path":"/","expires":1703248044.494,"httpOnly":false,"secure":true,"sameSite":"Lax"}],"nonce":"9762542f44","rootURL":"https://transcoder-test.rt.gw/wp-json/"} \ No newline at end of file diff --git a/tests/e2e-playwright/assets/3g2-sample.3g2 b/tests/e2e-playwright/assets/3g2-sample.3g2 new file mode 100644 index 00000000..2b5f071c Binary files /dev/null and b/tests/e2e-playwright/assets/3g2-sample.3g2 differ diff --git a/tests/e2e-playwright/bin/pr-status.js b/tests/e2e-playwright/bin/pr-status.js new file mode 100644 index 00000000..248a7734 --- /dev/null +++ b/tests/e2e-playwright/bin/pr-status.js @@ -0,0 +1,21 @@ +#!/usr/bin/env node +// Octokit.js +// https://github.com/octokit/core.js#readme + +const { Octokit } = require("@octokit/core"); + +const octokit = new Octokit({ + auth: process.env.TOKEN, +}); + +octokit.request("POST /repos/{org}/{repo}/statuses/{sha}", { + org: "rtCamp", + repo: "transcoder", + sha: process.env.SHA ? process.env.SHA : process.env.COMMIT_SHA, + state: "success", + conclusion: "success", + target_url: + "https://www.tesults.com/results/rsp/view/status/project/0c8b70a6-8f6c-4b0d-9bfc-e410f6e83568", + description: "Successfully synced to Tesults", + context: "E2E Test Result", +}); \ No newline at end of file diff --git a/tests/e2e-playwright/e2e-test-utils-playwright/build/config.js b/tests/e2e-playwright/e2e-test-utils-playwright/build/config.js index 0bd5cc69..7e32bfaf 100644 --- a/tests/e2e-playwright/e2e-test-utils-playwright/build/config.js +++ b/tests/e2e-playwright/e2e-test-utils-playwright/build/config.js @@ -6,7 +6,8 @@ const WP_ADMIN_USER = { password: 'automation', }; exports.WP_ADMIN_USER = WP_ADMIN_USER; -const { WP_USERNAME = WP_ADMIN_USER.username, WP_PASSWORD = WP_ADMIN_USER.password, WP_BASE_URL = 'https://alvi-tazwar.rt.gw/', } = process.env; +const { WP_USERNAME = WP_ADMIN_USER.username, WP_PASSWORD = WP_ADMIN_USER.password, WP_BASE_URL = 'https://transcoder-test.rt.gw/', // http://transcoder.com + } = process.env; exports.WP_USERNAME = WP_USERNAME; exports.WP_PASSWORD = WP_PASSWORD; exports.WP_BASE_URL = WP_BASE_URL; diff --git a/tests/e2e-playwright/e2e-test-utils-playwright/package.json b/tests/e2e-playwright/e2e-test-utils-playwright/package.json index 41a6485b..113ac26e 100644 --- a/tests/e2e-playwright/e2e-test-utils-playwright/package.json +++ b/tests/e2e-playwright/e2e-test-utils-playwright/package.json @@ -35,7 +35,10 @@ "@wordpress/keycodes": "3.13.0", "@wordpress/url": "3.14.0", "form-data": "^4.0.0", - "lodash": "^4.17.21" + "lodash": "^4.17.21", + "@octokit/core": "^2.5.4", + "@octokit/plugin-paginate-rest": "^1.1.1", + "playwright-tesults-reporter": "^1.0.0" }, "peerDependencies": { "@playwright/test": ">=1" diff --git a/tests/e2e-playwright/e2e-test-utils-playwright/src/config.ts b/tests/e2e-playwright/e2e-test-utils-playwright/src/config.ts index e61c8cdb..12a1557f 100644 --- a/tests/e2e-playwright/e2e-test-utils-playwright/src/config.ts +++ b/tests/e2e-playwright/e2e-test-utils-playwright/src/config.ts @@ -6,7 +6,7 @@ const WP_ADMIN_USER = { const { WP_USERNAME = WP_ADMIN_USER.username, WP_PASSWORD = WP_ADMIN_USER.password, - WP_BASE_URL = 'https://alvi-tazwar.rt.gw/', + WP_BASE_URL = 'https://transcoder-test.rt.gw/', // http://transcoder.com } = process.env; export { WP_ADMIN_USER, WP_USERNAME, WP_PASSWORD, WP_BASE_URL }; diff --git a/tests/e2e-playwright/package-lock.json b/tests/e2e-playwright/package-lock.json index c01511df..9cc3f21e 100644 --- a/tests/e2e-playwright/package-lock.json +++ b/tests/e2e-playwright/package-lock.json @@ -32,23 +32,20 @@ "@playwright/test": ">=1" } }, - "../../../../../e2e-test-utils-playwright": { - "extraneous": true - }, - "../e2e-test-utils-playwright": { - "extraneous": true - }, "e2e-test-utils-playwright": { "name": "@wordpress/e2e-test-utils-playwright", "version": "0.0.0", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { + "@octokit/core": "^2.5.4", + "@octokit/plugin-paginate-rest": "^1.1.1", "@wordpress/api-fetch": "6.10.0", "@wordpress/keycodes": "3.13.0", "@wordpress/url": "3.14.0", "form-data": "^4.0.0", - "lodash": "^4.17.21" + "lodash": "^4.17.21", + "playwright-tesults-reporter": "^1.0.0" }, "engines": { "node": ">=12" @@ -2435,6 +2432,190 @@ "node": ">= 8" } }, + "node_modules/@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "node_modules/@octokit/auth-token/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/core": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz", + "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^2.4.0", + "@octokit/graphql": "^4.3.1", + "@octokit/request": "^5.4.0", + "@octokit/types": "^5.0.0", + "before-after-hook": "^2.1.0", + "universal-user-agent": "^5.0.0" + } + }, + "node_modules/@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/endpoint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/endpoint/node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "node_modules/@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, + "dependencies": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/graphql/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/graphql/node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "node_modules/@octokit/openapi-types": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", + "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", + "dev": true, + "dependencies": { + "@octokit/types": "^2.0.1" + } + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "dependencies": { + "@types/node": ">= 8" + } + }, + "node_modules/@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/request/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/request/node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "node_modules/@octokit/types": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", + "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", + "dev": true, + "dependencies": { + "@types/node": ">= 8" + } + }, "node_modules/@playwright/test": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.22.2.tgz", @@ -3997,6 +4178,12 @@ "yallist": "^2.1.2" } }, + "node_modules/@wordpress/scripts/node_modules/prettier": { + "name": "wp-prettier", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.6.2.tgz", + "integrity": "sha512-AV33EzqiFJ3fj+mPlKABN59YFPReLkDxQnj067Z3uEOeRQf3g05WprL0RDuqM7UBhSRo9W1rMSC2KvZmjE5UOA==" + }, "node_modules/@wordpress/scripts/node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -4479,6 +4666,74 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.1280.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1280.0.tgz", + "integrity": "sha512-6Dv/RuMQdye7wps4HwcMZwRw9han51PQVcMXq4e5KUNqzQ9wHmaFMFVI/kY4NIkR7D3IczEg4WoUCoKhj464hA==", + "dev": true, + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.4.19" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-sdk/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/aws-sdk/node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/aws-sdk/node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/axe-core": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", @@ -4695,6 +4950,12 @@ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -5996,6 +6257,12 @@ "node": ">= 0.8" } }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -7464,6 +7731,15 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -7612,9 +7888,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -7788,6 +8064,18 @@ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==" }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -8271,6 +8559,22 @@ "node": ">=8" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -8400,6 +8704,21 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -8579,6 +8898,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -9311,6 +9649,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/joi": { "version": "17.6.0", "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", @@ -9680,6 +10027,18 @@ "node": ">=10" } }, + "node_modules/macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -10201,6 +10560,12 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -10615,6 +10980,28 @@ "node": ">=0.10.0" } }, + "node_modules/os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "dependencies": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -10917,6 +11304,15 @@ "node": ">=14" } }, + "node_modules/playwright-tesults-reporter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/playwright-tesults-reporter/-/playwright-tesults-reporter-1.1.0.tgz", + "integrity": "sha512-C84bTQbEG1BfdroUgagaO58LLZajY09npdxQcYQTGNYExgvETL7pZgGK16SLwZ9Kquyqo07gBOEMeM+m7e0gyA==", + "dev": true, + "dependencies": { + "tesults": "^1.1.3" + } + }, "node_modules/plur": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", @@ -11487,21 +11883,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prettier": { - "name": "wp-prettier", - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.6.2.tgz", - "integrity": "sha512-AV33EzqiFJ3fj+mPlKABN59YFPReLkDxQnj067Z3uEOeRQf3g05WprL0RDuqM7UBhSRo9W1rMSC2KvZmjE5UOA==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", @@ -11691,6 +12072,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -12388,6 +12779,12 @@ } } }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "dev": true + }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -12988,6 +13385,15 @@ "node": ">=8" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -13620,6 +14026,15 @@ "node": ">=8" } }, + "node_modules/tesults": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tesults/-/tesults-1.1.3.tgz", + "integrity": "sha512-BU7vQUHSzeD3HJoEqEBikfQOGrRoAwPTqHAKiRZX3ZwBkPDo5l0eKzRTaigQszMEitAhZ1SuRpwqIMpd74D+zg==", + "dev": true, + "dependencies": { + "aws-sdk": "^2.41.0" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -13914,8 +14329,17 @@ "node": ">=4" } }, - "node_modules/universalify": { - "version": "0.1.2", + "node_modules/universal-user-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", + "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", + "dev": true, + "dependencies": { + "os-name": "^3.1.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { @@ -13963,6 +14387,16 @@ "punycode": "^2.1.0" } }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, "node_modules/url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", @@ -13989,6 +14423,25 @@ } } }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -14049,6 +14502,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dependencies": { "browser-process-hrtime": "^1.0.0" } @@ -14609,11 +15063,164 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" }, + "node_modules/windows-release": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", + "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", + "dev": true, + "dependencies": { + "execa": "^1.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/windows-release/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/windows-release/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/windows-release/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/windows-release/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/windows-release/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/windows-release/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/windows-release/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/windows-release/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/windows-release/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -14688,6 +15295,25 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -16449,6 +17075,196 @@ "fastq": "^1.6.0" } }, + "@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3" + }, + "dependencies": { + "@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^12.11.0" + } + } + } + }, + "@octokit/core": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz", + "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==", + "dev": true, + "requires": { + "@octokit/auth-token": "^2.4.0", + "@octokit/graphql": "^4.3.1", + "@octokit/request": "^5.4.0", + "@octokit/types": "^5.0.0", + "before-after-hook": "^2.1.0", + "universal-user-agent": "^5.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + } + } + }, + "@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, + "requires": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + } + } + }, + "@octokit/openapi-types": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", + "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.1" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } + } + }, + "@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dev": true, + "requires": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + } + } + }, + "@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "dependencies": { + "@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^12.11.0" + } + } + } + }, + "@octokit/types": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", + "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + }, "@playwright/test": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.22.2.tgz", @@ -17410,11 +18226,14 @@ "@wordpress/e2e-test-utils-playwright": { "version": "file:e2e-test-utils-playwright", "requires": { + "@octokit/core": "^2.5.4", + "@octokit/plugin-paginate-rest": "^1.1.1", "@wordpress/api-fetch": "6.10.0", "@wordpress/keycodes": "3.13.0", "@wordpress/url": "3.14.0", "form-data": "^4.0.0", - "lodash": "^4.17.21" + "lodash": "^4.17.21", + "playwright-tesults-reporter": "^1.0.0" } }, "@wordpress/element": { @@ -17617,6 +18436,11 @@ "yallist": "^2.1.2" } }, + "prettier": { + "version": "npm:wp-prettier@2.6.2", + "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.6.2.tgz", + "integrity": "sha512-AV33EzqiFJ3fj+mPlKABN59YFPReLkDxQnj067Z3uEOeRQf3g05WprL0RDuqM7UBhSRo9W1rMSC2KvZmjE5UOA==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -17947,6 +18771,61 @@ "postcss-value-parser": "^4.2.0" } }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "aws-sdk": { + "version": "2.1280.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1280.0.tgz", + "integrity": "sha512-6Dv/RuMQdye7wps4HwcMZwRw9han51PQVcMXq4e5KUNqzQ9wHmaFMFVI/kY4NIkR7D3IczEg4WoUCoKhj464hA==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.4.19" + }, + "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true + } + } + }, "axe-core": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", @@ -18104,6 +18983,12 @@ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, + "before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -19058,6 +19943,12 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -20156,6 +21047,15 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -20257,9 +21157,9 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -20381,6 +21281,15 @@ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==" }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -20721,6 +21630,16 @@ "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==" }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -20802,6 +21721,15 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -20915,6 +21843,19 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -21479,6 +22420,12 @@ } } }, + "jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true + }, "joi": { "version": "17.6.0", "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", @@ -21770,6 +22717,12 @@ "yallist": "^4.0.0" } }, + "macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "dev": true + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -22153,6 +23106,12 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -22453,6 +23412,22 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" }, + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -22661,6 +23636,15 @@ "integrity": "sha512-w/hc/Ld0RM4pmsNeE6aL/fPNWw8BWit2tg+TfqJ3+p59c6s3B6C8mXvXrIPmfQEobkcFDc+4KirNzOQ+uBSP1Q==", "dev": true }, + "playwright-tesults-reporter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/playwright-tesults-reporter/-/playwright-tesults-reporter-1.1.0.tgz", + "integrity": "sha512-C84bTQbEG1BfdroUgagaO58LLZajY09npdxQcYQTGNYExgvETL7pZgGK16SLwZ9Kquyqo07gBOEMeM+m7e0gyA==", + "dev": true, + "requires": { + "tesults": "^1.1.3" + } + }, "plur": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", @@ -22996,11 +23980,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, - "prettier": { - "version": "npm:wp-prettier@2.6.2", - "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.6.2.tgz", - "integrity": "sha512-AV33EzqiFJ3fj+mPlKABN59YFPReLkDxQnj067Z3uEOeRQf3g05WprL0RDuqM7UBhSRo9W1rMSC2KvZmjE5UOA==" - }, "prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", @@ -23148,6 +24127,12 @@ "side-channel": "^1.0.4" } }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -23629,6 +24614,12 @@ "neo-async": "^2.6.2" } }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "dev": true + }, "saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -24120,6 +25111,12 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true + }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -24578,6 +25575,15 @@ "minimatch": "^3.0.4" } }, + "tesults": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tesults/-/tesults-1.1.3.tgz", + "integrity": "sha512-BU7vQUHSzeD3HJoEqEBikfQOGrRoAwPTqHAKiRZX3ZwBkPDo5l0eKzRTaigQszMEitAhZ1SuRpwqIMpd74D+zg==", + "dev": true, + "requires": { + "aws-sdk": "^2.41.0" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -24797,6 +25803,15 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" }, + "universal-user-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", + "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", + "dev": true, + "requires": { + "os-name": "^3.1.0" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -24824,6 +25839,24 @@ "punycode": "^2.1.0" } }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + } + } + }, "url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", @@ -24834,6 +25867,19 @@ "schema-utils": "^3.0.0" } }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -25272,11 +26318,124 @@ "is-symbol": "^1.0.3" } }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" }, + "windows-release": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", + "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", + "dev": true, + "requires": { + "execa": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -25328,6 +26487,22 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", + "dev": true + }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/tests/e2e-playwright/package.json b/tests/e2e-playwright/package.json index 3a642e5d..cf0ef938 100644 --- a/tests/e2e-playwright/package.json +++ b/tests/e2e-playwright/package.json @@ -33,7 +33,7 @@ "@wordpress/e2e-test-utils-playwright": "file:e2e-test-utils-playwright", "eslint-plugin-playwright": "0.8.0", "filenamify": "4.2.0", - "worker-farm": "1.7.0", + "worker-farm": "1.7.0", "typescript": "4.4.2" }, "peerDependencies": { @@ -46,7 +46,7 @@ "build:packages": "npm run build:package-types && node ./bin/packages/build.js", "build:package-types": "node ./bin/packages/validate-typescript-version.js && tsc --build", "build": "npm run build:packages && wp-scripts build", - "dev": "npm run build:packages && concurrently \"wp-scripts start\" \"npm run dev:packages\"", + "dev": "npm run build:packages && concurrently \"wp-scripts start\" \"npm run dev:packages\"", "test-e2e:playwright": "playwright test --config playwright.config.ts" } } diff --git a/tests/e2e-playwright/playwright.config.ts b/tests/e2e-playwright/playwright.config.ts index cbd9ad47..3e452b29 100644 --- a/tests/e2e-playwright/playwright.config.ts +++ b/tests/e2e-playwright/playwright.config.ts @@ -1,61 +1,62 @@ /** * External dependencies */ - import path from 'path'; - import { fileURLToPath } from 'url'; - import { devices } from '@playwright/test'; - import type { PlaywrightTestConfig } from '@playwright/test'; - - const STORAGE_STATE_PATH = - process.env.STORAGE_STATE_PATH || - path.join( process.cwd(), 'artifacts/storage-states/admin.json' ); - - const config: PlaywrightTestConfig = { - reporter: process.env.CI - ? [ [ 'github' ], [ './config/flaky-tests-reporter.ts' ] ] - : 'list', - forbidOnly: !! process.env.CI, - workers: 1, - retries: process.env.CI ? 2 : 0, - timeout: parseInt( process.env.TIMEOUT || '', 100 ) || 100_0000, // Defaults to 100 seconds. - // Don't report slow test "files", as we will be running our tests in serial. - reportSlowTests: null, - testDir: fileURLToPath( new URL( './specs', 'file:' + __filename ).href ), - outputDir: path.join( process.cwd(), 'artifacts/test-results' ), - globalSetup: fileURLToPath( - new URL( './config/global-setup.ts', 'file:' + __filename ).href - ), - use: { - baseURL: 'https://alvi-tazwar.rt.gw/', - headless: true, - viewport: { - width: 960, - height: 700, - }, - ignoreHTTPSErrors: true, - locale: 'en-US', - contextOptions: { - reducedMotion: 'reduce', - strictSelectors: true, - }, - storageState: STORAGE_STATE_PATH, - actionTimeout: 100_000, // 10 seconds. - trace: 'retain-on-failure', - screenshot: 'only-on-failure', - video: 'on-first-retry', - }, - // webServer: { - // command: 'npm run wp-env start', - // port: 8889, - // timeout: 120_000, // 120 seconds. - // reuseExistingServer: true, - // }, - projects: [ - { - name: 'chromium', - use: { ...devices[ 'Desktop Chrome' ] }, - }, - ], - }; - - export default config; \ No newline at end of file +import path from 'path'; +import { fileURLToPath } from 'url'; +import { devices } from '@playwright/test'; +import type { PlaywrightTestConfig } from '@playwright/test'; + +const STORAGE_STATE_PATH = + process.env.STORAGE_STATE_PATH || + path.join(process.cwd(), 'artifacts/storage-states/admin.json'); +const config: PlaywrightTestConfig = { + // reporter: process.env.CI + // ? [['github'], ['./config/flaky-tests-reporter.ts']] + // : 'list', + reporter: [ + ["html", { open: "never" }], + ["junit", { outputFile: "playwright-report/results.xml" }], + [ + "playwright-tesults-reporter", + { "tesults-target": process.env.TESRESULT_TOKEN }, + ], + ], + forbidOnly: !!process.env.CI, + workers: 1, + retries: process.env.CI ? 2 : 0, + timeout: parseInt(process.env.TIMEOUT || '', 100) || 100_0000, // Defaults to 100 seconds. + // Don't report slow test "files", as we will be running our tests in serial. + reportSlowTests: null, + testDir: fileURLToPath(new URL('./specs', 'file:' + __filename).href), + outputDir: path.join(process.cwd(), 'artifacts/test-results'), + globalSetup: fileURLToPath( + new URL('./config/global-setup.ts', 'file:' + __filename).href + ), + use: { + baseURL: 'https://transcoder-test.rt.gw/', //https://transcoder.com + headless: true, + viewport: { + width: 960, + height: 700, + }, + ignoreHTTPSErrors: true, + locale: 'en-US', + contextOptions: { + reducedMotion: 'reduce', + strictSelectors: true, + }, + storageState: STORAGE_STATE_PATH, + actionTimeout: 100_000, // 10 seconds. + trace: 'retain-on-failure', + screenshot: 'only-on-failure', + video: 'on-first-retry', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}; + +export default config; \ No newline at end of file diff --git a/tests/e2e-playwright/specs/01_validate-transcoder-settings.spec.js b/tests/e2e-playwright/specs/01_validate-transcoder-settings.spec.js index 182d8785..2f0a78a2 100644 --- a/tests/e2e-playwright/specs/01_validate-transcoder-settings.spec.js +++ b/tests/e2e-playwright/specs/01_validate-transcoder-settings.spec.js @@ -2,27 +2,33 @@ * WordPress dependencies */ const { test, expect } = require('@wordpress/e2e-test-utils-playwright'); - +const { TransCodeStatus } = require("../utils/locator.js"); test.describe('Validate Transcoder Settings', () => { test.beforeEach(async ({ admin }) => { await admin.visitAdminPage('/'); }); test('Check Transcoder settings Options', async ({ admin, page, editor }) => { - + await page.locator("#toplevel_page_rt-transcoder > a > div.wp-menu-name").click(); - // Check Lisence key Settings + // Check Lisence key Settings and insert Free key const licenseSettings = page.locator("input[id='new-api-key']") expect(licenseSettings).not.toBeNull(); await page.focus("input[id='new-api-key']"); - licenseSettings.fill("8c1a107c6c89bd9dda666a635f441890"); + await licenseSettings.fill("8c1a107c6c89bd9dda666a635f441890"); await page.locator("button[id='api-key-submit']").click(); + await page.screenshot({ path: "uploads/uploads.png" }) //verify Save key await expect(page.locator("div[class='updated']")).not.toBeNull() await page.locator("#submit").click(); - // Check Feature plan - const settingBox = page.locator("div[id='transcoder-settings-boxes']") + // Check Feature plan is present on the DOM + const settingBox = page.locator("div[id='transcoder-settings-boxes']") expect(settingBox).not.toBeNull(); + + // verify Free plan by checking button is disabled + const checkButton = page.locator("button[class='button button-primary bpm-unsubscribe']").isDisabled(); + expect(checkButton).toBeTruthy(); + // Check thumbnail Settings const thumbnailSetting = page.locator('input[name="number_of_thumbs"]'); expect(thumbnailSetting).not.toBeNull(); @@ -30,21 +36,33 @@ test.describe('Validate Transcoder Settings', () => { const activeUsage = page.locator("div[id='transcoder-usage']"); expect(activeUsage).not.toBeNull(); // Validate Checkboxes + const thumbnailCheckbox = await page.locator("input[name='rtt_override_thumbnail']").isChecked(); + const trackUserprofile = await page.locator("input[name='rtt_client_check_status_button']").isChecked(); - const thumbnailCheckbox = page.locator("input[name='rtt_override_thumbnail']").isChecked(); - const trackUserprofile = page.locator("input[name='rtt_client_check_status_button']").isChecked(); - // Ensure Checkbox are checked - if (thumbnailCheckbox == false) { + // Ensure Checkbox are checked for checking transcoding status for next test case + if (thumbnailCheckbox === false) { await page.locator("input[name='rtt_override_thumbnail']").check(); } - - if (trackUserprofile == false) { + if (trackUserprofile === false) { await page.locator("input[name='rtt_client_check_status_button']").check(); - } - // Save settings and verify + } + // Save settings and verify await page.locator("#submit").click(); - await expect(page.locator("div[class='updated']")).not.toBeNull() - + await expect(page.locator("div[class='updated']")).not.toBeNull(); + + // Check for Empty Retranscoder + await page.locator("role=link[name='Retranscode Media']").click(); + // Click retranscode all media + await page.locator("role=button[name='Retranscode All Media']").click(); + // Get Message from DOM + const CheckMessage = await page.evaluate(selector => document.querySelector("div.wrap.retranscodemedia > p").innerText.slice(0, 4)); + // It will assert Both Emtpy and Non Empty Media For ReTranscoding. + if (CheckMessage == TransCodeStatus.NotNull) { + console.log("Already Media Exist") + } + else if (CheckMessage == TransCodeStatus.EmptyMedia) { + console.log("No Media is present For Transcoding") + } }); }); \ No newline at end of file diff --git a/tests/e2e-playwright/specs/02_validate-different-media.spec.js b/tests/e2e-playwright/specs/02_validate-different-media.spec.js deleted file mode 100644 index b651e2e2..00000000 --- a/tests/e2e-playwright/specs/02_validate-different-media.spec.js +++ /dev/null @@ -1,168 +0,0 @@ - /** - * WordPress dependencies - */ -const { test, expect } = require('@wordpress/e2e-test-utils-playwright'); -test.describe('Validate Different Media types', () => { - test.beforeEach(async ({ admin }) => { - //await admin.visitAdminPage('upload.php'); - await admin.visitAdminPage("media-new.php") - - - }); - test('Check 3gp sample', async ({ admin, page, editor }) => { - const videoPath = "assets/3gp-sample.3gp"; - const [fileChooser] = await Promise.all([ - // It is important to call waitForEvent before click to set up waiting. - page.waitForEvent('filechooser'), - // Opens the file chooser. - page.locator('#plupload-browse-button').click(), - - ]) - await fileChooser.setFiles([ - videoPath, - ]) - const item = await page.locator("#wpbody-content > div.wrap > h1"); - await expect(item).toBeVisible(); - //page.focus("button[class='button button-small copy-attachment-url']") - const copyButton = "button[class='button button-small copy-attachment-url']"; - if (await page.locator(copyButton).isEnabled()) { - await page.click(copyButton) - } - await admin.visitAdminPage("upload.php"); - //Select Grid and verify assertion - await page.locator("a[id='view-switch-list']").click(); - const checkStatus = page.locator("button[id^='btn_check_status']").first(); - expect(checkStatus).not.toBeNull(); - await checkStatus.click(); - const checkMessage = page.locator("div[id*='span_status']"); - expect(checkMessage).not.toBeNull(); - }); - test('Check webm sample', async ({ admin, page, editor }) => { - const webmPath = "assets/webm-sample.webm"; - const [fileChooser] = await Promise.all([ - // It is important to call waitForEvent before click to set up waiting. - page.waitForEvent('filechooser'), - // Opens the file chooser. - page.locator('#plupload-browse-button').click(), - - ]) - await fileChooser.setFiles([ - webmPath, - ]) - const item = await page.locator("#wpbody-content > div.wrap > h1"); - await expect(item).toBeVisible(); - //page.focus("button[class='button button-small copy-attachment-url']") - const copyButton = "button[class='button button-small copy-attachment-url']"; - if (await page.locator(copyButton).isEnabled()) { - await page.click(copyButton) - } - await admin.visitAdminPage("upload.php"); - //Select Grid - await page.locator("a[id='view-switch-list']").click(); - const checkStatus = page.locator("button[id^='btn_check_status']").first(); - expect(checkStatus).not.toBeNull(); - await checkStatus.click(); - const checkMessage = page.locator("div[id*='span_status']"); - expect(checkMessage).not.toBeNull(); - }); - test('Check ogg sample', async ({ admin, page, editor }) => { - const oggPath = "assets/ogg-sample.ogg"; - const [fileChooser] = await Promise.all([ - // It is important to call waitForEvent before click to set up waiting. - page.waitForEvent('filechooser'), - // Opens the file chooser. - page.locator('#plupload-browse-button').click(), - ]) - await fileChooser.setFiles([ - oggPath, - ]) - const item = await page.locator("#wpbody-content > div.wrap > h1"); - await expect(item).toBeVisible(); - //page.focus("button[class='button button-small copy-attachment-url']") - const copyButton = "button[class='button button-small copy-attachment-url']"; - if (await page.locator(copyButton).isEnabled()) { - await page.click(copyButton) - } - await admin.visitAdminPage("upload.php"); - //Select Grid - await page.locator("a[id='view-switch-list']").click(); - const checkStatus = page.locator("button[id^='btn_check_status']").first(); - expect(checkStatus).not.toBeNull(); - await checkStatus.click(); - const checkMessage = page.locator("div[id*='span_status']"); - expect(checkMessage).not.toBeNull(); - }); - test('Check mp3 sample', async ({ admin, page, editor }) => { - const mp3Path = "assets/mp3-sample.mp3"; - const [fileChooser] = await Promise.all([ - // It is important to call waitForEvent before click to set up waiting. - page.waitForEvent('filechooser'), - // Opens the file chooser. - page.locator('#plupload-browse-button').click(), - ]) - await fileChooser.setFiles([ - mp3Path, - ]) - const item = await page.locator("#wpbody-content > div.wrap > h1"); - await expect(item).toBeVisible(); - //page.focus("button[class='button button-small copy-attachment-url']") - const copyButton = "button[class='button button-small copy-attachment-url']"; - if (await page.locator(copyButton).isEnabled()) { - await page.click(copyButton) - } - await admin.visitAdminPage("upload.php"); - //Select Grid - await page.locator("a[id='view-switch-list']").click(); - const checkStatus = page.locator("button[id^='btn_check_status']").first(); - expect(checkStatus).not.toBeNull(); - }); - test('Check mp4 sample', async ({ admin, page, editor }) => { - const mp4Path = "assets/mp3-sample.mp3"; - const [fileChooser] = await Promise.all([ - // It is important to call waitForEvent before click to set up waiting. - page.waitForEvent('filechooser'), - // Opens the file chooser. - page.locator('#plupload-browse-button').click(), - ]) - await fileChooser.setFiles([ - mp4Path, - ]) - const item = await page.locator("#wpbody-content > div.wrap > h1"); - await expect(item).toBeVisible(); - //page.focus("button[class='button button-small copy-attachment-url']") - const copyButton = "button[class='button button-small copy-attachment-url']"; - if (await page.locator(copyButton).isEnabled()) { - await page.click(copyButton) - } - await admin.visitAdminPage("upload.php"); - //Select Grid - await page.locator("a[id='view-switch-list']").click(); - const checkStatus = page.locator("button[id^='btn_check_status']").first(); - expect(checkStatus).not.toBeNull(); - }); - test('Check pdf sample', async ({ admin, page, editor }) => { - const pdfPath = "assets/pdf-sample.pdf"; - const [fileChooser] = await Promise.all([ - // It is important to call waitForEvent before click to set up waiting. - page.waitForEvent('filechooser'), - // Opens the file chooser. - page.locator('#plupload-browse-button').click(), - ]) - await fileChooser.setFiles([ - pdfPath, - ]) - const item = await page.locator("#wpbody-content > div.wrap > h1"); - await expect(item).toBeVisible(); - //page.focus("button[class='button button-small copy-attachment-url']") - const copyButton = "button[class='button button-small copy-attachment-url']"; - if (await page.locator(copyButton).isEnabled()) { - await page.click(copyButton) - } - await admin.visitAdminPage("upload.php"); - //Select Grid - await page.locator("a[id='view-switch-list']").click(); - const checkStatus = page.locator("button[id^='btn_check_status']").first(); - expect(checkStatus).not.toBeNull(); - }); - -}); \ No newline at end of file diff --git a/tests/e2e-playwright/specs/02_validate-webm-completed.spec.js b/tests/e2e-playwright/specs/02_validate-webm-completed.spec.js new file mode 100644 index 00000000..1da4d0b7 --- /dev/null +++ b/tests/e2e-playwright/specs/02_validate-webm-completed.spec.js @@ -0,0 +1,74 @@ +/** +* WordPress dependencies +*/ +const { test, expect } = require('@wordpress/e2e-test-utils-playwright'); +const { setTimeout } = require('timers'); +const { TransCodeStatus } = require("../utils/locator.js"); + +test.describe('Validate Webm File upload Asssert All Status', () => { + test.beforeEach(async ({ admin }) => { + await admin.visitAdminPage("media-new.php"); + }); + test('Check webm sample and verify All Steps', async ({ admin, page, editor }) => { + //Upload The File + const webmPath = "assets/webm-sample.webm"; + const [fileChooser] = await Promise.all([ + // It is important to call waitForEvent before click to set up waiting. + page.waitForEvent('filechooser'), + // Opens the file chooser. + page.locator('#plupload-browse-button').click(), + + ]) + await fileChooser.setFiles([ + webmPath, + ]) + const item = await page.locator("#wpbody-content > div.wrap > h1"); + await expect(item).toBeVisible(); + const copyButton = "button[class='button button-small copy-attachment-url']"; + if (await page.locator(copyButton).isEnabled()) { + await page.click(copyButton) + } + // Goto Media and Check for Check status Button visibility + await admin.visitAdminPage("upload.php"); + //Select Grid Type + await page.locator("a[id='view-switch-list']").click(); + const checkStatus = page.locator("button[id^='btn_check_status']").first(); + expect(checkStatus).not.toBeNull(); + await checkStatus.click(); + const checkMessage = page.locator("div[id*='span_status']").first(); + expect(checkMessage).not.toBeNull(); + + // Check For Transcoding status and wait until File is getting transcoded + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + var result = await tweets.evaluate(node => node.innerText); + // Declaring Variables so that Loops Will break after certain period of time + var _hasTimeElasped = false; + setTimeout(() => { + _hasTimeElasped = true; + console.log("Time Elapsed") + }, 90000) + // Loop To Assert Updated Messages + while (result == TransCodeStatus.Processing || result == TransCodeStatus.Queue || TransCodeStatus.ServerReady) { + // Loop Breaker After Timeout + if (_hasTimeElasped) { + break; + } + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + result = await tweets.evaluate(node => node.innerText); + console.log("Inside Loop:", result); + if (result == TransCodeStatus.Completed || result == TransCodeStatus.Error) { + break; + } + + } + // Final Assertion after completion. + const comPleteMessage = page.locator("div[id*='span_status']"); + expect(await comPleteMessage.evaluate(node => node.innerText)).toContain('Your file is transcoded successfully.'); + }); +}); \ No newline at end of file diff --git a/tests/e2e-playwright/specs/03_validate-3gp-completed.spec.js b/tests/e2e-playwright/specs/03_validate-3gp-completed.spec.js new file mode 100644 index 00000000..8b1de387 --- /dev/null +++ b/tests/e2e-playwright/specs/03_validate-3gp-completed.spec.js @@ -0,0 +1,76 @@ +/** +* WordPress dependencies +*/ +const { test, expect } = require('@wordpress/e2e-test-utils-playwright'); +const { setTimeout } = require('timers'); +const { TransCodeStatus } = require("../utils/locator.js"); +test.describe('Validate 3gp File Upload and assert All transcoded Status', () => { + test.beforeEach(async ({ admin }) => { + await admin.visitAdminPage("media-new.php"); + }); + test('Check 3gp sample and verify all Transcoder processing Steps', async ({ admin, page, editor }) => { + // Upload Video + const videoPath = "assets/3gp-sample.3gp"; + const [fileChooser] = await Promise.all([ + // It is important to call waitForEvent before click to set up waiting. + page.waitForEvent('filechooser'), + // Opens the file chooser. + page.locator('#plupload-browse-button').click(), + + ]) + await fileChooser.setFiles([ + videoPath, + ]) + // Check Upload is completed + const item = await page.locator("#wpbody-content > div.wrap > h1"); + await expect(item).toBeVisible(); + + // Check Copy to clipboard is working + const copyButton = "button[class='button button-small copy-attachment-url']"; + if (await page.locator(copyButton).isEnabled()) { + await page.click(copyButton) + } + // Goto Media and Check for Check status Button visibility + await admin.visitAdminPage("upload.php"); + //Select Grid Type + await page.locator("a[id='view-switch-list']").click(); + const checkStatus = page.locator("button[id^='btn_check_status']").first(); + expect(checkStatus).not.toBeNull(); + await checkStatus.click(); + const checkMessage = page.locator("div[id*='span_status']").first(); + expect(checkMessage).not.toBeNull(); + + // Check For Transcoding status and wait until File is getting transcoded + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + var result = await tweets.evaluate(node => node.innerText); + var _hasTimeElasped = false; + setTimeout(() => { + _hasTimeElasped = true; + console.log("Time Elapsed") + }, 90000) + // Loop To Assert Updated Messages + while (result == TransCodeStatus.Processing || result == TransCodeStatus.Queue || TransCodeStatus.ServerReady) { + // Loop Breaker After Timeout + if (_hasTimeElasped) { + break; + } + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + result = await tweets.evaluate(node => node.innerText); + console.log("Inside Loop:", result); + if (result == TransCodeStatus.Completed || result == TransCodeStatus.Error) { + break; + } + } + // Final Assertion after completion. + const comPleteMessage = page.locator("div[id*='span_status']"); + expect(await comPleteMessage.evaluate(node => node.innerText)).toContain('Your file is transcoded successfully.'); + await page.reload(); + await expect(checkStatus).toBeHidden(); + }); +}); \ No newline at end of file diff --git a/tests/e2e-playwright/specs/04_validate-3g2-error.spec.js b/tests/e2e-playwright/specs/04_validate-3g2-error.spec.js new file mode 100644 index 00000000..db093bd4 --- /dev/null +++ b/tests/e2e-playwright/specs/04_validate-3g2-error.spec.js @@ -0,0 +1,76 @@ +/** +* WordPress dependencies +*/ +const { test, expect } = require('@wordpress/e2e-test-utils-playwright'); +const { setTimeout } = require('timers'); +const { TransCodeStatus } = require("../utils/locator.js"); +test.describe('Validate 3g2 Media types and error message', () => { + test.beforeEach(async ({ admin }) => { + await admin.visitAdminPage("media-new.php"); + }); + test('Check 3g2 sample and verify Error Message', async ({ admin, page, editor }) => { + //Upload File + const videoPath = "assets/3g2-sample.3g2"; + const [fileChooser] = await Promise.all([ + // It is important to call waitForEvent before click to set up waiting. + page.waitForEvent('filechooser'), + // Opens the file chooser. + page.locator('#plupload-browse-button').click(), + + ]) + await fileChooser.setFiles([ + videoPath, + ]) + const item = await page.locator("#wpbody-content > div.wrap > h1"); + await expect(item).toBeVisible(); + //page.focus("button[class='button button-small copy-attachment-url']") + const copyButton = "button[class='button button-small copy-attachment-url']"; + if (await page.locator(copyButton).isEnabled()) { + await page.click(copyButton) + } + // Goto Media And check status + await admin.visitAdminPage("upload.php"); + //Select Grid + await page.locator("a[id='view-switch-list']").click(); + const checkStatus = page.locator("button[id^='btn_check_status']").first(); + expect(checkStatus).not.toBeNull(); + await checkStatus.click(); + const checkMessage = page.locator("div[id*='span_status']").first(); + expect(checkMessage).not.toBeNull(); + + // Check updated transcoder Status + await checkStatus.click(); + // await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + var result = await tweets.evaluate(node => node.innerText); + var _hasTimeElasped = false; + setTimeout(() => { + _hasTimeElasped = true; + console.log("Time Elapsed") + }, 30000) + // Loop To Assert Updated Messages + while (result == TransCodeStatus.Processing || result == TransCodeStatus.Queue || TransCodeStatus.ServerReady) { + // Loop Breaker After Timeout + if (_hasTimeElasped) { + break; + } + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + result = await tweets.evaluate(node => node.innerText); + console.log("Inside Loop:", result); + if (result == TransCodeStatus.Error) { + break; + } + } + const comPleteMessage = page.locator("div[id*='span_status']"); + expect(await comPleteMessage.evaluate(node => node.innerText)).toContain('Transcoder failed to transcode this file.'); + // Delete The media to Execute the next Test cases + await page.locator("role=link[name='“3g2-sample” (Edit)']").first().hover(); + page.on('dialog', dialog => dialog.accept()); + await page.locator("role=button[name='Delete “3g2-sample” permanently']").click(); + await expect(checkStatus).toBeHidden(); + }); +}); \ No newline at end of file diff --git a/tests/e2e-playwright/specs/04_validate-transcoder-frontend.spec.js b/tests/e2e-playwright/specs/04_validate-transcoder-frontend.spec.js deleted file mode 100644 index e534bf64..00000000 --- a/tests/e2e-playwright/specs/04_validate-transcoder-frontend.spec.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * WordPress dependencies - */ -const { test, expect } = require('@wordpress/e2e-test-utils-playwright'); -const SITE_URL = 'https://alvi-tazwar.rt.gw/activity/'; -test.describe('Validate Transcoder Settings', () => { - test.beforeEach(async ({ admin }) => { - await admin.visitAdminPage('/'); - - }); - test('Check Transcoder settings In frontend', async ({ admin, page, editor }) => { - - await page.goto(SITE_URL, {waitUntil:'load'}); - await page.locator("#whats-new").click(); - //Upload - const videoPath = "assets/3gp-sample.3gp"; - const [fileChooser] = await Promise.all([ - // It is important to call waitForEvent before click to set up waiting. - page.waitForEvent('filechooser'), - // Opens the file chooser. - page.locator('#rtmedia-add-media-button-post-update').click(), - - ]) - await fileChooser.setFiles([ - videoPath, - ]) - const item = await page.locator("#aw-whats-new-submit"); - await expect(item).toBeVisible(); - await item.click(); - // Wait for upload - if (page.locator("div.activity-content").first().isEnabled()) - { - await page.locator("div.rtmedia-item-title a").first().click() - } - const checkStatus = page.locator("button[id*='btn_check_status']"); - expect(checkStatus).not.toBeNull(); - - }); -}); \ No newline at end of file diff --git a/tests/e2e-playwright/specs/05_validate-other-file-status.spec.js b/tests/e2e-playwright/specs/05_validate-other-file-status.spec.js new file mode 100644 index 00000000..c8973b25 --- /dev/null +++ b/tests/e2e-playwright/specs/05_validate-other-file-status.spec.js @@ -0,0 +1,244 @@ +/** +* WordPress dependencies +*/ +const { test, expect } = require('@wordpress/e2e-test-utils-playwright'); +const { setTimeout } = require('timers'); +const { TransCodeStatus } = require("../utils/locator.js"); +test.describe('Validate mp3 and mp4 ogg, PDF types and Assert All Steps', () => { + test.beforeEach(async ({ admin }) => { + await admin.visitAdminPage("media-new.php"); + }); + + test('Check ogg sample', async ({ admin, page, editor }) => { + const oggPath = "assets/ogg-sample.ogg"; + const [fileChooser] = await Promise.all([ + // It is important to call waitForEvent before click to set up waiting. + page.waitForEvent('filechooser'), + // Opens the file chooser. + page.locator('#plupload-browse-button').click(), + ]) + await fileChooser.setFiles([ + oggPath, + ]) + const item = await page.locator("#wpbody-content > div.wrap > h1"); + await expect(item).toBeVisible(); + //page.focus("button[class='button button-small copy-attachment-url']") + const copyButton = "button[class='button button-small copy-attachment-url']"; + if (await page.locator(copyButton).isEnabled()) { + await page.click(copyButton) + } + // Goto Media and Check for Check status Button visibility + await admin.visitAdminPage("upload.php"); + //Select Grid Type + await page.locator("a[id='view-switch-list']").click(); + const checkStatus = page.locator("button[id^='btn_check_status']").first(); + expect(checkStatus).not.toBeNull(); + await checkStatus.click(); + const checkMessage = page.locator("div[id*='span_status']").first(); + expect(checkMessage).not.toBeNull(); + + // Check For Transcoding status and wait until File is getting transcoded + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + var result = await tweets.evaluate(node => node.innerText); + var _hasTimeElasped = false; + setTimeout(() => { + _hasTimeElasped = true; + console.log("Time Elapsed") + }, 60000) + // Loop To Assert Updated Messages + while (result === TransCodeStatus.Processing || TransCodeStatus.Queue || TransCodeStatus.ServerReady) { + // Loop Breaker After Timeout + if (_hasTimeElasped) { + break; + } + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + result = await tweets.evaluate(node => node.innerText); + console.log("Inside Loop: \n", result); + if (result == TransCodeStatus.Processed) { + break; + } + } + // Final Assertion after completion. + const comPleteMessage = page.locator("div[id*='span_status']"); + expect(await comPleteMessage.evaluate(node => node.innerText)).toContain('processed'); + // Delete The media to Execute the next Test cases + await page.locator("role=link[name='“ogg-sample” (Edit)']").first().hover(); + page.on('dialog', dialog => dialog.accept()); + await page.locator("role=button[name='Delete “ogg-sample” permanently']").first().click(); + await expect(checkStatus).toBeHidden(); + }); + + test('Check mp3 sample', async ({ admin, page, editor }) => { + const mp3Path = "assets/mp3-sample.mp3"; + const [fileChooser] = await Promise.all([ + // It is important to call waitForEvent before click to set up waiting. + page.waitForEvent('filechooser'), + // Opens the file chooser. + page.locator('#plupload-browse-button').click(), + ]) + await fileChooser.setFiles([ + mp3Path, + ]) + const item = await page.locator("#wpbody-content > div.wrap > h1"); + await expect(item).toBeVisible(); + //page.focus("button[class='button button-small copy-attachment-url']") + const copyButton = "button[class='button button-small copy-attachment-url']"; + if (await page.locator(copyButton).isEnabled()) { + await page.click(copyButton) + } + // Goto Media and Check for Check status Button visibility + await admin.visitAdminPage("upload.php"); + //Select Grid Type + await page.locator("a[id='view-switch-list']").click(); + const checkStatus = page.locator("button[id^='btn_check_status']").first(); + expect(checkStatus).not.toBeNull(); + + // Check File is already transcoded + const checkMessage = page.locator("div[id*='span_status']").first(); + expect(checkMessage).not.toBeNull(); + // Delete The media to Execute the next Test cases + await page.locator("role=link[name='“Impact Moderato” (Edit)']").first().hover(); + page.on('dialog', dialog => dialog.accept()); + await page.locator("role=button[name='Delete “Impact Moderato” permanently']").first().click(); + }); + + test('Check mp4 sample', async ({ admin, page, editor }) => { + const mp4Path = "assets/mp4-sample.mp4"; + const [fileChooser] = await Promise.all([ + // It is important to call waitForEvent before click to set up waiting. + page.waitForEvent('filechooser'), + // Opens the file chooser. + page.locator('#plupload-browse-button').click(), + ]) + await fileChooser.setFiles([ + mp4Path, + ]) + // Check Upload is completed + const item = await page.locator("#wpbody-content > div.wrap > h1"); + await expect(item).toBeVisible(); + + // Check Copy to clipboard is working + const copyButton = "button[class='button button-small copy-attachment-url']"; + if (await page.locator(copyButton).isEnabled()) { + await page.click(copyButton) + } + // Goto Media and Check for Check status Button visibility + await admin.visitAdminPage("upload.php"); + //Select Grid Type + await page.locator("a[id='view-switch-list']").click(); + const checkStatus = page.locator("button[id^='btn_check_status']").first(); + expect(checkStatus).not.toBeNull(); + await checkStatus.click(); + const checkMessage = page.locator("div[id*='span_status']").first(); + expect(checkMessage).not.toBeNull(); + + // Check For Transcoding status and wait until File is getting transcoded + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + var result = await tweets.evaluate(node => node.innerText); + var _hasTimeElasped = false; + setTimeout(() => { + _hasTimeElasped = true; + console.log("Time Elapsed") + }, 30000) + // Loop To Assert Updated Messages + while (result == TransCodeStatus.Processing || result == TransCodeStatus.Queue || TransCodeStatus.ServerReady) { + // Loop Breaker After Timeout + if (_hasTimeElasped) { + break; + } + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + result = await tweets.evaluate(node => node.innerText); + console.log("Inside Loop:", result); + if (result == TransCodeStatus.Processed || result == TransCodeStatus.Error) { + break; + } + } + // Final Assertion after completion. + const comPleteMessage = page.locator("div[id*='span_status']"); + expect(await comPleteMessage.evaluate(node => node.innerText)).toContain('processed'); + //Delete The media to Execute the next Test cases + await page.locator("role=link[name='“mp4-sample” (Edit)']").first().hover(); + page.on('dialog', dialog => dialog.accept()); + await page.locator("role=button[name='Delete “mp4-sample” permanently']").first().click(); + await expect(checkStatus).toBeHidden(); + + }); + test('Check pdf sample', async ({ admin, page, editor }) => { + const pdfPath = "assets/pdf-sample.pdf"; + const [fileChooser] = await Promise.all([ + // It is important to call waitForEvent before click to set up waiting. + page.waitForEvent('filechooser'), + // Opens the file chooser. + page.locator('#plupload-browse-button').click(), + ]) + await fileChooser.setFiles([ + pdfPath, + ]) + // Check Upload is completed + const item = await page.locator("#wpbody-content > div.wrap > h1"); + await expect(item).toBeVisible(); + + // Check Copy to clipboard is working + const copyButton = "button[class='button button-small copy-attachment-url']"; + if (await page.locator(copyButton).isEnabled()) { + await page.click(copyButton) + } + // Goto Media and Check for Check status Button visibility + await admin.visitAdminPage("upload.php"); + //Select Grid Type + await page.locator("a[id='view-switch-list']").click(); + const checkStatus = page.locator("button[id^='btn_check_status']").first(); + expect(checkStatus).not.toBeNull(); + await checkStatus.click(); + const checkMessage = page.locator("div[id*='span_status']").first(); + expect(checkMessage).not.toBeNull(); + + // Check For Transcoding status and wait until File is getting transcoded + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + var result = await tweets.evaluate(node => node.innerText); + var _hasTimeElasped = false; + setTimeout(() => { + _hasTimeElasped = true; + console.log("Time Elapsed") + }, 10000) + // Loop To Assert Updated Messages + while (result == TransCodeStatus.Processing || result == TransCodeStatus.Queue || TransCodeStatus.ServerReady) { + // Loop Breaker After Timeout + if (_hasTimeElasped) { + break; + } + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + result = await tweets.evaluate(node => node.innerText); + console.log("Inside Loop:", result); + if (result == TransCodeStatus.Completed || result == TransCodeStatus.Processed || result == TransCodeStatus.Error) { + break; + } + } + // Final Assertion after completion. + const comPleteMessage = page.locator("div[id*='span_status']"); + expect(await comPleteMessage.evaluate(node => node.innerText)).toContain('Your file is transcoded successfully. Please refresh the page.'); + // Delete The media to Execute the next Test cases + await page.locator("role=link[name='“pdf-sample” (Edit)']").first().hover(); + page.on('dialog', dialog => dialog.accept()); + await page.locator("role=button[name='Delete “pdf-sample” permanently']").first().click(); + + }); +}); \ No newline at end of file diff --git a/tests/e2e-playwright/specs/06_validate-thumbnail.spec.js b/tests/e2e-playwright/specs/06_validate-thumbnail.spec.js new file mode 100644 index 00000000..6bd95b66 --- /dev/null +++ b/tests/e2e-playwright/specs/06_validate-thumbnail.spec.js @@ -0,0 +1,91 @@ +/** +* WordPress dependencies +*/ +const { test, expect } = require('@wordpress/e2e-test-utils-playwright'); +const { TransCodeStatus } = require("../utils/locator.js"); +test.describe('Thumbnail Scenarios', () => { + test.beforeEach(async ({ admin }) => { + await admin.visitAdminPage("media-new.php"); + }); + test('Check Thumbnail is generated after transcoding', async ({ admin, page, editor }) => { + + const videoPath = "assets/3gp-sample.3gp"; + const [fileChooser] = await Promise.all([ + // It is important to call waitForEvent before click to set up waiting. + page.waitForEvent('filechooser'), + // Opens the file chooser. + page.locator('#plupload-browse-button').click(), + + ]) + await fileChooser.setFiles([ + videoPath, + ]) + // Check Upload is completed + const item = await page.locator("#wpbody-content > div.wrap > h1"); + await expect(item).toBeVisible(); + + // Check Copy to clipboard is working + const copyButton = "button[class='button button-small copy-attachment-url']"; + if (await page.locator(copyButton).isEnabled()) { + await page.click(copyButton) + } + // Goto Media and Check for Check status Button visibility + await admin.visitAdminPage("upload.php"); + //Select Grid Type + await page.locator("a[id='view-switch-list']").click(); + const checkStatus = page.locator("button[id^='btn_check_status']").first(); + expect(checkStatus).not.toBeNull(); + await checkStatus.click(); + const checkMessage = page.locator("div[id*='span_status']").first(); + expect(checkMessage).not.toBeNull(); + + // Check For Transcoding status and wait until File is getting transcoded + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + var result = await tweets.evaluate(node => node.innerText); + var _hasTimeElasped = false; + setTimeout(() => { + _hasTimeElasped = true; + console.log("Time Elapsed") + }, 90000) + // Loop To Assert Updated Messages + while (result == TransCodeStatus.Processing || result == TransCodeStatus.Queue || TransCodeStatus.ServerReady) { + // Loop Breaker After Timeout + if (_hasTimeElasped) { + break; + } + await checkStatus.click(); + await page.focus("div[id*='span_status']") + await page.waitForSelector("div[id*='span_status']"); + const tweets = page.locator("div[id*='span_status']"); + result = await tweets.evaluate(node => node.innerText); + console.log("Inside Loop:", result); + if (result == TransCodeStatus.Completed || result == TransCodeStatus.Error) { + break; + } + } + // Goto Uploaded media edit + await page.locator("td.title.column-title.has-row-actions.column-primary ").first().hover(); + await page.locator("td.title.column-title.has-row-actions.column-primary > div > span.edit").first().click(); + // Wait for New page to load + await page.waitForSelector("#title"); + await page.waitForSelector("#attachment_caption"); + await expect(page).toHaveURL(/action=edit/) + // Get Dom Element Length with function + const VerifyLength = await page.evaluate(selector => document.querySelectorAll("input[id^='rtmedia-upload-select-thumbnail-']").length); + // Verify thumbnail + await expect(page.locator("input[id^='rtmedia-upload-select-thumbnail-']")).toHaveCount(VerifyLength); + + // Changing the thumbnail + await page.locator("input[id^='rtmedia-upload-select-thumbnail-4']").check(); + // Click update and save + await page.locator("#publish").click(); + // verify assertion + await expect(page.locator("#message")).toContainText(/Media file updated./); + // Delete media After testing + page.on('dialog', dialog => dialog.accept()); + await page.locator("#delete-action > a").click(); + }); +}); \ No newline at end of file diff --git a/tests/e2e-playwright/specs/03_validate-retranscoded-media.spec.js b/tests/e2e-playwright/specs/07_validate-retranscoded-media.spec.js similarity index 76% rename from tests/e2e-playwright/specs/03_validate-retranscoded-media.spec.js rename to tests/e2e-playwright/specs/07_validate-retranscoded-media.spec.js index ad23e84d..de531422 100644 --- a/tests/e2e-playwright/specs/03_validate-retranscoded-media.spec.js +++ b/tests/e2e-playwright/specs/07_validate-retranscoded-media.spec.js @@ -7,30 +7,6 @@ test.describe('Validate ReTranscoded Settings', () => { test.beforeEach(async ({ admin }) => { await admin.visitAdminPage('/'); }); - test('Validate All ReTranscoded Options', async ({ admin, page, editor }) => { - await page.locator("#toplevel_page_rt-transcoder > a > div.wp-menu-name").click(); - // Check Lisence key Settings - const licenseSettings = page.locator("input[id='new-api-key']") - expect(licenseSettings).not.toBeNull(); - await page.locator("role=link[name='Retranscode Media']").click(); - // Check Retranscode Media - await page.locator("role=button[name='Retranscode All Media']").click(); - // Validate - const result = await page.locator("div[id='retranscodemedia-bar-percent']").innerText(); - if (result == '100%' && page.locator("div[id='retranscodemedia-bar-percent']").isEnabled()) { - await page.locator("#toplevel_page_rt-transcoder > a > div.wp-menu-name").click() - } - }); - test('Validate Single ReTranscoded media Options', async ({ admin, page, editor }) => { - await page.locator("#toplevel_page_rt-transcoder > a > div.wp-menu-name").click(); - // Check Lisence key Settings - const licenseSettings = page.locator("input[id='new-api-key']") - expect(licenseSettings).not.toBeNull(); - await admin.visitAdminPage("upload.php"); - //Select Grid and verify assertion - await page.locator("a[id='view-switch-list']").click(); - await page.locator("td[class='title column-title has-row-actions column-primary']").first().hover(); - }); test('Validate new retranscoded Settings', async ({ admin, page, editor }) => { await admin.visitAdminPage("media-new.php") const pdfPath = "assets/pdf-sample.pdf"; @@ -45,7 +21,6 @@ test.describe('Validate ReTranscoded Settings', () => { ]) const item = await page.locator("#wpbody-content > div.wrap > h1"); await expect(item).toBeVisible(); - //page.focus("button[class='button button-small copy-attachment-url']") const copyButton = "button[class='button button-small copy-attachment-url']"; if (await page.locator(copyButton).isEnabled()) { await page.click(copyButton) @@ -58,10 +33,27 @@ test.describe('Validate ReTranscoded Settings', () => { // Retranscode await page.locator("td.title.column-title.has-row-actions.column-primary > strong > a").first().hover(); await page.locator("a[title='Retranscode this single media']").first().click(); - // Validate + // Validate with proper visiblity const result = await page.locator("div[id='retranscodemedia-bar-percent']").innerText(); if (result == '100%' && page.locator("div[id='retranscodemedia-bar-percent']").isEnabled()) { await page.locator("#toplevel_page_rt-transcoder > a > div.wp-menu-name").click() } }); + + test('Validate All ReTranscoded Options', async ({ admin, page, editor }) => { + await page.locator("#toplevel_page_rt-transcoder > a > div.wp-menu-name").click(); + // Check Lisence key Settings Added to stable the test case and for auto timeout + const licenseSettings = page.locator("input[id='new-api-key']") + expect(licenseSettings).not.toBeNull(); + await page.locator("role=link[name='Retranscode Media']").click(); + + // Goto Retranscode Media + await page.locator("role=button[name='Retranscode All Media']").click(); + // Validate Retranscoded media to in menu page. + const result = await page.locator("div[id='retranscodemedia-bar-percent']").innerText(); + if (result == '100%' && page.locator("div[id='retranscodemedia-bar-percent']").isEnabled()) { + await page.locator("#toplevel_page_rt-transcoder > a > div.wp-menu-name").click() + } + }); + }); \ No newline at end of file diff --git a/tests/e2e-playwright/specs/08_validate-transcoder-frontend.spec.js b/tests/e2e-playwright/specs/08_validate-transcoder-frontend.spec.js new file mode 100644 index 00000000..adfae2fa --- /dev/null +++ b/tests/e2e-playwright/specs/08_validate-transcoder-frontend.spec.js @@ -0,0 +1,78 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require('@wordpress/e2e-test-utils-playwright'); +const SITE_URL = 'https://transcoder-test.rt.gw/activity'; //'http://transcoder.com/activity/'; +const Media_URL = 'https://transcoder-test.rt.gw/members/automation/media/' +test.describe('Validate Transcoder In frontend', () => { + test.beforeEach(async ({ admin }) => { + await admin.visitAdminPage('/'); + + }); + test('Check Transcoder settings In Activity', async ({ admin, page, editor }) => { + await page.goto(SITE_URL, { waitUntil: 'load' }); + await page.locator("#whats-new").click(); + //Upload + const videoPath = "assets/3gp-sample.3gp"; + const [fileChooser] = await Promise.all([ + // It is important to call waitForEvent before click to set up waiting. + page.waitForEvent('filechooser'), + // Opens the file chooser. + page.locator('#rtmedia-add-media-button-post-update').click(), + + ]) + await fileChooser.setFiles([ + videoPath, + ]) + const item = await page.locator("#aw-whats-new-submit"); + await expect(item).toBeVisible(); + await item.click(); + // Wait for upload + if (page.locator("div.activity-content").first().isEnabled()) { + await page.locator("div.rtmedia-item-title a").first().click() + } + const checkStatus = page.locator("button[id*='btn_check_status']"); + expect(checkStatus).not.toBeNull(); + }); + + test('Check Transcoder settings In Media Page', async ({ page }) => { + // Goto Media Page + await page.goto(Media_URL, { waitUntil: 'load' }); + // Wait for NavBar to stable the page. + await page.waitForSelector("#object-nav"); + // Click Upload Button for opening up upload panel + await page.locator("#rtm_show_upload_ui").click(); + + //Upload + const videoPath = "assets/mp4-sample.mp4"; + const [fileChooser] = await Promise.all([ + // It is important to call waitForEvent before click to set up waiting. + page.waitForEvent('filechooser'), + // Opens the file chooser. + page.locator('#rtMedia-upload-button').click(), + + ]) + await fileChooser.setFiles([ + videoPath, + ]) + const item = await page.locator("[class='start-media-upload']"); + await expect(item).toBeVisible(); + await item.click(); + // Wait for upload and verify Upload is completed + if (page.locator("[class='rtmedia-item-thumbnail']").first().isEnabled()) { + await page.locator("[class='rtmedia-item-thumbnail']").first().click() + } + // Verify Dom content is present and check for element is not empty. + const checkStatus = page.locator("button[id*='btn_check_status']"); + expect(checkStatus).not.toBeNull(); + // Check Status + if (page.locator("button[id*='btn_check_status']").isVisible()) { + console.log("Transcoding is in Progress") + } + else if (page.locator("button[id*='btn_check_status']").isHidden()) { + console.log("Transcoding Complete") + } + }); + + +}); \ No newline at end of file diff --git a/tests/e2e-playwright/specs/09_clean-up-tests.spec.js b/tests/e2e-playwright/specs/09_clean-up-tests.spec.js new file mode 100644 index 00000000..5b6255a3 --- /dev/null +++ b/tests/e2e-playwright/specs/09_clean-up-tests.spec.js @@ -0,0 +1,19 @@ +/** +* WordPress dependencies +*/ +const { test } = require('@wordpress/e2e-test-utils-playwright'); + +test.describe('Clear All data after testing', () => { + test.beforeEach(async ({ admin }) => { + await admin.visitAdminPage("upload.php"); + }); + test('Clear All Media after Testing', async ({ page }) => { + //Select All Media + await page.locator("#cb-select-all-1").check(); + // Select Bulk Delete Option + await page.locator("#bulk-action-selector-top").selectOption("delete"); + // Click Apply + page.on('dialog', dialog => dialog.accept()); + await page.locator("#doaction").click(); + }); +}); \ No newline at end of file diff --git a/tests/e2e-playwright/uploads/uploads.png b/tests/e2e-playwright/uploads/uploads.png new file mode 100644 index 00000000..4218f609 Binary files /dev/null and b/tests/e2e-playwright/uploads/uploads.png differ diff --git a/tests/e2e-playwright/utils/locator.js b/tests/e2e-playwright/utils/locator.js index 2a8c5b2a..b86fc69c 100644 --- a/tests/e2e-playwright/utils/locator.js +++ b/tests/e2e-playwright/utils/locator.js @@ -1,38 +1,15 @@ -const Placement = { - Top: "input[value='top']", - Bottom: "input[value='bottom']", -}; - -const ButtonStyle ={ - Vertical: "input[id='display_vertical_input']", - Horizontal: "input[id='display_horizontal_input']", - Icon: "input[id='display_icon_input']", - IconCount: "input[id='display_icon_count_input']" -} - -const Alignment ={ - Left: "input[id='align_left_check']", - Center: "input[id='align_center_check']", - Right: "input[id='align_right_check']", - None:"input[id='align_none_check']" -} - -const SaveSetting ={ - Button:"role=button[name='Save Changes'i]", - Message:"#setting-error-settings_updated", -} - -const PlacementValidation ={ - Top:"div[class='rtsocial-container rtsocial-container-align-center rtsocial-vertical']", - Bottom:"div[class='rtsocial-container rtsocial-container-align-center rtsocial-vertical']", - ButtonHorizontal:"div[class='rtsocial-container rtsocial-container-align-center rtsocial-horizontal']", - Icon:"div[class='rtsocial-container rtsocial-container-align-center rtsocial-icon']", - IconCount:"div[class='rtsocial-container rtsocial-container-align-center rtsocial-icon-count']", - LeftAligned:"div[class='rtsocial-container rtsocial-container-align-left rtsocial-icon-count']", - RightAligned:"div[class='rtsocial-container rtsocial-container-align-right rtsocial-icon-count']", +const TransCodeStatus ={ + Processing: 'Your file is getting transcoded.Please refresh after some time.', + Processed: 'processed', + Queue: 'This file is still in the queue. Please refresh after some time.', + ServerReady: 'Your server should be ready to receive the transcoded file.', + Completed: 'Your file is transcoded successfully. Please refresh the page.', + Error: 'Unfortunately, Transcoder failed to transcode this file.', + NotNull: 'Your', + EmptyMedia:'Unab' } -module.exports = { Placement, ButtonStyle, Alignment, SaveSetting,PlacementValidation }; \ No newline at end of file +module.exports = { TransCodeStatus }; \ No newline at end of file