mirror of
https://github.com/apache/superset.git
synced 2026-04-19 08:04:53 +00:00
Add separate limit setting for SqlLab (#4941)
* Add separate limit setting for SqlLab Use separate param for wrap sql Get query limit from config unit tests for limit control rendering in sql editor py unit test pg tests Add max rows limit Remove concept of infinity, always require defined limits consistency Assert on validation errors instead of tooltip fix unit tests attempt persist state pr comments and linting * load configs in via common param * default to 1k
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
import React from 'react';
|
||||
import { shallow } from 'enzyme';
|
||||
|
||||
import { Label } from 'react-bootstrap';
|
||||
import LimitControl from '../../../src/SqlLab/components/LimitControl';
|
||||
import ControlHeader from '../../../src/explore/components/ControlHeader';
|
||||
|
||||
describe('LimitControl', () => {
|
||||
const defaultProps = {
|
||||
value: 0,
|
||||
defaultQueryLimit: 1000,
|
||||
maxRow: 100000,
|
||||
onChange: () => {},
|
||||
};
|
||||
let wrapper;
|
||||
const factory = o => <LimitControl {...o} />;
|
||||
beforeEach(() => {
|
||||
wrapper = shallow(factory(defaultProps));
|
||||
});
|
||||
it('is a valid element', () => {
|
||||
expect(React.isValidElement(<LimitControl {...defaultProps} />)).toEqual(true);
|
||||
});
|
||||
it('renders a Label', () => {
|
||||
expect(wrapper.find(Label)).toHaveLength(1);
|
||||
});
|
||||
it('loads the correct state', () => {
|
||||
const value = 100;
|
||||
wrapper = shallow(factory({ ...defaultProps, value }));
|
||||
expect(wrapper.state().textValue).toEqual(value.toString());
|
||||
wrapper.find(Label).first().simulate('click');
|
||||
expect(wrapper.state().showOverlay).toBe(true);
|
||||
expect(wrapper.find(ControlHeader).props().validationErrors).toHaveLength(0);
|
||||
});
|
||||
it('handles invalid value', () => {
|
||||
wrapper.find(Label).first().simulate('click');
|
||||
wrapper.setState({ textValue: 'invalid' });
|
||||
expect(wrapper.find(ControlHeader).props().validationErrors).toHaveLength(1);
|
||||
});
|
||||
it('handles negative value', () => {
|
||||
wrapper.find(Label).first().simulate('click');
|
||||
wrapper.setState({ textValue: '-1' });
|
||||
expect(wrapper.find(ControlHeader).props().validationErrors).toHaveLength(1);
|
||||
});
|
||||
it('handles value above max row', () => {
|
||||
wrapper.find(Label).first().simulate('click');
|
||||
wrapper.setState({ textValue: (defaultProps.maxRow + 1).toString() });
|
||||
expect(wrapper.find(ControlHeader).props().validationErrors).toHaveLength(1);
|
||||
});
|
||||
it('opens and closes', () => {
|
||||
wrapper.find(Label).first().simulate('click');
|
||||
expect(wrapper.state().showOverlay).toBe(true);
|
||||
wrapper.find('.ok').first().simulate('click');
|
||||
expect(wrapper.state().showOverlay).toBe(false);
|
||||
});
|
||||
it('resets and closes', () => {
|
||||
const value = 100;
|
||||
wrapper = shallow(factory({ ...defaultProps, value }));
|
||||
wrapper.find(Label).first().simulate('click');
|
||||
expect(wrapper.state().textValue).toEqual(value.toString());
|
||||
wrapper.find('.reset').simulate('click');
|
||||
expect(wrapper.state().textValue).toEqual(defaultProps.defaultQueryLimit.toString());
|
||||
});
|
||||
});
|
||||
@@ -1,7 +1,8 @@
|
||||
import React from 'react';
|
||||
import { shallow } from 'enzyme';
|
||||
|
||||
import { initialState, queries, table } from './fixtures';
|
||||
import { defaultQueryEditor, initialState, queries, table } from './fixtures';
|
||||
import LimitControl from '../../../src/SqlLab/components/LimitControl';
|
||||
import SqlEditor from '../../../src/SqlLab/components/SqlEditor';
|
||||
import SqlEditorLeftBar from '../../../src/SqlLab/components/SqlEditorLeftBar';
|
||||
|
||||
@@ -16,6 +17,8 @@ describe('SqlEditor', () => {
|
||||
getHeight: () => ('100px'),
|
||||
editorQueries: [],
|
||||
dataPreviewQueries: [],
|
||||
defaultQueryLimit: 1000,
|
||||
maxRow: 100000,
|
||||
};
|
||||
it('is valid', () => {
|
||||
expect(
|
||||
@@ -26,4 +29,18 @@ describe('SqlEditor', () => {
|
||||
const wrapper = shallow(<SqlEditor {...mockedProps} />);
|
||||
expect(wrapper.find(SqlEditorLeftBar)).toHaveLength(1);
|
||||
});
|
||||
it('render a LimitControl with default limit', () => {
|
||||
const defaultQueryLimit = 101;
|
||||
const updatedProps = { ...mockedProps, defaultQueryLimit };
|
||||
const wrapper = shallow(<SqlEditor {...updatedProps} />);
|
||||
expect(wrapper.find(LimitControl)).toHaveLength(1);
|
||||
expect(wrapper.find(LimitControl).props().value).toEqual(defaultQueryLimit);
|
||||
});
|
||||
it('render a LimitControl with existing limit', () => {
|
||||
const queryEditor = { ...defaultQueryEditor, queryLimit: 101 };
|
||||
const updatedProps = { ...mockedProps, queryEditor };
|
||||
const wrapper = shallow(<SqlEditor {...updatedProps} />);
|
||||
expect(wrapper.find(LimitControl)).toHaveLength(1);
|
||||
expect(wrapper.find(LimitControl).props().value).toEqual(queryEditor.queryLimit);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -52,6 +52,8 @@ describe('TabbedSqlEditors', () => {
|
||||
editorHeight: '',
|
||||
getHeight: () => ('100px'),
|
||||
database: {},
|
||||
defaultQueryLimit: 1000,
|
||||
maxRow: 100000,
|
||||
};
|
||||
const getWrapper = () => (
|
||||
shallow(<TabbedSqlEditors {...mockedProps} />, {
|
||||
|
||||
@@ -367,6 +367,12 @@ export const initialState = {
|
||||
activeSouthPaneTab: 'Results',
|
||||
},
|
||||
messageToasts: [],
|
||||
common: {
|
||||
conf: {
|
||||
DEFAULT_SQLLAB_LIMIT: 1000,
|
||||
SQL_MAX_ROW: 100000,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export const query = {
|
||||
|
||||
@@ -81,6 +81,11 @@ describe('sqlLabReducer', () => {
|
||||
newState = sqlLabReducer(newState, actions.queryEditorSetSql(qe, sql));
|
||||
expect(newState.queryEditors[1].sql).toBe(sql);
|
||||
});
|
||||
it('should not fail while setting queryLimit', () => {
|
||||
const queryLimit = 101;
|
||||
newState = sqlLabReducer(newState, actions.queryEditorSetQueryLimit(qe, queryLimit));
|
||||
expect(newState.queryEditors[1].queryLimit).toEqual(queryLimit);
|
||||
});
|
||||
it('should set selectedText', () => {
|
||||
const selectedText = 'TEST';
|
||||
expect(newState.queryEditors[0].selectedText).toBeNull();
|
||||
|
||||
Reference in New Issue
Block a user