You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by di...@apache.org on 2023/01/31 01:40:22 UTC
[superset] 01/01: chore: Add tests to SQL lab button components
This is an automated email from the ASF dual-hosted git repository.
diegomedina24 pushed a commit to branch dm/sql-lab-button-component-tests
in repository https://gitbox.apache.org/repos/asf/superset.git
commit 0652f8a44c75aa9abb3376a0d3ce2492c48ba93e
Author: Diego Medina <di...@gmail.com>
AuthorDate: Mon Jan 30 22:39:57 2023 -0300
chore: Add tests to SQL lab button components
---
.../EstimateQueryCostButton.test.tsx | 47 ++++++++++-
.../ExploreCtasResultsButton.test.tsx | 95 ++++++++++++++++++++++
.../components/ExploreCtasResultsButton/index.tsx | 2 +-
.../ExploreResultsButton.test.jsx | 67 ---------------
.../ExploreResultsButton.test.tsx | 51 ++++++++++++
.../components/ExploreResultsButton/index.tsx | 2 +-
6 files changed, 194 insertions(+), 70 deletions(-)
diff --git a/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/EstimateQueryCostButton.test.tsx b/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/EstimateQueryCostButton.test.tsx
index 5b2cae1741..38dbbf65a0 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 0000000000..1f3382505b
--- /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<ExploreCtasResultsButtonProps>, store?: Store) =>
+ render(
+ <ExploreCtasResultsButton
+ table="test"
+ schema="test_schema"
+ dbId={12346}
+ {...props}
+ />,
+ {
+ 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 2fe1e14a07..d432c85f80 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 e9f1740517..0000000000
--- 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(
- <ThemeProvider theme={supersetTheme}>
- <ExploreResultsButton store={store} {...props} />
- </ThemeProvider>,
- )
- .dive()
- .dive();
-
- it('renders with props', () => {
- expect(
- React.isValidElement(<ExploreResultsButton {...mockedProps} />),
- ).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 0000000000..5577419cb4
--- /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<ExploreResultsButtonProps> = {},
+) =>
+ render(<ExploreResultsButton onClick={onClickFn} {...props} />, {
+ useRedux: true,
+ });
+
+describe('ExploreCtasResultsButton', () => {
+ 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 b3ee748218..454f3a26b0 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;
};