nytai commented on a change in pull request #10914:
URL:
https://github.com/apache/incubator-superset/pull/10914#discussion_r494025642
##########
File path: superset-frontend/spec/javascripts/components/TableSelector_spec.jsx
##########
@@ -18,267 +18,275 @@
*/
import React from 'react';
import configureStore from 'redux-mock-store';
-import { shallow } from 'enzyme';
+import { mount } from 'enzyme';
+import { act } from 'react-dom/test-utils';
import sinon from 'sinon';
import fetchMock from 'fetch-mock';
import thunk from 'redux-thunk';
+import { supersetTheme, ThemeProvider } from '@superset-ui/core';
+import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint';
+
+import DatabaseSelector from 'src/components/DatabaseSelector';
import TableSelector from 'src/components/TableSelector';
import { initialState, tables } from '../sqllab/fixtures';
-describe('TableSelector', () => {
- let mockedProps;
- const middlewares = [thunk];
- const mockStore = configureStore(middlewares);
- const store = mockStore(initialState);
- let wrapper;
- let inst;
+const mockStore = configureStore([thunk]);
+const store = mockStore(initialState);
- beforeEach(() => {
- mockedProps = {
- dbId: 1,
- schema: 'main',
- onSchemaChange: sinon.stub(),
- onDbChange: sinon.stub(),
- getDbList: sinon.stub(),
- onTableChange: sinon.stub(),
- onChange: sinon.stub(),
- tableNameSticky: true,
- tableName: '',
- database: { id: 1, database_name: 'main' },
- horizontal: false,
- sqlLabMode: true,
- clearable: false,
- handleError: sinon.stub(),
- };
- wrapper = shallow(<TableSelector {...mockedProps} />, {
- context: { store },
- });
- inst = wrapper.instance();
- });
-
- it('is valid', () => {
- expect(React.isValidElement(<TableSelector {...mockedProps}
/>)).toBe(true);
- });
-
- describe('onDatabaseChange', () => {
- it('should fetch schemas', () => {
- sinon.stub(inst, 'fetchSchemas');
- inst.onDatabaseChange({ id: 1 });
- expect(inst.fetchSchemas.getCall(0).args[0]).toBe(1);
- inst.fetchSchemas.restore();
- });
- it('should clear tableOptions', () => {
- inst.onDatabaseChange();
- expect(wrapper.state().tableOptions).toEqual([]);
- });
- });
+const FETCH_SCHEMAS_ENDPOINT = 'glob:*/api/v1/database/*/schemas/*';
+const GET_TABLE_ENDPOINT = 'glob:*/superset/tables/1/*/*';
+const GET_TABLE_NAMES_ENDPOINT = 'glob:*/superset/tables/1/main/*';
- describe('getTableNamesBySubStr', () => {
- const GET_TABLE_NAMES_GLOB = 'glob:*/superset/tables/1/main/*';
+const mockedProps = {
+ clearable: false,
+ database: { id: 1, database_name: 'main' },
+ dbId: 1,
+ formMode: false,
+ getDbList: sinon.stub(),
+ handleError: sinon.stub(),
+ horizontal: false,
+ onChange: sinon.stub(),
+ onDbChange: sinon.stub(),
+ onSchemaChange: sinon.stub(),
+ onTableChange: sinon.stub(),
+ sqlLabMode: true,
+ tableName: '',
+ tableNameSticky: true,
+};
- afterEach(fetchMock.resetHistory);
- afterAll(fetchMock.reset);
+const schemaOptions = {
+ result: ['main', 'erf', 'superset'],
+};
+const selectedSchema = { label: 'main', title: 'main', value: 'main' };
+const selectedTable = {
+ label: 'birth_names',
+ schema: 'main',
+ title: 'birth_names',
+ value: 'birth_names',
+ type: undefined,
+};
- it('should handle empty', () =>
- inst.getTableNamesBySubStr('').then(data => {
- expect(data).toEqual({ options: [] });
- return Promise.resolve();
- }));
+async function mountAndWait(props = mockedProps) {
+ const mounted = mount(<TableSelector {...props} />, {
+ context: { store },
+ wrappingComponent: ThemeProvider,
+ wrappingComponentProps: { theme: supersetTheme },
+ });
+ await waitForComponentToPaint(mounted);
- it('should handle table name', () => {
- fetchMock.get(GET_TABLE_NAMES_GLOB, tables, { overwriteRoutes: true });
+ return mounted;
+}
- return wrapper
- .instance()
- .getTableNamesBySubStr('my table')
- .then(data => {
- expect(fetchMock.calls(GET_TABLE_NAMES_GLOB)).toHaveLength(1);
- expect(data).toEqual({
- 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',
- },
- ],
- });
- return Promise.resolve();
- });
- });
+describe('TableSelector', () => {
+ let wrapper;
- it('should escape schema and table names', () => {
- const GET_TABLE_GLOB = 'glob:*/superset/tables/1/*/*';
- wrapper.setProps({ schema: 'slashed/schema' });
- fetchMock.get(GET_TABLE_GLOB, tables, { overwriteRoutes: true });
+ beforeEach(async () => {
+ fetchMock.reset();
+ wrapper = await mountAndWait();
+ });
- return wrapper
- .instance()
- .getTableNamesBySubStr('slashed/table')
- .then(() => {
- expect(fetchMock.lastUrl(GET_TABLE_GLOB)).toContain(
- '/slashed%252Fschema/slashed%252Ftable',
- );
- return Promise.resolve();
- });
- });
+ it('renders', () => {
+ expect(wrapper.find(TableSelector)).toExist();
+ expect(wrapper.find(DatabaseSelector)).toExist();
});
- describe('fetchTables', () => {
- const FETCH_TABLES_GLOB = 'glob:*/superset/tables/1/main/*/*/';
+ describe('change database', () => {
afterEach(fetchMock.resetHistory);
afterAll(fetchMock.reset);
- it('should clear table options', () => {
- inst.fetchTables(true);
- expect(wrapper.state().tableOptions).toEqual([]);
+ it('should fetch schemas', async () => {
+ fetchMock.get(FETCH_SCHEMAS_ENDPOINT, { overwriteRoutes: true });
+ act(() => {
+
wrapper.find('[data-test="select-database"]').first().props().onChange({
+ id: 1,
+ database_name: 'main',
+ });
+ });
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(fetchMock.calls(FETCH_SCHEMAS_ENDPOINT)).toHaveLength(1);
});
- it('should fetch table options', () => {
- fetchMock.get(FETCH_TABLES_GLOB, tables, { overwriteRoutes: true });
- return inst.fetchTables(true, 'birth_names').then(() => {
- expect(wrapper.state().tableOptions).toHaveLength(3);
- expect(wrapper.state().tableOptions).toEqual([
- {
- 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',
- },
+ it('should fetch schema options', async () => {
+ fetchMock.get(FETCH_SCHEMAS_ENDPOINT, schemaOptions, {
+ overwriteRoutes: true,
+ });
+ act(() => {
+
wrapper.find('[data-test="select-database"]').first().props().onChange({
+ id: 1,
+ database_name: 'main',
+ });
+ });
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(fetchMock.calls(FETCH_SCHEMAS_ENDPOINT)).toHaveLength(1);
+
+ act(() => {
+ expect(
+ wrapper.find('[name="select-schema"]').first().props().options,
+ ).toEqual([
+ { value: 'main', label: 'main', title: 'main' },
+ { value: 'erf', label: 'erf', title: 'erf' },
+ { value: 'superset', label: 'superset', title: 'superset' },
]);
- return Promise.resolve();
});
});
- // Test needs to be fixed: Github issue #7768
- it.skip('should dispatch a danger toast on error', () => {
- fetchMock.get(
- FETCH_TABLES_GLOB,
- { throws: 'error' },
- { overwriteRoutes: true },
- );
+ it('should clear table options', () => {
+ act(() => {
+ wrapper
+ .find('[name="async-select-table"]')
+ .first()
+ .props()
+ .loadOptions()
+ .then(data => {
+ expect(data).toEqual({ options: [] });
+ });
+ });
+ return Promise.resolve();
+ });
+ });
- wrapper
- .instance()
- .fetchTables(true, 'birth_names')
- .then(() => {
- expect(wrapper.state().tableOptions).toEqual([]);
- expect(wrapper.state().tableOptions).toHaveLength(0);
- expect(mockedProps.handleError.callCount).toBe(1);
- return Promise.resolve();
+ describe('change schema', () => {
+ beforeEach(async () => {
+ fetchMock.get(FETCH_SCHEMAS_ENDPOINT, schemaOptions, {
+ overwriteRoutes: true,
+ });
+ act(() => {
+
wrapper.find('[data-test="select-database"]').first().props().onChange({
+ id: 1,
+ database_name: 'main',
});
+ });
});
- });
- describe('fetchSchemas', () => {
- const FETCH_SCHEMAS_GLOB =
'glob:*/api/v1/database/*/schemas/?q=(force:!*)';
afterEach(fetchMock.resetHistory);
afterAll(fetchMock.reset);
- it('should fetch schema options', () => {
- const schemaOptions = {
- result: ['main', 'erf', 'superset'],
- };
- fetchMock.get(FETCH_SCHEMAS_GLOB, schemaOptions, {
- overwriteRoutes: true,
+ it('should fetch table', async () => {
+ fetchMock.get(GET_TABLE_NAMES_ENDPOINT, { overwriteRoutes: true });
+ act(() => {
+ wrapper
+ .find('[name="select-schema"]')
+ .first()
+ .props()
+ .onChange(selectedSchema);
});
-
- return wrapper
- .instance()
- .fetchSchemas(1)
- .then(() => {
- expect(fetchMock.calls(FETCH_SCHEMAS_GLOB)).toHaveLength(1);
- expect(wrapper.state().schemaOptions).toHaveLength(3);
- });
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(fetchMock.calls(GET_TABLE_NAMES_ENDPOINT)).toHaveLength(1);
});
- // Test needs to be fixed: Github issue #7768
- it.skip('should dispatch a danger toast on error', () => {
- const handleErrors = sinon.stub();
- expect(handleErrors.callCount).toBe(0);
- wrapper.setProps({ handleErrors });
- fetchMock.get(
- FETCH_SCHEMAS_GLOB,
- { throws: new Error('Bad kitty') },
- { overwriteRoutes: true },
- );
- wrapper
- .instance()
- .fetchSchemas(123)
- .then(() => {
- expect(wrapper.state().schemaOptions).toEqual([]);
- expect(handleErrors.callCount).toBe(1);
- });
- });
- });
+ it('should fetch table options', async () => {
+ fetchMock.get(GET_TABLE_NAMES_ENDPOINT, tables, {
+ overwriteRoutes: true,
+ });
+ act(() => {
+ wrapper
+ .find('[name="select-schema"]')
+ .first()
+ .props()
+ .onChange(selectedSchema);
+ });
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(
+ wrapper.find('[name="select-schema"]').first().props().value[0],
+ ).toEqual(selectedSchema);
+ expect(fetchMock.calls(GET_TABLE_NAMES_ENDPOINT)).toHaveLength(1);
- describe('changeTable', () => {
- beforeEach(() => {
- sinon.stub(wrapper.instance(), 'fetchTables');
+ act(() => {
+ const { options } = wrapper
+ .find('[name="select-table"]')
+ .first()
+ .props();
+ expect({ options }).toEqual(tables);
+ });
});
+ });
- afterEach(() => {
- wrapper.instance().fetchTables.restore();
+ describe('change table', () => {
+ beforeEach(async () => {
+ fetchMock.get(GET_TABLE_NAMES_ENDPOINT, tables, {
+ overwriteRoutes: true,
+ });
+ act(() => {
+ wrapper
+ .find('[name="select-schema"]')
+ .first()
+ .props()
+ .onChange(selectedSchema);
+ });
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
});
- it('test 1', () => {
- wrapper.instance().changeTable({
- value: 'birth_names',
- schema: 'main',
- label: 'birth_names',
- title: 'birth_names',
+ it('should change table value', async () => {
+ act(() => {
+ wrapper
+ .find('[name="select-table"]')
+ .first()
+ .props()
+ .onChange(selectedTable);
});
- expect(wrapper.state().tableName).toBe('birth_names');
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(
+ wrapper.find('[name="select-table"]').first().props().value[0],
+ ).toEqual(selectedTable);
});
- it('should call onTableChange with schema from table object', () => {
- wrapper.setProps({ schema: null });
- wrapper.instance().changeTable({
- value: 'my_table',
- schema: 'other_schema',
- label: 'other_schema.my_table',
- title: 'other_schema.my_table',
+ it('should call onTableChange with schema from table object', async () => {
+ act(() => {
+ wrapper
+ .find('[name="select-table"]')
+ .first()
+ .props()
+ .onChange(selectedTable);
});
- expect(mockedProps.onTableChange.getCall(0).args[0]).toBe('my_table');
-
expect(mockedProps.onTableChange.getCall(0).args[1]).toBe('other_schema');
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(mockedProps.onTableChange.getCall(0).args[0]).toBe('birth_names');
+ expect(mockedProps.onTableChange.getCall(0).args[1]).toBe('main');
});
});
- it('changeSchema', () => {
- sinon.stub(wrapper.instance(), 'fetchTables');
+ describe('getTableNamesBySubStr', () => {
+ beforeEach(() => {
+ wrapper.setProps({ schema: 'main' });
+ });
+ afterEach(fetchMock.resetHistory);
+ afterAll(fetchMock.reset);
- wrapper.instance().changeSchema({ label: 'main', value: 'main' });
- expect(wrapper.instance().fetchTables.callCount).toBe(1);
- expect(mockedProps.onChange.callCount).toBe(1);
- wrapper.instance().changeSchema();
- expect(wrapper.instance().fetchTables.callCount).toBe(2);
- expect(mockedProps.onChange.callCount).toBe(2);
+ it('should handle empty', () =>
+ act(() => {
+ wrapper
+ .find('[name="async-select-table"]')
+ .first()
+ .props()
+ .loadOptions()
+ .then(data => {
+ expect(data).toEqual({ options: [] });
Review comment:
since this is part of a promise, I'm not sure if the test is exiting
before it gets to this line. Looking at [the
docs](https://jestjs.io/docs/en/asynchronous) it appears we can return a
promise and jest will wait for it to finish before finishing the test. Since
this is wrapped in an `act`, I'm not sure how to do that. We may need to use
`done`, or make this an async function and use a few awaits, or setup the test
with `expect.assertions(1)`.
##########
File path: superset-frontend/spec/javascripts/components/TableSelector_spec.jsx
##########
@@ -18,267 +18,275 @@
*/
import React from 'react';
import configureStore from 'redux-mock-store';
-import { shallow } from 'enzyme';
+import { mount } from 'enzyme';
+import { act } from 'react-dom/test-utils';
import sinon from 'sinon';
import fetchMock from 'fetch-mock';
import thunk from 'redux-thunk';
+import { supersetTheme, ThemeProvider } from '@superset-ui/core';
+import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint';
+
+import DatabaseSelector from 'src/components/DatabaseSelector';
import TableSelector from 'src/components/TableSelector';
import { initialState, tables } from '../sqllab/fixtures';
-describe('TableSelector', () => {
- let mockedProps;
- const middlewares = [thunk];
- const mockStore = configureStore(middlewares);
- const store = mockStore(initialState);
- let wrapper;
- let inst;
+const mockStore = configureStore([thunk]);
+const store = mockStore(initialState);
- beforeEach(() => {
- mockedProps = {
- dbId: 1,
- schema: 'main',
- onSchemaChange: sinon.stub(),
- onDbChange: sinon.stub(),
- getDbList: sinon.stub(),
- onTableChange: sinon.stub(),
- onChange: sinon.stub(),
- tableNameSticky: true,
- tableName: '',
- database: { id: 1, database_name: 'main' },
- horizontal: false,
- sqlLabMode: true,
- clearable: false,
- handleError: sinon.stub(),
- };
- wrapper = shallow(<TableSelector {...mockedProps} />, {
- context: { store },
- });
- inst = wrapper.instance();
- });
-
- it('is valid', () => {
- expect(React.isValidElement(<TableSelector {...mockedProps}
/>)).toBe(true);
- });
-
- describe('onDatabaseChange', () => {
- it('should fetch schemas', () => {
- sinon.stub(inst, 'fetchSchemas');
- inst.onDatabaseChange({ id: 1 });
- expect(inst.fetchSchemas.getCall(0).args[0]).toBe(1);
- inst.fetchSchemas.restore();
- });
- it('should clear tableOptions', () => {
- inst.onDatabaseChange();
- expect(wrapper.state().tableOptions).toEqual([]);
- });
- });
+const FETCH_SCHEMAS_ENDPOINT = 'glob:*/api/v1/database/*/schemas/*';
+const GET_TABLE_ENDPOINT = 'glob:*/superset/tables/1/*/*';
+const GET_TABLE_NAMES_ENDPOINT = 'glob:*/superset/tables/1/main/*';
- describe('getTableNamesBySubStr', () => {
- const GET_TABLE_NAMES_GLOB = 'glob:*/superset/tables/1/main/*';
+const mockedProps = {
+ clearable: false,
+ database: { id: 1, database_name: 'main' },
+ dbId: 1,
+ formMode: false,
+ getDbList: sinon.stub(),
+ handleError: sinon.stub(),
+ horizontal: false,
+ onChange: sinon.stub(),
+ onDbChange: sinon.stub(),
+ onSchemaChange: sinon.stub(),
+ onTableChange: sinon.stub(),
+ sqlLabMode: true,
+ tableName: '',
+ tableNameSticky: true,
+};
- afterEach(fetchMock.resetHistory);
- afterAll(fetchMock.reset);
+const schemaOptions = {
+ result: ['main', 'erf', 'superset'],
+};
+const selectedSchema = { label: 'main', title: 'main', value: 'main' };
+const selectedTable = {
+ label: 'birth_names',
+ schema: 'main',
+ title: 'birth_names',
+ value: 'birth_names',
+ type: undefined,
+};
- it('should handle empty', () =>
- inst.getTableNamesBySubStr('').then(data => {
- expect(data).toEqual({ options: [] });
- return Promise.resolve();
- }));
+async function mountAndWait(props = mockedProps) {
+ const mounted = mount(<TableSelector {...props} />, {
+ context: { store },
+ wrappingComponent: ThemeProvider,
+ wrappingComponentProps: { theme: supersetTheme },
+ });
+ await waitForComponentToPaint(mounted);
- it('should handle table name', () => {
- fetchMock.get(GET_TABLE_NAMES_GLOB, tables, { overwriteRoutes: true });
+ return mounted;
+}
- return wrapper
- .instance()
- .getTableNamesBySubStr('my table')
- .then(data => {
- expect(fetchMock.calls(GET_TABLE_NAMES_GLOB)).toHaveLength(1);
- expect(data).toEqual({
- 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',
- },
- ],
- });
- return Promise.resolve();
- });
- });
+describe('TableSelector', () => {
+ let wrapper;
- it('should escape schema and table names', () => {
- const GET_TABLE_GLOB = 'glob:*/superset/tables/1/*/*';
- wrapper.setProps({ schema: 'slashed/schema' });
- fetchMock.get(GET_TABLE_GLOB, tables, { overwriteRoutes: true });
+ beforeEach(async () => {
+ fetchMock.reset();
+ wrapper = await mountAndWait();
+ });
- return wrapper
- .instance()
- .getTableNamesBySubStr('slashed/table')
- .then(() => {
- expect(fetchMock.lastUrl(GET_TABLE_GLOB)).toContain(
- '/slashed%252Fschema/slashed%252Ftable',
- );
- return Promise.resolve();
- });
- });
+ it('renders', () => {
+ expect(wrapper.find(TableSelector)).toExist();
+ expect(wrapper.find(DatabaseSelector)).toExist();
});
- describe('fetchTables', () => {
- const FETCH_TABLES_GLOB = 'glob:*/superset/tables/1/main/*/*/';
+ describe('change database', () => {
afterEach(fetchMock.resetHistory);
afterAll(fetchMock.reset);
- it('should clear table options', () => {
- inst.fetchTables(true);
- expect(wrapper.state().tableOptions).toEqual([]);
+ it('should fetch schemas', async () => {
+ fetchMock.get(FETCH_SCHEMAS_ENDPOINT, { overwriteRoutes: true });
+ act(() => {
+
wrapper.find('[data-test="select-database"]').first().props().onChange({
+ id: 1,
+ database_name: 'main',
+ });
+ });
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(fetchMock.calls(FETCH_SCHEMAS_ENDPOINT)).toHaveLength(1);
});
- it('should fetch table options', () => {
- fetchMock.get(FETCH_TABLES_GLOB, tables, { overwriteRoutes: true });
- return inst.fetchTables(true, 'birth_names').then(() => {
- expect(wrapper.state().tableOptions).toHaveLength(3);
- expect(wrapper.state().tableOptions).toEqual([
- {
- 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',
- },
+ it('should fetch schema options', async () => {
+ fetchMock.get(FETCH_SCHEMAS_ENDPOINT, schemaOptions, {
+ overwriteRoutes: true,
+ });
+ act(() => {
+
wrapper.find('[data-test="select-database"]').first().props().onChange({
+ id: 1,
+ database_name: 'main',
+ });
+ });
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(fetchMock.calls(FETCH_SCHEMAS_ENDPOINT)).toHaveLength(1);
+
+ act(() => {
+ expect(
+ wrapper.find('[name="select-schema"]').first().props().options,
+ ).toEqual([
+ { value: 'main', label: 'main', title: 'main' },
+ { value: 'erf', label: 'erf', title: 'erf' },
+ { value: 'superset', label: 'superset', title: 'superset' },
]);
- return Promise.resolve();
});
});
- // Test needs to be fixed: Github issue #7768
- it.skip('should dispatch a danger toast on error', () => {
- fetchMock.get(
- FETCH_TABLES_GLOB,
- { throws: 'error' },
- { overwriteRoutes: true },
- );
+ it('should clear table options', () => {
+ act(() => {
+ wrapper
+ .find('[name="async-select-table"]')
+ .first()
+ .props()
+ .loadOptions()
+ .then(data => {
+ expect(data).toEqual({ options: [] });
+ });
+ });
+ return Promise.resolve();
+ });
+ });
- wrapper
- .instance()
- .fetchTables(true, 'birth_names')
- .then(() => {
- expect(wrapper.state().tableOptions).toEqual([]);
- expect(wrapper.state().tableOptions).toHaveLength(0);
- expect(mockedProps.handleError.callCount).toBe(1);
- return Promise.resolve();
+ describe('change schema', () => {
+ beforeEach(async () => {
+ fetchMock.get(FETCH_SCHEMAS_ENDPOINT, schemaOptions, {
+ overwriteRoutes: true,
+ });
+ act(() => {
+
wrapper.find('[data-test="select-database"]').first().props().onChange({
+ id: 1,
+ database_name: 'main',
});
+ });
});
- });
- describe('fetchSchemas', () => {
- const FETCH_SCHEMAS_GLOB =
'glob:*/api/v1/database/*/schemas/?q=(force:!*)';
afterEach(fetchMock.resetHistory);
afterAll(fetchMock.reset);
- it('should fetch schema options', () => {
- const schemaOptions = {
- result: ['main', 'erf', 'superset'],
- };
- fetchMock.get(FETCH_SCHEMAS_GLOB, schemaOptions, {
- overwriteRoutes: true,
+ it('should fetch table', async () => {
+ fetchMock.get(GET_TABLE_NAMES_ENDPOINT, { overwriteRoutes: true });
+ act(() => {
+ wrapper
+ .find('[name="select-schema"]')
+ .first()
+ .props()
+ .onChange(selectedSchema);
});
-
- return wrapper
- .instance()
- .fetchSchemas(1)
- .then(() => {
- expect(fetchMock.calls(FETCH_SCHEMAS_GLOB)).toHaveLength(1);
- expect(wrapper.state().schemaOptions).toHaveLength(3);
- });
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(fetchMock.calls(GET_TABLE_NAMES_ENDPOINT)).toHaveLength(1);
});
- // Test needs to be fixed: Github issue #7768
- it.skip('should dispatch a danger toast on error', () => {
- const handleErrors = sinon.stub();
- expect(handleErrors.callCount).toBe(0);
- wrapper.setProps({ handleErrors });
- fetchMock.get(
- FETCH_SCHEMAS_GLOB,
- { throws: new Error('Bad kitty') },
- { overwriteRoutes: true },
- );
- wrapper
- .instance()
- .fetchSchemas(123)
- .then(() => {
- expect(wrapper.state().schemaOptions).toEqual([]);
- expect(handleErrors.callCount).toBe(1);
- });
- });
- });
+ it('should fetch table options', async () => {
+ fetchMock.get(GET_TABLE_NAMES_ENDPOINT, tables, {
+ overwriteRoutes: true,
+ });
+ act(() => {
+ wrapper
+ .find('[name="select-schema"]')
+ .first()
+ .props()
+ .onChange(selectedSchema);
+ });
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(
+ wrapper.find('[name="select-schema"]').first().props().value[0],
+ ).toEqual(selectedSchema);
+ expect(fetchMock.calls(GET_TABLE_NAMES_ENDPOINT)).toHaveLength(1);
- describe('changeTable', () => {
- beforeEach(() => {
- sinon.stub(wrapper.instance(), 'fetchTables');
+ act(() => {
+ const { options } = wrapper
+ .find('[name="select-table"]')
+ .first()
+ .props();
+ expect({ options }).toEqual(tables);
+ });
});
+ });
- afterEach(() => {
- wrapper.instance().fetchTables.restore();
+ describe('change table', () => {
+ beforeEach(async () => {
+ fetchMock.get(GET_TABLE_NAMES_ENDPOINT, tables, {
+ overwriteRoutes: true,
+ });
+ act(() => {
+ wrapper
+ .find('[name="select-schema"]')
+ .first()
+ .props()
+ .onChange(selectedSchema);
+ });
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
});
- it('test 1', () => {
- wrapper.instance().changeTable({
- value: 'birth_names',
- schema: 'main',
- label: 'birth_names',
- title: 'birth_names',
+ it('should change table value', async () => {
+ act(() => {
+ wrapper
+ .find('[name="select-table"]')
+ .first()
+ .props()
+ .onChange(selectedTable);
});
- expect(wrapper.state().tableName).toBe('birth_names');
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(
+ wrapper.find('[name="select-table"]').first().props().value[0],
+ ).toEqual(selectedTable);
});
- it('should call onTableChange with schema from table object', () => {
- wrapper.setProps({ schema: null });
- wrapper.instance().changeTable({
- value: 'my_table',
- schema: 'other_schema',
- label: 'other_schema.my_table',
- title: 'other_schema.my_table',
+ it('should call onTableChange with schema from table object', async () => {
+ act(() => {
+ wrapper
+ .find('[name="select-table"]')
+ .first()
+ .props()
+ .onChange(selectedTable);
});
- expect(mockedProps.onTableChange.getCall(0).args[0]).toBe('my_table');
-
expect(mockedProps.onTableChange.getCall(0).args[1]).toBe('other_schema');
+ await waitForComponentToPaint(wrapper);
+ wrapper.update();
+ expect(mockedProps.onTableChange.getCall(0).args[0]).toBe('birth_names');
+ expect(mockedProps.onTableChange.getCall(0).args[1]).toBe('main');
});
});
- it('changeSchema', () => {
- sinon.stub(wrapper.instance(), 'fetchTables');
+ describe('getTableNamesBySubStr', () => {
+ beforeEach(() => {
+ wrapper.setProps({ schema: 'main' });
+ });
+ afterEach(fetchMock.resetHistory);
+ afterAll(fetchMock.reset);
- wrapper.instance().changeSchema({ label: 'main', value: 'main' });
- expect(wrapper.instance().fetchTables.callCount).toBe(1);
- expect(mockedProps.onChange.callCount).toBe(1);
- wrapper.instance().changeSchema();
- expect(wrapper.instance().fetchTables.callCount).toBe(2);
- expect(mockedProps.onChange.callCount).toBe(2);
+ it('should handle empty', () =>
+ act(() => {
+ wrapper
+ .find('[name="async-select-table"]')
+ .first()
+ .props()
+ .loadOptions()
+ .then(data => {
+ expect(data).toEqual({ options: [] });
+ });
+ }));
- wrapper.instance().fetchTables.restore();
+ it('should handle table name', () => {
+ fetchMock.get(GET_TABLE_ENDPOINT, tables, {
+ overwriteRoutes: true,
+ });
+ act(() => {
+ wrapper
+ .find('[name="async-select-table"]')
+ .first()
+ .props()
+ .loadOptions()
+ .then(data => {
+ expect(fetchMock.calls(GET_TABLE_ENDPOINT)).toHaveLength(1);
+ expect(data).toEqual(tables);
+ });
+ });
+ return Promise.resolve();
Review comment:
Same here, I think this test will always succeed since we're returning a
resolved promise here.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]