From 388b549de90a55530052bb737d4e7cfe8e477db5 Mon Sep 17 00:00:00 2001 From: Alexander Polyankin <alexander.polyankin@metabase.com> Date: Mon, 17 Jul 2023 15:33:55 +0300 Subject: [PATCH] Add more e2e tests for drill options (#32431) --- .../drillthroughs/chart_drill.cy.spec.js | 125 +++++++++++ .../drillthroughs/dash_drill.cy.spec.js | 1 - .../drillthroughs/table_drills.cy.spec.js | 201 ++++++++++++++++++ .../modes/components/modes/TimeseriesMode.jsx | 2 +- 4 files changed, 327 insertions(+), 2 deletions(-) create mode 100644 e2e/test/scenarios/visualizations/drillthroughs/table_drills.cy.spec.js diff --git a/e2e/test/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js b/e2e/test/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js index e92eb421969..a493fc843c3 100644 --- a/e2e/test/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js +++ b/e2e/test/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js @@ -640,6 +640,131 @@ describe("scenarios > visualizations > drillthroughs > chart drill", () => { cy.findByText("Doohickey").should("not.exist"); }); }); + + it("should display proper drills on chart click for line chart", () => { + cy.createQuestion( + { + name: "Line chart drills", + query: { + "source-table": ORDERS_ID, + aggregation: [["count"]], + breakout: [ + [ + "field", + PRODUCTS.CREATED_AT, + { "source-field": ORDERS.PRODUCT_ID, "temporal-unit": "month" }, + ], + ["field", PRODUCTS.CATEGORY, { "source-field": ORDERS.PRODUCT_ID }], + ], + }, + display: "line", + }, + { visitQuestion: true }, + ); + + cy.get(".LineAreaBarChart").get(".dot").first().click({ force: true }); + popover().within(() => { + cy.findByText(`See these Orders`).should("be.visible"); + + cy.findByText(`See this month by week`).should("be.visible"); + + cy.findByText(`Break out by…`).should("be.visible"); + cy.findByText(`Automatic insights…`).should("be.visible"); + + cy.findByText(`>`).should("be.visible"); + cy.findByText(`<`).should("be.visible"); + cy.findByText(`=`).should("be.visible"); + cy.findByText(`≠`).should("be.visible"); + }); + + cy.findByTestId("timeseries-mode-bar").within(() => { + cy.findByText(`View`).should("be.visible"); + cy.findByText(`All Time`).should("be.visible"); + cy.findByText(`by`).should("be.visible"); + cy.findByText(`Month`).should("be.visible"); + }); + }); + + it("should display proper drills on chart click for bar chart", () => { + cy.createQuestion( + { + name: "Line chart drills", + query: { + "source-table": ORDERS_ID, + aggregation: [["count"]], + breakout: [ + [ + "field", + PRODUCTS.CREATED_AT, + { "source-field": ORDERS.PRODUCT_ID, "temporal-unit": "month" }, + ], + ["field", PRODUCTS.CATEGORY, { "source-field": ORDERS.PRODUCT_ID }], + ], + }, + display: "bar", + }, + { visitQuestion: true }, + ); + + cy.get(".LineAreaBarChart").findAllByTestId("legend-item").first().click(); + + popover().within(() => { + cy.findByText(`See these Orders`).should("be.visible"); + cy.findByText(`Automatic insights…`).should("be.visible"); + }); + + cy.get(".LineAreaBarChart").get(".bar").first().click({ force: true }); + popover().within(() => { + cy.findByText(`See these Orders`).should("be.visible"); + + cy.findByText(`See this month by week`).should("be.visible"); + + cy.findByText(`Break out by…`).should("be.visible"); + cy.findByText(`Automatic insights…`).should("be.visible"); + + cy.findByText(`>`).should("be.visible"); + cy.findByText(`<`).should("be.visible"); + cy.findByText(`=`).should("be.visible"); + cy.findByText(`≠`).should("be.visible"); + }); + + cy.findByTestId("timeseries-mode-bar").within(() => { + cy.findByText(`View`).should("be.visible"); + cy.findByText(`All Time`).should("be.visible"); + cy.findByText(`by`).should("be.visible"); + cy.findByText(`Month`).should("be.visible"); + }); + }); + + it("should display proper drills on chart click for query grouped by state", () => { + cy.createQuestion( + { + name: "Line chart drills", + query: { + "source-table": PEOPLE_ID, + aggregation: [["count"]], + breakout: [["field", PEOPLE.STATE, null]], + }, + display: "map", + }, + { visitQuestion: true }, + ); + + cy.get(".CardVisualization").get("path.cursor-pointer").first().click(); + + popover().within(() => { + cy.findByText(`See these People`).should("be.visible"); + cy.findByText(`Zoom in`).should("be.visible"); + + cy.findByText(`Break out by…`).should("be.visible"); + cy.findByText(`Automatic insights…`).should("be.visible"); + + cy.findByText(`>`).should("be.visible"); + cy.findByText(`<`).should("be.visible"); + cy.findByText(`=`).should("be.visible"); + cy.findByText(`≠`).should("be.visible"); + }); + }); }); function hoverLineDot({ index } = {}) { diff --git a/e2e/test/scenarios/visualizations/drillthroughs/dash_drill.cy.spec.js b/e2e/test/scenarios/visualizations/drillthroughs/dash_drill.cy.spec.js index 400b86438cb..086947bea53 100644 --- a/e2e/test/scenarios/visualizations/drillthroughs/dash_drill.cy.spec.js +++ b/e2e/test/scenarios/visualizations/drillthroughs/dash_drill.cy.spec.js @@ -1,4 +1,3 @@ -// Imported from drillthroughs.e2e.spec.js import { addOrUpdateDashboardCard, restore, diff --git a/e2e/test/scenarios/visualizations/drillthroughs/table_drills.cy.spec.js b/e2e/test/scenarios/visualizations/drillthroughs/table_drills.cy.spec.js new file mode 100644 index 00000000000..35ea70089da --- /dev/null +++ b/e2e/test/scenarios/visualizations/drillthroughs/table_drills.cy.spec.js @@ -0,0 +1,201 @@ +import { openReviewsTable, popover, restore } from "e2e/support/helpers"; +import { SAMPLE_DATABASE } from "e2e/support/cypress_sample_database"; + +const { REVIEWS, REVIEWS_ID } = SAMPLE_DATABASE; + +describe("scenarios > visualizations > drillthroughs > table_drills", function () { + beforeEach(() => { + restore(); + cy.signInAsAdmin(); + }); + + it("should display proper drills on cell click for unaggregated query", () => { + openReviewsTable({ limit: 3 }); + + // FK cell drills + cy.get(".Table-FK").findByText("1").first().click(); + popover().within(() => { + cy.findByText(`View this Product's Reviews`).should("be.visible"); + cy.findByText(`View details`).should("be.visible"); + }); + + // Short text cell drills + cy.get(".cellData").contains("christ").click(); + popover().within(() => { + cy.findByText(`Is christ`).should("be.visible"); + cy.findByText(`Is not christ`).should("be.visible"); + cy.findByText(`View details`).should("be.visible"); + }); + + // Number cell drills + cy.get(".cellData").contains("5").first().click(); + popover().within(() => { + cy.findByText(`>`).should("be.visible"); + cy.findByText(`<`).should("be.visible"); + cy.findByText(`=`).should("be.visible"); + cy.findByText(`≠`).should("be.visible"); + cy.findByText(`View details`).should("be.visible"); + }); + + cy.get(".cellData").contains("Ad perspiciatis quis").click(); + popover().within(() => { + cy.findByText(`Contains…`).should("be.visible"); + cy.findByText(`Does not contain…`).should("be.visible"); + cy.findByText(`View details`).should("be.visible"); + }); + + cy.get(".cellData").contains("May 15, 20").click(); + popover().within(() => { + cy.findByText(`Before`).should("be.visible"); + cy.findByText(`After`).should("be.visible"); + cy.findByText(`On`).should("be.visible"); + cy.findByText(`Not on`).should("be.visible"); + cy.findByText(`View details`).should("be.visible"); + }); + + cy.get(".cellData").contains("ID").click({ force: true }); + popover().within(() => { + cy.icon("arrow_down").should("be.visible"); + cy.icon("arrow_up").should("be.visible"); + cy.icon("gear").should("be.visible"); + + cy.findByText(`Filter by this column`).should("be.visible"); + cy.findByText(`Distinct values`).should("be.visible"); + }); + + cy.get(".cellData").contains("Reviewer").click(); + popover().within(() => { + cy.icon("arrow_down").should("be.visible"); + cy.icon("arrow_up").should("be.visible"); + cy.icon("gear").should("be.visible"); + + cy.findByText(`Filter by this column`).should("be.visible"); + cy.findByText(`Distribution`).should("be.visible"); + cy.findByText(`Distinct values`).should("be.visible"); + }); + + cy.get(".cellData").contains("Rating").click(); + popover().within(() => { + cy.icon("arrow_down").should("be.visible"); + cy.icon("arrow_up").should("be.visible"); + cy.icon("gear").should("be.visible"); + + cy.findByText(`Filter by this column`).should("be.visible"); + cy.findByText(`Sum over time`).should("be.visible"); + cy.findByText(`Distribution`).should("be.visible"); + + cy.findByText(`Sum`).should("be.visible"); + cy.findByText(`Avg`).should("be.visible"); + cy.findByText(`Distinct values`).should("be.visible"); + }); + }); + + it(`should display proper drills on cell click for query aggregated by category`, () => { + cy.createQuestion( + { + query: { + "source-table": REVIEWS_ID, + aggregation: [["count"]], + breakout: [["field", REVIEWS.REVIEWER, null]], + limit: 10, + }, + }, + { visitQuestion: true }, + ); + + cy.get(".cellData").contains("abbey-heidenreich").click(); + popover().within(() => { + cy.findByText(`Is abbey-heidenreich`).should("be.visible"); + cy.findByText(`Is not abbey-heidenreich`).should("be.visible"); + }); + + cy.get(".cellData").contains("1").first().click(); + popover().within(() => { + cy.findByText(`See this Review`).should("be.visible"); + + cy.findByText(`Automatic insights…`).should("be.visible"); + + cy.findByText(`>`).should("be.visible"); + cy.findByText(`<`).should("be.visible"); + cy.findByText(`=`).should("be.visible"); + cy.findByText(`≠`).should("be.visible"); + }); + + cy.get(".cellData").contains("Reviewer").click(); + popover().within(() => { + cy.icon("arrow_down").should("be.visible"); + cy.icon("arrow_up").should("be.visible"); + cy.icon("gear").should("be.visible"); + + cy.findByText(`Filter by this column`).should("be.visible"); + }); + + cy.get(".cellData").contains("Count").click(); + popover().within(() => { + cy.icon("arrow_down").should("be.visible"); + cy.icon("arrow_up").should("be.visible"); + cy.icon("gear").should("be.visible"); + + cy.findByText(`Filter by this column`).should("be.visible"); + }); + }); + + it(`should display proper drills on cell click for query aggregated by date`, () => { + cy.createQuestion( + { + query: { + "source-table": REVIEWS_ID, + aggregation: [["count"]], + breakout: [ + ["field", REVIEWS.CREATED_AT, { "temporal-unit": "month" }], + ], + limit: 10, + }, + }, + { visitQuestion: true }, + ); + + cy.get(".cellData").contains("June,").first().click(); + popover().within(() => { + cy.findByText(`Before`).should("be.visible"); + cy.findByText(`After`).should("be.visible"); + cy.findByText(`On`).should("be.visible"); + cy.findByText(`Not on`).should("be.visible"); + }); + + cy.get(".cellData").contains("4").first().click(); + popover().within(() => { + cy.findByText(`See this month by week`).should("be.visible"); + + cy.findByText(`Break out by…`).should("be.visible"); + cy.findByText(`Automatic insights…`).should("be.visible"); + + cy.findByText(`>`).should("be.visible"); + cy.findByText(`<`).should("be.visible"); + cy.findByText(`=`).should("be.visible"); + cy.findByText(`≠`).should("be.visible"); + }); + + cy.findByTestId("timeseries-mode-bar").within(() => { + cy.findByText(`View`).should("be.visible"); + cy.findByText(`All Time`).should("be.visible"); + cy.findByText(`by`).should("be.visible"); + cy.findByText(`Month`).should("be.visible"); + }); + }); + + it(`should display proper drills for native query`, () => { + cy.createNativeQuestion( + { + name: "table_drills", + native: { query: `select * from orders limit 3` }, + }, + { visitQuestion: true }, + ); + + cy.get(".cellData").contains("1").first().click(); + popover() + .findByText(`Drill-through doesn’t work on SQL questions.`) + .should("be.visible"); + }); +}); diff --git a/frontend/src/metabase/modes/components/modes/TimeseriesMode.jsx b/frontend/src/metabase/modes/components/modes/TimeseriesMode.jsx index 7fb00a71d65..e18d248c1b1 100644 --- a/frontend/src/metabase/modes/components/modes/TimeseriesMode.jsx +++ b/frontend/src/metabase/modes/components/modes/TimeseriesMode.jsx @@ -12,7 +12,7 @@ const TimeseriesModeFooter = props => { }; return ( - <div className="flex layout-centered"> + <div className="flex layout-centered" data-testid="timeseries-mode-bar"> <span className="mr1">{t`View`}</span> <TimeseriesFilterWidget {...props} card={props.lastRunCard} /> <span className="mx1">{t`by`}</span> -- GitLab