This is an automated email from the ASF dual-hosted git repository. hugh pushed a commit to branch hugh/move-ctas-cvas-fields in repository https://gitbox.apache.org/repos/asf/superset.git
commit ad8f67181e719913e59cf8a023218dd0c9ac9c33 Merge: 9b07e36 9d6832d Author: hughhhh <[email protected]> AuthorDate: Tue Mar 30 18:35:52 2021 -0400 fix test .github/CODEOWNERS | 3 ++ .github/PULL_REQUEST_TEMPLATE.md | 6 ++- docs/package-lock.json | 24 ++++----- docs/src/pages/docs/introduction.mdx | 2 +- .../explore/components/AdhocFilterOption_spec.jsx | 2 +- .../explore/components/AdhocMetricOption_spec.jsx | 2 +- .../explore/components/ColorPickerControl_spec.jsx | 2 +- .../explore/components/EmbedCodeButton_spec.jsx | 2 +- .../components/FilterBoxItemControl_spec.jsx | 2 +- .../components/TimeSeriesColumnControl_spec.jsx | 2 +- .../explore/components/ViewportControl_spec.jsx | 2 +- .../views/CRUD/alert/ExecutionLog_spec.jsx | 1 + .../CRUD/data/database/DatabaseModal_spec.jsx | 17 ++++-- .../src/SqlLab/components/ResultSet.tsx | 25 +++------ .../src/common/components/common.stories.tsx | 29 ---------- .../CertifiedIcon/CertifiedIcon.stories.tsx} | 25 +++++++-- .../CertifiedIcon/CertifiedIcon.test.tsx | 47 ++++++++++++++++ .../index.tsx} | 8 +-- .../src/components/Checkbox/Checkbox.test.tsx | 6 ++- .../Checkbox/{index.tsx => Checkbox.tsx} | 5 +- .../components/{ => Checkbox}/CheckboxIcons.tsx | 0 .../src/components/Checkbox/index.tsx | 38 +------------ superset-frontend/src/components/Icon/index.tsx | 9 +++- superset-frontend/src/components/Popover/index.tsx | 2 +- .../src/components/TableSelector/index.tsx | 4 +- .../src/components/URLShortLinkButton/index.jsx | 2 +- .../components/FiltersBadge/DetailsPanel.tsx | 2 +- .../dashboard/components/filterscope/treeIcons.jsx | 2 +- .../FilterBar/CascadeFilters/CascadePopover.tsx | 2 +- .../FilterBar/FilterControls/FilterValue.tsx | 36 ++++++++++--- .../FiltersConfigForm/DefaultValue.tsx | 62 +++++++--------------- .../FiltersConfigForm/FiltersConfigForm.tsx | 30 +++++++---- .../FiltersConfigModal/FiltersConfigForm/state.ts | 34 ++++++++++-- .../src/datasource/DatasourceEditor.jsx | 4 +- .../src/explore/components/EmbedCodeButton.jsx | 2 +- .../components/controls/AnnotationLayerControl.jsx | 2 +- .../components/controls/ColorPickerControl.jsx | 2 +- .../controls/DateFilterControl/DateFilterLabel.tsx | 2 +- .../components/controls/FilterBoxItemControl.jsx | 2 +- .../FilterControl/AdhocFilterPopoverTrigger.tsx | 2 +- .../MetricControl/AdhocMetricPopoverTrigger.tsx | 2 +- .../explore/components/controls/SelectControl.jsx | 2 +- .../controls/TimeSeriesColumnControl.jsx | 2 +- .../components/controls/ViewportControl.jsx | 2 +- .../src/views/CRUD/alert/ExecutionLog.tsx | 11 ++++ superset-frontend/src/views/CRUD/alert/types.ts | 1 + .../src/views/CRUD/data/database/DatabaseModal.tsx | 16 ++++-- .../src/views/CRUD/data/dataset/DatasetList.tsx | 4 +- .../src/views/CRUD/data/query/QueryList.tsx | 2 +- .../views/CRUD/data/savedquery/SavedQueryList.tsx | 2 +- ...411006_add_execution_id_to_report_execution_.py | 39 ++++++++++++++ superset/models/reports.py | 2 + superset/reports/commands/execute.py | 16 ++++-- superset/reports/logs/api.py | 2 + superset/tasks/scheduler.py | 5 +- tests/reports/commands_tests.py | 55 ++++++++++--------- 56 files changed, 367 insertions(+), 247 deletions(-) diff --cc superset-frontend/spec/javascripts/views/CRUD/data/database/DatabaseModal_spec.jsx index d5e5741,901b18a..78427c4 --- a/superset-frontend/spec/javascripts/views/CRUD/data/database/DatabaseModal_spec.jsx +++ b/superset-frontend/spec/javascripts/views/CRUD/data/database/DatabaseModal_spec.jsx @@@ -52,225 -52,38 +52,232 @@@ const DATABASE_ENDPOINT = 'glob:*/api/v fetchMock.get(DATABASE_ENDPOINT, {}); describe('DatabaseModal', () => { - const wrapper = mount(<DatabaseModal store={store} {...mockedProps} />); - - it('renders', () => { - expect(wrapper.find(DatabaseModal)).toExist(); + describe('enzyme', () => { + let wrapper; + let spyOnUseSelector; + beforeAll(() => { + spyOnUseSelector = jest.spyOn(redux, 'useSelector'); + spyOnUseSelector.mockReturnValue(initialState.common.conf); + }); + beforeEach(() => { + wrapper = mount( + <Provider store={store}> + <DatabaseModal store={store} {...mockedProps} /> + </Provider>, + ); + }); + afterEach(() => { + wrapper.unmount(); + }); + it('renders', () => { + expect(wrapper.find(DatabaseModal)).toExist(); + }); + it('renders a Modal', () => { + expect(wrapper.find(Modal)).toExist(); + }); + it('renders "Add database" header when no database is included', () => { + expect(wrapper.find('h4').text()).toEqual('Add database'); + }); + it('renders "Edit database" header when database prop is included', () => { + const editWrapper = mount(<DatabaseModal store={store} {...dbProps} />); + waitForComponentToPaint(editWrapper); + expect(editWrapper.find('h4').text()).toEqual('Edit database'); + editWrapper.unmount(); + }); + it('renders a Tabs menu', () => { + expect(wrapper.find(Tabs)).toExist(); + }); + it('renders five TabPanes', () => { + expect(wrapper.find(Tabs.TabPane)).toExist(); + expect(wrapper.find(Tabs.TabPane)).toHaveLength(5); + }); + it('renders input elements for Connection section', () => { + expect(wrapper.find('input[name="database_name"]')).toExist(); + expect(wrapper.find('input[name="sqlalchemy_uri"]')).toExist(); + }); }); - it('renders a Modal', () => { - expect(wrapper.find(Modal)).toExist(); - }); + describe('RTL', () => { + describe('initial load', () => { + it('displays the correct properties from the db when selected', () => { + render( + <ThemeProvider theme={supersetTheme}> + <Provider store={store}> + <DatabaseModal + show + database={{ expose_in_sqllab: true, allow_ctas: true }} + /> + </Provider> + </ThemeProvider>, + ); + // Select SQL Lab settings tab + const sqlLabSettingsTab = screen.getByRole('tab', { + name: /sql lab settings/i, + }); + userEvent.click(sqlLabSettingsTab); - it('renders "Add database" header when no database is included', () => { - expect(wrapper.find('h4').text()).toEqual('Add database'); - }); + const exposeInSqlLab = screen.getByText('Expose in SQL Lab'); + const exposeChoicesForm = exposeInSqlLab.parentElement.nextSibling; + const schemaField = screen.getByText('CTAS & CVAS SCHEMA') + .parentElement; + expect(exposeChoicesForm).toHaveClass('open'); + expect(schemaField).toHaveClass('open'); + }); + it('hides the forms from the db when not selected', () => { + render( + <ThemeProvider theme={supersetTheme}> + <Provider store={store}> + <DatabaseModal + show + database={{ + expose_in_sqllab: false, + allow_ctas: false, + allow_cvas: false, + }} + /> + </Provider> + </ThemeProvider>, + ); + // Select SQL Lab settings tab + const sqlLabSettingsTab = screen.getByRole('tab', { + name: /sql lab settings/i, + }); + userEvent.click(sqlLabSettingsTab); - it('renders "Edit database" header when database prop is included', () => { - const editWrapper = mount(<DatabaseModal store={store} {...dbProps} />); - waitForComponentToPaint(editWrapper); - expect(editWrapper.find('h4').text()).toEqual('Edit database'); - }); + const exposeInSqlLab = screen.getByText('Expose in SQL Lab'); + const exposeChoicesForm = exposeInSqlLab.parentElement.nextSibling; + const schemaField = screen.getByText('CTAS & CVAS SCHEMA') + .parentElement; + expect(exposeChoicesForm).not.toHaveClass('open'); + expect(schemaField).not.toHaveClass('open'); + }); + }); + it('renders solely "Expose in SQL Lab" option when unchecked', () => { + render( + <ThemeProvider theme={supersetTheme}> + <Provider store={store}> + <DatabaseModal {...dbProps} /> + </Provider> + </ThemeProvider>, + ); - it('renders a Tabs menu', () => { - expect(wrapper.find(Tabs)).toExist(); - }); + // Select SQL Lab settings tab + const sqlLabSettingsTab = screen.getByRole('tab', { + name: /sql lab settings/i, + }); + - it('renders five TabPanes', () => { - expect(wrapper.find(Tabs.TabPane)).toExist(); - expect(wrapper.find(Tabs.TabPane)).toHaveLength(5); - }); + userEvent.click(sqlLabSettingsTab); + // Grab all SQL Lab Settings by their labels - const exposeInSqlLab = screen.getByText('Expose in SQL Lab'); - const exposeChoicesForm = exposeInSqlLab.parentElement.nextSibling; ++ // const exposeInSqlLab = screen.getByText('Expose in SQL Lab'); ++ const exposeInSqlLab = screen.getByRole('checkbox', { ++ name: /expose in sql lab/i, ++ }); + + // While 'Expose in SQL Lab' is checked, all settings should display - expect(exposeChoicesForm).toHaveClass('open'); ++ expect(exposeInSqlLab).not.toBeChecked(); + + // When clicked, "Expose in SQL Lab" becomes unchecked + userEvent.click(exposeInSqlLab); ++ + // While unchecked, only "Expose in SQL Lab" should display - expect(exposeInSqlLab).toBeVisible(); - expect(exposeChoicesForm).not.toHaveClass('open'); ++ expect(exposeInSqlLab).toBeChecked(); ++ const checkboxes = screen.getAllByRole('checkbox'); ++ ++ // While checked make sure all checkboxes are showing ++ expect(checkboxes.length).toEqual(5); + }); + + it('renders the schema field when allowCTAS is checked', () => { + render( + <ThemeProvider theme={supersetTheme}> + <Provider store={store}> + <DatabaseModal {...dbProps} /> + </Provider> + </ThemeProvider>, + ); + + // Select SQL Lab settings tab + const sqlLabSettingsTab = screen.getByRole('tab', { + name: /sql lab settings/i, + }); + userEvent.click(sqlLabSettingsTab); + // Grab CTAS & schema field by their labels + const allowCTAS = screen.getByLabelText('Allow CREATE TABLE AS'); + const schemaField = screen.getByText('CTAS & CVAS SCHEMA').parentElement; + + // While CTAS & CVAS are unchecked, schema field is not visible + expect(schemaField).not.toHaveClass('open'); + + // Check "Allow CTAS" to reveal schema field + userEvent.click(allowCTAS); + expect(schemaField).toHaveClass('open'); + + // Uncheck "Allow CTAS" to hide schema field again + userEvent.click(allowCTAS); + expect(schemaField).not.toHaveClass('open'); + }); + + it('renders the schema field when allowCVAS is checked', () => { + render( + <ThemeProvider theme={supersetTheme}> + <Provider store={store}> + <DatabaseModal {...dbProps} /> + </Provider> + </ThemeProvider>, + ); + + // Select SQL Lab settings tab + const sqlLabSettingsTab = screen.getByRole('tab', { + name: /sql lab settings/i, + }); + userEvent.click(sqlLabSettingsTab); + // Grab CVAS by it's label & schema field + const allowCVAS = screen.getByText('Allow CREATE VIEW AS'); + const schemaField = screen.getByText('CTAS & CVAS SCHEMA').parentElement; + + // While CTAS & CVAS are unchecked, schema field is not visible + expect(schemaField).not.toHaveClass('open'); + + // Check "Allow CVAS" to reveal schema field + userEvent.click(allowCVAS); + expect(schemaField).toHaveClass('open'); + + // Uncheck "Allow CVAS" to hide schema field again + userEvent.click(allowCVAS); + expect(schemaField).not.toHaveClass('open'); + }); + + it('renders the schema field when both allowCTAS and allowCVAS are checked', () => { + render( + <ThemeProvider theme={supersetTheme}> + <Provider store={store}> + <DatabaseModal {...dbProps} /> + </Provider> + </ThemeProvider>, + ); + + // Select SQL Lab settings tab + const sqlLabSettingsTab = screen.getByRole('tab', { + name: /sql lab settings/i, + }); + userEvent.click(sqlLabSettingsTab); + // Grab CTAS and CVAS by their labels, & schema field + const allowCTAS = screen.getByText('Allow CREATE TABLE AS'); + const allowCVAS = screen.getByText('Allow CREATE VIEW AS'); + const schemaField = screen.getByText('CTAS & CVAS SCHEMA').parentElement; + + // While CTAS & CVAS are unchecked, schema field is not visible + expect(schemaField).not.toHaveClass('open'); - it('renders input elements for Connection section', () => { - expect(wrapper.find('input[name="database_name"]')).toExist(); - expect(wrapper.find('input[name="sqlalchemy_uri"]')).toExist(); + // Check both "Allow CTAS" and "Allow CVAS" to reveal schema field + userEvent.click(allowCTAS); + userEvent.click(allowCVAS); + expect(schemaField).toHaveClass('open'); + // Uncheck both "Allow CTAS" and "Allow CVAS" to hide schema field again + userEvent.click(allowCTAS); + // Both checkboxes go unchecked, so the field should no longer render + userEvent.click(allowCVAS); + expect(schemaField).not.toHaveClass('open'); + }); }); }); diff --cc superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx index 9731279,cded9c8..c59e1b3 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx @@@ -260,10 -227,10 +263,10 @@@ const DatabaseModal: FunctionComponent< ...db, }; - if (target.type === 'checkbox') { - data[target.name] = target.checked; + if (type === 'checkbox') { + data[name] = checked; } else { - data[name] = typeof value === 'string' ? value.trim() : value; - data[target.name] = target.value; ++ data[name] = value; } setDB(data);
