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;
   };