test: Add jest-enzyme assertion library for better frontend tests (#10459)

* adding jest-enzyme

* enzymeify lots of assertions

* types for jest-enzyme
This commit is contained in:
David Aaron Suddjian 2020-07-29 10:53:06 -07:00 committed by GitHub
parent 671461d0d0
commit 7f70a241f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
111 changed files with 1074 additions and 315 deletions

View File

@ -25,7 +25,8 @@ module.exports = {
'^src/(.*)$': '<rootDir>/src/$1',
'^spec/(.*)$': '<rootDir>/spec/$1',
},
setupFilesAfterEnv: ['<rootDir>/spec/helpers/shim.js'],
testEnvironment: 'enzyme',
setupFilesAfterEnv: ['jest-enzyme', '<rootDir>/spec/helpers/shim.ts'],
testURL: 'http://localhost',
collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'],
coverageDirectory: '<rootDir>/coverage/',

View File

@ -10005,6 +10005,15 @@
"@types/react": "*"
}
},
"@types/enzyme-adapter-react-16": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.6.tgz",
"integrity": "sha512-VonDkZ15jzqDWL8mPFIQnnLtjwebuL9YnDkqeCDYnB4IVgwUm0mwKkqhrxLL6mb05xm7qqa3IE95m8CZE9imCg==",
"dev": true,
"requires": {
"@types/enzyme": "*"
}
},
"@types/eslint-visitor-keys": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
@ -11426,6 +11435,12 @@
"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
"dev": true
},
"array-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
"integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
"dev": true
},
"array-filter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz",
@ -14107,6 +14122,12 @@
"safe-buffer": "^5.0.1"
}
},
"circular-json-es6": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/circular-json-es6/-/circular-json-es6-2.0.2.tgz",
"integrity": "sha512-ODYONMMNb3p658Zv+Pp+/XPa5s6q7afhz3Tzyvo+VRh9WIrJ64J76ZC4GQxnlye/NesTn09jvOiuE8+xxfpwhQ==",
"dev": true
},
"class-utils": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
@ -15862,6 +15883,27 @@
}
}
},
"deep-equal-ident": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/deep-equal-ident/-/deep-equal-ident-1.1.1.tgz",
"integrity": "sha1-BvS4nlNxDNbOpKd4HHqVZkLejck=",
"dev": true,
"requires": {
"lodash.isequal": "^3.0"
},
"dependencies": {
"lodash.isequal": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-3.0.4.tgz",
"integrity": "sha1-HDXrO27wzR/1F0Pj6jz3/f/ay2Q=",
"dev": true,
"requires": {
"lodash._baseisequal": "^3.0.0",
"lodash._bindcallback": "^3.0.0"
}
}
}
},
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
@ -16635,6 +16677,34 @@
"semver": "^5.6.0"
}
},
"enzyme-matchers": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/enzyme-matchers/-/enzyme-matchers-7.1.2.tgz",
"integrity": "sha512-03WqAg2XDl7id9rARIO97HQ1JIw9F2heJ3R4meGu/13hx0ULTDEgl0E67MGl2Uq1jq1DyRnJfto1/VSzskdV5A==",
"dev": true,
"requires": {
"circular-json-es6": "^2.0.1",
"deep-equal-ident": "^1.1.1"
}
},
"enzyme-to-json": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.5.0.tgz",
"integrity": "sha512-clusXRsiaQhG7+wtyc4t7MU8N3zCOgf4eY9+CeSenYzKlFST4lxerfOvnWd4SNaToKhkuba+w6m242YpQOS7eA==",
"dev": true,
"requires": {
"lodash": "^4.17.15",
"react-is": "^16.12.0"
},
"dependencies": {
"react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true
}
}
},
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
@ -21032,6 +21102,600 @@
}
}
},
"jest-environment-enzyme": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/jest-environment-enzyme/-/jest-environment-enzyme-7.1.2.tgz",
"integrity": "sha512-3tfaYAzO7qZSRrv+srQnfK16Vu5XwH/pHi8FpoqSHjKKngbHzXf7aBCBuWh8y3w0OtknHRfDMFrC60Khj+g1hA==",
"dev": true,
"requires": {
"jest-environment-jsdom": "^24.0.0"
},
"dependencies": {
"@babel/helper-validator-identifier": {
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
"integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
"dev": true
},
"@babel/types": {
"version": "7.10.5",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz",
"integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.10.4",
"lodash": "^4.17.19",
"to-fast-properties": "^2.0.0"
}
},
"@jest/console": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz",
"integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==",
"dev": true,
"requires": {
"@jest/source-map": "^24.9.0",
"chalk": "^2.0.1",
"slash": "^2.0.0"
}
},
"@jest/environment": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz",
"integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==",
"dev": true,
"requires": {
"@jest/fake-timers": "^24.9.0",
"@jest/transform": "^24.9.0",
"@jest/types": "^24.9.0",
"jest-mock": "^24.9.0"
}
},
"@jest/fake-timers": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz",
"integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==",
"dev": true,
"requires": {
"@jest/types": "^24.9.0",
"jest-message-util": "^24.9.0",
"jest-mock": "^24.9.0"
}
},
"@jest/source-map": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz",
"integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==",
"dev": true,
"requires": {
"callsites": "^3.0.0",
"graceful-fs": "^4.1.15",
"source-map": "^0.6.0"
}
},
"@jest/test-result": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz",
"integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==",
"dev": true,
"requires": {
"@jest/console": "^24.9.0",
"@jest/types": "^24.9.0",
"@types/istanbul-lib-coverage": "^2.0.0"
}
},
"@jest/transform": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz",
"integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==",
"dev": true,
"requires": {
"@babel/core": "^7.1.0",
"@jest/types": "^24.9.0",
"babel-plugin-istanbul": "^5.1.0",
"chalk": "^2.0.1",
"convert-source-map": "^1.4.0",
"fast-json-stable-stringify": "^2.0.0",
"graceful-fs": "^4.1.15",
"jest-haste-map": "^24.9.0",
"jest-regex-util": "^24.9.0",
"jest-util": "^24.9.0",
"micromatch": "^3.1.10",
"pirates": "^4.0.1",
"realpath-native": "^1.1.0",
"slash": "^2.0.0",
"source-map": "^0.6.1",
"write-file-atomic": "2.4.1"
}
},
"@jest/types": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
"integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
"dev": true,
"requires": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^1.1.1",
"@types/yargs": "^13.0.0"
}
},
"@types/yargs": {
"version": "13.0.9",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
"integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
"dev": true,
"requires": {
"@types/yargs-parser": "*"
}
},
"acorn": {
"version": "5.7.4",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
"integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
"dev": true
},
"acorn-globals": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
"integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
"dev": true,
"requires": {
"acorn": "^6.0.1",
"acorn-walk": "^6.0.1"
},
"dependencies": {
"acorn": {
"version": "6.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
"integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
"dev": true
}
}
},
"acorn-walk": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
"integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
"dev": true
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"babel-plugin-istanbul": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz",
"integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
"find-up": "^3.0.0",
"istanbul-lib-instrument": "^3.3.0",
"test-exclude": "^5.2.3"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"cssom": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
"integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
"dev": true
},
"cssstyle": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
"integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
"dev": true,
"requires": {
"cssom": "0.3.x"
}
},
"data-urls": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
"integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
"dev": true,
"requires": {
"abab": "^2.0.0",
"whatwg-mimetype": "^2.2.0",
"whatwg-url": "^7.0.0"
},
"dependencies": {
"whatwg-url": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
"integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
"dev": true,
"requires": {
"lodash.sortby": "^4.7.0",
"tr46": "^1.0.1",
"webidl-conversions": "^4.0.2"
}
}
}
},
"domexception": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
"integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
"dev": true,
"requires": {
"webidl-conversions": "^4.0.2"
}
},
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"requires": {
"locate-path": "^3.0.0"
}
},
"fsevents": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"dev": true,
"optional": true,
"requires": {
"bindings": "^1.5.0",
"nan": "^2.12.1"
}
},
"html-encoding-sniffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
"integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
"dev": true,
"requires": {
"whatwg-encoding": "^1.0.1"
}
},
"istanbul-lib-coverage": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
"integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
"dev": true
},
"istanbul-lib-instrument": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
"integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
"dev": true,
"requires": {
"@babel/generator": "^7.4.0",
"@babel/parser": "^7.4.3",
"@babel/template": "^7.4.0",
"@babel/traverse": "^7.4.3",
"@babel/types": "^7.4.0",
"istanbul-lib-coverage": "^2.0.5",
"semver": "^6.0.0"
}
},
"jest-environment-jsdom": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz",
"integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==",
"dev": true,
"requires": {
"@jest/environment": "^24.9.0",
"@jest/fake-timers": "^24.9.0",
"@jest/types": "^24.9.0",
"jest-mock": "^24.9.0",
"jest-util": "^24.9.0",
"jsdom": "^11.5.1"
}
},
"jest-haste-map": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz",
"integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==",
"dev": true,
"requires": {
"@jest/types": "^24.9.0",
"anymatch": "^2.0.0",
"fb-watchman": "^2.0.0",
"fsevents": "^1.2.7",
"graceful-fs": "^4.1.15",
"invariant": "^2.2.4",
"jest-serializer": "^24.9.0",
"jest-util": "^24.9.0",
"jest-worker": "^24.9.0",
"micromatch": "^3.1.10",
"sane": "^4.0.3",
"walker": "^1.0.7"
}
},
"jest-message-util": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
"integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"@jest/test-result": "^24.9.0",
"@jest/types": "^24.9.0",
"@types/stack-utils": "^1.0.1",
"chalk": "^2.0.1",
"micromatch": "^3.1.10",
"slash": "^2.0.0",
"stack-utils": "^1.0.1"
}
},
"jest-mock": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz",
"integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==",
"dev": true,
"requires": {
"@jest/types": "^24.9.0"
}
},
"jest-regex-util": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
"integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
"dev": true
},
"jest-serializer": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
"integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
"dev": true
},
"jest-util": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
"integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
"dev": true,
"requires": {
"@jest/console": "^24.9.0",
"@jest/fake-timers": "^24.9.0",
"@jest/source-map": "^24.9.0",
"@jest/test-result": "^24.9.0",
"@jest/types": "^24.9.0",
"callsites": "^3.0.0",
"chalk": "^2.0.1",
"graceful-fs": "^4.1.15",
"is-ci": "^2.0.0",
"mkdirp": "^0.5.1",
"slash": "^2.0.0",
"source-map": "^0.6.0"
}
},
"jest-worker": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
"integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
"dev": true,
"requires": {
"merge-stream": "^2.0.0",
"supports-color": "^6.1.0"
},
"dependencies": {
"supports-color": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"jsdom": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz",
"integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==",
"dev": true,
"requires": {
"abab": "^2.0.0",
"acorn": "^5.5.3",
"acorn-globals": "^4.1.0",
"array-equal": "^1.0.0",
"cssom": ">= 0.3.2 < 0.4.0",
"cssstyle": "^1.0.0",
"data-urls": "^1.0.0",
"domexception": "^1.0.1",
"escodegen": "^1.9.1",
"html-encoding-sniffer": "^1.0.2",
"left-pad": "^1.3.0",
"nwsapi": "^2.0.7",
"parse5": "4.0.0",
"pn": "^1.1.0",
"request": "^2.87.0",
"request-promise-native": "^1.0.5",
"sax": "^1.2.4",
"symbol-tree": "^3.2.2",
"tough-cookie": "^2.3.4",
"w3c-hr-time": "^1.0.1",
"webidl-conversions": "^4.0.2",
"whatwg-encoding": "^1.0.3",
"whatwg-mimetype": "^2.1.0",
"whatwg-url": "^6.4.1",
"ws": "^5.2.0",
"xml-name-validator": "^3.0.0"
}
},
"load-json-file": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
"integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"parse-json": "^4.0.0",
"pify": "^3.0.0",
"strip-bom": "^3.0.0"
}
},
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
"lodash": {
"version": "4.17.19",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
"dev": true
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
"requires": {
"p-limit": "^2.0.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
"dev": true,
"requires": {
"error-ex": "^1.3.1",
"json-parse-better-errors": "^1.0.1"
}
},
"parse5": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
"integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
"dev": true
},
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
"dev": true
},
"read-pkg": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
"integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
"dev": true,
"requires": {
"load-json-file": "^4.0.0",
"normalize-package-data": "^2.3.2",
"path-type": "^3.0.0"
}
},
"read-pkg-up": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
"integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
"dev": true,
"requires": {
"find-up": "^3.0.0",
"read-pkg": "^3.0.0"
}
},
"require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
"stack-utils": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
"integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
"dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
},
"test-exclude": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz",
"integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==",
"dev": true,
"requires": {
"glob": "^7.1.3",
"minimatch": "^3.0.4",
"read-pkg-up": "^4.0.0",
"require-main-filename": "^2.0.0"
}
},
"write-file-atomic": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz",
"integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.11",
"imurmurhash": "^0.1.4",
"signal-exit": "^3.0.2"
}
},
"ws": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
"integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
"dev": true,
"requires": {
"async-limiter": "~1.0.0"
}
}
}
},
"jest-environment-jsdom": {
"version": "26.1.0",
"resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.1.0.tgz",
@ -21205,6 +21869,17 @@
}
}
},
"jest-enzyme": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/jest-enzyme/-/jest-enzyme-7.1.2.tgz",
"integrity": "sha512-j+jkph3t5hGBS12eOldpfsnERYRCHi4c/0KWPMnqRPoJJXvCpLIc5th1MHl0xDznQDXVU0AHUXg3rqMrf8vGpA==",
"dev": true,
"requires": {
"enzyme-matchers": "^7.1.2",
"enzyme-to-json": "^3.3.0",
"jest-environment-enzyme": "^7.1.2"
}
},
"jest-get-type": {
"version": "25.2.6",
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
@ -23536,6 +24211,12 @@
"invert-kv": "^2.0.0"
}
},
"left-pad": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
"integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
"dev": true
},
"less": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz",
@ -23658,6 +24339,29 @@
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz",
"integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ=="
},
"lodash._baseisequal": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz",
"integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=",
"dev": true,
"requires": {
"lodash.isarray": "^3.0.0",
"lodash.istypedarray": "^3.0.0",
"lodash.keys": "^3.0.0"
}
},
"lodash._bindcallback": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz",
"integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=",
"dev": true
},
"lodash._getnative": {
"version": "3.9.1",
"resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
"integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
"dev": true
},
"lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
@ -23695,6 +24399,18 @@
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
},
"lodash.isarguments": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
"integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
"dev": true
},
"lodash.isarray": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
"integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
"dev": true
},
"lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
@ -23706,6 +24422,23 @@
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
"dev": true
},
"lodash.istypedarray": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz",
"integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=",
"dev": true
},
"lodash.keys": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
"integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
"dev": true,
"requires": {
"lodash._getnative": "^3.0.0",
"lodash.isarguments": "^3.0.0",
"lodash.isarray": "^3.0.0"
}
},
"lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@ -25566,6 +26299,12 @@
"find-up": "^2.1.0"
}
},
"pn": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
"integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
"dev": true
},
"pnp-webpack-plugin": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz",
@ -29951,6 +30690,15 @@
"readable-stream": "^2.0.2"
}
},
"realpath-native": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz",
"integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==",
"dev": true,
"requires": {
"util.promisify": "^1.0.0"
}
},
"recast": {
"version": "0.14.7",
"resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz",
@ -30362,7 +31110,6 @@
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
"dev": true,
"optional": true,
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",

View File

@ -215,6 +215,7 @@
"@svgr/webpack": "^5.4.0",
"@types/classnames": "^2.2.9",
"@types/dom-to-image": "^2.6.0",
"@types/enzyme-adapter-react-16": "^1.0.6",
"@types/jest": "^26.0.3",
"@types/jquery": "^3.3.32",
"@types/react": "^16.9.43",
@ -258,6 +259,8 @@
"ignore-styles": "^5.0.1",
"imports-loader": "^0.7.1",
"jest": "^26.1.0",
"jest-environment-enzyme": "^7.1.2",
"jest-enzyme": "^7.1.2",
"jsdom": "^16.2.2",
"less": "^3.9.0",
"less-loader": "^5.0.0",

View File

@ -16,10 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
/* eslint no-native-reassign: 0 */
import 'core-js/stable';
import 'regenerator-runtime/runtime';
import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only';
import 'jest-enzyme';
import jQuery from 'jquery';
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import { configure as configureTranslation } from '@superset-ui/translation';
@ -30,16 +31,23 @@ configure({ adapter: new Adapter() });
const exposedProperties = ['window', 'navigator', 'document'];
Object.keys(document.defaultView).forEach(property => {
if (typeof global[property] === 'undefined') {
exposedProperties.push(property);
global[property] = document.defaultView[property];
}
});
const defaultView = document.defaultView;
if (defaultView != null) {
Object.keys(defaultView).forEach(property => {
if (typeof global[property] === 'undefined') {
exposedProperties.push(property);
global[property] = defaultView[property];
}
});
}
global.window.location = { href: 'about:blank' };
global.window.performance = { now: () => new Date().getTime() };
global.$ = require('jquery')(global.window);
const g = global as any;
g.window = g.window || {};
g.window.location = { href: 'about:blank' };
g.window.performance = { now: () => new Date().getTime() };
g.$ = jQuery(g.window);
configureTranslation();
setupSupersetClient();

View File

@ -42,7 +42,7 @@ describe('CollectionTable', () => {
it('renders a table', () => {
const length = mockDatasource['7__table'].columns.length;
expect(wrapper.find('table')).toHaveLength(1);
expect(wrapper.find('table')).toExist();
expect(wrapper.find('tbody tr.row')).toHaveLength(length);
});
});

View File

@ -49,12 +49,12 @@ describe('AddSliceContainer', () => {
});
it('renders a select and a VizTypeControl', () => {
expect(wrapper.find(Select)).toHaveLength(1);
expect(wrapper.find(VizTypeControl)).toHaveLength(1);
expect(wrapper.find(Select)).toExist();
expect(wrapper.find(VizTypeControl)).toExist();
});
it('renders a button', () => {
expect(wrapper.find(Button)).toHaveLength(1);
expect(wrapper.find(Button)).toExist();
});
it('renders a disabled button if no datasource is selected', () => {

View File

@ -25,11 +25,11 @@ import ChartRenderer from 'src/chart/ChartRenderer';
describe('ChartRenderer', () => {
it('should render SuperChart', () => {
const wrapper = shallow(<ChartRenderer refreshOverlayVisible={false} />);
expect(wrapper.find(SuperChart)).toHaveLength(1);
expect(wrapper.find(SuperChart)).toExist();
});
it('should not render SuperChart when refreshOverlayVisible is true', () => {
const wrapper = shallow(<ChartRenderer refreshOverlayVisible />);
expect(wrapper.find(SuperChart)).toHaveLength(0);
expect(wrapper.find(SuperChart)).not.toExist();
});
});

View File

@ -201,7 +201,7 @@ describe('AlteredSliceTag', () => {
});
it('renders a ModalTrigger', () => {
expect(wrapper.find(ModalTrigger)).toHaveLength(1);
expect(wrapper.find(ModalTrigger)).toExist();
});
describe('renderTriggerNode', () => {

View File

@ -54,14 +54,14 @@ describe('AnchorLink', () => {
it('should render anchor link with id', () => {
const wrapper = shallow(<AnchorLink {...props} />);
expect(wrapper.find(`#${props.anchorLinkId}`)).toHaveLength(1);
expect(wrapper.find(URLShortLinkButton)).toHaveLength(0);
expect(wrapper.find(`#${props.anchorLinkId}`)).toExist();
expect(wrapper.find(URLShortLinkButton)).not.toExist();
});
it('should render URLShortLinkButton', () => {
const wrapper = shallow(<AnchorLink {...props} showShortLinkButton />);
expect(wrapper.find(URLShortLinkButton)).toHaveLength(1);
expect(wrapper.find(URLShortLinkButton).prop('placement')).toBe('right');
expect(wrapper.find(URLShortLinkButton)).toExist();
expect(wrapper.find(URLShortLinkButton)).toHaveProp({ placement: 'right' });
const targetUrl = wrapper.find(URLShortLinkButton).prop('url');
const hash = targetUrl.slice(targetUrl.indexOf('#') + 1);

View File

@ -48,7 +48,7 @@ describe('AsyncSelect', () => {
it('has one select', () => {
const wrapper = shallow(<AsyncSelect {...mockedProps} />);
expect(wrapper.find(Select)).toHaveLength(1);
expect(wrapper.find(Select)).toExist();
});
it('calls onChange on select change', () => {
@ -114,7 +114,7 @@ describe('AsyncSelect', () => {
setTimeout(() => {
expect(fetchMock.calls(dataGlob)).toHaveLength(1);
expect(onChangeSpy.mock.calls).toHaveLength(0);
expect(wrapper.find(Select)).toHaveLength(1);
expect(wrapper.find(Select)).toExist();
done();
});
});

View File

@ -33,6 +33,6 @@ describe('CachedLabel', () => {
});
it('renders', () => {
const wrapper = shallow(<CachedLabel {...defaultProps} />);
expect(wrapper.find(Label)).toHaveLength(1);
expect(wrapper.find(Label)).toExist();
});
});

View File

@ -40,7 +40,7 @@ describe('Checkbox', () => {
expect(React.isValidElement(<Checkbox {...defaultProps} />)).toBe(true);
});
it('inits checked when checked', () => {
expect(wrapper.find('i.fa-check.text-primary')).toHaveLength(1);
expect(wrapper.find('i.fa-check.text-primary')).toExist();
});
it('inits unchecked when not checked', () => {
const el = factory({ checked: false });
@ -48,7 +48,7 @@ describe('Checkbox', () => {
expect(el.find('i.fa-check.text-transparent')).toHaveLength(1);
});
it('unchecks when clicked', () => {
expect(wrapper.find('i.fa-check.text-transparent')).toHaveLength(0);
expect(wrapper.find('i.fa-check.text-transparent')).not.toExist();
wrapper.find('i').first().simulate('click');
expect(defaultProps.onChange.calledOnce).toBe(true);
});

View File

@ -48,7 +48,7 @@ describe('ConfirmStatusChange', () => {
wrapper.update();
expect(wrapper.find(Modal).exists()).toBeTruthy();
expect(wrapper.find(Modal)).toExist();
});
it('calls the function on confirm', () => {

View File

@ -42,7 +42,7 @@ describe('FilterableTable', () => {
);
});
it('renders a grid with 2 Table rows', () => {
expect(wrapper.find('.ReactVirtualized__Grid')).toHaveLength(1);
expect(wrapper.find('.ReactVirtualized__Grid')).toExist();
expect(wrapper.find('.ReactVirtualized__Table__row')).toHaveLength(3);
});
it('renders a grid with 2 Grid rows for wide tables', () => {
@ -72,7 +72,7 @@ describe('FilterableTable', () => {
filterText: 'b1',
};
wrapper = mount(<FilterableTable {...props} />);
expect(wrapper.find('.ReactVirtualized__Table__row')).toHaveLength(1);
expect(wrapper.find('.ReactVirtualized__Table__row')).toExist();
});
it('filters on a number', () => {
const props = {
@ -80,6 +80,6 @@ describe('FilterableTable', () => {
filterText: '100',
};
wrapper = mount(<FilterableTable {...props} />);
expect(wrapper.find('.ReactVirtualized__Table__row')).toHaveLength(1);
expect(wrapper.find('.ReactVirtualized__Table__row')).toExist();
});
});

View File

@ -46,13 +46,13 @@ describe('FormRow', () => {
});
it('renders an InfoTooltipWithTrigger only if needed', () => {
expect(wrapper.find(InfoTooltipWithTrigger)).toHaveLength(1);
expect(wrapper.find(InfoTooltipWithTrigger)).toExist();
wrapper = getWrapper({ tooltip: null });
expect(wrapper.find(InfoTooltipWithTrigger)).toHaveLength(0);
expect(wrapper.find(InfoTooltipWithTrigger)).not.toExist();
});
it('renders a Row and 2 Cols', () => {
expect(wrapper.find(Row)).toHaveLength(1);
expect(wrapper.find(Row)).toExist();
expect(wrapper.find(Col)).toHaveLength(2);
});
});

View File

@ -127,7 +127,7 @@ describe('ListView', () => {
});
it('calls fetchData on mount', () => {
expect(wrapper.find(ListView)).toHaveLength(1);
expect(wrapper.find(ListView)).toExist();
expect(mockedProps.fetchData.mock.calls[0]).toMatchInlineSnapshot(`
Array [
Object {
@ -162,10 +162,10 @@ describe('ListView', () => {
});
it('renders pagination controls', () => {
expect(wrapper.find(Pagination).exists()).toBe(true);
expect(wrapper.find(Pagination.Prev).exists()).toBe(true);
expect(wrapper.find(Pagination.Item).exists()).toBe(true);
expect(wrapper.find(Pagination.Next).exists()).toBe(true);
expect(wrapper.find(Pagination)).toExist();
expect(wrapper.find(Pagination.Prev)).toExist();
expect(wrapper.find(Pagination.Item)).toExist();
expect(wrapper.find(Pagination.Next)).toExist();
});
it('calls fetchData on page change', () => {
@ -298,7 +298,7 @@ describe('ListView', () => {
});
it('renders UI filters', () => {
expect(wrapper.find(ListViewFilters)).toHaveLength(1);
expect(wrapper.find(ListViewFilters)).toExist();
});
it('calls fetchData on filter', () => {

View File

@ -119,7 +119,7 @@ describe('Menu', () => {
});
it('renders the brand', () => {
expect(wrapper.find('.navbar-brand')).toHaveLength(1);
expect(wrapper.find('.navbar-brand')).toExist();
});
it('renders 2 navs', () => {

View File

@ -44,7 +44,7 @@ describe('PopoverSection', () => {
);
});
it('is show an icon when selected', () => {
expect(wrapper.find('.fa-check')).toHaveLength(1);
expect(wrapper.find('.fa-check')).toExist();
});
it('is show no icon when not selected', () => {
expect(factory({ isSelected: false }).find('.fa-check')).toHaveLength(0);

View File

@ -40,6 +40,6 @@ describe('URLShortLinkButton', () => {
it('renders OverlayTrigger', () => {
const wrapper = setup();
expect(wrapper.find(OverlayTrigger)).toHaveLength(1);
expect(wrapper.find(OverlayTrigger)).toExist();
});
});

View File

@ -40,6 +40,6 @@ describe('URLShortLinkModal', () => {
it('renders ModalTrigger', () => {
const wrapper = setup();
expect(wrapper.find(ModalTrigger)).toHaveLength(1);
expect(wrapper.find(ModalTrigger)).toExist();
});
});

View File

@ -34,6 +34,6 @@ describe('CodeModal', () => {
wrappingComponent: ThemeProvider,
wrappingComponentProps: { theme: supersetTheme },
});
expect(wrapper.find('.fa-edit')).toHaveLength(1);
expect(wrapper.find('.fa-edit')).toExist();
});
});

View File

@ -30,6 +30,6 @@ describe('CssEditor', () => {
});
it('renders the trigger node', () => {
const wrapper = mount(<CssEditor {...mockedProps} />);
expect(wrapper.find('.fa-edit')).toHaveLength(1);
expect(wrapper.find('.fa-edit')).toExist();
});
});

View File

@ -103,7 +103,7 @@ describe('DashboardBuilder', () => {
it('should render a DragDroppable DashboardHeader', () => {
const wrapper = setup(null, true);
expect(wrapper.find(DashboardHeader)).toHaveLength(1);
expect(wrapper.find(DashboardHeader)).toExist();
});
it('should render a Sticky top-level Tabs if the dashboard has tabs', () => {
@ -150,26 +150,26 @@ describe('DashboardBuilder', () => {
it('should render a BuilderComponentPane if editMode=true and user selects "Insert Components" pane', () => {
const wrapper = setup();
expect(wrapper.find(BuilderComponentPane)).toHaveLength(0);
expect(wrapper.find(BuilderComponentPane)).not.toExist();
wrapper.setProps({
...props,
editMode: true,
builderPaneType: BUILDER_PANE_TYPE.ADD_COMPONENTS,
});
expect(wrapper.find(BuilderComponentPane)).toHaveLength(1);
expect(wrapper.find(BuilderComponentPane)).toExist();
});
it('should render a BuilderComponentPane if editMode=true and user selects "Colors" pane', () => {
const wrapper = setup();
expect(wrapper.find(BuilderComponentPane)).toHaveLength(0);
expect(wrapper.find(BuilderComponentPane)).not.toExist();
wrapper.setProps({
...props,
editMode: true,
builderPaneType: BUILDER_PANE_TYPE.COLORS,
});
expect(wrapper.find(BuilderComponentPane)).toHaveLength(1);
expect(wrapper.find(BuilderComponentPane)).toExist();
});
it('should change redux state if a top-level Tab is clicked', () => {

View File

@ -48,7 +48,7 @@ describe('DashboardGrid', () => {
it('should render a div with class "dashboard-grid"', () => {
const wrapper = setup();
expect(wrapper.find('.dashboard-grid')).toHaveLength(1);
expect(wrapper.find('.dashboard-grid')).toExist();
});
it('should render one DashboardComponent for each gridComponent child', () => {
@ -67,7 +67,7 @@ describe('DashboardGrid', () => {
it('should render grid column guides when resizing', () => {
const wrapper = setup({ editMode: true });
expect(wrapper.find('.grid-column-guide')).toHaveLength(0);
expect(wrapper.find('.grid-column-guide')).not.toExist();
wrapper.setState({ isResizing: true });
@ -76,9 +76,9 @@ describe('DashboardGrid', () => {
it('should render a grid row guide when resizing', () => {
const wrapper = setup();
expect(wrapper.find('.grid-row-guide')).toHaveLength(0);
expect(wrapper.find('.grid-row-guide')).not.toExist();
wrapper.setState({ isResizing: true, rowGuideTop: 10 });
expect(wrapper.find('.grid-row-guide')).toHaveLength(1);
expect(wrapper.find('.grid-row-guide')).toExist();
});
it('should call resizeComponent when a child DashboardComponent calls resizeStop', () => {

View File

@ -70,7 +70,7 @@ describe('Dashboard', () => {
it('should render a DashboardBuilder', () => {
const wrapper = setup();
expect(wrapper.find(DashboardBuilder)).toHaveLength(1);
expect(wrapper.find(DashboardBuilder)).toExist();
});
describe('componentWillReceiveProps', () => {

View File

@ -45,6 +45,6 @@ describe('FilterIndicatorGroup', () => {
it('should show indicator group with badge', () => {
const wrapper = setup();
expect(wrapper.find(FilterBadgeIcon)).toHaveLength(1);
expect(wrapper.find(FilterBadgeIcon)).toExist();
});
});

View File

@ -38,6 +38,6 @@ describe('FilterIndicatorTooltip', () => {
it('should show label', () => {
const wrapper = setup();
expect(wrapper.find(`[htmlFor="filter-tooltip-${label}"]`)).toHaveLength(1);
expect(wrapper.find(`[htmlFor="filter-tooltip-${label}"]`)).toExist();
});
});

View File

@ -42,7 +42,7 @@ describe('FilterIndicator', () => {
it('should show indicator with badge', () => {
const wrapper = setup();
expect(wrapper.find(FilterBadgeIcon)).toHaveLength(1);
expect(wrapper.find(FilterBadgeIcon)).toExist();
});
it('should call setDirectPathToChild prop', () => {

View File

@ -56,17 +56,17 @@ describe('FilterIndicatorsContainer', () => {
it('should not show indicator when chart is loading', () => {
const wrapper = setup({ chartStatus: 'loading' });
expect(wrapper.find(FilterIndicator)).toHaveLength(0);
expect(wrapper.find(FilterIndicator)).not.toExist();
});
it('should not show indicator for filter_box itself', () => {
const wrapper = setup({ chartId: filterId });
expect(wrapper.find(FilterIndicator)).toHaveLength(0);
expect(wrapper.find(FilterIndicator)).not.toExist();
});
it('should show indicator', () => {
const wrapper = setup();
expect(wrapper.find(FilterIndicator)).toHaveLength(1);
expect(wrapper.find(FilterIndicator)).toExist();
});
it('should not show indicator when chart is immune', () => {
@ -83,7 +83,7 @@ describe('FilterIndicatorsContainer', () => {
},
};
const wrapper = setup({ dashboardFilters: overwriteDashboardFilters });
expect(wrapper.find(FilterIndicator)).toHaveLength(0);
expect(wrapper.find(FilterIndicator)).not.toExist();
});
it('should show single number type value', () => {
@ -97,7 +97,7 @@ describe('FilterIndicatorsContainer', () => {
},
};
const wrapper = setup({ dashboardFilters: overwriteDashboardFilters });
expect(wrapper.find(FilterIndicator)).toHaveLength(1);
expect(wrapper.find(FilterIndicator)).toExist();
const indicatorProps = wrapper.find(FilterIndicator).first().props()
.indicator;

View File

@ -44,8 +44,8 @@ describe('FilterTooltipWrapper', () => {
it('should contain Overlay and Tooltip', () => {
const wrapper = setup();
expect(wrapper.find(Overlay)).toHaveLength(1);
expect(wrapper.find(Tooltip)).toHaveLength(1);
expect(wrapper.find(Overlay)).toExist();
expect(wrapper.find(Tooltip)).toExist();
});
it('should show tooltip on hover', async () => {

View File

@ -58,12 +58,12 @@ describe('HeaderActionsDropdown', () => {
it('should render the DropdownButton', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(DropdownButton)).toHaveLength(1);
expect(wrapper.find(DropdownButton)).toExist();
});
it('should not render the SaveModal', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(SaveModal)).toHaveLength(0);
expect(wrapper.find(SaveModal)).not.toExist();
});
it('should render two MenuItems', () => {
@ -73,17 +73,17 @@ describe('HeaderActionsDropdown', () => {
it('should render the RefreshIntervalModal', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(RefreshIntervalModal)).toHaveLength(1);
expect(wrapper.find(RefreshIntervalModal)).toExist();
});
it('should render the URLShortLinkModal', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(URLShortLinkModal)).toHaveLength(1);
expect(wrapper.find(URLShortLinkModal)).toExist();
});
it('should not render the CssEditor', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(CssEditor)).toHaveLength(0);
expect(wrapper.find(CssEditor)).not.toExist();
});
});
@ -92,12 +92,12 @@ describe('HeaderActionsDropdown', () => {
it('should render the DropdownButton', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(DropdownButton)).toHaveLength(1);
expect(wrapper.find(DropdownButton)).toExist();
});
it('should render the SaveModal', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(SaveModal)).toHaveLength(1);
expect(wrapper.find(SaveModal)).toExist();
});
it('should render three MenuItems', () => {
@ -107,17 +107,17 @@ describe('HeaderActionsDropdown', () => {
it('should render the RefreshIntervalModal', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(RefreshIntervalModal)).toHaveLength(1);
expect(wrapper.find(RefreshIntervalModal)).toExist();
});
it('should render the URLShortLinkModal', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(URLShortLinkModal)).toHaveLength(1);
expect(wrapper.find(URLShortLinkModal)).toExist();
});
it('should not render the CssEditor', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(CssEditor)).toHaveLength(0);
expect(wrapper.find(CssEditor)).not.toExist();
});
});
@ -126,12 +126,12 @@ describe('HeaderActionsDropdown', () => {
it('should render the DropdownButton', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(DropdownButton)).toHaveLength(1);
expect(wrapper.find(DropdownButton)).toExist();
});
it('should render the SaveModal', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(SaveModal)).toHaveLength(1);
expect(wrapper.find(SaveModal)).toExist();
});
it('should render three MenuItems', () => {
@ -141,17 +141,17 @@ describe('HeaderActionsDropdown', () => {
it('should render the RefreshIntervalModal', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(RefreshIntervalModal)).toHaveLength(1);
expect(wrapper.find(RefreshIntervalModal)).toExist();
});
it('should render the URLShortLinkModal', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(URLShortLinkModal)).toHaveLength(1);
expect(wrapper.find(URLShortLinkModal)).toExist();
});
it('should render the CssEditor', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(CssEditor)).toHaveLength(1);
expect(wrapper.find(CssEditor)).toExist();
});
});
});

View File

@ -93,32 +93,32 @@ describe('Header', () => {
it('should render the EditableTitle', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(EditableTitle)).toHaveLength(1);
expect(wrapper.find(EditableTitle)).toExist();
});
it('should render the PublishedStatus', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(PublishedStatus)).toHaveLength(1);
expect(wrapper.find(PublishedStatus)).toExist();
});
it('should render the FaveStar', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(FaveStar)).toHaveLength(1);
expect(wrapper.find(FaveStar)).toExist();
});
it('should render the HeaderActionsDropdown', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(HeaderActionsDropdown)).toHaveLength(1);
expect(wrapper.find(HeaderActionsDropdown)).toExist();
});
it('should render one Button', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(Button)).toHaveLength(1);
expect(wrapper.find(Button)).toExist();
});
it('should not set up undo/redo', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(UndoRedoKeylisteners)).toHaveLength(0);
expect(wrapper.find(UndoRedoKeylisteners)).not.toExist();
});
});
@ -136,32 +136,32 @@ describe('Header', () => {
it('should render the EditableTitle', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(EditableTitle)).toHaveLength(1);
expect(wrapper.find(EditableTitle)).toExist();
});
it('should render the PublishedStatus', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(PublishedStatus)).toHaveLength(1);
expect(wrapper.find(PublishedStatus)).toExist();
});
it('should render the FaveStar', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(FaveStar)).toHaveLength(1);
expect(wrapper.find(FaveStar)).toExist();
});
it('should render the HeaderActionsDropdown', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(HeaderActionsDropdown)).toHaveLength(1);
expect(wrapper.find(HeaderActionsDropdown)).toExist();
});
it('should render one Button', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(Button)).toHaveLength(1);
expect(wrapper.find(Button)).toExist();
});
it('should not set up undo/redo', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(UndoRedoKeylisteners)).toHaveLength(0);
expect(wrapper.find(UndoRedoKeylisteners)).not.toExist();
});
});
@ -179,22 +179,22 @@ describe('Header', () => {
it('should render the EditableTitle', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(EditableTitle)).toHaveLength(1);
expect(wrapper.find(EditableTitle)).toExist();
});
it('should render the FaveStar', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(FaveStar)).toHaveLength(1);
expect(wrapper.find(FaveStar)).toExist();
});
it('should render the PublishedStatus', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(PublishedStatus)).toHaveLength(1);
expect(wrapper.find(PublishedStatus)).toExist();
});
it('should render the HeaderActionsDropdown', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(HeaderActionsDropdown)).toHaveLength(1);
expect(wrapper.find(HeaderActionsDropdown)).toExist();
});
it('should render five Buttons', () => {
@ -204,7 +204,7 @@ describe('Header', () => {
it('should set up undo/redo', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(UndoRedoKeylisteners)).toHaveLength(1);
expect(wrapper.find(UndoRedoKeylisteners)).toExist();
});
});
@ -221,32 +221,32 @@ describe('Header', () => {
it('should render the EditableTitle', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(EditableTitle)).toHaveLength(1);
expect(wrapper.find(EditableTitle)).toExist();
});
it('should render the PublishedStatus', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(PublishedStatus)).toHaveLength(1);
expect(wrapper.find(PublishedStatus)).toExist();
});
it('should not render the FaveStar', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(FaveStar)).toHaveLength(0);
expect(wrapper.find(FaveStar)).not.toExist();
});
it('should render the HeaderActionsDropdown', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(HeaderActionsDropdown)).toHaveLength(1);
expect(wrapper.find(HeaderActionsDropdown)).toExist();
});
it('should render one Button', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(Button)).toHaveLength(1);
expect(wrapper.find(Button)).toExist();
});
it('should not set up undo/redo', () => {
const wrapper = setup(overrideProps);
expect(wrapper.find(UndoRedoKeylisteners)).toHaveLength(0);
expect(wrapper.find(UndoRedoKeylisteners)).not.toExist();
});
});
});

View File

@ -29,11 +29,11 @@ describe('MissingChart', () => {
it('renders a .missing-chart-container', () => {
const wrapper = setup();
expect(wrapper.find('.missing-chart-container')).toHaveLength(1);
expect(wrapper.find('.missing-chart-container')).toExist();
});
it('renders a .missing-chart-body', () => {
const wrapper = setup();
expect(wrapper.find('.missing-chart-body')).toHaveLength(1);
expect(wrapper.find('.missing-chart-body')).toExist();
});
});

View File

@ -37,7 +37,7 @@ describe('RefreshIntervalModal', () => {
});
it('renders the trigger node', () => {
const wrapper = mount(<RefreshIntervalModal {...mockedProps} />);
expect(wrapper.find('.fa-edit')).toHaveLength(1);
expect(wrapper.find('.fa-edit')).toExist();
});
it('should render a interval seconds', () => {
const wrapper = mount(<RefreshIntervalModal {...mockedProps} />);
@ -59,9 +59,9 @@ describe('RefreshIntervalModal', () => {
const wrapper = shallow(<RefreshIntervalModal {...props} />);
wrapper.instance().handleFrequencyChange({ value: 30 });
expect(wrapper.find(ModalTrigger).dive().find(Alert)).toHaveLength(1);
expect(wrapper.find(ModalTrigger).dive().find(Alert)).toExist();
wrapper.instance().handleFrequencyChange({ value: 3601 });
expect(wrapper.find(ModalTrigger).dive().find(Alert)).toHaveLength(0);
expect(wrapper.find(ModalTrigger).dive().find(Alert)).not.toExist();
});
});

View File

@ -74,7 +74,7 @@ describe('SliceAdder', () => {
it('render List', () => {
const wrapper = shallow(<SliceAdder {...props} />);
wrapper.setState({ filteredSlices: Object.values(props.slices) });
expect(wrapper.find(List)).toHaveLength(1);
expect(wrapper.find(List)).toExist();
});
it('render error', () => {

View File

@ -47,12 +47,12 @@ describe('DragDroppable', () => {
it('should render a div with class dragdroppable', () => {
const wrapper = setup();
expect(wrapper.find('.dragdroppable')).toHaveLength(1);
expect(wrapper.find('.dragdroppable')).toExist();
});
it('should add class dragdroppable--dragging when dragging', () => {
const wrapper = setup({ isDragging: true });
expect(wrapper.find('.dragdroppable')).toHaveLength(1);
expect(wrapper.find('.dragdroppable')).toExist();
});
it('should call its child function', () => {

View File

@ -67,12 +67,12 @@ describe('ChartHolder', () => {
it('should render a DragDroppable', () => {
const wrapper = setup();
expect(wrapper.find(DragDroppable)).toHaveLength(1);
expect(wrapper.find(DragDroppable)).toExist();
});
it('should render a ResizableContainer', () => {
const wrapper = setup();
expect(wrapper.find(ResizableContainer)).toHaveLength(1);
expect(wrapper.find(ResizableContainer)).toExist();
});
it('should only have an adjustableWidth if its parent is a Row', () => {
@ -98,23 +98,23 @@ describe('ChartHolder', () => {
it('should render a div with class "dashboard-component-chart-holder"', () => {
const wrapper = setup();
expect(wrapper.find('.dashboard-component-chart-holder')).toHaveLength(1);
expect(wrapper.find('.dashboard-component-chart-holder')).toExist();
});
it('should render a Chart', () => {
const wrapper = setup();
expect(wrapper.find(Chart)).toHaveLength(1);
expect(wrapper.find(Chart)).toExist();
});
it('should render a HoverMenu with DeleteComponentButton in editMode', () => {
let wrapper = setup();
expect(wrapper.find(HoverMenu)).toHaveLength(0);
expect(wrapper.find(DeleteComponentButton)).toHaveLength(0);
expect(wrapper.find(HoverMenu)).not.toExist();
expect(wrapper.find(DeleteComponentButton)).not.toExist();
// we cannot set props on the Divider because of the WithDragDropContext wrapper
wrapper = setup({ editMode: true });
expect(wrapper.find(HoverMenu)).toHaveLength(1);
expect(wrapper.find(DeleteComponentButton)).toHaveLength(1);
expect(wrapper.find(HoverMenu)).toExist();
expect(wrapper.find(DeleteComponentButton)).toExist();
});
it('should call deleteComponent when deleted', () => {

View File

@ -66,20 +66,20 @@ describe('Chart', () => {
it('should render a SliceHeader', () => {
const wrapper = setup();
expect(wrapper.find(SliceHeader)).toHaveLength(1);
expect(wrapper.find(SliceHeader)).toExist();
});
it('should render a ChartContainer', () => {
const wrapper = setup();
expect(wrapper.find(ChartContainer)).toHaveLength(1);
expect(wrapper.find(ChartContainer)).toExist();
});
it('should render a description if it has one and isExpanded=true', () => {
const wrapper = setup();
expect(wrapper.find('.slice_description')).toHaveLength(0);
expect(wrapper.find('.slice_description')).not.toExist();
wrapper.setProps({ ...props, isExpanded: true });
expect(wrapper.find('.slice_description')).toHaveLength(1);
expect(wrapper.find('.slice_description')).toExist();
});
it('should call refreshChart when SliceHeader calls forceRefresh', () => {

View File

@ -76,42 +76,42 @@ describe('Column', () => {
it('should render a DragDroppable', () => {
// don't count child DragDroppables
const wrapper = setup({ component: columnWithoutChildren });
expect(wrapper.find(DragDroppable)).toHaveLength(1);
expect(wrapper.find(DragDroppable)).toExist();
});
it('should render a WithPopoverMenu', () => {
// don't count child DragDroppables
const wrapper = setup({ component: columnWithoutChildren });
expect(wrapper.find(WithPopoverMenu)).toHaveLength(1);
expect(wrapper.find(WithPopoverMenu)).toExist();
});
it('should render a ResizableContainer', () => {
// don't count child DragDroppables
const wrapper = setup({ component: columnWithoutChildren });
expect(wrapper.find(ResizableContainer)).toHaveLength(1);
expect(wrapper.find(ResizableContainer)).toExist();
});
it('should render a HoverMenu in editMode', () => {
let wrapper = setup({ component: columnWithoutChildren });
expect(wrapper.find(HoverMenu)).toHaveLength(0);
expect(wrapper.find(HoverMenu)).not.toExist();
// we cannot set props on the Row because of the WithDragDropContext wrapper
wrapper = setup({ component: columnWithoutChildren, editMode: true });
expect(wrapper.find(HoverMenu)).toHaveLength(1);
expect(wrapper.find(HoverMenu)).toExist();
});
it('should render a DeleteComponentButton in editMode', () => {
let wrapper = setup({ component: columnWithoutChildren });
expect(wrapper.find(DeleteComponentButton)).toHaveLength(0);
expect(wrapper.find(DeleteComponentButton)).not.toExist();
// we cannot set props on the Row because of the WithDragDropContext wrapper
wrapper = setup({ component: columnWithoutChildren, editMode: true });
expect(wrapper.find(DeleteComponentButton)).toHaveLength(1);
expect(wrapper.find(DeleteComponentButton)).toExist();
});
it('should render a BackgroundStyleDropdown when focused', () => {
let wrapper = setup({ component: columnWithoutChildren });
expect(wrapper.find(BackgroundStyleDropdown)).toHaveLength(0);
expect(wrapper.find(BackgroundStyleDropdown)).not.toExist();
// we cannot set props on the Row because of the WithDragDropContext wrapper
wrapper = setup({ component: columnWithoutChildren, editMode: true });
@ -120,7 +120,7 @@ describe('Column', () => {
.at(1) // first one is delete button
.simulate('click');
expect(wrapper.find(BackgroundStyleDropdown)).toHaveLength(1);
expect(wrapper.find(BackgroundStyleDropdown)).toExist();
});
it('should call deleteComponent when deleted', () => {

View File

@ -58,23 +58,23 @@ describe('Divider', () => {
it('should render a DragDroppable', () => {
const wrapper = setup();
expect(wrapper.find(DragDroppable)).toHaveLength(1);
expect(wrapper.find(DragDroppable)).toExist();
});
it('should render a div with class "dashboard-component-divider"', () => {
const wrapper = setup();
expect(wrapper.find('.dashboard-component-divider')).toHaveLength(1);
expect(wrapper.find('.dashboard-component-divider')).toExist();
});
it('should render a HoverMenu with DeleteComponentButton in editMode', () => {
let wrapper = setup();
expect(wrapper.find(HoverMenu)).toHaveLength(0);
expect(wrapper.find(DeleteComponentButton)).toHaveLength(0);
expect(wrapper.find(HoverMenu)).not.toExist();
expect(wrapper.find(DeleteComponentButton)).not.toExist();
// we cannot set props on the Divider because of the WithDragDropContext wrapper
wrapper = setup({ editMode: true });
expect(wrapper.find(HoverMenu)).toHaveLength(1);
expect(wrapper.find(DeleteComponentButton)).toHaveLength(1);
expect(wrapper.find(HoverMenu)).toExist();
expect(wrapper.find(DeleteComponentButton)).toExist();
});
it('should call deleteComponent when deleted', () => {

View File

@ -66,26 +66,26 @@ describe('Header', () => {
it('should render a DragDroppable', () => {
const wrapper = setup();
expect(wrapper.find(DragDroppable)).toHaveLength(1);
expect(wrapper.find(DragDroppable)).toExist();
});
it('should render a WithPopoverMenu', () => {
const wrapper = setup();
expect(wrapper.find(WithPopoverMenu)).toHaveLength(1);
expect(wrapper.find(WithPopoverMenu)).toExist();
});
it('should render a HoverMenu in editMode', () => {
let wrapper = setup();
expect(wrapper.find(HoverMenu)).toHaveLength(0);
expect(wrapper.find(HoverMenu)).not.toExist();
// we cannot set props on the Header because of the WithDragDropContext wrapper
wrapper = setup({ editMode: true });
expect(wrapper.find(HoverMenu)).toHaveLength(1);
expect(wrapper.find(HoverMenu)).toExist();
});
it('should render an EditableTitle with meta.text', () => {
const wrapper = setup();
expect(wrapper.find(EditableTitle)).toHaveLength(1);
expect(wrapper.find(EditableTitle)).toExist();
expect(wrapper.find('input').prop('value')).toBe(props.component.meta.text);
});
@ -105,7 +105,7 @@ describe('Header', () => {
const wrapper = setup({ editMode: true });
wrapper.find(WithPopoverMenu).simulate('click'); // focus
expect(wrapper.find(DeleteComponentButton)).toHaveLength(1);
expect(wrapper.find(DeleteComponentButton)).toExist();
});
it('should call deleteComponent when deleted', () => {

View File

@ -69,17 +69,17 @@ describe('Markdown', () => {
it('should render a DragDroppable', () => {
const wrapper = setup();
expect(wrapper.find(DragDroppable)).toHaveLength(1);
expect(wrapper.find(DragDroppable)).toExist();
});
it('should render a WithPopoverMenu', () => {
const wrapper = setup();
expect(wrapper.find(WithPopoverMenu)).toHaveLength(1);
expect(wrapper.find(WithPopoverMenu)).toExist();
});
it('should render a ResizableContainer', () => {
const wrapper = setup();
expect(wrapper.find(ResizableContainer)).toHaveLength(1);
expect(wrapper.find(ResizableContainer)).toExist();
});
it('should only have an adjustableWidth if its parent is a Row', () => {
@ -105,24 +105,24 @@ describe('Markdown', () => {
it('should render an Markdown when NOT focused', () => {
const wrapper = setup();
expect(wrapper.find(AceEditor)).toHaveLength(0);
expect(wrapper.find(ReactMarkdown)).toHaveLength(1);
expect(wrapper.find(AceEditor)).not.toExist();
expect(wrapper.find(ReactMarkdown)).toExist();
});
it('should render an AceEditor when focused and editMode=true and editorMode=edit', () => {
const wrapper = setup({ editMode: true });
expect(wrapper.find(AceEditor)).toHaveLength(0);
expect(wrapper.find(ReactMarkdown)).toHaveLength(1);
expect(wrapper.find(AceEditor)).not.toExist();
expect(wrapper.find(ReactMarkdown)).toExist();
wrapper.find(WithPopoverMenu).simulate('click'); // focus + edit
expect(wrapper.find(AceEditor)).toHaveLength(1);
expect(wrapper.find(ReactMarkdown)).toHaveLength(0);
expect(wrapper.find(AceEditor)).toExist();
expect(wrapper.find(ReactMarkdown)).not.toExist();
});
it('should render a ReactMarkdown when focused and editMode=true and editorMode=preview', () => {
const wrapper = setup({ editMode: true });
wrapper.find(WithPopoverMenu).simulate('click'); // focus + edit
expect(wrapper.find(AceEditor)).toHaveLength(1);
expect(wrapper.find(ReactMarkdown)).toHaveLength(0);
expect(wrapper.find(AceEditor)).toExist();
expect(wrapper.find(ReactMarkdown)).not.toExist();
// we can't call setState on Markdown bc it's not the root component, so call
// the mode dropdown onchange instead
@ -130,8 +130,8 @@ describe('Markdown', () => {
dropdown.prop('onChange')('preview');
wrapper.update();
expect(wrapper.find(ReactMarkdown)).toHaveLength(1);
expect(wrapper.find(AceEditor)).toHaveLength(0);
expect(wrapper.find(ReactMarkdown)).toExist();
expect(wrapper.find(AceEditor)).not.toExist();
});
it('should call updateComponents when editMode changes from edit => preview, and there are markdownSource changes', () => {
@ -158,7 +158,7 @@ describe('Markdown', () => {
const wrapper = setup({ editMode: true });
wrapper.find(WithPopoverMenu).simulate('click'); // focus
expect(wrapper.find(DeleteComponentButton)).toHaveLength(1);
expect(wrapper.find(DeleteComponentButton)).toExist();
});
it('should call deleteComponent when deleted', () => {

View File

@ -72,36 +72,36 @@ describe('Row', () => {
it('should render a DragDroppable', () => {
// don't count child DragDroppables
const wrapper = setup({ component: rowWithoutChildren });
expect(wrapper.find(DragDroppable)).toHaveLength(1);
expect(wrapper.find(DragDroppable)).toExist();
});
it('should render a WithPopoverMenu', () => {
// don't count child DragDroppables
const wrapper = setup({ component: rowWithoutChildren });
expect(wrapper.find(WithPopoverMenu)).toHaveLength(1);
expect(wrapper.find(WithPopoverMenu)).toExist();
});
it('should render a HoverMenu in editMode', () => {
let wrapper = setup({ component: rowWithoutChildren });
expect(wrapper.find(HoverMenu)).toHaveLength(0);
expect(wrapper.find(HoverMenu)).not.toExist();
// we cannot set props on the Row because of the WithDragDropContext wrapper
wrapper = setup({ component: rowWithoutChildren, editMode: true });
expect(wrapper.find(HoverMenu)).toHaveLength(1);
expect(wrapper.find(HoverMenu)).toExist();
});
it('should render a DeleteComponentButton in editMode', () => {
let wrapper = setup({ component: rowWithoutChildren });
expect(wrapper.find(DeleteComponentButton)).toHaveLength(0);
expect(wrapper.find(DeleteComponentButton)).not.toExist();
// we cannot set props on the Row because of the WithDragDropContext wrapper
wrapper = setup({ component: rowWithoutChildren, editMode: true });
expect(wrapper.find(DeleteComponentButton)).toHaveLength(1);
expect(wrapper.find(DeleteComponentButton)).toExist();
});
it('should render a BackgroundStyleDropdown when focused', () => {
let wrapper = setup({ component: rowWithoutChildren });
expect(wrapper.find(BackgroundStyleDropdown)).toHaveLength(0);
expect(wrapper.find(BackgroundStyleDropdown)).not.toExist();
// we cannot set props on the Row because of the WithDragDropContext wrapper
wrapper = setup({ component: rowWithoutChildren, editMode: true });
@ -110,7 +110,7 @@ describe('Row', () => {
.at(1) // first one is delete button
.simulate('click');
expect(wrapper.find(BackgroundStyleDropdown)).toHaveLength(1);
expect(wrapper.find(BackgroundStyleDropdown)).toExist();
});
it('should call deleteComponent when deleted', () => {

View File

@ -74,7 +74,7 @@ describe('Tabs', () => {
describe('renderType=RENDER_TAB', () => {
it('should render a DragDroppable', () => {
const wrapper = setup();
expect(wrapper.find(DragDroppable)).toHaveLength(1);
expect(wrapper.find(DragDroppable)).toExist();
});
it('should render an EditableTitle with meta.text', () => {
@ -97,17 +97,17 @@ describe('Tabs', () => {
it('should render a WithPopoverMenu', () => {
const wrapper = setup();
expect(wrapper.find(WithPopoverMenu)).toHaveLength(1);
expect(wrapper.find(WithPopoverMenu)).toExist();
});
it('should render a DeleteComponentModal when focused if its not the only tab', () => {
let wrapper = setup();
wrapper.find(WithPopoverMenu).simulate('click'); // focus
expect(wrapper.find(DeleteComponentModal)).toHaveLength(0);
expect(wrapper.find(DeleteComponentModal)).not.toExist();
wrapper = setup({ editMode: true });
wrapper.find(WithPopoverMenu).simulate('click');
expect(wrapper.find(DeleteComponentModal)).toHaveLength(1);
expect(wrapper.find(DeleteComponentModal)).toExist();
wrapper = setup({
editMode: true,
@ -117,7 +117,7 @@ describe('Tabs', () => {
},
});
wrapper.find(WithPopoverMenu).simulate('click');
expect(wrapper.find(DeleteComponentModal)).toHaveLength(0);
expect(wrapper.find(DeleteComponentModal)).not.toExist();
});
it('should show modal when clicked delete icon', () => {

View File

@ -71,12 +71,12 @@ describe('Tabs', () => {
it('should render a DragDroppable', () => {
// test just Tabs with no children DragDroppables
const wrapper = setup({ component: { ...props.component, children: [] } });
expect(wrapper.find(DragDroppable)).toHaveLength(1);
expect(wrapper.find(DragDroppable)).toExist();
});
it('should render BootstrapTabs', () => {
const wrapper = setup();
expect(wrapper.find(BootstrapTabs)).toHaveLength(1);
expect(wrapper.find(BootstrapTabs)).toExist();
});
it('should set animation=true, mountOnEnter=true, and unmounOnExit=false on BootstrapTabs for perf', () => {
@ -144,18 +144,18 @@ describe('Tabs', () => {
it('should render a HoverMenu in editMode', () => {
let wrapper = setup();
expect(wrapper.find(HoverMenu)).toHaveLength(0);
expect(wrapper.find(HoverMenu)).not.toExist();
wrapper = setup({ editMode: true });
expect(wrapper.find(HoverMenu)).toHaveLength(1);
expect(wrapper.find(HoverMenu)).toExist();
});
it('should render a DeleteComponentButton in editMode', () => {
let wrapper = setup();
expect(wrapper.find(DeleteComponentButton)).toHaveLength(0);
expect(wrapper.find(DeleteComponentButton)).not.toExist();
wrapper = setup({ editMode: true });
expect(wrapper.find(DeleteComponentButton)).toHaveLength(1);
expect(wrapper.find(DeleteComponentButton)).toExist();
});
it('should call deleteComponent when deleted', () => {

View File

@ -49,7 +49,7 @@ describe('DraggableNewComponent', () => {
it('should render a DragDroppable', () => {
const wrapper = setup();
expect(wrapper.find(DragDroppable)).toHaveLength(1);
expect(wrapper.find(DragDroppable)).toExist();
});
it('should pass component={ type, id } to DragDroppable', () => {
@ -78,6 +78,6 @@ describe('DraggableNewComponent', () => {
it('should add the passed className', () => {
const wrapper = setup();
const className = `.new-component-placeholder.${props.className}`;
expect(wrapper.find(className)).toHaveLength(1);
expect(wrapper.find(className)).toExist();
});
});

View File

@ -32,7 +32,7 @@ describe('NewColumn', () => {
it('should render a DraggableNewComponent', () => {
const wrapper = setup();
expect(wrapper.find(DraggableNewComponent)).toHaveLength(1);
expect(wrapper.find(DraggableNewComponent)).toExist();
});
it('should set appropriate type and id', () => {

View File

@ -32,7 +32,7 @@ describe('NewDivider', () => {
it('should render a DraggableNewComponent', () => {
const wrapper = setup();
expect(wrapper.find(DraggableNewComponent)).toHaveLength(1);
expect(wrapper.find(DraggableNewComponent)).toExist();
});
it('should set appropriate type and id', () => {

View File

@ -32,7 +32,7 @@ describe('NewHeader', () => {
it('should render a DraggableNewComponent', () => {
const wrapper = setup();
expect(wrapper.find(DraggableNewComponent)).toHaveLength(1);
expect(wrapper.find(DraggableNewComponent)).toExist();
});
it('should set appropriate type and id', () => {

View File

@ -32,7 +32,7 @@ describe('NewRow', () => {
it('should render a DraggableNewComponent', () => {
const wrapper = setup();
expect(wrapper.find(DraggableNewComponent)).toHaveLength(1);
expect(wrapper.find(DraggableNewComponent)).toExist();
});
it('should set appropriate type and id', () => {

View File

@ -32,7 +32,7 @@ describe('NewTabs', () => {
it('should render a DraggableNewComponent', () => {
const wrapper = setup();
expect(wrapper.find(DraggableNewComponent)).toHaveLength(1);
expect(wrapper.find(DraggableNewComponent)).toExist();
});
it('should set appropriate type and id', () => {

View File

@ -24,6 +24,6 @@ import HoverMenu from 'src/dashboard/components/menu/HoverMenu';
describe('HoverMenu', () => {
it('should render a div.hover-menu', () => {
const wrapper = shallow(<HoverMenu />);
expect(wrapper.find('.hover-menu')).toHaveLength(1);
expect(wrapper.find('.hover-menu')).toExist();
});
});

View File

@ -39,12 +39,12 @@ describe('WithPopoverMenu', () => {
it('should render a div with class "with-popover-menu"', () => {
const wrapper = setup();
expect(wrapper.find('.with-popover-menu')).toHaveLength(1);
expect(wrapper.find('.with-popover-menu')).toExist();
});
it('should render the passed children', () => {
const wrapper = setup();
expect(wrapper.find('#child')).toHaveLength(1);
expect(wrapper.find('#child')).toExist();
});
it('should focus on click in editMode', () => {
@ -61,12 +61,12 @@ describe('WithPopoverMenu', () => {
it('should render menuItems when focused', () => {
const wrapper = setup({ editMode: true });
expect(wrapper.find('#menu1')).toHaveLength(0);
expect(wrapper.find('#menu2')).toHaveLength(0);
expect(wrapper.find('#menu1')).not.toExist();
expect(wrapper.find('#menu2')).not.toExist();
wrapper.simulate('click');
expect(wrapper.find('#menu1')).toHaveLength(1);
expect(wrapper.find('#menu2')).toHaveLength(1);
expect(wrapper.find('#menu1')).toExist();
expect(wrapper.find('#menu2')).toExist();
});
it('should not focus when disableClick=true', () => {

View File

@ -31,6 +31,6 @@ describe('ResizableContainer', () => {
it('should render a Resizable', () => {
const wrapper = setup();
expect(wrapper.find(Resizable)).toHaveLength(1);
expect(wrapper.find(Resizable)).toExist();
});
});

View File

@ -25,7 +25,7 @@ import ResizableHandle from 'src/dashboard/components/resizable/ResizableHandle'
describe('ResizableHandle', () => {
it('should render a right resize handle', () => {
const wrapper = shallow(<ResizableHandle.right />);
expect(wrapper.find('.resize-handle.resize-handle--right')).toHaveLength(1);
expect(wrapper.find('.resize-handle.resize-handle--right')).toExist();
});
it('should render a bottom resize handle', () => {

View File

@ -78,7 +78,7 @@ describe('ChangeDatasourceModal', () => {
});
it('renders a Modal', () => {
expect(wrapper.find(Modal)).toHaveLength(1);
expect(wrapper.find(Modal)).toExist();
});
it('fetches datasources', async () => {

View File

@ -67,7 +67,7 @@ describe('DatasourceEditor', () => {
});
it('renders Tabs', () => {
expect(wrapper.find(Tabs)).toHaveLength(1);
expect(wrapper.find(Tabs)).toExist();
});
it('makes an async request', () => {

View File

@ -70,7 +70,7 @@ describe('DatasourceModal', () => {
});
it('renders', () => {
expect(wrapper.find(DatasourceModal)).toHaveLength(1);
expect(wrapper.find(DatasourceModal)).toExist();
});
it('renders a Modal', () => {
@ -78,7 +78,7 @@ describe('DatasourceModal', () => {
});
it('renders a DatasourceEditor', () => {
expect(wrapper.find(DatasourceEditor)).toHaveLength(1);
expect(wrapper.find(DatasourceEditor)).toExist();
});
it('saves on confirm', async () => {

View File

@ -75,7 +75,7 @@ function setup(overrides) {
describe('AdhocFilterControl', () => {
it('renders an onPasteSelect', () => {
const { wrapper } = setup();
expect(wrapper.find(OnPasteSelect)).toHaveLength(1);
expect(wrapper.find(OnPasteSelect)).toExist();
});
it('handles saved metrics being selected to filter on', () => {

View File

@ -80,8 +80,8 @@ function setup(overrides) {
describe('AdhocFilterEditPopover', () => {
it('renders simple tab content by default', () => {
const { wrapper } = setup();
expect(wrapper.find(Popover)).toHaveLength(1);
expect(wrapper.find(Tabs)).toHaveLength(1);
expect(wrapper.find(Popover)).toExist();
expect(wrapper.find(Tabs)).toExist();
expect(wrapper.find(Tab)).toHaveLength(2);
expect(wrapper.find(Button)).toHaveLength(2);
expect(wrapper.find(AdhocFilterEditPopoverSimpleTabContent)).toHaveLength(
@ -91,11 +91,11 @@ describe('AdhocFilterEditPopover', () => {
it('renders sql tab content when the adhoc filter expressionType is sql', () => {
const { wrapper } = setup({ adhocFilter: sqlAdhocFilter });
expect(wrapper.find(Popover)).toHaveLength(1);
expect(wrapper.find(Tabs)).toHaveLength(1);
expect(wrapper.find(Popover)).toExist();
expect(wrapper.find(Tabs)).toExist();
expect(wrapper.find(Tab)).toHaveLength(2);
expect(wrapper.find(Button)).toHaveLength(2);
expect(wrapper.find(AdhocFilterEditPopoverSqlTabContent)).toHaveLength(1);
expect(wrapper.find(AdhocFilterEditPopoverSqlTabContent)).toExist();
});
it('overwrites the adhocFilter in state with onAdhocFilterChange', () => {
@ -106,20 +106,20 @@ describe('AdhocFilterEditPopover', () => {
it('prevents saving if the filter is invalid', () => {
const { wrapper } = setup();
expect(wrapper.find(Button).find({ disabled: true })).toHaveLength(0);
expect(wrapper.find(Button).find({ disabled: true })).not.toExist();
wrapper
.instance()
.onAdhocFilterChange(simpleAdhocFilter.duplicateWith({ operator: null }));
expect(wrapper.find(Button).find({ disabled: true })).toHaveLength(1);
expect(wrapper.find(Button).find({ disabled: true })).toExist();
wrapper.instance().onAdhocFilterChange(sqlAdhocFilter);
expect(wrapper.find(Button).find({ disabled: true })).toHaveLength(0);
expect(wrapper.find(Button).find({ disabled: true })).not.toExist();
});
it('highlights save if changes are present', () => {
const { wrapper } = setup();
expect(wrapper.find(Button).find({ bsStyle: 'primary' })).toHaveLength(0);
expect(wrapper.find(Button).find({ bsStyle: 'primary' })).not.toExist();
wrapper.instance().onAdhocFilterChange(sqlAdhocFilter);
expect(wrapper.find(Button).find({ bsStyle: 'primary' })).toHaveLength(1);
expect(wrapper.find(Button).find({ bsStyle: 'primary' })).toExist();
});
it('will initiate a drag when clicked', () => {
@ -127,7 +127,7 @@ describe('AdhocFilterEditPopover', () => {
wrapper.instance().onDragDown = sinon.spy();
wrapper.instance().forceUpdate();
expect(wrapper.find('i.fa-expand')).toHaveLength(1);
expect(wrapper.find('i.fa-expand')).toExist();
expect(wrapper.instance().onDragDown.calledOnce).toBe(false);
wrapper.find('i.fa-expand').simulate('mouseDown', {});
expect(wrapper.instance().onDragDown.calledOnce).toBe(true);

View File

@ -55,7 +55,7 @@ describe('AdhocFilterOption', () => {
const overlay = wrapper.find(OverlayTrigger);
expect(overlay).toHaveLength(1);
expect(overlay.props().defaultOverlayShown).toBe(false);
expect(wrapper.find(Label)).toHaveLength(1);
expect(wrapper.find(Label)).toExist();
});
it('should open new filter popup by default', () => {
const { wrapper } = setup({

View File

@ -51,7 +51,7 @@ function setup(overrides) {
describe('AdhocMetricEditPopoverTitle', () => {
it('renders an OverlayTrigger wrapper with the title', () => {
const { wrapper } = setup();
expect(wrapper.find(OverlayTrigger)).toHaveLength(1);
expect(wrapper.find(OverlayTrigger)).toExist();
expect(wrapper.find(OverlayTrigger).find('span').text()).toBe(
'My Metric\xa0',
);

View File

@ -60,7 +60,7 @@ function setup(overrides) {
describe('AdhocMetricEditPopover', () => {
it('renders a popover with edit metric form contents', () => {
const { wrapper } = setup();
expect(wrapper.find(Popover)).toHaveLength(1);
expect(wrapper.find(Popover)).toExist();
expect(wrapper.find(FormGroup)).toHaveLength(3);
expect(wrapper.find(Button)).toHaveLength(2);
});
@ -106,20 +106,20 @@ describe('AdhocMetricEditPopover', () => {
it('prevents saving if no column or aggregate is chosen', () => {
const { wrapper } = setup();
expect(wrapper.find(Button).find({ disabled: true })).toHaveLength(0);
expect(wrapper.find(Button).find({ disabled: true })).not.toExist();
wrapper.instance().onColumnChange(null);
expect(wrapper.find(Button).find({ disabled: true })).toHaveLength(1);
expect(wrapper.find(Button).find({ disabled: true })).toExist();
wrapper.instance().onColumnChange({ column: columns[0] });
expect(wrapper.find(Button).find({ disabled: true })).toHaveLength(0);
expect(wrapper.find(Button).find({ disabled: true })).not.toExist();
wrapper.instance().onAggregateChange(null);
expect(wrapper.find(Button).find({ disabled: true })).toHaveLength(1);
expect(wrapper.find(Button).find({ disabled: true })).toExist();
});
it('highlights save if changes are present', () => {
const { wrapper } = setup();
expect(wrapper.find(Button).find({ bsStyle: 'primary' })).toHaveLength(0);
expect(wrapper.find(Button).find({ bsStyle: 'primary' })).not.toExist();
wrapper.instance().onColumnChange({ column: columns[1] });
expect(wrapper.find(Button).find({ bsStyle: 'primary' })).toHaveLength(1);
expect(wrapper.find(Button).find({ bsStyle: 'primary' })).toExist();
});
it('will initiate a drag when clicked', () => {
@ -127,7 +127,7 @@ describe('AdhocMetricEditPopover', () => {
wrapper.instance().onDragDown = sinon.spy();
wrapper.instance().forceUpdate();
expect(wrapper.find('i.fa-expand')).toHaveLength(1);
expect(wrapper.find('i.fa-expand')).toExist();
expect(wrapper.instance().onDragDown.calledOnce).toBe(false);
wrapper.find('i.fa-expand').simulate('mouseDown');
expect(wrapper.instance().onDragDown.calledOnce).toBe(true);

View File

@ -52,8 +52,8 @@ function setup(overrides) {
describe('AdhocMetricOption', () => {
it('renders an overlay trigger wrapper for the label', () => {
const { wrapper } = setup();
expect(wrapper.find(OverlayTrigger)).toHaveLength(1);
expect(wrapper.find(Label)).toHaveLength(1);
expect(wrapper.find(OverlayTrigger)).toExist();
expect(wrapper.find(Label)).toExist();
});
it('overlay should open if metric is new', () => {

View File

@ -53,7 +53,7 @@ describe('ColorPickerControl', () => {
it('renders a OverlayTrigger', () => {
const controlHeader = wrapper.find(ControlHeader);
expect(controlHeader).toHaveLength(1);
expect(wrapper.find(OverlayTrigger)).toHaveLength(1);
expect(wrapper.find(OverlayTrigger)).toExist();
});
it('renders a Popover with a SketchPicker', () => {

View File

@ -37,6 +37,6 @@ describe('ColorSchemeControl', () => {
});
it('renders a Creatable', () => {
expect(wrapper.find(Creatable)).toHaveLength(1);
expect(wrapper.find(Creatable)).toExist();
});
});

View File

@ -43,7 +43,7 @@ describe('ControlPanelSection', () => {
it('renders a Panel component', () => {
wrapper = shallow(<ControlPanelSection {...defaultProps} />);
expect(wrapper.find(Panel)).toHaveLength(1);
expect(wrapper.find(Panel)).toExist();
});
describe('with optional props', () => {

View File

@ -23,12 +23,12 @@ import ControlSetRow from 'src/explore/components/ControlRow';
describe('ControlSetRow', () => {
it('renders a single row with one element', () => {
const wrapper = shallow(<ControlSetRow controls={[<a />]} />);
expect(wrapper.find('.row')).toHaveLength(1);
expect(wrapper.find('.row').find('a')).toHaveLength(1);
expect(wrapper.find('.row')).toExist();
expect(wrapper.find('.row').find('a')).toExist();
});
it('renders a single row with two elements', () => {
const wrapper = shallow(<ControlSetRow controls={[<a />, <a />]} />);
expect(wrapper.find('.row')).toHaveLength(1);
expect(wrapper.find('.row')).toExist();
expect(wrapper.find('.row').find('a')).toHaveLength(2);
});
});

View File

@ -62,17 +62,17 @@ describe('DatasourceControl', () => {
it('renders a Modal', () => {
const wrapper = setup();
expect(wrapper.find(DatasourceModal)).toHaveLength(1);
expect(wrapper.find(DatasourceModal)).toExist();
});
it('renders a ChangeDatasourceModal', () => {
const wrapper = setup();
expect(wrapper.find(ChangeDatasourceModal)).toHaveLength(1);
expect(wrapper.find(ChangeDatasourceModal)).toExist();
});
it('show or hide Edit Datasource option', () => {
let wrapper = setup();
expect(wrapper.find('#datasource_menu')).toHaveLength(1);
expect(wrapper.find('#datasource_menu')).toExist();
expect(wrapper.find('#datasource_menu').dive().find(MenuItem)).toHaveLength(
3,
);
@ -80,7 +80,7 @@ describe('DatasourceControl', () => {
wrapper = setup({
isEditable: false,
});
expect(wrapper.find('#datasource_menu')).toHaveLength(1);
expect(wrapper.find('#datasource_menu')).toExist();
expect(wrapper.find('#datasource_menu').dive().find(MenuItem)).toHaveLength(
2,
);

View File

@ -69,10 +69,10 @@ describe('DateFilterControl', () => {
const label = wrapper.find(Label).first();
label.simulate('click');
setTimeout(() => {
expect(wrapper.find('.popover')).toHaveLength(1);
expect(wrapper.find('.popover')).toExist();
expect(wrapper.find('.ok')).first().simulate('click');
setTimeout(() => {
expect(wrapper.find('.popover')).toHaveLength(0);
expect(wrapper.find('.popover')).not.toExist();
}, 10);
}, 10);
});

View File

@ -37,7 +37,7 @@ describe('EmbedCodeButton', () => {
it('renders overlay trigger', () => {
const wrapper = shallow(<EmbedCodeButton {...defaultProps} />);
expect(wrapper.find(OverlayTrigger)).toHaveLength(1);
expect(wrapper.find(OverlayTrigger)).toExist();
});
it('returns correct embed code', () => {

View File

@ -61,8 +61,8 @@ describe('ExploreChartHeader', () => {
});
it('renders', () => {
expect(wrapper.find(EditableTitle)).toHaveLength(1);
expect(wrapper.find(ExploreActionButtons)).toHaveLength(1);
expect(wrapper.find(EditableTitle)).toExist();
expect(wrapper.find(ExploreActionButtons)).toExist();
});
it('should update title but not save', () => {

View File

@ -68,15 +68,15 @@ describe('ExploreViewContainer', () => {
});
it('renders QueryAndSaveButtons', () => {
expect(wrapper.find(QueryAndSaveBtns)).toHaveLength(1);
expect(wrapper.find(QueryAndSaveBtns)).toExist();
});
it('renders ControlPanelsContainer', () => {
expect(wrapper.find(ControlPanelsContainer)).toHaveLength(1);
expect(wrapper.find(ControlPanelsContainer)).toExist();
});
it('renders ChartContainer', () => {
expect(wrapper.find(ChartContainer)).toHaveLength(1);
expect(wrapper.find(ChartContainer)).toExist();
});
describe('componentWillReceiveProps()', () => {

View File

@ -45,7 +45,7 @@ describe('FilterBoxItemControl', () => {
});
it('renders an OverlayTrigger', () => {
expect(wrapper.find(OverlayTrigger)).toHaveLength(1);
expect(wrapper.find(OverlayTrigger)).toExist();
});
it('renderForms does the job', () => {

View File

@ -37,14 +37,14 @@ describe('FilterDefinitionOption', () => {
const wrapper = shallow(
<FilterDefinitionOption option={{ column_name: 'a_column' }} />,
);
expect(wrapper.find(ColumnOption)).toHaveLength(1);
expect(wrapper.find(ColumnOption)).toExist();
});
it('renders a AdhocMetricStaticOption given an adhoc metric', () => {
const wrapper = shallow(
<FilterDefinitionOption option={sumValueAdhocMetric} />,
);
expect(wrapper.find(AdhocMetricStaticOption)).toHaveLength(1);
expect(wrapper.find(AdhocMetricStaticOption)).toExist();
});
it('renders the metric name given a saved metric', () => {

View File

@ -37,7 +37,7 @@ describe('FixedOrMetricControl', () => {
});
it('renders a TextControl and a SelectControl', () => {
expect(wrapper.find(TextControl)).toHaveLength(1);
expect(wrapper.find(MetricsControl)).toHaveLength(1);
expect(wrapper.find(TextControl)).toExist();
expect(wrapper.find(MetricsControl)).toExist();
});
});

View File

@ -36,16 +36,16 @@ describe('MetricDefinitionOption', () => {
it('renders a MetricOption given a saved metric', () => {
const wrapper = setup({ option: { metric_name: 'a_saved_metric' } });
expect(wrapper.find(MetricOption)).toHaveLength(1);
expect(wrapper.find(MetricOption)).toExist();
});
it('renders a ColumnOption given a column', () => {
const wrapper = setup({ option: { column_name: 'a_column' } });
expect(wrapper.find(ColumnOption)).toHaveLength(1);
expect(wrapper.find(ColumnOption)).toExist();
});
it('renders an AggregateOption given an aggregate metric', () => {
const wrapper = setup({ option: { aggregate_name: 'an_aggregate' } });
expect(wrapper.find(AggregateOption)).toHaveLength(1);
expect(wrapper.find(AggregateOption)).toExist();
});
});

View File

@ -36,7 +36,7 @@ describe('MetricDefinitionValue', () => {
const wrapper = shallow(
<MetricDefinitionValue option={{ metric_name: 'a_saved_metric' }} />,
);
expect(wrapper.find(MetricOption)).toHaveLength(1);
expect(wrapper.find(MetricOption)).toExist();
});
it('renders an AdhocMetricOption given an adhoc metric', () => {
@ -46,6 +46,6 @@ describe('MetricDefinitionValue', () => {
option={sumValueAdhocMetric}
/>,
);
expect(wrapper.find(AdhocMetricOption)).toHaveLength(1);
expect(wrapper.find(AdhocMetricOption)).toExist();
});
});

View File

@ -65,7 +65,7 @@ const sumValueAdhocMetric = new AdhocMetric({
describe('MetricsControl', () => {
it('renders an OnPasteSelect', () => {
const { wrapper } = setup();
expect(wrapper.find(OnPasteSelect)).toHaveLength(1);
expect(wrapper.find(OnPasteSelect)).toExist();
});
describe('constructor', () => {

View File

@ -36,8 +36,8 @@ describe('RowCountLabel', () => {
});
it('renders a Label and a TooltipWrapper', () => {
const wrapper = shallow(<RowCountLabel {...defaultProps} />);
expect(wrapper.find(Label)).toHaveLength(1);
expect(wrapper.find(TooltipWrapper)).toHaveLength(1);
expect(wrapper.find(Label)).toExist();
expect(wrapper.find(TooltipWrapper)).toExist();
});
it('renders a danger when limit is reached', () => {
const props = {

View File

@ -45,6 +45,6 @@ describe('RunQueryActionButton', () => {
});
it('renders a single Button', () => {
expect(wrapper.find(Button)).toHaveLength(1);
expect(wrapper.find(Button)).toExist();
});
});

View File

@ -75,8 +75,8 @@ describe('SaveModal', () => {
it('renders a Modal with the right set of components', () => {
const wrapper = getWrapper();
expect(wrapper.find(Modal)).toHaveLength(1);
expect(wrapper.find(FormControl)).toHaveLength(1);
expect(wrapper.find(Modal)).toExist();
expect(wrapper.find(FormControl)).toExist();
expect(wrapper.find(Button)).toHaveLength(3);
expect(wrapper.find(Radio)).toHaveLength(2);
});

View File

@ -48,19 +48,19 @@ describe('SelectControl', () => {
});
it('renders with Select by default', () => {
expect(wrapper.find(OnPasteSelect)).toHaveLength(0);
expect(wrapper.find(OnPasteSelect)).not.toExist();
expect(wrapper.findWhere(x => x.type() === Select)).toHaveLength(1);
});
it('renders with OnPasteSelect when multi', () => {
wrapper.setProps({ multi: true });
expect(wrapper.find(OnPasteSelect)).toHaveLength(1);
expect(wrapper.find(OnPasteSelect)).toExist();
expect(wrapper.findWhere(x => x.type() === Select)).toHaveLength(0);
});
it('renders with Creatable when freeForm', () => {
wrapper.setProps({ freeForm: true });
expect(wrapper.find(OnPasteSelect)).toHaveLength(0);
expect(wrapper.find(OnPasteSelect)).not.toExist();
expect(wrapper.findWhere(x => x.type() === CreatableSelect)).toHaveLength(
1,
);

View File

@ -38,7 +38,7 @@ describe('SelectControl', () => {
});
it('renders a FormControl', () => {
expect(wrapper.find(FormControl)).toHaveLength(1);
expect(wrapper.find(FormControl)).toExist();
});
it('calls onChange when toggled', () => {
@ -51,7 +51,7 @@ describe('SelectControl', () => {
const props = { ...defaultProps };
props.language = 'markdown';
wrapper = shallow(<TextAreaControl {...props} />);
expect(wrapper.find(FormControl)).toHaveLength(0);
expect(wrapper.find(AceEditor)).toHaveLength(1);
expect(wrapper.find(FormControl)).not.toExist();
expect(wrapper.find(AceEditor)).toExist();
});
});

View File

@ -39,7 +39,7 @@ describe('SelectControl', () => {
});
it('renders an OverlayTrigger', () => {
expect(wrapper.find(OverlayTrigger)).toHaveLength(1);
expect(wrapper.find(OverlayTrigger)).toExist();
});
it('renders an Popover', () => {

View File

@ -46,7 +46,7 @@ describe('ViewportControl', () => {
it('renders a OverlayTrigger', () => {
const controlHeader = wrapper.find(ControlHeader);
expect(controlHeader).toHaveLength(1);
expect(wrapper.find(OverlayTrigger)).toHaveLength(1);
expect(wrapper.find(OverlayTrigger)).toExist();
});
it('renders a Popover with 5 TextControl', () => {

View File

@ -55,7 +55,7 @@ describe('VizTypeControl', () => {
});
it('renders a Modal', () => {
expect(wrapper.find(Modal)).toHaveLength(1);
expect(wrapper.find(Modal)).toExist();
});
it('calls onChange when toggled', () => {
@ -66,6 +66,6 @@ describe('VizTypeControl', () => {
it('filters images based on text input', () => {
expect(wrapper.find('img')).toHaveLength(2);
wrapper.setState({ filter: 'vis2' });
expect(wrapper.find('img')).toHaveLength(1);
expect(wrapper.find('img')).toExist();
});
});

View File

@ -36,7 +36,7 @@ describe('ToastPresenter', () => {
it('should render a div with id toast-presenter', () => {
const wrapper = setup();
expect(wrapper.find('#toast-presenter')).toHaveLength(1);
expect(wrapper.find('#toast-presenter')).toExist();
});
it('should render a Toast for each toast object', () => {

View File

@ -33,7 +33,7 @@ const setup = overrideProps => mount(<Toast {...props} {...overrideProps} />);
describe('Toast', () => {
it('should render an Alert', () => {
const wrapper = setup();
expect(wrapper.find(Alert)).toHaveLength(1);
expect(wrapper.find(Alert)).toExist();
});
it('should render toastText within the alert', () => {

View File

@ -33,7 +33,7 @@ describe('App', () => {
it('renders 2 Col', () => {
const wrapper = shallow(<App {...mockedProps} />);
expect(wrapper.find(Row)).toHaveLength(1);
expect(wrapper.find(Row)).toExist();
expect(wrapper.find(Col)).toHaveLength(2);
});

View File

@ -35,6 +35,6 @@ describe('RecentActivity', () => {
it('renders a TableLoader', () => {
const wrapper = shallow(<RecentActivity {...mockedProps} />);
expect(wrapper.find(TableLoader)).toHaveLength(1);
expect(wrapper.find(TableLoader)).toExist();
});
});

View File

@ -43,7 +43,7 @@ describe('Security', () => {
});
it('renders no permission label when empty', () => {
const wrapper = mount(<Security user={userNoPerms} />);
expect(wrapper.find('.datasources').find('.label')).toHaveLength(0);
expect(wrapper.find('.databases').find('.label')).toHaveLength(0);
expect(wrapper.find('.datasources').find('.label')).not.toExist();
expect(wrapper.find('.databases').find('.label')).not.toExist();
});
});

View File

@ -33,11 +33,11 @@ describe('UserInfo', () => {
});
it('renders a Gravatar', () => {
const wrapper = mount(<UserInfo {...mockedProps} />);
expect(wrapper.find(Gravatar)).toHaveLength(1);
expect(wrapper.find(Gravatar)).toExist();
});
it('renders a Panel', () => {
const wrapper = mount(<UserInfo {...mockedProps} />);
expect(wrapper.find(Panel)).toHaveLength(1);
expect(wrapper.find(Panel)).toExist();
});
it('renders 5 icons', () => {
const wrapper = mount(<UserInfo {...mockedProps} />);

View File

@ -32,18 +32,18 @@ describe('ColumnElement', () => {
});
it('renders a proper primary key', () => {
const wrapper = mount(<ColumnElement column={table.columns[0]} />);
expect(wrapper.find('i.fa-key')).toHaveLength(1);
expect(wrapper.find('i.fa-key')).toExist();
expect(wrapper.find('.col-name').first().text()).toBe('id');
});
it('renders a multi-key column', () => {
const wrapper = mount(<ColumnElement column={table.columns[1]} />);
expect(wrapper.find('i.fa-link')).toHaveLength(1);
expect(wrapper.find('i.fa-bookmark')).toHaveLength(1);
expect(wrapper.find('i.fa-link')).toExist();
expect(wrapper.find('i.fa-bookmark')).toExist();
expect(wrapper.find('.col-name').first().text()).toBe('first_name');
});
it('renders a column with no keys', () => {
const wrapper = mount(<ColumnElement column={table.columns[2]} />);
expect(wrapper.find('i')).toHaveLength(0);
expect(wrapper.find('i')).not.toExist();
expect(wrapper.find('.col-name').first().text()).toBe('last_name');
});
});

View File

@ -108,7 +108,7 @@ describe('ExploreResultsButton', () => {
it('renders a Button', () => {
const wrapper = getExploreResultsButtonWrapper();
expect(wrapper.find(Button)).toHaveLength(1);
expect(wrapper.find(Button)).toExist();
});
describe('datasourceName', () => {

View File

@ -31,11 +31,11 @@ describe('HighlightedSql', () => {
});
it('renders a ModalTrigger', () => {
const wrapper = shallow(<HighlightedSql sql={sql} />);
expect(wrapper.find(ModalTrigger)).toHaveLength(1);
expect(wrapper.find(ModalTrigger)).toExist();
});
it('renders a ModalTrigger while using shrink', () => {
const wrapper = shallow(<HighlightedSql sql={sql} shrink maxWidth={20} />);
expect(wrapper.find(ModalTrigger)).toHaveLength(1);
expect(wrapper.find(ModalTrigger)).toExist();
});
it('renders two SyntaxHighlighter in modal', () => {
const wrapper = mount(

View File

@ -41,7 +41,7 @@ describe('LimitControl', () => {
);
});
it('renders a Label', () => {
expect(wrapper.find(Label)).toHaveLength(1);
expect(wrapper.find(Label)).toExist();
});
it('loads the correct state', () => {
const value = 100;

View File

@ -34,6 +34,6 @@ describe('Link', () => {
});
it('renders an anchor tag', () => {
const wrapper = shallow(<Link {...mockedProps}>TEST</Link>);
expect(wrapper.find('a')).toHaveLength(1);
expect(wrapper.find('a')).toExist();
});
});

View File

@ -60,7 +60,7 @@ describe('QuerySearch', () => {
});
it('should have one input for searchText', () => {
expect(wrapper.find('input')).toHaveLength(1);
expect(wrapper.find('input')).toExist();
});
it('updates search text on user inputs search text', () => {
@ -77,7 +77,7 @@ describe('QuerySearch', () => {
});
it('should have one Button', () => {
expect(wrapper.find(Button)).toHaveLength(1);
expect(wrapper.find(Button)).toExist();
});
it('refreshes queries when clicked', () => {

View File

@ -35,6 +35,6 @@ describe('SavedQuery', () => {
});
it('has an Overlay and a Popover', () => {
const wrapper = shallow(<QueryStateLabel {...mockedProps} />);
expect(wrapper.find(Label)).toHaveLength(1);
expect(wrapper.find(Label)).toExist();
});
});

Some files were not shown because too many files have changed in this diff Show More