2019-01-15 18:53:27 -05:00
|
|
|
/**
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
|
|
* or more contributor license agreements. See the NOTICE file
|
|
|
|
* distributed with this work for additional information
|
|
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
|
|
* to you under the Apache License, Version 2.0 (the
|
|
|
|
* "License"); you may not use this file except in compliance
|
|
|
|
* with the License. You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing,
|
|
|
|
* software distributed under the License is distributed on an
|
|
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
|
* KIND, either express or implied. See the License for the
|
|
|
|
* specific language governing permissions and limitations
|
|
|
|
* under the License.
|
|
|
|
*/
|
2018-09-06 17:55:48 -04:00
|
|
|
// ***********************************************
|
|
|
|
// Tests for setting controls in the UI
|
|
|
|
// ***********************************************
|
2018-11-19 14:29:46 -05:00
|
|
|
import { FORM_DATA_DEFAULTS, NUM_METRIC } from './visualizations/shared.helper';
|
2018-09-06 17:55:48 -04:00
|
|
|
|
2020-07-10 15:46:25 -04:00
|
|
|
describe('Datasource control', () => {
|
|
|
|
const newMetricName = `abc${Date.now()}`;
|
|
|
|
|
|
|
|
before(() => {
|
2018-09-06 17:55:48 -04:00
|
|
|
cy.server();
|
|
|
|
cy.login();
|
2020-07-10 15:46:25 -04:00
|
|
|
cy.route('GET', '/superset/explore_json/**').as('getJson');
|
|
|
|
cy.route('POST', '/superset/explore_json/**').as('postJson');
|
|
|
|
});
|
2018-09-06 17:55:48 -04:00
|
|
|
|
2020-07-10 15:46:25 -04:00
|
|
|
it('should allow edit datasource', () => {
|
2020-09-15 17:12:06 -04:00
|
|
|
let numScripts = 0;
|
|
|
|
|
2020-07-10 15:46:25 -04:00
|
|
|
cy.visitChartByName('Num Births Trend');
|
|
|
|
cy.verifySliceSuccess({ waitAlias: '@postJson' });
|
|
|
|
cy.get('#datasource_menu').click();
|
2020-09-15 17:12:06 -04:00
|
|
|
|
|
|
|
cy.get('script').then(nodes => {
|
|
|
|
numScripts = nodes.length;
|
|
|
|
});
|
|
|
|
|
2020-07-10 15:46:25 -04:00
|
|
|
cy.get('a').contains('Edit Datasource').click();
|
2020-09-15 17:12:06 -04:00
|
|
|
|
|
|
|
// should load additional scripts for the modal
|
|
|
|
cy.get('script').then(nodes => {
|
|
|
|
expect(nodes.length).to.greaterThan(numScripts);
|
|
|
|
});
|
|
|
|
|
2020-07-10 15:46:25 -04:00
|
|
|
// create new metric
|
2020-09-15 17:12:06 -04:00
|
|
|
cy.get('table button').contains('Add Item', { timeout: 10000 }).click();
|
2020-07-10 15:46:25 -04:00
|
|
|
cy.get('input[value="<new metric>"]').click();
|
|
|
|
cy.get('input[value="<new metric>"]')
|
|
|
|
.focus()
|
|
|
|
.clear()
|
|
|
|
.type(`${newMetricName}{enter}`);
|
|
|
|
cy.get('.modal-footer button').contains('Save').click();
|
|
|
|
cy.get('.modal-footer button').contains('OK').click();
|
|
|
|
// select new metric
|
2020-07-29 21:49:32 -04:00
|
|
|
cy.get('[data-test=metrics]')
|
|
|
|
.find('.Select__control input')
|
2020-07-10 15:46:25 -04:00
|
|
|
.focus()
|
2020-07-29 21:49:32 -04:00
|
|
|
.type(newMetricName, { force: true });
|
2020-07-10 15:46:25 -04:00
|
|
|
// delete metric
|
|
|
|
cy.get('#datasource_menu').click();
|
|
|
|
cy.get('a').contains('Edit Datasource').click();
|
|
|
|
cy.get(`input[value="${newMetricName}"]`)
|
|
|
|
.closest('tr')
|
2020-08-04 14:52:35 -04:00
|
|
|
.find('.fa-trash')
|
2020-07-10 15:46:25 -04:00
|
|
|
.click();
|
|
|
|
cy.get('.modal-footer button').contains('Save').click();
|
|
|
|
cy.get('.modal-footer button').contains('OK').click();
|
|
|
|
cy.get('.Select__multi-value__label')
|
|
|
|
.contains(newMetricName)
|
|
|
|
.should('not.exist');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2020-09-15 17:12:06 -04:00
|
|
|
describe('VizType control', () => {
|
|
|
|
beforeEach(() => {
|
2020-07-10 15:46:25 -04:00
|
|
|
cy.login();
|
2020-09-15 17:12:06 -04:00
|
|
|
cy.server();
|
2019-04-03 15:11:08 -04:00
|
|
|
cy.route('GET', '/superset/explore_json/**').as('getJson');
|
|
|
|
cy.route('POST', '/superset/explore_json/**').as('postJson');
|
2020-09-15 17:12:06 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
it('Can change vizType', () => {
|
|
|
|
cy.visitChartByName('Daily Totals');
|
Fix control validation handling (#7231)
Fixes a series of unexpected things around control validation.
* when a chart opens in a state where a control is invalid, it still
runs the query, and sometimes gets stuck in what appears to be a 'running'
state. After this change, no query is run, and a warning is displayed
in the chart panel body, just like any other error would
* validation used to be done in the <Control> component and alter the
redux store as it went. Clearly this is not the right approach, now
validation occurs on loading the initial redux state, as well as in
the reducer when controls are changed
* currently, when going from a invalid control state to a valid one
(user addresses what is needed), it auto-triggers a query which can be
unexpected. After this change, the error message disappears, and the
"Run Query" overlay gets displayed
* when changing viz type, it's common to get new validation
errors, and currently when that occurs it will still go ahead and run
a query with invalid inputs, which often results in errors
that are not well handled, since much of the logic
assumes control-validated input.
* prettier control validation messages
(cherry picked from commit a3212eba5df95bca834d8d6d98c11d522d9172f3)
2019-04-18 14:36:38 -04:00
|
|
|
cy.verifySliceSuccess({ waitAlias: '@postJson' });
|
2018-09-06 17:55:48 -04:00
|
|
|
|
2020-09-15 17:12:06 -04:00
|
|
|
let numScripts = 0;
|
|
|
|
cy.get('script').then(nodes => {
|
|
|
|
numScripts = nodes.length;
|
2018-09-06 17:55:48 -04:00
|
|
|
});
|
2020-09-15 17:12:06 -04:00
|
|
|
|
|
|
|
cy.get('.Control .label').contains('Table').click();
|
|
|
|
|
|
|
|
cy.get('[role="button"]').contains('Line Chart').click();
|
|
|
|
|
|
|
|
// should load mathjs for line chart
|
|
|
|
cy.get('script[src*="mathjs"]').should('have.length', 1);
|
|
|
|
cy.get('script').then(nodes => {
|
|
|
|
expect(nodes.length).to.greaterThan(numScripts);
|
|
|
|
});
|
|
|
|
|
style: Pass at propagating (and enhancing) Button component throughout Superset (#10649)
* getting rid of weird focus/active outline ring
* Buttons... buttons _everywhere_
* linting
* Nixing views/CRUD/dataset/Button component
* fixing 2 typing errors
* fixing more TS errors
* prefer src path for include
* one more real button, one less CSS class
* one more "button" to "Button"
* Published Status is now a proper clickable Label
* nixing the CRUD button again
* touching up stories, with SupersetButton story
* SIP-34 button colors
* adding polished package to mix colors
* updating button colors to match Superset theme
* abstracting away from bootstrap-specific props (might pivot libraries soon!)
* more abstraction from bsStyle/bsSize props
* exchanging styles for a prop
* linting
* restoring feature flag to stock
* using src alias
* last <button> replacement
* this classname would never be applied
* more linting action
* fixing unsupported bsSize 'medium', and cta typing error
* more cta action
* unnecessary styles
* errant bsSize prop
* cleanup
* tweaks to make new New button work
* Linting
* fixing a couple tests
* fixing theme based test failure
* margin tweak for NEW button
* another fixed test
* another fixed test
* fixing two more tests
* fixing last broken tests.
* always be linting
* Adding tertiary/dashed buttons
* cleaning up QueryAndSave buttons
* fixing "link" button styles
* fixing/updating link button styles
* cta buttons on Modal component
* linting.
* exporting button story knobs, making ALL knobs safe for export.
* capitalizing a file... no big whoop
* Basic button tests
* renaming button - temporarily
* renaming file to fix capitalization issue
* passing theme through to a difficult popover.
* fixin' a newly busted unit test
* lint fixin'
* oops, shouldn't have changed this prop!
* adding a dive() to themedShallow, and fixing a cypress/jest test
* addressing lint stuff
* touching up stories, with SupersetButton story
* SIP-34 button colors
* updating button colors to match Superset theme
* abstracting away from bootstrap-specific props (might pivot libraries soon!)
* linting
* restoring feature flag to stock
* cleanup
* Linting
* renaming button - temporarily
* renaming file to fix capitalization issue
* oops, shouldn't have changed this prop!
* adding a dive() to themedShallow, and fixing a cypress/jest test
* addressing lint stuff
* nixing new modal button
* Fixing another popover/button issue that should break cypress
* lint :sparkles:
* passing classNames through to new button (should fix some tests)
* cleaning unused classes, making cypress tests use data attrs
* fixin' the test
* fixing another class-based test with data-test attr
* no longer passing theme as prop to buttons in popovers... themeprovider is better
* outline/border tweaks!
2020-08-28 20:34:28 -04:00
|
|
|
cy.get('button[data-test="run-query-button"]').click();
|
2019-04-03 15:11:08 -04:00
|
|
|
cy.verifySliceSuccess({ waitAlias: '@postJson', chartSelector: 'svg' });
|
2018-09-06 17:55:48 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2018-11-19 14:29:46 -05:00
|
|
|
describe('Time range filter', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
cy.login();
|
|
|
|
cy.server();
|
2019-04-03 15:11:08 -04:00
|
|
|
cy.route('GET', '/superset/explore_json/**').as('getJson');
|
|
|
|
cy.route('POST', '/superset/explore_json/**').as('postJson');
|
2018-11-19 14:29:46 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
it('Defaults to the correct tab for time_range params', () => {
|
|
|
|
const formData = {
|
|
|
|
...FORM_DATA_DEFAULTS,
|
|
|
|
metrics: [NUM_METRIC],
|
|
|
|
viz_type: 'line',
|
|
|
|
time_range: '100 years ago : now',
|
|
|
|
};
|
|
|
|
|
|
|
|
cy.visitChartByParams(JSON.stringify(formData));
|
2019-04-03 15:11:08 -04:00
|
|
|
cy.verifySliceSuccess({ waitAlias: '@postJson' });
|
2018-11-19 14:29:46 -05:00
|
|
|
|
|
|
|
cy.get('[data-test=time_range]').within(() => {
|
|
|
|
cy.get('span.label').click();
|
|
|
|
});
|
|
|
|
|
|
|
|
cy.get('#filter-popover').within(() => {
|
|
|
|
cy.get('div.tab-pane.active').within(() => {
|
|
|
|
cy.get('div.PopoverSection :not(.dimmed)').within(() => {
|
|
|
|
cy.get('input[value="100 years ago"]');
|
|
|
|
cy.get('input[value="now"]');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2020-07-10 15:46:25 -04:00
|
|
|
cy.get('#filter-popover button').contains('Ok').click();
|
|
|
|
cy.get('#filter-popover').should('not.exist');
|
2018-11-19 14:29:46 -05:00
|
|
|
});
|
|
|
|
});
|
2020-09-15 17:12:06 -04:00
|
|
|
|
|
|
|
describe('Groupby control', () => {
|
|
|
|
it('Set groupby', () => {
|
|
|
|
cy.server();
|
|
|
|
cy.login();
|
|
|
|
cy.route('GET', '/superset/explore_json/**').as('getJson');
|
|
|
|
cy.route('POST', '/superset/explore_json/**').as('postJson');
|
|
|
|
cy.visitChartByName('Num Births Trend');
|
|
|
|
cy.verifySliceSuccess({ waitAlias: '@postJson' });
|
|
|
|
|
|
|
|
cy.get('[data-test=groupby]').within(() => {
|
|
|
|
cy.get('.Select__control').click();
|
|
|
|
cy.get('input[type=text]').type('state{enter}');
|
|
|
|
});
|
|
|
|
cy.get('button[data-test="run-query-button"]').click();
|
|
|
|
cy.verifySliceSuccess({ waitAlias: '@postJson', chartSelector: 'svg' });
|
|
|
|
});
|
|
|
|
});
|