From 7f70a241f9d951695f23c0d4707b3aed59c22aed Mon Sep 17 00:00:00 2001 From: David Aaron Suddjian <1858430+suddjian@users.noreply.github.com> Date: Wed, 29 Jul 2020 10:53:06 -0700 Subject: [PATCH] test: Add jest-enzyme assertion library for better frontend tests (#10459) * adding jest-enzyme * enzymeify lots of assertions * types for jest-enzyme --- superset-frontend/jest.config.js | 3 +- superset-frontend/package-lock.json | 749 +++++++++++++++++- superset-frontend/package.json | 3 + .../spec/helpers/{shim.js => shim.ts} | 28 +- .../javascripts/CRUD/CollectionTable_spec.jsx | 2 +- .../addSlice/AddSliceContainer_spec.tsx | 6 +- .../javascripts/chart/ChartRenderer_spec.jsx | 4 +- .../components/AlteredSliceTag_spec.jsx | 2 +- .../components/AnchorLink_spec.jsx | 8 +- .../components/AsyncSelect_spec.jsx | 4 +- .../components/CachedLabel_spec.jsx | 2 +- .../javascripts/components/Checkbox_spec.jsx | 4 +- .../components/ConfirmStatusChange_spec.jsx | 2 +- .../FilterableTable/FilterableTable_spec.tsx | 6 +- .../javascripts/components/FormRow_spec.jsx | 6 +- .../components/ListView/ListView_spec.jsx | 12 +- .../spec/javascripts/components/Menu_spec.jsx | 2 +- .../components/PopoverSection_spec.jsx | 2 +- .../components/URLShortLinkButton_spec.jsx | 2 +- .../components/URLShortLinkModal_spec.jsx | 2 +- .../dashboard/components/CodeModal_spec.jsx | 2 +- .../dashboard/components/CssEditor_spec.jsx | 2 +- .../components/DashboardBuilder_spec.jsx | 10 +- .../components/DashboardGrid_spec.jsx | 8 +- .../dashboard/components/Dashboard_spec.jsx | 2 +- .../components/FilterIndicatorGroup_spec.jsx | 2 +- .../FilterIndicatorTooltip_spec.jsx | 2 +- .../components/FilterIndicator_spec.jsx | 2 +- .../FilterIndicatorsContainer_spec.jsx | 10 +- .../components/FilterTooltipWrapper_spec.jsx | 4 +- .../components/HeaderActionsDropdown_spec.jsx | 30 +- .../dashboard/components/Header_spec.jsx | 46 +- .../components/MissingChart_spec.jsx | 4 +- .../components/RefreshIntervalModal_spec.jsx | 6 +- .../dashboard/components/SliceAdder_spec.jsx | 2 +- .../components/dnd/DragDroppable_spec.jsx | 4 +- .../gridComponents/ChartHolder_spec.jsx | 16 +- .../components/gridComponents/Chart_spec.jsx | 8 +- .../components/gridComponents/Column_spec.jsx | 18 +- .../gridComponents/Divider_spec.jsx | 12 +- .../components/gridComponents/Header_spec.jsx | 12 +- .../gridComponents/Markdown_spec.jsx | 28 +- .../components/gridComponents/Row_spec.jsx | 16 +- .../components/gridComponents/Tab_spec.jsx | 10 +- .../components/gridComponents/Tabs_spec.jsx | 12 +- .../new/DraggableNewComponent_spec.jsx | 4 +- .../gridComponents/new/NewColumn_spec.jsx | 2 +- .../gridComponents/new/NewDivider_spec.jsx | 2 +- .../gridComponents/new/NewHeader_spec.jsx | 2 +- .../gridComponents/new/NewRow_spec.jsx | 2 +- .../gridComponents/new/NewTabs_spec.jsx | 2 +- .../components/menu/HoverMenu_spec.jsx | 2 +- .../components/menu/WithPopoverMenu_spec.jsx | 12 +- .../resizable/ResizableContainer_spec.jsx | 2 +- .../resizable/ResizableHandle_spec.jsx | 2 +- .../datasource/ChangeDatasourceModal_spec.jsx | 2 +- .../datasource/DatasourceEditor_spec.jsx | 2 +- .../datasource/DatasourceModal_spec.jsx | 4 +- .../components/AdhocFilterControl_spec.jsx | 2 +- .../AdhocFilterEditPopover_spec.jsx | 22 +- .../components/AdhocFilterOption_spec.jsx | 2 +- .../AdhocMetricEditPopoverTitle_spec.jsx | 2 +- .../AdhocMetricEditPopover_spec.jsx | 16 +- .../components/AdhocMetricOption_spec.jsx | 4 +- .../components/ColorPickerControl_spec.jsx | 2 +- .../explore/components/ColorScheme_spec.jsx | 2 +- .../components/ControlPanelSection_spec.jsx | 2 +- .../explore/components/ControlRow_spec.jsx | 6 +- .../components/DatasourceControl_spec.jsx | 8 +- .../components/DateFilterControl_spec.jsx | 4 +- .../components/EmbedCodeButton_spec.jsx | 2 +- .../components/ExploreChartHeader_spec.jsx | 4 +- .../components/ExploreViewContainer_spec.jsx | 6 +- .../components/FilterBoxItemControl_spec.jsx | 2 +- .../FilterDefinitionOption_spec.jsx | 4 +- .../components/FixedOrMetricControl_spec.jsx | 4 +- .../MetricDefinitionOption_spec.jsx | 6 +- .../components/MetricDefinitionValue_spec.jsx | 4 +- .../components/MetricsControl_spec.jsx | 2 +- .../explore/components/RowCountLabel_spec.jsx | 4 +- .../components/RunQueryActionButton_spec.jsx | 2 +- .../explore/components/SaveModal_spec.jsx | 4 +- .../explore/components/SelectControl_spec.jsx | 6 +- .../explore/components/TextArea_spec.jsx | 6 +- .../TimeSeriesColumnControl_spec.jsx | 2 +- .../components/ViewportControl_spec.jsx | 2 +- .../components/VizTypeControl_spec.jsx | 4 +- .../components/ToastPresenter_spec.jsx | 2 +- .../messageToasts/components/Toast_spec.jsx | 2 +- .../spec/javascripts/profile/App_spec.tsx | 2 +- .../profile/RecentActivity_spec.tsx | 2 +- .../javascripts/profile/Security_spec.tsx | 4 +- .../javascripts/profile/UserInfo_spec.tsx | 4 +- .../javascripts/sqllab/ColumnElement_spec.tsx | 8 +- .../sqllab/ExploreResultsButton_spec.jsx | 2 +- .../sqllab/HighlightedSql_spec.jsx | 4 +- .../javascripts/sqllab/LimitControl_spec.jsx | 2 +- .../spec/javascripts/sqllab/Link_spec.jsx | 2 +- .../javascripts/sqllab/QuerySearch_spec.jsx | 4 +- .../sqllab/QueryStateLabel_spec.jsx | 2 +- .../javascripts/sqllab/QueryTable_spec.jsx | 4 +- .../javascripts/sqllab/ResultSet_spec.jsx | 16 +- .../javascripts/sqllab/SaveQuery_spec.jsx | 2 +- .../javascripts/sqllab/SouthPane_spec.jsx | 2 +- .../sqllab/SqlEditorLeftBar_spec.jsx | 2 +- .../javascripts/sqllab/SqlEditor_spec.jsx | 10 +- .../javascripts/sqllab/TabStatusIcon_spec.jsx | 2 +- .../views/CRUD/chart/ChartList_spec.jsx | 4 +- .../CRUD/dashboard/DashboardList_spec.jsx | 8 +- .../views/CRUD/dataset/DatasetList_spec.jsx | 4 +- .../welcome/DashboardTable_spec.tsx | 2 +- 111 files changed, 1074 insertions(+), 315 deletions(-) rename superset-frontend/spec/helpers/{shim.js => shim.ts} (72%) diff --git a/superset-frontend/jest.config.js b/superset-frontend/jest.config.js index 18b05ccd07..6a5931e840 100644 --- a/superset-frontend/jest.config.js +++ b/superset-frontend/jest.config.js @@ -25,7 +25,8 @@ module.exports = { '^src/(.*)$': '/src/$1', '^spec/(.*)$': '/spec/$1', }, - setupFilesAfterEnv: ['/spec/helpers/shim.js'], + testEnvironment: 'enzyme', + setupFilesAfterEnv: ['jest-enzyme', '/spec/helpers/shim.ts'], testURL: 'http://localhost', collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'], coverageDirectory: '/coverage/', diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 34d262f6cb..5febb20f34 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -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", diff --git a/superset-frontend/package.json b/superset-frontend/package.json index 301d635534..ddd5b58494 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -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", diff --git a/superset-frontend/spec/helpers/shim.js b/superset-frontend/spec/helpers/shim.ts similarity index 72% rename from superset-frontend/spec/helpers/shim.js rename to superset-frontend/spec/helpers/shim.ts index 46264e290f..029d8e76b1 100644 --- a/superset-frontend/spec/helpers/shim.js +++ b/superset-frontend/spec/helpers/shim.ts @@ -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(); diff --git a/superset-frontend/spec/javascripts/CRUD/CollectionTable_spec.jsx b/superset-frontend/spec/javascripts/CRUD/CollectionTable_spec.jsx index be09aab00f..65bc7689fc 100644 --- a/superset-frontend/spec/javascripts/CRUD/CollectionTable_spec.jsx +++ b/superset-frontend/spec/javascripts/CRUD/CollectionTable_spec.jsx @@ -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); }); }); diff --git a/superset-frontend/spec/javascripts/addSlice/AddSliceContainer_spec.tsx b/superset-frontend/spec/javascripts/addSlice/AddSliceContainer_spec.tsx index 93698945cc..5db740d279 100644 --- a/superset-frontend/spec/javascripts/addSlice/AddSliceContainer_spec.tsx +++ b/superset-frontend/spec/javascripts/addSlice/AddSliceContainer_spec.tsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/chart/ChartRenderer_spec.jsx b/superset-frontend/spec/javascripts/chart/ChartRenderer_spec.jsx index 1a383fca31..b509e8481f 100644 --- a/superset-frontend/spec/javascripts/chart/ChartRenderer_spec.jsx +++ b/superset-frontend/spec/javascripts/chart/ChartRenderer_spec.jsx @@ -25,11 +25,11 @@ import ChartRenderer from 'src/chart/ChartRenderer'; describe('ChartRenderer', () => { it('should render SuperChart', () => { const wrapper = shallow(); - expect(wrapper.find(SuperChart)).toHaveLength(1); + expect(wrapper.find(SuperChart)).toExist(); }); it('should not render SuperChart when refreshOverlayVisible is true', () => { const wrapper = shallow(); - expect(wrapper.find(SuperChart)).toHaveLength(0); + expect(wrapper.find(SuperChart)).not.toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/components/AlteredSliceTag_spec.jsx b/superset-frontend/spec/javascripts/components/AlteredSliceTag_spec.jsx index 5ff79ff78e..5f0b389927 100644 --- a/superset-frontend/spec/javascripts/components/AlteredSliceTag_spec.jsx +++ b/superset-frontend/spec/javascripts/components/AlteredSliceTag_spec.jsx @@ -201,7 +201,7 @@ describe('AlteredSliceTag', () => { }); it('renders a ModalTrigger', () => { - expect(wrapper.find(ModalTrigger)).toHaveLength(1); + expect(wrapper.find(ModalTrigger)).toExist(); }); describe('renderTriggerNode', () => { diff --git a/superset-frontend/spec/javascripts/components/AnchorLink_spec.jsx b/superset-frontend/spec/javascripts/components/AnchorLink_spec.jsx index 7cdb1d85eb..fb20cff002 100644 --- a/superset-frontend/spec/javascripts/components/AnchorLink_spec.jsx +++ b/superset-frontend/spec/javascripts/components/AnchorLink_spec.jsx @@ -54,14 +54,14 @@ describe('AnchorLink', () => { it('should render anchor link with id', () => { const wrapper = shallow(); - 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(); - 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); diff --git a/superset-frontend/spec/javascripts/components/AsyncSelect_spec.jsx b/superset-frontend/spec/javascripts/components/AsyncSelect_spec.jsx index 90857c4b63..5a4bbfc835 100644 --- a/superset-frontend/spec/javascripts/components/AsyncSelect_spec.jsx +++ b/superset-frontend/spec/javascripts/components/AsyncSelect_spec.jsx @@ -48,7 +48,7 @@ describe('AsyncSelect', () => { it('has one select', () => { const wrapper = shallow(); - 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(); }); }); diff --git a/superset-frontend/spec/javascripts/components/CachedLabel_spec.jsx b/superset-frontend/spec/javascripts/components/CachedLabel_spec.jsx index d714e9100e..41b182a440 100644 --- a/superset-frontend/spec/javascripts/components/CachedLabel_spec.jsx +++ b/superset-frontend/spec/javascripts/components/CachedLabel_spec.jsx @@ -33,6 +33,6 @@ describe('CachedLabel', () => { }); it('renders', () => { const wrapper = shallow(); - expect(wrapper.find(Label)).toHaveLength(1); + expect(wrapper.find(Label)).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/components/Checkbox_spec.jsx b/superset-frontend/spec/javascripts/components/Checkbox_spec.jsx index 3ac486397c..56b9c02554 100644 --- a/superset-frontend/spec/javascripts/components/Checkbox_spec.jsx +++ b/superset-frontend/spec/javascripts/components/Checkbox_spec.jsx @@ -40,7 +40,7 @@ describe('Checkbox', () => { expect(React.isValidElement()).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); }); diff --git a/superset-frontend/spec/javascripts/components/ConfirmStatusChange_spec.jsx b/superset-frontend/spec/javascripts/components/ConfirmStatusChange_spec.jsx index 981a7f0019..a9e027d28f 100644 --- a/superset-frontend/spec/javascripts/components/ConfirmStatusChange_spec.jsx +++ b/superset-frontend/spec/javascripts/components/ConfirmStatusChange_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/components/FilterableTable/FilterableTable_spec.tsx b/superset-frontend/spec/javascripts/components/FilterableTable/FilterableTable_spec.tsx index 2d2b451c16..787fb72337 100644 --- a/superset-frontend/spec/javascripts/components/FilterableTable/FilterableTable_spec.tsx +++ b/superset-frontend/spec/javascripts/components/FilterableTable/FilterableTable_spec.tsx @@ -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(); - 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(); - expect(wrapper.find('.ReactVirtualized__Table__row')).toHaveLength(1); + expect(wrapper.find('.ReactVirtualized__Table__row')).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/components/FormRow_spec.jsx b/superset-frontend/spec/javascripts/components/FormRow_spec.jsx index c0d8dd7034..0dfda25bc0 100644 --- a/superset-frontend/spec/javascripts/components/FormRow_spec.jsx +++ b/superset-frontend/spec/javascripts/components/FormRow_spec.jsx @@ -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); }); }); diff --git a/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx b/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx index cd1f823382..7ce1331b16 100644 --- a/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx +++ b/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/components/Menu_spec.jsx b/superset-frontend/spec/javascripts/components/Menu_spec.jsx index 103453d33a..4b152cec29 100644 --- a/superset-frontend/spec/javascripts/components/Menu_spec.jsx +++ b/superset-frontend/spec/javascripts/components/Menu_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/components/PopoverSection_spec.jsx b/superset-frontend/spec/javascripts/components/PopoverSection_spec.jsx index 9f1fd7ed3c..7f69a50134 100644 --- a/superset-frontend/spec/javascripts/components/PopoverSection_spec.jsx +++ b/superset-frontend/spec/javascripts/components/PopoverSection_spec.jsx @@ -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); diff --git a/superset-frontend/spec/javascripts/components/URLShortLinkButton_spec.jsx b/superset-frontend/spec/javascripts/components/URLShortLinkButton_spec.jsx index a13331c66e..87be28d765 100644 --- a/superset-frontend/spec/javascripts/components/URLShortLinkButton_spec.jsx +++ b/superset-frontend/spec/javascripts/components/URLShortLinkButton_spec.jsx @@ -40,6 +40,6 @@ describe('URLShortLinkButton', () => { it('renders OverlayTrigger', () => { const wrapper = setup(); - expect(wrapper.find(OverlayTrigger)).toHaveLength(1); + expect(wrapper.find(OverlayTrigger)).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/components/URLShortLinkModal_spec.jsx b/superset-frontend/spec/javascripts/components/URLShortLinkModal_spec.jsx index 312cfa3ea1..163b321bed 100644 --- a/superset-frontend/spec/javascripts/components/URLShortLinkModal_spec.jsx +++ b/superset-frontend/spec/javascripts/components/URLShortLinkModal_spec.jsx @@ -40,6 +40,6 @@ describe('URLShortLinkModal', () => { it('renders ModalTrigger', () => { const wrapper = setup(); - expect(wrapper.find(ModalTrigger)).toHaveLength(1); + expect(wrapper.find(ModalTrigger)).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/CodeModal_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/CodeModal_spec.jsx index 1589dd33b6..cf27ff789d 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/CodeModal_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/CodeModal_spec.jsx @@ -34,6 +34,6 @@ describe('CodeModal', () => { wrappingComponent: ThemeProvider, wrappingComponentProps: { theme: supersetTheme }, }); - expect(wrapper.find('.fa-edit')).toHaveLength(1); + expect(wrapper.find('.fa-edit')).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/CssEditor_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/CssEditor_spec.jsx index c027f5a6d3..d631ab58d7 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/CssEditor_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/CssEditor_spec.jsx @@ -30,6 +30,6 @@ describe('CssEditor', () => { }); it('renders the trigger node', () => { const wrapper = mount(); - expect(wrapper.find('.fa-edit')).toHaveLength(1); + expect(wrapper.find('.fa-edit')).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx index 04d885e1d6..fd71eb6ac9 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx index 1b7ffc84f9..46cc6d88ab 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx index 4f61423a39..6bb369cbf6 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorGroup_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorGroup_spec.jsx index dfc4431e17..bf78d23e2d 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorGroup_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorGroup_spec.jsx @@ -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(); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorTooltip_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorTooltip_spec.jsx index 52960e7413..cc0adb6d5c 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorTooltip_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorTooltip_spec.jsx @@ -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(); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicator_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicator_spec.jsx index 4d7cd6b5b4..17da99211e 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicator_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicator_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorsContainer_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorsContainer_spec.jsx index 69d37ac921..6fcca0cd4d 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorsContainer_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorsContainer_spec.jsx @@ -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; diff --git a/superset-frontend/spec/javascripts/dashboard/components/FilterTooltipWrapper_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/FilterTooltipWrapper_spec.jsx index 4f59a02f8a..c0ac7ae754 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/FilterTooltipWrapper_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/FilterTooltipWrapper_spec.jsx @@ -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 () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx index b5b18e4373..815dd26a83 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx @@ -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(); }); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/Header_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/Header_spec.jsx index b2d7bc0dbc..a5425dc399 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/Header_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/Header_spec.jsx @@ -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(); }); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/MissingChart_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/MissingChart_spec.jsx index bda772bba4..f2505400fa 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/MissingChart_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/MissingChart_spec.jsx @@ -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(); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx index 33a2bdca05..cde2864eaf 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx @@ -37,7 +37,7 @@ describe('RefreshIntervalModal', () => { }); it('renders the trigger node', () => { const wrapper = mount(); - expect(wrapper.find('.fa-edit')).toHaveLength(1); + expect(wrapper.find('.fa-edit')).toExist(); }); it('should render a interval seconds', () => { const wrapper = mount(); @@ -59,9 +59,9 @@ describe('RefreshIntervalModal', () => { const wrapper = shallow(); 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(); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/SliceAdder_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/SliceAdder_spec.jsx index 97beb03443..1068ec2270 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/SliceAdder_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/SliceAdder_spec.jsx @@ -74,7 +74,7 @@ describe('SliceAdder', () => { it('render List', () => { const wrapper = shallow(); wrapper.setState({ filteredSlices: Object.values(props.slices) }); - expect(wrapper.find(List)).toHaveLength(1); + expect(wrapper.find(List)).toExist(); }); it('render error', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx index c6743214e1..65d77e773c 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx index eaefed2c02..40442d6ead 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx index d75b5faaf4..955ade713a 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx index d9df860c44..fe0a1711d5 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx index f304f5fe5f..8a52a66753 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx index 82e83d13e7..9b33546f4d 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx index 9b38286cdd..e73c48f683 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx index 28fc9dcf3f..a24a1244fc 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx index 9f785e51e1..0d072558b7 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx index a9876871a3..0562dcdc83 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx index 9a33a553b2..bc0e07cca8 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx @@ -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(); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx index d26cda344a..696dec899a 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx index f95674883e..77a0ab4f26 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx index 07e5777af0..8c91cb655b 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx index 0517db190c..de70ece0bd 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx index 0875fd2c69..ec174340b4 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx index cc1f6849ba..24106f1641 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx @@ -24,6 +24,6 @@ import HoverMenu from 'src/dashboard/components/menu/HoverMenu'; describe('HoverMenu', () => { it('should render a div.hover-menu', () => { const wrapper = shallow(); - expect(wrapper.find('.hover-menu')).toHaveLength(1); + expect(wrapper.find('.hover-menu')).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx index ce5fab706b..af49b0df79 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx index 8bfcd2c5cc..5bc12b6639 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx @@ -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(); }); }); diff --git a/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx index 392c701888..bc8059c4a9 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx @@ -25,7 +25,7 @@ import ResizableHandle from 'src/dashboard/components/resizable/ResizableHandle' describe('ResizableHandle', () => { it('should render a right resize handle', () => { const wrapper = shallow(); - 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', () => { diff --git a/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx b/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx index 7392015736..f4143a4b35 100644 --- a/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx +++ b/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx @@ -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 () => { diff --git a/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx b/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx index 9ccecf441c..52cf8c8ff7 100644 --- a/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx +++ b/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/datasource/DatasourceModal_spec.jsx b/superset-frontend/spec/javascripts/datasource/DatasourceModal_spec.jsx index e1b3882c65..be5111c84b 100644 --- a/superset-frontend/spec/javascripts/datasource/DatasourceModal_spec.jsx +++ b/superset-frontend/spec/javascripts/datasource/DatasourceModal_spec.jsx @@ -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 () => { diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx index 7b8c9c2283..ab6e677dbc 100644 --- a/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx index 689dcbf63f..022ee1dcaa 100644 --- a/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx @@ -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); diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx index 02607c5e42..caff8aa61d 100644 --- a/superset-frontend/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx @@ -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({ diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx index 15b48ad935..44bfd8ee5c 100644 --- a/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx @@ -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', ); diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx index fdb2623717..e66f6ae8a9 100644 --- a/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx @@ -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); diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx index 3409543fcc..bea3432beb 100644 --- a/superset-frontend/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/ColorPickerControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ColorPickerControl_spec.jsx index b07ecfe6e1..8e74949080 100644 --- a/superset-frontend/spec/javascripts/explore/components/ColorPickerControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/ColorPickerControl_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/ColorScheme_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ColorScheme_spec.jsx index 4cf618b164..fcd0f9dee7 100644 --- a/superset-frontend/spec/javascripts/explore/components/ColorScheme_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/ColorScheme_spec.jsx @@ -37,6 +37,6 @@ describe('ColorSchemeControl', () => { }); it('renders a Creatable', () => { - expect(wrapper.find(Creatable)).toHaveLength(1); + expect(wrapper.find(Creatable)).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx index 16cf33505b..83e5512b1a 100644 --- a/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx @@ -43,7 +43,7 @@ describe('ControlPanelSection', () => { it('renders a Panel component', () => { wrapper = shallow(); - expect(wrapper.find(Panel)).toHaveLength(1); + expect(wrapper.find(Panel)).toExist(); }); describe('with optional props', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/ControlRow_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ControlRow_spec.jsx index 61ddee4b34..975b967372 100644 --- a/superset-frontend/spec/javascripts/explore/components/ControlRow_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/ControlRow_spec.jsx @@ -23,12 +23,12 @@ import ControlSetRow from 'src/explore/components/ControlRow'; describe('ControlSetRow', () => { it('renders a single row with one element', () => { const wrapper = shallow(]} />); - 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(, ]} />); - expect(wrapper.find('.row')).toHaveLength(1); + expect(wrapper.find('.row')).toExist(); expect(wrapper.find('.row').find('a')).toHaveLength(2); }); }); diff --git a/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx index 2fc0b014a7..7b09c1108b 100644 --- a/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx @@ -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, ); diff --git a/superset-frontend/spec/javascripts/explore/components/DateFilterControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/DateFilterControl_spec.jsx index 193c65066f..3026424d48 100644 --- a/superset-frontend/spec/javascripts/explore/components/DateFilterControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/DateFilterControl_spec.jsx @@ -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); }); diff --git a/superset-frontend/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx b/superset-frontend/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx index 081b5909a3..a6c5781742 100644 --- a/superset-frontend/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx @@ -37,7 +37,7 @@ describe('EmbedCodeButton', () => { it('renders overlay trigger', () => { const wrapper = shallow(); - expect(wrapper.find(OverlayTrigger)).toHaveLength(1); + expect(wrapper.find(OverlayTrigger)).toExist(); }); it('returns correct embed code', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx index f819bdf74c..023b0796ff 100644 --- a/superset-frontend/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/ExploreViewContainer_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ExploreViewContainer_spec.jsx index 5af8aad0ac..c0a0dac1b1 100644 --- a/superset-frontend/spec/javascripts/explore/components/ExploreViewContainer_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/ExploreViewContainer_spec.jsx @@ -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()', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/FilterBoxItemControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/FilterBoxItemControl_spec.jsx index 0a7a392707..fb942459b8 100644 --- a/superset-frontend/spec/javascripts/explore/components/FilterBoxItemControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/FilterBoxItemControl_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx b/superset-frontend/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx index 249ad27b22..fbdb7120f0 100644 --- a/superset-frontend/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx @@ -37,14 +37,14 @@ describe('FilterDefinitionOption', () => { const wrapper = shallow( , ); - expect(wrapper.find(ColumnOption)).toHaveLength(1); + expect(wrapper.find(ColumnOption)).toExist(); }); it('renders a AdhocMetricStaticOption given an adhoc metric', () => { const wrapper = shallow( , ); - expect(wrapper.find(AdhocMetricStaticOption)).toHaveLength(1); + expect(wrapper.find(AdhocMetricStaticOption)).toExist(); }); it('renders the metric name given a saved metric', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx index a88784b4aa..3ad9a3cc5b 100644 --- a/superset-frontend/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx @@ -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(); }); }); diff --git a/superset-frontend/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx b/superset-frontend/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx index d215676f05..76154984a0 100644 --- a/superset-frontend/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx @@ -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(); }); }); diff --git a/superset-frontend/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx b/superset-frontend/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx index 1fa03f8291..6041e73c43 100644 --- a/superset-frontend/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx @@ -36,7 +36,7 @@ describe('MetricDefinitionValue', () => { const wrapper = shallow( , ); - 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(); }); }); diff --git a/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx index 7411795846..c924e3316b 100644 --- a/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/RowCountLabel_spec.jsx b/superset-frontend/spec/javascripts/explore/components/RowCountLabel_spec.jsx index 13679bf39c..38641d2782 100644 --- a/superset-frontend/spec/javascripts/explore/components/RowCountLabel_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/RowCountLabel_spec.jsx @@ -36,8 +36,8 @@ describe('RowCountLabel', () => { }); it('renders a Label and a TooltipWrapper', () => { const wrapper = shallow(); - 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 = { diff --git a/superset-frontend/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx b/superset-frontend/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx index cd7c07b2fb..198759c69e 100644 --- a/superset-frontend/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx @@ -45,6 +45,6 @@ describe('RunQueryActionButton', () => { }); it('renders a single Button', () => { - expect(wrapper.find(Button)).toHaveLength(1); + expect(wrapper.find(Button)).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/explore/components/SaveModal_spec.jsx b/superset-frontend/spec/javascripts/explore/components/SaveModal_spec.jsx index 789e3bf613..4348b9b491 100644 --- a/superset-frontend/spec/javascripts/explore/components/SaveModal_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/SaveModal_spec.jsx @@ -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); }); diff --git a/superset-frontend/spec/javascripts/explore/components/SelectControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/SelectControl_spec.jsx index 37f5765726..b087ac2585 100644 --- a/superset-frontend/spec/javascripts/explore/components/SelectControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/SelectControl_spec.jsx @@ -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, ); diff --git a/superset-frontend/spec/javascripts/explore/components/TextArea_spec.jsx b/superset-frontend/spec/javascripts/explore/components/TextArea_spec.jsx index 56cb000c1a..4c656b5e1a 100644 --- a/superset-frontend/spec/javascripts/explore/components/TextArea_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/TextArea_spec.jsx @@ -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(); - expect(wrapper.find(FormControl)).toHaveLength(0); - expect(wrapper.find(AceEditor)).toHaveLength(1); + expect(wrapper.find(FormControl)).not.toExist(); + expect(wrapper.find(AceEditor)).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx index 71c7966e81..7137ee2880 100644 --- a/superset-frontend/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/ViewportControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ViewportControl_spec.jsx index 2f66de7b52..87828c99e9 100644 --- a/superset-frontend/spec/javascripts/explore/components/ViewportControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/ViewportControl_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/explore/components/VizTypeControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/VizTypeControl_spec.jsx index 493db22b48..4271b58725 100644 --- a/superset-frontend/spec/javascripts/explore/components/VizTypeControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/VizTypeControl_spec.jsx @@ -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(); }); }); diff --git a/superset-frontend/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx b/superset-frontend/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx index 9b3e4a0b41..bd9b6cf980 100644 --- a/superset-frontend/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx +++ b/superset-frontend/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/messageToasts/components/Toast_spec.jsx b/superset-frontend/spec/javascripts/messageToasts/components/Toast_spec.jsx index bc8afdecab..168bdae473 100644 --- a/superset-frontend/spec/javascripts/messageToasts/components/Toast_spec.jsx +++ b/superset-frontend/spec/javascripts/messageToasts/components/Toast_spec.jsx @@ -33,7 +33,7 @@ const setup = overrideProps => mount(); 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', () => { diff --git a/superset-frontend/spec/javascripts/profile/App_spec.tsx b/superset-frontend/spec/javascripts/profile/App_spec.tsx index 023d9bbe47..13b53b8b76 100644 --- a/superset-frontend/spec/javascripts/profile/App_spec.tsx +++ b/superset-frontend/spec/javascripts/profile/App_spec.tsx @@ -33,7 +33,7 @@ describe('App', () => { it('renders 2 Col', () => { const wrapper = shallow(); - expect(wrapper.find(Row)).toHaveLength(1); + expect(wrapper.find(Row)).toExist(); expect(wrapper.find(Col)).toHaveLength(2); }); diff --git a/superset-frontend/spec/javascripts/profile/RecentActivity_spec.tsx b/superset-frontend/spec/javascripts/profile/RecentActivity_spec.tsx index 3399436a05..73fdeb6e84 100644 --- a/superset-frontend/spec/javascripts/profile/RecentActivity_spec.tsx +++ b/superset-frontend/spec/javascripts/profile/RecentActivity_spec.tsx @@ -35,6 +35,6 @@ describe('RecentActivity', () => { it('renders a TableLoader', () => { const wrapper = shallow(); - expect(wrapper.find(TableLoader)).toHaveLength(1); + expect(wrapper.find(TableLoader)).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/profile/Security_spec.tsx b/superset-frontend/spec/javascripts/profile/Security_spec.tsx index f023169d39..dc493d1148 100644 --- a/superset-frontend/spec/javascripts/profile/Security_spec.tsx +++ b/superset-frontend/spec/javascripts/profile/Security_spec.tsx @@ -43,7 +43,7 @@ describe('Security', () => { }); it('renders no permission label when empty', () => { const wrapper = mount(); - 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(); }); }); diff --git a/superset-frontend/spec/javascripts/profile/UserInfo_spec.tsx b/superset-frontend/spec/javascripts/profile/UserInfo_spec.tsx index 2d55df5414..57ae89156d 100644 --- a/superset-frontend/spec/javascripts/profile/UserInfo_spec.tsx +++ b/superset-frontend/spec/javascripts/profile/UserInfo_spec.tsx @@ -33,11 +33,11 @@ describe('UserInfo', () => { }); it('renders a Gravatar', () => { const wrapper = mount(); - expect(wrapper.find(Gravatar)).toHaveLength(1); + expect(wrapper.find(Gravatar)).toExist(); }); it('renders a Panel', () => { const wrapper = mount(); - expect(wrapper.find(Panel)).toHaveLength(1); + expect(wrapper.find(Panel)).toExist(); }); it('renders 5 icons', () => { const wrapper = mount(); diff --git a/superset-frontend/spec/javascripts/sqllab/ColumnElement_spec.tsx b/superset-frontend/spec/javascripts/sqllab/ColumnElement_spec.tsx index 0e961864a7..8e35ed11dd 100644 --- a/superset-frontend/spec/javascripts/sqllab/ColumnElement_spec.tsx +++ b/superset-frontend/spec/javascripts/sqllab/ColumnElement_spec.tsx @@ -32,18 +32,18 @@ describe('ColumnElement', () => { }); it('renders a proper primary key', () => { const wrapper = mount(); - 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(); - 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(); - expect(wrapper.find('i')).toHaveLength(0); + expect(wrapper.find('i')).not.toExist(); expect(wrapper.find('.col-name').first().text()).toBe('last_name'); }); }); diff --git a/superset-frontend/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx b/superset-frontend/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx index 11d3043519..79f8e69ea2 100644 --- a/superset-frontend/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/sqllab/HighlightedSql_spec.jsx b/superset-frontend/spec/javascripts/sqllab/HighlightedSql_spec.jsx index 2f4d471f81..80f550c978 100644 --- a/superset-frontend/spec/javascripts/sqllab/HighlightedSql_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/HighlightedSql_spec.jsx @@ -31,11 +31,11 @@ describe('HighlightedSql', () => { }); it('renders a ModalTrigger', () => { const wrapper = shallow(); - expect(wrapper.find(ModalTrigger)).toHaveLength(1); + expect(wrapper.find(ModalTrigger)).toExist(); }); it('renders a ModalTrigger while using shrink', () => { const wrapper = shallow(); - expect(wrapper.find(ModalTrigger)).toHaveLength(1); + expect(wrapper.find(ModalTrigger)).toExist(); }); it('renders two SyntaxHighlighter in modal', () => { const wrapper = mount( diff --git a/superset-frontend/spec/javascripts/sqllab/LimitControl_spec.jsx b/superset-frontend/spec/javascripts/sqllab/LimitControl_spec.jsx index 060d53f5bc..ed3a9ba2ef 100644 --- a/superset-frontend/spec/javascripts/sqllab/LimitControl_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/LimitControl_spec.jsx @@ -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; diff --git a/superset-frontend/spec/javascripts/sqllab/Link_spec.jsx b/superset-frontend/spec/javascripts/sqllab/Link_spec.jsx index ae58f04e17..b3ef7cf82a 100644 --- a/superset-frontend/spec/javascripts/sqllab/Link_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/Link_spec.jsx @@ -34,6 +34,6 @@ describe('Link', () => { }); it('renders an anchor tag', () => { const wrapper = shallow(TEST); - expect(wrapper.find('a')).toHaveLength(1); + expect(wrapper.find('a')).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/sqllab/QuerySearch_spec.jsx b/superset-frontend/spec/javascripts/sqllab/QuerySearch_spec.jsx index f7af89cd6a..5d853dc1dd 100644 --- a/superset-frontend/spec/javascripts/sqllab/QuerySearch_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/QuerySearch_spec.jsx @@ -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', () => { diff --git a/superset-frontend/spec/javascripts/sqllab/QueryStateLabel_spec.jsx b/superset-frontend/spec/javascripts/sqllab/QueryStateLabel_spec.jsx index 4d0d43e165..01fc48e809 100644 --- a/superset-frontend/spec/javascripts/sqllab/QueryStateLabel_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/QueryStateLabel_spec.jsx @@ -35,6 +35,6 @@ describe('SavedQuery', () => { }); it('has an Overlay and a Popover', () => { const wrapper = shallow(); - expect(wrapper.find(Label)).toHaveLength(1); + expect(wrapper.find(Label)).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/sqllab/QueryTable_spec.jsx b/superset-frontend/spec/javascripts/sqllab/QueryTable_spec.jsx index 78fc1cb72b..7bd205a3b1 100644 --- a/superset-frontend/spec/javascripts/sqllab/QueryTable_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/QueryTable_spec.jsx @@ -35,8 +35,8 @@ describe('QueryTable', () => { }); it('renders a proper table', () => { const wrapper = shallow(); - expect(wrapper.find(Table)).toHaveLength(1); - expect(wrapper.find(Table).shallow().find('table')).toHaveLength(1); + expect(wrapper.find(Table)).toExist(); + expect(wrapper.find(Table).shallow().find('table')).toExist(); expect(wrapper.find(Table).shallow().find('table').find('Tr')).toHaveLength( 2, ); diff --git a/superset-frontend/spec/javascripts/sqllab/ResultSet_spec.jsx b/superset-frontend/spec/javascripts/sqllab/ResultSet_spec.jsx index dcba856a93..35ff87ccc0 100644 --- a/superset-frontend/spec/javascripts/sqllab/ResultSet_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/ResultSet_spec.jsx @@ -73,7 +73,7 @@ describe('ResultSet', () => { }); it('renders a Table', () => { const wrapper = shallow(); - expect(wrapper.find(FilterableTable)).toHaveLength(1); + expect(wrapper.find(FilterableTable)).toExist(); }); describe('componentWillReceiveProps', () => { const wrapper = shallow(); @@ -101,7 +101,7 @@ describe('ResultSet', () => { const wrapper = shallow(); const filterableTable = wrapper.find(FilterableTable); expect(filterableTable.props().data).toBe(mockedProps.query.results.data); - expect(wrapper.find(ExploreResultsButton)).toHaveLength(1); + expect(wrapper.find(ExploreResultsButton)).toExist(); }); it('should render empty results', () => { const wrapper = shallow(); @@ -112,8 +112,8 @@ describe('ResultSet', () => { }, }; wrapper.setProps({ query: emptyResults }); - expect(wrapper.find(FilterableTable)).toHaveLength(0); - expect(wrapper.find(Alert)).toHaveLength(1); + expect(wrapper.find(FilterableTable)).not.toExist(); + expect(wrapper.find(Alert)).toExist(); expect(wrapper.find(Alert).shallow().text()).toBe( 'The query returned no data', ); @@ -127,21 +127,21 @@ describe('ResultSet', () => { }); it('should render stopped query', () => { const wrapper = shallow(); - expect(wrapper.find(Alert)).toHaveLength(1); + expect(wrapper.find(Alert)).toExist(); }); it('should render running/pending/fetching query', () => { const wrapper = shallow(); - expect(wrapper.find(ProgressBar)).toHaveLength(1); + expect(wrapper.find(ProgressBar)).toExist(); }); it('should render a failed query with an error message', () => { const wrapper = shallow( , ); - expect(wrapper.find(ErrorMessageWithStackTrace)).toHaveLength(1); + expect(wrapper.find(ErrorMessageWithStackTrace)).toExist(); }); it('should render a failed query with an errors object', () => { const wrapper = shallow(); - expect(wrapper.find(ErrorMessageWithStackTrace)).toHaveLength(1); + expect(wrapper.find(ErrorMessageWithStackTrace)).toExist(); }); }); }); diff --git a/superset-frontend/spec/javascripts/sqllab/SaveQuery_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SaveQuery_spec.jsx index 5d817aadfc..514b52ff35 100644 --- a/superset-frontend/spec/javascripts/sqllab/SaveQuery_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/SaveQuery_spec.jsx @@ -42,7 +42,7 @@ describe('SavedQuery', () => { }); it('has a ModalTrigger', () => { const wrapper = shallow(); - expect(wrapper.find(ModalTrigger)).toHaveLength(1); + expect(wrapper.find(ModalTrigger)).toExist(); }); it('has a cancel button', () => { const wrapper = shallow(); diff --git a/superset-frontend/spec/javascripts/sqllab/SouthPane_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SouthPane_spec.jsx index 694426d038..35beab77d0 100644 --- a/superset-frontend/spec/javascripts/sqllab/SouthPane_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/SouthPane_spec.jsx @@ -94,7 +94,7 @@ describe('SouthPane', () => { }); it('should pass latest query down to ResultSet component', () => { wrapper = getWrapper(); - expect(wrapper.find(ResultSet)).toHaveLength(1); + expect(wrapper.find(ResultSet)).toExist(); expect(wrapper.find(ResultSet).props().query.id).toEqual( mockedProps.latestQueryId, ); diff --git a/superset-frontend/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx index c524e9beed..84ef4a5f62 100644 --- a/superset-frontend/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx @@ -59,6 +59,6 @@ describe('SqlEditorLeftBar', () => { }); it('renders a TableElement', () => { - expect(wrapper.find(TableElement)).toHaveLength(1); + expect(wrapper.find(TableElement)).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/sqllab/SqlEditor_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SqlEditor_spec.jsx index ca43a785ac..2498441ebb 100644 --- a/superset-frontend/spec/javascripts/sqllab/SqlEditor_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/SqlEditor_spec.jsx @@ -58,15 +58,15 @@ describe('SqlEditor', () => { }); it('render a SqlEditorLeftBar', () => { const wrapper = shallow(); - expect(wrapper.find(SqlEditorLeftBar)).toHaveLength(1); + expect(wrapper.find(SqlEditorLeftBar)).toExist(); }); it('render an AceEditorWrapper', () => { const wrapper = shallow(); - expect(wrapper.find(AceEditorWrapper)).toHaveLength(1); + expect(wrapper.find(AceEditorWrapper)).toExist(); }); it('render an SouthPane', () => { const wrapper = shallow(); - expect(wrapper.find(SouthPane)).toHaveLength(1); + expect(wrapper.find(SouthPane)).toExist(); }); it('does not overflow the editor window', () => { const wrapper = shallow(); @@ -93,14 +93,14 @@ describe('SqlEditor', () => { const defaultQueryLimit = 101; const updatedProps = { ...mockedProps, defaultQueryLimit }; const wrapper = shallow(); - expect(wrapper.find(LimitControl)).toHaveLength(1); + expect(wrapper.find(LimitControl)).toExist(); expect(wrapper.find(LimitControl).props().value).toEqual(defaultQueryLimit); }); it('render a LimitControl with existing limit', () => { const queryEditor = { ...defaultQueryEditor, queryLimit: 101 }; const updatedProps = { ...mockedProps, queryEditor }; const wrapper = shallow(); - expect(wrapper.find(LimitControl)).toHaveLength(1); + expect(wrapper.find(LimitControl)).toExist(); expect(wrapper.find(LimitControl).props().value).toEqual( queryEditor.queryLimit, ); diff --git a/superset-frontend/spec/javascripts/sqllab/TabStatusIcon_spec.jsx b/superset-frontend/spec/javascripts/sqllab/TabStatusIcon_spec.jsx index 4241353dc1..08923c5d9e 100644 --- a/superset-frontend/spec/javascripts/sqllab/TabStatusIcon_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/TabStatusIcon_spec.jsx @@ -33,7 +33,7 @@ function setup() { describe('TabStatusIcon', () => { it('renders a circle without an x when hovered', () => { const { wrapper } = setup(); - expect(wrapper.find('div.circle')).toHaveLength(1); + expect(wrapper.find('div.circle')).toExist(); expect(wrapper.text()).toBe(''); }); }); diff --git a/superset-frontend/spec/javascripts/views/CRUD/chart/ChartList_spec.jsx b/superset-frontend/spec/javascripts/views/CRUD/chart/ChartList_spec.jsx index ba6c464f12..cab27f7d42 100644 --- a/superset-frontend/spec/javascripts/views/CRUD/chart/ChartList_spec.jsx +++ b/superset-frontend/spec/javascripts/views/CRUD/chart/ChartList_spec.jsx @@ -76,11 +76,11 @@ describe('ChartList', () => { }); it('renders', () => { - expect(wrapper.find(ChartList)).toHaveLength(1); + expect(wrapper.find(ChartList)).toExist(); }); it('renders a ListView', () => { - expect(wrapper.find(ListView)).toHaveLength(1); + expect(wrapper.find(ListView)).toExist(); }); it('fetches info', () => { diff --git a/superset-frontend/spec/javascripts/views/CRUD/dashboard/DashboardList_spec.jsx b/superset-frontend/spec/javascripts/views/CRUD/dashboard/DashboardList_spec.jsx index c847b17159..5c448ea59d 100644 --- a/superset-frontend/spec/javascripts/views/CRUD/dashboard/DashboardList_spec.jsx +++ b/superset-frontend/spec/javascripts/views/CRUD/dashboard/DashboardList_spec.jsx @@ -68,11 +68,11 @@ describe('DashboardList', () => { }); it('renders', () => { - expect(wrapper.find(DashboardList)).toHaveLength(1); + expect(wrapper.find(DashboardList)).toExist(); }); it('renders a ListView', () => { - expect(wrapper.find(ListView)).toHaveLength(1); + expect(wrapper.find(ListView)).toExist(); }); it('fetches info', () => { @@ -89,8 +89,8 @@ describe('DashboardList', () => { ); }); it('edits', () => { - expect(wrapper.find(PropertiesModal)).toHaveLength(0); + expect(wrapper.find(PropertiesModal)).not.toExist(); wrapper.find('[data-test="pencil"]').first().simulate('click'); - expect(wrapper.find(PropertiesModal)).toHaveLength(1); + expect(wrapper.find(PropertiesModal)).toExist(); }); }); diff --git a/superset-frontend/spec/javascripts/views/CRUD/dataset/DatasetList_spec.jsx b/superset-frontend/spec/javascripts/views/CRUD/dataset/DatasetList_spec.jsx index 9f7c285c9a..0690d97e75 100644 --- a/superset-frontend/spec/javascripts/views/CRUD/dataset/DatasetList_spec.jsx +++ b/superset-frontend/spec/javascripts/views/CRUD/dataset/DatasetList_spec.jsx @@ -86,11 +86,11 @@ describe('DatasetList', () => { }); it('renders', () => { - expect(wrapper.find(DatasetList)).toHaveLength(1); + expect(wrapper.find(DatasetList)).toExist(); }); it('renders a ListView', () => { - expect(wrapper.find(ListView)).toHaveLength(1); + expect(wrapper.find(ListView)).toExist(); }); it('fetches info', () => { diff --git a/superset-frontend/spec/javascripts/welcome/DashboardTable_spec.tsx b/superset-frontend/spec/javascripts/welcome/DashboardTable_spec.tsx index 5ded3fabe6..d8f4f2b034 100644 --- a/superset-frontend/spec/javascripts/welcome/DashboardTable_spec.tsx +++ b/superset-frontend/spec/javascripts/welcome/DashboardTable_spec.tsx @@ -56,7 +56,7 @@ describe('DashboardTable', () => { // there's a delay between response and updating state, so manually set it // rather than adding a timeout which could introduce flakiness wrapper.setState({ dashboards: mockDashboards }); - expect(wrapper.find(ListView)).toHaveLength(1); + expect(wrapper.find(ListView)).toExist(); done(); }); });