From 4873c0990ade4649d03aa2907fa3d5d5a62c07d7 Mon Sep 17 00:00:00 2001 From: Diego Medina Date: Mon, 24 Apr 2023 15:17:51 -0300 Subject: [PATCH] chore: Add tests to SQL lab button components (#22916) --- .../EstimateQueryCostButton.test.tsx | 47 ++++++++- .../ExploreCtasResultsButton.test.tsx | 95 +++++++++++++++++++ .../ExploreCtasResultsButton/index.tsx | 2 +- .../ExploreResultsButton.test.jsx | 67 ------------- .../ExploreResultsButton.test.tsx | 51 ++++++++++ .../components/ExploreResultsButton/index.tsx | 2 +- 6 files changed, 194 insertions(+), 70 deletions(-) create mode 100644 superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/ExploreCtasResultsButton.test.tsx delete mode 100644 superset-frontend/src/SqlLab/components/ExploreResultsButton/ExploreResultsButton.test.jsx create mode 100644 superset-frontend/src/SqlLab/components/ExploreResultsButton/ExploreResultsButton.test.tsx diff --git a/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/EstimateQueryCostButton.test.tsx b/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/EstimateQueryCostButton.test.tsx index 5b2cae174..38dbbf65a 100644 --- a/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/EstimateQueryCostButton.test.tsx +++ b/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/EstimateQueryCostButton.test.tsx @@ -19,7 +19,7 @@ import React from 'react'; import configureStore from 'redux-mock-store'; import thunk from 'redux-thunk'; -import { render } from 'spec/helpers/testing-library'; +import { fireEvent, render } from 'spec/helpers/testing-library'; import { Store } from 'redux'; import { initialState, @@ -90,4 +90,49 @@ describe('EstimateQueryCostButton', () => { expect(queryByText('Estimate selected query cost')).toBeTruthy(); }); + + it('renders estimation error result', async () => { + const { queryByText, getByText } = setup( + {}, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + queryCostEstimates: { + [defaultQueryEditor.id]: { + error: 'Estimate error', + }, + }, + }, + }), + ); + + expect(queryByText('Estimate cost')).toBeTruthy(); + fireEvent.click(getByText('Estimate cost')); + + expect(queryByText('Estimate error')).toBeTruthy(); + }); + + it('renders estimation success result', async () => { + const { queryByText, getByText } = setup( + {}, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + queryCostEstimates: { + [defaultQueryEditor.id]: { + completed: true, + cost: [{ 'Total cost': '1.2' }], + }, + }, + }, + }), + ); + + expect(queryByText('Estimate cost')).toBeTruthy(); + fireEvent.click(getByText('Estimate cost')); + + expect(queryByText('Total cost')).toBeTruthy(); + }); }); diff --git a/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/ExploreCtasResultsButton.test.tsx b/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/ExploreCtasResultsButton.test.tsx new file mode 100644 index 000000000..1f3382505 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/ExploreCtasResultsButton.test.tsx @@ -0,0 +1,95 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import configureStore from 'redux-mock-store'; +import fetchMock from 'fetch-mock'; +import thunk from 'redux-thunk'; +import { fireEvent, render, waitFor } from 'spec/helpers/testing-library'; +import { Store } from 'redux'; +import { SupersetClientClass } from '@superset-ui/core'; +import { initialState } from 'src/SqlLab/fixtures'; + +import ExploreCtasResultsButton, { + ExploreCtasResultsButtonProps, +} from 'src/SqlLab/components/ExploreCtasResultsButton'; + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); + +const getOrCreateTableEndpoint = `glob:*/superset/get_or_create_table/`; + +const setup = (props: Partial, store?: Store) => + render( + , + { + useRedux: true, + ...(store && { store }), + }, + ); + +describe('ExploreCtasResultsButton', () => { + const postFormSpy = jest.spyOn(SupersetClientClass.prototype, 'postForm'); + postFormSpy.mockImplementation(jest.fn()); + + it('renders', async () => { + const { queryByText } = setup({}, mockStore(initialState)); + + expect(queryByText('Explore')).toBeTruthy(); + }); + + it('visualize results', async () => { + const { getByText } = setup({}, mockStore(initialState)); + + postFormSpy.mockClear(); + fetchMock.reset(); + fetchMock.post(getOrCreateTableEndpoint, { table_id: 1234 }); + + fireEvent.click(getByText('Explore')); + + await waitFor(() => { + expect(postFormSpy).toHaveBeenCalledTimes(1); + expect(postFormSpy).toHaveBeenCalledWith('http://localhost/explore/', { + form_data: + '{"datasource":"1234__table","metrics":["count"],"groupby":[],"viz_type":"table","since":"100 years ago","all_columns":[],"row_limit":1000}', + }); + }); + }); + + it('visualize results fails', async () => { + const { getByText } = setup({}, mockStore(initialState)); + + postFormSpy.mockClear(); + fetchMock.reset(); + fetchMock.post(getOrCreateTableEndpoint, { + status: 500, + body: { message: 'Unexpected all to v1 API' }, + }); + + fireEvent.click(getByText('Explore')); + + await waitFor(() => { + expect(postFormSpy).toHaveBeenCalledTimes(0); + }); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx b/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx index a4c71139c..ef3f8462e 100644 --- a/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx +++ b/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx @@ -29,7 +29,7 @@ import Button from 'src/components/Button'; import { exploreChart } from 'src/explore/exploreUtils'; import { SqlLabRootState } from 'src/SqlLab/types'; -interface ExploreCtasResultsButtonProps { +export interface ExploreCtasResultsButtonProps { table: string; schema?: string | null; dbId: number; diff --git a/superset-frontend/src/SqlLab/components/ExploreResultsButton/ExploreResultsButton.test.jsx b/superset-frontend/src/SqlLab/components/ExploreResultsButton/ExploreResultsButton.test.jsx deleted file mode 100644 index e9f174051..000000000 --- a/superset-frontend/src/SqlLab/components/ExploreResultsButton/ExploreResultsButton.test.jsx +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import configureStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; -import { shallow } from 'enzyme'; -import sqlLabReducer from 'src/SqlLab/reducers/index'; -import ExploreResultsButton from 'src/SqlLab/components/ExploreResultsButton'; -import Button from 'src/components/Button'; -import { supersetTheme, ThemeProvider } from '@superset-ui/core'; - -describe('ExploreResultsButton', () => { - const middlewares = [thunk]; - const mockStore = configureStore(middlewares); - const database = { - allows_subquery: true, - }; - const initialState = { - sqlLab: { - ...sqlLabReducer(undefined, {}), - }, - common: { - conf: { SUPERSET_WEBSERVER_TIMEOUT: 45 }, - }, - }; - const store = mockStore(initialState); - const mockedProps = { - database, - onClick() {}, - }; - - const getExploreResultsButtonWrapper = (props = mockedProps) => - shallow( - - - , - ) - .dive() - .dive(); - - it('renders with props', () => { - expect( - React.isValidElement(), - ).toBe(true); - }); - - it('renders a Button', () => { - const wrapper = getExploreResultsButtonWrapper(); - expect(wrapper.find(Button)).toExist(); - }); -}); diff --git a/superset-frontend/src/SqlLab/components/ExploreResultsButton/ExploreResultsButton.test.tsx b/superset-frontend/src/SqlLab/components/ExploreResultsButton/ExploreResultsButton.test.tsx new file mode 100644 index 000000000..5126299fe --- /dev/null +++ b/superset-frontend/src/SqlLab/components/ExploreResultsButton/ExploreResultsButton.test.tsx @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; + +import ExploreResultsButton, { + ExploreResultsButtonProps, +} from 'src/SqlLab/components/ExploreResultsButton'; +import { OnClickHandler } from 'src/components/Button'; + +const setup = ( + onClickFn: OnClickHandler, + props: Partial = {}, +) => + render(, { + useRedux: true, + }); + +describe('ExploreResultsButton', () => { + it('renders', async () => { + const { queryByText } = setup(jest.fn(), { + database: { allows_subquery: true }, + }); + + expect(queryByText('Create Chart')).toBeTruthy(); + expect(screen.getByRole('button', { name: 'Create Chart' })).toBeEnabled(); + }); + + it('renders disabled if subquery not allowed', async () => { + const { queryByText } = setup(jest.fn()); + + expect(queryByText('Create Chart')).toBeTruthy(); + expect(screen.getByRole('button', { name: 'Create Chart' })).toBeDisabled(); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx b/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx index b3ee74821..454f3a26b 100644 --- a/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx +++ b/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx @@ -21,7 +21,7 @@ import { t } from '@superset-ui/core'; import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls'; import Button, { OnClickHandler } from 'src/components/Button'; -interface ExploreResultsButtonProps { +export interface ExploreResultsButtonProps { database?: { allows_subquery?: boolean; };