superset-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ccwilli...@apache.org
Subject [incubator-superset] branch master updated: [lint] turn no-undef back on, set browser, cypress, and mocha env's (#5879)
Date Thu, 13 Sep 2018 21:45:31 GMT
This is an automated email from the ASF dual-hosted git repository.

ccwilliams pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git


The following commit(s) were added to refs/heads/master by this push:
     new b453cd2  [lint] turn no-undef back on, set browser, cypress, and mocha env's (#5879)
b453cd2 is described below

commit b453cd2bf20aa89d2cd6e7f0e7d8365074d502aa
Author: Chris Williams <williaster@users.noreply.github.com>
AuthorDate: Thu Sep 13 14:45:24 2018 -0700

    [lint] turn no-undef back on, set browser, cypress, and mocha env's (#5879)
    
    * [lint] turn no-undef back on, set browser, cypress, and mocha env's, and fix issues
    
    * [lint] fix undefined var in TimeTable.jsx
---
 superset/assets/.eslintrc                          |  5 +-
 superset/assets/cypress/.eslintrc                  |  8 +++
 .../integration/dashboard/dashboard_tests.js       |  4 +-
 .../cypress/integration/explore/control_tests.js   | 17 +++---
 .../explore/visualizations/big_number.js           | 30 ++++++-----
 .../integration/explore/visualizations/line.js     | 63 ++++++++++++++--------
 superset/assets/package.json                       |  1 +
 superset/assets/spec/.eslintrc                     |  3 ++
 superset/assets/spec/helpers/shim.js               |  3 +-
 .../spec/javascripts/CRUD/CollectionTable_spec.jsx |  1 -
 .../addSlice/AddSliceContainer_spec.jsx            |  1 -
 .../assets/spec/javascripts/chart/Chart_spec.jsx   |  1 -
 .../components/AlteredSliceTag_spec.jsx            |  1 -
 .../javascripts/components/AsyncSelect_spec.jsx    |  1 -
 .../javascripts/components/CachedLabel_spec.jsx    |  1 -
 .../spec/javascripts/components/Checkbox_spec.jsx  |  1 -
 .../javascripts/components/ColumnOption_spec.jsx   |  1 -
 .../components/ColumnTypeLabel_spec.jsx            |  1 -
 .../components/CopyToClipboard_spec.jsx            |  1 -
 .../FilterableTable/FilterableTable_spec.jsx       |  1 -
 .../javascripts/components/MetricOption_spec.jsx   |  1 -
 .../javascripts/components/ModalTrigger_spec.jsx   |  1 -
 .../javascripts/components/OnPasteSelect_spec.jsx  |  1 -
 .../components/OptionDescription_spec.jsx          |  1 -
 .../javascripts/components/PopoverSection_spec.jsx |  1 -
 .../components/URLShortLinkButton_spec.jsx         |  1 -
 .../components/URLShortLinkModal_spec.jsx          |  1 -
 .../components/VirtualizedRendererWrap_spec.jsx    |  1 -
 .../assets/spec/javascripts/dashboard/.eslintrc    |  1 -
 .../dashboard/actions/dashboardLayout_spec.js      |  1 -
 .../dashboard/components/CodeModal_spec.jsx        |  1 -
 .../dashboard/components/CssEditor_spec.jsx        |  1 -
 .../dashboard/components/DashboardBuilder_spec.jsx |  1 -
 .../dashboard/components/DashboardGrid_spec.jsx    |  1 -
 .../dashboard/components/Dashboard_spec.jsx        |  1 -
 .../components/HeaderActionsDropdown_spec.jsx      |  1 -
 .../dashboard/components/Header_spec.jsx           |  1 -
 .../dashboard/components/MissingChart_spec.jsx     |  1 -
 .../components/RefreshIntervalModal_spec.jsx       |  1 -
 .../dashboard/components/SliceAdder_spec.jsx       |  1 -
 .../components/dnd/DragDroppable_spec.jsx          |  1 -
 .../components/gridComponents/ChartHolder_spec.jsx |  1 -
 .../components/gridComponents/Chart_spec.jsx       |  1 -
 .../components/gridComponents/Column_spec.jsx      |  1 -
 .../components/gridComponents/Divider_spec.jsx     |  1 -
 .../components/gridComponents/Header_spec.jsx      |  1 -
 .../components/gridComponents/Markdown_spec.jsx    |  1 -
 .../components/gridComponents/Row_spec.jsx         |  1 -
 .../components/gridComponents/Tab_spec.jsx         |  1 -
 .../components/gridComponents/Tabs_spec.jsx        |  1 -
 .../new/DraggableNewComponent_spec.jsx             |  1 -
 .../gridComponents/new/NewColumn_spec.jsx          |  1 -
 .../gridComponents/new/NewDivider_spec.jsx         |  1 -
 .../gridComponents/new/NewHeader_spec.jsx          |  1 -
 .../components/gridComponents/new/NewRow_spec.jsx  |  1 -
 .../components/gridComponents/new/NewTabs_spec.jsx |  1 -
 .../dashboard/components/menu/HoverMenu_spec.jsx   |  1 -
 .../components/menu/WithPopoverMenu_spec.jsx       |  1 -
 .../resizable/ResizableContainer_spec.jsx          |  1 -
 .../components/resizable/ResizableHandle_spec.jsx  |  1 -
 .../dashboard/reducers/dashboardLayout_spec.js     |  1 -
 .../dashboard/reducers/dashboardState_spec.js      |  1 -
 .../dashboard/reducers/sliceEntities_spec.js       |  1 -
 .../dashboard/util/componentIsResizable_spec.js    |  1 -
 .../javascripts/dashboard/util/dnd-reorder_spec.js |  1 -
 .../dashboard/util/dropOverflowsParent_spec.js     |  1 -
 .../util/findFirstParentContainer_spec.js          |  1 -
 .../dashboard/util/findParentId_spec.js            |  1 -
 .../dashboard/util/getChartIdsFromLayout_spec.js   |  1 -
 .../dashboard/util/getDashboardUrl_spec.js         |  1 -
 .../util/getDetailedComponentWidth_spec.js         |  1 -
 .../dashboard/util/getDropPosition_spec.js         |  1 -
 .../util/getFormDataWithExtraFilters_spec.js       |  1 -
 .../dashboard/util/isValidChild_spec.js            |  1 -
 .../dashboard/util/newComponentFactory_spec.js     |  1 -
 .../dashboard/util/newEntitiesFromDrop_spec.js     |  1 -
 .../datasource/DatasourceEditor_spec.jsx           |  1 -
 .../datasource/DatasourceModal_spec.jsx            |  1 -
 .../spec/javascripts/explore/AdhocFilter_spec.js   |  1 -
 .../spec/javascripts/explore/AdhocMetric_spec.js   |  1 -
 .../spec/javascripts/explore/chartActions_spec.js  |  1 -
 .../explore/components/AdhocFilterControl_spec.jsx |  1 -
 ...AdhocFilterEditPopoverSimpleTabContent_spec.jsx |  1 -
 .../AdhocFilterEditPopoverSqlTabContent_spec.jsx   |  1 -
 .../components/AdhocFilterEditPopover_spec.jsx     |  1 -
 .../explore/components/AdhocFilterOption_spec.jsx  |  1 -
 .../AdhocMetricEditPopoverTitle_spec.jsx           |  1 -
 .../components/AdhocMetricEditPopover_spec.jsx     |  1 -
 .../explore/components/AdhocMetricOption_spec.jsx  |  1 -
 .../components/AdhocMetricStaticOption_spec.jsx    |  1 -
 .../explore/components/AggregateOption_spec.jsx    |  1 -
 .../explore/components/BoundsControl_spec.jsx      |  1 -
 .../explore/components/CheckboxControl_spec.jsx    |  1 -
 .../explore/components/ColorPickerControl_spec.jsx |  1 -
 .../explore/components/ColorScheme_spec.jsx        |  1 -
 .../components/ControlPanelSection_spec.jsx        |  1 -
 .../components/ControlPanelsContainer_spec.jsx     |  1 -
 .../explore/components/ControlRow_spec.jsx         |  1 -
 .../explore/components/DatasourceControl_spec.jsx  |  1 -
 .../explore/components/DateFilterControl_spec.jsx  |  1 -
 .../explore/components/DisplayQueryButton_spec.jsx |  1 -
 .../explore/components/EmbedCodeButton_spec.jsx    |  1 -
 .../components/ExploreActionButtons_spec.jsx       |  1 -
 .../explore/components/ExploreChartHeader_spec.jsx |  1 -
 .../explore/components/ExploreChartPanel_spec.js   |  3 +-
 .../components/ExploreViewContainer_spec.js        |  3 +-
 .../components/FilterDefinitionOption_spec.jsx     |  1 -
 .../components/FixedOrMetricControl_spec.jsx       |  1 -
 .../components/MetricDefinitionOption_spec.jsx     |  1 -
 .../components/MetricDefinitionValue_spec.jsx      |  1 -
 .../explore/components/MetricsControl_spec.jsx     |  1 -
 .../explore/components/QueryAndSaveBtns_spec.jsx   |  1 -
 .../explore/components/RowCountLabel_spec.jsx      |  1 -
 .../components/RunQueryActionButton_spec.jsx       |  1 -
 .../explore/components/SaveModal_spec.jsx          |  1 -
 .../explore/components/SelectControl_spec.jsx      |  1 -
 .../explore/components/TextArea_spec.jsx           |  1 -
 .../components/TimeSeriesColumnControl_spec.jsx    |  1 -
 .../explore/components/ViewportControl_spec.jsx    |  1 -
 .../explore/components/VizTypeControl_spec.jsx     |  1 -
 .../javascripts/explore/exploreActions_spec.js     |  1 -
 .../assets/spec/javascripts/explore/utils_spec.jsx |  1 -
 superset/assets/spec/javascripts/logger_spec.js    |  1 -
 .../spec/javascripts/messageToasts/.eslintrc       |  1 -
 .../components/ToastPresenter_spec.jsx             |  1 -
 .../messageToasts/components/Toast_spec.jsx        |  1 -
 .../messageToasts/reducers/messageToasts_spec.js   |  1 -
 .../utils/getToastsFromPyFlashMessages_spec.js     |  1 -
 .../spec/javascripts/modules/colors_spec.jsx       |  1 -
 .../assets/spec/javascripts/modules/dates_spec.js  |  3 +-
 .../assets/spec/javascripts/modules/geo_spec.jsx   |  1 -
 .../spec/javascripts/modules/sandbox_spec.jsx      |  1 -
 .../assets/spec/javascripts/modules/time_spec.js   |  3 +-
 .../assets/spec/javascripts/modules/utils_spec.jsx |  3 +-
 .../assets/spec/javascripts/profile/App_spec.jsx   |  1 -
 .../javascripts/profile/CreatedContent_spec.jsx    |  1 -
 .../javascripts/profile/EditableTitle_spec.jsx     |  1 -
 .../spec/javascripts/profile/Favorites_spec.jsx    |  1 -
 .../javascripts/profile/RecentActivity_spec.jsx    |  1 -
 .../spec/javascripts/profile/Security_spec.jsx     |  1 -
 .../spec/javascripts/profile/UserInfo_spec.jsx     |  1 -
 .../assets/spec/javascripts/sqllab/App_spec.jsx    |  1 -
 .../spec/javascripts/sqllab/ColumnElement_spec.jsx |  1 -
 .../javascripts/sqllab/CopyQueryTabUrl_spec.jsx    |  1 -
 .../sqllab/ExploreResultsButton_spec.jsx           |  1 -
 .../javascripts/sqllab/HighlightedSql_spec.jsx     |  1 -
 .../assets/spec/javascripts/sqllab/Link_spec.jsx   |  1 -
 .../spec/javascripts/sqllab/QuerySearch_spec.jsx   |  1 -
 .../javascripts/sqllab/QueryStateLabel_spec.jsx    |  1 -
 .../spec/javascripts/sqllab/QueryTable_spec.jsx    |  1 -
 .../spec/javascripts/sqllab/ResultSet_spec.jsx     |  1 -
 .../spec/javascripts/sqllab/SaveQuery_spec.jsx     |  1 -
 .../javascripts/sqllab/SqlEditorLeftBar_spec.jsx   |  1 -
 .../spec/javascripts/sqllab/SqlEditor_spec.jsx     |  1 -
 .../spec/javascripts/sqllab/TabStatusIcon_spec.jsx |  1 -
 .../javascripts/sqllab/TabbedSqlEditors_spec.jsx   |  1 -
 .../spec/javascripts/sqllab/TableElement_spec.jsx  |  1 -
 .../assets/spec/javascripts/sqllab/Timer_spec.jsx  |  1 -
 .../assets/spec/javascripts/sqllab/actions_spec.js |  1 -
 .../spec/javascripts/sqllab/reducers_spec.js       |  1 -
 .../assets/spec/javascripts/utils/common_spec.jsx  |  1 -
 .../javascripts/visualizations/nvd3_viz_spec.jsx   |  1 -
 .../spec/javascripts/visualizations/table_spec.jsx |  1 -
 .../javascripts/welcome/DashboardTable_spec.jsx    |  2 +-
 .../spec/javascripts/welcome/Welcome_spec.jsx      |  1 -
 superset/assets/src/SqlLab/App.jsx                 |  1 +
 superset/assets/src/SqlLab/actions.js              |  2 -
 .../src/SqlLab/components/ExploreResultsButton.jsx |  1 -
 .../assets/src/SqlLab/components/QuerySearch.jsx   |  1 -
 .../assets/src/SqlLab/components/SqlEditor.jsx     |  2 -
 .../src/SqlLab/components/SqlEditorLeftBar.jsx     |  2 -
 superset/assets/src/SqlLab/getInitialState.js      |  1 -
 superset/assets/src/SqlLab/reducers.js             |  1 +
 superset/assets/src/chart/Chart.jsx                |  1 -
 superset/assets/src/dashboard/.eslintrc            |  1 -
 .../assets/src/dashboard/components/Dashboard.jsx  |  1 -
 .../dashboard/components/HeaderActionsDropdown.jsx |  1 -
 .../assets/src/datasource/DatasourceEditor.jsx     |  5 +-
 superset/assets/src/explore/App.jsx                |  1 -
 .../assets/src/explore/actions/exploreActions.js   |  6 +++
 .../AdhocFilterEditPopoverSqlTabContent.jsx        |  1 +
 .../explore/components/AdhocMetricEditPopover.jsx  |  1 +
 .../components/controls/DatasourceControl.jsx      |  1 -
 .../components/controls/SelectAsyncControl.jsx     |  1 -
 superset/assets/src/messageToasts/.eslintrc        |  1 -
 .../src/visualizations/BigNumber/BigNumber.jsx     |  1 +
 .../src/visualizations/BigNumber/adaptor.jsx       |  1 +
 .../assets/src/visualizations/MapBox/MapBox.jsx    |  4 +-
 .../src/visualizations/TimeTable/TimeTable.jsx     |  2 +-
 .../src/visualizations/deckgl/layers/common.js     |  1 +
 .../src/visualizations/deckgl/layers/geojson.jsx   |  4 +-
 superset/assets/src/visualizations/line_multi.js   |  3 +-
 superset/assets/yarn.lock                          |  6 +++
 193 files changed, 118 insertions(+), 237 deletions(-)

diff --git a/superset/assets/.eslintrc b/superset/assets/.eslintrc
index e49a4e0..c85c957 100644
--- a/superset/assets/.eslintrc
+++ b/superset/assets/.eslintrc
@@ -6,8 +6,8 @@
       "experimentalObjectRestSpread": true
     }
   },
-  "globals": {
-    "document": true,
+  "env": {
+    "browser": true
   },
   "rules": {
     "prefer-template": 0,
@@ -26,7 +26,6 @@
     "no-mixed-operators": 0,
     "no-continue": 0,
     "no-bitwise": 0,
-    "no-undef": 0,
     "no-multi-assign": 0,
     "react/no-array-index-key": 0,
     "no-restricted-properties": 0,
diff --git a/superset/assets/cypress/.eslintrc b/superset/assets/cypress/.eslintrc
new file mode 100644
index 0000000..5b98856
--- /dev/null
+++ b/superset/assets/cypress/.eslintrc
@@ -0,0 +1,8 @@
+{
+  "plugins": [
+    "cypress"
+  ],
+  "env": {
+    "cypress/globals": true
+  }
+}
diff --git a/superset/assets/cypress/integration/dashboard/dashboard_tests.js b/superset/assets/cypress/integration/dashboard/dashboard_tests.js
index 10e4f11..31ce704 100644
--- a/superset/assets/cypress/integration/dashboard/dashboard_tests.js
+++ b/superset/assets/cypress/integration/dashboard/dashboard_tests.js
@@ -1,5 +1,5 @@
-describe('Load dashboard', function () {
-  it('Load birth names dashboard', function () {
+describe('Load dashboard', () => {
+  it('Load birth names dashboard', () => {
     cy.server();
     cy.login();
 
diff --git a/superset/assets/cypress/integration/explore/control_tests.js b/superset/assets/cypress/integration/explore/control_tests.js
index 1c95f04..a742d6d 100644
--- a/superset/assets/cypress/integration/explore/control_tests.js
+++ b/superset/assets/cypress/integration/explore/control_tests.js
@@ -2,8 +2,8 @@
 // Tests for setting controls in the UI
 // ***********************************************
 
-describe('Groupby', function () {
-  it('Set groupby', function () {
+describe('Groupby', () => {
+  it('Set groupby', () => {
     cy.server();
     cy.login();
 
@@ -21,8 +21,8 @@ describe('Groupby', function () {
   });
 });
 
-describe('SimpleAdhocMetric', function () {
-  it('Clear metric and set simple adhoc metric', function () {
+describe('SimpleAdhocMetric', () => {
+  it('Clear metric and set simple adhoc metric', () => {
     cy.server();
     cy.login();
 
@@ -36,7 +36,9 @@ describe('SimpleAdhocMetric', function () {
       cy.get('.select-clear').click();
       cy.get('.Select-control').click({ force: true });
       cy.get('input').type('sum_girls', { force: true });
-      cy.get('.VirtualizedSelectFocusedOption').trigger('mousedown').click();
+      cy.get('.VirtualizedSelectFocusedOption')
+        .trigger('mousedown')
+        .click();
     });
 
     cy.get('#metrics-edit-popover').within(() => {
@@ -44,7 +46,9 @@ describe('SimpleAdhocMetric', function () {
         cy.get('span').click();
         cy.get('input').type(metricName);
       });
-      cy.get('button').contains('Save').click();
+      cy.get('button')
+        .contains('Save')
+        .click();
     });
 
     cy.get('button.query').click();
@@ -56,4 +60,3 @@ describe('SimpleAdhocMetric', function () {
     });
   });
 });
-
diff --git a/superset/assets/cypress/integration/explore/visualizations/big_number.js b/superset/assets/cypress/integration/explore/visualizations/big_number.js
index 1ee49eb..c6bca9e 100644
--- a/superset/assets/cypress/integration/explore/visualizations/big_number.js
+++ b/superset/assets/cypress/integration/explore/visualizations/big_number.js
@@ -2,10 +2,10 @@ import { FORM_DATA_DEFAULTS, NUM_METRIC } from './shared.helper';
 
 // Big Number Total
 
-describe('Big Number Total', function () {
+describe('Big Number Total', () => {
   const BIG_NUMBER_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'big_number_total' };
 
-  it('Test big number chart with adhoc metric', function () {
+  it('Test big number chart with adhoc metric', () => {
     cy.server();
     cy.login();
 
@@ -16,20 +16,22 @@ describe('Big Number Total', function () {
     cy.verifySliceSuccess({ waitAlias: '@getJson', querySubstring: NUM_METRIC.label });
   });
 
-  it('Test big number chart with simple filter', function () {
+  it('Test big number chart with simple filter', () => {
     cy.server();
     cy.login();
 
-    const filters = [{
-      expressionType: 'SIMPLE',
-      subject: 'name',
-      operator: 'in',
-      comparator: ['Aaron', 'Amy', 'Andrea'],
-      clause: 'WHERE',
-      sqlExpression: null,
-      fromFormData: true,
-      filterOptionName: 'filter_4y6teao56zs_ebjsvwy48c',
-    }];
+    const filters = [
+      {
+        expressionType: 'SIMPLE',
+        subject: 'name',
+        operator: 'in',
+        comparator: ['Aaron', 'Amy', 'Andrea'],
+        clause: 'WHERE',
+        sqlExpression: null,
+        fromFormData: true,
+        filterOptionName: 'filter_4y6teao56zs_ebjsvwy48c',
+      },
+    ];
 
     const formData = { ...BIG_NUMBER_DEFAULTS, metric: 'count', adhoc_filters: filters };
 
@@ -38,7 +40,7 @@ describe('Big Number Total', function () {
     cy.verifySliceSuccess({ waitAlias: '@getJson' });
   });
 
-  it('Test big number chart ignores groupby', function () {
+  it('Test big number chart ignores groupby', () => {
     cy.server();
     cy.login();
 
diff --git a/superset/assets/cypress/integration/explore/visualizations/line.js b/superset/assets/cypress/integration/explore/visualizations/line.js
index 7bac091..dc4e7d4 100644
--- a/superset/assets/cypress/integration/explore/visualizations/line.js
+++ b/superset/assets/cypress/integration/explore/visualizations/line.js
@@ -1,9 +1,9 @@
 import { FORM_DATA_DEFAULTS, NUM_METRIC } from './shared.helper';
 
-describe('Line', function () {
+describe('Line', () => {
   const LINE_CHART_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'line' };
 
-  it('Test line chart with adhoc metric', function () {
+  it('Test line chart with adhoc metric', () => {
     cy.server();
     cy.login();
 
@@ -14,7 +14,7 @@ describe('Line', function () {
     cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' });
   });
 
-  it('Test line chart with groupby', function () {
+  it('Test line chart with groupby', () => {
     cy.server();
     cy.login();
 
@@ -28,21 +28,23 @@ describe('Line', function () {
     cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' });
   });
 
-  it('Test line chart with simple filter', function () {
+  it('Test line chart with simple filter', () => {
     cy.server();
     cy.login();
 
     const metrics = ['count'];
-    const filters = [{
-      expressionType: 'SIMPLE',
-      subject: 'name',
-      operator: 'in',
-      comparator: ['Aaron', 'Amy', 'Andrea'],
-      clause: 'WHERE',
-      sqlExpression: null,
-      fromFormData: true,
-      filterOptionName: 'filter_4y6teao56zs_ebjsvwy48c',
-    }];
+    const filters = [
+      {
+        expressionType: 'SIMPLE',
+        subject: 'name',
+        operator: 'in',
+        comparator: ['Aaron', 'Amy', 'Andrea'],
+        clause: 'WHERE',
+        sqlExpression: null,
+        fromFormData: true,
+        filterOptionName: 'filter_4y6teao56zs_ebjsvwy48c',
+      },
+    ];
 
     const formData = { ...LINE_CHART_DEFAULTS, metrics, adhoc_filters: filters };
 
@@ -51,7 +53,7 @@ describe('Line', function () {
     cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' });
   });
 
-  it('Test line chart with series limit sort asc', function () {
+  it('Test line chart with series limit sort asc', () => {
     cy.server();
     cy.login();
 
@@ -68,7 +70,7 @@ describe('Line', function () {
     cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' });
   });
 
-  it('Test line chart with series limit sort desc', function () {
+  it('Test line chart with series limit sort desc', () => {
     cy.server();
     cy.login();
 
@@ -86,7 +88,7 @@ describe('Line', function () {
     cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' });
   });
 
-  it('Test line chart with rolling avg', function () {
+  it('Test line chart with rolling avg', () => {
     cy.server();
     cy.login();
 
@@ -99,39 +101,54 @@ describe('Line', function () {
     cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' });
   });
 
-  it('Test line chart with time shift 1 year', function () {
+  it('Test line chart with time shift 1 year', () => {
     cy.server();
     cy.login();
 
     const metrics = [NUM_METRIC];
 
-    const formData = { ...LINE_CHART_DEFAULTS, metrics, time_compare: ['1+year'], comparison_type: 'values' };
+    const formData = {
+      ...LINE_CHART_DEFAULTS,
+      metrics,
+      time_compare: ['1+year'],
+      comparison_type: 'values',
+    };
 
     cy.route('POST', '/superset/explore_json/**').as('getJson');
     cy.visitChartByParams(JSON.stringify(formData));
     cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' });
   });
 
-  it('Test line chart with time shift yoy', function () {
+  it('Test line chart with time shift yoy', () => {
     cy.server();
     cy.login();
 
     const metrics = [NUM_METRIC];
 
-    const formData = { ...LINE_CHART_DEFAULTS, metrics, time_compare: ['1+year'], comparison_type: 'ratio' };
+    const formData = {
+      ...LINE_CHART_DEFAULTS,
+      metrics,
+      time_compare: ['1+year'],
+      comparison_type: 'ratio',
+    };
 
     cy.route('POST', '/superset/explore_json/**').as('getJson');
     cy.visitChartByParams(JSON.stringify(formData));
     cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' });
   });
 
-  it('Test line chart with time shift percentage change', function () {
+  it('Test line chart with time shift percentage change', () => {
     cy.server();
     cy.login();
 
     const metrics = [NUM_METRIC];
 
-    const formData = { ...LINE_CHART_DEFAULTS, metrics, time_compare: ['1+year'], comparison_type: 'percentage' };
+    const formData = {
+      ...LINE_CHART_DEFAULTS,
+      metrics,
+      time_compare: ['1+year'],
+      comparison_type: 'percentage',
+    };
 
     cy.route('POST', '/superset/explore_json/**').as('getJson');
     cy.visitChartByParams(JSON.stringify(formData));
diff --git a/superset/assets/package.json b/superset/assets/package.json
index 11b2b77..d5571e0 100644
--- a/superset/assets/package.json
+++ b/superset/assets/package.json
@@ -150,6 +150,7 @@
     "eslint": "^4.19.0",
     "eslint-config-airbnb": "^15.0.1",
     "eslint-config-prettier": "^2.9.0",
+    "eslint-plugin-cypress": "^2.0.1",
     "eslint-plugin-import": "^2.2.0",
     "eslint-plugin-jsx-a11y": "^5.1.1",
     "eslint-plugin-prettier": "^2.6.0",
diff --git a/superset/assets/spec/.eslintrc b/superset/assets/spec/.eslintrc
index d9889af..5b4214b 100644
--- a/superset/assets/spec/.eslintrc
+++ b/superset/assets/spec/.eslintrc
@@ -1,4 +1,7 @@
 {
+  "env": {
+    "mocha": true
+  },
   "rules": {
     "import/no-extraneous-dependencies": ["error", {"devDependencies": true}]
   }
diff --git a/superset/assets/spec/helpers/shim.js b/superset/assets/spec/helpers/shim.js
index 0d48341..6decdc9 100644
--- a/superset/assets/spec/helpers/shim.js
+++ b/superset/assets/spec/helpers/shim.js
@@ -1,4 +1,4 @@
-/* eslint no-undef: 0, no-native-reassign: 0 */
+/* eslint no-native-reassign: 0 */
 import 'babel-polyfill';
 import chai from 'chai';
 import jsdom from 'jsdom';
@@ -55,4 +55,3 @@ global.window.XMLHttpRequest = global.XMLHttpRequest;
 global.window.location = { href: 'about:blank' };
 global.window.performance = { now: () => new Date().getTime() };
 global.$ = require('jquery')(global.window);
-
diff --git a/superset/assets/spec/javascripts/CRUD/CollectionTable_spec.jsx b/superset/assets/spec/javascripts/CRUD/CollectionTable_spec.jsx
index 6955688..20bc359 100644
--- a/superset/assets/spec/javascripts/CRUD/CollectionTable_spec.jsx
+++ b/superset/assets/spec/javascripts/CRUD/CollectionTable_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 
 import CollectionTable from '../../../src/CRUD/CollectionTable';
diff --git a/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx b/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx
index 96ed089..de242ba 100644
--- a/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx
+++ b/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 import { Button } from 'react-bootstrap';
 import Select from 'react-virtualized-select';
diff --git a/superset/assets/spec/javascripts/chart/Chart_spec.jsx b/superset/assets/spec/javascripts/chart/Chart_spec.jsx
index d1e3f37..e5c0bb9 100644
--- a/superset/assets/spec/javascripts/chart/Chart_spec.jsx
+++ b/superset/assets/spec/javascripts/chart/Chart_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/components/AlteredSliceTag_spec.jsx b/superset/assets/spec/javascripts/components/AlteredSliceTag_spec.jsx
index 8670069..316ac34 100644
--- a/superset/assets/spec/javascripts/components/AlteredSliceTag_spec.jsx
+++ b/superset/assets/spec/javascripts/components/AlteredSliceTag_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import { Table, Thead, Td, Th, Tr } from 'reactable';
diff --git a/superset/assets/spec/javascripts/components/AsyncSelect_spec.jsx b/superset/assets/spec/javascripts/components/AsyncSelect_spec.jsx
index 98d8b51..7401eae 100644
--- a/superset/assets/spec/javascripts/components/AsyncSelect_spec.jsx
+++ b/superset/assets/spec/javascripts/components/AsyncSelect_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import Select from 'react-select';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/components/CachedLabel_spec.jsx b/superset/assets/spec/javascripts/components/CachedLabel_spec.jsx
index 8a7f74a..8358b49 100644
--- a/superset/assets/spec/javascripts/components/CachedLabel_spec.jsx
+++ b/superset/assets/spec/javascripts/components/CachedLabel_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import { Label } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/components/Checkbox_spec.jsx b/superset/assets/spec/javascripts/components/Checkbox_spec.jsx
index b53fbfa..8b74d12 100644
--- a/superset/assets/spec/javascripts/components/Checkbox_spec.jsx
+++ b/superset/assets/spec/javascripts/components/Checkbox_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import sinon from 'sinon';
 import { shallow } from 'enzyme';
 
diff --git a/superset/assets/spec/javascripts/components/ColumnOption_spec.jsx b/superset/assets/spec/javascripts/components/ColumnOption_spec.jsx
index 1c531a1..04529e1 100644
--- a/superset/assets/spec/javascripts/components/ColumnOption_spec.jsx
+++ b/superset/assets/spec/javascripts/components/ColumnOption_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import ColumnOption from '../../../src/components/ColumnOption';
diff --git a/superset/assets/spec/javascripts/components/ColumnTypeLabel_spec.jsx b/superset/assets/spec/javascripts/components/ColumnTypeLabel_spec.jsx
index 9e3cfe8..587469f 100644
--- a/superset/assets/spec/javascripts/components/ColumnTypeLabel_spec.jsx
+++ b/superset/assets/spec/javascripts/components/ColumnTypeLabel_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import ColumnTypeLabel from '../../../src/components/ColumnTypeLabel';
diff --git a/superset/assets/spec/javascripts/components/CopyToClipboard_spec.jsx b/superset/assets/spec/javascripts/components/CopyToClipboard_spec.jsx
index 84357d7..f8a0426 100644
--- a/superset/assets/spec/javascripts/components/CopyToClipboard_spec.jsx
+++ b/superset/assets/spec/javascripts/components/CopyToClipboard_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 
 import CopyToClipboard from '../../../src/components/CopyToClipboard';
 
diff --git a/superset/assets/spec/javascripts/components/FilterableTable/FilterableTable_spec.jsx b/superset/assets/spec/javascripts/components/FilterableTable/FilterableTable_spec.jsx
index 81c8f15..5232d8a 100644
--- a/superset/assets/spec/javascripts/components/FilterableTable/FilterableTable_spec.jsx
+++ b/superset/assets/spec/javascripts/components/FilterableTable/FilterableTable_spec.jsx
@@ -1,5 +1,4 @@
 import React from 'react';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import { mount } from 'enzyme';
 import FilterableTable from '../../../../src/components/FilterableTable/FilterableTable';
diff --git a/superset/assets/spec/javascripts/components/MetricOption_spec.jsx b/superset/assets/spec/javascripts/components/MetricOption_spec.jsx
index 7af2ceb..3fd9230 100644
--- a/superset/assets/spec/javascripts/components/MetricOption_spec.jsx
+++ b/superset/assets/spec/javascripts/components/MetricOption_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import MetricOption from '../../../src/components/MetricOption';
diff --git a/superset/assets/spec/javascripts/components/ModalTrigger_spec.jsx b/superset/assets/spec/javascripts/components/ModalTrigger_spec.jsx
index 6f132a9..41adf12 100644
--- a/superset/assets/spec/javascripts/components/ModalTrigger_spec.jsx
+++ b/superset/assets/spec/javascripts/components/ModalTrigger_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 
 import ModalTrigger from '../../../src/components/ModalTrigger';
 
diff --git a/superset/assets/spec/javascripts/components/OnPasteSelect_spec.jsx b/superset/assets/spec/javascripts/components/OnPasteSelect_spec.jsx
index 278a1ac..43b5a26 100644
--- a/superset/assets/spec/javascripts/components/OnPasteSelect_spec.jsx
+++ b/superset/assets/spec/javascripts/components/OnPasteSelect_spec.jsx
@@ -3,7 +3,6 @@ import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import VirtualizedSelect from 'react-virtualized-select';
 import Select, { Creatable } from 'react-select';
 
diff --git a/superset/assets/spec/javascripts/components/OptionDescription_spec.jsx b/superset/assets/spec/javascripts/components/OptionDescription_spec.jsx
index cf45332..4b818e1 100644
--- a/superset/assets/spec/javascripts/components/OptionDescription_spec.jsx
+++ b/superset/assets/spec/javascripts/components/OptionDescription_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import InfoTooltipWithTrigger from '../../../src/components/InfoTooltipWithTrigger';
diff --git a/superset/assets/spec/javascripts/components/PopoverSection_spec.jsx b/superset/assets/spec/javascripts/components/PopoverSection_spec.jsx
index e5a17b7..33826fe 100644
--- a/superset/assets/spec/javascripts/components/PopoverSection_spec.jsx
+++ b/superset/assets/spec/javascripts/components/PopoverSection_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import PopoverSection from '../../../src/components/PopoverSection';
diff --git a/superset/assets/spec/javascripts/components/URLShortLinkButton_spec.jsx b/superset/assets/spec/javascripts/components/URLShortLinkButton_spec.jsx
index 1aa0074..67edd08 100644
--- a/superset/assets/spec/javascripts/components/URLShortLinkButton_spec.jsx
+++ b/superset/assets/spec/javascripts/components/URLShortLinkButton_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import configureStore from 'redux-mock-store';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import { OverlayTrigger } from 'react-bootstrap';
diff --git a/superset/assets/spec/javascripts/components/URLShortLinkModal_spec.jsx b/superset/assets/spec/javascripts/components/URLShortLinkModal_spec.jsx
index 494d0d3..6311262 100644
--- a/superset/assets/spec/javascripts/components/URLShortLinkModal_spec.jsx
+++ b/superset/assets/spec/javascripts/components/URLShortLinkModal_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import configureStore from 'redux-mock-store';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import URLShortLinkModal from '../../../src/components/URLShortLinkModal';
diff --git a/superset/assets/spec/javascripts/components/VirtualizedRendererWrap_spec.jsx b/superset/assets/spec/javascripts/components/VirtualizedRendererWrap_spec.jsx
index e793fef..a854f7e 100644
--- a/superset/assets/spec/javascripts/components/VirtualizedRendererWrap_spec.jsx
+++ b/superset/assets/spec/javascripts/components/VirtualizedRendererWrap_spec.jsx
@@ -3,7 +3,6 @@ import React from 'react';
 import sinon from 'sinon';
 import PropTypes from 'prop-types';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import VirtualizedRendererWrap from '../../../src/components/VirtualizedRendererWrap';
diff --git a/superset/assets/spec/javascripts/dashboard/.eslintrc b/superset/assets/spec/javascripts/dashboard/.eslintrc
index a3f86e3..36759a2 100644
--- a/superset/assets/spec/javascripts/dashboard/.eslintrc
+++ b/superset/assets/spec/javascripts/dashboard/.eslintrc
@@ -17,7 +17,6 @@
     "no-mixed-operators": 0,
     "no-continue": 2,
     "no-bitwise": 2,
-    "no-undef": 2,
     "no-multi-assign": 2,
     "no-restricted-properties": 2,
     "no-prototype-builtins": 2,
diff --git a/superset/assets/spec/javascripts/dashboard/actions/dashboardLayout_spec.js b/superset/assets/spec/javascripts/dashboard/actions/dashboardLayout_spec.js
index e58bb11..5be1191 100644
--- a/superset/assets/spec/javascripts/dashboard/actions/dashboardLayout_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/actions/dashboardLayout_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/CodeModal_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/CodeModal_spec.jsx
index d316dc3..094e1ee 100644
--- a/superset/assets/spec/javascripts/dashboard/components/CodeModal_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/CodeModal_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import CodeModal from '../../../../src/dashboard/components/CodeModal';
diff --git a/superset/assets/spec/javascripts/dashboard/components/CssEditor_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/CssEditor_spec.jsx
index 8c991fa..d630fe9 100644
--- a/superset/assets/spec/javascripts/dashboard/components/CssEditor_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/CssEditor_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import CssEditor from '../../../../src/dashboard/components/CssEditor';
diff --git a/superset/assets/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx
index 4c3185f..7215e08 100644
--- a/superset/assets/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx
@@ -1,7 +1,6 @@
 import { Provider } from 'react-redux';
 import React from 'react';
 import { shallow, mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import ParentSize from '@vx/responsive/build/components/ParentSize';
diff --git a/superset/assets/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx
index d11c37f..83f9760 100644
--- a/superset/assets/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/Dashboard_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/Dashboard_spec.jsx
index aa64463..76ff388 100644
--- a/superset/assets/spec/javascripts/dashboard/components/Dashboard_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/Dashboard_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx
index 673118b..199b3d2 100644
--- a/superset/assets/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx
@@ -1,5 +1,4 @@
 import React from 'react';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import { shallow } from 'enzyme';
 import { DropdownButton, MenuItem } from 'react-bootstrap';
diff --git a/superset/assets/spec/javascripts/dashboard/components/Header_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/Header_spec.jsx
index e7ecfc1..28153bb 100644
--- a/superset/assets/spec/javascripts/dashboard/components/Header_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/Header_spec.jsx
@@ -1,5 +1,4 @@
 import React from 'react';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import { shallow } from 'enzyme';
 import Header from '../../../../src/dashboard/components/Header';
diff --git a/superset/assets/spec/javascripts/dashboard/components/MissingChart_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/MissingChart_spec.jsx
index 92a18c1..e43f114 100644
--- a/superset/assets/spec/javascripts/dashboard/components/MissingChart_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/MissingChart_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import Loading from '../../../../src/components/Loading';
diff --git a/superset/assets/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx
index 564857c..7df7575 100644
--- a/superset/assets/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import RefreshIntervalModal from '../../../../src/dashboard/components/RefreshIntervalModal';
diff --git a/superset/assets/spec/javascripts/dashboard/components/SliceAdder_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/SliceAdder_spec.jsx
index da0f7df..704eb52 100644
--- a/superset/assets/spec/javascripts/dashboard/components/SliceAdder_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/SliceAdder_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it, beforeEach, afterEach } from 'mocha';
 import sinon from 'sinon';
 import { expect } from 'chai';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx
index c7e2c2a..b45e9d8 100644
--- a/superset/assets/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow, mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx
index 821b637..a2e50e8 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx
@@ -1,7 +1,6 @@
 import { Provider } from 'react-redux';
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx
index dbd7054..db8b45a 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx
index e97414b..a0fbffd 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx
@@ -1,7 +1,6 @@
 import { Provider } from 'react-redux';
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx
index c8317f8..0542532 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx
index 1d54775..f21f106 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx
index 9046089..f3aceee 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx
@@ -1,7 +1,6 @@
 import { Provider } from 'react-redux';
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 import AceEditor from 'react-ace';
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx
index a718ff4..54037c7 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx
@@ -1,7 +1,6 @@
 import { Provider } from 'react-redux';
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx
index fae59b2..1162e84 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx
@@ -1,7 +1,6 @@
 import { Provider } from 'react-redux';
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx
index d521fe5..16f4360 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx
@@ -1,7 +1,6 @@
 import { Provider } from 'react-redux';
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 import { Tabs as BootstrapTabs, Tab as BootstrapTab } from 'react-bootstrap';
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx
index 4334b37..9e2993a 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import DragDroppable from '../../../../../../src/dashboard/components/dnd/DragDroppable';
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx
index cb07cb9..240cf5e 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx
index 71703b3..af96f60 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx
index a499fe8..5f2194c 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx
index e91893d..b86d167 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
diff --git a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx
index 4e71c8c..edd13b7 100644
--- a/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
diff --git a/superset/assets/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx
index 1f85085..3d0fca7 100644
--- a/superset/assets/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import HoverMenu from '../../../../../src/dashboard/components/menu/HoverMenu';
diff --git a/superset/assets/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx
index 5add770..d382d25 100644
--- a/superset/assets/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import WithPopoverMenu from '../../../../../src/dashboard/components/menu/WithPopoverMenu';
diff --git a/superset/assets/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx
index 69fca76..be4ae7c 100644
--- a/superset/assets/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import Resizable from 're-resizable';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import ResizableContainer from '../../../../../src/dashboard/components/resizable/ResizableContainer';
diff --git a/superset/assets/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx
index 0c37855..66e4286 100644
--- a/superset/assets/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx
+++ b/superset/assets/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import ResizableHandle from '../../../../../src/dashboard/components/resizable/ResizableHandle';
diff --git a/superset/assets/spec/javascripts/dashboard/reducers/dashboardLayout_spec.js b/superset/assets/spec/javascripts/dashboard/reducers/dashboardLayout_spec.js
index dd933ac..1b805e0 100644
--- a/superset/assets/spec/javascripts/dashboard/reducers/dashboardLayout_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/reducers/dashboardLayout_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import layoutReducer from '../../../../src/dashboard/reducers/dashboardLayout';
diff --git a/superset/assets/spec/javascripts/dashboard/reducers/dashboardState_spec.js b/superset/assets/spec/javascripts/dashboard/reducers/dashboardState_spec.js
index 7772f71..a8e3dbd 100644
--- a/superset/assets/spec/javascripts/dashboard/reducers/dashboardState_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/reducers/dashboardState_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import {
diff --git a/superset/assets/spec/javascripts/dashboard/reducers/sliceEntities_spec.js b/superset/assets/spec/javascripts/dashboard/reducers/sliceEntities_spec.js
index 7e3bb76..df43ae5 100644
--- a/superset/assets/spec/javascripts/dashboard/reducers/sliceEntities_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/reducers/sliceEntities_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import {
diff --git a/superset/assets/spec/javascripts/dashboard/util/componentIsResizable_spec.js b/superset/assets/spec/javascripts/dashboard/util/componentIsResizable_spec.js
index b49a91f..e8986be 100644
--- a/superset/assets/spec/javascripts/dashboard/util/componentIsResizable_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/componentIsResizable_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import componentIsResizable from '../../../../src/dashboard/util/componentIsResizable';
diff --git a/superset/assets/spec/javascripts/dashboard/util/dnd-reorder_spec.js b/superset/assets/spec/javascripts/dashboard/util/dnd-reorder_spec.js
index 4ff6a52..7169229 100644
--- a/superset/assets/spec/javascripts/dashboard/util/dnd-reorder_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/dnd-reorder_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import reorderItem from '../../../../src/dashboard/util/dnd-reorder';
diff --git a/superset/assets/spec/javascripts/dashboard/util/dropOverflowsParent_spec.js b/superset/assets/spec/javascripts/dashboard/util/dropOverflowsParent_spec.js
index 8e6f889..3fc7d02 100644
--- a/superset/assets/spec/javascripts/dashboard/util/dropOverflowsParent_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/dropOverflowsParent_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import dropOverflowsParent from '../../../../src/dashboard/util/dropOverflowsParent';
diff --git a/superset/assets/spec/javascripts/dashboard/util/findFirstParentContainer_spec.js b/superset/assets/spec/javascripts/dashboard/util/findFirstParentContainer_spec.js
index ecaca67..372f4cb 100644
--- a/superset/assets/spec/javascripts/dashboard/util/findFirstParentContainer_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/findFirstParentContainer_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import findFirstParentContainerId from '../../../../src/dashboard/util/findFirstParentContainer';
diff --git a/superset/assets/spec/javascripts/dashboard/util/findParentId_spec.js b/superset/assets/spec/javascripts/dashboard/util/findParentId_spec.js
index 71c8aec..2ff15b2 100644
--- a/superset/assets/spec/javascripts/dashboard/util/findParentId_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/findParentId_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import findParentId from '../../../../src/dashboard/util/findParentId';
diff --git a/superset/assets/spec/javascripts/dashboard/util/getChartIdsFromLayout_spec.js b/superset/assets/spec/javascripts/dashboard/util/getChartIdsFromLayout_spec.js
index 71bbccd..3674ac5 100644
--- a/superset/assets/spec/javascripts/dashboard/util/getChartIdsFromLayout_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/getChartIdsFromLayout_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import getChartIdsFromLayout from '../../../../src/dashboard/util/getChartIdsFromLayout';
diff --git a/superset/assets/spec/javascripts/dashboard/util/getDashboardUrl_spec.js b/superset/assets/spec/javascripts/dashboard/util/getDashboardUrl_spec.js
index c45e65a..cf58c78 100644
--- a/superset/assets/spec/javascripts/dashboard/util/getDashboardUrl_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/getDashboardUrl_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import getDashboardUrl from '../../../../src/dashboard/util/getDashboardUrl';
diff --git a/superset/assets/spec/javascripts/dashboard/util/getDetailedComponentWidth_spec.js b/superset/assets/spec/javascripts/dashboard/util/getDetailedComponentWidth_spec.js
index 99e2282..e977e28 100644
--- a/superset/assets/spec/javascripts/dashboard/util/getDetailedComponentWidth_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/getDetailedComponentWidth_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import getDetailedComponentWidth from '../../../../src/dashboard/util/getDetailedComponentWidth';
diff --git a/superset/assets/spec/javascripts/dashboard/util/getDropPosition_spec.js b/superset/assets/spec/javascripts/dashboard/util/getDropPosition_spec.js
index 287b7a6..938a86a 100644
--- a/superset/assets/spec/javascripts/dashboard/util/getDropPosition_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/getDropPosition_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import getDropPosition, {
diff --git a/superset/assets/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.js b/superset/assets/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.js
index 388630b..66ef5e7 100644
--- a/superset/assets/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import getFormDataWithExtraFilters from '../../../../src/dashboard/util/charts/getFormDataWithExtraFilters';
diff --git a/superset/assets/spec/javascripts/dashboard/util/isValidChild_spec.js b/superset/assets/spec/javascripts/dashboard/util/isValidChild_spec.js
index 3563059..2a0efcb 100644
--- a/superset/assets/spec/javascripts/dashboard/util/isValidChild_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/isValidChild_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import isValidChild from '../../../../src/dashboard/util/isValidChild';
diff --git a/superset/assets/spec/javascripts/dashboard/util/newComponentFactory_spec.js b/superset/assets/spec/javascripts/dashboard/util/newComponentFactory_spec.js
index f52eba9..b7cdb70 100644
--- a/superset/assets/spec/javascripts/dashboard/util/newComponentFactory_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/newComponentFactory_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import newComponentFactory from '../../../../src/dashboard/util/newComponentFactory';
diff --git a/superset/assets/spec/javascripts/dashboard/util/newEntitiesFromDrop_spec.js b/superset/assets/spec/javascripts/dashboard/util/newEntitiesFromDrop_spec.js
index 8d00c18..c861827 100644
--- a/superset/assets/spec/javascripts/dashboard/util/newEntitiesFromDrop_spec.js
+++ b/superset/assets/spec/javascripts/dashboard/util/newEntitiesFromDrop_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import newEntitiesFromDrop from '../../../../src/dashboard/util/newEntitiesFromDrop';
diff --git a/superset/assets/spec/javascripts/datasource/DatasourceEditor_spec.jsx b/superset/assets/spec/javascripts/datasource/DatasourceEditor_spec.jsx
index 137ac39..0b7c6ab 100644
--- a/superset/assets/spec/javascripts/datasource/DatasourceEditor_spec.jsx
+++ b/superset/assets/spec/javascripts/datasource/DatasourceEditor_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import { Tabs } from 'react-bootstrap';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 import configureStore from 'redux-mock-store';
 import $ from 'jquery';
diff --git a/superset/assets/spec/javascripts/datasource/DatasourceModal_spec.jsx b/superset/assets/spec/javascripts/datasource/DatasourceModal_spec.jsx
index 3cbc92f..ef0a4f4 100644
--- a/superset/assets/spec/javascripts/datasource/DatasourceModal_spec.jsx
+++ b/superset/assets/spec/javascripts/datasource/DatasourceModal_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import { Modal } from 'react-bootstrap';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import configureStore from 'redux-mock-store';
 import { shallow } from 'enzyme';
 import $ from 'jquery';
diff --git a/superset/assets/spec/javascripts/explore/AdhocFilter_spec.js b/superset/assets/spec/javascripts/explore/AdhocFilter_spec.js
index 36d3bdd..eb3161e 100644
--- a/superset/assets/spec/javascripts/explore/AdhocFilter_spec.js
+++ b/superset/assets/spec/javascripts/explore/AdhocFilter_spec.js
@@ -1,5 +1,4 @@
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 
 import AdhocFilter, { EXPRESSION_TYPES, CLAUSES } from '../../../src/explore/AdhocFilter';
 
diff --git a/superset/assets/spec/javascripts/explore/AdhocMetric_spec.js b/superset/assets/spec/javascripts/explore/AdhocMetric_spec.js
index 432be76..fe6797c 100644
--- a/superset/assets/spec/javascripts/explore/AdhocMetric_spec.js
+++ b/superset/assets/spec/javascripts/explore/AdhocMetric_spec.js
@@ -1,5 +1,4 @@
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 
 import AdhocMetric, { EXPRESSION_TYPES } from '../../../src/explore/AdhocMetric';
 import { AGGREGATES } from '../../../src/explore/constants';
diff --git a/superset/assets/spec/javascripts/explore/chartActions_spec.js b/superset/assets/spec/javascripts/explore/chartActions_spec.js
index f1e49ef..6d8b009 100644
--- a/superset/assets/spec/javascripts/explore/chartActions_spec.js
+++ b/superset/assets/spec/javascripts/explore/chartActions_spec.js
@@ -1,4 +1,3 @@
-import { it, describe } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 import $ from 'jquery';
diff --git a/superset/assets/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx
index 2123ed7..f385625 100644
--- a/superset/assets/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import AdhocFilter, { EXPRESSION_TYPES, CLAUSES } from '../../../../src/explore/AdhocFilter';
diff --git a/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx b/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx
index 2014bbc..7c99c6c 100644
--- a/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import { FormGroup } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopoverSqlTabContent_spec.jsx b/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopoverSqlTabContent_spec.jsx
index a1cdb23..c3766bf 100644
--- a/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopoverSqlTabContent_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopoverSqlTabContent_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import { FormGroup } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx b/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx
index b639581..23d3b9a 100644
--- a/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import { Button, Popover, Tab, Tabs } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx b/superset/assets/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx
index 673b854..9d2e2d3 100644
--- a/superset/assets/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import { Label, OverlayTrigger } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx b/superset/assets/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx
index 015999a..d845cc5 100644
--- a/superset/assets/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import { OverlayTrigger } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx b/superset/assets/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx
index eebc703..5f03c2a 100644
--- a/superset/assets/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import { Button, FormGroup, Popover } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx b/superset/assets/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx
index 4ed5d68..47c09f9 100644
--- a/superset/assets/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import { Label, OverlayTrigger } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/AdhocMetricStaticOption_spec.jsx b/superset/assets/spec/javascripts/explore/components/AdhocMetricStaticOption_spec.jsx
index 54ff78e..b0e426c 100644
--- a/superset/assets/spec/javascripts/explore/components/AdhocMetricStaticOption_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/AdhocMetricStaticOption_spec.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable no-unused-expressions */
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import AdhocMetricStaticOption from '../../../../src/explore/components/AdhocMetricStaticOption';
diff --git a/superset/assets/spec/javascripts/explore/components/AggregateOption_spec.jsx b/superset/assets/spec/javascripts/explore/components/AggregateOption_spec.jsx
index 233eb8d..e70858b 100644
--- a/superset/assets/spec/javascripts/explore/components/AggregateOption_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/AggregateOption_spec.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable no-unused-expressions */
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import AggregateOption from '../../../../src/explore/components/AggregateOption';
diff --git a/superset/assets/spec/javascripts/explore/components/BoundsControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/BoundsControl_spec.jsx
index 522329a..9e98cb6 100644
--- a/superset/assets/spec/javascripts/explore/components/BoundsControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/BoundsControl_spec.jsx
@@ -3,7 +3,6 @@ import React from 'react';
 import { FormControl } from 'react-bootstrap';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { mount } from 'enzyme';
 
 import BoundsControl from '../../../../src/explore/components/controls/BoundsControl';
diff --git a/superset/assets/spec/javascripts/explore/components/CheckboxControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/CheckboxControl_spec.jsx
index a331245..27aba7d 100644
--- a/superset/assets/spec/javascripts/explore/components/CheckboxControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/CheckboxControl_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 
 import CheckboxControl from '../../../../src/explore/components/controls/CheckboxControl';
diff --git a/superset/assets/spec/javascripts/explore/components/ColorPickerControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/ColorPickerControl_spec.jsx
index ec58638..2285df4 100644
--- a/superset/assets/spec/javascripts/explore/components/ColorPickerControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/ColorPickerControl_spec.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable no-unused-expressions */
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 import { OverlayTrigger } from 'react-bootstrap';
 import { SketchPicker } from 'react-color';
diff --git a/superset/assets/spec/javascripts/explore/components/ColorScheme_spec.jsx b/superset/assets/spec/javascripts/explore/components/ColorScheme_spec.jsx
index 10e582b..1551286 100644
--- a/superset/assets/spec/javascripts/explore/components/ColorScheme_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/ColorScheme_spec.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable no-unused-expressions */
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { mount } from 'enzyme';
 import { Creatable } from 'react-select';
 
diff --git a/superset/assets/spec/javascripts/explore/components/ControlPanelSection_spec.jsx b/superset/assets/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
index c63392e..7a9a59d 100644
--- a/superset/assets/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import { Panel } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/ControlPanelsContainer_spec.jsx b/superset/assets/spec/javascripts/explore/components/ControlPanelsContainer_spec.jsx
index 64a657e..7f408f9 100644
--- a/superset/assets/spec/javascripts/explore/components/ControlPanelsContainer_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/ControlPanelsContainer_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 import { getFormDataFromControls, defaultControls }
   from '../../../../src/explore/store';
diff --git a/superset/assets/spec/javascripts/explore/components/ControlRow_spec.jsx b/superset/assets/spec/javascripts/explore/components/ControlRow_spec.jsx
index 118799e..80fc0d0 100644
--- a/superset/assets/spec/javascripts/explore/components/ControlRow_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/ControlRow_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import ControlSetRow from '../../../../src/explore/components/ControlRow';
 
diff --git a/superset/assets/spec/javascripts/explore/components/DatasourceControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/DatasourceControl_spec.jsx
index d03e30b..7f28bf3 100644
--- a/superset/assets/spec/javascripts/explore/components/DatasourceControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/DatasourceControl_spec.jsx
@@ -2,7 +2,6 @@ import React from 'react';
 import sinon from 'sinon';
 import configureStore from 'redux-mock-store';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import DatasourceModal from '../../../../src/datasource/DatasourceModal';
 import DatasourceControl from '../../../../src/explore/components/controls/DatasourceControl';
diff --git a/superset/assets/spec/javascripts/explore/components/DateFilterControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/DateFilterControl_spec.jsx
index 9c380c4..2230d97 100644
--- a/superset/assets/spec/javascripts/explore/components/DateFilterControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/DateFilterControl_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 import { Button, Label } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/DisplayQueryButton_spec.jsx b/superset/assets/spec/javascripts/explore/components/DisplayQueryButton_spec.jsx
index ab43ddf..8bca871 100644
--- a/superset/assets/spec/javascripts/explore/components/DisplayQueryButton_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/DisplayQueryButton_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { mount } from 'enzyme';
 import ModalTrigger from './../../../../src/components/ModalTrigger';
 
diff --git a/superset/assets/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx b/superset/assets/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx
index 3789fcc..896b310 100644
--- a/superset/assets/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow, mount } from 'enzyme';
 import { OverlayTrigger } from 'react-bootstrap';
 import sinon from 'sinon';
diff --git a/superset/assets/spec/javascripts/explore/components/ExploreActionButtons_spec.jsx b/superset/assets/spec/javascripts/explore/components/ExploreActionButtons_spec.jsx
index 5e701f2..933e0df 100644
--- a/superset/assets/spec/javascripts/explore/components/ExploreActionButtons_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/ExploreActionButtons_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import ExploreActionButtons from
   '../../../../src/explore/components/ExploreActionButtons';
diff --git a/superset/assets/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx b/superset/assets/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx
index 03c6ad1..b354b8d 100644
--- a/superset/assets/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import ExploreChartHeader from '../../../../src/explore/components/ExploreChartHeader';
diff --git a/superset/assets/spec/javascripts/explore/components/ExploreChartPanel_spec.js b/superset/assets/spec/javascripts/explore/components/ExploreChartPanel_spec.js
index b159f17..0d82de5 100644
--- a/superset/assets/spec/javascripts/explore/components/ExploreChartPanel_spec.js
+++ b/superset/assets/spec/javascripts/explore/components/ExploreChartPanel_spec.js
@@ -3,8 +3,7 @@
 
 // import React from 'react';
 // import { expect } from 'chai';
-// import { describe, it } from 'mocha';
-
+//
 // import ChartContainer from '../../../../src/explore/components/ChartContainer';
 
 // describe('ChartContainer', () => {
diff --git a/superset/assets/spec/javascripts/explore/components/ExploreViewContainer_spec.js b/superset/assets/spec/javascripts/explore/components/ExploreViewContainer_spec.js
index 9fe35e8..e6340f2 100644
--- a/superset/assets/spec/javascripts/explore/components/ExploreViewContainer_spec.js
+++ b/superset/assets/spec/javascripts/explore/components/ExploreViewContainer_spec.js
@@ -3,8 +3,7 @@
 
 // import React from 'react';
 // import { expect } from 'chai';
-// import { describe, it } from 'mocha';
-// import { shallow } from 'enzyme';
+// // import { shallow } from 'enzyme';
 
 // import ExploreViewContainer
 //   from '../../../../src/explore/components/ExploreViewContainer';
diff --git a/superset/assets/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx b/superset/assets/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx
index 05e02b9..62e4fe3 100644
--- a/superset/assets/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable no-unused-expressions */
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import FilterDefinitionOption from '../../../../src/explore/components/FilterDefinitionOption';
diff --git a/superset/assets/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx
index 97a6858..4774d9c 100644
--- a/superset/assets/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable no-unused-expressions */
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 import { OverlayTrigger } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx b/superset/assets/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx
index 418e9c5..1a8f766 100644
--- a/superset/assets/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import configureStore from 'redux-mock-store';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import MetricDefinitionOption from '../../../../src/explore/components/MetricDefinitionOption';
diff --git a/superset/assets/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx b/superset/assets/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx
index 896a527..5e0f3ae 100644
--- a/superset/assets/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable no-unused-expressions */
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import MetricDefinitionValue from '../../../../src/explore/components/MetricDefinitionValue';
diff --git a/superset/assets/spec/javascripts/explore/components/MetricsControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/MetricsControl_spec.jsx
index 8afc990..6685bff 100644
--- a/superset/assets/spec/javascripts/explore/components/MetricsControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/MetricsControl_spec.jsx
@@ -2,7 +2,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import MetricsControl from '../../../../src/explore/components/controls/MetricsControl';
diff --git a/superset/assets/spec/javascripts/explore/components/QueryAndSaveBtns_spec.jsx b/superset/assets/spec/javascripts/explore/components/QueryAndSaveBtns_spec.jsx
index c22a7bb..70712af 100644
--- a/superset/assets/spec/javascripts/explore/components/QueryAndSaveBtns_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/QueryAndSaveBtns_spec.jsx
@@ -1,5 +1,4 @@
 import React from 'react';
-import { beforeEach, describe, it } from 'mocha';
 import { expect } from 'chai';
 import { shallow } from 'enzyme';
 import sinon from 'sinon';
diff --git a/superset/assets/spec/javascripts/explore/components/RowCountLabel_spec.jsx b/superset/assets/spec/javascripts/explore/components/RowCountLabel_spec.jsx
index 9cdd485..53dd860 100644
--- a/superset/assets/spec/javascripts/explore/components/RowCountLabel_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/RowCountLabel_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 import { Label } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx b/superset/assets/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx
index 33ab844..f29f491 100644
--- a/superset/assets/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 
 import RunQueryActionButton
diff --git a/superset/assets/spec/javascripts/explore/components/SaveModal_spec.jsx b/superset/assets/spec/javascripts/explore/components/SaveModal_spec.jsx
index 5e1e4b8..4b4f1a4 100644
--- a/superset/assets/spec/javascripts/explore/components/SaveModal_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/SaveModal_spec.jsx
@@ -3,7 +3,6 @@ import configureStore from 'redux-mock-store';
 import thunk from 'redux-thunk';
 
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow, mount } from 'enzyme';
 import { Modal, Button, Radio } from 'react-bootstrap';
 import sinon from 'sinon';
diff --git a/superset/assets/spec/javascripts/explore/components/SelectControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/SelectControl_spec.jsx
index 38194e5..b0cf1db 100644
--- a/superset/assets/spec/javascripts/explore/components/SelectControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/SelectControl_spec.jsx
@@ -4,7 +4,6 @@ import Select, { Creatable } from 'react-select';
 import VirtualizedSelect from 'react-virtualized-select';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 import OnPasteSelect from '../../../../src/components/OnPasteSelect';
 import VirtualizedRendererWrap from '../../../../src/components/VirtualizedRendererWrap';
diff --git a/superset/assets/spec/javascripts/explore/components/TextArea_spec.jsx b/superset/assets/spec/javascripts/explore/components/TextArea_spec.jsx
index c1253f0..d6fc122 100644
--- a/superset/assets/spec/javascripts/explore/components/TextArea_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/TextArea_spec.jsx
@@ -3,7 +3,6 @@ import React from 'react';
 import { FormControl } from 'react-bootstrap';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 import AceEditor from 'react-ace';
 
diff --git a/superset/assets/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx
index 7e28ab0..3a03d76 100644
--- a/superset/assets/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx
@@ -3,7 +3,6 @@ import React from 'react';
 import { FormControl, OverlayTrigger } from 'react-bootstrap';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 
 import TimeSeriesColumnControl from '../../../../src/explore/components/controls/TimeSeriesColumnControl';
diff --git a/superset/assets/spec/javascripts/explore/components/ViewportControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/ViewportControl_spec.jsx
index a840e7c..eef3f27 100644
--- a/superset/assets/spec/javascripts/explore/components/ViewportControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/ViewportControl_spec.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable no-unused-expressions */
 import React from 'react';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 import { OverlayTrigger, Label } from 'react-bootstrap';
 
diff --git a/superset/assets/spec/javascripts/explore/components/VizTypeControl_spec.jsx b/superset/assets/spec/javascripts/explore/components/VizTypeControl_spec.jsx
index 03b73c9..bd41e1d 100644
--- a/superset/assets/spec/javascripts/explore/components/VizTypeControl_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/VizTypeControl_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it, beforeEach } from 'mocha';
 import { shallow } from 'enzyme';
 import { Modal } from 'react-bootstrap';
 import VizTypeControl from '../../../../src/explore/components/controls/VizTypeControl';
diff --git a/superset/assets/spec/javascripts/explore/exploreActions_spec.js b/superset/assets/spec/javascripts/explore/exploreActions_spec.js
index 72aebbd..7b4749a 100644
--- a/superset/assets/spec/javascripts/explore/exploreActions_spec.js
+++ b/superset/assets/spec/javascripts/explore/exploreActions_spec.js
@@ -1,5 +1,4 @@
 /* eslint-disable no-unused-expressions */
-import { it, describe } from 'mocha';
 import { expect } from 'chai';
 import { defaultState } from '../../../src/explore/store';
 import exploreReducer from '../../../src/explore/reducers/exploreReducer';
diff --git a/superset/assets/spec/javascripts/explore/utils_spec.jsx b/superset/assets/spec/javascripts/explore/utils_spec.jsx
index 8bfea68..9d2eaf0 100644
--- a/superset/assets/spec/javascripts/explore/utils_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/utils_spec.jsx
@@ -1,4 +1,3 @@
-import { it, describe } from 'mocha';
 import { expect } from 'chai';
 import URI from 'urijs';
 import { getExploreUrlAndPayload, getExploreLongUrl } from '../../../src/explore/exploreUtils';
diff --git a/superset/assets/spec/javascripts/logger_spec.js b/superset/assets/spec/javascripts/logger_spec.js
index 64580b4..e5b46b4 100644
--- a/superset/assets/spec/javascripts/logger_spec.js
+++ b/superset/assets/spec/javascripts/logger_spec.js
@@ -1,5 +1,4 @@
 import $ from 'jquery';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/messageToasts/.eslintrc b/superset/assets/spec/javascripts/messageToasts/.eslintrc
index a3f86e3..36759a2 100644
--- a/superset/assets/spec/javascripts/messageToasts/.eslintrc
+++ b/superset/assets/spec/javascripts/messageToasts/.eslintrc
@@ -17,7 +17,6 @@
     "no-mixed-operators": 0,
     "no-continue": 2,
     "no-bitwise": 2,
-    "no-undef": 2,
     "no-multi-assign": 2,
     "no-restricted-properties": 2,
     "no-prototype-builtins": 2,
diff --git a/superset/assets/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx b/superset/assets/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx
index aa04adc..ed39d7c 100644
--- a/superset/assets/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx
+++ b/superset/assets/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import mockMessageToasts from '../mockMessageToasts';
diff --git a/superset/assets/spec/javascripts/messageToasts/components/Toast_spec.jsx b/superset/assets/spec/javascripts/messageToasts/components/Toast_spec.jsx
index ce3396c..2ecf889 100644
--- a/superset/assets/spec/javascripts/messageToasts/components/Toast_spec.jsx
+++ b/superset/assets/spec/javascripts/messageToasts/components/Toast_spec.jsx
@@ -1,7 +1,6 @@
 import { Alert } from 'react-bootstrap';
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import mockMessageToasts from '../mockMessageToasts';
diff --git a/superset/assets/spec/javascripts/messageToasts/reducers/messageToasts_spec.js b/superset/assets/spec/javascripts/messageToasts/reducers/messageToasts_spec.js
index 8d71270..6471ccf 100644
--- a/superset/assets/spec/javascripts/messageToasts/reducers/messageToasts_spec.js
+++ b/superset/assets/spec/javascripts/messageToasts/reducers/messageToasts_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import { ADD_TOAST, REMOVE_TOAST } from '../../../../src/messageToasts/actions';
diff --git a/superset/assets/spec/javascripts/messageToasts/utils/getToastsFromPyFlashMessages_spec.js b/superset/assets/spec/javascripts/messageToasts/utils/getToastsFromPyFlashMessages_spec.js
index a3c7ce9..edcddef 100644
--- a/superset/assets/spec/javascripts/messageToasts/utils/getToastsFromPyFlashMessages_spec.js
+++ b/superset/assets/spec/javascripts/messageToasts/utils/getToastsFromPyFlashMessages_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import {
diff --git a/superset/assets/spec/javascripts/modules/colors_spec.jsx b/superset/assets/spec/javascripts/modules/colors_spec.jsx
index be88233..a91c74f 100644
--- a/superset/assets/spec/javascripts/modules/colors_spec.jsx
+++ b/superset/assets/spec/javascripts/modules/colors_spec.jsx
@@ -1,4 +1,3 @@
-import { it, describe, before } from 'mocha';
 import { expect } from 'chai';
 import { getColorFromScheme, hexToRGB } from '../../../src/modules/colors';
 import { getInstance } from '../../../src/modules/ColorSchemeManager';
diff --git a/superset/assets/spec/javascripts/modules/dates_spec.js b/superset/assets/spec/javascripts/modules/dates_spec.js
index 7101b1d..957d820 100644
--- a/superset/assets/spec/javascripts/modules/dates_spec.js
+++ b/superset/assets/spec/javascripts/modules/dates_spec.js
@@ -1,5 +1,4 @@
-import { it, describe } from 'mocha';
-import { expect } from 'chai';
+import { assert, expect } from 'chai';
 import {
   tickMultiFormat,
   formatDate,
diff --git a/superset/assets/spec/javascripts/modules/geo_spec.jsx b/superset/assets/spec/javascripts/modules/geo_spec.jsx
index db51bb4..18b45db 100644
--- a/superset/assets/spec/javascripts/modules/geo_spec.jsx
+++ b/superset/assets/spec/javascripts/modules/geo_spec.jsx
@@ -1,4 +1,3 @@
-import { it, describe } from 'mocha';
 import { expect } from 'chai';
 
 import { unitToRadius } from '../../../src/modules/geo';
diff --git a/superset/assets/spec/javascripts/modules/sandbox_spec.jsx b/superset/assets/spec/javascripts/modules/sandbox_spec.jsx
index 05283b0..f86e69c 100644
--- a/superset/assets/spec/javascripts/modules/sandbox_spec.jsx
+++ b/superset/assets/spec/javascripts/modules/sandbox_spec.jsx
@@ -1,4 +1,3 @@
-import { it, describe } from 'mocha';
 import { expect } from 'chai';
 
 import sandboxedEval from '../../../src/modules/sandbox';
diff --git a/superset/assets/spec/javascripts/modules/time_spec.js b/superset/assets/spec/javascripts/modules/time_spec.js
index 36260a4..09a0d14 100644
--- a/superset/assets/spec/javascripts/modules/time_spec.js
+++ b/superset/assets/spec/javascripts/modules/time_spec.js
@@ -1,5 +1,4 @@
-import { it, describe } from 'mocha';
-import { expect } from 'chai';
+import { expect, assert } from 'chai';
 
 import moment from 'moment';
 import { getPlaySliderParams, truncate } from '../../../src/modules/time';
diff --git a/superset/assets/spec/javascripts/modules/utils_spec.jsx b/superset/assets/spec/javascripts/modules/utils_spec.jsx
index 4a319af..f227970 100644
--- a/superset/assets/spec/javascripts/modules/utils_spec.jsx
+++ b/superset/assets/spec/javascripts/modules/utils_spec.jsx
@@ -1,5 +1,4 @@
-import { it, describe } from 'mocha';
-import { expect } from 'chai';
+import { expect, assert } from 'chai';
 import {
   tryNumify,
   slugify,
diff --git a/superset/assets/spec/javascripts/profile/App_spec.jsx b/superset/assets/spec/javascripts/profile/App_spec.jsx
index dcef27b..80e5789 100644
--- a/superset/assets/spec/javascripts/profile/App_spec.jsx
+++ b/superset/assets/spec/javascripts/profile/App_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import { Col, Row, Tab } from 'react-bootstrap';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import { user } from './fixtures';
diff --git a/superset/assets/spec/javascripts/profile/CreatedContent_spec.jsx b/superset/assets/spec/javascripts/profile/CreatedContent_spec.jsx
index 08457d9..04b0079 100644
--- a/superset/assets/spec/javascripts/profile/CreatedContent_spec.jsx
+++ b/superset/assets/spec/javascripts/profile/CreatedContent_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import { user } from './fixtures';
 import CreatedContent from '../../../src/profile/components/CreatedContent';
diff --git a/superset/assets/spec/javascripts/profile/EditableTitle_spec.jsx b/superset/assets/spec/javascripts/profile/EditableTitle_spec.jsx
index de0ca80..5387322 100644
--- a/superset/assets/spec/javascripts/profile/EditableTitle_spec.jsx
+++ b/superset/assets/spec/javascripts/profile/EditableTitle_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import sinon from 'sinon';
 import { expect } from 'chai';
 
diff --git a/superset/assets/spec/javascripts/profile/Favorites_spec.jsx b/superset/assets/spec/javascripts/profile/Favorites_spec.jsx
index 252d99e..b35817c 100644
--- a/superset/assets/spec/javascripts/profile/Favorites_spec.jsx
+++ b/superset/assets/spec/javascripts/profile/Favorites_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import { user } from './fixtures';
diff --git a/superset/assets/spec/javascripts/profile/RecentActivity_spec.jsx b/superset/assets/spec/javascripts/profile/RecentActivity_spec.jsx
index 60240fc..0122e67 100644
--- a/superset/assets/spec/javascripts/profile/RecentActivity_spec.jsx
+++ b/superset/assets/spec/javascripts/profile/RecentActivity_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import { user } from './fixtures';
diff --git a/superset/assets/spec/javascripts/profile/Security_spec.jsx b/superset/assets/spec/javascripts/profile/Security_spec.jsx
index 20376d2..e544c45 100644
--- a/superset/assets/spec/javascripts/profile/Security_spec.jsx
+++ b/superset/assets/spec/javascripts/profile/Security_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import { user, userNoPerms } from './fixtures';
diff --git a/superset/assets/spec/javascripts/profile/UserInfo_spec.jsx b/superset/assets/spec/javascripts/profile/UserInfo_spec.jsx
index 315dd6f..2c5b3e5 100644
--- a/superset/assets/spec/javascripts/profile/UserInfo_spec.jsx
+++ b/superset/assets/spec/javascripts/profile/UserInfo_spec.jsx
@@ -2,7 +2,6 @@ import React from 'react';
 import Gravatar from 'react-gravatar';
 import { Panel } from 'react-bootstrap';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import { user } from './fixtures';
diff --git a/superset/assets/spec/javascripts/sqllab/App_spec.jsx b/superset/assets/spec/javascripts/sqllab/App_spec.jsx
index ce76e30..4e64d17 100644
--- a/superset/assets/spec/javascripts/sqllab/App_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/App_spec.jsx
@@ -3,7 +3,6 @@ import configureStore from 'redux-mock-store';
 import thunk from 'redux-thunk';
 
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/sqllab/ColumnElement_spec.jsx b/superset/assets/spec/javascripts/sqllab/ColumnElement_spec.jsx
index fe4e9c4..7ea6862 100644
--- a/superset/assets/spec/javascripts/sqllab/ColumnElement_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/ColumnElement_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import { mockedActions, table } from './fixtures';
diff --git a/superset/assets/spec/javascripts/sqllab/CopyQueryTabUrl_spec.jsx b/superset/assets/spec/javascripts/sqllab/CopyQueryTabUrl_spec.jsx
index 662cb35..e8f8438 100644
--- a/superset/assets/spec/javascripts/sqllab/CopyQueryTabUrl_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/CopyQueryTabUrl_spec.jsx
@@ -1,5 +1,4 @@
 import React from 'react';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import { initialState } from './fixtures';
 
diff --git a/superset/assets/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx b/superset/assets/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx
index 1d0448e..98972ff 100644
--- a/superset/assets/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx
@@ -3,7 +3,6 @@ import configureStore from 'redux-mock-store';
 import thunk from 'redux-thunk';
 
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/sqllab/HighlightedSql_spec.jsx b/superset/assets/spec/javascripts/sqllab/HighlightedSql_spec.jsx
index 634e8a9..b8bc395 100644
--- a/superset/assets/spec/javascripts/sqllab/HighlightedSql_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/HighlightedSql_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import SyntaxHighlighter from 'react-syntax-highlighter';
 import { mount, shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import HighlightedSql from '../../../src/SqlLab/components/HighlightedSql';
diff --git a/superset/assets/spec/javascripts/sqllab/Link_spec.jsx b/superset/assets/spec/javascripts/sqllab/Link_spec.jsx
index e884d23..f37dd6f 100644
--- a/superset/assets/spec/javascripts/sqllab/Link_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/Link_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import Link from '../../../src/SqlLab/components/Link';
diff --git a/superset/assets/spec/javascripts/sqllab/QuerySearch_spec.jsx b/superset/assets/spec/javascripts/sqllab/QuerySearch_spec.jsx
index cff4501..dc25604 100644
--- a/superset/assets/spec/javascripts/sqllab/QuerySearch_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/QuerySearch_spec.jsx
@@ -2,7 +2,6 @@ import React from 'react';
 import Select from 'react-select';
 import { Button } from 'react-bootstrap';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/sqllab/QueryStateLabel_spec.jsx b/superset/assets/spec/javascripts/sqllab/QueryStateLabel_spec.jsx
index b8f6dd5..bca5c19 100644
--- a/superset/assets/spec/javascripts/sqllab/QueryStateLabel_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/QueryStateLabel_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import { Label } from 'react-bootstrap';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import QueryStateLabel from '../../../src/SqlLab/components/QueryStateLabel';
diff --git a/superset/assets/spec/javascripts/sqllab/QueryTable_spec.jsx b/superset/assets/spec/javascripts/sqllab/QueryTable_spec.jsx
index 5e2560a..c985750 100644
--- a/superset/assets/spec/javascripts/sqllab/QueryTable_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/QueryTable_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import { Table } from 'reactable';
 
diff --git a/superset/assets/spec/javascripts/sqllab/ResultSet_spec.jsx b/superset/assets/spec/javascripts/sqllab/ResultSet_spec.jsx
index 8ca9acd..d3f3690 100644
--- a/superset/assets/spec/javascripts/sqllab/ResultSet_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/ResultSet_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/sqllab/SaveQuery_spec.jsx b/superset/assets/spec/javascripts/sqllab/SaveQuery_spec.jsx
index 865b67a..c47f593 100644
--- a/superset/assets/spec/javascripts/sqllab/SaveQuery_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/SaveQuery_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import { FormControl } from 'react-bootstrap';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import SaveQuery from '../../../src/SqlLab/components/SaveQuery';
 import ModalTrigger from '../../../src/components/ModalTrigger';
diff --git a/superset/assets/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx b/superset/assets/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx
index bc4957e..62cb9ae 100644
--- a/superset/assets/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import sinon from 'sinon';
 import { expect } from 'chai';
 
diff --git a/superset/assets/spec/javascripts/sqllab/SqlEditor_spec.jsx b/superset/assets/spec/javascripts/sqllab/SqlEditor_spec.jsx
index b068965..4e6a2c8 100644
--- a/superset/assets/spec/javascripts/sqllab/SqlEditor_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/SqlEditor_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import { initialState, queries, table } from './fixtures';
diff --git a/superset/assets/spec/javascripts/sqllab/TabStatusIcon_spec.jsx b/superset/assets/spec/javascripts/sqllab/TabStatusIcon_spec.jsx
index d200d40..f959419 100644
--- a/superset/assets/spec/javascripts/sqllab/TabStatusIcon_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/TabStatusIcon_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import sinon from 'sinon';
 import { expect } from 'chai';
-import { describe, it } from 'mocha';
 import { shallow } from 'enzyme';
 
 import TabStatusIcon from '../../../src/SqlLab/components/TabStatusIcon';
diff --git a/superset/assets/spec/javascripts/sqllab/TabbedSqlEditors_spec.jsx b/superset/assets/spec/javascripts/sqllab/TabbedSqlEditors_spec.jsx
index 0846af8..6d4e007 100644
--- a/superset/assets/spec/javascripts/sqllab/TabbedSqlEditors_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/TabbedSqlEditors_spec.jsx
@@ -5,7 +5,6 @@ import URI from 'urijs';
 
 import { Tab } from 'react-bootstrap';
 import { shallow, mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/sqllab/TableElement_spec.jsx b/superset/assets/spec/javascripts/sqllab/TableElement_spec.jsx
index b5d8b76..6d683d3 100644
--- a/superset/assets/spec/javascripts/sqllab/TableElement_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/TableElement_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount, shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import Link from '../../../src/SqlLab/components/Link';
diff --git a/superset/assets/spec/javascripts/sqllab/Timer_spec.jsx b/superset/assets/spec/javascripts/sqllab/Timer_spec.jsx
index 681d731..c7a9534 100644
--- a/superset/assets/spec/javascripts/sqllab/Timer_spec.jsx
+++ b/superset/assets/spec/javascripts/sqllab/Timer_spec.jsx
@@ -1,6 +1,5 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it, beforeEach } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 
diff --git a/superset/assets/spec/javascripts/sqllab/actions_spec.js b/superset/assets/spec/javascripts/sqllab/actions_spec.js
index c3d4aa2..c2f1f45 100644
--- a/superset/assets/spec/javascripts/sqllab/actions_spec.js
+++ b/superset/assets/spec/javascripts/sqllab/actions_spec.js
@@ -1,5 +1,4 @@
 /* eslint-disable no-unused-expressions */
-import { it, describe } from 'mocha';
 import { expect } from 'chai';
 import sinon from 'sinon';
 import $ from 'jquery';
diff --git a/superset/assets/spec/javascripts/sqllab/reducers_spec.js b/superset/assets/spec/javascripts/sqllab/reducers_spec.js
index 2931d13..1ade038 100644
--- a/superset/assets/spec/javascripts/sqllab/reducers_spec.js
+++ b/superset/assets/spec/javascripts/sqllab/reducers_spec.js
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import * as r from '../../../src/SqlLab/reducers';
diff --git a/superset/assets/spec/javascripts/utils/common_spec.jsx b/superset/assets/spec/javascripts/utils/common_spec.jsx
index 861c38a..1b56513 100644
--- a/superset/assets/spec/javascripts/utils/common_spec.jsx
+++ b/superset/assets/spec/javascripts/utils/common_spec.jsx
@@ -1,4 +1,3 @@
-import { it, describe } from 'mocha';
 import { expect } from 'chai';
 import { isTruthy, optionFromValue } from '../../../src/utils/common';
 
diff --git a/superset/assets/spec/javascripts/visualizations/nvd3_viz_spec.jsx b/superset/assets/spec/javascripts/visualizations/nvd3_viz_spec.jsx
index f1b58f1..ded0acc 100644
--- a/superset/assets/spec/javascripts/visualizations/nvd3_viz_spec.jsx
+++ b/superset/assets/spec/javascripts/visualizations/nvd3_viz_spec.jsx
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import { formatLabel } from '../../../src/visualizations/nvd3_vis';
diff --git a/superset/assets/spec/javascripts/visualizations/table_spec.jsx b/superset/assets/spec/javascripts/visualizations/table_spec.jsx
index 14e04d7..5252e9d 100644
--- a/superset/assets/spec/javascripts/visualizations/table_spec.jsx
+++ b/superset/assets/spec/javascripts/visualizations/table_spec.jsx
@@ -1,4 +1,3 @@
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 import $ from 'jquery';
 import '../../helpers/shim';
diff --git a/superset/assets/spec/javascripts/welcome/DashboardTable_spec.jsx b/superset/assets/spec/javascripts/welcome/DashboardTable_spec.jsx
index 113f00c..bfb9825 100644
--- a/superset/assets/spec/javascripts/welcome/DashboardTable_spec.jsx
+++ b/superset/assets/spec/javascripts/welcome/DashboardTable_spec.jsx
@@ -1,7 +1,7 @@
 import React from 'react';
 import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
+import sinon from 'sinon';
 
 import DashboardTable from '../../../src/welcome/DashboardTable';
 
diff --git a/superset/assets/spec/javascripts/welcome/Welcome_spec.jsx b/superset/assets/spec/javascripts/welcome/Welcome_spec.jsx
index a0a3982..4ffd8ca 100644
--- a/superset/assets/spec/javascripts/welcome/Welcome_spec.jsx
+++ b/superset/assets/spec/javascripts/welcome/Welcome_spec.jsx
@@ -1,7 +1,6 @@
 import React from 'react';
 import { Panel, Row, Tab } from 'react-bootstrap';
 import { shallow } from 'enzyme';
-import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
 import Welcome from '../../../src/welcome/Welcome';
diff --git a/superset/assets/src/SqlLab/App.jsx b/superset/assets/src/SqlLab/App.jsx
index f86966a..01f9357 100644
--- a/superset/assets/src/SqlLab/App.jsx
+++ b/superset/assets/src/SqlLab/App.jsx
@@ -3,6 +3,7 @@ import { createStore, compose, applyMiddleware } from 'redux';
 import { Provider } from 'react-redux';
 import thunkMiddleware from 'redux-thunk';
 import { hot } from 'react-hot-loader';
+import $ from 'jquery';
 
 import getInitialState from './getInitialState';
 import rootReducer from './reducers';
diff --git a/superset/assets/src/SqlLab/actions.js b/superset/assets/src/SqlLab/actions.js
index 81bd913..a808949 100644
--- a/superset/assets/src/SqlLab/actions.js
+++ b/superset/assets/src/SqlLab/actions.js
@@ -1,5 +1,3 @@
-/* global window */
-/* eslint no-undef: 2 */
 import $ from 'jquery';
 import shortid from 'shortid';
 import JSONbig from 'json-bigint';
diff --git a/superset/assets/src/SqlLab/components/ExploreResultsButton.jsx b/superset/assets/src/SqlLab/components/ExploreResultsButton.jsx
index b641238..dfaab5a 100644
--- a/superset/assets/src/SqlLab/components/ExploreResultsButton.jsx
+++ b/superset/assets/src/SqlLab/components/ExploreResultsButton.jsx
@@ -1,4 +1,3 @@
-/* eslint no-undef: 2 */
 import moment from 'moment';
 import React from 'react';
 import PropTypes from 'prop-types';
diff --git a/superset/assets/src/SqlLab/components/QuerySearch.jsx b/superset/assets/src/SqlLab/components/QuerySearch.jsx
index d13d993..17dd9b1 100644
--- a/superset/assets/src/SqlLab/components/QuerySearch.jsx
+++ b/superset/assets/src/SqlLab/components/QuerySearch.jsx
@@ -1,4 +1,3 @@
-/* eslint no-undef: 2 */
 import React from 'react';
 import PropTypes from 'prop-types';
 import { Button } from 'react-bootstrap';
diff --git a/superset/assets/src/SqlLab/components/SqlEditor.jsx b/superset/assets/src/SqlLab/components/SqlEditor.jsx
index d3ed2bb..c595ea6 100644
--- a/superset/assets/src/SqlLab/components/SqlEditor.jsx
+++ b/superset/assets/src/SqlLab/components/SqlEditor.jsx
@@ -1,5 +1,3 @@
-/* global window */
-/* eslint no-undef: 2 */
 import React from 'react';
 import PropTypes from 'prop-types';
 import throttle from 'lodash.throttle';
diff --git a/superset/assets/src/SqlLab/components/SqlEditorLeftBar.jsx b/superset/assets/src/SqlLab/components/SqlEditorLeftBar.jsx
index d20d494..7bc7122 100644
--- a/superset/assets/src/SqlLab/components/SqlEditorLeftBar.jsx
+++ b/superset/assets/src/SqlLab/components/SqlEditorLeftBar.jsx
@@ -1,5 +1,3 @@
-/* global window */
-/* eslint no-undef: 2 */
 import React from 'react';
 import PropTypes from 'prop-types';
 import { ControlLabel, Button } from 'react-bootstrap';
diff --git a/superset/assets/src/SqlLab/getInitialState.js b/superset/assets/src/SqlLab/getInitialState.js
index 9452ac5..c33ff1e 100644
--- a/superset/assets/src/SqlLab/getInitialState.js
+++ b/superset/assets/src/SqlLab/getInitialState.js
@@ -1,4 +1,3 @@
-/* eslint no-undef: 2 */
 import shortid from 'shortid';
 import { t } from '../locales';
 import getToastsFromPyFlashMessages from '../messageToasts/utils/getToastsFromPyFlashMessages';
diff --git a/superset/assets/src/SqlLab/reducers.js b/superset/assets/src/SqlLab/reducers.js
index ec88027..7fa60b1 100644
--- a/superset/assets/src/SqlLab/reducers.js
+++ b/superset/assets/src/SqlLab/reducers.js
@@ -2,6 +2,7 @@ import { combineReducers } from 'redux';
 import shortid from 'shortid';
 import messageToasts from '../messageToasts/reducers';
 
+import getInitialState from './getInitialState';
 import * as actions from './actions';
 import { now } from '../modules/dates';
 import {
diff --git a/superset/assets/src/chart/Chart.jsx b/superset/assets/src/chart/Chart.jsx
index a9dd0ff..43d13b1 100644
--- a/superset/assets/src/chart/Chart.jsx
+++ b/superset/assets/src/chart/Chart.jsx
@@ -1,4 +1,3 @@
-/* eslint no-undef: 2 */
 import React from 'react';
 import PropTypes from 'prop-types';
 import { Tooltip } from 'react-bootstrap';
diff --git a/superset/assets/src/dashboard/.eslintrc b/superset/assets/src/dashboard/.eslintrc
index a3f86e3..36759a2 100644
--- a/superset/assets/src/dashboard/.eslintrc
+++ b/superset/assets/src/dashboard/.eslintrc
@@ -17,7 +17,6 @@
     "no-mixed-operators": 0,
     "no-continue": 2,
     "no-bitwise": 2,
-    "no-undef": 2,
     "no-multi-assign": 2,
     "no-restricted-properties": 2,
     "no-prototype-builtins": 2,
diff --git a/superset/assets/src/dashboard/components/Dashboard.jsx b/superset/assets/src/dashboard/components/Dashboard.jsx
index 2bb9b9c..20c161b 100644
--- a/superset/assets/src/dashboard/components/Dashboard.jsx
+++ b/superset/assets/src/dashboard/components/Dashboard.jsx
@@ -1,4 +1,3 @@
-/* global window */
 import React from 'react';
 import PropTypes from 'prop-types';
 
diff --git a/superset/assets/src/dashboard/components/HeaderActionsDropdown.jsx b/superset/assets/src/dashboard/components/HeaderActionsDropdown.jsx
index 4c25399..c04e2b4 100644
--- a/superset/assets/src/dashboard/components/HeaderActionsDropdown.jsx
+++ b/superset/assets/src/dashboard/components/HeaderActionsDropdown.jsx
@@ -1,4 +1,3 @@
-/* global window */
 import React from 'react';
 import PropTypes from 'prop-types';
 import $ from 'jquery';
diff --git a/superset/assets/src/datasource/DatasourceEditor.jsx b/superset/assets/src/datasource/DatasourceEditor.jsx
index 48c2401..4d56b46 100644
--- a/superset/assets/src/datasource/DatasourceEditor.jsx
+++ b/superset/assets/src/datasource/DatasourceEditor.jsx
@@ -394,7 +394,8 @@ export class DatasourceEditor extends React.PureComponent {
       </Fieldset>);
   }
   renderSpatialTab() {
-    const spatials = this.state.datasource.spatials;
+    const { datasource } = this.state;
+    const { spatials, all_cols: allCols } = datasource;
     return (
       <Tab
         title={<CollectionTabTitle collection={spatials} title={t('Spatial')} />}
@@ -414,7 +415,7 @@ export class DatasourceEditor extends React.PureComponent {
             name: (d, onChange) => (
               <EditableTitle canEdit title={d} onSaveTitle={onChange} />),
             config: (v, onChange) => (
-              <SpatialControl value={v} onChange={onChange} choices={datasource.all_cols} />
+              <SpatialControl value={v} onChange={onChange} choices={allCols} />
             ),
           }}
         />
diff --git a/superset/assets/src/explore/App.jsx b/superset/assets/src/explore/App.jsx
index 2f27989..d46b494 100644
--- a/superset/assets/src/explore/App.jsx
+++ b/superset/assets/src/explore/App.jsx
@@ -1,4 +1,3 @@
-/* eslint no-undef: 2 */
 import React from 'react';
 import { hot } from 'react-hot-loader';
 import { createStore, applyMiddleware, compose } from 'redux';
diff --git a/superset/assets/src/explore/actions/exploreActions.js b/superset/assets/src/explore/actions/exploreActions.js
index b8a883e..bd9a174 100644
--- a/superset/assets/src/explore/actions/exploreActions.js
+++ b/superset/assets/src/explore/actions/exploreActions.js
@@ -34,6 +34,12 @@ export function fetchDatasourcesSucceeded() {
   return { type: FETCH_DATASOURCES_SUCCEEDED };
 }
 
+export const FETCH_DATASOURCES_FAILED = 'FETCH_DATASOURCES_FAILED';
+export function fetchDatasourcesFailed(error) {
+  return { type: FETCH_DATASOURCES_FAILED, error };
+}
+
+
 export const POST_DATASOURCES_FAILED = 'POST_DATASOURCES_FAILED';
 export function postDatasourcesFailed(error) {
   return { type: POST_DATASOURCES_FAILED, error };
diff --git a/superset/assets/src/explore/components/AdhocFilterEditPopoverSqlTabContent.jsx b/superset/assets/src/explore/components/AdhocFilterEditPopoverSqlTabContent.jsx
index 7e8a6a6..6e5fe3c 100644
--- a/superset/assets/src/explore/components/AdhocFilterEditPopoverSqlTabContent.jsx
+++ b/superset/assets/src/explore/components/AdhocFilterEditPopoverSqlTabContent.jsx
@@ -1,6 +1,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import AceEditor from 'react-ace';
+import ace from 'brace';
 import 'brace/mode/sql';
 import 'brace/theme/github';
 import 'brace/ext/language_tools';
diff --git a/superset/assets/src/explore/components/AdhocMetricEditPopover.jsx b/superset/assets/src/explore/components/AdhocMetricEditPopover.jsx
index 77926a8..96b0314 100644
--- a/superset/assets/src/explore/components/AdhocMetricEditPopover.jsx
+++ b/superset/assets/src/explore/components/AdhocMetricEditPopover.jsx
@@ -2,6 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { Button, ControlLabel, FormGroup, Popover, Tab, Tabs } from 'react-bootstrap';
 import VirtualizedSelect from 'react-virtualized-select';
+import ace from 'brace';
 import AceEditor from 'react-ace';
 import 'brace/mode/sql';
 import 'brace/theme/github';
diff --git a/superset/assets/src/explore/components/controls/DatasourceControl.jsx b/superset/assets/src/explore/components/controls/DatasourceControl.jsx
index 5b616f1..5392218 100644
--- a/superset/assets/src/explore/components/controls/DatasourceControl.jsx
+++ b/superset/assets/src/explore/components/controls/DatasourceControl.jsx
@@ -1,4 +1,3 @@
-/* eslint no-undef: 2 */
 import React from 'react';
 import PropTypes from 'prop-types';
 import {
diff --git a/superset/assets/src/explore/components/controls/SelectAsyncControl.jsx b/superset/assets/src/explore/components/controls/SelectAsyncControl.jsx
index fc8fb3c..2fb778b 100644
--- a/superset/assets/src/explore/components/controls/SelectAsyncControl.jsx
+++ b/superset/assets/src/explore/components/controls/SelectAsyncControl.jsx
@@ -1,4 +1,3 @@
-/* eslint no-undef: 2 */
 import React from 'react';
 import PropTypes from 'prop-types';
 import Select from '../../../components/AsyncSelect';
diff --git a/superset/assets/src/messageToasts/.eslintrc b/superset/assets/src/messageToasts/.eslintrc
index a3f86e3..36759a2 100644
--- a/superset/assets/src/messageToasts/.eslintrc
+++ b/superset/assets/src/messageToasts/.eslintrc
@@ -17,7 +17,6 @@
     "no-mixed-operators": 0,
     "no-continue": 2,
     "no-bitwise": 2,
-    "no-undef": 2,
     "no-multi-assign": 2,
     "no-restricted-properties": 2,
     "no-prototype-builtins": 2,
diff --git a/superset/assets/src/visualizations/BigNumber/BigNumber.jsx b/superset/assets/src/visualizations/BigNumber/BigNumber.jsx
index 9f8a4a2..ff78a56 100644
--- a/superset/assets/src/visualizations/BigNumber/BigNumber.jsx
+++ b/superset/assets/src/visualizations/BigNumber/BigNumber.jsx
@@ -1,5 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
+
 import { XYChart, AreaSeries, CrossHair, LinearGradient } from '@data-ui/xy-chart';
 
 import { brandColor } from '../../modules/colors';
diff --git a/superset/assets/src/visualizations/BigNumber/adaptor.jsx b/superset/assets/src/visualizations/BigNumber/adaptor.jsx
index 40a3a0f..fc20c22 100644
--- a/superset/assets/src/visualizations/BigNumber/adaptor.jsx
+++ b/superset/assets/src/visualizations/BigNumber/adaptor.jsx
@@ -1,6 +1,7 @@
 import React from 'react';
 import ReactDOM from 'react-dom';
 import * as color from 'd3-color';
+import d3 from 'd3';
 
 import BigNumberVis, { renderTooltipFactory } from './BigNumber';
 import { d3FormatPreset } from '../../modules/utils';
diff --git a/superset/assets/src/visualizations/MapBox/MapBox.jsx b/superset/assets/src/visualizations/MapBox/MapBox.jsx
index e6eb71a..85cd1b1 100644
--- a/superset/assets/src/visualizations/MapBox/MapBox.jsx
+++ b/superset/assets/src/visualizations/MapBox/MapBox.jsx
@@ -122,9 +122,9 @@ MapBox.defaultProps = defaultProps;
 function createReducer(aggregatorName, customMetric) {
   if (aggregatorName === 'sum' || !customMetric) {
     return (a, b) => a + b;
-  } else if (aggName === 'min') {
+  } else if (aggregatorName === 'min') {
     return Math.min;
-  } else if (aggName === 'max') {
+  } else if (aggregatorName === 'max') {
     return Math.max;
   }
   return function (a, b) {
diff --git a/superset/assets/src/visualizations/TimeTable/TimeTable.jsx b/superset/assets/src/visualizations/TimeTable/TimeTable.jsx
index ec85262..8ce9a7d 100644
--- a/superset/assets/src/visualizations/TimeTable/TimeTable.jsx
+++ b/superset/assets/src/visualizations/TimeTable/TimeTable.jsx
@@ -150,7 +150,7 @@ class TimeTable extends React.PureComponent {
       const { timeLag } = column;
       const totalLag = Object.keys(reversedEntries).length;
       if (timeLag > totalLag) {
-        errorMsg = `The time lag set at ${timeLag} exceeds the length of data at ${reversedData.length}. No data available.`;
+        errorMsg = `The time lag set at ${timeLag} exceeds the length of data at ${reversedEntries.length}. No data available.`;
       } else {
         v = reversedEntries[timeLag][valueField];
       }
diff --git a/superset/assets/src/visualizations/deckgl/layers/common.js b/superset/assets/src/visualizations/deckgl/layers/common.js
index 7eed061..0a446dd 100644
--- a/superset/assets/src/visualizations/deckgl/layers/common.js
+++ b/superset/assets/src/visualizations/deckgl/layers/common.js
@@ -1,5 +1,6 @@
 import dompurify from 'dompurify';
 import { fitBounds } from 'viewport-mercator-project';
+import d3 from 'd3';
 
 import sandboxedEval from '../../../modules/sandbox';
 
diff --git a/superset/assets/src/visualizations/deckgl/layers/geojson.jsx b/superset/assets/src/visualizations/deckgl/layers/geojson.jsx
index 74a862a..72790f1 100644
--- a/superset/assets/src/visualizations/deckgl/layers/geojson.jsx
+++ b/superset/assets/src/visualizations/deckgl/layers/geojson.jsx
@@ -28,10 +28,10 @@ const alterProps = (props, propOverrides) => {
     }
   });
   if (typeof props.fillColor === 'string') {
-    newProps.fillColor = hexToRGB(p.fillColor);
+    newProps.fillColor = hexToRGB(props.fillColor);
   }
   if (typeof props.strokeColor === 'string') {
-    newProps.strokeColor = hexToRGB(p.strokeColor);
+    newProps.strokeColor = hexToRGB(props.strokeColor);
   }
   return {
     ...newProps,
diff --git a/superset/assets/src/visualizations/line_multi.js b/superset/assets/src/visualizations/line_multi.js
index 684916c..b8cd1a0 100644
--- a/superset/assets/src/visualizations/line_multi.js
+++ b/superset/assets/src/visualizations/line_multi.js
@@ -1,7 +1,8 @@
+import d3 from 'd3';
+
 import nvd3Vis from './nvd3_vis';
 import { getExploreLongUrl } from '../explore/exploreUtils';
 
-
 export default function lineMulti(slice, payload) {
   /*
    * Show multiple line charts
diff --git a/superset/assets/yarn.lock b/superset/assets/yarn.lock
index 6f04ebf..e0fc1ea 100644
--- a/superset/assets/yarn.lock
+++ b/superset/assets/yarn.lock
@@ -4529,6 +4529,12 @@ eslint-module-utils@^2.2.0:
     debug "^2.6.8"
     pkg-dir "^1.0.0"
 
+eslint-plugin-cypress@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.0.1.tgz#647e942cacbfd71b0f1a1ed6978472fbd475c60a"
+  dependencies:
+    globals "^11.0.1"
+
 eslint-plugin-import@^2.2.0:
   version "2.14.0"
   resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8"


Mime
View raw message