From de2342040abaa47757e46c3dd80595d8a2991aa7 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 01:18:44 +0200 Subject: [PATCH 01/28] Install needed packages & setup new e2e scripts --- package-lock.json | 1103 +++++++++++++++++++++++++++++++++++++++++++-- package.json | 9 +- 2 files changed, 1082 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 51a834184..47caa5443 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,8 +23,10 @@ "@wordpress/data": "^10.4.0", "@wordpress/date": "^5.4.0", "@wordpress/dom-ready": "^4.4.0", + "@wordpress/e2e-test-utils-playwright": "^1.5.0", "@wordpress/edit-post": "^8.4.0", "@wordpress/element": "^6.4.0", + "@wordpress/env": "^10.5.0", "@wordpress/eslint-plugin": "^20.1.0", "@wordpress/i18n": "^5.4.0", "@wordpress/notices": "^5.4.0", @@ -3468,6 +3470,21 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -4327,6 +4344,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -4712,6 +4741,18 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@tannin/compile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", @@ -5081,6 +5122,18 @@ "@types/node": "*" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -5192,6 +5245,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -5262,6 +5321,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -5366,6 +5434,15 @@ "@types/react": "*" } }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -7231,11 +7308,10 @@ } }, "node_modules/@wordpress/e2e-test-utils-playwright": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.4.0.tgz", - "integrity": "sha512-kp88FLUU1SJAtxlRF5jNWYYmOSmpVrVLXuLTZmmXDMp/FFd0vzNDKwZ7TV6fd0B58cxyUydaG6e+hxLMeSYQtw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.5.0.tgz", + "integrity": "sha512-gQuhdDMejum7a4hWW4ejIWSBv1xeeCFda5o7eq766evarU+HwcN+4GPiSYKj2iEHJ4dge1On2VXeg1RFLY3w5Q==", "dev": true, - "license": "GPL-2.0-or-later", "dependencies": { "change-case": "^4.1.2", "form-data": "^4.0.0", @@ -7385,6 +7461,149 @@ "npm": ">=8.19.2" } }, + "node_modules/@wordpress/env": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-10.5.0.tgz", + "integrity": "sha512-Hx+fi6qTEAuycznulkuMi4d5RDPZ6lPPAxaylpCwXNX2hgx5jrrpgnY4Zn0chBgZMpShO7BbA+zNDq2E6evvTw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "copy-dir": "^1.3.0", + "docker-compose": "^0.24.3", + "extract-zip": "^1.6.7", + "got": "^11.8.5", + "inquirer": "^7.1.0", + "js-yaml": "^3.13.1", + "ora": "^4.0.2", + "rimraf": "^3.0.2", + "simple-git": "^3.5.0", + "terminal-link": "^2.0.0", + "yargs": "^17.3.0" + }, + "bin": { + "wp-env": "bin/wp-env" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/env/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@wordpress/env/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wordpress/env/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@wordpress/env/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@wordpress/env/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@wordpress/env/node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/@wordpress/env/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wordpress/env/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/@wordpress/env/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@wordpress/env/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@wordpress/escape-html": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.4.0.tgz", @@ -10364,6 +10583,48 @@ "node": ">= 0.8" } }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -10548,6 +10809,12 @@ "node": ">=10" } }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "node_modules/check-node-version": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/check-node-version/-/check-node-version-4.2.1.tgz", @@ -10763,6 +11030,39 @@ "webpack": "*" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/client-zip": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.4.5.tgz", @@ -10797,6 +11097,15 @@ "node": ">=12" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-deep": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", @@ -10827,6 +11136,18 @@ "node": ">=0.10.0" } }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -11010,34 +11331,85 @@ "dev": true, "license": "MIT" }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, - "license": "BSD-2-Clause", + "engines": [ + "node >= 0.8" + ], "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, @@ -11110,6 +11482,12 @@ "dev": true, "license": "MIT" }, + "node_modules/copy-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/copy-dir/-/copy-dir-1.3.0.tgz", + "integrity": "sha512-Q4+qBFnN4bwGwvtXXzbp4P/4iNk0MaiGAzvQ8OiMtlLjkIKjmNN689uVzShSM0908q7GoFHXIPx4zi75ocoaHw==", + "dev": true + }, "node_modules/copy-webpack-plugin": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", @@ -11768,6 +12146,33 @@ "dev": true, "license": "MIT" }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -11883,6 +12288,27 @@ "node": ">= 10" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -12128,6 +12554,30 @@ "node": ">=6" } }, + "node_modules/docker-compose": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", + "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==", + "dev": true, + "dependencies": { + "yaml": "^2.2.2" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/docker-compose/node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -13677,6 +14127,32 @@ "dev": true, "license": "MIT" }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -13849,6 +14325,30 @@ "pend": "~1.2.0" } }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -14705,6 +15205,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -15103,6 +15628,12 @@ "entities": "^4.5.0" } }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -15199,6 +15730,31 @@ } } }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -15424,6 +15980,118 @@ "dev": true, "license": "MIT" }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -15793,6 +16461,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -19222,6 +19899,15 @@ "tslib": "^2.0.3" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/lru_map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", @@ -19656,6 +20342,15 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -19783,6 +20478,18 @@ "node": ">=0.10.0" } }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -19851,6 +20558,12 @@ "multicast-dns": "cli.js" } }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -20034,6 +20747,18 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/normalize-wheel": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", @@ -20575,6 +21300,178 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", + "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/ora/node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -20585,6 +21482,24 @@ "node": ">=0.10.0" } }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -22781,6 +23696,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "node_modules/resolve-bin": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/resolve-bin/-/resolve-bin-0.4.3.tgz", @@ -22838,6 +23759,31 @@ "node": ">=10" } }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -22959,6 +23905,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/run-con": { "version": "1.2.12", "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz", @@ -23768,6 +24723,21 @@ "dev": true, "license": "ISC" }, + "node_modules/simple-git": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.25.0.tgz", + "integrity": "sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw==", + "dev": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.5" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, "node_modules/simple-html-tokenizer": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz", @@ -25135,6 +26105,56 @@ "node": ">=6" } }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-link/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-link/node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/terser": { "version": "5.31.3", "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", @@ -25337,6 +26357,18 @@ "dev": true, "license": "MIT" }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -25665,6 +26697,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -26203,6 +27241,15 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/web-vitals": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.2.tgz", diff --git a/package.json b/package.json index 6c06bb5c0..2770b468e 100644 --- a/package.json +++ b/package.json @@ -23,10 +23,13 @@ "packages-update": "wp-scripts packages-update", "plugin-zip": "wp-scripts plugin-zip", "start": "wp-scripts start", - "test:e2e": "playwright test --config=playwright.config.js", + "pretest:e2e": "wp-env start", + "test:e2e": "wp-scripts test-playwright --config test/e2e/playwright.config.ts", + "test:e2e:debug": "wp-scripts test-playwright --config test/e2e/playwright.config.ts --ui", "test:unit:js": "wp-scripts test-unit-js --coverage --testResultsProcessor=jest-sonar-reporter", "pretest:unit:php": "wp-env start --xdebug", - "test:unit:php": "wp-env run tests-wordpress php -dxdebug.mode=coverage /var/www/html/wp-content/plugins/gatherpress/vendor/bin/phpunit -c /var/www/html/wp-content/plugins/gatherpress/phpunit.xml.dist --coverage-clover=coverage.xml --coverage-html=build/coverage-report" + "test:unit:php": "wp-env run tests-wordpress php -dxdebug.mode=coverage /var/www/html/wp-content/plugins/gatherpress/vendor/bin/phpunit -c /var/www/html/wp-content/plugins/gatherpress/phpunit.xml.dist --coverage-clover=coverage.xml --coverage-html=build/coverage-report", + "wp-env": "wp-env" }, "repository": { "type": "git", @@ -57,8 +60,10 @@ "@wordpress/data": "^10.4.0", "@wordpress/date": "^5.4.0", "@wordpress/dom-ready": "^4.4.0", + "@wordpress/e2e-test-utils-playwright": "^1.5.0", "@wordpress/edit-post": "^8.4.0", "@wordpress/element": "^6.4.0", + "@wordpress/env": "^10.5.0", "@wordpress/eslint-plugin": "^20.1.0", "@wordpress/i18n": "^5.4.0", "@wordpress/notices": "^5.4.0", From 493c9aac5bcbf6af14afccadd8db22b22ee915fd Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 01:20:00 +0200 Subject: [PATCH 02/28] REMOVE special port settings for wp-env (which may be a problem, I'm not seeing yet) --- .wp-env.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.wp-env.json b/.wp-env.json index 54dcdbdc0..44e384bfd 100644 --- a/.wp-env.json +++ b/.wp-env.json @@ -8,11 +8,5 @@ "mappings": { "wp-content/plugins": "./wp-core/plugins", "wp-content/themes": "./wp-core/themes" - }, - "port": 2003, - "env": { - "tests": { - "port": 2023 - } } } From c38da61be125a4b545660e19a9eaa33781aca09a Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 01:21:25 +0200 Subject: [PATCH 03/28] Add configuration files to run Playwright tests --- .gitignore | 1 + playwright.config.js | 83 --------------------------------- test/e2e/global-setup.ts | 49 ++++++++++++++++++++ test/e2e/playwright.config.ts | 86 +++++++++++++++++++++++++++++++++++ test/e2e/test-utils/index.ts | 8 ++++ test/e2e/test-utils/test.ts | 75 ++++++++++++++++++++++++++++++ tsconfig.json | 8 ++++ 7 files changed, 227 insertions(+), 83 deletions(-) delete mode 100644 playwright.config.js create mode 100644 test/e2e/global-setup.ts create mode 100644 test/e2e/playwright.config.ts create mode 100644 test/e2e/test-utils/index.ts create mode 100644 test/e2e/test-utils/test.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index f0e99a083..3b77b53f3 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ coverage.xml # Playwright # ########## +artifacts/ playwright-report/ test-results/ add-new-event.png diff --git a/playwright.config.js b/playwright.config.js deleted file mode 100644 index 64f78ef36..000000000 --- a/playwright.config.js +++ /dev/null @@ -1,83 +0,0 @@ -// @ts-check -const { defineConfig, devices } = require('@playwright/test'); - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -require('dotenv').config(); - -/** - * @see https://playwright.dev/docs/test-configuration - */ -module.exports = defineConfig({ - testDir: './test/e2e', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: 2, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - - timeout: 30000, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: 'https://develop.gatherpress.org/', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - video: 'on', - screenshot: 'on', - }, - - /* Configure projects for major browsers */ - projects: [ - // { - // name: "chromium", - // use: { ...devices["Desktop Chrome"] }, - // }, - - { - name: 'firefox', - use: { ...devices['Desktop Firefox'] }, - }, - - { - name: 'webkit', - use: { ...devices['Desktop Safari'] }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - { - name: 'Microsoft Edge', - use: { ...devices['Desktop Edge'], channel: 'msedge' }, - }, - { - name: 'Google Chrome', - use: { ...devices['Desktop Chrome'], channel: 'chrome' }, - }, - ], - - /* Run your local dev server before starting the tests */ - // webServer: { - // command: 'npm run start', - // url: 'http://127.0.0.1:3000', - // reuseExistingServer: !process.env.CI, - // }, -}); diff --git a/test/e2e/global-setup.ts b/test/e2e/global-setup.ts new file mode 100644 index 000000000..adbde4343 --- /dev/null +++ b/test/e2e/global-setup.ts @@ -0,0 +1,49 @@ +/** + * External dependencies + */ +const path = require( 'path' ); +import { request } from '@playwright/test'; + +/** + * WordPress dependencies + */ +import { RequestUtils } from '@wordpress/e2e-test-utils-playwright'; + +/** + * Internal dependencies + * + * @TODO: Would be nice to require() those constants directly from gutenberg, but they are not publicly exposed. + */ +// const { WP_BASE_URL, WP_USERNAME, WP_PASSWORD } = require( '@wordpress/e2e-test-utils-playwright/config' ); +import { WP_BASE_URL, WP_USERNAME, WP_PASSWORD, WP_AUTH_STORAGE } from '@test-utils'; + +const STORAGE_STATE_PATH = process.env.STORAGE_STATE_PATH || + path.join(process.cwd(), 'artifacts/storage-states/admin.json'); + +// To interact with the GatherPress plugin's settings page, we must be authenticated. +// Before any tests are run, we sign in, save the cookies set by WordPress, and then discard the session. +// Later, when we need to act as a logged-in user, we make those cookies available. +// https://playwright.dev/docs/test-global-setup-teardown#configure-globalsetup-and-globalteardown +export default async function globalSetup() { + const requestContext = await request.newContext({ + baseURL: WP_BASE_URL, + }); + const requestUtils = new RequestUtils(requestContext, { + // storageStatePath: WP_AUTH_STORAGE, + storageStatePath: STORAGE_STATE_PATH, + user: { + username: WP_USERNAME, + password: WP_PASSWORD, + }, + }); + + // Alternatively, we could take a more traditional route, + // filling in the input fields for the username and password and submitting the form. + // https://playwright.dev/docs/test-global-setup-teardown#example + + // Authenticate and save the storageState to disk. + await requestUtils.setupRest(); + + // + await requestContext.dispose(); +} \ No newline at end of file diff --git a/test/e2e/playwright.config.ts b/test/e2e/playwright.config.ts new file mode 100644 index 000000000..93a564667 --- /dev/null +++ b/test/e2e/playwright.config.ts @@ -0,0 +1,86 @@ +/** + * External dependencies + */ +import { defineConfig, devices } from '@playwright/test'; + +/** + * WordPress dependencies + * + * Playwright default configuration, that is used & provided by Gutenberg. + * https://github.com/WordPress/gutenberg/blob/trunk/packages/scripts/config/playwright.config.js + */ +// using Object Rest Spread operator magic +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax +// const { use, ...baseConfig} = require( '@wordpress/scripts/config/playwright.config' ); +const { ...baseConfig} = require( '@wordpress/scripts/config/playwright.config' ); + +// Remove storageState +// The default conf of Gutenberg has storageState set, which means "We are logged-in". +// To make sure our tests run the other way around, we remove this now, +// and re-set it on a project- or test-level. +// const { storageState, ...baseUse} = use; +// const newConf = { +// ...baseConfig, +// use: { ...baseUse }, +// } +// console.log(newConf); +// const WP_AUTH_STORAGE = '.auth/wordpress.json'; + +export default defineConfig({ + // ...newConf, + ...baseConfig, + + // This directory holds all the test files. + // https://playwright.dev/docs/api/class-testconfig#test-config-test-dir + // + // IDEA: Maybe this should be set to "../../src/" + // where the test files would be housed directly with their components, blocks, etc. + testDir: 'tests', + + // This is run before any tests. Check the file for more information. + globalSetup: 'global-setup.ts', + // use: { + // https://playwright.dev/docs/api/class-testoptions#test-options-storage-state + // storageState: WP_AUTH_STORAGE + // storageState: '' + // }, + // Configure projects for major browsers + // We can test on different or multiple browsers if needed. + // https://playwright.dev/docs/test-projects#configure-projects-for-multiple-browsers + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + + // { + // name: 'firefox', + // use: { ...devices['Desktop Firefox'] }, + // }, + + // { + // name: 'webkit', + // use: { ...devices['Desktop Safari'] }, + // }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], +}); \ No newline at end of file diff --git a/test/e2e/test-utils/index.ts b/test/e2e/test-utils/index.ts new file mode 100644 index 000000000..c68fcd887 --- /dev/null +++ b/test/e2e/test-utils/index.ts @@ -0,0 +1,8 @@ +export { + test, + expect, + WP_USERNAME, + WP_PASSWORD, + WP_BASE_URL, + WP_AUTH_STORAGE, +} from './test'; \ No newline at end of file diff --git a/test/e2e/test-utils/test.ts b/test/e2e/test-utils/test.ts new file mode 100644 index 000000000..3d88138cf --- /dev/null +++ b/test/e2e/test-utils/test.ts @@ -0,0 +1,75 @@ +import { test as base, expect } from '@playwright/test'; + +// We only require what's essential from the WordPress E2E test utils package. +import { + Admin, + Editor, + PageUtils, + RequestUtils, +} from '@wordpress/e2e-test-utils-playwright'; + + +/** + * WordPress dependencies + */ +// const { WP_BASE_URL, WP_USERNAME, WP_PASSWORD } = require( '@wordpress/e2e-test-utils-playwright/config' ); +const { + WP_USERNAME = 'admin', + WP_PASSWORD = 'password', + WP_BASE_URL = 'http://localhost:8889', + WP_AUTH_STORAGE = 'artifacts/auth.json', +} = process.env; + +// We could also import utils from other packages. +// import { StoreApiUtils } from '@woocommerce/e2e-utils'; + +// This is a project-specific util. +// import { WpGuestBar } from './wp-guest-bar'; + +// We are extending the functionalities of Playwright by adding and bootstrapping the custom utils. +// https://playwright.dev/docs/test-fixtures#creating-a-fixture +// +// We have a minimal setup compared to more involved ones. +// https://github.com/WordPress/gutenberg/blob/trunk/packages/e2e-test-utils-playwright/src/test.ts +// https://github.com/woocommerce/woocommerce-blocks/blob/trunk/tests/e2e/playwright-utils/test.ts +const test = base.extend<{ + admin: Admin; + editor: Editor; + pageUtils: PageUtils; + requestUtils: RequestUtils; + // wpGuestBar: WpGuestBar; +}>({ + async admin({ page, pageUtils, editor }, use) { + await use(new Admin({ page, pageUtils, editor })); + }, + async editor({ page }, use) { + await use(new Editor({ page })); + }, + async pageUtils({ page }, use) { + await use(new PageUtils({ page })); + }, + async requestUtils({}, use) { + // We want to make all REST API calls as authenticated users. + const requestUtils = await RequestUtils.setup({ + baseURL: WP_BASE_URL, + user: { + username: WP_USERNAME, + password: WP_PASSWORD, + }, + }); + + await use(requestUtils); + }, + // async wpGuestBar({ requestUtils }, use) { + // await use(new WpGuestBar(requestUtils)); + // }, +}); + +export { + test, + expect, + WP_USERNAME, + WP_PASSWORD, + WP_BASE_URL, + WP_AUTH_STORAGE, +}; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..f9491a04c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@test-utils": ["test/e2e/test-utils"] + } + } +} From 673e566cacdda68296a0b2b5d1b715c9b9edf55f Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 01:22:53 +0200 Subject: [PATCH 04/28] Update Github workflow to use wp-env for e2e tests --- .github/workflows/e2e-tests.yml | 85 +++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 31 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index a74b82020..a429fb7ab 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -1,39 +1,62 @@ name: E2E Tests + on: - push: - branches: - - main + workflow_dispatch: + pull_request: + +# Cancels all previous workflow runs for pull requests that have not completed. +concurrency: + # The concurrency group contains the workflow name and the branch name for pull requests + # or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + jobs: - playwright: - name: Playwright Tests - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Log debug information - run: | - npm --version - node --version - git --version - php --version - composer --version - - - name: Install NodeJS - uses: actions/setup-node@v2 - with: + e2e-tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + # matrix: + # node: ['14'] + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: node-version-file: '.nvmrc' + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Build plugin + run: | + npm run build + + - name: Install Playwright dependencies + run: | + npx playwright install chromium firefox webkit --with-deps - - name: NPM install - run: npm ci --legacy-peer-deps + - name: Starting the WordPress Environment + run: | + npm run env:start - - name: Playwright install - run: npx playwright install --with-deps + - name: Running the tests + env: + WP_AUTH_STORAGE: artifacts/storage-states/admin.json + WP_BASE_URL: http://localhost:8889 + WP_USERNAME: admin + WP_PASSWORD: password + run: | + npm run test:e2e - - name: Run Playwright - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - WP_ADMIN_PASSWORD: ${{ secrets.WP_ADMIN_PASSWORD }} - run: npm run test:e2e - if: ${{ success() || failure() }} + - name: Retain failed test results + uses: actions/upload-artifact@v3 + if: failure() + with: + name: test-results-matrix-less-debugging + path: test-results/ From e20f215d1a33111f4fe09b8e354b16d3f6de3fc0 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 01:25:06 +0200 Subject: [PATCH 05/28] Rename folder with tests (which is a bit weird, because the playwright.config.ts setting is ignored and the folder needs to be re-named to 'tests' to make tests be found at all) --- test/e2e/{admin-tests => tests}/gatherpress-admin-venue.spec.js | 0 test/e2e/{admin-tests => tests}/gatherpress-admin.spec.js | 0 .../e2e/{admin-tests => tests}/gatherpress-event-loggedIn.spec.js | 0 .../{admin-tests => tests}/gatherpress-event-nonLoggegIn.spec.js | 0 test/e2e/{admin-tests => tests}/gatherpress-event.spec.js | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename test/e2e/{admin-tests => tests}/gatherpress-admin-venue.spec.js (100%) rename test/e2e/{admin-tests => tests}/gatherpress-admin.spec.js (100%) rename test/e2e/{admin-tests => tests}/gatherpress-event-loggedIn.spec.js (100%) rename test/e2e/{admin-tests => tests}/gatherpress-event-nonLoggegIn.spec.js (100%) rename test/e2e/{admin-tests => tests}/gatherpress-event.spec.js (100%) diff --git a/test/e2e/admin-tests/gatherpress-admin-venue.spec.js b/test/e2e/tests/gatherpress-admin-venue.spec.js similarity index 100% rename from test/e2e/admin-tests/gatherpress-admin-venue.spec.js rename to test/e2e/tests/gatherpress-admin-venue.spec.js diff --git a/test/e2e/admin-tests/gatherpress-admin.spec.js b/test/e2e/tests/gatherpress-admin.spec.js similarity index 100% rename from test/e2e/admin-tests/gatherpress-admin.spec.js rename to test/e2e/tests/gatherpress-admin.spec.js diff --git a/test/e2e/admin-tests/gatherpress-event-loggedIn.spec.js b/test/e2e/tests/gatherpress-event-loggedIn.spec.js similarity index 100% rename from test/e2e/admin-tests/gatherpress-event-loggedIn.spec.js rename to test/e2e/tests/gatherpress-event-loggedIn.spec.js diff --git a/test/e2e/admin-tests/gatherpress-event-nonLoggegIn.spec.js b/test/e2e/tests/gatherpress-event-nonLoggegIn.spec.js similarity index 100% rename from test/e2e/admin-tests/gatherpress-event-nonLoggegIn.spec.js rename to test/e2e/tests/gatherpress-event-nonLoggegIn.spec.js diff --git a/test/e2e/admin-tests/gatherpress-event.spec.js b/test/e2e/tests/gatherpress-event.spec.js similarity index 100% rename from test/e2e/admin-tests/gatherpress-event.spec.js rename to test/e2e/tests/gatherpress-event.spec.js From 1ed3bd14fcbce6b4b8222ca1257b310f4aec892a Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 01:26:21 +0200 Subject: [PATCH 06/28] NEW (WIP) e2e-tests utilising the wordpress/e2e-test-utils-playwright package --- .../tests/gatherpress-admin-settings.spec.ts | 32 +++++++ .../tests/gatherpress-blocks-editor.spec.ts | 88 +++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 test/e2e/tests/gatherpress-admin-settings.spec.ts create mode 100644 test/e2e/tests/gatherpress-blocks-editor.spec.ts diff --git a/test/e2e/tests/gatherpress-admin-settings.spec.ts b/test/e2e/tests/gatherpress-admin-settings.spec.ts new file mode 100644 index 000000000..1cbc468c6 --- /dev/null +++ b/test/e2e/tests/gatherpress-admin-settings.spec.ts @@ -0,0 +1,32 @@ +import { test, expect, WP_AUTH_STORAGE } from '@test-utils'; + +// We have multiple tests in this file, all requiring us to be authenticated. +// Compare this to the front-end.spec.ts. +// test.use({ storageState: WP_AUTH_STORAGE }); + +// test.beforeAll(async ({ requestUtils }) => { +// await requestUtils.activatePlugin('gatherpress'); +// }); + +test.describe( 'GatherPress Settings', () => { + test('A link to the plugin settings page is present under the Events menu', async ({ + page, + admin, + }) => { + await admin.visitAdminPage('/'); + + const gatherPressMenuItem = page.locator('li', { + has: page.getByRole('link', { name: 'Events' }), + }); + const wpGatherPressSettingsItem = gatherPressMenuItem.getByRole('link', { + name: 'Settings', + }); + const wpGatherPressSettingsItemUrl = + await wpGatherPressSettingsItem.getAttribute('href'); + + await expect(wpGatherPressSettingsItem).toBeVisible(); + await expect(wpGatherPressSettingsItemUrl).toContain( + 'edit.php?post_type=gatherpress_event&page=gatherpress_general', + ); + }); +}); \ No newline at end of file diff --git a/test/e2e/tests/gatherpress-blocks-editor.spec.ts b/test/e2e/tests/gatherpress-blocks-editor.spec.ts new file mode 100644 index 000000000..558c7f115 --- /dev/null +++ b/test/e2e/tests/gatherpress-blocks-editor.spec.ts @@ -0,0 +1,88 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); +/** + * internal dependencies + */ +// import { test, expect, WP_AUTH_STORAGE } from '@test-utils'; +import { WP_AUTH_STORAGE } from '@test-utils'; + +const GPOOV_CLASS_NAME = 'gp-onlineevent-or-venue'; + +test.describe( 'GatherPress general block tests', () => { + // We have multiple tests in this file, all requiring us to be authenticated. + // Compare this to the front-end.spec.ts. + // test.use({ storageState: WP_AUTH_STORAGE }); + +/* test.beforeAll(async ({ requestUtils }) => { + await requestUtils.activatePlugin('gatherpress'); + }); */ + + test.beforeEach( async ( { admin } ) => { + // await admin.createNewPost( { postType: 'gatherpress_event' } ); + await admin.createNewPost(); + } ); + + test.afterEach( async ( { requestUtils } ) => { + await requestUtils.deleteAllPosts(); + } ); + + /** + * Are 3 blocks available? + * + * Tests if all blocks are avail through the block inserter panel. + * + * Adopted from 'Search for the Paragraph block with 2 additional variations' + * @source https://github.com/WordPress/gutenberg/blob/ddadd1a95d18270908ac4a1fd8d6e354cfadf61c/test/e2e/specs/editor/plugins/block-variations.spec.js#L62 + */ + test( 'Are 1 blocks available?', async ( { + page, + } ) => { + await page + .getByRole( 'button', { name: 'Toggle block inserter' } ) + .click(); + + await page + .getByRole( 'region', { name: 'Block Library' } ) + .getByRole( 'searchbox', { + name: 'Search for blocks and patterns', + } ) + .fill( 'gatherpress' ); + + await expect( + page + .getByRole( 'listbox', { name: 'Blocks' } ) + .getByRole( 'option' ) + ).toHaveText( [ 'Events List' ] ); + } ); + + test( 'Does the block insert?', async ( { + page, + editor, + } ) => { +/* + await editor.insertBlock( { name: 'pseudo-' + GPOOV_CLASS_NAME + '-button' } ); + + expect( await page.$('.' + GPOOV_CLASS_NAME ) ).not.toBeNull(); + + const block = editor.canvas.getByRole( 'document', { + name: 'Online-Event Link', + } ); + + await expect( block ).not.toBeNull(); */ + +/* + await editor.canvas + .getByLabel('Add default block') + .click(); + + await page.keyboard.type( '/Online-Event Link' ); + await page.keyboard.press( 'Enter' ); + + await expect( + editor.canvas.getByRole( 'document', { name: 'Online-Event Link' } ) + ).toHaveText( 'Online-Event' ); */ + } ); + +} ); \ No newline at end of file From da4fe1321a7c141cb8295f8995b7821afe947983 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 01:34:57 +0200 Subject: [PATCH 07/28] Fix script name to start wp-env --- .github/workflows/e2e-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index a429fb7ab..8c95645c8 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -43,7 +43,7 @@ jobs: - name: Starting the WordPress Environment run: | - npm run env:start + npm run wp-env start - name: Running the tests env: From 6a4ea6f2a9977c8847065e68f1b3f3aa76848851 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 01:35:57 +0200 Subject: [PATCH 08/28] Add basic dev-documentation about e2e-tests --- docs/developer/e2e-tests/README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 docs/developer/e2e-tests/README.md diff --git a/docs/developer/e2e-tests/README.md b/docs/developer/e2e-tests/README.md new file mode 100644 index 000000000..f599aeff9 --- /dev/null +++ b/docs/developer/e2e-tests/README.md @@ -0,0 +1,26 @@ +# e2e testing + +GatherPress allows to run automated and manual end-to-end tests, while sharing the same, `wp-env` based, setup. + +## Automated tests + +Check the results of the _e2e-tests action workflow_ at `https://github.com/GatherPress/gatherpress/actions/workflows/e2e-tests.yml`. + +## Manual testing + +0. Have `node` installed +1. Have `docker` running +2. Open the plugin folder in a terminal +3. _Choose one of the following options_ + - Run Playwright in the background using + ``` + npm run test:e2e + ``` + + - Run Playwright visually (and change what's happening) using + ``` + npm run test:e2e:debug + ``` + ![grafik](https://github.com/user-attachments/assets/1627dff7-363e-447e-9981-adac610ac888) + + - Run Tests independently _AND_ visually using the [Playwright VSCode extension](https://playwright.dev/docs/getting-started-vscode) \ No newline at end of file From 9477ecc493af8d1a40cfcfbc2eb505e8e0f34d6d Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 10:14:08 +0200 Subject: [PATCH 09/28] Run BUILD before Playwright tests --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 2770b468e..b8cc5fa09 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "packages-update": "wp-scripts packages-update", "plugin-zip": "wp-scripts plugin-zip", "start": "wp-scripts start", - "pretest:e2e": "wp-env start", + "pretest:e2e": "wp-scripts build && wp-env start", + "pretest:e2e:debug": "wp-scripts build && wp-env start", "test:e2e": "wp-scripts test-playwright --config test/e2e/playwright.config.ts", "test:e2e:debug": "wp-scripts test-playwright --config test/e2e/playwright.config.ts --ui", "test:unit:js": "wp-scripts test-unit-js --coverage --testResultsProcessor=jest-sonar-reporter", From 94d99f6b60308c605dcefe2a6843cbbf5c77ecef Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 10:15:13 +0200 Subject: [PATCH 10/28] DO NOT MERGE // FOR DEBUGGING ONLY // simple Gutenberg paragraph block test --- .../tests/gatherpress-blocks-editor.spec.ts | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/test/e2e/tests/gatherpress-blocks-editor.spec.ts b/test/e2e/tests/gatherpress-blocks-editor.spec.ts index 558c7f115..824d35315 100644 --- a/test/e2e/tests/gatherpress-blocks-editor.spec.ts +++ b/test/e2e/tests/gatherpress-blocks-editor.spec.ts @@ -61,7 +61,33 @@ test.describe( 'GatherPress general block tests', () => { page, editor, } ) => { -/* +// THIS IS COPIED FROM // +// https://github.com/WordPress/gutenberg/blob/c48075b6665ec3910d00677088672c1ba9e24916/test/e2e/specs/editor/blocks/paragraph.spec.js#L26C1-L40C43 +// FOR DEBUGGING ONLY // +// REMOVE AFTER WORKFLOW RUNS // + + await editor.insertBlock( { + name: 'core/paragraph', + } ); + await page.keyboard.type( '1' ); + + const firstBlockTagName = await editor.canvas + .locator( ':root' ) + .evaluate( () => { + return document.querySelector( '[data-block]' ).tagName; + } ); + + // The outer element should be a paragraph. Blocks should never have any + // additional div wrappers so the markup remains simple and easy to + // style. + expect( firstBlockTagName ).toBe( 'P' ); +// END // THIS IS COPIED FROM // +// https://github.com/WordPress/gutenberg/blob/c48075b6665ec3910d00677088672c1ba9e24916/test/e2e/specs/editor/blocks/paragraph.spec.js#L26C1-L40C43 +// FOR DEBUGGING ONLY // +// REMOVE AFTER WORKFLOW RUNS // + + + /* await editor.insertBlock( { name: 'pseudo-' + GPOOV_CLASS_NAME + '-button' } ); expect( await page.$('.' + GPOOV_CLASS_NAME ) ).not.toBeNull(); From eb8dbdc54eb0a113a2e511fad3192db89d6aa812 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 10:22:49 +0200 Subject: [PATCH 11/28] Remove custom globalSetup & env vars in favor of Gutenbergs defaults --- .github/workflows/e2e-tests.yml | 10 +++++----- test/e2e/playwright.config.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 8c95645c8..c9ea4e090 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -46,11 +46,11 @@ jobs: npm run wp-env start - name: Running the tests - env: - WP_AUTH_STORAGE: artifacts/storage-states/admin.json - WP_BASE_URL: http://localhost:8889 - WP_USERNAME: admin - WP_PASSWORD: password + # env: + # WP_AUTH_STORAGE: artifacts/storage-states/admin.json + # WP_BASE_URL: http://localhost:8889 + # WP_USERNAME: admin + # WP_PASSWORD: password run: | npm run test:e2e diff --git a/test/e2e/playwright.config.ts b/test/e2e/playwright.config.ts index 93a564667..4ccf753c8 100644 --- a/test/e2e/playwright.config.ts +++ b/test/e2e/playwright.config.ts @@ -38,7 +38,7 @@ export default defineConfig({ testDir: 'tests', // This is run before any tests. Check the file for more information. - globalSetup: 'global-setup.ts', + // globalSetup: 'global-setup.ts', // use: { // https://playwright.dev/docs/api/class-testoptions#test-options-storage-state // storageState: WP_AUTH_STORAGE From a888cc2ce81cc26393d45d8a0c0a487460d5ef84 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 10:24:53 +0200 Subject: [PATCH 12/28] TRY: Disable blank mappings for themes & plugins in wp-env TRICKY: Enabled mapping leads to 404 for build blocks, Disabled mapping helps gatherpress blocks, but make the simple paragraph test fail (copied for debugging from gutenberg) --- .wp-env.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.wp-env.json b/.wp-env.json index 44e384bfd..7074e7a5c 100644 --- a/.wp-env.json +++ b/.wp-env.json @@ -4,9 +4,5 @@ ], "config": { "WP_DEBUG_LOG": true - }, - "mappings": { - "wp-content/plugins": "./wp-core/plugins", - "wp-content/themes": "./wp-core/themes" } } From ee9544cd1fa476ce978fc44e5f19416f491bfde7 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 12:28:29 +0200 Subject: [PATCH 13/28] Add caching to the Playwright browser download step --- .github/workflows/e2e-tests.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index c9ea4e090..f19a4f2d2 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -24,6 +24,13 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - uses: actions/cache@v2 + id: playwright-cache + with: + path: | + ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ hashFiles('**/package-lock.json') }} + - name: Setup Node uses: actions/setup-node@v4 with: @@ -38,8 +45,10 @@ jobs: npm run build - name: Install Playwright dependencies - run: | - npx playwright install chromium firefox webkit --with-deps + run: npx playwright install --with-deps + if: steps.playwright-cache.outputs.cache-hit != 'true' + - run: npx playwright install-deps + if: steps.playwright-cache.outputs.cache-hit == 'true' - name: Starting the WordPress Environment run: | From d1b3b3a895fe8dccb9e1d25a17e6fd7505296c4b Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 14:38:38 +0200 Subject: [PATCH 14/28] Creating a short lived node_modules cache to be used by multiple accross one Github actions workflow attempt. --- .github/workflows/e2e-tests.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index f19a4f2d2..f300dba46 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -37,7 +37,20 @@ jobs: node-version-file: '.nvmrc' cache: npm - - name: Install dependencies + # Creating a short lived node_modules cache + # to be used accross one workflow attempt. + # https://github.com/actions/cache/blob/main/caching-strategies.md#creating-a-short-lived-cache + - uses: actions/cache@v4 + id: node_modules-cache + with: + path: | + ./node_modules + key: ${{ runner.os }}-node_modules-${{ github.sha }}-${{ hashFiles('package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node_modules-${{ github.sha }}- + + - name: NPM install + if: steps.node_modules-cache.outputs.cache-hit != 'true' run: npm ci - name: Build plugin From 308ca4ecd4a368d2f2261b6492e83d07e2f2e81d Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 14:58:35 +0200 Subject: [PATCH 15/28] DISABLED TEMPORARY // REVERT BEFORE MERGE // to make debugging easier --- ...min-venue.spec.js => gatherpress-admin-venue.spec.js.DISABLED} | 0 ...therpress-admin.spec.js => gatherpress-admin.spec.js.DISABLED} | 0 ...ggedIn.spec.js => gatherpress-event-loggedIn.spec.js.DISABLED} | 0 ...gIn.spec.js => gatherpress-event-nonLoggegIn.spec.js.DISABLED} | 0 ...therpress-event.spec.js => gatherpress-event.spec.js.DISABLED} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename test/e2e/tests/{gatherpress-admin-venue.spec.js => gatherpress-admin-venue.spec.js.DISABLED} (100%) rename test/e2e/tests/{gatherpress-admin.spec.js => gatherpress-admin.spec.js.DISABLED} (100%) rename test/e2e/tests/{gatherpress-event-loggedIn.spec.js => gatherpress-event-loggedIn.spec.js.DISABLED} (100%) rename test/e2e/tests/{gatherpress-event-nonLoggegIn.spec.js => gatherpress-event-nonLoggegIn.spec.js.DISABLED} (100%) rename test/e2e/tests/{gatherpress-event.spec.js => gatherpress-event.spec.js.DISABLED} (100%) diff --git a/test/e2e/tests/gatherpress-admin-venue.spec.js b/test/e2e/tests/gatherpress-admin-venue.spec.js.DISABLED similarity index 100% rename from test/e2e/tests/gatherpress-admin-venue.spec.js rename to test/e2e/tests/gatherpress-admin-venue.spec.js.DISABLED diff --git a/test/e2e/tests/gatherpress-admin.spec.js b/test/e2e/tests/gatherpress-admin.spec.js.DISABLED similarity index 100% rename from test/e2e/tests/gatherpress-admin.spec.js rename to test/e2e/tests/gatherpress-admin.spec.js.DISABLED diff --git a/test/e2e/tests/gatherpress-event-loggedIn.spec.js b/test/e2e/tests/gatherpress-event-loggedIn.spec.js.DISABLED similarity index 100% rename from test/e2e/tests/gatherpress-event-loggedIn.spec.js rename to test/e2e/tests/gatherpress-event-loggedIn.spec.js.DISABLED diff --git a/test/e2e/tests/gatherpress-event-nonLoggegIn.spec.js b/test/e2e/tests/gatherpress-event-nonLoggegIn.spec.js.DISABLED similarity index 100% rename from test/e2e/tests/gatherpress-event-nonLoggegIn.spec.js rename to test/e2e/tests/gatherpress-event-nonLoggegIn.spec.js.DISABLED diff --git a/test/e2e/tests/gatherpress-event.spec.js b/test/e2e/tests/gatherpress-event.spec.js.DISABLED similarity index 100% rename from test/e2e/tests/gatherpress-event.spec.js rename to test/e2e/tests/gatherpress-event.spec.js.DISABLED From 9cd89adac55bb2c9338746f804296f5f6183fa92 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 15:02:57 +0200 Subject: [PATCH 16/28] Fix the artifacts upload on CI, to get traces and screenshots from failed attempts (suggested at https://github.com/GatherPress/gatherpress/pull/776#issuecomment-2283642165 by @swissspidy) --- .github/workflows/e2e-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index f300dba46..f7a4daf65 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -81,4 +81,4 @@ jobs: if: failure() with: name: test-results-matrix-less-debugging - path: test-results/ + path: artifacts/test-results/ From ea0739db272198e5b0b11a0ad21f9dd53161e515 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Mon, 12 Aug 2024 23:59:20 +0200 Subject: [PATCH 17/28] Update actions/checkout to v4 --- .github/workflows/e2e-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index f7a4daf65..73f90850e 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -24,7 +24,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - uses: actions/cache@v2 + - uses: actions/cache@v4 id: playwright-cache with: path: | From 6f2c8f54e8561191d565652b85b8a75fe8d7d318 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Tue, 13 Aug 2024 00:00:13 +0200 Subject: [PATCH 18/28] Run npm install, only when really needed --- .github/workflows/e2e-tests.yml | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 73f90850e..06522be97 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -35,27 +35,34 @@ jobs: uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' - cache: npm + # Enable built-in functionality for caching and restoring dependencies, which is disabled by default. + # The actions/setup-node uses actions/cache under the hood. + # https://github.com/actions/setup-node#caching-global-packages-data + cache: 'npm' - # Creating a short lived node_modules cache - # to be used accross one workflow attempt. + + # Restoring the short lived node_modules cache + # to be used accross all workflows running on the last commit. # https://github.com/actions/cache/blob/main/caching-strategies.md#creating-a-short-lived-cache - - uses: actions/cache@v4 + - uses: actions/cache/restore@v4 id: node_modules-cache with: path: | ./node_modules key: ${{ runner.os }}-node_modules-${{ github.sha }}-${{ hashFiles('package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node_modules-${{ github.sha }}- - name: NPM install if: steps.node_modules-cache.outputs.cache-hit != 'true' - run: npm ci + run: npm ci --legacy-peer-deps + + # Creating a short lived node_modules cache + - uses: actions/cache/save@v4 + if: steps.node_modules-cache.outputs.cache-hit != 'true' + with: + path: | + ./node_modules + key: ${{ steps.node_modules-cache.outputs.cache-primary-key }} - - name: Build plugin - run: | - npm run build - name: Install Playwright dependencies run: npx playwright install --with-deps From f3c6ad4a1126e9007ea359bac77b4aceeb2b7108 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Tue, 13 Aug 2024 00:01:50 +0200 Subject: [PATCH 19/28] Remove steps, that are being done via npm pre-script runs --- .github/workflows/e2e-tests.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 06522be97..81e649901 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -63,6 +63,9 @@ jobs: ./node_modules key: ${{ steps.node_modules-cache.outputs.cache-primary-key }} + # - name: Build plugin + # run: | + # npm run build - name: Install Playwright dependencies run: npx playwright install --with-deps @@ -70,9 +73,9 @@ jobs: - run: npx playwright install-deps if: steps.playwright-cache.outputs.cache-hit == 'true' - - name: Starting the WordPress Environment - run: | - npm run wp-env start + # - name: Starting the WordPress Environment + # run: | + # npm run wp-env start - name: Running the tests # env: From b7fad4b9133e5ffe63f0e45d58ccc8a470941a08 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Tue, 13 Aug 2024 00:02:19 +0200 Subject: [PATCH 20/28] Cleanup --- .github/workflows/e2e-tests.yml | 7 +- test/e2e/global-setup.ts | 49 ------------ test/e2e/playwright.config.ts | 20 ----- test/e2e/test-utils/index.ts | 8 -- test/e2e/test-utils/test.ts | 75 ------------------- .../tests/gatherpress-admin-settings.spec.ts | 13 +--- .../tests/gatherpress-blocks-editor.spec.ts | 19 ++--- tsconfig.json | 8 -- 8 files changed, 12 insertions(+), 187 deletions(-) delete mode 100644 test/e2e/global-setup.ts delete mode 100644 test/e2e/test-utils/index.ts delete mode 100644 test/e2e/test-utils/test.ts delete mode 100644 tsconfig.json diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 81e649901..5bb443272 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -77,12 +77,7 @@ jobs: # run: | # npm run wp-env start - - name: Running the tests - # env: - # WP_AUTH_STORAGE: artifacts/storage-states/admin.json - # WP_BASE_URL: http://localhost:8889 - # WP_USERNAME: admin - # WP_PASSWORD: password + - name: Starting Playwright & Running the tests run: | npm run test:e2e diff --git a/test/e2e/global-setup.ts b/test/e2e/global-setup.ts deleted file mode 100644 index adbde4343..000000000 --- a/test/e2e/global-setup.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * External dependencies - */ -const path = require( 'path' ); -import { request } from '@playwright/test'; - -/** - * WordPress dependencies - */ -import { RequestUtils } from '@wordpress/e2e-test-utils-playwright'; - -/** - * Internal dependencies - * - * @TODO: Would be nice to require() those constants directly from gutenberg, but they are not publicly exposed. - */ -// const { WP_BASE_URL, WP_USERNAME, WP_PASSWORD } = require( '@wordpress/e2e-test-utils-playwright/config' ); -import { WP_BASE_URL, WP_USERNAME, WP_PASSWORD, WP_AUTH_STORAGE } from '@test-utils'; - -const STORAGE_STATE_PATH = process.env.STORAGE_STATE_PATH || - path.join(process.cwd(), 'artifacts/storage-states/admin.json'); - -// To interact with the GatherPress plugin's settings page, we must be authenticated. -// Before any tests are run, we sign in, save the cookies set by WordPress, and then discard the session. -// Later, when we need to act as a logged-in user, we make those cookies available. -// https://playwright.dev/docs/test-global-setup-teardown#configure-globalsetup-and-globalteardown -export default async function globalSetup() { - const requestContext = await request.newContext({ - baseURL: WP_BASE_URL, - }); - const requestUtils = new RequestUtils(requestContext, { - // storageStatePath: WP_AUTH_STORAGE, - storageStatePath: STORAGE_STATE_PATH, - user: { - username: WP_USERNAME, - password: WP_PASSWORD, - }, - }); - - // Alternatively, we could take a more traditional route, - // filling in the input fields for the username and password and submitting the form. - // https://playwright.dev/docs/test-global-setup-teardown#example - - // Authenticate and save the storageState to disk. - await requestUtils.setupRest(); - - // - await requestContext.dispose(); -} \ No newline at end of file diff --git a/test/e2e/playwright.config.ts b/test/e2e/playwright.config.ts index 4ccf753c8..db9d7b5a7 100644 --- a/test/e2e/playwright.config.ts +++ b/test/e2e/playwright.config.ts @@ -14,20 +14,7 @@ import { defineConfig, devices } from '@playwright/test'; // const { use, ...baseConfig} = require( '@wordpress/scripts/config/playwright.config' ); const { ...baseConfig} = require( '@wordpress/scripts/config/playwright.config' ); -// Remove storageState -// The default conf of Gutenberg has storageState set, which means "We are logged-in". -// To make sure our tests run the other way around, we remove this now, -// and re-set it on a project- or test-level. -// const { storageState, ...baseUse} = use; -// const newConf = { -// ...baseConfig, -// use: { ...baseUse }, -// } -// console.log(newConf); -// const WP_AUTH_STORAGE = '.auth/wordpress.json'; - export default defineConfig({ - // ...newConf, ...baseConfig, // This directory holds all the test files. @@ -37,13 +24,6 @@ export default defineConfig({ // where the test files would be housed directly with their components, blocks, etc. testDir: 'tests', - // This is run before any tests. Check the file for more information. - // globalSetup: 'global-setup.ts', - // use: { - // https://playwright.dev/docs/api/class-testoptions#test-options-storage-state - // storageState: WP_AUTH_STORAGE - // storageState: '' - // }, // Configure projects for major browsers // We can test on different or multiple browsers if needed. // https://playwright.dev/docs/test-projects#configure-projects-for-multiple-browsers diff --git a/test/e2e/test-utils/index.ts b/test/e2e/test-utils/index.ts deleted file mode 100644 index c68fcd887..000000000 --- a/test/e2e/test-utils/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { - test, - expect, - WP_USERNAME, - WP_PASSWORD, - WP_BASE_URL, - WP_AUTH_STORAGE, -} from './test'; \ No newline at end of file diff --git a/test/e2e/test-utils/test.ts b/test/e2e/test-utils/test.ts deleted file mode 100644 index 3d88138cf..000000000 --- a/test/e2e/test-utils/test.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { test as base, expect } from '@playwright/test'; - -// We only require what's essential from the WordPress E2E test utils package. -import { - Admin, - Editor, - PageUtils, - RequestUtils, -} from '@wordpress/e2e-test-utils-playwright'; - - -/** - * WordPress dependencies - */ -// const { WP_BASE_URL, WP_USERNAME, WP_PASSWORD } = require( '@wordpress/e2e-test-utils-playwright/config' ); -const { - WP_USERNAME = 'admin', - WP_PASSWORD = 'password', - WP_BASE_URL = 'http://localhost:8889', - WP_AUTH_STORAGE = 'artifacts/auth.json', -} = process.env; - -// We could also import utils from other packages. -// import { StoreApiUtils } from '@woocommerce/e2e-utils'; - -// This is a project-specific util. -// import { WpGuestBar } from './wp-guest-bar'; - -// We are extending the functionalities of Playwright by adding and bootstrapping the custom utils. -// https://playwright.dev/docs/test-fixtures#creating-a-fixture -// -// We have a minimal setup compared to more involved ones. -// https://github.com/WordPress/gutenberg/blob/trunk/packages/e2e-test-utils-playwright/src/test.ts -// https://github.com/woocommerce/woocommerce-blocks/blob/trunk/tests/e2e/playwright-utils/test.ts -const test = base.extend<{ - admin: Admin; - editor: Editor; - pageUtils: PageUtils; - requestUtils: RequestUtils; - // wpGuestBar: WpGuestBar; -}>({ - async admin({ page, pageUtils, editor }, use) { - await use(new Admin({ page, pageUtils, editor })); - }, - async editor({ page }, use) { - await use(new Editor({ page })); - }, - async pageUtils({ page }, use) { - await use(new PageUtils({ page })); - }, - async requestUtils({}, use) { - // We want to make all REST API calls as authenticated users. - const requestUtils = await RequestUtils.setup({ - baseURL: WP_BASE_URL, - user: { - username: WP_USERNAME, - password: WP_PASSWORD, - }, - }); - - await use(requestUtils); - }, - // async wpGuestBar({ requestUtils }, use) { - // await use(new WpGuestBar(requestUtils)); - // }, -}); - -export { - test, - expect, - WP_USERNAME, - WP_PASSWORD, - WP_BASE_URL, - WP_AUTH_STORAGE, -}; \ No newline at end of file diff --git a/test/e2e/tests/gatherpress-admin-settings.spec.ts b/test/e2e/tests/gatherpress-admin-settings.spec.ts index 1cbc468c6..f7ae4f74a 100644 --- a/test/e2e/tests/gatherpress-admin-settings.spec.ts +++ b/test/e2e/tests/gatherpress-admin-settings.spec.ts @@ -1,12 +1,7 @@ -import { test, expect, WP_AUTH_STORAGE } from '@test-utils'; - -// We have multiple tests in this file, all requiring us to be authenticated. -// Compare this to the front-end.spec.ts. -// test.use({ storageState: WP_AUTH_STORAGE }); - -// test.beforeAll(async ({ requestUtils }) => { -// await requestUtils.activatePlugin('gatherpress'); -// }); +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); test.describe( 'GatherPress Settings', () => { test('A link to the plugin settings page is present under the Events menu', async ({ diff --git a/test/e2e/tests/gatherpress-blocks-editor.spec.ts b/test/e2e/tests/gatherpress-blocks-editor.spec.ts index 824d35315..9661e17f8 100644 --- a/test/e2e/tests/gatherpress-blocks-editor.spec.ts +++ b/test/e2e/tests/gatherpress-blocks-editor.spec.ts @@ -2,21 +2,16 @@ * WordPress dependencies */ const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); -/** - * internal dependencies - */ -// import { test, expect, WP_AUTH_STORAGE } from '@test-utils'; -import { WP_AUTH_STORAGE } from '@test-utils'; const GPOOV_CLASS_NAME = 'gp-onlineevent-or-venue'; test.describe( 'GatherPress general block tests', () => { - // We have multiple tests in this file, all requiring us to be authenticated. - // Compare this to the front-end.spec.ts. - // test.use({ storageState: WP_AUTH_STORAGE }); - -/* test.beforeAll(async ({ requestUtils }) => { - await requestUtils.activatePlugin('gatherpress'); +/* + test.beforeAll(async ({ requestUtils }) => { + // await requestUtils.activatePlugin('gatherpress'); + + // TEST // DO NOT MERGE // should make: 1. test fail, 2. test pass + // await requestUtils.deactivatePlugin('gatherpress'); }); */ test.beforeEach( async ( { admin } ) => { @@ -36,7 +31,7 @@ test.describe( 'GatherPress general block tests', () => { * Adopted from 'Search for the Paragraph block with 2 additional variations' * @source https://github.com/WordPress/gutenberg/blob/ddadd1a95d18270908ac4a1fd8d6e354cfadf61c/test/e2e/specs/editor/plugins/block-variations.spec.js#L62 */ - test( 'Are 1 blocks available?', async ( { + test( 'Is 1 block available?', async ( { page, } ) => { await page diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index f9491a04c..000000000 --- a/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@test-utils": ["test/e2e/test-utils"] - } - } -} From 421c3b0ea8ea29107279ac3b0cd8f3b2bb54dc0c Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Sat, 17 Aug 2024 00:40:01 +0200 Subject: [PATCH 21/28] Move doc into contributor folder --- docs/{developer => contributor}/e2e-tests/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) rename docs/{developer => contributor}/e2e-tests/README.md (78%) diff --git a/docs/developer/e2e-tests/README.md b/docs/contributor/e2e-tests/README.md similarity index 78% rename from docs/developer/e2e-tests/README.md rename to docs/contributor/e2e-tests/README.md index f599aeff9..484ac646a 100644 --- a/docs/developer/e2e-tests/README.md +++ b/docs/contributor/e2e-tests/README.md @@ -12,15 +12,19 @@ Check the results of the _e2e-tests action workflow_ at `https://github.com/Gat 1. Have `docker` running 2. Open the plugin folder in a terminal 3. _Choose one of the following options_ - - Run Playwright in the background using + - Run Playwright normally ``` npm run test:e2e ``` - - Run Playwright visually (and change what's happening) using + - Run Playwright visually (and change what's happening) ``` - npm run test:e2e:debug + npm run test:e2e:ui ``` ![grafik](https://github.com/user-attachments/assets/1627dff7-363e-447e-9981-adac610ac888) - + + - Run Playwright in debugging mode (and record what's happening) + ``` + npm run test:e2e:debug + ``` - Run Tests independently _AND_ visually using the [Playwright VSCode extension](https://playwright.dev/docs/getting-started-vscode) \ No newline at end of file From ed4ff96b9487a5ae123106adbbca36c2a0ab9a61 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Sat, 17 Aug 2024 00:40:30 +0200 Subject: [PATCH 22/28] Rename scripts to align with screenshot-workflow --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b8cc5fa09..7278ad11b 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,10 @@ "start": "wp-scripts start", "pretest:e2e": "wp-scripts build && wp-env start", "pretest:e2e:debug": "wp-scripts build && wp-env start", + "pretest:e2e:ui": "wp-scripts build && wp-env start", "test:e2e": "wp-scripts test-playwright --config test/e2e/playwright.config.ts", - "test:e2e:debug": "wp-scripts test-playwright --config test/e2e/playwright.config.ts --ui", + "test:e2e:debug": "wp-scripts test-playwright --config test/e2e/playwright.config.ts --debug", + "test:e2e:ui": "wp-scripts test-playwright --config test/e2e/playwright.config.ts --ui", "test:unit:js": "wp-scripts test-unit-js --coverage --testResultsProcessor=jest-sonar-reporter", "pretest:unit:php": "wp-env start --xdebug", "test:unit:php": "wp-env run tests-wordpress php -dxdebug.mode=coverage /var/www/html/wp-content/plugins/gatherpress/vendor/bin/phpunit -c /var/www/html/wp-content/plugins/gatherpress/phpunit.xml.dist --coverage-clover=coverage.xml --coverage-html=build/coverage-report", From cb6e65b0e8f2d3a7ce3f67c6916bc6fd71d62900 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Sat, 17 Aug 2024 00:43:46 +0200 Subject: [PATCH 23/28] Remove debug stuff --- .../tests/gatherpress-blocks-editor.spec.ts | 53 ++++--------------- 1 file changed, 10 insertions(+), 43 deletions(-) diff --git a/test/e2e/tests/gatherpress-blocks-editor.spec.ts b/test/e2e/tests/gatherpress-blocks-editor.spec.ts index 9661e17f8..cbc56dca1 100644 --- a/test/e2e/tests/gatherpress-blocks-editor.spec.ts +++ b/test/e2e/tests/gatherpress-blocks-editor.spec.ts @@ -3,19 +3,9 @@ */ const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); -const GPOOV_CLASS_NAME = 'gp-onlineevent-or-venue'; - test.describe( 'GatherPress general block tests', () => { -/* - test.beforeAll(async ({ requestUtils }) => { - // await requestUtils.activatePlugin('gatherpress'); - - // TEST // DO NOT MERGE // should make: 1. test fail, 2. test pass - // await requestUtils.deactivatePlugin('gatherpress'); - }); */ test.beforeEach( async ( { admin } ) => { - // await admin.createNewPost( { postType: 'gatherpress_event' } ); await admin.createNewPost(); } ); @@ -24,7 +14,7 @@ test.describe( 'GatherPress general block tests', () => { } ); /** - * Are 3 blocks available? + * Are all blocks available? * * Tests if all blocks are avail through the block inserter panel. * @@ -52,43 +42,20 @@ test.describe( 'GatherPress general block tests', () => { ).toHaveText( [ 'Events List' ] ); } ); - test( 'Does the block insert?', async ( { + test( 'Does the "Events List" block insert?', async ( { page, editor, } ) => { -// THIS IS COPIED FROM // -// https://github.com/WordPress/gutenberg/blob/c48075b6665ec3910d00677088672c1ba9e24916/test/e2e/specs/editor/blocks/paragraph.spec.js#L26C1-L40C43 -// FOR DEBUGGING ONLY // -// REMOVE AFTER WORKFLOW RUNS // - - await editor.insertBlock( { - name: 'core/paragraph', - } ); - await page.keyboard.type( '1' ); - - const firstBlockTagName = await editor.canvas - .locator( ':root' ) - .evaluate( () => { - return document.querySelector( '[data-block]' ).tagName; - } ); - - // The outer element should be a paragraph. Blocks should never have any - // additional div wrappers so the markup remains simple and easy to - // style. - expect( firstBlockTagName ).toBe( 'P' ); -// END // THIS IS COPIED FROM // -// https://github.com/WordPress/gutenberg/blob/c48075b6665ec3910d00677088672c1ba9e24916/test/e2e/specs/editor/blocks/paragraph.spec.js#L26C1-L40C43 -// FOR DEBUGGING ONLY // -// REMOVE AFTER WORKFLOW RUNS // + await editor.insertBlock( { name: 'Events List' } ); /* - await editor.insertBlock( { name: 'pseudo-' + GPOOV_CLASS_NAME + '-button' } ); - - expect( await page.$('.' + GPOOV_CLASS_NAME ) ).not.toBeNull(); + * Not working yet, because the GatherPress blocks are still all on apiVersion 2, + * but need to have 3 + * / const block = editor.canvas.getByRole( 'document', { - name: 'Online-Event Link', + name: 'Events List', } ); await expect( block ).not.toBeNull(); */ @@ -98,12 +65,12 @@ test.describe( 'GatherPress general block tests', () => { .getByLabel('Add default block') .click(); - await page.keyboard.type( '/Online-Event Link' ); + await page.keyboard.type( '/Events List' ); await page.keyboard.press( 'Enter' ); await expect( - editor.canvas.getByRole( 'document', { name: 'Online-Event Link' } ) - ).toHaveText( 'Online-Event' ); */ + editor.canvas.getByRole( 'document', { name: 'Events List' } ) + ).toHaveText( '...' ); */ } ); } ); \ No newline at end of file From c7dae87cb463be05466832bdb95f524e3417db85 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Sat, 17 Aug 2024 01:12:25 +0200 Subject: [PATCH 24/28] Clean up --- .../gatherpress-admin-venue.spec.js.DISABLED | 41 ------------------- .../e2e/tests/gatherpress-admin-venue.spec.ts | 32 +++++++++++++++ .../tests/gatherpress-admin.spec.js.DISABLED | 29 ------------- test/e2e/tests/gatherpress-admin.spec.ts | 34 +++++++++++++++ .../tests/gatherpress-blocks-editor.spec.ts | 12 +++--- 5 files changed, 72 insertions(+), 76 deletions(-) delete mode 100644 test/e2e/tests/gatherpress-admin-venue.spec.js.DISABLED create mode 100644 test/e2e/tests/gatherpress-admin-venue.spec.ts delete mode 100644 test/e2e/tests/gatherpress-admin.spec.js.DISABLED create mode 100644 test/e2e/tests/gatherpress-admin.spec.ts diff --git a/test/e2e/tests/gatherpress-admin-venue.spec.js.DISABLED b/test/e2e/tests/gatherpress-admin-venue.spec.js.DISABLED deleted file mode 100644 index e2ff5d6c7..000000000 --- a/test/e2e/tests/gatherpress-admin-venue.spec.js.DISABLED +++ /dev/null @@ -1,41 +0,0 @@ -const { test } = require('@playwright/test'); -const { login } = require('../reusable-user-steps/common.js'); - -test.describe('e2e test for venue through admin side', () => { - test.beforeEach(async ({ page }) => { - test.setTimeout(120000); - await page.setViewportSize({ width: 1920, height: 720 }); - await page.waitForLoadState('networkidle'); - }); - - test('The admin should be able to create a new post for Venue', async ({ - page, - }) => { - await login({ page, username: 'testuser1' }); - - await page.getByRole('link', { name: 'Events', exact: true }).click(); - - await page.getByRole('link', { name: 'Venues' }).click(); - await page.screenshot({ path: 'vanue-page.png' }); - - await page - .locator('#wpbody-content') - .getByRole('link', { name: 'Add New' }) - .click(); - - await page.getByLabel('Add title').isVisible(); - await page.getByLabel('Add title').fill('Test venue'); - await page.getByLabel('Add title').press('Tab'); - - const venue = await page.$('.gatherpress-venue__name'); - await venue.press('Backspace'); - - await page - .getByLabel('Empty block; start writing or') - .fill('test venue information'); - - await page.getByLabel('Toggle block inserter').click(); - await page.getByRole('option', { name: 'Paragraph' }).click(); - await page.screenshot({ path: 'new-venue.png' }); - }); -}); diff --git a/test/e2e/tests/gatherpress-admin-venue.spec.ts b/test/e2e/tests/gatherpress-admin-venue.spec.ts new file mode 100644 index 000000000..a01f8e412 --- /dev/null +++ b/test/e2e/tests/gatherpress-admin-venue.spec.ts @@ -0,0 +1,32 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); + + +// const { login } = require('../reusable-user-steps/common.js'); + +test.describe('e2e test for venue through admin side', () => { + + test('The admin should be able to create a new post for Venue', async ({ + admin, + page, + }) => { + await admin.createNewPost( { postType: 'gatherpress_venue' } ); + + await page.getByLabel('Add title').isVisible(); + await page.getByLabel('Add title').fill('Test venue'); + await page.getByLabel('Add title').press('Tab'); + + const venue = await page.$('.gatherpress-venue__name'); + await venue.press('Backspace'); + + await page + .getByLabel('Empty block; start writing or') + .fill('test venue information'); + + await page.getByLabel('Toggle block inserter').click(); + await page.getByRole('option', { name: 'Paragraph' }).click(); + // await page.screenshot({ path: 'new-venue.png' }); + }); +}); diff --git a/test/e2e/tests/gatherpress-admin.spec.js.DISABLED b/test/e2e/tests/gatherpress-admin.spec.js.DISABLED deleted file mode 100644 index 91d8a7856..000000000 --- a/test/e2e/tests/gatherpress-admin.spec.js.DISABLED +++ /dev/null @@ -1,29 +0,0 @@ -const { test } = require('@playwright/test'); -const { login } = require('../reusable-user-steps/common.js'); - -test.describe('As admin login into gatherPress', () => { - test.beforeEach(async ({ page }) => { - test.setTimeout(120000); - await page.setViewportSize({ width: 1920, height: 720 }); - await page.waitForLoadState('networkidle'); - }); - - test('The Event menu item should be preloaded after clicking Add New button', async ({ - page, - }) => { - await login({ page, username: 'testuser1' }); - - await page.getByRole('link', { name: 'Events', exact: true }).click(); - await page.screenshot({ path: 'event-page.png' }); - - await page - .locator('#wpbody-content') - .getByRole('link', { name: 'Add New' }) - .click(); - - await page.getByLabel('Document Overview').click(); - - await page.getByLabel('List View').locator('div').nth(1).isVisible(); - await page.screenshot({ path: 'add-new-event.png' }); - }); -}); diff --git a/test/e2e/tests/gatherpress-admin.spec.ts b/test/e2e/tests/gatherpress-admin.spec.ts new file mode 100644 index 000000000..880c49c22 --- /dev/null +++ b/test/e2e/tests/gatherpress-admin.spec.ts @@ -0,0 +1,34 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); + + +test.describe('As admin login into gatherPress', () => { + + test('The Event menu item should be preloaded after clicking Add New button', async ({ + page, + }) => { + await page.getByRole('link', { name: 'Events', exact: true }).click(); + // await page.screenshot({ path: 'event-page.png' }); + +/* await page + .locator('#wpbody-content') + .getByRole('link', { name: 'Add New' }) + .click(); + + await page.getByLabel('Document Overview').click(); + + await page.getByLabel('List View').locator('div').nth(1).isVisible(); + await page.screenshot({ path: 'add-new-event.png' }); */ + + // Maybe better use ... ? + // await admin.createNewPost( { postType: 'gatherpress_event' } ); + + +/* await page.getByRole('link', { name: 'Events', exact: true }).click(); + + await page.getByRole('link', { name: 'Venues' }).click(); + await page.screenshot({ path: 'vanue-page.png' }); */ + }); +}); diff --git a/test/e2e/tests/gatherpress-blocks-editor.spec.ts b/test/e2e/tests/gatherpress-blocks-editor.spec.ts index cbc56dca1..5a2431c2a 100644 --- a/test/e2e/tests/gatherpress-blocks-editor.spec.ts +++ b/test/e2e/tests/gatherpress-blocks-editor.spec.ts @@ -42,6 +42,10 @@ test.describe( 'GatherPress general block tests', () => { ).toHaveText( [ 'Events List' ] ); } ); + /* + * Not working yet, because the GatherPress blocks are still all on apiVersion 2, + * but need to have 3 + * / test( 'Does the "Events List" block insert?', async ( { page, editor, @@ -49,10 +53,6 @@ test.describe( 'GatherPress general block tests', () => { await editor.insertBlock( { name: 'Events List' } ); - /* - * Not working yet, because the GatherPress blocks are still all on apiVersion 2, - * but need to have 3 - * / const block = editor.canvas.getByRole( 'document', { name: 'Events List', @@ -70,7 +70,7 @@ test.describe( 'GatherPress general block tests', () => { await expect( editor.canvas.getByRole( 'document', { name: 'Events List' } ) - ).toHaveText( '...' ); */ - } ); + ).toHaveText( '...' ); * / + } ); */ } ); \ No newline at end of file From 345fd9e5c7e565d741420572bc9e0502a50e44ae Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Sat, 17 Aug 2024 01:24:29 +0200 Subject: [PATCH 25/28] Re-Enable 'publish event through admin side' (WIP) --- ...LED => gatherpress-event-loggedIn.spec.ts} | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) rename test/e2e/tests/{gatherpress-event-loggedIn.spec.js.DISABLED => gatherpress-event-loggedIn.spec.ts} (81%) diff --git a/test/e2e/tests/gatherpress-event-loggedIn.spec.js.DISABLED b/test/e2e/tests/gatherpress-event-loggedIn.spec.ts similarity index 81% rename from test/e2e/tests/gatherpress-event-loggedIn.spec.js.DISABLED rename to test/e2e/tests/gatherpress-event-loggedIn.spec.ts index 869a76174..b80969307 100644 --- a/test/e2e/tests/gatherpress-event-loggedIn.spec.js.DISABLED +++ b/test/e2e/tests/gatherpress-event-loggedIn.spec.ts @@ -1,22 +1,15 @@ -const { test } = require('@playwright/test'); -const { login } = require('../reusable-user-steps/common'); +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); test.describe('e2e test for publish event through admin side', () => { - test.beforeEach(async ({ page }) => { - test.setTimeout(120000); - await page.setViewportSize({ width: 1920, height: 720 }); - await page.waitForLoadState('networkidle'); - await login({ page, username: 'testuser1' }); - }); test('01-the user should be able to publish an online event', async ({ + admin, page, }) => { - await page.getByRole('link', { name: 'Events', exact: true }).click(); - await page - .locator('#wpbody-content') - .getByRole('link', { name: 'Add New' }) - .click(); + await admin.createNewPost( { postType: 'gatherpress_event' } ); await page .getByLabel('Block: Event Date') @@ -27,7 +20,7 @@ test.describe('e2e test for publish event through admin side', () => { await page.getByRole('button', { name: 'Event settings' }).click(); - await page.getByLabel('Venue Selector').selectOption('58:online-event'); + await page.getByLabel('Venue Selector').selectOption('58:online-event'); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!! 58 doesn't exist const currentDate = new Date().toISOString().split('T')[0]; // format YYYY-MM-DD const eventTitle = await page .getByLabel('Add title') @@ -55,7 +48,7 @@ test.describe('e2e test for publish event through admin side', () => { .filter({ hasText: 'View Event' }) .isVisible({ timeout: 30000 }); // verified the view event button. }); - +/* test('02-verify the logged in user view RSVP button on home page and perform RSVP action', async ({ page, }) => { @@ -84,5 +77,5 @@ test.describe('e2e test for publish event through admin side', () => { .locator('.gatherpress-rsvp-response__items') .first() .screenshot({ path: 'attending.png' }); - }); + }); */ }); From cab2d148e0eb1a645530f43cfd289d403ed29c38 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Sat, 17 Aug 2024 02:06:17 +0200 Subject: [PATCH 26/28] Resolve merge conflicts --- package.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 7278ad11b..1b3e08ea5 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,13 @@ "packages-update": "wp-scripts packages-update", "plugin-zip": "wp-scripts plugin-zip", "start": "wp-scripts start", - "pretest:e2e": "wp-scripts build && wp-env start", - "pretest:e2e:debug": "wp-scripts build && wp-env start", - "pretest:e2e:ui": "wp-scripts build && wp-env start", - "test:e2e": "wp-scripts test-playwright --config test/e2e/playwright.config.ts", - "test:e2e:debug": "wp-scripts test-playwright --config test/e2e/playwright.config.ts --debug", - "test:e2e:ui": "wp-scripts test-playwright --config test/e2e/playwright.config.ts --ui", + "prescreenshots:wporg": "wp-scripts build && wp-env start", + "prescreenshots:wporg:debug": "wp-scripts build && wp-env start", + "prescreenshots:wporg:ui": "wp-scripts build && wp-env start", + "screenshots:wporg": "wp-scripts test-playwright --config .github/scripts/wordpress-org-screenshots/playwright.config.ts", + "screenshots:wporg:debug": "wp-scripts test-playwright --config .github/scripts/wordpress-org-screenshots/playwright.config.ts --debug", + "screenshots:wporg:ui": "wp-scripts test-playwright --config .github/scripts/wordpress-org-screenshots/playwright.config.ts --ui", + "test:e2e": "playwright test --config=playwright.config.js", "test:unit:js": "wp-scripts test-unit-js --coverage --testResultsProcessor=jest-sonar-reporter", "pretest:unit:php": "wp-env start --xdebug", "test:unit:php": "wp-env run tests-wordpress php -dxdebug.mode=coverage /var/www/html/wp-content/plugins/gatherpress/vendor/bin/phpunit -c /var/www/html/wp-content/plugins/gatherpress/phpunit.xml.dist --coverage-clover=coverage.xml --coverage-html=build/coverage-report", From d8e59a0a1c3e1ed4327f8cd50904fa31338bc5b0 Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Sat, 17 Aug 2024 02:07:37 +0200 Subject: [PATCH 27/28] Re-Add test:e2e scripts --- package.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1b3e08ea5..9f41873f3 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,12 @@ "screenshots:wporg": "wp-scripts test-playwright --config .github/scripts/wordpress-org-screenshots/playwright.config.ts", "screenshots:wporg:debug": "wp-scripts test-playwright --config .github/scripts/wordpress-org-screenshots/playwright.config.ts --debug", "screenshots:wporg:ui": "wp-scripts test-playwright --config .github/scripts/wordpress-org-screenshots/playwright.config.ts --ui", - "test:e2e": "playwright test --config=playwright.config.js", + "pretest:e2e": "wp-scripts build && wp-env start", + "pretest:e2e:debug": "wp-scripts build && wp-env start", + "pretest:e2e:ui": "wp-scripts build && wp-env start", + "test:e2e": "wp-scripts test-playwright --config test/e2e/playwright.config.ts", + "test:e2e:debug": "wp-scripts test-playwright --config test/e2e/playwright.config.ts --debug", + "test:e2e:ui": "wp-scripts test-playwright --config test/e2e/playwright.config.ts --ui", "test:unit:js": "wp-scripts test-unit-js --coverage --testResultsProcessor=jest-sonar-reporter", "pretest:unit:php": "wp-env start --xdebug", "test:unit:php": "wp-env run tests-wordpress php -dxdebug.mode=coverage /var/www/html/wp-content/plugins/gatherpress/vendor/bin/phpunit -c /var/www/html/wp-content/plugins/gatherpress/phpunit.xml.dist --coverage-clover=coverage.xml --coverage-html=build/coverage-report", From 082f6c52043a15bccf57ed3d952da2a1017a1b8b Mon Sep 17 00:00:00 2001 From: Carsten Bach Date: Sat, 17 Aug 2024 02:12:30 +0200 Subject: [PATCH 28/28] Fix indention --- .github/workflows/e2e-tests.yml | 144 +++++++++++++++----------------- 1 file changed, 68 insertions(+), 76 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 5bb443272..71f95fc8d 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -1,8 +1,8 @@ name: E2E Tests on: - workflow_dispatch: - pull_request: + workflow_dispatch: + pull_request: # Cancels all previous workflow runs for pull requests that have not completed. concurrency: @@ -13,77 +13,69 @@ concurrency: jobs: - e2e-tests: - runs-on: ubuntu-latest - strategy: - fail-fast: false - # matrix: - # node: ['14'] - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - uses: actions/cache@v4 - id: playwright-cache - with: - path: | - ~/.cache/ms-playwright - key: ${{ runner.os }}-playwright-${{ hashFiles('**/package-lock.json') }} - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version-file: '.nvmrc' - # Enable built-in functionality for caching and restoring dependencies, which is disabled by default. - # The actions/setup-node uses actions/cache under the hood. - # https://github.com/actions/setup-node#caching-global-packages-data - cache: 'npm' - - - # Restoring the short lived node_modules cache - # to be used accross all workflows running on the last commit. - # https://github.com/actions/cache/blob/main/caching-strategies.md#creating-a-short-lived-cache - - uses: actions/cache/restore@v4 - id: node_modules-cache - with: - path: | - ./node_modules - key: ${{ runner.os }}-node_modules-${{ github.sha }}-${{ hashFiles('package-lock.json') }} - - - name: NPM install - if: steps.node_modules-cache.outputs.cache-hit != 'true' - run: npm ci --legacy-peer-deps - - # Creating a short lived node_modules cache - - uses: actions/cache/save@v4 - if: steps.node_modules-cache.outputs.cache-hit != 'true' - with: - path: | - ./node_modules - key: ${{ steps.node_modules-cache.outputs.cache-primary-key }} - - # - name: Build plugin - # run: | - # npm run build - - - name: Install Playwright dependencies - run: npx playwright install --with-deps - if: steps.playwright-cache.outputs.cache-hit != 'true' - - run: npx playwright install-deps - if: steps.playwright-cache.outputs.cache-hit == 'true' - - # - name: Starting the WordPress Environment - # run: | - # npm run wp-env start - - - name: Starting Playwright & Running the tests - run: | - npm run test:e2e - - - name: Retain failed test results - uses: actions/upload-artifact@v3 - if: failure() - with: - name: test-results-matrix-less-debugging - path: artifacts/test-results/ + e2e-tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + # matrix: + # node: ['14'] + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: actions/cache@v4 + id: playwright-cache + with: + path: | + ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ hashFiles('**/package-lock.json') }} + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + # Enable built-in functionality for caching and restoring dependencies, which is disabled by default. + # The actions/setup-node uses actions/cache under the hood. + # https://github.com/actions/setup-node#caching-global-packages-data + cache: 'npm' + + + # Restoring the short lived node_modules cache + # to be used accross all workflows running on the last commit. + # https://github.com/actions/cache/blob/main/caching-strategies.md#creating-a-short-lived-cache + - uses: actions/cache/restore@v4 + id: node_modules-cache + with: + path: | + ./node_modules + key: ${{ runner.os }}-node_modules-${{ github.sha }}-${{ hashFiles('package-lock.json') }} + + - name: NPM install + if: steps.node_modules-cache.outputs.cache-hit != 'true' + run: npm ci --legacy-peer-deps + + # Creating a short lived node_modules cache + - uses: actions/cache/save@v4 + if: steps.node_modules-cache.outputs.cache-hit != 'true' + with: + path: | + ./node_modules + key: ${{ steps.node_modules-cache.outputs.cache-primary-key }} + + - name: Install Playwright dependencies + run: npx playwright install --with-deps + if: steps.playwright-cache.outputs.cache-hit != 'true' + - run: npx playwright install-deps + if: steps.playwright-cache.outputs.cache-hit == 'true' + + - name: Starting Playwright & Running the tests + run: | + npm run test:e2e + + - name: Retain failed test results + uses: actions/upload-artifact@v3 + if: failure() + with: + name: test-results-matrix-less-debugging + path: artifacts/test-results/