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: [cypress] add SQL lab tests (#5974)
Date Tue, 09 Oct 2018 21:28:16 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 9b4cf85  [cypress] add SQL lab tests (#5974)
9b4cf85 is described below

commit 9b4cf856ddb272fd9e99d719aa528ac50eac8444
Author: Chris Williams <williaster@users.noreply.github.com>
AuthorDate: Tue Oct 9 14:28:11 2018 -0700

    [cypress] add SQL lab tests (#5974)
    
    * [cypress] add sqllab/sourcePanel integration tests
    
    * [cypress] add tests for SQL Lab query panel
    
    * [cypress] add selectors/
    
    * [cypress] add tests for SQL Lab tabs
    
    * [cypress][sqllab] remove nested assertions where possible, update to single test index
file
    
    * [cypress][sqllab] try force click
    
    * [cypress][sqllab] wait for saved query to load
    
    * [cypress][sqllab] unnest, use visit for href
    
    * [cypress][sqllab] try 1s wait :O
    
    * [cypress][sqllab] wait for savedquery api response
    
    * [cypress][sqllab] fix wait syntax
    
    * [cypress][sqllab] add route wait in sourcepanel for flakiness
    
    * [cypress] use *.test.js pattern for tests
    
    * [cypress] fix paths
    
    * [cypress][sqllab] actually try running lint
    
    * [cypress][dashboards] use *.test.js pattern for tests
    
    * [cypress][sqllab] combine tests, remove nesting
    
    * [cypress][sqllab] explicitly wait for query results
---
 superset/assets/cypress.json                       |   5 +-
 .../assets/cypress/integration/dashboard/all.js    |  11 ---
 .../dashboard/{_controls.js => controls.js}        |   0
 .../dashboard/{_edit_mode.js => edit_mode.js}      |   0
 .../dashboard/{_filter.js => filter.js}            |   0
 .../cypress/integration/dashboard/index.test.js    |  11 +++
 .../integration/dashboard/{_load.js => load.js}    |   0
 .../explore/{control_tests.js => control.test.js}  |   0
 .../integration/explore/visualizations/all.js      |  35 -------
 .../explore/visualizations/{_area.js => area.js}   |   0
 .../{_big_number.js => big_number.js}              |   0
 .../{_big_number_total.js => big_number_total.js}  |   0
 .../visualizations/{_box_plot.js => box_plot.js}   |   0
 .../visualizations/{_bubble.js => bubble.js}       |   0
 .../visualizations/{_compare.js => compare.js}     |   0
 .../visualizations/{_dist_bar.js => dist_bar.js}   |   0
 .../visualizations/{_dual_line.js => dual_line.js} |   0
 .../visualizations/{_histogram.js => histogram.js} |   0
 .../explore/visualizations/index.test.js           |  35 +++++++
 .../explore/visualizations/{_line.js => line.js}   |   0
 .../explore/visualizations/{_pie.js => pie.js}     |   0
 .../{_pivot_table.js => pivot_table.js}            |   0
 .../visualizations/{_sankey.js => sankey.js}       |   0
 .../visualizations/{_sunburst.js => sunburst.js}   |   0
 .../explore/visualizations/{_table.js => table.js} |   0
 .../visualizations/{_treemap.js => treemap.js}     |   0
 .../visualizations/{_world_map.js => world_map.js} |   0
 .../cypress/integration/sqllab/index.test.js       |   9 ++
 .../assets/cypress/integration/sqllab/query.js     | 103 +++++++++++++++++++++
 .../cypress/integration/sqllab/sourcePanel.js      |  57 ++++++++++++
 .../cypress/integration/sqllab/sqllab.helper.js    |  22 +++++
 superset/assets/cypress/integration/sqllab/tabs.js |  38 ++++++++
 .../assets/src/SqlLab/components/TableElement.jsx  |   2 +-
 33 files changed, 277 insertions(+), 51 deletions(-)

diff --git a/superset/assets/cypress.json b/superset/assets/cypress.json
index dee8cf6..3f410e4 100644
--- a/superset/assets/cypress.json
+++ b/superset/assets/cypress.json
@@ -1,9 +1,6 @@
 {
   "baseUrl": "http://localhost:8081",
   "videoUploadOnPasses": false,
-  "ignoreTestFiles": [
-    "_*.js",
-    "*.helper.js"
-  ],
+  "ignoreTestFiles": ["**/!(*.test.js)"],
   "projectId": "fbf96q"
 }
diff --git a/superset/assets/cypress/integration/dashboard/all.js b/superset/assets/cypress/integration/dashboard/all.js
deleted file mode 100644
index e448319..0000000
--- a/superset/assets/cypress/integration/dashboard/all.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import DashboardControlsTest from './_controls';
-import DashboardEditModeTest from './_edit_mode';
-import DashboardFilterTest from './_filter';
-import DashboardLoadTest from './_load';
-
-describe('Dashboard', () => {
-  DashboardControlsTest();
-  DashboardEditModeTest();
-  DashboardFilterTest();
-  DashboardLoadTest();
-});
diff --git a/superset/assets/cypress/integration/dashboard/_controls.js b/superset/assets/cypress/integration/dashboard/controls.js
similarity index 100%
rename from superset/assets/cypress/integration/dashboard/_controls.js
rename to superset/assets/cypress/integration/dashboard/controls.js
diff --git a/superset/assets/cypress/integration/dashboard/_edit_mode.js b/superset/assets/cypress/integration/dashboard/edit_mode.js
similarity index 100%
rename from superset/assets/cypress/integration/dashboard/_edit_mode.js
rename to superset/assets/cypress/integration/dashboard/edit_mode.js
diff --git a/superset/assets/cypress/integration/dashboard/_filter.js b/superset/assets/cypress/integration/dashboard/filter.js
similarity index 100%
rename from superset/assets/cypress/integration/dashboard/_filter.js
rename to superset/assets/cypress/integration/dashboard/filter.js
diff --git a/superset/assets/cypress/integration/dashboard/index.test.js b/superset/assets/cypress/integration/dashboard/index.test.js
new file mode 100644
index 0000000..664e3ac
--- /dev/null
+++ b/superset/assets/cypress/integration/dashboard/index.test.js
@@ -0,0 +1,11 @@
+import DashboardControlsTest from './controls';
+import DashboardEditModeTest from './edit_mode';
+import DashboardFilterTest from './filter';
+import DashboardLoadTest from './load';
+
+describe('Dashboard', () => {
+  DashboardControlsTest();
+  DashboardEditModeTest();
+  DashboardFilterTest();
+  DashboardLoadTest();
+});
diff --git a/superset/assets/cypress/integration/dashboard/_load.js b/superset/assets/cypress/integration/dashboard/load.js
similarity index 100%
rename from superset/assets/cypress/integration/dashboard/_load.js
rename to superset/assets/cypress/integration/dashboard/load.js
diff --git a/superset/assets/cypress/integration/explore/control_tests.js b/superset/assets/cypress/integration/explore/control.test.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/control_tests.js
rename to superset/assets/cypress/integration/explore/control.test.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/all.js b/superset/assets/cypress/integration/explore/visualizations/all.js
deleted file mode 100644
index 730bf13..0000000
--- a/superset/assets/cypress/integration/explore/visualizations/all.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import AreaTest from './_area';
-import BigNumberTest from './_big_number';
-import BigNumberTotalTest from './_big_number_total';
-import BubbleTest from './_bubble';
-import CompareTest from './_compare';
-import DistBarTest from './_dist_bar';
-import DualLineTest from './_dual_line';
-import HistogramTest from './_histogram';
-import LineTest from './_line';
-import PieTest from './_pie';
-import PivotTableTest from './_pivot_table';
-import SankeyTest from './_sankey';
-import SunburstTest from './_sunburst';
-import TableTest from './_table';
-import TreemapTest from './_treemap';
-import WorldMapTest from './_world_map';
-
-describe('All Visualizations', () => {
-  AreaTest();
-  BigNumberTest();
-  BigNumberTotalTest();
-  BubbleTest();
-  CompareTest();
-  DistBarTest();
-  DualLineTest();
-  HistogramTest();
-  LineTest();
-  PieTest();
-  PivotTableTest();
-  SankeyTest();
-  SunburstTest();
-  TableTest();
-  TreemapTest();
-  WorldMapTest();
-});
diff --git a/superset/assets/cypress/integration/explore/visualizations/_area.js b/superset/assets/cypress/integration/explore/visualizations/area.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_area.js
rename to superset/assets/cypress/integration/explore/visualizations/area.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_big_number.js b/superset/assets/cypress/integration/explore/visualizations/big_number.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_big_number.js
rename to superset/assets/cypress/integration/explore/visualizations/big_number.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_big_number_total.js
b/superset/assets/cypress/integration/explore/visualizations/big_number_total.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_big_number_total.js
rename to superset/assets/cypress/integration/explore/visualizations/big_number_total.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_box_plot.js b/superset/assets/cypress/integration/explore/visualizations/box_plot.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_box_plot.js
rename to superset/assets/cypress/integration/explore/visualizations/box_plot.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_bubble.js b/superset/assets/cypress/integration/explore/visualizations/bubble.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_bubble.js
rename to superset/assets/cypress/integration/explore/visualizations/bubble.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_compare.js b/superset/assets/cypress/integration/explore/visualizations/compare.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_compare.js
rename to superset/assets/cypress/integration/explore/visualizations/compare.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_dist_bar.js b/superset/assets/cypress/integration/explore/visualizations/dist_bar.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_dist_bar.js
rename to superset/assets/cypress/integration/explore/visualizations/dist_bar.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_dual_line.js b/superset/assets/cypress/integration/explore/visualizations/dual_line.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_dual_line.js
rename to superset/assets/cypress/integration/explore/visualizations/dual_line.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_histogram.js b/superset/assets/cypress/integration/explore/visualizations/histogram.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_histogram.js
rename to superset/assets/cypress/integration/explore/visualizations/histogram.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/index.test.js b/superset/assets/cypress/integration/explore/visualizations/index.test.js
new file mode 100644
index 0000000..2f28083
--- /dev/null
+++ b/superset/assets/cypress/integration/explore/visualizations/index.test.js
@@ -0,0 +1,35 @@
+import AreaTest from './area';
+import BigNumberTest from './big_number';
+import BigNumberTotalTest from './big_number_total';
+import BubbleTest from './bubble';
+import CompareTest from './compare';
+import DistBarTest from './dist_bar';
+import DualLineTest from './dual_line';
+import HistogramTest from './histogram';
+import LineTest from './line';
+import PieTest from './pie';
+import PivotTableTest from './pivot_table';
+import SankeyTest from './sankey';
+import SunburstTest from './sunburst';
+import TableTest from './table';
+import TreemapTest from './treemap';
+import WorldMapTest from './world_map';
+
+describe('All Visualizations', () => {
+  AreaTest();
+  BigNumberTest();
+  BigNumberTotalTest();
+  BubbleTest();
+  CompareTest();
+  DistBarTest();
+  DualLineTest();
+  HistogramTest();
+  LineTest();
+  PieTest();
+  PivotTableTest();
+  SankeyTest();
+  SunburstTest();
+  TableTest();
+  TreemapTest();
+  WorldMapTest();
+});
diff --git a/superset/assets/cypress/integration/explore/visualizations/_line.js b/superset/assets/cypress/integration/explore/visualizations/line.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_line.js
rename to superset/assets/cypress/integration/explore/visualizations/line.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_pie.js b/superset/assets/cypress/integration/explore/visualizations/pie.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_pie.js
rename to superset/assets/cypress/integration/explore/visualizations/pie.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_pivot_table.js b/superset/assets/cypress/integration/explore/visualizations/pivot_table.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_pivot_table.js
rename to superset/assets/cypress/integration/explore/visualizations/pivot_table.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_sankey.js b/superset/assets/cypress/integration/explore/visualizations/sankey.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_sankey.js
rename to superset/assets/cypress/integration/explore/visualizations/sankey.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_sunburst.js b/superset/assets/cypress/integration/explore/visualizations/sunburst.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_sunburst.js
rename to superset/assets/cypress/integration/explore/visualizations/sunburst.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_table.js b/superset/assets/cypress/integration/explore/visualizations/table.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_table.js
rename to superset/assets/cypress/integration/explore/visualizations/table.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_treemap.js b/superset/assets/cypress/integration/explore/visualizations/treemap.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_treemap.js
rename to superset/assets/cypress/integration/explore/visualizations/treemap.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_world_map.js b/superset/assets/cypress/integration/explore/visualizations/world_map.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_world_map.js
rename to superset/assets/cypress/integration/explore/visualizations/world_map.js
diff --git a/superset/assets/cypress/integration/sqllab/index.test.js b/superset/assets/cypress/integration/sqllab/index.test.js
new file mode 100644
index 0000000..fe85fd1
--- /dev/null
+++ b/superset/assets/cypress/integration/sqllab/index.test.js
@@ -0,0 +1,9 @@
+import queryTests from './query';
+import sourcePanelTests from './sourcePanel';
+import tabsTests from './tabs';
+
+describe('All SqlLab tests', () => {
+  queryTests();
+  sourcePanelTests();
+  tabsTests();
+});
diff --git a/superset/assets/cypress/integration/sqllab/query.js b/superset/assets/cypress/integration/sqllab/query.js
new file mode 100644
index 0000000..2f799b0
--- /dev/null
+++ b/superset/assets/cypress/integration/sqllab/query.js
@@ -0,0 +1,103 @@
+import shortid from 'shortid';
+import { selectResultsTab, assertSQLLabResultsAreEqual } from './sqllab.helper';
+
+export default () => {
+  describe('SqlLab query panel', () => {
+    beforeEach(() => {
+      cy.login();
+      cy.server();
+      cy.visit('/superset/sqllab');
+
+      cy.route('POST', '/superset/sql_json/**').as('sqlLabQuery');
+    });
+
+    it('supports entering and running a query', () => {
+      // row limit has to be < ~10 for us to be able to determine how many rows
+      // are fetched below (because React _Virtualized_ does not render all rows)
+      const rowLimit = 3;
+
+      cy.get('#brace-editor textarea').type(
+        `{selectall}{backspace}SELECT ds, gender, name, num FROM main.birth_names LIMIT ${rowLimit}`,
+        { force: true },
+      );
+      cy.get('#js-sql-toolbar button')
+        .eq(0)
+        .click();
+
+      cy.wait('@sqlLabQuery');
+
+      cy.get('.SouthPane .ReactVirtualized__Table')
+        .eq(0) // ensures results tab in case preview tab exists
+        .then((tableNodes) => {
+          const [header, bodyWrapper] = tableNodes[0].childNodes;
+          const body = bodyWrapper.childNodes[0];
+          const expectedColCount = header.childNodes.length;
+          const expectedRowCount = body.childNodes.length;
+          expect(expectedColCount).to.equal(4);
+          expect(expectedRowCount).to.equal(rowLimit);
+        });
+    });
+
+    it('successfully saves a query', () => {
+      cy.route('savedqueryviewapi/**').as('getSavedQuery');
+
+      const query = 'SELECT ds, gender, name, num FROM main.birth_names ORDER BY name LIMIT
3';
+      const savedQueryTitle = `CYPRESS TEST QUERY ${shortid.generate()}`;
+
+      // we will assert that the results of the query we save, and the saved query are the
same
+      let initialResultsTable = null;
+      let savedQueryResultsTable = null;
+
+      cy.get('#brace-editor textarea')
+        .type(`{selectall}{backspace}${query}`, { force: true })
+        .focus() // focus => blur is required for updating the query that is to be saved
+        .blur();
+
+      // ctrl + r also runs query
+      cy.get('#brace-editor textarea').type('{ctrl}r', { force: true });
+
+      cy.wait('@sqlLabQuery');
+
+      // Save results to check agains below
+      selectResultsTab().then((resultsA) => {
+        initialResultsTable = resultsA[0];
+      });
+
+      cy.get('#js-sql-toolbar button')
+        .eq(1) // save query
+        .click();
+
+      // Enter name + save into modal
+      cy.get('.modal-sm input').type(`{selectall}{backspace}${savedQueryTitle}`, {
+        force: true,
+      });
+
+      cy.get('.modal-sm .modal-body button')
+        .eq(0) // save
+        .click();
+
+      // visit saved queries
+      cy.visit('/sqllab/my_queries/');
+
+      // first row contains most recent link, follow back to SqlLab
+      cy.get('table tr:first-child a[href*="savedQueryId"').click();
+
+      // will timeout without explicitly waiting here
+      cy.wait('@getSavedQuery');
+
+      // run the saved query
+      cy.get('#js-sql-toolbar button')
+        .eq(0) // run query
+        .click();
+
+      cy.wait('@sqlLabQuery');
+
+      // assert the results of the saved query match the initial results
+      selectResultsTab().then((resultsB) => {
+        savedQueryResultsTable = resultsB[0];
+
+        assertSQLLabResultsAreEqual(initialResultsTable, savedQueryResultsTable);
+      });
+    });
+  });
+};
diff --git a/superset/assets/cypress/integration/sqllab/sourcePanel.js b/superset/assets/cypress/integration/sqllab/sourcePanel.js
new file mode 100644
index 0000000..5db5924
--- /dev/null
+++ b/superset/assets/cypress/integration/sqllab/sourcePanel.js
@@ -0,0 +1,57 @@
+import { selectResultsTab } from './sqllab.helper';
+
+export default () => {
+  describe('SqlLab datasource panel', () => {
+    beforeEach(() => {
+      cy.login();
+      cy.server();
+      cy.visit('/superset/sqllab');
+    });
+
+    it('creates a table schema and preview when a database, schema, and table are selected',
() => {
+      cy.route('/superset/table/**').as('tableMetadata');
+
+      // it should have dropdowns to select database, schema, and table
+      cy.get('.sql-toolbar .Select').should('have.length', 3);
+
+      cy.get('.sql-toolbar .table-schema').should('not.exist');
+      cy.get('.SouthPane .tab-content .filterable-table-container').should('not.exist');
+
+      cy.get('.sql-toolbar .Select')
+        .eq(0) // database select
+        .within(() => {
+          // note: we have to set force: true because the input is invisible / cypress throws
+          cy.get('input').type('main{enter}', { force: true });
+        });
+
+      cy.get('.sql-toolbar .Select')
+        .eq(1) // schema select
+        .within(() => {
+          cy.get('input').type('main{enter}', { force: true });
+        });
+
+      cy.get('.sql-toolbar .Select')
+        .eq(2) // table select
+        .within(() => {
+          cy.get('input').type('birth_names{enter}', { force: true });
+        });
+
+      cy.wait('@tableMetadata');
+
+      cy.get('.sql-toolbar .table-schema').should('have.length', 1);
+      selectResultsTab().should('have.length', 1);
+
+      // add another table and check for added schema + preview
+      cy.get('.sql-toolbar .Select')
+        .eq(2)
+        .within(() => {
+          cy.get('input').type('logs{enter}', { force: true });
+        });
+
+      cy.wait('@tableMetadata');
+
+      cy.get('.sql-toolbar .table-schema').should('have.length', 2);
+      selectResultsTab().should('have.length', 2);
+    });
+  });
+};
diff --git a/superset/assets/cypress/integration/sqllab/sqllab.helper.js b/superset/assets/cypress/integration/sqllab/sqllab.helper.js
new file mode 100644
index 0000000..7c28b5f
--- /dev/null
+++ b/superset/assets/cypress/integration/sqllab/sqllab.helper.js
@@ -0,0 +1,22 @@
+export const selectResultsTab = () => cy.get('.SouthPane .ReactVirtualized__Table');
+
+// this function asserts that the result set for two SQL lab table results are equal
+export const assertSQLLabResultsAreEqual = (resultsA, resultsB) => {
+  const [headerA, bodyWrapperA] = resultsA.childNodes;
+  const bodyA = bodyWrapperA.childNodes[0];
+
+  const [headerB, bodyWrapperB] = resultsB.childNodes;
+  const bodyB = bodyWrapperB.childNodes[0];
+
+  expect(headerA.childNodes.length).to.equal(headerB.childNodes.length);
+  expect(bodyA.childNodes.length).to.equal(bodyB.childNodes.length);
+
+  bodyA.childNodes.forEach((rowA, rowIndex) => {
+    const rowB = bodyB.childNodes[rowIndex];
+
+    rowA.childNodes.forEach((cellA, columnIndex) => {
+      const cellB = rowB.childNodes[columnIndex];
+      expect(cellA.innerText).to.equal(cellB.innerText);
+    });
+  });
+};
diff --git a/superset/assets/cypress/integration/sqllab/tabs.js b/superset/assets/cypress/integration/sqllab/tabs.js
new file mode 100644
index 0000000..cf49c18
--- /dev/null
+++ b/superset/assets/cypress/integration/sqllab/tabs.js
@@ -0,0 +1,38 @@
+export default () => {
+  describe('SqlLab query tabs', () => {
+    beforeEach(() => {
+      cy.login();
+      cy.server();
+      cy.visit('/superset/sqllab');
+    });
+
+    it('allows you to create a tab', () => {
+      cy.get('#a11y-query-editor-tabs > ul > li').then((tabList) => {
+        const initialTabCount = tabList.length;
+
+        // add tab
+        cy.get('#a11y-query-editor-tabs > ul > li')
+          .last()
+          .click();
+
+        cy.get('#a11y-query-editor-tabs > ul > li').should('have.length', initialTabCount
+ 1);
+      });
+    });
+
+    it('allows you to close a tab', () => {
+      cy.get('#a11y-query-editor-tabs > ul > li').then((tabListA) => {
+        const initialTabCount = tabListA.length;
+
+        // open the tab dropdown to remove
+        cy.get('#a11y-query-editor-tabs > ul > li:first button').click();
+
+        // first item is close
+        cy.get('#a11y-query-editor-tabs > ul > li:first ul li a')
+          .eq(0)
+          .click();
+
+        cy.get('#a11y-query-editor-tabs > ul > li').should('have.length', initialTabCount
- 1);
+      });
+    });
+  });
+};
diff --git a/superset/assets/src/SqlLab/components/TableElement.jsx b/superset/assets/src/SqlLab/components/TableElement.jsx
index b1e53a9..ce6bf68 100644
--- a/superset/assets/src/SqlLab/components/TableElement.jsx
+++ b/superset/assets/src/SqlLab/components/TableElement.jsx
@@ -216,7 +216,7 @@ class TableElement extends React.PureComponent {
         transitionAppear
         onExited={this.removeFromStore.bind(this)}
       >
-        <div className="TableElement m-b-10">
+        <div className="TableElement table-schema m-b-10">
           {this.renderHeader()}
           <div>
             {this.renderBody()}


Mime
View raw message