This is an automated email from the ASF dual-hosted git repository.

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


The following commit(s) were added to refs/heads/master by this push:
     new 2fe68a3633 chore: E2E Dashboards Cross-references (#21805)
2fe68a3633 is described below

commit 2fe68a36331b341888d9d7f54300e27c81f77a46
Author: Geido <[email protected]>
AuthorDate: Fri Oct 21 15:10:35 2022 +0300

    chore: E2E Dashboards Cross-references (#21805)
---
 .../cypress-base/cypress/fixtures/charts.json      |  20 ++--
 .../cypress-base/cypress/fixtures/dashboards.json  |  28 ++++++
 .../cypress/integration/chart_list/list.test.ts    |  67 ++++++++++++-
 .../cypress/integration/dashboard/actions.test.js  |   2 +-
 .../cypress/integration/dashboard/editmode.test.ts |   6 +-
 .../integration/dashboard/nativeFilters.test.ts    |   6 +-
 .../integration/dashboard_list/list.test.ts        |   2 +-
 .../cypress/integration/explore/chart.test.js      | 106 +++++++++++++++++++++
 .../cypress/integration/explore/utils.ts           |  20 ++++
 .../src/components/ListView/CrossLinks.tsx         |   2 +-
 .../src/components/MetadataBar/MetadataBar.tsx     |   2 +-
 11 files changed, 239 insertions(+), 22 deletions(-)

diff --git a/superset-frontend/cypress-base/cypress/fixtures/charts.json 
b/superset-frontend/cypress-base/cypress/fixtures/charts.json
index 6b342ee9a5..5781fce81e 100644
--- a/superset-frontend/cypress-base/cypress/fixtures/charts.json
+++ b/superset-frontend/cypress-base/cypress/fixtures/charts.json
@@ -5,8 +5,9 @@
     "owners": [1],
     "viz_type": "line",
     "cache_timeout": 1000,
-    "datasource_id": 1,
-    "datasource_type": "table"
+    "datasource_id": 2,
+    "datasource_type": "table",
+    "params": "{\"viz_type\":\"line\",\"metrics\":[\"count\"]}"
   },
   {
     "slice_name": "2 - Sample chart",
@@ -14,8 +15,9 @@
     "owners": [1],
     "viz_type": "line",
     "cache_timeout": 1000,
-    "datasource_id": 1,
-    "datasource_type": "table"
+    "datasource_id": 2,
+    "datasource_type": "table",
+    "params": "{\"viz_type\":\"line\",\"metrics\":[\"count\"]}"
   },
   {
     "slice_name": "3 - Sample chart",
@@ -23,8 +25,9 @@
     "owners": [1],
     "viz_type": "line",
     "cache_timeout": 1000,
-    "datasource_id": 1,
-    "datasource_type": "table"
+    "datasource_id": 2,
+    "datasource_type": "table",
+    "params": "{\"viz_type\":\"line\",\"metrics\":[\"count\"]}"
   },
   {
     "slice_name": "4 - Sample chart",
@@ -32,7 +35,8 @@
     "owners": [1],
     "viz_type": "line",
     "cache_timeout": 1000,
-    "datasource_id": 1,
-    "datasource_type": "table"
+    "datasource_id": 2,
+    "datasource_type": "table",
+    "params": "{\"viz_type\":\"line\",\"metrics\":[\"count\"]}"
   }
 ]
diff --git a/superset-frontend/cypress-base/cypress/fixtures/dashboards.json 
b/superset-frontend/cypress-base/cypress/fixtures/dashboards.json
index 083d7647b9..e4bd57971a 100644
--- a/superset-frontend/cypress-base/cypress/fixtures/dashboards.json
+++ b/superset-frontend/cypress-base/cypress/fixtures/dashboards.json
@@ -14,5 +14,33 @@
   {
     "dashboard_title": "4 - Sample dashboard",
     "slug": "4-sample-dashboard"
+  },
+  {
+    "dashboard_title": "5 - Sample dashboard",
+    "slug": "5-sample-dashboard"
+  },
+  {
+    "dashboard_title": "6 - Sample dashboard",
+    "slug": "6-sample-dashboard"
+  },
+  {
+    "dashboard_title": "7 - Sample dashboard",
+    "slug": "7-sample-dashboard"
+  },
+  {
+    "dashboard_title": "8 - Sample dashboard",
+    "slug": "8-sample-dashboard"
+  },
+  {
+    "dashboard_title": "9 - Sample dashboard",
+    "slug": "9-sample-dashboard"
+  },
+  {
+    "dashboard_title": "10 - Sample dashboard",
+    "slug": "10-sample-dashboard"
+  },
+  {
+    "dashboard_title": "11 - Sample dashboard",
+    "slug": "11-sample-dashboard"
   }
 ]
diff --git 
a/superset-frontend/cypress-base/cypress/integration/chart_list/list.test.ts 
b/superset-frontend/cypress-base/cypress/integration/chart_list/list.test.ts
index 6981ead73a..9891b09be7 100644
--- a/superset-frontend/cypress-base/cypress/integration/chart_list/list.test.ts
+++ b/superset-frontend/cypress-base/cypress/integration/chart_list/list.test.ts
@@ -23,7 +23,11 @@ import {
   interceptBulkDelete,
   interceptUpdate,
   interceptDelete,
+  visitSampleChartFromList,
+  saveChartToDashboard,
+  interceptFiltering,
 } from '../explore/utils';
+import { interceptGet as interceptDashboardGet } from '../dashboard/utils';
 
 function orderAlphabetical() {
   setFilter('Sort', 'Alphabetical');
@@ -43,14 +47,69 @@ function confirmDelete() {
   cy.getBySel('modal-confirm-button').click();
 }
 
+function visitChartList() {
+  interceptFiltering();
+  cy.visit(CHART_LIST);
+  cy.wait('@filtering');
+}
+
 describe('Charts list', () => {
   beforeEach(() => {
     cy.preserveLogin();
   });
 
+  describe('Cross-referenced dashboards', () => {
+    beforeEach(() => {
+      visitChartList();
+    });
+
+    before(() => {
+      cy.createSampleDashboards([0, 1, 2, 3]);
+      cy.createSampleCharts([0]);
+    });
+
+    it('should show the cross-referenced dashboards in the table cell', () => {
+      interceptDashboardGet();
+      cy.getBySel('table-row')
+        .first()
+        .find('[data-test="table-row-cell"]')
+        .find('[data-test="crosslinks"]')
+        .should('be.empty');
+      cy.getBySel('table-row')
+        .eq(10)
+        .find('[data-test="table-row-cell"]')
+        .find('[data-test="crosslinks"]')
+        .contains('Supported Charts Dashboard')
+        .invoke('removeAttr', 'target')
+        .click();
+      cy.wait('@get');
+    });
+
+    it('should show the newly added dashboards in a tooltip', () => {
+      interceptDashboardGet();
+      visitSampleChartFromList('1 - Sample chart');
+      saveChartToDashboard('1 - Sample dashboard');
+      saveChartToDashboard('2 - Sample dashboard');
+      saveChartToDashboard('3 - Sample dashboard');
+      saveChartToDashboard('4 - Sample dashboard');
+      visitChartList();
+      cy.getBySel('count-crosslinks').should('be.visible');
+      cy.getBySel('crosslinks')
+        .first()
+        .trigger('mouseover')
+        .then(() => {
+          cy.get('.ant-tooltip')
+            .contains('4 - Sample dashboard')
+            .invoke('removeAttr', 'target')
+            .click();
+          cy.wait('@get');
+        });
+    });
+  });
+
   describe('list mode', () => {
     before(() => {
-      cy.visit(CHART_LIST);
+      visitChartList();
       setGridMode('list');
     });
 
@@ -94,7 +153,7 @@ describe('Charts list', () => {
 
   describe('card mode', () => {
     before(() => {
-      cy.visit(CHART_LIST);
+      visitChartList();
       setGridMode('card');
     });
 
@@ -126,8 +185,8 @@ describe('Charts list', () => {
 
   describe('common actions', () => {
     beforeEach(() => {
-      cy.createSampleCharts();
-      cy.visit(CHART_LIST);
+      cy.createSampleCharts([0, 1, 2, 3]);
+      visitChartList();
     });
 
     it('should allow to favorite/unfavorite', () => {
diff --git 
a/superset-frontend/cypress-base/cypress/integration/dashboard/actions.test.js 
b/superset-frontend/cypress-base/cypress/integration/dashboard/actions.test.js
index de7c412934..8d520d9729 100644
--- 
a/superset-frontend/cypress-base/cypress/integration/dashboard/actions.test.js
+++ 
b/superset-frontend/cypress-base/cypress/integration/dashboard/actions.test.js
@@ -21,7 +21,7 @@ import { interceptFav, interceptUnfav } from './utils';
 
 describe('Dashboard actions', () => {
   beforeEach(() => {
-    cy.createSampleDashboards();
+    cy.createSampleDashboards([0]);
     cy.visit(SAMPLE_DASHBOARD_1);
   });
 
diff --git 
a/superset-frontend/cypress-base/cypress/integration/dashboard/editmode.test.ts 
b/superset-frontend/cypress-base/cypress/integration/dashboard/editmode.test.ts
index 0fffc58595..6ed1ec4ee0 100644
--- 
a/superset-frontend/cypress-base/cypress/integration/dashboard/editmode.test.ts
+++ 
b/superset-frontend/cypress-base/cypress/integration/dashboard/editmode.test.ts
@@ -648,7 +648,7 @@ describe('Dashboard edit', () => {
 
   describe('Edit properties', () => {
     before(() => {
-      cy.createSampleDashboards();
+      cy.createSampleDashboards([0]);
       visitEdit();
     });
 
@@ -700,7 +700,7 @@ describe('Dashboard edit', () => {
 
   describe('Edit mode', () => {
     before(() => {
-      cy.createSampleDashboards();
+      cy.createSampleDashboards([0]);
       visitEdit();
     });
 
@@ -737,7 +737,7 @@ describe('Dashboard edit', () => {
 
   describe('Components', () => {
     before(() => {
-      cy.createSampleDashboards();
+      cy.createSampleDashboards([0]);
     });
 
     beforeEach(() => {
diff --git 
a/superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilters.test.ts
 
b/superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilters.test.ts
index 184ac86139..3f643cc32e 100644
--- 
a/superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilters.test.ts
+++ 
b/superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilters.test.ts
@@ -196,7 +196,7 @@ describe('Native filters', () => {
 
   describe('Nativefilters tests initial state required', () => {
     beforeEach(() => {
-      cy.createSampleDashboards();
+      cy.createSampleDashboards([0]);
     });
 
     it('Verify that default value is respected after revisit', () => {
@@ -379,7 +379,7 @@ describe('Native filters', () => {
 
   describe('Nativefilters basic interactions', () => {
     before(() => {
-      cy.createSampleDashboards();
+      cy.createSampleDashboards([0]);
       visitDashboard();
     });
 
@@ -437,7 +437,7 @@ describe('Native filters', () => {
 
   describe('Nativefilters initial state not required', () => {
     beforeEach(() => {
-      cy.createSampleDashboards();
+      cy.createSampleDashboards([0]);
     });
 
     it("User can check 'Filter has default value'", () => {
diff --git 
a/superset-frontend/cypress-base/cypress/integration/dashboard_list/list.test.ts
 
b/superset-frontend/cypress-base/cypress/integration/dashboard_list/list.test.ts
index c25b11e7b3..aeee9ba499 100644
--- 
a/superset-frontend/cypress-base/cypress/integration/dashboard_list/list.test.ts
+++ 
b/superset-frontend/cypress-base/cypress/integration/dashboard_list/list.test.ts
@@ -127,7 +127,7 @@ describe('Dashboards list', () => {
 
   describe('common actions', () => {
     beforeEach(() => {
-      cy.createSampleDashboards();
+      cy.createSampleDashboards([0, 1, 2, 3]);
       cy.visit(DASHBOARD_LIST);
     });
 
diff --git 
a/superset-frontend/cypress-base/cypress/integration/explore/chart.test.js 
b/superset-frontend/cypress-base/cypress/integration/explore/chart.test.js
index ca37bf9690..0dfc9bd46b 100644
--- a/superset-frontend/cypress-base/cypress/integration/explore/chart.test.js
+++ b/superset-frontend/cypress-base/cypress/integration/explore/chart.test.js
@@ -16,7 +16,113 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+import { CHART_LIST } from 'cypress/utils/urls';
+import { interceptGet as interceptDashboardGet } from 
'cypress/integration/dashboard/utils';
 import { FORM_DATA_DEFAULTS, NUM_METRIC } from 
'./visualizations/shared.helper';
+import {
+  interceptFiltering,
+  saveChartToDashboard,
+  visitSampleChartFromList,
+} from './utils';
+
+// SEARCH_THRESHOLD is 10. We need to add at least 11 dashboards to show search
+const SAMPLE_DASHBOARDS_INDEXES = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+
+function openDashboardsAddedTo() {
+  cy.getBySel('actions-trigger').click();
+  cy.get('.ant-dropdown-menu-submenu-title')
+    .contains('Dashboards added to')
+    .trigger('mouseover');
+}
+
+function closeDashboardsAddedTo() {
+  cy.get('.ant-dropdown-menu-submenu-title')
+    .contains('Dashboards added to')
+    .trigger('mouseout');
+  cy.getBySel('actions-trigger').click();
+}
+
+function verifyDashboardsSubmenuItem(dashboardName) {
+  cy.get('.ant-dropdown-menu-submenu-popup').contains(dashboardName);
+  closeDashboardsAddedTo();
+}
+
+function verifyDashboardSearch() {
+  openDashboardsAddedTo();
+  cy.get('.ant-dropdown-menu-submenu-popup').trigger('mouseover');
+  cy.get('.ant-dropdown-menu-submenu-popup')
+    .find('input[placeholder="Search"]')
+    .type('1');
+  cy.get('.ant-dropdown-menu-submenu-popup').contains('1 - Sample dashboard');
+  cy.get('.ant-dropdown-menu-submenu-popup')
+    .find('input[placeholder="Search"]')
+    .type('Blahblah');
+  cy.get('.ant-dropdown-menu-submenu-popup').contains('No results found');
+  cy.get('.ant-dropdown-menu-submenu-popup')
+    .find('[aria-label="close-circle"]')
+    .click();
+  closeDashboardsAddedTo();
+}
+
+function verifyDashboardLink() {
+  interceptDashboardGet();
+  openDashboardsAddedTo();
+  cy.get('.ant-dropdown-menu-submenu-popup').trigger('mouseover');
+  cy.get('.ant-dropdown-menu-submenu-popup a')
+    .first()
+    .invoke('removeAttr', 'target')
+    .click();
+  cy.wait('@get');
+}
+
+function verifyMetabar(text) {
+  cy.getBySel('metadata-bar').contains(text);
+}
+
+function saveAndVerifyDashboard(number) {
+  saveChartToDashboard(`${number} - Sample dashboard`);
+  verifyMetabar(`Added to ${number} dashboard(s)`);
+  openDashboardsAddedTo();
+  verifyDashboardsSubmenuItem(`${number} - Sample dashboard`);
+}
+
+describe('Cross-referenced dashboards', () => {
+  beforeEach(() => {
+    interceptFiltering();
+
+    cy.preserveLogin();
+    cy.visit(CHART_LIST);
+    cy.wait('@filtering');
+  });
+
+  before(() => {
+    cy.createSampleDashboards(SAMPLE_DASHBOARDS_INDEXES);
+    cy.createSampleCharts([0]);
+  });
+
+  it('should show the cross-referenced dashboards', () => {
+    visitSampleChartFromList('1 - Sample chart');
+
+    cy.getBySel('metadata-bar').contains('Not added to any dashboard');
+    openDashboardsAddedTo();
+    verifyDashboardsSubmenuItem('None');
+
+    saveAndVerifyDashboard('1');
+    saveAndVerifyDashboard('2');
+    saveAndVerifyDashboard('3');
+    saveAndVerifyDashboard('4');
+    saveAndVerifyDashboard('5');
+    saveAndVerifyDashboard('6');
+    saveAndVerifyDashboard('7');
+    saveAndVerifyDashboard('8');
+    saveAndVerifyDashboard('9');
+    saveAndVerifyDashboard('10');
+    saveAndVerifyDashboard('11');
+
+    verifyDashboardSearch();
+    verifyDashboardLink();
+  });
+});
 
 describe('No Results', () => {
   beforeEach(() => {
diff --git 
a/superset-frontend/cypress-base/cypress/integration/explore/utils.ts 
b/superset-frontend/cypress-base/cypress/integration/explore/utils.ts
index 99efedcd53..83e391acc0 100644
--- a/superset-frontend/cypress-base/cypress/integration/explore/utils.ts
+++ b/superset-frontend/cypress-base/cypress/integration/explore/utils.ts
@@ -49,3 +49,23 @@ export function setFilter(filter: string, option: string) {
 
   cy.wait('@filtering');
 }
+
+export function saveChartToDashboard(dashboardName: string) {
+  cy.getBySel('query-save-button').click();
+  cy.get(
+    '[data-test="save-chart-modal-select-dashboard-form"] [aria-label="Select 
a dashboard"]',
+  )
+    .first()
+    .click();
+  cy.get(
+    '.ant-select-selection-search-input[aria-label="Select a dashboard"]',
+  ).type(dashboardName);
+  cy.get(`.ant-select-item-option[title="${dashboardName}"]`).click();
+  cy.getBySel('btn-modal-save').click();
+}
+
+export function visitSampleChartFromList(chartName: string) {
+  cy.getBySel('table-row').contains(chartName).click();
+  cy.intercept('POST', '/superset/explore_json/**').as('getJson');
+  cy.wait(500);
+}
diff --git a/superset-frontend/src/components/ListView/CrossLinks.tsx 
b/superset-frontend/src/components/ListView/CrossLinks.tsx
index 3941bcf6ca..653e97b06e 100644
--- a/superset-frontend/src/components/ListView/CrossLinks.tsx
+++ b/superset-frontend/src/components/ListView/CrossLinks.tsx
@@ -112,7 +112,7 @@ export default function CrossLinks({
       >
         {links}
         {hasHiddenElements && (
-          <span ref={plusRef} className="count">
+          <span ref={plusRef} className="count" data-test="count-crosslinks">
             +{elementsTruncated}
           </span>
         )}
diff --git a/superset-frontend/src/components/MetadataBar/MetadataBar.tsx 
b/superset-frontend/src/components/MetadataBar/MetadataBar.tsx
index 57733b7160..3756722523 100644
--- a/superset-frontend/src/components/MetadataBar/MetadataBar.tsx
+++ b/superset-frontend/src/components/MetadataBar/MetadataBar.tsx
@@ -203,7 +203,7 @@ const MetadataBar = ({ items }: MetadataBarProps) => {
   const { ref } = useResizeDetector({ onResize });
 
   return (
-    <Bar ref={ref} count={count}>
+    <Bar ref={ref} count={count} data-test="metadata-bar">
       {sortedItems.map((item, index) => (
         <Item
           barWidth={width}

Reply via email to