mirror of
https://github.com/apache/superset.git
synced 2026-05-07 08:54:23 +00:00
* Added in code changes that now properly increment the Untitled Query SQL Lab tab names. All that is left is to add tests to make sure that the function works correctly
* Updated the code so that it adds to the untitled_query_numbers variable only if the character after the string 'Untitled Query ' is a number. This prevents any issues when trying to get the maximum value in the list.
* Refactored part of the mapping code, to make it shorter and easier to read/understand
* Fixed issues in the code that were causing some of the CI tests to fail
* Made code changes based on comments within the PR. Also added a unit test to make sure that the newQueryEditor function in the TabbedSqlEditors component works as intended
* Fixed the failing cypress test in tabs.test.js
(cherry picked from commit 5a5ff99c37)
575 lines
12 KiB
TypeScript
575 lines
12 KiB
TypeScript
/**
|
|
* 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 sinon from 'sinon';
|
|
import * as actions from 'src/SqlLab/actions/sqlLab';
|
|
import { ColumnKeyTypeType } from 'src/SqlLab/components/ColumnElement';
|
|
|
|
export const mockedActions = sinon.stub({ ...actions });
|
|
|
|
export const alert = { bsStyle: 'danger', msg: 'Ooops', id: 'lksvmcx32' };
|
|
export const table = {
|
|
dbId: 1,
|
|
selectStar: 'SELECT * FROM ab_user',
|
|
queryEditorId: 'rJ-KP47a',
|
|
schema: 'superset',
|
|
name: 'ab_user',
|
|
id: 'r11Vgt60',
|
|
dataPreviewQueryId: null,
|
|
partitions: {
|
|
cols: ['username'],
|
|
latest: 'bob',
|
|
partitionQuery: 'SHOW PARTITIONS FROM ab_user',
|
|
},
|
|
indexes: [
|
|
{
|
|
unique: true,
|
|
column_names: ['username'],
|
|
type: 'UNIQUE',
|
|
name: 'username',
|
|
},
|
|
{
|
|
unique: true,
|
|
column_names: ['email'],
|
|
type: 'UNIQUE',
|
|
name: 'email',
|
|
},
|
|
{
|
|
unique: false,
|
|
column_names: ['created_by_fk'],
|
|
name: 'created_by_fk',
|
|
},
|
|
{
|
|
unique: false,
|
|
column_names: ['changed_by_fk'],
|
|
name: 'changed_by_fk',
|
|
},
|
|
],
|
|
columns: [
|
|
{
|
|
indexed: false,
|
|
longType: 'INTEGER(11)',
|
|
type: 'INTEGER',
|
|
name: 'id',
|
|
keys: [
|
|
{
|
|
column_names: ['id'],
|
|
type: 'pk' as ColumnKeyTypeType,
|
|
name: null,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
indexed: false,
|
|
longType: 'VARCHAR(64)',
|
|
type: 'VARCHAR',
|
|
name: 'first_name',
|
|
keys: [
|
|
{
|
|
column_names: ['first_name'],
|
|
name: 'slices_ibfk_1',
|
|
referred_columns: ['id'],
|
|
referred_table: 'datasources',
|
|
type: 'fk' as ColumnKeyTypeType,
|
|
referred_schema: 'carapal',
|
|
options: {},
|
|
},
|
|
{
|
|
unique: false,
|
|
column_names: ['druid_datasource_id'],
|
|
type: 'index' as ColumnKeyTypeType,
|
|
name: 'druid_datasource_id',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
indexed: false,
|
|
longType: 'VARCHAR(64)',
|
|
type: 'VARCHAR',
|
|
name: 'last_name',
|
|
},
|
|
{
|
|
indexed: true,
|
|
longType: 'VARCHAR(64)',
|
|
type: 'VARCHAR',
|
|
name: 'username',
|
|
},
|
|
{
|
|
indexed: false,
|
|
longType: 'VARCHAR(256)',
|
|
type: 'VARCHAR',
|
|
name: 'password',
|
|
},
|
|
{
|
|
indexed: false,
|
|
longType: 'TINYINT(1)',
|
|
type: 'TINYINT',
|
|
name: 'active',
|
|
},
|
|
{
|
|
indexed: true,
|
|
longType: 'VARCHAR(64)',
|
|
type: 'VARCHAR',
|
|
name: 'email',
|
|
},
|
|
{
|
|
indexed: false,
|
|
longType: 'DATETIME',
|
|
type: 'DATETIME',
|
|
name: 'last_login',
|
|
},
|
|
{
|
|
indexed: false,
|
|
longType: 'INTEGER(11)',
|
|
type: 'INTEGER',
|
|
name: 'login_count',
|
|
},
|
|
{
|
|
indexed: false,
|
|
longType: 'INTEGER(11)',
|
|
type: 'INTEGER',
|
|
name: 'fail_login_count',
|
|
},
|
|
{
|
|
indexed: false,
|
|
longType: 'DATETIME',
|
|
type: 'DATETIME',
|
|
name: 'created_on',
|
|
},
|
|
{
|
|
indexed: false,
|
|
longType: 'DATETIME',
|
|
type: 'DATETIME',
|
|
name: 'changed_on',
|
|
},
|
|
{
|
|
indexed: true,
|
|
longType: 'INTEGER(11)',
|
|
type: 'INTEGER',
|
|
name: 'created_by_fk',
|
|
},
|
|
{
|
|
indexed: true,
|
|
longType: 'INTEGER(11)',
|
|
type: 'INTEGER',
|
|
name: 'changed_by_fk',
|
|
},
|
|
],
|
|
expanded: true,
|
|
};
|
|
|
|
export const defaultQueryEditor = {
|
|
id: 'dfsadfs',
|
|
autorun: false,
|
|
dbId: null,
|
|
latestQueryId: null,
|
|
selectedText: null,
|
|
sql: 'SELECT *\nFROM\nWHERE',
|
|
title: 'Untitled Query 1',
|
|
schemaOptions: [
|
|
{
|
|
value: 'main',
|
|
label: 'main',
|
|
title: 'main',
|
|
},
|
|
],
|
|
};
|
|
export const queries = [
|
|
{
|
|
dbId: 1,
|
|
sql: 'SELECT * FROM superset.slices',
|
|
sqlEditorId: 'SJ8YO72R',
|
|
tab: 'Demo',
|
|
runAsync: false,
|
|
ctas: false,
|
|
cached: false,
|
|
id: 'BkA1CLrJg',
|
|
progress: 100,
|
|
startDttm: 1476910566092.96,
|
|
state: 'success',
|
|
changedOn: 1476910566000,
|
|
tempTable: null,
|
|
userId: 1,
|
|
executedSql: null,
|
|
changed_on: '2016-10-19T20:56:06',
|
|
rows: 42,
|
|
queryLimit: 100,
|
|
endDttm: 1476910566798,
|
|
limit_reached: false,
|
|
schema: 'test_schema',
|
|
errorMessage: null,
|
|
db: 'main',
|
|
user: 'admin',
|
|
limit: 1000,
|
|
serverId: 141,
|
|
resultsKey: null,
|
|
results: {
|
|
columns: [
|
|
{
|
|
is_date: true,
|
|
name: 'ds',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: false,
|
|
name: 'gender',
|
|
type: 'STRING',
|
|
},
|
|
],
|
|
selected_columns: [
|
|
{
|
|
is_date: true,
|
|
name: 'ds',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: false,
|
|
name: 'gender',
|
|
type: 'STRING',
|
|
},
|
|
],
|
|
data: [
|
|
{ col1: 0, col2: 1 },
|
|
{ col1: 2, col2: 3 },
|
|
],
|
|
},
|
|
},
|
|
{
|
|
dbId: 1,
|
|
sql: 'SELECT *FROM superset.slices',
|
|
sqlEditorId: 'SJ8YO72R',
|
|
tab: 'Demo',
|
|
runAsync: true,
|
|
ctas: false,
|
|
cached: false,
|
|
id: 'S1zeAISkx',
|
|
progress: 100,
|
|
startDttm: 1476910570802.2,
|
|
state: 'success',
|
|
changedOn: 1476910572000,
|
|
tempTable: null,
|
|
userId: 1,
|
|
executedSql:
|
|
'SELECT * \nFROM (SELECT created_on, changed_on, id, slice_name, ' +
|
|
'druid_datasource_id, table_id, datasource_type, datasource_name, ' +
|
|
'viz_type, params, created_by_fk, changed_by_fk, description, ' +
|
|
'cache_timeout, perm\nFROM superset.slices) AS inner_qry \n LIMIT 1000',
|
|
changed_on: '2016-10-19T20:56:12',
|
|
rows: 42,
|
|
endDttm: 1476910579693,
|
|
limit_reached: false,
|
|
schema: null,
|
|
errorMessage: null,
|
|
db: 'main',
|
|
user: 'admin',
|
|
limit: 1000,
|
|
serverId: 142,
|
|
resultsKey: '417149f4-cd27-4f80-91f3-c45c871003f7',
|
|
results: null,
|
|
},
|
|
];
|
|
export const queryWithNoQueryLimit = {
|
|
dbId: 1,
|
|
sql: 'SELECT * FROM superset.slices',
|
|
sqlEditorId: 'SJ8YO72R',
|
|
tab: 'Demo',
|
|
runAsync: false,
|
|
ctas: false,
|
|
cached: false,
|
|
id: 'BkA1CLrJg',
|
|
progress: 100,
|
|
startDttm: 1476910566092.96,
|
|
state: 'success',
|
|
changedOn: 1476910566000,
|
|
tempTable: null,
|
|
userId: 1,
|
|
executedSql: null,
|
|
changed_on: '2016-10-19T20:56:06',
|
|
rows: 42,
|
|
endDttm: 1476910566798,
|
|
limit_reached: false,
|
|
schema: 'test_schema',
|
|
errorMessage: null,
|
|
db: 'main',
|
|
user: 'admin',
|
|
limit: 1000,
|
|
serverId: 141,
|
|
resultsKey: null,
|
|
results: {
|
|
columns: [
|
|
{
|
|
is_date: true,
|
|
name: 'ds',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: false,
|
|
name: 'gender',
|
|
type: 'STRING',
|
|
},
|
|
],
|
|
selected_columns: [
|
|
{
|
|
is_date: true,
|
|
name: 'ds',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: false,
|
|
name: 'gender',
|
|
type: 'STRING',
|
|
},
|
|
],
|
|
data: [
|
|
{ col1: 0, col2: 1 },
|
|
{ col1: 2, col2: 3 },
|
|
],
|
|
query: {
|
|
limit: 100,
|
|
},
|
|
},
|
|
};
|
|
export const queryWithBadColumns = {
|
|
...queries[0],
|
|
results: {
|
|
data: queries[0].results?.data,
|
|
selected_columns: [
|
|
{
|
|
is_date: true,
|
|
name: 'COUNT(*)',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: false,
|
|
name: 'this_col_is_ok',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: false,
|
|
name: 'a',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: false,
|
|
name: '1',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: false,
|
|
name: '123',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: false,
|
|
name: 'CASE WHEN 1=1 THEN 1 ELSE 0 END',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: true,
|
|
name: '_TIMESTAMP',
|
|
type: 'TIMESTAMP',
|
|
},
|
|
{
|
|
is_date: true,
|
|
name: '__TIME',
|
|
type: 'TIMESTAMP',
|
|
},
|
|
{
|
|
is_date: false,
|
|
name: 'my_dupe_col__2',
|
|
type: 'STRING',
|
|
},
|
|
{
|
|
is_date: true,
|
|
name: '__timestamp',
|
|
type: 'TIMESTAMP',
|
|
},
|
|
{
|
|
is_date: true,
|
|
name: '__TIMESTAMP',
|
|
type: 'TIMESTAMP',
|
|
},
|
|
],
|
|
},
|
|
};
|
|
export const databases = {
|
|
result: [
|
|
{
|
|
allow_ctas: true,
|
|
allow_dml: true,
|
|
allow_run_async: false,
|
|
database_name: 'main',
|
|
expose_in_sqllab: true,
|
|
force_ctas_schema: '',
|
|
id: 1,
|
|
},
|
|
{
|
|
allow_ctas: true,
|
|
allow_dml: false,
|
|
allow_run_async: true,
|
|
database_name: 'Presto - Gold',
|
|
expose_in_sqllab: true,
|
|
force_ctas_schema: 'tmp',
|
|
id: 208,
|
|
},
|
|
],
|
|
};
|
|
export const tables = {
|
|
options: [
|
|
{
|
|
value: 'birth_names',
|
|
schema: 'main',
|
|
label: 'birth_names',
|
|
title: 'birth_names',
|
|
},
|
|
{
|
|
value: 'energy_usage',
|
|
schema: 'main',
|
|
label: 'energy_usage',
|
|
title: 'energy_usage',
|
|
},
|
|
{
|
|
value: 'wb_health_population',
|
|
schema: 'main',
|
|
label: 'wb_health_population',
|
|
title: 'wb_health_population',
|
|
},
|
|
],
|
|
};
|
|
|
|
export const stoppedQuery = {
|
|
dbId: 1,
|
|
cached: false,
|
|
ctas: false,
|
|
id: 'ryhMUZCGb',
|
|
progress: 0,
|
|
results: [],
|
|
runAsync: false,
|
|
schema: 'main',
|
|
sql: 'SELECT ...',
|
|
sqlEditorId: 'rJaf5u9WZ',
|
|
startDttm: 1497400851936,
|
|
state: 'stopped',
|
|
tab: 'Untitled Query 2',
|
|
tempTable: '',
|
|
};
|
|
|
|
export const failedQueryWithErrorMessage = {
|
|
dbId: 1,
|
|
cached: false,
|
|
ctas: false,
|
|
errorMessage: 'Something went wrong',
|
|
id: 'ryhMUZCGb',
|
|
progress: 0,
|
|
results: [],
|
|
runAsync: false,
|
|
schema: 'main',
|
|
sql: 'SELECT ...',
|
|
sqlEditorId: 'rJaf5u9WZ',
|
|
startDttm: 1497400851936,
|
|
state: 'failed',
|
|
tab: 'Untitled Query 2',
|
|
tempTable: '',
|
|
};
|
|
|
|
export const failedQueryWithErrors = {
|
|
dbId: 1,
|
|
cached: false,
|
|
ctas: false,
|
|
errors: [
|
|
{
|
|
message: 'Something went wrong',
|
|
error_type: 'TEST_ERROR',
|
|
level: 'error',
|
|
extra: null,
|
|
},
|
|
],
|
|
id: 'ryhMUZCGb',
|
|
progress: 0,
|
|
results: [],
|
|
runAsync: false,
|
|
schema: 'main',
|
|
sql: 'SELECT ...',
|
|
sqlEditorId: 'rJaf5u9WZ',
|
|
startDttm: 1497400851936,
|
|
state: 'failed',
|
|
tab: 'Untitled Query 2',
|
|
tempTable: '',
|
|
};
|
|
|
|
export const runningQuery = {
|
|
dbId: 1,
|
|
cached: false,
|
|
ctas: false,
|
|
id: 'ryhMUZCGb',
|
|
progress: 90,
|
|
state: 'running',
|
|
startDttm: Date.now() - 500,
|
|
};
|
|
export const cachedQuery = { ...queries[0], cached: true };
|
|
|
|
export const user = {
|
|
createdOn: '2021-04-27T18:12:38.952304',
|
|
email: 'admin',
|
|
firstName: 'admin',
|
|
isActive: true,
|
|
lastName: 'admin',
|
|
permissions: {},
|
|
roles: { Admin: Array(173) },
|
|
userId: 1,
|
|
username: 'admin',
|
|
};
|
|
|
|
export const initialState = {
|
|
sqlLab: {
|
|
offline: false,
|
|
alerts: [],
|
|
queries: {},
|
|
databases: {},
|
|
queryEditors: [defaultQueryEditor],
|
|
tabHistory: [defaultQueryEditor.id],
|
|
tables: [],
|
|
workspaceQueries: [],
|
|
queriesLastUpdate: 0,
|
|
activeSouthPaneTab: 'Results',
|
|
user: { user },
|
|
},
|
|
messageToasts: [],
|
|
common: {
|
|
conf: {
|
|
DEFAULT_SQLLAB_LIMIT: 1000,
|
|
SQL_MAX_ROW: 100000,
|
|
DISPLAY_MAX_ROW: 100,
|
|
SQLALCHEMY_DOCS_URL: 'test_SQLALCHEMY_DOCS_URL',
|
|
SQLALCHEMY_DISPLAY_TEXT: 'test_SQLALCHEMY_DISPLAY_TEXT',
|
|
},
|
|
},
|
|
};
|
|
|
|
export const query = {
|
|
id: 'clientId2353',
|
|
dbId: 1,
|
|
sql: 'SELECT * FROM something',
|
|
sqlEditorId: defaultQueryEditor.id,
|
|
tab: 'unimportant',
|
|
tempTable: null,
|
|
runAsync: false,
|
|
ctas: false,
|
|
cached: false,
|
|
};
|