diff --git a/package-lock.json b/package-lock.json index 9d4de3d3ac2..6e04973e0a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,13 +54,14 @@ "@babel/preset-env": "=7.24.7", "@babel/preset-react": "=7.24.7", "@babel/register": "=7.23.7", - "@cfaester/enzyme-adapter-react-18": "=0.8.0", "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", "@jest/globals": "=29.7.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@release-it/conventional-changelog": "=8.0.1", "@svgr/webpack": "=8.1.0", + "@testing-library/jest-dom": "=6.6.3", + "@testing-library/react": "=16.0.1", "autoprefixer": "^10.4.19", "babel-loader": "^9.1.3", "babel-plugin-lodash": "=3.3.4", @@ -75,7 +76,6 @@ "cypress": "=13.13.0", "dedent": "^1.5.3", "deepmerge": "^4.3.1", - "enzyme": "=3.11.0", "eslint": "^8.57.0", "eslint-plugin-import": "^2.29.0", "eslint-plugin-jest": "^28.6.0", @@ -143,6 +143,13 @@ "node": ">=12.17" } }, + "node_modules/@adobe/css-tools": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", + "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -2035,24 +2042,6 @@ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.0.4.tgz", "integrity": "sha512-hPYRrKFoI+nuckPgDJfyYAkybFvheo4usS0Vw0HNAe+fmGBQA5Az37b/yStO284atBoqqdOUhKJ3d9Zw3PQkcQ==" }, - "node_modules/@cfaester/enzyme-adapter-react-18": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cfaester/enzyme-adapter-react-18/-/enzyme-adapter-react-18-0.8.0.tgz", - "integrity": "sha512-3Z3ThTUouHwz8oIyhTYQljEMNRFtlVyc3VOOHCbxs47U6cnXs8K9ygi/c1tv49s7MBlTXeIcuN+Ttd9aPtILFQ==", - "dev": true, - "dependencies": { - "enzyme-shallow-equal": "^1.0.0", - "function.prototype.name": "^1.1.6", - "has": "^1.0.4", - "react-is": "^18.2.0", - "react-shallow-renderer": "^16.15.0" - }, - "peerDependencies": { - "enzyme": "^3.11.0", - "react": ">=18", - "react-dom": ">=18" - } - }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -6088,6 +6077,255 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/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, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/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, + "license": "MIT", + "peer": 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/@testing-library/dom/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, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/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, + "license": "MIT", + "peer": true + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@testing-library/dom/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, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", + "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom/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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/jest-dom/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, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", + "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -6112,6 +6350,14 @@ "node": ">=10.13.0" } }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -7171,6 +7417,16 @@ "node": ">=0.6.10" } }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/array-back": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", @@ -7237,26 +7493,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.filter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.4.tgz", - "integrity": "sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-array-method-boxes-properly": "^1.0.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", @@ -8612,44 +8848,6 @@ "node": ">= 0.8.0" } }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dev": true, - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -10547,6 +10745,16 @@ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -10613,12 +10821,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", - "dev": true - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -10643,6 +10845,14 @@ "node": ">=6.0.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -10911,52 +11121,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/enzyme": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", - "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", - "dev": true, - "dependencies": { - "array.prototype.flat": "^1.2.3", - "cheerio": "^1.0.0-rc.3", - "enzyme-shallow-equal": "^1.0.1", - "function.prototype.name": "^1.1.2", - "has": "^1.0.3", - "html-element-map": "^1.2.0", - "is-boolean-object": "^1.0.1", - "is-callable": "^1.1.5", - "is-number-object": "^1.0.4", - "is-regex": "^1.0.5", - "is-string": "^1.0.5", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.7.0", - "object-is": "^1.0.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.1", - "object.values": "^1.1.1", - "raf": "^3.4.1", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.2.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/enzyme-shallow-equal": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz", - "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0", - "object-is": "^1.1.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -11061,12 +11225,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -13029,15 +13187,6 @@ "node": ">=0.10.0" } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -13232,19 +13381,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-element-map": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", - "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", - "dev": true, - "dependencies": { - "array.prototype.filter": "^1.0.0", - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -13366,25 +13502,6 @@ "node": "*" } }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, "node_modules/http-assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", @@ -14699,12 +14816,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", - "dev": true - }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", @@ -18346,36 +18457,18 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, - "node_modules/lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", - "dev": true - }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "dev": true }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -19023,6 +19116,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/macos-release": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.3.0.tgz", @@ -19273,6 +19377,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/mini-css-extract-plugin": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", @@ -19358,12 +19472,6 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "optional": true }, - "node_modules/moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "dev": true - }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -19471,56 +19579,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/nearley": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "dev": true, - "dependencies": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6" - }, - "bin": { - "nearley-railroad": "bin/nearley-railroad.js", - "nearley-test": "bin/nearley-test.js", - "nearley-unparse": "bin/nearley-unparse.js", - "nearleyc": "bin/nearleyc.js" - }, - "funding": { - "type": "individual", - "url": "https://nearley.js.org/#give-to-nearley" - } - }, - "node_modules/nearley/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/nearley/node_modules/randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "dependencies": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/nearley/node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/needle": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", @@ -20095,22 +20153,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -20799,19 +20841,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -22789,21 +22818,6 @@ } ] }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", - "dev": true - }, "node_modules/ramda": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", @@ -23300,6 +23314,20 @@ "node": ">= 0.10" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reduce-flatten": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", @@ -24099,16 +24127,6 @@ "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "dev": true }, - "node_modules/rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==", - "dev": true, - "dependencies": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -25835,6 +25853,19 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", diff --git a/package.json b/package.json index 563cfeb8053..b6b42739b02 100644 --- a/package.json +++ b/package.json @@ -116,13 +116,14 @@ "@babel/preset-env": "=7.24.7", "@babel/preset-react": "=7.24.7", "@babel/register": "=7.23.7", - "@cfaester/enzyme-adapter-react-18": "=0.8.0", "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", "@jest/globals": "=29.7.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@release-it/conventional-changelog": "=8.0.1", "@svgr/webpack": "=8.1.0", + "@testing-library/jest-dom": "=6.6.3", + "@testing-library/react": "=16.0.1", "autoprefixer": "^10.4.19", "babel-loader": "^9.1.3", "babel-plugin-lodash": "=3.3.4", @@ -137,7 +138,6 @@ "cypress": "=13.13.0", "dedent": "^1.5.3", "deepmerge": "^4.3.1", - "enzyme": "=3.11.0", "eslint": "^8.57.0", "eslint-plugin-import": "^2.29.0", "eslint-plugin-jest": "^28.6.0", @@ -194,9 +194,6 @@ "overrides": { "@pmmmwh/react-refresh-webpack-plugin": { "webpack-dev-server": "$webpack-dev-server" - }, - "enzyme": { - "cheerio": "=1.0.0-rc.12" } }, "config": { diff --git a/src/core/components/online-validator-badge.jsx b/src/core/components/online-validator-badge.jsx index 0bc7e7ab7c5..97ee53bdc55 100644 --- a/src/core/components/online-validator-badge.jsx +++ b/src/core/components/online-validator-badge.jsx @@ -54,7 +54,7 @@ export default class OnlineValidatorBadge extends React.Component { } return ( - + ) diff --git a/src/core/components/operation-tag.jsx b/src/core/components/operation-tag.jsx index 9f8dcf46e99..95c56622877 100644 --- a/src/core/components/operation-tag.jsx +++ b/src/core/components/operation-tag.jsx @@ -76,6 +76,7 @@ export default class OperationTag extends React.Component { id={isShownKey.map(v => escapeDeepLinkPath(v)).join("-")} data-tag={tag} data-is-open={showTag} + data-testid="opblock-tag" > {filter === false ? null :
- + diff --git a/src/core/plugins/syntax-highlighting/components/HighlightCode.jsx b/src/core/plugins/syntax-highlighting/components/HighlightCode.jsx index f389f0b95ef..210e94a86c9 100644 --- a/src/core/plugins/syntax-highlighting/components/HighlightCode.jsx +++ b/src/core/plugins/syntax-highlighting/components/HighlightCode.jsx @@ -70,7 +70,7 @@ const HighlightCode = ({ {canCopy && (
-
)} diff --git a/test/unit/bugs/3199-sanitization-escaping.jsx b/test/unit/bugs/3199-sanitization-escaping.jsx index bc0127dcd34..83d1136051d 100644 --- a/test/unit/bugs/3199-sanitization-escaping.jsx +++ b/test/unit/bugs/3199-sanitization-escaping.jsx @@ -1,5 +1,5 @@ import React from "react" -import { render } from "enzyme" +import { render } from "@testing-library/react" import Markdown from "core/components/providers/markdown" describe("UI-3199: Sanitized Markdown causing code examples to be double escaped", function(){ @@ -13,9 +13,10 @@ describe("UI-3199: Sanitized Markdown causing code examples to be double escaped source: str } - let el = render() + const { container } = render() + const codeElement = container.querySelector("code") - expect(el.find("code").first().text()).toEqual("{\"abc\": \"def\"}\n") - expect(el.find("code").first().html()).toEqual("{\"abc\": \"def\"}\n") + expect(codeElement.textContent).toEqual("{\"abc\": \"def\"}\n") + expect(codeElement.innerHTML).toEqual("{\"abc\": \"def\"}\n") }) }) diff --git a/test/unit/bugs/3279-empty-markdown-source.jsx b/test/unit/bugs/3279-empty-markdown-source.jsx index 8267ebd9074..210a672de6e 100644 --- a/test/unit/bugs/3279-empty-markdown-source.jsx +++ b/test/unit/bugs/3279-empty-markdown-source.jsx @@ -1,5 +1,5 @@ import React from "react" -import { render } from "enzyme" +import { render } from "@testing-library/react" import Markdown from "core/components/providers/markdown" describe("UI-3279: Empty Markdown inputs causing bare `undefined` in output", function(){ @@ -10,7 +10,7 @@ describe("UI-3279: Empty Markdown inputs causing bare `undefined` in output", fu let el = render() - expect(el.text()).toEqual("") + expect(el.queryByText(/./)).toBeNull() }) it("should return no text for `undefined` as source input", function(){ @@ -20,7 +20,7 @@ describe("UI-3279: Empty Markdown inputs causing bare `undefined` in output", fu let el = render() - expect(el.text()).toEqual("") + expect(el.queryByText(/./)).toBeNull() }) it("should return no text for empty string as source input", function(){ @@ -30,6 +30,6 @@ describe("UI-3279: Empty Markdown inputs causing bare `undefined` in output", fu let el = render() - expect(el.text()).toEqual("") + expect(el.queryByText(/./)).toBeNull() }) }) diff --git a/test/unit/bugs/4557-default-parameter-values.jsx b/test/unit/bugs/4557-default-parameter-values.jsx index 1fea545c46e..143b0bb066c 100644 --- a/test/unit/bugs/4557-default-parameter-values.jsx +++ b/test/unit/bugs/4557-default-parameter-values.jsx @@ -3,7 +3,7 @@ */ import React from "react" import { List, fromJS } from "immutable" -import { render } from "enzyme" +import { render } from "@testing-library/react" import ParameterRow from "core/components/parameter-row" import { diff --git a/test/unit/components/filter.jsx b/test/unit/components/filter.jsx index caa85f0f4a7..7c7f6091018 100644 --- a/test/unit/components/filter.jsx +++ b/test/unit/components/filter.jsx @@ -1,10 +1,10 @@ import React from "react" -import { mount } from "enzyme" +import { render, screen } from "@testing-library/react" +import "@testing-library/jest-dom" import FilterContainer from "core/containers/filter" import { Col } from "core/components/layout-utils" describe("", function(){ - const mockedProps = { specSelectors: { loadingStatus() {} @@ -16,32 +16,30 @@ describe("", function(){ } it("renders FilterContainer if filter is provided", function(){ - - // Given - let props = {...mockedProps} - props.layoutSelectors = {...mockedProps.specSelectors} - props.layoutSelectors.currentFilter = function() {return true} + // Given + let props = {...mockedProps} + props.layoutSelectors = {...mockedProps.specSelectors} + props.layoutSelectors.currentFilter = function() {return true} // When - let wrapper = mount() + render() // Then - const renderedColInsideFilter = wrapper.find(Col) - expect(renderedColInsideFilter.length).toEqual(1) + const renderedColInsideFilter = screen.queryByTestId("filter-col") + expect(renderedColInsideFilter).toBeInTheDocument() }) it("does not render FilterContainer if filter is false", function(){ - // Given let props = {...mockedProps} props.layoutSelectors = {...mockedProps.specSelectors} props.layoutSelectors.currentFilter = function() {return false} // When - let wrapper = mount() + render() // Then - const renderedColInsideFilter = wrapper.find(Col) - expect(renderedColInsideFilter.length).toEqual(0) + const renderedColInsideFilter = screen.queryByTestId("filter-col") + expect(renderedColInsideFilter).not.toBeInTheDocument() }) -}) +}) \ No newline at end of file diff --git a/test/unit/components/highlight-code.jsx b/test/unit/components/highlight-code.jsx index 4186ab5caec..5e2c39487e6 100644 --- a/test/unit/components/highlight-code.jsx +++ b/test/unit/components/highlight-code.jsx @@ -1,6 +1,7 @@ +import { render,screen } from "@testing-library/react" +import "@testing-library/jest-dom" import React from "react" import expect from "expect" -import { shallow, mount } from "enzyme" import HighlightCode from "core/plugins/syntax-highlighting/components/HighlightCode" import SyntaxHighlighter from "core/plugins/syntax-highlighting/components/SyntaxHighlighter" @@ -21,23 +22,29 @@ const fakeGetComponent = (name, isContainer) => { describe("", () => { it("should render a Download button if downloadable", () => { const props = { downloadable: true, getConfigs: fakeGetConfigs, getComponent: fakeGetComponent } - const wrapper = shallow() - expect(wrapper.find(".download-contents").length).toEqual(1) + const { + container + } = render() + expect(container.querySelectorAll(".download-contents").length).toEqual(1) }) it("should render a Copy To Clipboard button if copyable", () => { const props = { canCopy: true, getConfigs: fakeGetConfigs, getComponent: fakeGetComponent } - const wrapper = shallow() - expect(wrapper.find("CopyToClipboard").length).toEqual(1) + render() + const copyButton = screen.queryByRole("button", { name: /copy/i }) + expect(copyButton).toBeInTheDocument() + }) it("should render values in a preformatted element", () => { const value = "test text" const props = { children: value , getConfigs: fakeGetConfigs, getComponent: fakeGetComponent } - const wrapper = mount() - const preTag = wrapper.find("pre") + const { + container + } = render() + const preTag = container.querySelectorAll("pre") expect(preTag.length).toEqual(1) - expect(preTag.text()).toEqual(value) + expect(preTag[0].textContent).toEqual(value) }) }) diff --git a/test/unit/components/info-wrapper.jsx b/test/unit/components/info-wrapper.jsx index 1b31d069988..e6b4c67a644 100644 --- a/test/unit/components/info-wrapper.jsx +++ b/test/unit/components/info-wrapper.jsx @@ -1,5 +1,5 @@ +import { render } from "@testing-library/react" import React from "react" -import { mount } from "enzyme" import { fromJS } from "immutable" import InfoContainer from "core/containers/info" @@ -30,10 +30,12 @@ describe("", function () { props.specSelectors.info = function () {return fromJS(["info1", "info2"])} // When - let wrapper = mount() + let { + container + } = render() // Then - const renderedInfo = wrapper.find("span.mocked-info") + const renderedInfo = container.querySelectorAll("span.mocked-info") expect(renderedInfo.length).toEqual(1) }) @@ -45,10 +47,12 @@ describe("", function () { props.specSelectors.info = function () {return fromJS([])} // When - let wrapper = mount() + let { + container + } = render() // Then - const renderedInfo = wrapper.find("span.mocked-info") + const renderedInfo = container.querySelectorAll("span.mocked-info") expect(renderedInfo.length).toEqual(0) }) @@ -58,10 +62,12 @@ describe("", function () { let props = {...mockedProps} // When - let wrapper = mount() + let { + container + } = render() // Then - const renderedInfo = wrapper.find("span.mocked-info") + const renderedInfo = container.querySelectorAll("span.mocked-info") expect(renderedInfo.length).toEqual(0) }) -}) +}) \ No newline at end of file diff --git a/test/unit/components/live-response.jsx b/test/unit/components/live-response.jsx index aed0aec96b3..7c194169252 100644 --- a/test/unit/components/live-response.jsx +++ b/test/unit/components/live-response.jsx @@ -1,9 +1,10 @@ import React from "react" +import { render, screen } from "@testing-library/react" +import "@testing-library/jest-dom" import { fromJSOrdered } from "core/utils" -import { shallow } from "enzyme" import Curl from "core/components/curl" -import LiveResponse from "core/components/live-response" import ResponseBody from "core/components/response-body" +import LiveResponse from "core/components/live-response" describe("", function(){ let request = fromJSOrdered({ @@ -35,9 +36,7 @@ describe("", function(){ tests.forEach(function(test) { it("passes " + test.expected.request + " to Curl when showMutatedRequest = " + test.showMutatedRequest, function() { - - // Given - +// Given let response = fromJSOrdered({ status: 200, url: "http://petstore.swagger.io/v2/pet/1", @@ -52,8 +51,8 @@ describe("", function(){ let requestForSpy = jest.fn().mockImplementation(function() { return request }) let components = { - curl: Curl, - responseBody: ResponseBody + curl: () =>
Mocked Curl
, + responseBody: () =>
Mocked ResponseBody
} let props = { @@ -69,33 +68,21 @@ describe("", function(){ displayRequestDuration: true, getConfigs: () => ({ showMutatedRequest: test.showMutatedRequest }) } + // When + render() - // When - let wrapper = shallow() - - // Then - expect(mutatedRequestForSpy.mock.calls.length).toEqual(test.expected.mutatedRequestForCalls) - expect(requestForSpy.mock.calls.length).toEqual(test.expected.requestForCalls) - - const curl = wrapper.find(Curl) - expect(curl.length).toEqual(1) - expect(curl.props().request).toBe(requests[test.expected.request]) - - const expectedUrl = requests[test.expected.request].get("url") - expect(wrapper.find("div.request-url pre.microlight").text()).toEqual(expectedUrl) + // Then + expect(mutatedRequestForSpy).toHaveBeenCalledTimes(test.expected.mutatedRequestForCalls) + expect(requestForSpy).toHaveBeenCalledTimes(test.expected.requestForCalls) - const duration = wrapper.find("Duration") - expect(duration.length).toEqual(1) - expect(duration.props().duration).toEqual(50) - expect(duration.html()) - .toEqual("
Request duration
50 ms
") + const expectedUrl = requests[test.expected.request].get("url") + expect(screen.getByText(expectedUrl)).toBeInTheDocument() - const responseHeaders = wrapper.find("Headers") - expect(duration.length).toEqual(1) - expect(responseHeaders.props().headers.length).toEqual(1) - expect(responseHeaders.props().headers[0].key).toEqual("content-type") - expect(responseHeaders.html()) - .toEqual("
Response headers
 content-type: application/xml 
") + + expect(screen.getByText(/50 ms/)).toBeInTheDocument() + const headersElement = screen.getByText(/content-type/i) + expect(headersElement).toBeInTheDocument() + expect(headersElement.textContent).toContain("application/xml") }) }) -}) +}) \ No newline at end of file diff --git a/test/unit/components/markdown.jsx b/test/unit/components/markdown.jsx index c4e72c9628d..8b2d908a113 100644 --- a/test/unit/components/markdown.jsx +++ b/test/unit/components/markdown.jsx @@ -1,5 +1,5 @@ +import { render } from "@testing-library/react" import React from "react" -import { render } from "enzyme" import Markdown from "core/components/providers/markdown" import { Markdown as OAS3Markdown } from "core/plugins/oas3/wrap-components/markdown.jsx" @@ -8,39 +8,51 @@ describe("Markdown component", function () { it("allows elements with class, style and data-* attribs", function () { const getConfigs = () => ({ useUnsafeMarkdown: true }) const str = `ONE` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

ONE

\n
`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

ONE

\n
`) }) it("strips class, style and data-* attribs from elements", function () { const getConfigs = () => ({ useUnsafeMarkdown: false }) const str = `ONE` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

ONE

\n
`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

ONE

\n
`) }) it("allows td elements with colspan attrib", function () { const str = `
ABC
` - const el = render() - expect(el.prop("outerHTML")).toEqual(`
ABC
`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`
ABC
`) }) it("allows image elements", function () { const str = `![Image alt text](http://image.source "Image title")` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

Image alt text

\n
`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

Image alt text

\n
`) }) it("allows image elements with https scheme", function () { const str = `![Image alt text](https://image.source "Image title")` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

Image alt text

\n
`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

Image alt text

\n
`) }) it("allows image elements with data scheme", function () { const str = `` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

` + str + `

\n
`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

` + str + `

\n
`) }) it("allows heading elements", function () { @@ -51,14 +63,18 @@ describe("Markdown component", function () { #### h4 ##### h5 ###### h6` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

h1

\n

h2

\n

h3

\n

h4

\n
h5
\n
h6
\n
`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

h1

\n

h2

\n

h3

\n

h4

\n
h5
\n
h6
\n
`) }) it("allows links", function () { const str = `[Link](https://example.com/)` - const el = render() - expect(el.prop("outerHTML")).toEqual(``) + const { + container + } = render() + expect(container.innerHTML).toEqual(``) }) }) @@ -66,33 +82,43 @@ describe("Markdown component", function () { it("allows elements with class, style and data-* attribs", function () { const getConfigs = () => ({ useUnsafeMarkdown: true }) const str = `ONE` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

ONE

`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

ONE

`) }) it("strips class, style and data-* attribs from elements", function () { const getConfigs = () => ({ useUnsafeMarkdown: false }) const str = `ONE` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

ONE

`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

ONE

`) }) it("allows image elements", function () { const str = `![Image alt text](http://image.source "Image title")` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

Image alt text

`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

Image alt text

`) }) it("allows image elements with https scheme", function () { const str = `![Image alt text](https://image.source "Image title")` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

Image alt text

`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

Image alt text

`) }) it("allows image elements with data scheme", function () { const str = `` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

` + str + `

`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

` + str + `

`) }) it("allows heading elements", function () { @@ -103,8 +129,10 @@ describe("Markdown component", function () { #### h4 ##### h5 ###### h6` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

h1

\n

h2

\n

h3

\n

h4

\n
h5
\n
h6
`) + const { + container + } = render() + expect(container.innerHTML).toEqual(`

h1

\n

h2

\n

h3

\n

h4

\n
h5
\n
h6
`) }) }) -}) +}) \ No newline at end of file diff --git a/test/unit/components/online-validator-badge.jsx b/test/unit/components/online-validator-badge.jsx index c900a3c45bd..8fee2e891a3 100644 --- a/test/unit/components/online-validator-badge.jsx +++ b/test/unit/components/online-validator-badge.jsx @@ -1,5 +1,6 @@ import React from "react" -import { mount } from "enzyme" +import { render, screen } from "@testing-library/react" +import "@testing-library/jest-dom" import OnlineValidatorBadge from "core/components/online-validator-badge" import expect from "expect" @@ -13,19 +14,18 @@ describe("", function () { url: () => "https://smartbear.com/swagger.json" } } - const wrapper = mount( - - ) - // Then - expect(wrapper.find("a").props().href).toEqual( + render( + ) + + const link = screen.getByRole("link", { name: /validator/i }) + expect(link).toHaveAttribute( + "href", "https://validator.swagger.io/validator/debug?url=https%3A%2F%2Fsmartbear.com%2Fswagger.json" ) - expect(wrapper.find("ValidatorImage").length).toEqual(1) }) - it("should encode a definition URL correctly", function () { - // When + it("should encode a definition URL correctly", () => { const props = { getConfigs: () => ({}), getComponent: () => null, @@ -33,18 +33,21 @@ describe("", function () { url: () => "http://google.com/swagger.json" } } - const wrapper = mount( + render( ) // Then - expect(wrapper.find("a").props().href).toEqual( + + const link = screen.getByRole("link", { name: /validator/i }) + expect(link).toHaveAttribute( + "href", "https://validator.swagger.io/validator/debug?url=http%3A%2F%2Fgoogle.com%2Fswagger.json" ) - expect(wrapper.find("ValidatorImage").length).toEqual(1) - expect(wrapper.find("ValidatorImage").props().src).toEqual( - "https://validator.swagger.io/validator?url=http%3A%2F%2Fgoogle.com%2Fswagger.json" - ) + + + const validatorElement = screen.getByLabelText("validator") + expect(validatorElement).toBeInTheDocument() }) it("should resolve a definition URL against the browser's location", function () { @@ -58,18 +61,19 @@ describe("", function () { url: () => "http://google.com/swagger.json" } } - const wrapper = mount( + render( ) - - // Then - expect(wrapper.find("a").props().href).toEqual( + + const link = screen.getByRole("link", { name: /validator/i }) + expect(link).toHaveAttribute( + "href", "https://validator.swagger.io/validator/debug?url=http%3A%2F%2Fgoogle.com%2Fswagger.json" ) - expect(wrapper.find("ValidatorImage").length).toEqual(1) - expect(wrapper.find("ValidatorImage").props().src).toEqual( - "https://validator.swagger.io/validator?url=http%3A%2F%2Fgoogle.com%2Fswagger.json" - ) + + + const validatorElement = screen.getByLabelText("validator") + expect(validatorElement).toBeInTheDocument() }) - // should resolve a definition URL against the browser's location -}) + // should resolve a definition URL against the browser's location +}) \ No newline at end of file diff --git a/test/unit/components/operation-tag.jsx b/test/unit/components/operation-tag.jsx index 0d1ba533ee7..59ad80265a8 100644 --- a/test/unit/components/operation-tag.jsx +++ b/test/unit/components/operation-tag.jsx @@ -1,20 +1,21 @@ import React from "react" -import { shallow } from "enzyme" +import { render } from "@testing-library/react" import OperationTag from "core/components/operation-tag" import Im from "immutable" import { Link } from "core/components/layout-utils" describe("", function(){ it("render externalDocs URL for swagger v2", function(){ - const dummyComponent = () => null const components = { Collapse: () => dummyComponent, Markdown: () => dummyComponent, DeepLink: () => dummyComponent, - Link + Link, + ArrowUpIcon: dummyComponent, + ArrowDownIcon: dummyComponent, } - + let props = { tagObj: Im.fromJS({ tagDetails: { @@ -36,18 +37,16 @@ describe("", function(){ }, show() { return true - } + }, } } - - let wrapper = shallow() - - const opblockTag = wrapper.find(".opblock-tag") - expect(opblockTag.length).toEqual(1) - expect(opblockTag.getElement().type).toEqual("h3") - - const renderedLink = wrapper.find("Link") - expect(renderedLink.length).toEqual(1) - expect(renderedLink.props().href).toEqual("http://swagger.io") + + const { getByTestId, getByText } = render() + + const opblockTag = getByTestId("opblock-tag") + expect(opblockTag.tagName).toBe("H3") + + const renderedLink = getByText("Find out more") + expect(renderedLink.getAttribute("href")).toBe("http://swagger.io") }) -}) +}) \ No newline at end of file diff --git a/test/unit/components/operation.jsx b/test/unit/components/operation.jsx index 18d7da49fb9..26694f37b3b 100644 --- a/test/unit/components/operation.jsx +++ b/test/unit/components/operation.jsx @@ -1,5 +1,5 @@ +import { render } from "@testing-library/react" import React from "react" -import { shallow } from "enzyme" import Operation from "core/components/operation" describe("", function(){ @@ -17,14 +17,16 @@ describe("", function(){ toggleCollapse: jest.fn() } - let wrapper = shallow() + let { + container + } = render() - expect(wrapper.find(".opblock").length).toEqual(1) - expect(wrapper.find(".opblock-summary-method").text()).toEqual("GET") - expect(wrapper.find(".opblock-summary-path").text().trim()).toEqual("/one") - expect(wrapper.find("[isOpened]").prop("isOpened")).toEqual(true) + expect(container.querySelectorAll(".opblock").length).toEqual(1) + expect(container.querySelectorAll(".opblock-summary-method").textContent).toEqual("GET") + expect(container.querySelectorAll(".opblock-summary-path").textContent.trim()).toEqual("/one") + expect(container.querySelectorAll("[isOpened]").prop("isOpened")).toEqual(true) - wrapper.find(".opblock-summary").simulate("click") + container.querySelectorAll(".opblock-summary").simulate("click") expect(props.toggleCollapse).toHaveBeenCalled() }) -}) +}) \ No newline at end of file diff --git a/test/unit/components/operations.jsx b/test/unit/components/operations.jsx index 0cbb648b7f2..5143836b1cd 100644 --- a/test/unit/components/operations.jsx +++ b/test/unit/components/operations.jsx @@ -1,5 +1,5 @@ +import { render } from "@testing-library/react" import React from "react" -import { render } from "enzyme" import { fromJS } from "immutable" import DeepLink from "core/components/deep-link" import Operations from "core/components/operations" @@ -63,10 +63,12 @@ describe("", function(){ } } - let wrapper = render() + let { + container + } = render() - expect(wrapper.find("span.mocked-op").length).toEqual(1) - expect(wrapper.find("span.mocked-op").eq(0).attr("id")).toEqual("/pets/{id}-get") + expect(container.querySelectorAll("span.mocked-op").length).toEqual(1) + expect(container.querySelectorAll("span.mocked-op")[0].id).toEqual("/pets/{id}-get") }) it("should render an OAS3 `get` and `trace` method, but not a `foo` method", function(){ @@ -119,10 +121,12 @@ describe("", function(){ } } - let wrapper = render() + let { + container + } = render() - expect(wrapper.find("span.mocked-op").length).toEqual(2) - expect(wrapper.find("span.mocked-op").eq(0).attr("id")).toEqual("/pets/{id}-get") - expect(wrapper.find("span.mocked-op").eq(1).attr("id")).toEqual("/pets/{id}-trace") + expect(container.querySelectorAll("span.mocked-op").length).toEqual(2) + expect(container.querySelectorAll("span.mocked-op")[0].id).toEqual("/pets/{id}-get") + expect(container.querySelectorAll("span.mocked-op")[1].id).toEqual("/pets/{id}-trace") }) -}) +}) \ No newline at end of file diff --git a/test/unit/components/parameter-row.jsx b/test/unit/components/parameter-row.jsx index bcf9e540a4d..b1f59fe8798 100644 --- a/test/unit/components/parameter-row.jsx +++ b/test/unit/components/parameter-row.jsx @@ -1,9 +1,9 @@ +import { render } from "@testing-library/react" /** * @prettier */ import React from "react" import { List, fromJS } from "immutable" -import { render } from "enzyme" import ParameterRow from "core/components/parameter-row" import { @@ -56,10 +56,12 @@ describe("", () => { }) const props = createProps({ param, isOAS3: false }) - const wrapper = render() + const { + container + } = render() - expect(wrapper.find(".parameter__type").length).toEqual(1) - expect(wrapper.find(".parameter__type").text()).toEqual("string($uuid)") + expect(container.querySelectorAll(".parameter__type").length).toEqual(1) + expect(container.querySelectorAll(".parameter__type")[0].textContent).toEqual("string($uuid)") }) it("Can render Swagger 2 parameter type without format", () => { @@ -71,10 +73,12 @@ describe("", () => { }) const props = createProps({ param, isOAS3: false }) - const wrapper = render() + const { + container + } = render() - expect(wrapper.find(".parameter__type").length).toEqual(1) - expect(wrapper.find(".parameter__type").text()).toEqual("string") + expect(container.querySelectorAll(".parameter__type").length).toEqual(1) + expect(container.querySelectorAll(".parameter__type")[0].textContent).toEqual("string") }) it("Can render Swagger 2 parameter type boolean without format", () => { @@ -86,10 +90,12 @@ describe("", () => { }) const props = createProps({ param, isOAS3: false }) - const wrapper = render() + const { + container + } = render() - expect(wrapper.find(".parameter__type").length).toEqual(1) - expect(wrapper.find(".parameter__type").text()).toEqual("boolean") + expect(container.querySelectorAll(".parameter__type").length).toEqual(1) + expect(container.querySelectorAll(".parameter__type")[0].textContent).toEqual("boolean") }) it("Can render OAS3 parameter type with format", () => { @@ -104,10 +110,12 @@ describe("", () => { }) const props = createProps({ param, isOAS3: true }) - const wrapper = render() + const { + container + } = render() - expect(wrapper.find(".parameter__type").length).toEqual(1) - expect(wrapper.find(".parameter__type").text()).toEqual("string($uuid)") + expect(container.querySelectorAll(".parameter__type").length).toEqual(1) + expect(container.querySelectorAll(".parameter__type")[0].textContent).toEqual("string($uuid)") }) it("Can render OAS3 parameter type without format", () => { @@ -121,10 +129,12 @@ describe("", () => { }) const props = createProps({ param, isOAS3: true }) - const wrapper = render() + const { + container + } = render() - expect(wrapper.find(".parameter__type").length).toEqual(1) - expect(wrapper.find(".parameter__type").text()).toEqual("string") + expect(container.querySelectorAll(".parameter__type").length).toEqual(1) + expect(container.querySelectorAll(".parameter__type")[0].textContent).toEqual("string") }) it("Can render OAS3 parameter type boolean without format", () => { @@ -138,10 +148,12 @@ describe("", () => { }) const props = createProps({ param, isOAS3: true }) - const wrapper = render() + const { + container + } = render() - expect(wrapper.find(".parameter__type").length).toEqual(1) - expect(wrapper.find(".parameter__type").text()).toEqual("boolean") + expect(container.querySelectorAll(".parameter__type").length).toEqual(1) + expect(container.querySelectorAll(".parameter__type")[0].textContent).toEqual("boolean") }) }) @@ -351,4 +363,4 @@ describe("bug #5573: zero default and example values", function () { expect(props.onChange).toHaveBeenCalled() expect(props.onChange).toHaveBeenCalledWith(paramValue, "0", false) }) -}) +}) \ No newline at end of file diff --git a/test/unit/components/response-body.jsx b/test/unit/components/response-body.jsx index bf80249f7bc..9f45c88f4be 100644 --- a/test/unit/components/response-body.jsx +++ b/test/unit/components/response-body.jsx @@ -1,10 +1,19 @@ +import { render ,screen} from "@testing-library/react" +import "@testing-library/jest-dom" import React from "react" -import { shallow } from "enzyme" import ResponseBody from "core/components/response-body" describe("", function () { + + // Mock component + const HighlightCode = ({ children, canCopy }) => ( +
+ {children} +
+ ) + const components = { - HighlightCode: () => null + HighlightCode } const props = { getComponent: c => components[c], @@ -13,35 +22,41 @@ describe("", function () { it("renders ResponseBody as 'application/json'", function () { props.contentType = "application/json" props.content = "{\"key\": \"a test value\"}" - const wrapper = shallow() - expect(wrapper.find("HighlightCode").length).toEqual(1) + render() + expect(screen.getByTestId("highlight-code")).toBeInTheDocument() }) it("renders ResponseBody as 'text/html'", function () { props.contentType = "application/json" props.content = "Result" - const wrapper = shallow() - expect(wrapper.find("HighlightCode").length).toEqual(1) + render() + expect(screen.getByTestId("highlight-code")).toBeInTheDocument() }) it("renders ResponseBody as 'image/svg'", function () { props.contentType = "image/svg" - const wrapper = shallow() - expect(wrapper.find("HighlightCode").length).toEqual(0) + const { + container + } = render() + expect(container.querySelectorAll("HighlightCode").length).toEqual(0) }) it("should render a copyable highlightCodeComponent for text types", function () { props.contentType = "text/plain" props.content = "test text" - const wrapper = shallow() - expect(wrapper.find("HighlightCode[canCopy]").length).toEqual(1) + render() + const copyableCode = screen.getByTestId("highlight-code") + expect(copyableCode).toBeInTheDocument() + expect(copyableCode).toHaveAttribute("data-cancopy") }) it("should render Download file link for non-empty Blob response", function () { props.contentType = "application/octet-stream" props.content = new Blob(["\"test\""], { type: props.contentType }) - const wrapper = shallow() - expect(wrapper.text()).toMatch(/Download file/) + const { + container + } = render() + expect(container.textContent).toMatch(/Download file/) }) it("should render Download file link for non-empty text response", function () { @@ -50,14 +65,18 @@ describe("", function () { props.headers = { "Content-Disposition": "attachment; filename=\"test.txt\"", } - const wrapper = shallow() - expect(wrapper.text()).toMatch(/Download file/) + const { + container + } = render() + expect(container.textContent).toMatch(/Download file/) }) it("should not render Download file link for empty response", function () { props.contentType = "application/octet-stream" props.content = new Blob() - const wrapper = shallow() - expect(wrapper.text()).not.toMatch(/Download file/) + const { + container + } = render() + expect(container.textContent).not.toMatch(/Download file/) }) }) diff --git a/test/unit/components/version-pragma-filter.jsx b/test/unit/components/version-pragma-filter.jsx index 2a08ea1cebc..4f48b90b82a 100644 --- a/test/unit/components/version-pragma-filter.jsx +++ b/test/unit/components/version-pragma-filter.jsx @@ -1,67 +1,77 @@ +import { render } from "@testing-library/react" import React from "react" -import { shallow } from "enzyme" import VersionPragmaFilter from "core/components/version-pragma-filter" describe("", function(){ it("renders children for a Swagger 2 definition", function(){ // When - let wrapper = shallow( + let { + container + } = render( hello! ) // Then - expect(wrapper.find("div").length).toEqual(1) - expect(wrapper.find("div").text()).toEqual("hello!") + expect(container.querySelectorAll("div").length).toEqual(1) + expect(container.querySelector("div").textContent).toEqual("hello!") }) it("renders children for an OpenAPI 3 definition", function(){ // When - let wrapper = shallow( + let { + container + } = render( hello! ) // Then - expect(wrapper.find("div").length).toEqual(1) - expect(wrapper.find("div").text()).toEqual("hello!") + expect(container.querySelectorAll("div").length).toEqual(1) + expect(container.querySelector("div").textContent).toEqual("hello!") }) it("renders children when a bypass prop is set", function(){ // When - let wrapper = shallow( + let { + container + } = render( hello! ) // Then - expect(wrapper.find("div").length).toEqual(1) - expect(wrapper.find("div").text()).toEqual("hello!") + expect(container.querySelectorAll("div").length).toEqual(1) + expect(container.querySelector("div").textContent).toEqual("hello!") }) it("renders the correct message for an ambiguous-version definition", function(){ // When - let wrapper = shallow( + let { + container + } = render( hello! ) // Then - expect(wrapper.find("div.version-pragma__message--ambiguous").length).toEqual(1) - expect(wrapper.find("div.version-pragma__message--missing").length).toEqual(0) + expect(container.querySelectorAll("div.version-pragma__message--ambiguous").length).toEqual(1) + expect(container.querySelectorAll("div.version-pragma__message--missing").length).toEqual(0) }) it("renders the correct message for a missing-version definition", function(){ // When - let wrapper = shallow( + let { + container + } = render( hello! ) // Then - expect(wrapper.find("div.version-pragma__message--missing").length).toEqual(1) - expect(wrapper.find("div.version-pragma__message--ambiguous").length).toEqual(0) + expect(container.querySelectorAll("div.version-pragma__message--missing").length).toEqual(1) + expect(container.querySelectorAll("div.version-pragma__message--ambiguous").length).toEqual(0) }) -}) +}) \ No newline at end of file diff --git a/test/unit/core/plugins/json-schema-5/components/json-schema-form.jsx b/test/unit/core/plugins/json-schema-5/components/json-schema-form.jsx index 488589dc724..940c2dfb8b3 100644 --- a/test/unit/core/plugins/json-schema-5/components/json-schema-form.jsx +++ b/test/unit/core/plugins/json-schema-5/components/json-schema-form.jsx @@ -1,7 +1,7 @@ import React from "react" import Immutable, { List } from "immutable" import { Select, Input, TextArea } from "core/components/layout-utils" -import { mount, render } from "enzyme" +import { render } from "@testing-library/react" import * as JsonSchemaComponents from "core/plugins/json-schema-5/components/json-schema-components" const components = {...JsonSchemaComponents, Select, Input, TextArea} @@ -30,11 +30,11 @@ describe("", function(){ let wrapper = render() - expect(wrapper.get(0).name).toEqual("select") - expect(wrapper.find("option").length).toEqual(3) - expect(wrapper.find("option").eq(0).text()).toEqual("--") - expect(wrapper.find("option").eq(1).text()).toEqual("one") - expect(wrapper.find("option").eq(2).text()).toEqual("two") + expect(wrapper.getByRole("combobox")).toBeInTheDocument() + expect(wrapper.getAllByRole("option").length).toEqual(3) + expect(wrapper.getByRole("option", { name: "--" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "one" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "two" })).toBeInTheDocument() }) it("should render a string enum as disabled when JsonSchemaForm is disabled", function(){ @@ -54,7 +54,7 @@ describe("", function(){ let wrapper = render() - expect(wrapper.attr("disabled")).toEqual("disabled") + expect(wrapper.getByRole("combobox")).toBeDisabled() }) @@ -75,10 +75,10 @@ describe("", function(){ let wrapper = render() - expect(wrapper.get(0).name).toEqual("select") - expect(wrapper.find("select option").length).toEqual(2) - expect(wrapper.find("select option").eq(0).text()).toEqual("one") - expect(wrapper.find("select option").eq(1).text()).toEqual("two") + expect(wrapper.getByRole("combobox")).toBeInTheDocument() + expect(wrapper.getAllByRole("option").length).toEqual(2) + expect(wrapper.getByRole("option", { name: "one" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "two" })).toBeInTheDocument() }) }) describe("booleans", function() { @@ -97,11 +97,11 @@ describe("", function(){ let wrapper = render() - expect(wrapper.get(0).name).toEqual("select") - expect(wrapper.find("select option").length).toEqual(3) - expect(wrapper.find("select option").eq(0).text()).toEqual("--") - expect(wrapper.find("select option").eq(1).text()).toEqual("true") - expect(wrapper.find("select option").eq(2).text()).toEqual("false") + expect(wrapper.getByRole("combobox")).toBeInTheDocument() + expect(wrapper.getAllByRole("option").length).toEqual(3) + expect(wrapper.getByRole("option", { name: "--" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "true" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "false" })).toBeInTheDocument() }) @@ -121,11 +121,11 @@ describe("", function(){ let wrapper = render() - expect(wrapper.get(0).name).toEqual("select") - expect(wrapper.find("select option").length).toEqual(2) - expect(wrapper.find("select option").eq(0).text()).toEqual("--") - expect(wrapper.find("select option").eq(1).text()).toEqual("true") - expect(wrapper.find("select option:checked").first().text()).toEqual("--") + expect(wrapper.getByRole("combobox")).toBeInTheDocument() + expect(wrapper.getAllByRole("option").length).toEqual(2) + expect(wrapper.getByRole("option", { name: "--" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "true" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "--" }).selected).toBe(true) }) it("should render the correct options for a required boolean parameter", function(){ @@ -144,12 +144,12 @@ describe("", function(){ let wrapper = render() - expect(wrapper.get(0).name).toEqual("select") - expect(wrapper.find("select option").length).toEqual(3) - expect(wrapper.find("select option").eq(0).text()).toEqual("--") - expect(wrapper.find("select option").eq(1).text()).toEqual("true") - expect(wrapper.find("select option").eq(2).text()).toEqual("false") - expect(wrapper.find("select option:checked").first().text()).toEqual("--") + expect(wrapper.getByRole("combobox")).toBeInTheDocument() + expect(wrapper.getAllByRole("option").length).toEqual(3) + expect(wrapper.getByRole("option", { name: "--" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "true" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "false" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "--" }).selected).toBe(true) }) it("should render the correct options for a required enum boolean parameter", function(){ @@ -169,10 +169,10 @@ describe("", function(){ let wrapper = render() - expect(wrapper.get(0).name).toEqual("select") - expect(wrapper.find("select option").length).toEqual(1) - expect(wrapper.find("select option").eq(0).text()).toEqual("true") - expect(wrapper.find("select option:checked").first().text()).toEqual("true") + expect(wrapper.getByRole("combobox")).toBeInTheDocument() + expect(wrapper.getAllByRole("option").length).toEqual(1) + expect(wrapper.getByRole("option", { name: "true" })).toBeInTheDocument() + expect(wrapper.getByRole("option", { name: "true" }).selected).toBe(true) }) }) describe("objects", function() { @@ -199,15 +199,15 @@ describe("", function(){ }) } - let wrapper = mount() + let wrapper = render() - updateQueue.forEach(newProps => wrapper.setProps(newProps)) + updateQueue.forEach(newProps => wrapper.rerender()) - expect(wrapper.find("textarea").length).toEqual(1) - expect(wrapper.find("textarea").text()).toEqual(`{\n "id": "abc123"\n}`) + expect(wrapper.getByRole("textbox")).toBeInTheDocument() + expect(wrapper.getByRole("textbox").value).toEqual(`{\n "id": "abc123"\n}`) }) }) - describe("unknown types", function() { + describe.only("unknown types", function() { it("should render unknown types as strings", function(){ let props = { @@ -224,8 +224,8 @@ describe("", function(){ let wrapper = render() - expect(wrapper.length).toEqual(1) - expect(wrapper.get(0).name).toEqual("input") + expect(wrapper.getByRole("textbox")).toBeInTheDocument() + expect(wrapper.getByRole("textbox").value).toEqual("yo") // expect(wrapper.find("select input").length).toEqual(1) // expect(wrapper.find("select option").first().text()).toEqual("true") }) @@ -247,8 +247,8 @@ describe("", function(){ let wrapper = render() - expect(wrapper.length).toEqual(1) - expect(wrapper.get(0).name).toEqual("input") + expect(wrapper.getByRole("textbox")).toBeInTheDocument() + expect(wrapper.getByRole("textbox").value).toEqual("yo") // expect(wrapper.find("select input").length).toEqual(1) // expect(wrapper.find("select option").first().text()).toEqual("true") }) diff --git a/test/unit/core/plugins/json-schema-5/components/model-example.jsx b/test/unit/core/plugins/json-schema-5/components/model-example.jsx index 737be87af9b..36e31ea83da 100644 --- a/test/unit/core/plugins/json-schema-5/components/model-example.jsx +++ b/test/unit/core/plugins/json-schema-5/components/model-example.jsx @@ -1,5 +1,5 @@ import React from "react" -import { shallow } from "enzyme" +import { render } from "@testing-library/react" import ModelExample from "core/plugins/json-schema-5/components/model-example" import ModelComponent from "core/plugins/json-schema-5/components/model-wrapper" @@ -20,7 +20,8 @@ describe("", function(){ beforeEach(() => { components = { - ModelWrapper: ModelComponent + ModelWrapper: ModelComponent, + Model: ({expandDepth}) =>
, } props = { @@ -43,20 +44,20 @@ describe("", function(){ it("renders model and example tabs", function(){ // When - let wrapper = shallow() + let wrapper = render() // Then should render tabs - expect(wrapper.find("div > ul.tab").length).toEqual(1) + expect(wrapper.getByRole("tablist")).toBeInTheDocument() - let tabs = wrapper.find("div > ul.tab").children() + let tabs = wrapper.getAllByRole("tab") expect(tabs.length).toEqual(2) tabs.forEach((node) => { - expect(node.length).toEqual(1) - expect(node.name()).toEqual("li") - expect(node.hasClass("tabitem")).toEqual(true) + expect(node).toBeInTheDocument() + expect(node.tagName).toEqual("BUTTON") + expect(node).toHaveClass("tablinks") }) - expect(tabs.at(0).text()).toEqual("Example Value") - expect(tabs.at(1).text()).toEqual("Model") + expect(tabs[0]).toHaveTextContent("Example Value") + expect(tabs[1]).toHaveTextContent("Model") }) exampleSelectedTestInputs.forEach(function(testInputs) { @@ -67,18 +68,18 @@ describe("", function(){ defaultModelRendering: testInputs.defaultModelRendering, defaultModelExpandDepth: 1 }) - let wrapper = shallow() + let wrapper = render() // Then - let tabs = wrapper.find("div > ul.tab").children() + let tabs = wrapper.getAllByRole("tab") - let exampleTab = tabs.at(0) - expect(exampleTab.hasClass("active")).toEqual(true) - let modelTab = tabs.at(1) - expect(modelTab.hasClass("active")).toEqual(false) + let exampleTab = tabs[0] + expect(exampleTab.parentElement).toHaveClass("active") + let modelTab = tabs[1] + expect(modelTab.parentElement).not.toHaveClass("active") - expect(wrapper.find("div > div").length).toEqual(1) - expect(wrapper.find("div > div").text()).toEqual(props.example) + expect(wrapper.getByRole("tabpanel")).toBeInTheDocument() + expect(wrapper.getByRole("tabpanel")).toHaveTextContent(props.example) }) }) @@ -90,18 +91,18 @@ describe("", function(){ defaultModelRendering: testInputs.defaultModelRendering, defaultModelExpandDepth: 1 }) - let wrapper = shallow() + let wrapper = render() // Then - let tabs = wrapper.find("div > ul.tab").children() + let tabs = wrapper.getAllByRole("tab") - let exampleTab = tabs.at(0) - expect(exampleTab.hasClass("active")).toEqual(false) - let modelTab = tabs.at(1) - expect(modelTab.hasClass("active")).toEqual(true) + let exampleTab = tabs[0] + expect(exampleTab.parentElement).not.toHaveClass("active") + let modelTab = tabs[1] + expect(modelTab.parentElement).toHaveClass("active") - expect(wrapper.find("div > div").length).toEqual(1) - expect(wrapper.find("div > div").find(ModelComponent).props().expandDepth).toBe(1) + expect(wrapper.getByRole("tabpanel")).toBeInTheDocument() + expect(wrapper.getByRole("tabpanel").querySelector("[data-expand-depth='1']")).toBeInTheDocument() }) }) @@ -113,10 +114,10 @@ describe("", function(){ defaultModelRendering: "model", defaultModelExpandDepth: expandDepth }) - let wrapper = shallow() + let wrapper = render() // Then - expect(wrapper.find("div > div").find(ModelComponent).props().expandDepth).toBe(expandDepth) + expect(wrapper.getByRole("tabpanel").querySelector("[data-expand-depth='0']")).toBeInTheDocument() }) }) diff --git a/test/unit/core/plugins/json-schema-5/components/models.jsx b/test/unit/core/plugins/json-schema-5/components/models.jsx index 3203f486376..6f65b3a2613 100644 --- a/test/unit/core/plugins/json-schema-5/components/models.jsx +++ b/test/unit/core/plugins/json-schema-5/components/models.jsx @@ -1,17 +1,20 @@ import React from "react" -import { shallow } from "enzyme" +import { render } from "@testing-library/react" import { fromJS, Map } from "immutable" import Models from "core/plugins/json-schema-5/components/models" -import ModelCollapse from "core/plugins/json-schema-5/components/model-collapse" -import ModelComponent from "core/plugins/json-schema-5/components/model-wrapper" describe("", function(){ - const dummyComponent = () => null + const makeDummyComponent = (name) => + ({children, expandDepth}) =>
{children}
// Given let components = { - Collapse: ModelCollapse, - ModelWrapper: ModelComponent, - JumpToPath: dummyComponent, + Collapse: makeDummyComponent("Collapse"), + ModelWrapper: makeDummyComponent("ModelWrapper"), + JumpToPath: makeDummyComponent("JumpToPath"), + Model: makeDummyComponent("Model"), + ModelCollapse: makeDummyComponent("ModelCollapse"), + ArrowUpIcon: makeDummyComponent("ArrowUpIcon"), + ArrowDownIcon: makeDummyComponent("ArrowDownIcon") } let props = { getComponent: (c) => { @@ -31,7 +34,9 @@ describe("", function(){ layoutSelectors: { isShown: jest.fn() }, - layoutActions: {}, + layoutActions: { + readyToScroll: jest.fn() + }, getConfigs: () => ({ docExpansion: "list", defaultModelsExpandDepth: 0 @@ -41,13 +46,13 @@ describe("", function(){ it("passes defaultModelsExpandDepth to ModelWrapper", function(){ // When - let wrapper = shallow() + const { getAllByTestId } = render() // Then should render tabs - expect(wrapper.find("ModelCollapse").length).toEqual(1) - expect(wrapper.find("ModelWrapper").length).toBeGreaterThan(0) - wrapper.find("ModelComponent").forEach((modelWrapper) => { - expect(modelWrapper.props().expandDepth).toBe(0) + expect(getAllByTestId("Collapse").length).toEqual(1) + expect(getAllByTestId("ModelWrapper").length).toBeGreaterThan(0) + getAllByTestId("ModelWrapper").forEach((modelWrapper) => { + expect(modelWrapper.getAttribute("data-expand-depth")).toBe("0") }) }) diff --git a/test/unit/core/plugins/json-schema-5/components/object-model.jsx b/test/unit/core/plugins/json-schema-5/components/object-model.jsx index 9f4c5f72382..4dd69b5d22e 100644 --- a/test/unit/core/plugins/json-schema-5/components/object-model.jsx +++ b/test/unit/core/plugins/json-schema-5/components/object-model.jsx @@ -1,5 +1,5 @@ import React from "react" -import { shallow } from "enzyme" +import { render } from "@testing-library/react" import { List } from "immutable" import ObjectModel from "core/plugins/json-schema-5/components/object-model" // import ModelExample from "core/components/model-example" @@ -9,6 +9,12 @@ import ModelCollapse from "core/plugins/json-schema-5/components/model-collapse" import Property from "core/components/property" // import { inferSchema } from "core/plugins/samples/fn" +jest.mock("core/plugins/json-schema-5/components/model-collapse", () => ({children}) =>
{children}
) +jest.mock("core/plugins/json-schema-5/components/model", () => + ({ schema }) =>
+) +jest.mock("core/components/property", () => ({propKey, propVal}) =>
) + describe("", function() { const dummyComponent = () => null const components = { @@ -63,47 +69,47 @@ describe("", function() { } it("renders a collapsible header", function(){ - const wrapper = shallow() - const renderedModelCollapse = wrapper.find(ModelCollapse) - expect(renderedModelCollapse.length).toEqual(1) + const { queryAllByTestId } = render() + expect(queryAllByTestId("model-collapse").length).toEqual(1) }) it("renders the object properties in order", function() { - const wrapper = shallow() - const renderedModel = wrapper.find(Model) + const { queryAllByTestId } = render() + const renderedModel = queryAllByTestId("model") expect(renderedModel.length).toEqual(3) - expect(renderedModel.get(0).props.schema.get("name")).toEqual("c") - expect(renderedModel.get(1).props.schema.get("name")).toEqual("b") - expect(renderedModel.get(2).props.schema.get("name")).toEqual("a") + expect(renderedModel[0].getAttribute("data-name")).toEqual("c") + expect(renderedModel[1].getAttribute("data-name")).toEqual("b") + expect(renderedModel[2].getAttribute("data-name")).toEqual("a") + }) it("doesn't render `nullable` for model when it absent", function() { - const wrapper = shallow() - const renderProperties = wrapper.find(Property) - expect(renderProperties.length).toEqual(0) + const { queryAllByTestId } = render() + const renderedProperties = queryAllByTestId("property") + expect(renderedProperties.length).toEqual(0) }) it("renders `nullable` for model", function() { - const wrapper = shallow() - const renderProperties = wrapper.find(Property) - expect(renderProperties.length).toEqual(1) - expect(renderProperties.get(0).props.propKey).toEqual("nullable") - expect(renderProperties.get(0).props.propVal).toEqual(true) + const { queryAllByTestId } = render() + const renderedProperties = queryAllByTestId("property") + expect(renderedProperties.length).toEqual(1) + expect(renderedProperties[0].getAttribute("data-propkey")).toEqual("nullable") + expect(renderedProperties[0].getAttribute("data-propval")).toEqual("true") }) it("doesn't render `minProperties` and `maxProperties` if they are absent", function() { - const wrapper = shallow() - const renderProperties = wrapper.find(Property) - expect(renderProperties.length).toEqual(0) + const { queryAllByTestId } = render() + const renderedProperties = queryAllByTestId("property") + expect(renderedProperties.length).toEqual(0) }) it("renders `minProperties` and `maxProperties` if they are defined", function() { - const wrapper = shallow() - const renderProperties = wrapper.find(Property) + const { queryAllByTestId } = render() + const renderProperties = queryAllByTestId("property") expect(renderProperties.length).toEqual(2) - expect(renderProperties.get(0).props.propKey).toEqual("minProperties") - expect(renderProperties.get(0).props.propVal).toEqual(1) - expect(renderProperties.get(1).props.propKey).toEqual("maxProperties") - expect(renderProperties.get(1).props.propVal).toEqual(5) + expect(renderProperties[0].getAttribute("data-propkey")).toEqual("minProperties") + expect(renderProperties[0].getAttribute("data-propval")).toEqual("1") + expect(renderProperties[1].getAttribute("data-propkey")).toEqual("maxProperties") + expect(renderProperties[1].getAttribute("data-propval")).toEqual("5") }) }) diff --git a/test/unit/core/plugins/json-schema-5/components/primitive-model.jsx b/test/unit/core/plugins/json-schema-5/components/primitive-model.jsx index 6fd3d529b2b..c0d293dc6a8 100644 --- a/test/unit/core/plugins/json-schema-5/components/primitive-model.jsx +++ b/test/unit/core/plugins/json-schema-5/components/primitive-model.jsx @@ -1,9 +1,21 @@ import React from "react" -import { shallow } from "enzyme" +import { render } from "@testing-library/react" import { fromJS } from "immutable" import PrimitiveModel from "core/plugins/json-schema-5/components/primitive-model" import ModelCollapse from "core/plugins/json-schema-5/components/model-collapse" +jest.mock( + "core/plugins/json-schema-5/components/model-collapse", + () => ({ children, title }) => ( +
+
+ {title} +
+ {children} +
+ ) +) + describe("", function () { const dummyComponent = () => null const components = { @@ -28,10 +40,11 @@ describe("", function () { it("renders the schema's title", function () { // When - const wrapper = shallow() - const modelTitleEl = wrapper.find("ModelCollapse").prop("title").props.children.props.children - - expect(modelTitleEl).toEqual("Custom model title") + const { getByTestId } = render() + const renderedModelCollapse = getByTestId("model-collapse") + const renderedModelCollapseTitle = getByTestId("model-collapse-title") + expect(renderedModelCollapse).toContainElement(renderedModelCollapseTitle) + expect(renderedModelCollapseTitle).toHaveTextContent("Custom model title") }) it("falls back to the passed-in `name` prop for the title", function () { @@ -39,17 +52,17 @@ describe("", function () { props.schema = fromJS({ type: "string" }) - const wrapper = shallow() - const modelTitleEl = wrapper.find("ModelCollapse").prop("title").props.children.props.children - - // Then - expect(modelTitleEl).toEqual("Name from props") - + const { getByTestId } = render() + const renderedModelCollapse = getByTestId("model-collapse") + const renderedModelCollapseTitle = getByTestId("model-collapse-title") + expect(renderedModelCollapse).toContainElement(renderedModelCollapseTitle) + expect(renderedModelCollapseTitle).toHaveTextContent("Name from props") }) it("renders a collapsible header", function(){ - const wrapper = shallow() - const renderedModelCollapse = wrapper.find(ModelCollapse) - expect(renderedModelCollapse.length).toEqual(1) + const { getByTestId } = render() + const renderedModelCollapse = getByTestId("model-collapse") + + expect(renderedModelCollapse).toBeInTheDocument() }) }) diff --git a/test/unit/core/plugins/json-schema-5/components/response.jsx b/test/unit/core/plugins/json-schema-5/components/response.jsx index f5eed6a0edb..545fedd9b70 100644 --- a/test/unit/core/plugins/json-schema-5/components/response.jsx +++ b/test/unit/core/plugins/json-schema-5/components/response.jsx @@ -2,7 +2,7 @@ * @prettier */ import React from "react" -import { shallow } from "enzyme" +import { render } from "@testing-library/react" import { fromJS, List } from "immutable" import Response from "core/components/response" @@ -17,6 +17,10 @@ import makeGetJsonSampleSchema from "core/plugins/json-schema-5-samples/fn/get-j import makeGetYamlSampleSchema from "core/plugins/json-schema-5-samples/fn/get-yaml-sample-schema" import makeGetXmlSampleSchema from "core/plugins/json-schema-5-samples/fn/get-xml-sample-schema" +jest.mock("core/plugins/json-schema-5/components/model-example", () => jest.fn(() => null)) + +const MockModelExample = jest.requireMock("core/plugins/json-schema-5/components/model-example") + describe("", function () { const dummyComponent = () => null const components = { @@ -26,6 +30,14 @@ describe("", function () { Markdown: dummyComponent, operationLink: dummyComponent, contentType: dummyComponent, + ResponseExtension: dummyComponent, + Headers: dummyComponent, + HighlightCode: dummyComponent, + ModelExample: dummyComponent, + OperationLink: dummyComponent, + ContentType: dummyComponent, + ExamplesSelect: dummyComponent, + Example: dummyComponent, } const getSystem = () => ({ getComponent: (c) => components[c], @@ -73,14 +85,15 @@ describe("", function () { } it("renders the model-example schema properties in order", function () { - const wrapper = shallow() - const renderedModelExample = wrapper.find(ModelExample) + MockModelExample.mockImplementation( + ({ schema }) =>
+ ) + + const wrapper = render() + const renderedModelExample = wrapper.queryAllByTestId("model-example") expect(renderedModelExample.length).toEqual(1) // Assert the schema's properties have maintained their order - const modelExampleSchemaProperties = renderedModelExample - .props() - .schema.toJS().properties - expect(Object.keys(modelExampleSchemaProperties)).toEqual(["c", "b", "a"]) + expect(renderedModelExample[0].getAttribute("data-schema-props")).toEqual("c,b,a") }) }) diff --git a/test/unit/core/plugins/json-schema-5/components/schemes-wrapper.jsx b/test/unit/core/plugins/json-schema-5/components/schemes-wrapper.jsx index 55352232286..4f45d95c202 100644 --- a/test/unit/core/plugins/json-schema-5/components/schemes-wrapper.jsx +++ b/test/unit/core/plugins/json-schema-5/components/schemes-wrapper.jsx @@ -1,9 +1,12 @@ import React from "react" -import { mount } from "enzyme" +import { render } from "@testing-library/react" import { fromJS } from "immutable" import SchemesContainer from "core/plugins/json-schema-5/containers/schemes" import Schemes from "core/plugins/json-schema-5/components/schemes" import { Col } from "core/components/layout-utils" +import { jest } from "@jest/globals" + +jest.mock("core/plugins/json-schema-5/components/schemes", () => () =>
) describe("", function(){ @@ -23,22 +26,6 @@ describe("", function(){ }, getComponent: c => components[c] } - const twoSecurityDefinitions = { - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - }, - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - } - } it("renders Schemes inside SchemesContainer if schemes are provided", function(){ @@ -49,11 +36,10 @@ describe("", function(){ props.specSelectors.schemes = function() {return fromJS(["http", "https"])} // When - let wrapper = mount() + const { queryByTestId } = render() // Then - const renderedSchemes = wrapper.find(Schemes) - expect(renderedSchemes.length).toEqual(1) + expect(queryByTestId("schemes")).toBeInTheDocument() }) it("does not render Schemes inside SchemeWrapper if empty array of schemes is provided", function(){ @@ -64,11 +50,10 @@ describe("", function(){ props.specSelectors.schemes = function() {return fromJS([])} // When - let wrapper = mount() + const { queryByTestId } = render() // Then - const renderedSchemes = wrapper.find(Schemes) - expect(renderedSchemes.length).toEqual(0) + expect(queryByTestId("schemes")).not.toBeInTheDocument() }) it("does not render Schemes inside SchemeWrapper if provided schemes are undefined", function(){ @@ -79,10 +64,9 @@ describe("", function(){ props.specSelectors.schemes = function() {return undefined} // When - let wrapper = mount() + const { queryByTestId } = render() // Then - const renderedSchemes = wrapper.find(Schemes) - expect(renderedSchemes.length).toEqual(0) + expect(queryByTestId("schemes")).not.toBeInTheDocument() }) }) diff --git a/test/unit/core/plugins/json-schema-5/components/schemes.jsx b/test/unit/core/plugins/json-schema-5/components/schemes.jsx index 9709419a765..b384d216dc4 100644 --- a/test/unit/core/plugins/json-schema-5/components/schemes.jsx +++ b/test/unit/core/plugins/json-schema-5/components/schemes.jsx @@ -1,5 +1,5 @@ import React from "react" -import { shallow } from "enzyme" +import { render } from "@testing-library/react" import { fromJS } from "immutable" import Schemes from "core/plugins/json-schema-5/components/schemes" @@ -23,7 +23,7 @@ describe("", function(){ } // When - let wrapper = shallow() + let wrapper = render() // Then currentScheme should default to first scheme in options list expect(props.specActions.setScheme).toHaveBeenCalledWith("http", "/test" , "get") @@ -32,7 +32,7 @@ describe("", function(){ props.schemes = fromJS([ "https" ]) - wrapper.setProps(props) + wrapper.rerender() // Then currentScheme should default to first scheme in options list, again expect(props.specActions.setScheme).toHaveBeenCalledWith("https", "/test", "get") @@ -55,13 +55,13 @@ describe("", function(){ } // When - let wrapper = shallow() + let wrapper = render() // Should be called initially, to set the global state expect(setSchemeSpy.mock.calls.length).toEqual(1) // After an update - wrapper.instance().UNSAFE_componentWillReceiveProps(props) + wrapper.rerender() // Should not be called again, since `currentScheme` is in schemes expect(setSchemeSpy.mock.calls.length).toEqual(1) diff --git a/test/unit/core/plugins/oas3/servers-wrapper.jsx b/test/unit/core/plugins/oas3/servers-wrapper.jsx index 7eb6724c061..e9a3465cdc6 100644 --- a/test/unit/core/plugins/oas3/servers-wrapper.jsx +++ b/test/unit/core/plugins/oas3/servers-wrapper.jsx @@ -1,10 +1,12 @@ - import React from "react" -import { mount } from "enzyme" +import { render } from "@testing-library/react" import { fromJS } from "immutable" import ServersContainer from "core/plugins/oas3/components/servers-container" import Servers from "core/plugins/oas3/components/servers" import { Col } from "core/components/layout-utils" +import { jest } from "@jest/globals" + +jest.mock("core/plugins/oas3/components/servers", () => () =>
) describe("", function(){ @@ -38,11 +40,10 @@ describe("", function(){ props.oas3Selectors.selectedServer = function() {return "http://server1.com"} // When - let wrapper = mount() + const { queryByTestId } = render() // Then - const renderedServers = wrapper.find(Servers) - expect(renderedServers.length).toEqual(1) + expect(queryByTestId("servers")).toBeInTheDocument() }) it("does not render Servers inside ServersContainer if servers are empty", function(){ @@ -53,11 +54,10 @@ describe("", function(){ props.specSelectors.servers = function() {return fromJS([])} // When - let wrapper = mount() + const { queryByTestId } = render() // Then - const renderedServers = wrapper.find(Servers) - expect(renderedServers.length).toEqual(0) + expect(queryByTestId("servers")).not.toBeInTheDocument() }) it("does not render Servers inside ServersContainer if servers are undefined", function(){ @@ -66,10 +66,9 @@ describe("", function(){ let props = {...mockedProps} // When - let wrapper = mount() + const { queryByTestId } = render() // Then - const renderedServers = wrapper.find(Servers) - expect(renderedServers.length).toEqual(0) + expect(queryByTestId("servers")).not.toBeInTheDocument() }) }) diff --git a/test/unit/core/plugins/oas31/components/version-pragma-filter.jsx b/test/unit/core/plugins/oas31/components/version-pragma-filter.jsx index b85b657c2b8..de99a393e1f 100644 --- a/test/unit/core/plugins/oas31/components/version-pragma-filter.jsx +++ b/test/unit/core/plugins/oas31/components/version-pragma-filter.jsx @@ -1,84 +1,79 @@ import React from "react" -import { shallow } from "enzyme" +import { render } from "@testing-library/react" import VersionPragmaFilter from "core/plugins/oas31/components/version-pragma-filter" describe("", function(){ it("renders children for a Swagger 2 definition", function(){ // When - let wrapper = shallow( + const { getByText } = render( hello! ) // Then - expect(wrapper.find("div").length).toEqual(1) - expect(wrapper.find("div").text()).toEqual("hello!") + expect(getByText("hello!")).toBeInTheDocument() }) it("renders children for an OpenAPI 3.0.x definition", function(){ // When - let wrapper = shallow( + const { getByText } = render( hello! ) // Then - expect(wrapper.find("div").length).toEqual(1) - expect(wrapper.find("div").text()).toEqual("hello!") + expect(getByText("hello!")).toBeInTheDocument() }) it("renders children for an OpenAPI 3.1.0 definition", function(){ // When - let wrapper = shallow( + const { getByText } = render( hello! ) // Then - expect(wrapper.find("div").length).toEqual(1) - expect(wrapper.find("div").text()).toEqual("hello!") + expect(getByText("hello!")).toBeInTheDocument() }) it("renders children when a bypass prop is set", function(){ // When - let wrapper = shallow( + const { getByText } = render( hello! ) // Then - expect(wrapper.find("div").length).toEqual(1) - expect(wrapper.find("div").text()).toEqual("hello!") + expect(getByText("hello!")).toBeInTheDocument() }) it("renders the correct message for an ambiguous-version definition", function(){ // When - let wrapper = shallow( + const { container } = render( hello! ) // Then - expect(wrapper.find("div.version-pragma__message--ambiguous").length).toEqual(1) - expect(wrapper.find("div.version-pragma__message--missing").length).toEqual(0) + expect(container.querySelector("div.version-pragma__message--ambiguous")).toBeInTheDocument() + expect(container.querySelector("div.version-pragma__message--missing")).not.toBeInTheDocument() }) it("renders the correct message for a missing-version definition", function(){ // When - let wrapper = shallow( + const { container } = render( hello! ) // Then - expect(wrapper.find("div.version-pragma__message--missing").length).toEqual(1) - expect(wrapper.find("div.version-pragma__message--ambiguous").length).toEqual(0) + expect(container.querySelector("div.version-pragma__message--missing")).toBeInTheDocument() + expect(container.querySelector("div.version-pragma__message--ambiguous")).not.toBeInTheDocument() }) - }) diff --git a/test/unit/core/plugins/safe-render/index.jsx b/test/unit/core/plugins/safe-render/index.jsx index 34d2c69394a..12dc1e17bb6 100644 --- a/test/unit/core/plugins/safe-render/index.jsx +++ b/test/unit/core/plugins/safe-render/index.jsx @@ -1,9 +1,7 @@ import React from "react" -import { mount } from "enzyme" -import sinon from "sinon" +import { render, screen } from "@testing-library/react" import { Provider } from "react-redux" import noop from "lodash/noop" - import System from "core/system" import ViewPlugin from "core/plugins/view" import SafeRenderPlugin from "core/plugins/safe-render" @@ -18,7 +16,7 @@ describe("safe-render", function() { it("should catch errors thrown inside of React Component class render method", function() { class BrokenComponent extends React.Component { render() { - return null + throw new Error("broken") } } const BrokenComponentPlugin = () => { @@ -42,16 +40,14 @@ describe("safe-render", function() { }) const SafeBrokenComponent = system.getSystem().getComponent("BrokenComponent") - const wrapper = mount() - wrapper.find(BrokenComponent).simulateError(new Error("error")) - - expect(wrapper.text()).toEqual("😱 Could not render BrokenComponent, see the console.") + const {container} = render() + expect(container).toHaveTextContent("😱 Could not render BrokenComponent, see the console.") }) it("should catch errors thrown inside of PureComponent class render method", function() { class BrokenComponent extends React.PureComponent { render() { - return null + throw new Error("broken") } } const BrokenComponentPlugin = () => { @@ -75,14 +71,12 @@ describe("safe-render", function() { }) const SafeBrokenComponent = system.getSystem().getComponent("BrokenComponent") - const wrapper = mount() - wrapper.find(BrokenComponent).simulateError(new Error("error")) - - expect(wrapper.text()).toEqual("😱 Could not render BrokenComponent, see the console.") + const {container} = render() + expect(container).toHaveTextContent("😱 Could not render BrokenComponent, see the console.") }) it("should catch errors thrown inside of function component", function() { - const BrokenComponent = () => null + const BrokenComponent = () => { throw new Error("broken") } const BrokenComponentPlugin = () => { return { components: { @@ -104,16 +98,14 @@ describe("safe-render", function() { }) const SafeBrokenComponent = system.getSystem().getComponent("BrokenComponent") - const wrapper = mount() - wrapper.find(BrokenComponent).simulateError(new Error("error")) - - expect(wrapper.text()).toEqual("😱 Could not render BrokenComponent, see the console.") + const {container} = render() + expect(container).toHaveTextContent("😱 Could not render BrokenComponent, see the console.") }) it("should catch errors thrown inside of container created from React Component class", function() { class BrokenComponent extends React.Component { render() { - return null + throw new Error("broken") } } const BrokenComponentPlugin = () => { @@ -137,18 +129,16 @@ describe("safe-render", function() { }) const SafeBrokenComponent = system.getSystem().getComponent("BrokenComponent", true) - const wrapper = mount( + const {container} = render( ) - wrapper.find(BrokenComponent).simulateError(new Error("error")) - - expect(wrapper.text()).toEqual("😱 Could not render BrokenComponent, see the console.") + expect(container).toHaveTextContent("😱 Could not render BrokenComponent, see the console.") }) it("should catch errors thrown inside of container created from function component", function() { - const BrokenComponent = () => null + const BrokenComponent = () => { throw new Error("broken") } const BrokenComponentPlugin = () => { return { components: { @@ -170,18 +160,16 @@ describe("safe-render", function() { }) const SafeBrokenComponent = system.getSystem().getComponent("BrokenComponent", true) - const wrapper = mount( + const {container} = render( ) - wrapper.find(BrokenComponent).simulateError(new Error("error")) - - expect(wrapper.text()).toEqual("😱 Could not render BrokenComponent, see the console.") + expect(container).toHaveTextContent("😱 Could not render BrokenComponent, see the console.") }) it("should render custom Fallback component", function() { - const BrokenComponent = () => null + const BrokenComponent = () => { throw new Error("broken") } const BrokenComponentPlugin = () => { return { components: { @@ -209,15 +197,13 @@ describe("safe-render", function() { }) const SafeBrokenComponent = system.getSystem().getComponent("BrokenComponent") - const wrapper = mount() - wrapper.find(BrokenComponent).simulateError(new Error("error")) - - expect(wrapper.text()).toEqual("fallback component") + const {container} = render() + expect(container).toHaveTextContent("fallback component") }) it("should call custom componentDidCatch hook", function() { - const BrokenComponent = () => null - const componentDidCatch = sinon.spy() + const BrokenComponent = () => { throw new Error("broken") } + const componentDidCatch = jest.fn() const BrokenComponentPlugin = () => { return { @@ -245,9 +231,7 @@ describe("safe-render", function() { }) const SafeBrokenComponent = system.getSystem().getComponent("BrokenComponent") - const wrapper = mount() - wrapper.find(BrokenComponent).simulateError(new Error("error")) - - expect(componentDidCatch.calledOnce).toBe(true) + render() + expect(componentDidCatch).toHaveBeenCalled() }) }) diff --git a/test/unit/core/system/system.jsx b/test/unit/core/system/system.jsx index 507983bc1df..1a21eac6e60 100644 --- a/test/unit/core/system/system.jsx +++ b/test/unit/core/system/system.jsx @@ -1,6 +1,6 @@ import React, { PureComponent } from "react" import { fromJS } from "immutable" -import { render, mount } from "enzyme" +import { render } from "@testing-library/react" import { Provider } from "react-redux" import System from "core/system" @@ -479,8 +479,8 @@ describe("bound system", function(){ // When let Component = system.getSystem().getComponent("test") - const renderedComponent = render() - expect(renderedComponent.text()).toEqual("Test component") + const { getByText } = render() + expect(getByText("Test component")).toBeInTheDocument() }) it("allows container components to provide their own `mapStateToProps` function", function() { @@ -525,14 +525,14 @@ describe("bound system", function(){ // When let Component = system.getSystem().getComponent("ContainerComponent", true) - const renderedComponent = render( + const { getByText } = render( ) // Then - expect(renderedComponent.text()).toEqual("This came from mapStateToProps and this came from the system and this came from my own props") + expect(getByText("This came from mapStateToProps and this came from the system and this came from my own props")).toBeInTheDocument() }) it("gives the system and own props as props to a container's `mapStateToProps` function", function() { @@ -578,14 +578,14 @@ describe("bound system", function(){ // When let Component = system.getSystem().getComponent("ContainerComponent", true) - const renderedComponent = render( + const { getByText } = render( ) // Then - expect(renderedComponent.text()).toEqual("This came from mapStateToProps and this came from the system and this came from my own props") + expect(getByText("This came from mapStateToProps and this came from the system and this came from my own props")).toBeInTheDocument() }) }) diff --git a/test/unit/core/system/wrapComponent.jsx b/test/unit/core/system/wrapComponent.jsx index 8a5522e7f40..b15906f12bf 100644 --- a/test/unit/core/system/wrapComponent.jsx +++ b/test/unit/core/system/wrapComponent.jsx @@ -1,6 +1,6 @@ import React from "react" -import { render } from "enzyme" +import { render } from "@testing-library/react" import System from "core/system" describe("wrapComponents", () => { @@ -31,12 +31,10 @@ describe("wrapComponents", () => { let Component = system.getSystem().getComponents("wow") const wrapper = render() - expect(wrapper.get(0).name).toEqual("container") - - const children = wrapper.children() - expect(children.length).toEqual(2) - expect(children.eq(0).text()).toEqual("Normal component") - expect(children.eq(1).text()).toEqual("Wrapped component") + expect(wrapper.container.firstChild.nodeName).toEqual("CONTAINER") + expect(wrapper.container.firstChild.children.length).toEqual(2) + expect(wrapper.container.firstChild.children[0].textContent).toEqual("Normal component") + expect(wrapper.container.firstChild.children[1].textContent).toEqual("Wrapped component") }) it("with React classes", function () { @@ -75,12 +73,10 @@ describe("wrapComponents", () => { let Component = system.getSystem().getComponents("wow") const wrapper = render() - expect(wrapper.get(0).name).toEqual("container") - - const children = wrapper.children() - expect(children.length).toEqual(2) - expect(children.eq(0).text()).toEqual("Normal component") - expect(children.eq(1).text()).toEqual("Wrapped component") + expect(wrapper.container.firstChild.nodeName).toEqual("CONTAINER") + expect(wrapper.container.firstChild.children.length).toEqual(2) + expect(wrapper.container.firstChild.children[0].textContent).toEqual("Normal component") + expect(wrapper.container.firstChild.children[1].textContent).toEqual("Wrapped component") }) }) @@ -126,12 +122,12 @@ describe("wrapComponents", () => { let Component = mySystem.getSystem().getComponents("wow") const wrapper = render() - expect(wrapper.get(0).name).toEqual("container") + expect(wrapper.container.firstChild.nodeName).toEqual("CONTAINER") - const children = wrapper.children() + const children = wrapper.container.firstChild.children expect(children.length).toEqual(2) - expect(children.eq(0).text()).toEqual("Original component") - expect(children.eq(1).text()).toEqual("WOW much data") + expect(children[0].textContent).toEqual("Original component") + expect(children[1].textContent).toEqual("WOW much data") }) it("should wrap correctly when registering more plugins", function () { @@ -179,12 +175,12 @@ describe("wrapComponents", () => { let Component = mySystem.getSystem().getComponents("wow") const wrapper = render() - expect(wrapper.get(0).name).toEqual("container") + expect(wrapper.container.firstChild.nodeName).toEqual("CONTAINER") - const children = wrapper.children() + const children = wrapper.container.firstChild.children expect(children.length).toEqual(2) - expect(children.eq(0).text()).toEqual("Original component") - expect(children.eq(1).text()).toEqual("WOW much data") + expect(children[0].textContent).toEqual("Original component") + expect(children[1].textContent).toEqual("WOW much data") }) it("should wrap component correctly when performing subsequent plugin registering targeting the same component", function () { @@ -234,19 +230,19 @@ describe("wrapComponents", () => { let Component = mySystem.getSystem().getComponents("wow") const wrapper = render() - expect(wrapper.get(0).name).toEqual("container2") + expect(wrapper.container.firstChild.nodeName).toEqual("CONTAINER2") - const children2 = wrapper.children() + const children2 = wrapper.container.firstChild.children expect(children2.length).toEqual(2) - expect(children2[0].name).toEqual("div") - expect(children2.eq(0).text()).toEqual("Injected before") - expect(children2[1].name).toEqual("container1") + expect(children2[0].nodeName).toEqual("DIV") + expect(children2[0].textContent).toEqual("Injected before") + expect(children2[1].nodeName).toEqual("CONTAINER1") - const children1 = children2.children() + const children1 = children2[1].children expect(children1.length).toEqual(2) - expect(children1.eq(0).text()).toEqual("Original component") - expect(children1[0].name).toEqual("div") - expect(children1.eq(1).text()).toEqual("Injected after") + expect(children1[0].textContent).toEqual("Original component") + expect(children1[0].nodeName).toEqual("DIV") + expect(children1[1].textContent).toEqual("Injected after") }) it("should wrap correctly when building a system twice", function () { @@ -294,11 +290,11 @@ describe("wrapComponents", () => { let Component = secondSystem.getSystem().getComponents("wow") const wrapper = render() - expect(wrapper.get(0).name).toEqual("container") + expect(wrapper.container.firstChild.nodeName).toEqual("CONTAINER") - const children = wrapper.children() + const children = wrapper.container.firstChild.children expect(children.length).toEqual(2) - expect(children.eq(0).text()).toEqual("Original component") - expect(children.eq(1).text()).toEqual("WOW much data") + expect(children[0].textContent).toEqual("Original component") + expect(children[1].textContent).toEqual("WOW much data") }) }) diff --git a/test/unit/setup.js b/test/unit/setup.js index 711d5bac1f5..157979ad438 100644 --- a/test/unit/setup.js +++ b/test/unit/setup.js @@ -1,10 +1,8 @@ import { JSDOM } from "jsdom" -import Enzyme from "enzyme" -const { default: Adapter } = require("@cfaester/enzyme-adapter-react-18") +import "@testing-library/jest-dom" import win from "../../src/core/window" -Enzyme.configure({ adapter: new Adapter() }) function copyProps(src, target) { const props = Object.getOwnPropertyNames(src) @@ -37,5 +35,3 @@ function setUpDomEnvironment() { } setUpDomEnvironment() - -// configure({ adapter: new Adapter() }) // enzyme@3 diff --git a/test/unit/xss/anchor-target-rel/info.jsx b/test/unit/xss/anchor-target-rel/info.jsx index fc3f88bcfa6..262ace1affb 100644 --- a/test/unit/xss/anchor-target-rel/info.jsx +++ b/test/unit/xss/anchor-target-rel/info.jsx @@ -1,5 +1,5 @@ import React from "react" -import { render } from "enzyme" +import { render } from "@testing-library/react" import { fromJS } from "immutable" import Info, { InfoUrl } from "core/components/info" import Contact from "core/components/contact" @@ -32,13 +32,13 @@ describe(" Anchor Target Safety", function(){ url: "http://google.com/" }) } - let wrapper = render() - const anchor = wrapper.find("a") + const { getByRole } = render() + const anchor = getByRole("link") - expect(anchor.html()).toEqual("http://google.com/") - expect(anchor.attr("target")).toEqual("_blank") - expect(anchor.attr("rel") || "").toMatch("noopener") - expect(anchor.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://google.com/") + expect(anchor).toHaveAttribute("target", "_blank") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) it("renders Contact links with safe `rel` attributes", function () { @@ -51,13 +51,13 @@ describe(" Anchor Target Safety", function(){ } }) } - let wrapper = render() - const anchor = wrapper.find("a") + const { getByRole } = render() + const anchor = getByRole("link") - expect(anchor.attr("href")).toEqual("http://google.com/") - expect(anchor.attr("target")).toEqual("_blank") - expect(anchor.attr("rel") || "").toMatch("noopener") - expect(anchor.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://google.com/") + expect(anchor).toHaveAttribute("target", "_blank") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) it("renders License links with safe `rel` attributes", function () { @@ -69,13 +69,13 @@ describe(" Anchor Target Safety", function(){ } }) } - let wrapper = render() - const anchor = wrapper.find("a") + const { getByRole } = render() + const anchor = getByRole("link") - expect(anchor.attr("href")).toEqual("http://mit.edu/") - expect(anchor.attr("target")).toEqual("_blank") - expect(anchor.attr("rel") || "").toMatch("noopener") - expect(anchor.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://mit.edu/") + expect(anchor).toHaveAttribute("target", "_blank") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) it("renders termsOfService links with safe `rel` attributes", function () { @@ -85,13 +85,13 @@ describe(" Anchor Target Safety", function(){ termsOfService: "http://smartbear.com/" }) } - let wrapper = render() - const anchor = wrapper.find("a") + const { getByRole } = render() + const anchor = getByRole("link") - expect(anchor.attr("href")).toEqual("http://smartbear.com/") - expect(anchor.attr("target")).toEqual("_blank") - expect(anchor.attr("rel") || "").toMatch("noopener") - expect(anchor.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://smartbear.com/") + expect(anchor).toHaveAttribute("target", "_blank") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) it("renders definition URL links with safe `rel` attributes", function () { @@ -99,12 +99,12 @@ describe(" Anchor Target Safety", function(){ ...baseProps, url: "http://petstore.swagger.io/v2/petstore.json" } - let wrapper = render() - const anchor = wrapper.find("a") + const { getByRole } = render() + const anchor = getByRole("link") - expect(anchor.attr("href")).toEqual("http://petstore.swagger.io/v2/petstore.json") - expect(anchor.attr("target")).toEqual("_blank") - expect(anchor.attr("rel") || "").toMatch("noopener") - expect(anchor.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://petstore.swagger.io/v2/petstore.json") + expect(anchor).toHaveAttribute("target", "_blank") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) }) diff --git a/test/unit/xss/anchor-target-rel/link.jsx b/test/unit/xss/anchor-target-rel/link.jsx index 7c032c19b6d..3246b95b7cb 100644 --- a/test/unit/xss/anchor-target-rel/link.jsx +++ b/test/unit/xss/anchor-target-rel/link.jsx @@ -1,5 +1,5 @@ import React from "react" -import { render } from "enzyme" +import { render } from "@testing-library/react" import { Link } from "core/components/layout-utils" describe(" Anchor Target Safety", function () { @@ -16,11 +16,12 @@ describe(" Anchor Target Safety", function () { ...baseProps, href: "http://google.com/" } - let wrapper = render() + const { getByRole } = render() + const anchor = getByRole("link") - expect(wrapper.attr("href")).toEqual("http://google.com/") - expect(wrapper.attr("rel") || "").toMatch("noopener") - expect(wrapper.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://google.com/") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) it("enforces `noreferrer` and `noopener` on target=_blank links", function () { @@ -29,11 +30,12 @@ describe(" Anchor Target Safety", function () { href: "http://google.com/", target: "_blank" } - let wrapper = render() + const { getByRole } = render() + const anchor = getByRole("link") - expect(wrapper.attr("href")).toEqual("http://google.com/") - expect(wrapper.attr("target")).toEqual("_blank") - expect(wrapper.attr("rel") || "").toMatch("noopener") - expect(wrapper.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://google.com/") + expect(anchor).toHaveAttribute("target", "_blank") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) }) diff --git a/test/unit/xss/anchor-target-rel/markdown.jsx b/test/unit/xss/anchor-target-rel/markdown.jsx index 362861ae6c0..d59edffcdfe 100644 --- a/test/unit/xss/anchor-target-rel/markdown.jsx +++ b/test/unit/xss/anchor-target-rel/markdown.jsx @@ -1,5 +1,5 @@ import React from "react" -import { render } from "enzyme" +import { render } from "@testing-library/react" import Markdown from "core/components/providers/markdown" import { Markdown as OAS3Markdown } from "core/plugins/oas3/wrap-components/markdown.jsx" @@ -7,58 +7,50 @@ describe("Markdown Link Anchor Safety", function () { describe("Swagger 2.0", function () { it("sanitizes Markdown links", function () { const str = `Hello, [here](http://google.com/) is my link` - const wrapper = render() + const { getByText } = render() - const anchor = wrapper.find("a") + const anchor = getByText("here").closest("a") - expect(anchor.attr("href")).toEqual("http://google.com/") - expect(anchor.attr("target")).toEqual("_blank") - expect(anchor.attr("rel") || "").toMatch("noopener") - expect(anchor.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://google.com/") + expect(anchor).toHaveAttribute("target", "_blank") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) it("sanitizes raw HTML links", function () { const str = `Hello, here is my link` - const wrapper = render() + const { getByText } = render() - const anchor = wrapper.find("a") + const anchor = getByText("here").closest("a") - expect(anchor.attr("href")).toEqual("http://google.com/") - expect(anchor.attr("rel") || "").toMatch("noopener") - expect(anchor.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://google.com/") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) }) describe("OAS 3", function () { it("sanitizes Markdown links", function () { const str = `Hello, [here](http://google.com/) is my link` - const wrapper = render() + const { getByText } = render() - const anchor = wrapper.find("a") + const anchor = getByText("here").closest("a") - expect(anchor.attr("href")).toEqual("http://google.com/") - expect(anchor.attr("target")).toEqual("_blank") - expect(anchor.attr("rel") || "").toMatch("noopener") - expect(anchor.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://google.com/") + expect(anchor).toHaveAttribute("target", "_blank") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) it("sanitizes raw HTML links", function () { const str = `Hello, here is my link` - const wrapper = render() + const { getByText } = render() - const anchor = wrapper.find("a") + const anchor = getByText("here").closest("a") - expect(anchor.attr("href")).toEqual("http://google.com/") - expect(anchor.attr("rel") || "").toMatch("noopener") - expect(anchor.attr("rel") || "").toMatch("noreferrer") + expect(anchor).toHaveAttribute("href", "http://google.com/") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) }) }) - -function withMarkdownWrapper(str, { isOAS3 = false } = {}) { - if(isOAS3) { - return `

${str}

` - } - - return `

${str}

\n
` -} diff --git a/test/unit/xss/anchor-target-rel/online-validator-badge.jsx b/test/unit/xss/anchor-target-rel/online-validator-badge.jsx index 856a850f2af..d87972ed489 100644 --- a/test/unit/xss/anchor-target-rel/online-validator-badge.jsx +++ b/test/unit/xss/anchor-target-rel/online-validator-badge.jsx @@ -1,5 +1,5 @@ import React from "react" -import { mount } from "enzyme" +import { render } from "@testing-library/react" import OnlineValidatorBadge from "core/components/online-validator-badge" describe(" Anchor Target Safety", function () { @@ -12,18 +12,19 @@ describe(" Anchor Target Safety", function () { url: () => "https://smartbear.com/swagger.json" } } - const wrapper = mount( + const { getByRole } = render( ) - const anchor = wrapper.find("a") + const anchor = getByRole("link") // Then - expect(anchor.props().href).toEqual( + expect(anchor).toHaveAttribute( + "href", "https://validator.swagger.io/validator/debug?url=https%3A%2F%2Fsmartbear.com%2Fswagger.json" ) - expect(anchor.props().target).toEqual("_blank") - expect(anchor.props().rel || "").toContain("noopener") - expect(anchor.props().rel || "").toContain("noreferrer") + expect(anchor).toHaveAttribute("target", "_blank") + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noopener")) + expect(anchor).toHaveAttribute("rel", expect.stringContaining("noreferrer")) }) }) diff --git a/test/unit/xss/info-sanitization.jsx b/test/unit/xss/info-sanitization.jsx index 718e202d059..f531041f022 100644 --- a/test/unit/xss/info-sanitization.jsx +++ b/test/unit/xss/info-sanitization.jsx @@ -1,5 +1,5 @@ import React from "react" -import { render } from "enzyme" +import { render } from "@testing-library/react" import { fromJS } from "immutable" import Info from "core/components/info" import Markdown from "core/components/providers/markdown" @@ -21,12 +21,12 @@ describe(" Sanitization", function(){ } it("renders sanitized .title content", function(){ - let wrapper = render() - expect(wrapper.find(".title").html()).toEqual("Test Title **strong** <script>alert(1)</script>") + const { container } = render() + expect(container.querySelector(".title").innerHTML).toEqual("Test Title **strong** <script>alert(1)</script>") }) it("renders sanitized .description content", function() { - let wrapper = render() - expect(wrapper.find(".description").html()).toEqual("

Description with

\n
") + const { container } = render() + expect(container.querySelector(".description").innerHTML).toEqual("

Description with

\n
") }) }) diff --git a/test/unit/xss/markdown-script-sanitization.jsx b/test/unit/xss/markdown-script-sanitization.jsx index 34ff2e24340..3336cef5838 100644 --- a/test/unit/xss/markdown-script-sanitization.jsx +++ b/test/unit/xss/markdown-script-sanitization.jsx @@ -1,5 +1,5 @@ import React from "react" -import { render } from "enzyme" +import { render } from "@testing-library/react" import Markdown from "core/components/providers/markdown" import { Markdown as OAS3Markdown } from "core/plugins/oas3/wrap-components/markdown.jsx" @@ -7,40 +7,40 @@ describe("Markdown Script Sanitization", function() { describe("Swagger 2.0", function() { it("sanitizes ` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

script

\n
`) + const { container } = render() + expect(container.querySelector(".markdown").outerHTML).toEqual(`

script

\n
`) }) it("sanitizes elements", function() { const str = `` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

\n
`) + const { container } = render() + expect(container.querySelector(".markdown").outerHTML).toEqual(`

\n
`) }) it("sanitizes
elements", function() { const str = `""` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

"

"

\n
`) + const { container } = render() + expect(container.querySelector(".markdown").outerHTML).toEqual(`

"

"

\n
`) }) }) describe("OAS 3", function() { it("sanitizes ` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

script

`) + const { container } = render() + expect(container.querySelector(".renderedMarkdown").outerHTML).toEqual(`

script

`) }) it("sanitizes elements", function() { const str = `` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

`) + const { container } = render() + expect(container.querySelector(".renderedMarkdown").outerHTML).toEqual(`

`) }) it("sanitizes elements", function () { const str = `""` - const el = render() - expect(el.prop("outerHTML")).toEqual(`

"

"

`) + const { container } = render() + expect(container.querySelector(".renderedMarkdown").outerHTML).toEqual(`

"

"

`) }) }) })