mirror of
https://github.com/apache/superset.git
synced 2026-04-26 19:44:58 +00:00
* [sql lab] disable cross schema search This is killing our metastore as people type it emits large all-table-dump as they hit the keystroke. It never returns as it times out and hammers the poor metastore. Also some improvements around the disabling the table select on the left panel and having the table name not be sticky. * typo
173 lines
5.7 KiB
JavaScript
173 lines
5.7 KiB
JavaScript
import React from 'react';
|
|
import configureStore from 'redux-mock-store';
|
|
import thunk from 'redux-thunk';
|
|
import URI from 'urijs';
|
|
|
|
import { Tab } from 'react-bootstrap';
|
|
import { shallow, mount } from 'enzyme';
|
|
import { describe, it } from 'mocha';
|
|
import { expect } from 'chai';
|
|
import sinon from 'sinon';
|
|
|
|
import { table, initialState } from './fixtures';
|
|
import TabbedSqlEditors from '../../../javascripts/SqlLab/components/TabbedSqlEditors';
|
|
import SqlEditor from '../../../javascripts/SqlLab/components/SqlEditor';
|
|
|
|
describe('TabbedSqlEditors', () => {
|
|
const middlewares = [thunk];
|
|
const mockStore = configureStore(middlewares);
|
|
const store = mockStore(initialState);
|
|
|
|
const tabHistory = [
|
|
'dfsadfs',
|
|
'newEditorId',
|
|
];
|
|
const tables = [Object.assign({}, table[0], {
|
|
dataPreviewQueryId: 'B1-VQU1zW',
|
|
queryEditorId: 'newEditorId',
|
|
})];
|
|
const queryEditors = [{
|
|
autorun: false,
|
|
dbId: 1,
|
|
id: 'newEditorId',
|
|
latestQueryId: 'B1-VQU1zW',
|
|
schema: null,
|
|
selectedText: null,
|
|
sql: 'SELECT ds...',
|
|
title: 'Untitled Query',
|
|
}];
|
|
const queries = {
|
|
'B1-VQU1zW': {
|
|
id: 'B1-VQU1zW',
|
|
sqlEditorId: 'newEditorId',
|
|
},
|
|
};
|
|
const mockedProps = {
|
|
actions: {},
|
|
databases: {},
|
|
tables: [],
|
|
queries: {},
|
|
queryEditors: initialState.queryEditors,
|
|
tabHistory: initialState.tabHistory,
|
|
editorHeight: '',
|
|
getHeight: () => ('100px'),
|
|
database: {},
|
|
};
|
|
const getWrapper = () => (
|
|
shallow(<TabbedSqlEditors {...mockedProps} />, {
|
|
context: { store },
|
|
}).dive());
|
|
|
|
let wrapper;
|
|
it('is valid', () => {
|
|
expect(
|
|
React.isValidElement(<TabbedSqlEditors {...mockedProps} />),
|
|
).to.equal(true);
|
|
});
|
|
describe('componentDidMount', () => {
|
|
let uriStub;
|
|
beforeEach(() => {
|
|
sinon.stub(window.history, 'replaceState');
|
|
sinon.spy(TabbedSqlEditors.prototype, 'componentDidMount');
|
|
uriStub = sinon.stub(URI.prototype, 'search');
|
|
});
|
|
afterEach(() => {
|
|
window.history.replaceState.restore();
|
|
TabbedSqlEditors.prototype.componentDidMount.restore();
|
|
uriStub.restore();
|
|
});
|
|
it('should handle id', () => {
|
|
uriStub.returns({ id: 1 });
|
|
wrapper = mount(<TabbedSqlEditors {...mockedProps} />, {
|
|
context: { store },
|
|
});
|
|
expect(TabbedSqlEditors.prototype.componentDidMount.calledOnce).to.equal(true);
|
|
expect(window.history.replaceState.getCall(0).args[2])
|
|
.to.equal('/superset/sqllab');
|
|
});
|
|
it('should handle savedQueryId', () => {
|
|
uriStub.returns({ savedQueryId: 1 });
|
|
wrapper = mount(<TabbedSqlEditors {...mockedProps} />, {
|
|
context: { store },
|
|
});
|
|
expect(TabbedSqlEditors.prototype.componentDidMount.calledOnce).to.equal(true);
|
|
expect(window.history.replaceState.getCall(0).args[2])
|
|
.to.equal('/superset/sqllab');
|
|
});
|
|
it('should handle sql', () => {
|
|
uriStub.returns({ sql: 1, dbid: 1 });
|
|
wrapper = mount(<TabbedSqlEditors {...mockedProps} />, {
|
|
context: { store },
|
|
});
|
|
expect(TabbedSqlEditors.prototype.componentDidMount.calledOnce).to.equal(true);
|
|
expect(window.history.replaceState.getCall(0).args[2])
|
|
.to.equal('/superset/sqllab');
|
|
});
|
|
});
|
|
describe('componentWillReceiveProps', () => {
|
|
let spy;
|
|
beforeEach(() => {
|
|
wrapper = getWrapper();
|
|
spy = sinon.spy(TabbedSqlEditors.prototype, 'componentWillReceiveProps');
|
|
wrapper.setProps({ queryEditors, queries, tabHistory, tables });
|
|
});
|
|
afterEach(() => {
|
|
spy.restore();
|
|
});
|
|
it('should update queriesArray and dataPreviewQueries', () => {
|
|
expect(wrapper.state().queriesArray.slice(-1)[0]).to.equal(queries['B1-VQU1zW']);
|
|
expect(wrapper.state().dataPreviewQueries.slice(-1)[0]).to.equal(queries['B1-VQU1zW']);
|
|
});
|
|
});
|
|
it('should rename Tab', () => {
|
|
global.prompt = () => ('new title');
|
|
wrapper = getWrapper();
|
|
sinon.stub(wrapper.instance().props.actions, 'queryEditorSetTitle');
|
|
|
|
wrapper.instance().renameTab(queryEditors[0]);
|
|
expect(wrapper.instance().props.actions.queryEditorSetTitle.getCall(0).args[1]).to.equal('new title');
|
|
|
|
delete global.prompt;
|
|
});
|
|
it('should removeQueryEditor', () => {
|
|
wrapper = getWrapper();
|
|
sinon.stub(wrapper.instance().props.actions, 'removeQueryEditor');
|
|
|
|
wrapper.instance().removeQueryEditor(queryEditors[0]);
|
|
expect(wrapper.instance().props.actions.removeQueryEditor.getCall(0).args[0])
|
|
.to.equal(queryEditors[0]);
|
|
});
|
|
it('should add new query editor', () => {
|
|
wrapper = getWrapper();
|
|
sinon.stub(wrapper.instance().props.actions, 'addQueryEditor');
|
|
|
|
wrapper.instance().newQueryEditor();
|
|
expect(wrapper.instance().props.actions.addQueryEditor.getCall(0).args[0].title)
|
|
.to.contain('Untitled Query');
|
|
});
|
|
it('should handle select', () => {
|
|
wrapper = getWrapper();
|
|
sinon.spy(wrapper.instance(), 'newQueryEditor');
|
|
sinon.stub(wrapper.instance().props.actions, 'setActiveQueryEditor');
|
|
|
|
wrapper.instance().handleSelect('add_tab');
|
|
expect(wrapper.instance().newQueryEditor.callCount).to.equal(1);
|
|
|
|
wrapper.instance().handleSelect('123');
|
|
expect(wrapper.instance().props.actions.setActiveQueryEditor.getCall(0).args[0].id)
|
|
.to.contain(123);
|
|
wrapper.instance().newQueryEditor.restore();
|
|
});
|
|
it('should render', () => {
|
|
wrapper = getWrapper();
|
|
wrapper.setState({ hideLeftBar: true });
|
|
|
|
const firstTab = wrapper.find(Tab).first();
|
|
expect(firstTab.props().eventKey).to.contain(initialState.queryEditors[0].id);
|
|
expect(firstTab.find(SqlEditor)).to.have.length(1);
|
|
|
|
const lastTab = wrapper.find(Tab).last();
|
|
expect(lastTab.props().eventKey).to.contain('add_tab');
|
|
});
|
|
});
|