refactor(frontend): migrate 6 tests from Enzyme to RTL (#30151)
Signed-off-by: hainenber <dotronghai96@gmail.com> Co-authored-by: JUST.in DO IT <justin.park@airbnb.com>
This commit is contained in:
parent
bdf29cb7c2
commit
e9094659d3
|
|
@ -12542,6 +12542,8 @@
|
|||
},
|
||||
"node_modules/@testing-library/jest-dom": {
|
||||
"version": "5.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz",
|
||||
"integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@adobe/css-tools": "^4.0.1",
|
||||
|
|
@ -12582,6 +12584,7 @@
|
|||
"version": "12.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz",
|
||||
"integrity": "sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.12.5",
|
||||
"@testing-library/dom": "^8.0.0",
|
||||
|
|
@ -16615,6 +16618,7 @@
|
|||
},
|
||||
"node_modules/array.prototype.filter": {
|
||||
"version": "1.0.3",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -16664,6 +16668,7 @@
|
|||
},
|
||||
"node_modules/array.prototype.flat": {
|
||||
"version": "1.3.2",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -16709,6 +16714,7 @@
|
|||
},
|
||||
"node_modules/arraybuffer.prototype.slice": {
|
||||
"version": "1.0.3",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"array-buffer-byte-length": "^1.0.1",
|
||||
|
|
@ -18648,6 +18654,7 @@
|
|||
},
|
||||
"node_modules/cheerio": {
|
||||
"version": "1.0.0-rc.12",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cheerio-select": "^2.1.0",
|
||||
|
|
@ -18667,6 +18674,7 @@
|
|||
},
|
||||
"node_modules/cheerio-select": {
|
||||
"version": "2.1.0",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"boolbase": "^1.0.0",
|
||||
|
|
@ -20248,6 +20256,7 @@
|
|||
},
|
||||
"node_modules/css-select": {
|
||||
"version": "5.1.0",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"boolbase": "^1.0.0",
|
||||
|
|
@ -21988,6 +21997,7 @@
|
|||
},
|
||||
"node_modules/discontinuous-range": {
|
||||
"version": "1.0.0",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/distributions": {
|
||||
|
|
@ -22056,6 +22066,7 @@
|
|||
},
|
||||
"node_modules/dom-serializer": {
|
||||
"version": "2.0.0",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"domelementtype": "^2.3.0",
|
||||
|
|
@ -22085,6 +22096,7 @@
|
|||
},
|
||||
"node_modules/domhandler": {
|
||||
"version": "5.0.3",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"domelementtype": "^2.3.0"
|
||||
|
|
@ -22098,6 +22110,7 @@
|
|||
},
|
||||
"node_modules/domutils": {
|
||||
"version": "3.1.0",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"dom-serializer": "^2.0.0",
|
||||
|
|
@ -22441,6 +22454,7 @@
|
|||
},
|
||||
"node_modules/enzyme": {
|
||||
"version": "3.11.0",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"array.prototype.flat": "^1.2.3",
|
||||
|
|
@ -22528,6 +22542,7 @@
|
|||
},
|
||||
"node_modules/enzyme-shallow-equal": {
|
||||
"version": "1.0.5",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"has": "^1.0.3",
|
||||
|
|
@ -22554,6 +22569,7 @@
|
|||
},
|
||||
"node_modules/enzyme/node_modules/object-inspect": {
|
||||
"version": "1.12.3",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
|
|
@ -22584,6 +22600,7 @@
|
|||
},
|
||||
"node_modules/es-abstract": {
|
||||
"version": "1.22.4",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"array-buffer-byte-length": "^1.0.1",
|
||||
|
|
@ -22637,6 +22654,7 @@
|
|||
},
|
||||
"node_modules/es-abstract/node_modules/object-inspect": {
|
||||
"version": "1.13.1",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
|
|
@ -22644,6 +22662,7 @@
|
|||
},
|
||||
"node_modules/es-array-method-boxes-properly": {
|
||||
"version": "1.0.0",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/es-define-property": {
|
||||
|
|
@ -22719,6 +22738,7 @@
|
|||
},
|
||||
"node_modules/es-set-tostringtag": {
|
||||
"version": "2.0.2",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.2",
|
||||
|
|
@ -22731,6 +22751,7 @@
|
|||
},
|
||||
"node_modules/es-shim-unscopables": {
|
||||
"version": "1.0.2",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"hasown": "^2.0.0"
|
||||
|
|
@ -22738,6 +22759,7 @@
|
|||
},
|
||||
"node_modules/es-to-primitive": {
|
||||
"version": "1.2.1",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"is-callable": "^1.1.4",
|
||||
|
|
@ -25814,6 +25836,7 @@
|
|||
},
|
||||
"node_modules/function.prototype.name": {
|
||||
"version": "1.1.6",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -26177,6 +26200,7 @@
|
|||
},
|
||||
"node_modules/get-symbol-description": {
|
||||
"version": "1.0.2",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.5",
|
||||
|
|
@ -26670,6 +26694,7 @@
|
|||
},
|
||||
"node_modules/globalthis": {
|
||||
"version": "1.0.3",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"define-properties": "^1.1.3"
|
||||
|
|
@ -27622,6 +27647,7 @@
|
|||
},
|
||||
"node_modules/html-element-map": {
|
||||
"version": "1.3.1",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"array.prototype.filter": "^1.0.0",
|
||||
|
|
@ -27757,6 +27783,7 @@
|
|||
},
|
||||
"node_modules/htmlparser2": {
|
||||
"version": "8.0.2",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
"https://github.com/fb55/htmlparser2?sponsor=1",
|
||||
{
|
||||
|
|
@ -28858,6 +28885,7 @@
|
|||
},
|
||||
"node_modules/is-negative-zero": {
|
||||
"version": "2.0.2",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
|
|
@ -29012,6 +29040,7 @@
|
|||
},
|
||||
"node_modules/is-subset": {
|
||||
"version": "0.1.1",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/is-symbol": {
|
||||
|
|
@ -29081,6 +29110,7 @@
|
|||
},
|
||||
"node_modules/is-weakref": {
|
||||
"version": "1.0.2",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2"
|
||||
|
|
@ -33515,10 +33545,12 @@
|
|||
},
|
||||
"node_modules/lodash.escape": {
|
||||
"version": "4.0.1",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.flattendeep": {
|
||||
"version": "4.4.0",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.get": {
|
||||
|
|
@ -39379,6 +39411,7 @@
|
|||
},
|
||||
"node_modules/moo": {
|
||||
"version": "0.4.3",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/mousetrap": {
|
||||
|
|
@ -39548,6 +39581,7 @@
|
|||
},
|
||||
"node_modules/nearley": {
|
||||
"version": "2.18.0",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"commander": "^2.19.0",
|
||||
|
|
@ -41104,6 +41138,7 @@
|
|||
},
|
||||
"node_modules/object.entries": {
|
||||
"version": "1.1.6",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -41183,6 +41218,7 @@
|
|||
},
|
||||
"node_modules/object.values": {
|
||||
"version": "1.1.7",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -42086,6 +42122,7 @@
|
|||
},
|
||||
"node_modules/parse5-htmlparser2-tree-adapter": {
|
||||
"version": "7.0.0",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"domhandler": "^5.0.2",
|
||||
|
|
@ -42244,6 +42281,7 @@
|
|||
},
|
||||
"node_modules/performance-now": {
|
||||
"version": "2.1.0",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/periscopic": {
|
||||
|
|
@ -43690,6 +43728,7 @@
|
|||
},
|
||||
"node_modules/raf": {
|
||||
"version": "3.4.1",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"performance-now": "^2.1.0"
|
||||
|
|
@ -43697,6 +43736,7 @@
|
|||
},
|
||||
"node_modules/railroad-diagrams": {
|
||||
"version": "1.0.0",
|
||||
"dev": true,
|
||||
"license": "CC0-1.0"
|
||||
},
|
||||
"node_modules/ramda": {
|
||||
|
|
@ -43706,6 +43746,7 @@
|
|||
},
|
||||
"node_modules/randexp": {
|
||||
"version": "0.4.6",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"discontinuous-range": "1.0.0",
|
||||
|
|
@ -47249,6 +47290,7 @@
|
|||
},
|
||||
"node_modules/ret": {
|
||||
"version": "0.1.15",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.12"
|
||||
|
|
@ -47460,6 +47502,7 @@
|
|||
},
|
||||
"node_modules/rst-selector-parser": {
|
||||
"version": "2.2.3",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"dependencies": {
|
||||
"lodash.flattendeep": "^4.4.0",
|
||||
|
|
@ -47544,6 +47587,7 @@
|
|||
},
|
||||
"node_modules/safe-array-concat": {
|
||||
"version": "1.1.0",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.5",
|
||||
|
|
@ -47560,6 +47604,7 @@
|
|||
},
|
||||
"node_modules/safe-array-concat/node_modules/isarray": {
|
||||
"version": "2.0.5",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/safe-buffer": {
|
||||
|
|
@ -47576,6 +47621,7 @@
|
|||
},
|
||||
"node_modules/safe-regex-test": {
|
||||
"version": "1.0.3",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.6",
|
||||
|
|
@ -47695,6 +47741,7 @@
|
|||
},
|
||||
"node_modules/semver": {
|
||||
"version": "5.7.2",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
"semver": "bin/semver"
|
||||
|
|
@ -49219,6 +49266,7 @@
|
|||
},
|
||||
"node_modules/string.prototype.trim": {
|
||||
"version": "1.2.8",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -49234,6 +49282,7 @@
|
|||
},
|
||||
"node_modules/string.prototype.trimend": {
|
||||
"version": "1.0.7",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -49246,6 +49295,7 @@
|
|||
},
|
||||
"node_modules/string.prototype.trimstart": {
|
||||
"version": "1.0.7",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -50653,6 +50703,7 @@
|
|||
},
|
||||
"node_modules/typed-array-buffer": {
|
||||
"version": "1.0.1",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.6",
|
||||
|
|
@ -50665,6 +50716,7 @@
|
|||
},
|
||||
"node_modules/typed-array-byte-length": {
|
||||
"version": "1.0.0",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -50681,6 +50733,7 @@
|
|||
},
|
||||
"node_modules/typed-array-byte-offset": {
|
||||
"version": "1.0.0",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"available-typed-arrays": "^1.0.5",
|
||||
|
|
@ -50698,6 +50751,7 @@
|
|||
},
|
||||
"node_modules/typed-array-length": {
|
||||
"version": "1.0.4",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -50776,6 +50830,7 @@
|
|||
},
|
||||
"node_modules/unbox-primitive": {
|
||||
"version": "1.0.2",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -55872,8 +55927,10 @@
|
|||
"peerDependencies": {
|
||||
"@superset-ui/chart-controls": "*",
|
||||
"@superset-ui/core": "*",
|
||||
"enzyme": "*",
|
||||
"react": "^16.13.1"
|
||||
"@testing-library/jest-dom": "^5.17.0",
|
||||
"@testing-library/react": "^12.1.5",
|
||||
"react": "^16.13.1",
|
||||
"react-dom": "^16.13.1"
|
||||
}
|
||||
},
|
||||
"plugins/legacy-plugin-chart-partition/node_modules/d3-hierarchy": {
|
||||
|
|
@ -56510,7 +56567,6 @@
|
|||
"dependencies": {
|
||||
"@react-icons/all-files": "^4.1.0",
|
||||
"@types/d3-array": "^2.9.0",
|
||||
"@types/enzyme": "^3.10.18",
|
||||
"@types/react-table": "^7.7.20",
|
||||
"classnames": "^2.5.1",
|
||||
"d3-array": "^2.4.0",
|
||||
|
|
@ -66354,7 +66410,6 @@
|
|||
"requires": {
|
||||
"@react-icons/all-files": "^4.1.0",
|
||||
"@types/d3-array": "^2.9.0",
|
||||
"@types/enzyme": "^3.10.18",
|
||||
"@types/react-table": "^7.7.20",
|
||||
"classnames": "^2.5.1",
|
||||
"d3-array": "^2.4.0",
|
||||
|
|
@ -66718,6 +66773,8 @@
|
|||
},
|
||||
"@testing-library/jest-dom": {
|
||||
"version": "5.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz",
|
||||
"integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==",
|
||||
"requires": {
|
||||
"@adobe/css-tools": "^4.0.1",
|
||||
"@babel/runtime": "^7.9.2",
|
||||
|
|
@ -69643,6 +69700,7 @@
|
|||
},
|
||||
"array.prototype.filter": {
|
||||
"version": "1.0.3",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"define-properties": "^1.2.0",
|
||||
|
|
@ -69674,6 +69732,7 @@
|
|||
},
|
||||
"array.prototype.flat": {
|
||||
"version": "1.3.2",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"define-properties": "^1.2.0",
|
||||
|
|
@ -69704,6 +69763,7 @@
|
|||
},
|
||||
"arraybuffer.prototype.slice": {
|
||||
"version": "1.0.3",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"array-buffer-byte-length": "^1.0.1",
|
||||
"call-bind": "^1.0.5",
|
||||
|
|
@ -70990,6 +71050,7 @@
|
|||
},
|
||||
"cheerio": {
|
||||
"version": "1.0.0-rc.12",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"cheerio-select": "^2.1.0",
|
||||
"dom-serializer": "^2.0.0",
|
||||
|
|
@ -71002,6 +71063,7 @@
|
|||
},
|
||||
"cheerio-select": {
|
||||
"version": "2.1.0",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"boolbase": "^1.0.0",
|
||||
"css-select": "^5.1.0",
|
||||
|
|
@ -72054,6 +72116,7 @@
|
|||
},
|
||||
"css-select": {
|
||||
"version": "5.1.0",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"boolbase": "^1.0.0",
|
||||
"css-what": "^6.1.0",
|
||||
|
|
@ -73214,7 +73277,8 @@
|
|||
}
|
||||
},
|
||||
"discontinuous-range": {
|
||||
"version": "1.0.0"
|
||||
"version": "1.0.0",
|
||||
"dev": true
|
||||
},
|
||||
"distributions": {
|
||||
"version": "2.2.0",
|
||||
|
|
@ -73267,6 +73331,7 @@
|
|||
},
|
||||
"dom-serializer": {
|
||||
"version": "2.0.0",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"domelementtype": "^2.3.0",
|
||||
"domhandler": "^5.0.2",
|
||||
|
|
@ -73284,12 +73349,14 @@
|
|||
},
|
||||
"domhandler": {
|
||||
"version": "5.0.3",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"domelementtype": "^2.3.0"
|
||||
}
|
||||
},
|
||||
"domutils": {
|
||||
"version": "3.1.0",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"dom-serializer": "^2.0.0",
|
||||
"domelementtype": "^2.3.0",
|
||||
|
|
@ -73537,6 +73604,7 @@
|
|||
},
|
||||
"enzyme": {
|
||||
"version": "3.11.0",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"array.prototype.flat": "^1.2.3",
|
||||
"cheerio": "^1.0.0-rc.3",
|
||||
|
|
@ -73563,7 +73631,8 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"object-inspect": {
|
||||
"version": "1.12.3"
|
||||
"version": "1.12.3",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -73605,6 +73674,7 @@
|
|||
},
|
||||
"enzyme-shallow-equal": {
|
||||
"version": "1.0.5",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has": "^1.0.3",
|
||||
"object-is": "^1.1.5"
|
||||
|
|
@ -73637,6 +73707,7 @@
|
|||
},
|
||||
"es-abstract": {
|
||||
"version": "1.22.4",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"array-buffer-byte-length": "^1.0.1",
|
||||
"arraybuffer.prototype.slice": "^1.0.3",
|
||||
|
|
@ -73682,12 +73753,14 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"object-inspect": {
|
||||
"version": "1.13.1"
|
||||
"version": "1.13.1",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"es-array-method-boxes-properly": {
|
||||
"version": "1.0.0"
|
||||
"version": "1.0.0",
|
||||
"dev": true
|
||||
},
|
||||
"es-define-property": {
|
||||
"version": "1.0.0",
|
||||
|
|
@ -73748,6 +73821,7 @@
|
|||
},
|
||||
"es-set-tostringtag": {
|
||||
"version": "2.0.2",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"get-intrinsic": "^1.2.2",
|
||||
"has-tostringtag": "^1.0.0",
|
||||
|
|
@ -73756,12 +73830,14 @@
|
|||
},
|
||||
"es-shim-unscopables": {
|
||||
"version": "1.0.2",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"hasown": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"es-to-primitive": {
|
||||
"version": "1.2.1",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-callable": "^1.1.4",
|
||||
"is-date-object": "^1.0.1",
|
||||
|
|
@ -75788,6 +75864,7 @@
|
|||
},
|
||||
"function.prototype.name": {
|
||||
"version": "1.1.6",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"define-properties": "^1.2.0",
|
||||
|
|
@ -76014,6 +76091,7 @@
|
|||
},
|
||||
"get-symbol-description": {
|
||||
"version": "1.0.2",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.5",
|
||||
"es-errors": "^1.3.0",
|
||||
|
|
@ -76341,6 +76419,7 @@
|
|||
},
|
||||
"globalthis": {
|
||||
"version": "1.0.3",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"define-properties": "^1.1.3"
|
||||
}
|
||||
|
|
@ -76952,6 +77031,7 @@
|
|||
},
|
||||
"html-element-map": {
|
||||
"version": "1.3.1",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"array.prototype.filter": "^1.0.0",
|
||||
"call-bind": "^1.0.2"
|
||||
|
|
@ -77028,6 +77108,7 @@
|
|||
},
|
||||
"htmlparser2": {
|
||||
"version": "8.0.2",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"domelementtype": "^2.3.0",
|
||||
"domhandler": "^5.0.3",
|
||||
|
|
@ -77691,7 +77772,8 @@
|
|||
}
|
||||
},
|
||||
"is-negative-zero": {
|
||||
"version": "2.0.2"
|
||||
"version": "2.0.2",
|
||||
"dev": true
|
||||
},
|
||||
"is-number": {
|
||||
"version": "3.0.0",
|
||||
|
|
@ -77782,7 +77864,8 @@
|
|||
}
|
||||
},
|
||||
"is-subset": {
|
||||
"version": "0.1.1"
|
||||
"version": "0.1.1",
|
||||
"dev": true
|
||||
},
|
||||
"is-symbol": {
|
||||
"version": "1.0.4",
|
||||
|
|
@ -77821,6 +77904,7 @@
|
|||
},
|
||||
"is-weakref": {
|
||||
"version": "1.0.2",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2"
|
||||
}
|
||||
|
|
@ -80762,10 +80846,12 @@
|
|||
"dev": true
|
||||
},
|
||||
"lodash.escape": {
|
||||
"version": "4.0.1"
|
||||
"version": "4.0.1",
|
||||
"dev": true
|
||||
},
|
||||
"lodash.flattendeep": {
|
||||
"version": "4.4.0"
|
||||
"version": "4.4.0",
|
||||
"dev": true
|
||||
},
|
||||
"lodash.get": {
|
||||
"version": "4.4.2"
|
||||
|
|
@ -83931,7 +84017,8 @@
|
|||
}
|
||||
},
|
||||
"moo": {
|
||||
"version": "0.4.3"
|
||||
"version": "0.4.3",
|
||||
"dev": true
|
||||
},
|
||||
"mousetrap": {
|
||||
"version": "1.6.5"
|
||||
|
|
@ -84044,6 +84131,7 @@
|
|||
},
|
||||
"nearley": {
|
||||
"version": "2.18.0",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"commander": "^2.19.0",
|
||||
"moo": "^0.4.3",
|
||||
|
|
@ -85089,6 +85177,7 @@
|
|||
},
|
||||
"object.entries": {
|
||||
"version": "1.1.6",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"define-properties": "^1.1.4",
|
||||
|
|
@ -85141,6 +85230,7 @@
|
|||
},
|
||||
"object.values": {
|
||||
"version": "1.1.7",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"define-properties": "^1.2.0",
|
||||
|
|
@ -85710,6 +85800,7 @@
|
|||
},
|
||||
"parse5-htmlparser2-tree-adapter": {
|
||||
"version": "7.0.0",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"domhandler": "^5.0.2",
|
||||
"parse5": "^7.0.0"
|
||||
|
|
@ -85809,7 +85900,8 @@
|
|||
"dev": true
|
||||
},
|
||||
"performance-now": {
|
||||
"version": "2.1.0"
|
||||
"version": "2.1.0",
|
||||
"dev": true
|
||||
},
|
||||
"periscopic": {
|
||||
"version": "3.1.0",
|
||||
|
|
@ -86649,12 +86741,14 @@
|
|||
},
|
||||
"raf": {
|
||||
"version": "3.4.1",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"performance-now": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"railroad-diagrams": {
|
||||
"version": "1.0.0"
|
||||
"version": "1.0.0",
|
||||
"dev": true
|
||||
},
|
||||
"ramda": {
|
||||
"version": "0.26.1",
|
||||
|
|
@ -86662,6 +86756,7 @@
|
|||
},
|
||||
"randexp": {
|
||||
"version": "0.4.6",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"discontinuous-range": "1.0.0",
|
||||
"ret": "~0.1.10"
|
||||
|
|
@ -88903,7 +88998,8 @@
|
|||
}
|
||||
},
|
||||
"ret": {
|
||||
"version": "0.1.15"
|
||||
"version": "0.1.15",
|
||||
"dev": true
|
||||
},
|
||||
"retry": {
|
||||
"version": "0.13.1",
|
||||
|
|
@ -89012,6 +89108,7 @@
|
|||
},
|
||||
"rst-selector-parser": {
|
||||
"version": "2.2.3",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"lodash.flattendeep": "^4.4.0",
|
||||
"nearley": "^2.7.10"
|
||||
|
|
@ -89058,6 +89155,7 @@
|
|||
},
|
||||
"safe-array-concat": {
|
||||
"version": "1.1.0",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.5",
|
||||
"get-intrinsic": "^1.2.2",
|
||||
|
|
@ -89066,7 +89164,8 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"isarray": {
|
||||
"version": "2.0.5"
|
||||
"version": "2.0.5",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -89082,6 +89181,7 @@
|
|||
},
|
||||
"safe-regex-test": {
|
||||
"version": "1.0.3",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.6",
|
||||
"es-errors": "^1.3.0",
|
||||
|
|
@ -89164,7 +89264,8 @@
|
|||
}
|
||||
},
|
||||
"semver": {
|
||||
"version": "5.7.2"
|
||||
"version": "5.7.2",
|
||||
"dev": true
|
||||
},
|
||||
"semver-store": {
|
||||
"version": "0.3.0",
|
||||
|
|
@ -90231,6 +90332,7 @@
|
|||
},
|
||||
"string.prototype.trim": {
|
||||
"version": "1.2.8",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"define-properties": "^1.2.0",
|
||||
|
|
@ -90239,6 +90341,7 @@
|
|||
},
|
||||
"string.prototype.trimend": {
|
||||
"version": "1.0.7",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"define-properties": "^1.2.0",
|
||||
|
|
@ -90247,6 +90350,7 @@
|
|||
},
|
||||
"string.prototype.trimstart": {
|
||||
"version": "1.0.7",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"define-properties": "^1.2.0",
|
||||
|
|
@ -91140,6 +91244,7 @@
|
|||
},
|
||||
"typed-array-buffer": {
|
||||
"version": "1.0.1",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.6",
|
||||
"es-errors": "^1.3.0",
|
||||
|
|
@ -91148,6 +91253,7 @@
|
|||
},
|
||||
"typed-array-byte-length": {
|
||||
"version": "1.0.0",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"for-each": "^0.3.3",
|
||||
|
|
@ -91157,6 +91263,7 @@
|
|||
},
|
||||
"typed-array-byte-offset": {
|
||||
"version": "1.0.0",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"available-typed-arrays": "^1.0.5",
|
||||
"call-bind": "^1.0.2",
|
||||
|
|
@ -91167,6 +91274,7 @@
|
|||
},
|
||||
"typed-array-length": {
|
||||
"version": "1.0.4",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"for-each": "^0.3.3",
|
||||
|
|
@ -91208,6 +91316,7 @@
|
|||
},
|
||||
"unbox-primitive": {
|
||||
"version": "1.0.2",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"has-bigints": "^1.0.2",
|
||||
|
|
|
|||
|
|
@ -17,27 +17,28 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { shallow } from 'enzyme';
|
||||
import '@testing-library/jest-dom';
|
||||
import { TooltipFrame } from '@superset-ui/core';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
|
||||
describe('TooltipFrame', () => {
|
||||
it('sets className', () => {
|
||||
const wrapper = shallow(
|
||||
const { container } = render(
|
||||
<TooltipFrame className="test-class">
|
||||
<span>Hi!</span>
|
||||
</TooltipFrame>,
|
||||
);
|
||||
expect(wrapper.hasClass('test-class')).toEqual(true);
|
||||
expect(screen.getByText('Hi!')).toBeInTheDocument();
|
||||
expect(container.querySelector('.test-class')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('renders', () => {
|
||||
const wrapper = shallow(
|
||||
const { container } = render(
|
||||
<TooltipFrame>
|
||||
<span>Hi!</span>
|
||||
</TooltipFrame>,
|
||||
);
|
||||
const span = wrapper.find('span');
|
||||
expect(span).toHaveLength(1);
|
||||
expect(span.text()).toEqual('Hi!');
|
||||
expect(container.querySelectorAll('span')).toHaveLength(1);
|
||||
expect(container.querySelector('span')).toHaveTextContent('Hi!');
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -17,49 +17,53 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { shallow } from 'enzyme';
|
||||
import '@testing-library/jest-dom';
|
||||
import { screen, render } from '@testing-library/react';
|
||||
import { TooltipTable } from '@superset-ui/core';
|
||||
import { CSSProperties } from 'react';
|
||||
|
||||
describe('TooltipTable', () => {
|
||||
it('sets className', () => {
|
||||
const wrapper = shallow(<TooltipTable className="test-class" />);
|
||||
expect(wrapper.render().hasClass('test-class')).toEqual(true);
|
||||
const { container } = render(<TooltipTable className="test-class" />);
|
||||
expect(container.querySelector('[class="test-class"]')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('renders empty table', () => {
|
||||
const wrapper = shallow(<TooltipTable />);
|
||||
expect(wrapper.find('tbody')).toHaveLength(1);
|
||||
expect(wrapper.find('tr')).toHaveLength(0);
|
||||
const { container } = render(<TooltipTable />);
|
||||
expect(container.querySelector('tbody')).toBeInTheDocument();
|
||||
expect(container.querySelector('tr')).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('renders table with content', () => {
|
||||
const wrapper = shallow(
|
||||
<TooltipTable
|
||||
data={[
|
||||
{
|
||||
key: 'Cersei',
|
||||
keyColumn: 'Cersei',
|
||||
keyStyle: { padding: '10' },
|
||||
valueColumn: 2,
|
||||
valueStyle: { textAlign: 'right' },
|
||||
},
|
||||
{
|
||||
key: 'Jaime',
|
||||
keyColumn: 'Jaime',
|
||||
keyStyle: { padding: '10' },
|
||||
valueColumn: 1,
|
||||
valueStyle: { textAlign: 'right' },
|
||||
},
|
||||
{
|
||||
key: 'Tyrion',
|
||||
keyStyle: { padding: '10' },
|
||||
valueColumn: 2,
|
||||
},
|
||||
]}
|
||||
/>,
|
||||
);
|
||||
expect(wrapper.find('tbody')).toHaveLength(1);
|
||||
expect(wrapper.find('tr')).toHaveLength(3);
|
||||
expect(wrapper.find('tr > td').first().text()).toEqual('Cersei');
|
||||
it('renders table with content', async () => {
|
||||
const data = [
|
||||
{
|
||||
key: 'Cersei',
|
||||
keyColumn: 'Cersei',
|
||||
keyStyle: { padding: '10' },
|
||||
valueColumn: 2,
|
||||
valueStyle: { textAlign: 'right' } as CSSProperties,
|
||||
},
|
||||
{
|
||||
key: 'Jaime',
|
||||
keyColumn: 'Jaime',
|
||||
keyStyle: { padding: '10' },
|
||||
valueColumn: 1,
|
||||
valueStyle: { textAlign: 'right' } as CSSProperties,
|
||||
},
|
||||
{
|
||||
key: 'Tyrion',
|
||||
keyStyle: { padding: '10' },
|
||||
valueColumn: 2,
|
||||
},
|
||||
];
|
||||
|
||||
render(<TooltipTable data={data} />);
|
||||
|
||||
for await (const { key, valueColumn } of data) {
|
||||
const keyCell = await screen.findByText(key);
|
||||
const valueCell = keyCell?.nextSibling as HTMLElement;
|
||||
expect(keyCell).toBeInTheDocument();
|
||||
expect(valueCell?.textContent).toEqual(String(valueColumn));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -30,8 +30,10 @@
|
|||
"peerDependencies": {
|
||||
"@superset-ui/chart-controls": "*",
|
||||
"@superset-ui/core": "*",
|
||||
"enzyme": "*",
|
||||
"react": "^16.13.1"
|
||||
"@testing-library/jest-dom": "^5.17.0",
|
||||
"@testing-library/react": "^12.1.5",
|
||||
"react": "^16.13.1",
|
||||
"react-dom": "^16.13.1"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
|
|
|||
|
|
@ -16,9 +16,9 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
import { shallow } from 'enzyme';
|
||||
|
||||
import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls';
|
||||
import '@testing-library/jest-dom';
|
||||
import { screen, render, fireEvent, act } from '@testing-library/react';
|
||||
import { ThemeProvider, supersetTheme } from '@superset-ui/core';
|
||||
import OptionDescription from '../src/OptionDescription';
|
||||
|
||||
const defaultProps = {
|
||||
|
|
@ -28,20 +28,41 @@ const defaultProps = {
|
|||
},
|
||||
};
|
||||
|
||||
describe('OptionDescription', () => {
|
||||
let wrapper;
|
||||
let props;
|
||||
beforeEach(() => {
|
||||
jest.useFakeTimers();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
jest.useRealTimers();
|
||||
});
|
||||
|
||||
describe('OptionDescription', () => {
|
||||
beforeEach(() => {
|
||||
props = { option: { ...defaultProps.option } };
|
||||
wrapper = shallow(<OptionDescription {...props} />);
|
||||
const props = { option: { ...defaultProps.option } };
|
||||
render(
|
||||
<ThemeProvider theme={supersetTheme}>
|
||||
<OptionDescription {...props} />
|
||||
</ThemeProvider>,
|
||||
);
|
||||
});
|
||||
|
||||
it('renders an InfoTooltipWithTrigger', () => {
|
||||
expect(wrapper.find(InfoTooltipWithTrigger)).toHaveLength(1);
|
||||
const tooltipTrigger = screen.getByLabelText('Show info tooltip');
|
||||
expect(tooltipTrigger).toBeInTheDocument();
|
||||
|
||||
// Perform delayed mouse hovering so tooltip could pop out
|
||||
fireEvent.mouseOver(tooltipTrigger);
|
||||
act(() => jest.runAllTimers());
|
||||
fireEvent.mouseOut(tooltipTrigger);
|
||||
|
||||
const tooltip = screen.getByRole('tooltip');
|
||||
expect(tooltip).toBeInTheDocument();
|
||||
expect(tooltip).toHaveTextContent('Description for some option');
|
||||
});
|
||||
|
||||
it('renders a span with the label', () => {
|
||||
expect(wrapper.find('.option-label').text()).toBe('Some option');
|
||||
expect(
|
||||
screen.getByText('Some option', { selector: 'span' }),
|
||||
).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
"dependencies": {
|
||||
"@react-icons/all-files": "^4.1.0",
|
||||
"@types/d3-array": "^2.9.0",
|
||||
"@types/enzyme": "^3.10.18",
|
||||
"@types/react-table": "^7.7.20",
|
||||
"classnames": "^2.5.1",
|
||||
"d3-array": "^2.4.0",
|
||||
|
|
|
|||
|
|
@ -16,14 +16,14 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
import { CommonWrapper } from 'enzyme';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import '@testing-library/jest-dom';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import { ThemeProvider, supersetTheme } from '@superset-ui/core';
|
||||
import TableChart from '../src/TableChart';
|
||||
import transformProps from '../src/transformProps';
|
||||
import DateWithFormatter from '../src/utils/DateWithFormatter';
|
||||
import testData from './testData';
|
||||
import { mount, ProviderWrapper } from './enzyme';
|
||||
import { ProviderWrapper } from './testHelpers';
|
||||
|
||||
describe('plugin-chart-table', () => {
|
||||
describe('transformProps', () => {
|
||||
|
|
@ -178,39 +178,42 @@ describe('plugin-chart-table', () => {
|
|||
});
|
||||
|
||||
describe('TableChart', () => {
|
||||
let wrap: CommonWrapper; // the ReactDataTable wrapper
|
||||
let tree: Cheerio;
|
||||
|
||||
it('render basic data', () => {
|
||||
wrap = mount(
|
||||
<TableChart {...transformProps(testData.basic)} sticky={false} />,
|
||||
render(
|
||||
<ThemeProvider theme={supersetTheme}>
|
||||
<TableChart {...transformProps(testData.basic)} sticky={false} />,
|
||||
</ThemeProvider>,
|
||||
);
|
||||
|
||||
tree = wrap.render(); // returns a CheerioWrapper with jQuery-like API
|
||||
const cells = tree.find('td');
|
||||
const firstDataRow = screen.getAllByRole('rowgroup')[1];
|
||||
const cells = firstDataRow.querySelectorAll('td');
|
||||
expect(cells).toHaveLength(12);
|
||||
expect(cells.eq(0).text()).toEqual('2020-01-01 12:34:56');
|
||||
expect(cells.eq(1).text()).toEqual('Michael');
|
||||
expect(cells[0]).toHaveTextContent('2020-01-01 12:34:56');
|
||||
expect(cells[1]).toHaveTextContent('Michael');
|
||||
// number is not in `metrics` list, so it should output raw value
|
||||
// (in real world Superset, this would mean the column is used in GROUP BY)
|
||||
expect(cells.eq(2).text()).toEqual('2467063');
|
||||
expect(cells[2]).toHaveTextContent('2467063');
|
||||
// should not render column with `.` in name as `undefined`
|
||||
expect(cells.eq(3).text()).toEqual('foo');
|
||||
expect(cells.eq(6).text()).toEqual('2467');
|
||||
expect(cells.eq(8).text()).toEqual('N/A');
|
||||
expect(cells[3]).toHaveTextContent('foo');
|
||||
expect(cells[6]).toHaveTextContent('2467');
|
||||
expect(cells[8]).toHaveTextContent('N/A');
|
||||
});
|
||||
|
||||
it('render advanced data', () => {
|
||||
wrap = mount(
|
||||
<TableChart {...transformProps(testData.advanced)} sticky={false} />,
|
||||
render(
|
||||
<ThemeProvider theme={supersetTheme}>
|
||||
<TableChart {...transformProps(testData.advanced)} sticky={false} />,
|
||||
</ThemeProvider>,
|
||||
);
|
||||
tree = wrap.render();
|
||||
// should successful rerender with new props
|
||||
const cells = tree.find('td');
|
||||
expect(tree.find('th').eq(1).text()).toEqual('Sum of Num');
|
||||
expect(cells.eq(0).text()).toEqual('Michael');
|
||||
expect(cells.eq(2).text()).toEqual('12.346%');
|
||||
expect(cells.eq(4).text()).toEqual('2.47k');
|
||||
const secondColumnHeader = screen.getByText('Sum of Num');
|
||||
expect(secondColumnHeader).toBeInTheDocument();
|
||||
expect(secondColumnHeader?.getAttribute('data-column-name')).toEqual('1');
|
||||
|
||||
const firstDataRow = screen.getAllByRole('rowgroup')[1];
|
||||
const cells = firstDataRow.querySelectorAll('td');
|
||||
expect(cells[0]).toHaveTextContent('Michael');
|
||||
expect(cells[2]).toHaveTextContent('12.346%');
|
||||
expect(cells[4]).toHaveTextContent('2.47k');
|
||||
});
|
||||
|
||||
it('render advanced data with currencies', () => {
|
||||
|
|
@ -318,9 +321,12 @@ describe('plugin-chart-table', () => {
|
|||
});
|
||||
|
||||
it('render empty data', () => {
|
||||
wrap.setProps({ ...transformProps(testData.empty), sticky: false });
|
||||
tree = wrap.render();
|
||||
expect(tree.text()).toContain('No records found');
|
||||
render(
|
||||
<ThemeProvider theme={supersetTheme}>
|
||||
<TableChart {...transformProps(testData.empty)} sticky={false} />,
|
||||
</ThemeProvider>,
|
||||
);
|
||||
expect(screen.getByText('No records found')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('render color with column color formatter', () => {
|
||||
|
|
|
|||
|
|
@ -16,8 +16,6 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
import { ReactElement } from 'react';
|
||||
import { shallow as enzymeShallow, mount as enzymeMount } from 'enzyme';
|
||||
import {
|
||||
EmotionCacheProvider,
|
||||
createEmotionCache,
|
||||
|
|
@ -29,12 +27,6 @@ const emotionCache = createEmotionCache({
|
|||
key: 'test',
|
||||
});
|
||||
|
||||
type optionsType = {
|
||||
wrappingComponentProps?: any;
|
||||
wrappingComponent?: ReactElement;
|
||||
context?: any;
|
||||
};
|
||||
|
||||
export function ProviderWrapper(props: any) {
|
||||
const { children, theme = supersetTheme } = props;
|
||||
return (
|
||||
|
|
@ -43,25 +35,3 @@ export function ProviderWrapper(props: any) {
|
|||
</EmotionCacheProvider>
|
||||
);
|
||||
}
|
||||
|
||||
export function mount(component: ReactElement, options: optionsType = {}) {
|
||||
return enzymeMount(component, {
|
||||
...options,
|
||||
wrappingComponent: ProviderWrapper,
|
||||
wrappingComponentProps: {
|
||||
theme: supersetTheme,
|
||||
...options?.wrappingComponentProps,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export function shallow(component: ReactElement, options: optionsType = {}) {
|
||||
return enzymeShallow(component, {
|
||||
...options,
|
||||
wrappingComponent: ProviderWrapper,
|
||||
wrappingComponentProps: {
|
||||
theme: supersetTheme,
|
||||
...options?.wrappingComponentProps,
|
||||
},
|
||||
}).dive();
|
||||
}
|
||||
|
|
@ -17,8 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
import { Provider } from 'react-redux';
|
||||
import { styledMount as mount } from 'spec/helpers/theming';
|
||||
import { Avatar } from 'src/components';
|
||||
import { act, fireEvent, render, screen } from 'spec/helpers/testing-library';
|
||||
import { store } from 'src/views/store';
|
||||
import FacePile from '.';
|
||||
import { getRandomColor } from './utils';
|
||||
|
|
@ -29,23 +28,43 @@ const users = [...new Array(10)].map((_, i) => ({
|
|||
id: i,
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
jest.useFakeTimers();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
jest.useRealTimers();
|
||||
});
|
||||
|
||||
describe('FacePile', () => {
|
||||
const wrapper = mount(
|
||||
<Provider store={store}>
|
||||
<FacePile users={users} />
|
||||
</Provider>,
|
||||
);
|
||||
let container: HTMLElement;
|
||||
|
||||
beforeEach(() => {
|
||||
({ container } = render(
|
||||
<Provider store={store}>
|
||||
<FacePile users={users} />
|
||||
</Provider>,
|
||||
));
|
||||
});
|
||||
|
||||
it('is a valid element', () => {
|
||||
expect(wrapper.find(FacePile)).toExist();
|
||||
const exposedFaces = screen.getAllByText(/U/);
|
||||
expect(exposedFaces).toHaveLength(4);
|
||||
const overflownFaces = screen.getByText('+6');
|
||||
expect(overflownFaces).toBeVisible();
|
||||
|
||||
// Display user info when hovering over one of exposed face in the pile.
|
||||
fireEvent.mouseEnter(exposedFaces[0]);
|
||||
act(() => jest.runAllTimers());
|
||||
expect(screen.getByRole('tooltip')).toHaveTextContent('user 0');
|
||||
});
|
||||
|
||||
it('renders an Avatar', () => {
|
||||
expect(wrapper.find(Avatar)).toExist();
|
||||
expect(container.querySelector('.ant-avatar')).toBeVisible();
|
||||
});
|
||||
|
||||
it('hides overflow', () => {
|
||||
expect(wrapper.find(Avatar).length).toBe(5);
|
||||
expect(container.querySelectorAll('.ant-avatar')).toHaveLength(5);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -87,6 +87,39 @@ const defaultProps = {
|
|||
valueKey: 'value',
|
||||
};
|
||||
|
||||
export const innerGetOptions = props => {
|
||||
const { choices, optionRenderer, valueKey } = props;
|
||||
let options = [];
|
||||
if (props.options) {
|
||||
options = props.options.map(o => ({
|
||||
...o,
|
||||
value: o[valueKey],
|
||||
label: o.label || o[valueKey],
|
||||
customLabel: optionRenderer ? optionRenderer(o) : undefined,
|
||||
}));
|
||||
} else if (choices) {
|
||||
// Accepts different formats of input
|
||||
options = choices.map(c => {
|
||||
if (Array.isArray(c)) {
|
||||
const [value, label] = c.length > 1 ? c : [c[0], c[0]];
|
||||
return {
|
||||
value,
|
||||
label,
|
||||
};
|
||||
}
|
||||
if (Object.is(c)) {
|
||||
return {
|
||||
...c,
|
||||
value: c[valueKey],
|
||||
label: c.label || c[valueKey],
|
||||
};
|
||||
}
|
||||
return { value: c, label: c };
|
||||
});
|
||||
}
|
||||
return options;
|
||||
};
|
||||
|
||||
export default class SelectControl extends PureComponent {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
|
@ -127,36 +160,7 @@ export default class SelectControl extends PureComponent {
|
|||
}
|
||||
|
||||
getOptions(props) {
|
||||
const { choices, optionRenderer, valueKey } = props;
|
||||
let options = [];
|
||||
if (props.options) {
|
||||
options = props.options.map(o => ({
|
||||
...o,
|
||||
value: o[valueKey],
|
||||
label: o.label || o[valueKey],
|
||||
customLabel: optionRenderer ? optionRenderer(o) : undefined,
|
||||
}));
|
||||
} else if (choices) {
|
||||
// Accepts different formats of input
|
||||
options = choices.map(c => {
|
||||
if (Array.isArray(c)) {
|
||||
const [value, label] = c.length > 1 ? c : [c[0], c[0]];
|
||||
return {
|
||||
value,
|
||||
label,
|
||||
};
|
||||
}
|
||||
if (Object.is(c)) {
|
||||
return {
|
||||
...c,
|
||||
value: c[valueKey],
|
||||
label: c.label || c[valueKey],
|
||||
};
|
||||
}
|
||||
return { value: c, label: c };
|
||||
});
|
||||
}
|
||||
return options;
|
||||
return innerGetOptions(props);
|
||||
}
|
||||
|
||||
handleFilterOptions(text, option) {
|
||||
|
|
|
|||
|
|
@ -16,11 +16,18 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
import sinon from 'sinon';
|
||||
import { shallow } from 'enzyme';
|
||||
import { Select as SelectComponent } from 'src/components';
|
||||
import SelectControl from 'src/explore/components/controls/SelectControl';
|
||||
import { styledMount as mount } from 'spec/helpers/theming';
|
||||
import {
|
||||
act,
|
||||
createEvent,
|
||||
fireEvent,
|
||||
render,
|
||||
screen,
|
||||
within,
|
||||
} from 'spec/helpers/testing-library';
|
||||
import SelectControl, {
|
||||
innerGetOptions,
|
||||
} from 'src/explore/components/controls/SelectControl';
|
||||
import userEvent from '@testing-library/user-event';
|
||||
|
||||
const defaultProps = {
|
||||
choices: [
|
||||
|
|
@ -30,139 +37,202 @@ const defaultProps = {
|
|||
],
|
||||
name: 'row_limit',
|
||||
label: 'Row Limit',
|
||||
valueKey: 'value', // shallow isn't passing SelectControl.defaultProps.valueKey through
|
||||
onChange: sinon.spy(),
|
||||
valueKey: 'value',
|
||||
onChange: jest.fn(),
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
jest.useFakeTimers();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
jest.useRealTimers();
|
||||
});
|
||||
|
||||
const options = [
|
||||
{ value: '1 year ago', label: '1 year ago' },
|
||||
{ value: '1 week ago', label: '1 week ago' },
|
||||
{ value: 'today', label: 'today' },
|
||||
];
|
||||
|
||||
const renderSelectControl = (props = {}) => {
|
||||
const overrideProps = {
|
||||
...defaultProps,
|
||||
...props,
|
||||
};
|
||||
const { container } = render(<SelectControl {...overrideProps} />);
|
||||
return container;
|
||||
};
|
||||
|
||||
describe('SelectControl', () => {
|
||||
let wrapper;
|
||||
|
||||
beforeEach(() => {
|
||||
wrapper = shallow(<SelectControl {...defaultProps} />);
|
||||
});
|
||||
|
||||
it('calls props.onChange when select', () => {
|
||||
const select = wrapper.instance();
|
||||
select.onChange(50);
|
||||
expect(defaultProps.onChange.calledWith(50)).toBe(true);
|
||||
it('calls props.onChange when select', async () => {
|
||||
renderSelectControl();
|
||||
defaultProps.onChange(50);
|
||||
expect(defaultProps.onChange).toHaveBeenCalledWith(50);
|
||||
});
|
||||
|
||||
describe('render', () => {
|
||||
it('renders with Select by default', () => {
|
||||
expect(wrapper.find(SelectComponent)).toExist();
|
||||
renderSelectControl();
|
||||
const selectorWrapper = screen.getByLabelText('Row Limit', {
|
||||
selector: 'div',
|
||||
});
|
||||
const selectorInput = within(selectorWrapper).getByLabelText(
|
||||
'Row Limit',
|
||||
{ selector: 'input' },
|
||||
);
|
||||
expect(selectorWrapper).toBeInTheDocument();
|
||||
expect(selectorInput).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('renders as mode multiple', () => {
|
||||
wrapper.setProps({ multi: true });
|
||||
expect(wrapper.find(SelectComponent)).toExist();
|
||||
expect(wrapper.find(SelectComponent).prop('mode')).toBe('multiple');
|
||||
renderSelectControl({ multi: true });
|
||||
const selectorWrapper = screen.getByLabelText('Row Limit', {
|
||||
selector: 'div',
|
||||
});
|
||||
const selectorInput = within(selectorWrapper).getByLabelText(
|
||||
'Row Limit',
|
||||
{ selector: 'input' },
|
||||
);
|
||||
expect(selectorWrapper).toBeInTheDocument();
|
||||
expect(selectorInput).toBeInTheDocument();
|
||||
userEvent.click(selectorInput);
|
||||
expect(screen.getByText('Select All (3)')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('renders with allowNewOptions when freeForm', () => {
|
||||
wrapper.setProps({ freeForm: true });
|
||||
expect(wrapper.find(SelectComponent)).toExist();
|
||||
expect(wrapper.find(SelectComponent).prop('allowNewOptions')).toBe(true);
|
||||
renderSelectControl({ freeForm: true });
|
||||
const selectorWrapper = screen.getByLabelText('Row Limit', {
|
||||
selector: 'div',
|
||||
});
|
||||
const selectorInput = within(selectorWrapper).getByLabelText(
|
||||
'Row Limit',
|
||||
{ selector: 'input' },
|
||||
);
|
||||
expect(selectorWrapper).toBeInTheDocument();
|
||||
expect(selectorInput).toBeInTheDocument();
|
||||
|
||||
// Expect a new option to be selectable.
|
||||
userEvent.click(selectorInput);
|
||||
userEvent.type(selectorInput, 'a new option');
|
||||
act(() => jest.runAllTimers());
|
||||
expect(within(selectorWrapper).getByRole('option')).toHaveTextContent(
|
||||
'a new option',
|
||||
);
|
||||
});
|
||||
|
||||
it('renders with allowNewOptions=false when freeForm=false', () => {
|
||||
wrapper.setProps({ freeForm: false });
|
||||
expect(wrapper.find(SelectComponent)).toExist();
|
||||
expect(wrapper.find(SelectComponent).prop('allowNewOptions')).toBe(false);
|
||||
const container = renderSelectControl({ freeForm: false });
|
||||
const selectorWrapper = screen.getByLabelText('Row Limit', {
|
||||
selector: 'div',
|
||||
});
|
||||
const selectorInput = within(selectorWrapper).getByLabelText(
|
||||
'Row Limit',
|
||||
{ selector: 'input' },
|
||||
);
|
||||
expect(selectorWrapper).toBeInTheDocument();
|
||||
expect(selectorInput).toBeInTheDocument();
|
||||
|
||||
// Expect no new option to be selectable.
|
||||
userEvent.click(selectorInput);
|
||||
userEvent.type(selectorInput, 'a new option');
|
||||
act(() => jest.advanceTimersByTime(300));
|
||||
|
||||
expect(
|
||||
container.querySelector('[role="option"]'),
|
||||
).not.toBeInTheDocument();
|
||||
expect(within(selectorWrapper).getByText('No Data')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('renders with tokenSeparators', () => {
|
||||
wrapper.setProps({ tokenSeparators: ['\n', '\t', ';'] });
|
||||
expect(wrapper.find(SelectComponent)).toExist();
|
||||
expect(wrapper.find(SelectComponent).prop('tokenSeparators')).toEqual(
|
||||
expect.arrayContaining([expect.any(String)]),
|
||||
renderSelectControl({ tokenSeparators: ['\n', '\t', ';'], multi: true });
|
||||
const selectorWrapper = screen.getByLabelText('Row Limit', {
|
||||
selector: 'div',
|
||||
});
|
||||
const selectorInput = within(selectorWrapper).getByLabelText(
|
||||
'Row Limit',
|
||||
{ selector: 'input' },
|
||||
);
|
||||
expect(selectorWrapper).toBeInTheDocument();
|
||||
expect(selectorInput).toBeInTheDocument();
|
||||
|
||||
userEvent.click(selectorInput);
|
||||
const paste = createEvent.paste(selectorInput, {
|
||||
clipboardData: {
|
||||
getData: () => '1 year ago;1 week ago',
|
||||
},
|
||||
});
|
||||
fireEvent(selectorInput, paste);
|
||||
const yearOption = screen.getByLabelText('1 year ago');
|
||||
expect(yearOption).toBeInTheDocument();
|
||||
expect(yearOption).toHaveAttribute('aria-selected', 'true');
|
||||
const weekOption = screen.getByText(/1 week ago/, {
|
||||
selector: 'div',
|
||||
}).parentNode;
|
||||
expect(weekOption?.getAttribute('aria-selected')).toEqual('true');
|
||||
});
|
||||
|
||||
describe('empty placeholder', () => {
|
||||
describe('withMulti', () => {
|
||||
it('does not show a placeholder if there are no choices', () => {
|
||||
const withMulti = mount(
|
||||
<SelectControl
|
||||
{...defaultProps}
|
||||
choices={[]}
|
||||
multi
|
||||
placeholder="add something"
|
||||
/>,
|
||||
);
|
||||
expect(withMulti.html()).not.toContain('option(s');
|
||||
renderSelectControl({
|
||||
choices: [],
|
||||
multi: true,
|
||||
placeholder: 'add something',
|
||||
});
|
||||
expect(screen.queryByRole('option')).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
describe('withSingleChoice', () => {
|
||||
it('does not show a placeholder if there are no choices', () => {
|
||||
const singleChoice = mount(
|
||||
<SelectControl
|
||||
{...defaultProps}
|
||||
choices={[]}
|
||||
multi
|
||||
placeholder="add something"
|
||||
/>,
|
||||
);
|
||||
expect(singleChoice.html()).not.toContain('option(s');
|
||||
});
|
||||
});
|
||||
describe('default placeholder', () => {
|
||||
it('does not show a placeholder if there are no options', () => {
|
||||
const defaultPlaceholder = mount(
|
||||
<SelectControl {...defaultProps} choices={[]} multi />,
|
||||
);
|
||||
expect(defaultPlaceholder.html()).not.toContain('option(s');
|
||||
it('does not show a placeholder if there are no choices', async () => {
|
||||
const container = renderSelectControl({
|
||||
choices: [],
|
||||
multi: false,
|
||||
placeholder: 'add something',
|
||||
});
|
||||
expect(
|
||||
container.querySelector('[role="option"]'),
|
||||
).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
describe('all choices selected', () => {
|
||||
it('does not show a placeholder', () => {
|
||||
const allChoicesSelected = mount(
|
||||
<SelectControl
|
||||
{...defaultProps}
|
||||
multi
|
||||
value={['today', '1 year ago']}
|
||||
/>,
|
||||
);
|
||||
expect(allChoicesSelected.html()).not.toContain('option(s');
|
||||
const container = renderSelectControl({
|
||||
multi: true,
|
||||
value: ['today', '1 year ago'],
|
||||
});
|
||||
expect(
|
||||
container.querySelector('[role="option"]'),
|
||||
).not.toBeInTheDocument();
|
||||
expect(screen.queryByText('Select ...')).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
});
|
||||
describe('when select is multi', () => {
|
||||
it('does not render the placeholder when a selection has been made', () => {
|
||||
wrapper = mount(
|
||||
<SelectControl
|
||||
{...defaultProps}
|
||||
multi
|
||||
value={['today']}
|
||||
placeholder="add something"
|
||||
/>,
|
||||
);
|
||||
expect(wrapper.html()).not.toContain('add something');
|
||||
renderSelectControl({
|
||||
multi: true,
|
||||
value: ['today'],
|
||||
placeholder: 'add something',
|
||||
});
|
||||
expect(screen.queryByText('add something')).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
describe('when select is single', () => {
|
||||
it('does not render the placeholder when a selection has been made', () => {
|
||||
wrapper = mount(
|
||||
<SelectControl
|
||||
{...defaultProps}
|
||||
value={50}
|
||||
placeholder="add something"
|
||||
/>,
|
||||
);
|
||||
expect(wrapper.html()).not.toContain('add something');
|
||||
renderSelectControl({
|
||||
multi: true,
|
||||
value: 50,
|
||||
placeholder: 'add something',
|
||||
});
|
||||
expect(screen.queryByText('add something')).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('getOptions', () => {
|
||||
it('returns the correct options', () => {
|
||||
wrapper.setProps(defaultProps);
|
||||
expect(wrapper.instance().getOptions(defaultProps)).toEqual(options);
|
||||
expect(innerGetOptions(defaultProps)).toEqual(options);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue