You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ly...@apache.org on 2022/07/22 17:07:45 UTC
[superset] 39/39: Overwrite button fixed, testing for SaveDatasetModal begun
This is an automated email from the ASF dual-hosted git repository.
lyndsi pushed a commit to branch lyndsi/sql-lab-new-explore-button-functionality-and-move-save-dataset-to-split-save-button
in repository https://gitbox.apache.org/repos/asf/superset.git
commit 3dc9cd24e57970a6aa763c1ca53e04307ee09a40
Author: lyndsiWilliams <kc...@gmail.com>
AuthorDate: Wed Jul 13 15:16:51 2022 -0500
Overwrite button fixed, testing for SaveDatasetModal begun
---
.../superset-ui-core/src/query/DatasourceKey.ts | 3 +-
.../SaveDatasetModal/SaveDatasetModal.test.tsx | 856 ++++++++++++++++++++-
.../SqlLab/components/SaveDatasetModal/index.tsx | 15 +-
superset/models/helpers.py | 32 +-
4 files changed, 857 insertions(+), 49 deletions(-)
diff --git a/superset-frontend/packages/superset-ui-core/src/query/DatasourceKey.ts b/superset-frontend/packages/superset-ui-core/src/query/DatasourceKey.ts
index 6f40abb9e3..38a38e10b1 100644
--- a/superset-frontend/packages/superset-ui-core/src/query/DatasourceKey.ts
+++ b/superset-frontend/packages/superset-ui-core/src/query/DatasourceKey.ts
@@ -27,8 +27,7 @@ export default class DatasourceKey {
constructor(key: string) {
const [idStr, typeStr] = key.split('__');
this.id = parseInt(idStr, 10);
- this.type =
- typeStr === 'table' ? DatasourceType.Table : DatasourceType.Druid;
+ this.type = DatasourceType.Table; // default to SqlaTable model
this.type = typeStr === 'query' ? DatasourceType.Query : this.type;
}
diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx
index b7f3ad8a8a..5520855d87 100644
--- a/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx
+++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx
@@ -21,8 +21,16 @@ import {
ISaveableDatasource,
SaveDatasetModal,
} from 'src/SqlLab/components/SaveDatasetModal';
-import { render, screen } from 'spec/helpers/testing-library';
+import { Select } from 'src/components';
+import {
+ render,
+ screen,
+ act,
+ waitFor,
+ within,
+} from 'spec/helpers/testing-library';
import { DatasourceType } from '@superset-ui/core';
+import userEvent from '@testing-library/user-event';
const testQuery: ISaveableDatasource = {
name: 'unimportant',
@@ -55,9 +63,732 @@ const mockedProps = {
datasource: testQuery,
};
-describe('SaveDatasetModal RTL', () => {
- it('renders a "Save as new" field', () => {
- render(<SaveDatasetModal {...mockedProps} />, { useRedux: true });
+const testDatasetList = {
+ count: 25,
+ description_columns: {},
+ ids: [
+ 48, 42, 36, 47, 46, 45, 44, 43, 41, 40, 39, 38, 37, 35, 34, 33, 32, 31, 30,
+ 29,
+ ],
+ label_columns: {
+ 'changed_by.first_name': 'Changed By First Name',
+ 'changed_by.username': 'Changed By Username',
+ changed_by_name: 'Changed By Name',
+ changed_by_url: 'Changed By Url',
+ changed_on_delta_humanized: 'Changed On Delta Humanized',
+ changed_on_utc: 'Changed On Utc',
+ 'database.database_name': 'Database Database Name',
+ 'database.id': 'Database Id',
+ datasource_type: 'Datasource Type',
+ default_endpoint: 'Default Endpoint',
+ description: 'Description',
+ explore_url: 'Explore Url',
+ extra: 'Extra',
+ id: 'Id',
+ kind: 'Kind',
+ 'owners.first_name': 'Owners First Name',
+ 'owners.id': 'Owners Id',
+ 'owners.last_name': 'Owners Last Name',
+ 'owners.username': 'Owners Username',
+ schema: 'Schema',
+ sql: 'Sql',
+ table_name: 'Table Name',
+ },
+ list_columns: [
+ 'id',
+ 'database.id',
+ 'database.database_name',
+ 'changed_by_name',
+ 'changed_by_url',
+ 'changed_by.first_name',
+ 'changed_by.username',
+ 'changed_on_utc',
+ 'changed_on_delta_humanized',
+ 'default_endpoint',
+ 'description',
+ 'datasource_type',
+ 'explore_url',
+ 'extra',
+ 'kind',
+ 'owners.id',
+ 'owners.username',
+ 'owners.first_name',
+ 'owners.last_name',
+ 'schema',
+ 'sql',
+ 'table_name',
+ ],
+ list_title: 'List Sqla Table',
+ order_columns: [
+ 'table_name',
+ 'schema',
+ 'changed_by.first_name',
+ 'changed_on_delta_humanized',
+ 'database.database_name',
+ ],
+ result: [
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '20 hours ago',
+ changed_on_utc: '2022-07-12T22:41:31.297778+0000',
+ database: {
+ database_name: 'Google Sheets',
+ id: 2,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=48',
+ extra: null,
+ id: 48,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: null,
+ sql: 'SELECT * FROM Sheet1 ',
+ table_name: 'Garfield query 07/12/2022 14:30:54',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '20 hours ago',
+ changed_on_utc: '2022-07-12T22:24:58.698853+0000',
+ database: {
+ database_name: 'Google Sheets',
+ id: 2,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=42',
+ extra: null,
+ id: 42,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM Sheet1 ',
+ table_name: 'undefined 06/27/2022 18:24:39',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: 'a day ago',
+ changed_on_utc: '2022-07-12T16:32:36.599554+0000',
+ database: {
+ database_name: 'Google Sheets',
+ id: 2,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=36',
+ extra: null,
+ id: 36,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM Sheet1 ',
+ table_name: 'Query 05/19/2022 18:56:50',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '8 days ago',
+ changed_on_utc: '2022-07-05T17:38:12.502830+0000',
+ database: {
+ database_name: 'Google Sheets',
+ id: 2,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=47',
+ extra: null,
+ id: 47,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM Sheet1',
+ table_name: 'Untitled Query 1 07/05/2022 12:38:08',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '10 days ago',
+ changed_on_utc: '2022-07-03T02:32:59.161912+0000',
+ database: {
+ database_name: 'Google Sheets',
+ id: 2,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=46',
+ extra: null,
+ id: 46,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM Sheet1',
+ table_name: 'Untitled Query 1 07/02/2022 21:28:53',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '13 days ago',
+ changed_on_utc: '2022-06-30T18:43:02.757895+0000',
+ database: {
+ database_name: 'Google Sheets',
+ id: 2,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=45',
+ extra: null,
+ id: 45,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: null,
+ sql: 'SELECT * FROM Sheet1',
+ table_name: 'Untitled 06/30/2022 13:43:00',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '13 days ago',
+ changed_on_utc: '2022-06-30T17:32:38.088415+0000',
+ database: {
+ database_name: 'Google Sheets',
+ id: 2,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=44',
+ extra: null,
+ id: 44,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM Sheet1',
+ table_name: 'Untitled Query 1 06/30/2022 12:30:59',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '13 days ago',
+ changed_on_utc: '2022-06-30T17:30:59.136026+0000',
+ database: {
+ database_name: 'Google Sheets',
+ id: 2,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=43',
+ extra: null,
+ id: 43,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM Sheet1',
+ table_name: 'Untitled Query 1 06/30/2022 12:30:44',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '20 days ago',
+ changed_on_utc: '2022-06-22T19:53:04.308253+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=41',
+ extra: null,
+ id: 41,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM "FCC 2018 Survey"',
+ table_name: 'Untitled Query 1 06/22/2022 14:46:56',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '20 days ago',
+ changed_on_utc: '2022-06-22T19:46:56.758263+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=40',
+ extra: null,
+ id: 40,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM "FCC 2018 Survey"',
+ table_name: 'Untitled Query 1 06/22/2022 14:46:05',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '20 days ago',
+ changed_on_utc: '2022-06-22T19:13:10.106631+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=39',
+ extra: null,
+ id: 39,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: null,
+ sql: 'SELECT * FROM "FCC 2018 Survey"',
+ table_name: 'Untitled Dataset 06/22/2022 14:13:00',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '21 days ago',
+ changed_on_utc: '2022-06-21T19:43:58.510913+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=38',
+ extra: null,
+ id: 38,
+ kind: 'physical',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: null,
+ sql: '',
+ table_name: 'Untitled Dataset 06/21/2022 14:43:54',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '21 days ago',
+ changed_on_utc: '2022-06-21T19:42:46.112798+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=37',
+ extra: null,
+ id: 37,
+ kind: 'physical',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: null,
+ sql: '',
+ table_name: 'Untitled Dataset 06/21/2022 14:42:36',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: 'a month ago',
+ changed_on_utc: '2022-05-17T14:25:41.210001+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=35',
+ extra: null,
+ id: 35,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM "FCC 2018 Survey"',
+ table_name: 'Untitled Query 1 05/16/2022 16:31:04',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: 'a month ago',
+ changed_on_utc: '2022-05-16T21:02:33.825514+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=34',
+ extra: null,
+ id: 34,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM "FCC 2018 Survey"',
+ table_name: 'Untitled Query 1 05/16/2022 16:02:04',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: 'a month ago',
+ changed_on_utc: '2022-05-16T21:02:04.789763+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=33',
+ extra: null,
+ id: 33,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM "FCC 2018 Survey"',
+ table_name: 'Untitled Query 1 05/16/2022 16:02:00',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: 'a month ago',
+ changed_on_utc: '2022-05-16T20:14:23.034596+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=32',
+ extra: null,
+ id: 32,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM "FCC 2018 Survey"',
+ table_name: 'Untitled Query 1 05/16/2022 15:14:18',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: 'a month ago',
+ changed_on_utc: '2022-05-16T18:27:26.167253+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=31',
+ extra: null,
+ id: 31,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM "FCC 2018 Survey"',
+ table_name: 'Untitled Query 1 05/16/2022 13:27:20',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '2 months ago',
+ changed_on_utc: '2022-05-13T17:32:43.420029+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=30',
+ extra: null,
+ id: 30,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM "FCC 2018 Survey"',
+ table_name: 'Untitled Query 1 05/13/2022 12:27:46',
+ },
+ {
+ changed_by: {
+ first_name: 'Admin I.',
+ username: 'admin',
+ },
+ changed_by_name: 'Admin I. Strator',
+ changed_by_url: '/superset/profile/admin',
+ changed_on_delta_humanized: '2 months ago',
+ changed_on_utc: '2022-05-13T17:27:46.998589+0000',
+ database: {
+ database_name: 'examples',
+ id: 1,
+ },
+ datasource_type: 'table',
+ default_endpoint: null,
+ description: null,
+ explore_url: '/explore/?dataset_type=table&dataset_id=29',
+ extra: null,
+ id: 29,
+ kind: 'virtual',
+ owners: [
+ {
+ first_name: 'Admin I.',
+ id: 1,
+ last_name: 'Strator',
+ username: 'admin',
+ },
+ ],
+ schema: 'main',
+ sql: 'SELECT * FROM "FCC 2018 Survey"',
+ table_name: 'Untitled Query 1 05/13/2022 12:27:43',
+ },
+ ],
+};
+
+const mockDatasetNames = testDatasetList.result.map(
+ dataset => dataset.table_name,
+);
+
+const getElementByClassName = (className: string) =>
+ document.querySelector(className)! as HTMLElement;
+
+const findSelectValue = () =>
+ waitFor(() => getElementByClassName('.ant-select-selection-item'));
+const getElementsByClassName = (className: string) =>
+ document.querySelectorAll(className)! as NodeListOf<HTMLElement>;
+const findAllSelectOptions = () =>
+ waitFor(() => getElementsByClassName('.ant-select-item-option-content'));
+
+describe('SaveDatasetModal', () => {
+ it('renders a "Save as new" field', async () => {
+ await act(async () => {
+ render(<SaveDatasetModal {...mockedProps} />, { useRedux: true });
+ });
const saveRadioBtn = screen.getByRole('radio', {
name: /save as new unimportant/i,
@@ -73,8 +804,10 @@ describe('SaveDatasetModal RTL', () => {
expect(inputFieldText).toBeVisible();
});
- it('renders an "Overwrite existing" field', () => {
- render(<SaveDatasetModal {...mockedProps} />, { useRedux: true });
+ it('renders an "Overwrite existing" field', async () => {
+ await act(async () => {
+ render(<SaveDatasetModal {...mockedProps} />, { useRedux: true });
+ });
const overwriteRadioBtn = screen.getByRole('radio', {
name: /overwrite existing/i,
@@ -89,15 +822,116 @@ describe('SaveDatasetModal RTL', () => {
expect(placeholderText).toBeVisible();
});
- it('renders a save button', () => {
- render(<SaveDatasetModal {...mockedProps} />, { useRedux: true });
+ it('renders a close button', async () => {
+ await act(async () => {
+ render(<SaveDatasetModal {...mockedProps} />, { useRedux: true });
+ });
+
+ expect(screen.getByRole('button', { name: /close/i })).toBeVisible();
+ });
+
+ it('renders a save button when "Save as new" is selected', async () => {
+ await act(async () => {
+ render(<SaveDatasetModal {...mockedProps} />, { useRedux: true });
+ });
+ // "Save as new" is selected when the modal opens by default
expect(screen.getByRole('button', { name: /save/i })).toBeVisible();
});
- it('renders a close button', () => {
- render(<SaveDatasetModal {...mockedProps} />, { useRedux: true });
+ it('renders a back and overwrite button when "Overwrite existing" is selected', async () => {
+ await act(async () => {
+ render(<SaveDatasetModal {...mockedProps} />, { useRedux: true });
+ });
- expect(screen.getByRole('button', { name: /close/i })).toBeVisible();
+ const overwriteRadioBtn = screen.getByRole('radio', {
+ name: /overwrite existing/i,
+ });
+
+ // Click the overwrite radio button to reveal the overwrite buttons
+ userEvent.click(overwriteRadioBtn);
+
+ expect(screen.getByRole('button', { name: /back/i })).toBeVisible();
+ expect(screen.getByRole('button', { name: /overwrite/i })).toBeVisible();
+ });
+
+ const OPTIONS = [
+ { label: 'John', value: 1, gender: 'Male' },
+ { label: 'Liam', value: 2, gender: 'Male' },
+ { label: 'Olivia', value: 3, gender: 'Female' },
+ { label: 'Emma', value: 4, gender: 'Female' },
+ { label: 'Noah', value: 5, gender: 'Male' },
+ { label: 'Ava', value: 6, gender: 'Female' },
+ { label: 'Oliver', value: 7, gender: 'Male' },
+ { label: 'ElijahH', value: 8, gender: 'Male' },
+ { label: 'Charlotte', value: 9, gender: 'Female' },
+ { label: 'Giovanni', value: 10, gender: 'Male' },
+ { label: 'Franco', value: 11, gender: 'Male' },
+ { label: 'Sandro', value: 12, gender: 'Male' },
+ { label: 'Alehandro', value: 13, gender: 'Male' },
+ { label: 'Johnny', value: 14, gender: 'Male' },
+ { label: 'Nikole', value: 15, gender: 'Female' },
+ { label: 'Igor', value: 16, gender: 'Male' },
+ { label: 'Guilherme', value: 17, gender: 'Male' },
+ { label: 'Irfan', value: 18, gender: 'Male' },
+ { label: 'George', value: 19, gender: 'Male' },
+ { label: 'Ashfaq', value: 20, gender: 'Male' },
+ { label: 'Herme', value: 21, gender: 'Male' },
+ { label: 'Cher', value: 22, gender: 'Female' },
+ { label: 'Her', value: 23, gender: 'Male' },
+ ].sort((option1, option2) => option1.label.localeCompare(option2.label));
+ const defaultSelectProps = {
+ allowClear: true,
+ ariaLabel: 'Test',
+ labelInValue: true,
+ options: OPTIONS,
+ pageSize: 10,
+ showSearch: true,
+ };
+
+ it('renders the overwrite button as disabled until an existing dataset is selected', async () => {
+ await act(async () => {
+ render(
+ <SaveDatasetModal {...mockedProps}>
+ <Select {...defaultSelectProps} allowNewOptions />
+ </SaveDatasetModal>,
+ { useRedux: true },
+ );
+ });
+
+ // expect.assertions(2);
+ const overwriteRadioBtn = screen.getByRole('radio', {
+ name: /overwrite existing/i,
+ });
+
+ await act(async () => {
+ userEvent.click(overwriteRadioBtn);
+ });
+
+ expect(screen.getByRole('button', { name: /overwrite/i })).toBeDisabled();
+ expect(screen.queryByText(/no data/i)).toBe(null);
+
+ const select = screen.getByRole('combobox', { name: /existing dataset/i });
+
+ await act(async () => {
+ userEvent.clear(select);
+ userEvent.click(select);
+ userEvent.type(select, 'e');
+ const options = await findAllSelectOptions();
+ console.log(options);
+ // userEvent.click(await findAllSelectOptions()[0]);
+ });
+ screen.logTestingPlaygroundURL();
+
+ // expect(screen.queryByText(/no data/i)?.innerHTML).toBe('No Data');
+ // expect(screen.queryByText(/no data/i)).toBeInTheDocument();
+
+ // await act(async () => {
+ // userEvent.click(screen.getByText(/no data/i));
+ // });
+ // const options = await findSelectValue();
+
+ // screen.debug(options);
+ // console.log(options);
});
});
diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx
index 1189740d63..3d6a8616b3 100644
--- a/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx
+++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx
@@ -186,6 +186,11 @@ export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({
...(formData || {}),
};
const handleOverwriteDataset = async () => {
+ // if user wants to overwrite a dataset we need to prompt them
+ if (!shouldOverwriteDataset) {
+ setShouldOverwriteDataset(true);
+ return;
+ }
const [, key] = await Promise.all([
updateDataset(
datasource?.dbId,
@@ -257,12 +262,6 @@ export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({
);
const handleSaveInDataset = () => {
- // if user wants to overwrite a dataset we need to prompt them
- if (newOrOverwrite === DatasetRadioState.OVERWRITE_DATASET) {
- setShouldOverwriteDataset(true);
- return;
- }
-
const selectedColumns = datasource?.columns ?? [];
// The filters param is only used to test jinja templates.
@@ -346,7 +345,7 @@ export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({
onHide={onHide}
footer={
<>
- {!shouldOverwriteDataset && (
+ {newOrOverwrite === DatasetRadioState.SAVE_NEW && (
<Button
disabled={disableSaveAndExploreBtn}
buttonStyle="primary"
@@ -355,7 +354,7 @@ export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({
{buttonTextOnSave}
</Button>
)}
- {shouldOverwriteDataset && (
+ {newOrOverwrite === DatasetRadioState.OVERWRITE_DATASET && (
<>
<Button onClick={handleOverwriteCancel}>Back</Button>
<Button
diff --git a/superset/models/helpers.py b/superset/models/helpers.py
index 2b7c30e0ef..6cd6d17c7b 100644
--- a/superset/models/helpers.py
+++ b/superset/models/helpers.py
@@ -85,6 +85,7 @@ from superset.superset_typing import (
QueryObjectDict,
)
from superset.utils import core as utils
+from superset.utils.core import get_user_id
if TYPE_CHECKING:
from superset.connectors.sqla.models import SqlMetric, TableColumn
@@ -1297,10 +1298,6 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
for col in self.columns # col.column_name: col for col in self.columns
}
- metrics_by_name: Dict[str, "SqlMetric"] = {
- m.metric_name: m for m in self.metrics
- }
-
if not granularity and is_timeseries:
raise QueryObjectValidationError(
_(
@@ -1322,8 +1319,6 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
template_processor=template_processor,
)
)
- elif isinstance(metric, str) and metric in metrics_by_name:
- metrics_exprs.append(metrics_by_name[metric].get_sqla_col())
else:
raise QueryObjectValidationError(
_("Metric '%(metric)s' does not exist", metric=metric)
@@ -1366,9 +1361,6 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
elif col in metrics_exprs_by_label:
col = metrics_exprs_by_label[col]
need_groupby = True
- elif col in metrics_by_name:
- col = metrics_by_name[col].get_sqla_col()
- need_groupby = True
if isinstance(col, ColumnElement):
orderby_exprs.append(col)
@@ -1402,7 +1394,7 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
# if groupby field equals a selected column
elif selected in columns_by_name:
if isinstance(columns_by_name[selected], dict):
- outer = literal_column(f"{selected}")
+ outer = sa.column(f"{selected}")
outer = self.make_sqla_column_compatible(outer, selected)
else:
outer = columns_by_name[selected].get_sqla_col()
@@ -1412,7 +1404,7 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
self.database_id,
self.schema,
)
- outer = literal_column(f"({selected})")
+ outer = sa.column(f"{selected}")
outer = self.make_sqla_column_compatible(outer, selected)
else:
outer = self.adhoc_column_to_sqla(
@@ -1430,7 +1422,7 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
self.schema,
)
if isinstance(columns_by_name[selected], dict):
- select_exprs.append(literal_column(f"({selected})"))
+ select_exprs.append(sa.column(f"{selected}"))
else:
select_exprs.append(
columns_by_name[selected].get_sqla_col()
@@ -1720,10 +1712,6 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
subq = subq.group_by(*inner_groupby_exprs)
ob = inner_main_metric_expr
- if series_limit_metric:
- ob = self._get_series_orderby(
- series_limit_metric, metrics_by_name, columns_by_name
- )
direction = sa.desc if order_desc else sa.asc
subq = subq.order_by(direction(ob))
subq = subq.limit(series_limit)
@@ -1737,18 +1725,6 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
on_clause.append(gby_obj == sa.column(col_name))
tbl = tbl.join(subq.alias(), and_(*on_clause))
- else:
- if series_limit_metric:
- orderby = [
- (
- self._get_series_orderby(
- series_limit_metric,
- metrics_by_name,
- columns_by_name,
- ),
- not order_desc,
- )
- ]
# run prequery to get top groups
prequery_obj = {