Files
superset2/superset/assets/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx
Maxime Beauchemin d522292b01 [sql lab] option to disable cross schema search (#4551)
* [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
2018-03-09 14:54:39 -08:00

184 lines
5.8 KiB
JavaScript

import React from 'react';
import { shallow } from 'enzyme';
import { describe, it } from 'mocha';
import sinon from 'sinon';
import { expect } from 'chai';
import $ from 'jquery';
import { table, defaultQueryEditor, databases, tables } from './fixtures';
import SqlEditorLeftBar from '../../../javascripts/SqlLab/components/SqlEditorLeftBar';
import TableElement from '../../../javascripts/SqlLab/components/TableElement';
global.notify = {
error: () => {},
};
describe('SqlEditorLeftBar', () => {
const mockedProps = {
actions: {
queryEditorSetSchema: sinon.stub(),
queryEditorSetDb: sinon.stub(),
setDatabases: sinon.stub(),
addTable: sinon.stub(),
},
tables: [table],
queryEditor: defaultQueryEditor,
database: {},
height: 0,
};
let wrapper;
let ajaxStub;
beforeEach(() => {
ajaxStub = sinon.stub($, 'get');
wrapper = shallow(<SqlEditorLeftBar {...mockedProps} />);
});
afterEach(() => {
ajaxStub.restore();
});
it('is valid', () => {
expect(
React.isValidElement(<SqlEditorLeftBar {...mockedProps} />),
).to.equal(true);
});
it('renders a TableElement', () => {
expect(wrapper.find(TableElement)).to.have.length(1);
});
describe('onDatabaseChange', () => {
it('should fetch tables', () => {
sinon.stub(wrapper.instance(), 'fetchTables');
sinon.stub(wrapper.instance(), 'fetchSchemas');
wrapper.instance().onDatabaseChange({ value: 1, label: 'main' });
expect(wrapper.instance().fetchTables.getCall(0).args[0]).to.equal(1);
expect(wrapper.instance().fetchSchemas.getCall(0).args[0]).to.equal(1);
wrapper.instance().fetchTables.restore();
wrapper.instance().fetchSchemas.restore();
});
it('should clear tableOptions', () => {
wrapper.instance().onDatabaseChange();
expect(wrapper.state().tableOptions).to.deep.equal([]);
});
});
describe('getTableNamesBySubStr', () => {
it('should handle empty', () => (
wrapper.instance().getTableNamesBySubStr('')
.then((data) => {
expect(data).to.deep.equal({ options: [] });
})
));
it('should handle table name', () => {
const queryEditor = Object.assign({}, defaultQueryEditor,
{
dbId: 1,
schema: 'main',
});
const mockTableOptions = { options: [table] };
wrapper.setProps({ queryEditor });
ajaxStub.callsFake(() => {
const d = $.Deferred();
d.resolve(mockTableOptions);
return d.promise();
});
return wrapper.instance().getTableNamesBySubStr('my table')
.then((data) => {
expect(ajaxStub.getCall(0).args[0]).to.equal('/superset/tables/1/main/my table');
expect(data).to.deep.equal(mockTableOptions);
});
});
});
it('dbMutator should build databases options', () => {
const options = wrapper.instance().dbMutator(databases);
expect(options).to.deep.equal([
{ value: 1, label: 'main' },
{ value: 208, label: 'Presto - Gold' },
]);
});
describe('fetchTables', () => {
it('should clear table options', () => {
wrapper.instance().fetchTables(1);
expect(wrapper.state().tableOptions).to.deep.equal([]);
expect(wrapper.state().filterOptions).to.be.a('null');
});
it('should fetch table options', () => {
ajaxStub.callsFake(() => {
const d = $.Deferred();
d.resolve(tables);
return d.promise();
});
wrapper.instance().fetchTables(1, 'main', 'birth_names');
expect(ajaxStub.getCall(0).args[0]).to.equal('/superset/tables/1/main/birth_names/');
expect(wrapper.state().tableLength).to.equal(3);
});
it('should handle error', () => {
ajaxStub.callsFake(() => {
const d = $.Deferred();
d.reject('error message');
return d.promise();
});
wrapper.instance().fetchTables(1, 'main', 'birth_names');
expect(wrapper.state().tableOptions).to.deep.equal([]);
expect(wrapper.state().tableLength).to.equal(0);
});
});
describe('fetchSchemas', () => {
it('should fetch schema options', () => {
const schemaOptions = {
schemas: ['main', 'erf', 'superset'],
};
ajaxStub.callsFake(() => {
const d = $.Deferred();
d.resolve(schemaOptions);
return d.promise();
});
wrapper.instance().fetchSchemas(1);
expect(ajaxStub.getCall(0).args[0]).to.equal('/superset/schemas/1/');
expect(wrapper.state().schemaOptions).to.have.length(3);
});
it('should handle error', () => {
ajaxStub.callsFake(() => {
const d = $.Deferred();
d.reject('error message');
return d.promise();
});
wrapper.instance().fetchSchemas(123);
expect(wrapper.state().schemaOptions).to.deep.equal([]);
});
});
describe('changeTable', () => {
beforeEach(() => {
sinon.stub(wrapper.instance(), 'fetchTables');
});
afterEach(() => {
wrapper.instance().fetchTables.restore();
});
it('test 1', () => {
wrapper.instance().changeTable({
value: 'birth_names',
label: 'birth_names',
});
expect(wrapper.state().tableName).to.equal('birth_names');
});
it('test 2', () => {
wrapper.instance().changeTable({
value: 'main.my_table',
label: 'my_table',
});
expect(wrapper.instance().fetchTables.getCall(0).args[1]).to.equal('main');
});
});
it('changeSchema', () => {
sinon.stub(wrapper.instance(), 'fetchTables');
wrapper.instance().changeSchema({ label: 'main', value: 'main' });
expect(wrapper.instance().fetchTables.getCall(0).args[1]).to.equal('main');
wrapper.instance().changeSchema();
expect(wrapper.instance().fetchTables.getCall(1).args[1]).to.be.a('null');
wrapper.instance().fetchTables.restore();
});
});