From fd6c4a42fde169a3c0a4e324f7faa84003a88979 Mon Sep 17 00:00:00 2001
From: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Date: Sun, 10 Apr 2022 00:43:27 +0200
Subject: [PATCH] [E2E] Deprecate the `/question/new` route for simple mode
 (#21564)

---
 docs/developers-guide/e2e-tests.md            |  2 +-
 .../notebook/notebook.cy.spec.js              |  5 +-
 .../admin/datamodel/field.cy.spec.js          |  4 +-
 .../binning/binning-reproductions.cy.spec.js  | 23 +++---
 .../binning/qb-explicit-joins.cy.spec.js      | 18 +++--
 .../metabase/scenarios/binning/sql.cy.spec.js | 10 ++-
 .../collections/collections.cy.spec.js        |  4 +-
 .../scenarios/dashboard/x-rays.cy.spec.js     |  6 +-
 .../scenarios/downloads/downloads.cy.spec.js  | 11 ++-
 .../scenarios/native/data_ref.cy.spec.js      |  5 +-
 .../scenarios/native/native-mysql.cy.spec.js  | 12 ++--
 .../snippets/snippet-permissions.cy.spec.js   | 11 ++-
 .../onboarding/reference/databases.cy.spec.js |  8 +--
 ...tabase-without-data-permissions.cy.spec.js |  9 ++-
 .../scenarios/question/loading.cy.spec.js     |  5 +-
 .../scenarios/question/nested.cy.spec.js      | 72 ++++++++-----------
 .../scenarios/question/new.cy.spec.js         | 69 +-----------------
 .../question/query-external.cy.spec.js        |  7 +-
 ...3-postgres-show-row-details-on-pk-click.js | 10 ++-
 ...-to-save-question-before-query-executed.js | 12 ++--
 .../scenarios/question/saved.cy.spec.js       |  8 ++-
 .../drillthroughs/chart_drill.cy.spec.js      |  7 +-
 22 files changed, 121 insertions(+), 197 deletions(-)

diff --git a/docs/developers-guide/e2e-tests.md b/docs/developers-guide/e2e-tests.md
index 20965b135c5..8c5c3a61de1 100644
--- a/docs/developers-guide/e2e-tests.md
+++ b/docs/developers-guide/e2e-tests.md
@@ -38,7 +38,7 @@ describe("homepage",() => {
 
 We strongly prefer using selectors like `cy.findByText()` and `cy.findByLabelText()` from [`@testing-library/cypress`](https://github.com/testing-library/cypress-testing-library) since they encourage writing tests that don't depend on implementation details like CSS class names.
 
-Try to avoid repeatedly testing pieces of the application incidentally. For example, if you want to test something about the query builder, jump straight there using a URL like `cy.visit("/question/new?database=1&table=2");` rather than starting from the home page, clicking "Ask a question", etc.
+Try to avoid repeatedly testing pieces of the application incidentally. For example, if you want to test something about the query builder, jump straight there using a helper like `openOrdersTable()` rather than starting from the home page, clicking "New", then "Question", etc.
 
 ## Cypress Documentation
 
diff --git a/frontend/test/metabase-visual/notebook/notebook.cy.spec.js b/frontend/test/metabase-visual/notebook/notebook.cy.spec.js
index 29eacf3bcc6..38b9043d077 100644
--- a/frontend/test/metabase-visual/notebook/notebook.cy.spec.js
+++ b/frontend/test/metabase-visual/notebook/notebook.cy.spec.js
@@ -87,8 +87,9 @@ describe("visual tests > notebook > Run buttons", () => {
 
   // This tests that the run buttons are the correct size on the Native query page
   it("in Native Query render correctly", () => {
-    cy.visit("/question/new");
-    cy.findByText("Native query").click();
+    cy.visit("/");
+    cy.findByText("New").click();
+    cy.findByText("SQL query").click();
 
     // Check that we're on the blank question page
     cy.findByText("Here's where your results will appear");
diff --git a/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js b/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
index 8803187efca..e5dd65dd0a2 100644
--- a/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
@@ -3,6 +3,7 @@ import {
   withDatabase,
   visitAlias,
   popover,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database";
@@ -131,8 +132,7 @@ describe.skip("scenarios > admin > datamodel > field", () => {
       cy.findByText("Saved!");
 
       // check that it appears in QB
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("sqlite").click();
       cy.findByText("Number With Nulls").click();
       cy.findByText("nothin");
diff --git a/frontend/test/metabase/scenarios/binning/binning-reproductions.cy.spec.js b/frontend/test/metabase/scenarios/binning/binning-reproductions.cy.spec.js
index 0bd9bbe1b2f..79b6ddff217 100644
--- a/frontend/test/metabase/scenarios/binning/binning-reproductions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/binning/binning-reproductions.cy.spec.js
@@ -203,8 +203,9 @@ describe("binning related reproductions", () => {
       );
     });
 
-    it("should work for simple question", () => {
-      openSummarizeOptions("Simple question");
+    it("should work for simple mode", () => {
+      openSummarizeOptions("Simple mode");
+
       changeBinningForDimension({
         name: "Average of Subtotal",
         fromBinning: "Auto binned",
@@ -214,8 +215,8 @@ describe("binning related reproductions", () => {
       cy.get(".bar");
     });
 
-    it("should work for custom question", () => {
-      openSummarizeOptions("Custom question");
+    it("should work for notebook mode", () => {
+      openSummarizeOptions("Notebook mode");
 
       cy.findByText("Pick the metric you want to see").click();
       cy.findByText("Count of rows").click();
@@ -252,13 +253,11 @@ describe("binning related reproductions", () => {
         },
       });
 
-      cy.intercept("POST", "/api/dataset").as("dataset");
-
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("SQL Binning").click();
-      cy.wait("@dataset");
+
+      visualize();
       summarize();
     });
 
@@ -298,12 +297,12 @@ describe("binning related reproductions", () => {
 });
 
 function openSummarizeOptions(questionType) {
-  cy.visit("/question/new");
-  cy.findByText(questionType).click();
+  startNewQuestion();
   cy.findByText("Saved Questions").click();
   cy.findByText("16379").click();
 
-  if (questionType === "Simple question") {
+  if (questionType === "Simple mode") {
+    visualize();
     summarize();
   }
 }
diff --git a/frontend/test/metabase/scenarios/binning/qb-explicit-joins.cy.spec.js b/frontend/test/metabase/scenarios/binning/qb-explicit-joins.cy.spec.js
index 6acb9f26a42..a154818f65c 100644
--- a/frontend/test/metabase/scenarios/binning/qb-explicit-joins.cy.spec.js
+++ b/frontend/test/metabase/scenarios/binning/qb-explicit-joins.cy.spec.js
@@ -65,13 +65,13 @@ describe("scenarios > binning > from a saved QB question with explicit joins", (
     cy.intercept("POST", "/api/dataset").as("dataset");
   });
 
-  context("via simple question", () => {
+  context("via simple mode", () => {
     beforeEach(() => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("QB Binning").click();
-      cy.wait("@dataset");
+
+      visualize();
       summarize();
     });
 
@@ -128,7 +128,7 @@ describe("scenarios > binning > from a saved QB question with explicit joins", (
     });
   });
 
-  context("via custom question", () => {
+  context("via notebook mode", () => {
     beforeEach(() => {
       startNewQuestion();
       cy.findByText("Saved Questions").click();
@@ -197,10 +197,10 @@ describe("scenarios > binning > from a saved QB question with explicit joins", (
 
   context("via column popover", () => {
     beforeEach(() => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("QB Binning").click();
+      visualize();
     });
 
     it("should work for time series", () => {
@@ -298,6 +298,10 @@ function assertQueryBuilderState({
 
   cy.findByText(title);
 
+  cy.get(".y-axis-label")
+    .invoke("text")
+    .should("eq", "Count");
+
   values &&
     cy.get(".axis.x").within(() => {
       values.forEach(value => {
diff --git a/frontend/test/metabase/scenarios/binning/sql.cy.spec.js b/frontend/test/metabase/scenarios/binning/sql.cy.spec.js
index c067b1e6ff4..a948ad06153 100644
--- a/frontend/test/metabase/scenarios/binning/sql.cy.spec.js
+++ b/frontend/test/metabase/scenarios/binning/sql.cy.spec.js
@@ -34,11 +34,10 @@ describe("scenarios > binning > from a saved sql question", () => {
 
   context("via simple question", () => {
     beforeEach(() => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("SQL Binning").click();
-      cy.wait("@dataset");
+      visualize();
       cy.findByTextEnsureVisible("LONGITUDE");
       summarize();
     });
@@ -163,11 +162,10 @@ describe("scenarios > binning > from a saved sql question", () => {
 
   context("via column popover", () => {
     beforeEach(() => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("SQL Binning").click();
-      cy.wait("@dataset");
+      visualize();
       cy.findByTextEnsureVisible("LONGITUDE");
     });
 
diff --git a/frontend/test/metabase/scenarios/collections/collections.cy.spec.js b/frontend/test/metabase/scenarios/collections/collections.cy.spec.js
index e16b48c9fc0..94242c1a7b2 100644
--- a/frontend/test/metabase/scenarios/collections/collections.cy.spec.js
+++ b/frontend/test/metabase/scenarios/collections/collections.cy.spec.js
@@ -7,6 +7,7 @@ import {
   navigationSidebar,
   closeNavigationSidebar,
   openNavigationSidebar,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 import { displaySidebarChildOf } from "./helpers/e2e-collections-sidebar.js";
 import { USERS, USER_GROUPS } from "__support__/e2e/cypress_data";
@@ -415,8 +416,7 @@ describe("scenarios > collection_defaults", () => {
         cy.findByText("Orders");
       });
 
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       popover().within(() => {
         cy.findByText("Saved Questions").click();
         // Note: collection name's first letter is capitalized
diff --git a/frontend/test/metabase/scenarios/dashboard/x-rays.cy.spec.js b/frontend/test/metabase/scenarios/dashboard/x-rays.cy.spec.js
index 7fdde07f9bc..6d901219753 100644
--- a/frontend/test/metabase/scenarios/dashboard/x-rays.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard/x-rays.cy.spec.js
@@ -4,6 +4,8 @@ import {
   visitQuestionAdhoc,
   popover,
   summarize,
+  visualize,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 import { SAMPLE_DB_ID } from "__support__/e2e/cypress_data";
@@ -82,10 +84,10 @@ describe("scenarios > x-rays", () => {
         native: { query: "select * from people" },
       });
 
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("15655").click();
+      visualize();
       summarize();
       getDimensionByName({ name: "SOURCE" }).click();
       cy.button("Done").click();
diff --git a/frontend/test/metabase/scenarios/downloads/downloads.cy.spec.js b/frontend/test/metabase/scenarios/downloads/downloads.cy.spec.js
index dcd655dbacd..3cff4561c63 100644
--- a/frontend/test/metabase/scenarios/downloads/downloads.cy.spec.js
+++ b/frontend/test/metabase/scenarios/downloads/downloads.cy.spec.js
@@ -1,4 +1,9 @@
-import { restore, downloadAndAssert } from "__support__/e2e/cypress";
+import {
+  restore,
+  downloadAndAssert,
+  startNewQuestion,
+  visualize,
+} from "__support__/e2e/cypress";
 
 const testCases = ["csv", "xlsx"];
 
@@ -10,11 +15,11 @@ describe("scenarios > question > download", () => {
 
   testCases.forEach(fileType => {
     it(`downloads ${fileType} file`, () => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("Orders, Count").click();
 
+      visualize();
       cy.contains("18,760");
 
       downloadAndAssert({ fileType }, sheet => {
diff --git a/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js b/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js
index 59ea230305c..d1d7d09ab71 100644
--- a/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js
+++ b/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore } from "__support__/e2e/cypress";
+import { restore, openNativeEditor } from "__support__/e2e/cypress";
 
 describe("scenarios > native question > data reference sidebar", () => {
   beforeEach(() => {
@@ -7,8 +7,7 @@ describe("scenarios > native question > data reference sidebar", () => {
   });
 
   it("should load needed data", () => {
-    cy.visit("/question/new");
-    cy.findByText("Native query").click();
+    openNativeEditor();
     cy.icon("reference").click();
     // Force-clicking was needed here because Cypress complains that "ORDERS" is covered by a <div>
     // TODO: Maybe re-think the structure of that component because that div seems unnecessary anyway
diff --git a/frontend/test/metabase/scenarios/native/native-mysql.cy.spec.js b/frontend/test/metabase/scenarios/native/native-mysql.cy.spec.js
index b2d0ae9de19..48b3864f7ac 100644
--- a/frontend/test/metabase/scenarios/native/native-mysql.cy.spec.js
+++ b/frontend/test/metabase/scenarios/native/native-mysql.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore, modal } from "__support__/e2e/cypress";
+import { restore, modal, openNativeEditor } from "__support__/e2e/cypress";
 
 const MYSQL_DB_NAME = "QA MySQL8";
 
@@ -9,15 +9,11 @@ describe("scenatios > question > native > mysql", () => {
 
     restore("mysql-8");
     cy.signInAsAdmin();
-
-    cy.visit("/question/new");
-    cy.contains("Native query").click();
-    cy.contains(MYSQL_DB_NAME).click();
   });
 
   it("can write a native MySQL query with a field filter", () => {
     // Write Native query that includes a filter
-    cy.get(".ace_content").type(
+    openNativeEditor({ databaseName: MYSQL_DB_NAME }).type(
       `SELECT TOTAL, CATEGORY FROM ORDERS LEFT JOIN PRODUCTS ON ORDERS.PRODUCT_ID = PRODUCTS.ID [[WHERE PRODUCTS.ID = {{id}}]];`,
       {
         parseSpecialCharSequences: false,
@@ -48,7 +44,9 @@ describe("scenatios > question > native > mysql", () => {
   });
 
   it("can save a native MySQL query", () => {
-    cy.get(".ace_content").type(`SELECT * FROM ORDERS`);
+    openNativeEditor({ databaseName: MYSQL_DB_NAME }).type(
+      `SELECT * FROM ORDERS`,
+    );
     cy.get(".NativeQueryEditor .Icon-play").click();
 
     cy.wait("@dataset");
diff --git a/frontend/test/metabase/scenarios/native/snippets/snippet-permissions.cy.spec.js b/frontend/test/metabase/scenarios/native/snippets/snippet-permissions.cy.spec.js
index a526f8a1af4..cd90f222a56 100644
--- a/frontend/test/metabase/scenarios/native/snippets/snippet-permissions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/native/snippets/snippet-permissions.cy.spec.js
@@ -13,8 +13,7 @@ describeEE("scenarios > question > snippets", () => {
   });
 
   it("can create a snippet", () => {
-    cy.visit("/question/new");
-    cy.contains("Native query").click();
+    openNativeEditor();
     cy.icon("snippet").click();
     cy.contains("Create a snippet").click();
     modal().within(() => {
@@ -66,8 +65,7 @@ describeEE("scenarios > question > snippets", () => {
     });
 
     // Grant access
-    cy.visit("/question/new");
-    cy.contains("Native query").click();
+    openNativeEditor();
     cy.icon("snippet").click();
 
     cy.findByTestId("sidebar-right")
@@ -111,9 +109,6 @@ describeEE("scenarios > question > snippets", () => {
   });
 
   it("should let you create a snippet folder and move a snippet into it", () => {
-    cy.visit("/question/new");
-    cy.contains("Native query").click();
-
     // create snippet via API
     cy.request("POST", "/api/native-query-snippet", {
       content: "snippet 1",
@@ -121,6 +116,8 @@ describeEE("scenarios > question > snippets", () => {
       collection_id: null,
     });
 
+    openNativeEditor();
+
     // create folder
     cy.icon("snippet").click();
     cy.findByTestId("sidebar-right")
diff --git a/frontend/test/metabase/scenarios/onboarding/reference/databases.cy.spec.js b/frontend/test/metabase/scenarios/onboarding/reference/databases.cy.spec.js
index 560d9bb0b47..9f86804137b 100644
--- a/frontend/test/metabase/scenarios/onboarding/reference/databases.cy.spec.js
+++ b/frontend/test/metabase/scenarios/onboarding/reference/databases.cy.spec.js
@@ -1,4 +1,4 @@
-import { popover, restore } from "__support__/e2e/cypress";
+import { popover, restore, startNewQuestion } from "__support__/e2e/cypress";
 
 describe("scenarios > reference > databases", () => {
   beforeEach(() => {
@@ -69,8 +69,7 @@ describe("scenarios > reference > databases", () => {
     });
 
     it("should sort databases in new UI based question data selection popover", () => {
-      checkQuestionSourceDatabasesOrder("Simple question");
-      checkQuestionSourceDatabasesOrder("Custom question");
+      checkQuestionSourceDatabasesOrder();
     });
 
     it.skip("should sort databases in new native question data selection popover", () => {
@@ -97,8 +96,7 @@ function checkQuestionSourceDatabasesOrder(question_type) {
       ? ".List-item-title"
       : ".List-section-title";
 
-  cy.visit("/question/new");
-  cy.findByText(question_type).click();
+  startNewQuestion();
   popover().within(() => {
     cy.get(selector)
       .as("databaseName")
diff --git a/frontend/test/metabase/scenarios/permissions/reproductions/13347-cannot-select-saved-question-in-database-without-data-permissions.cy.spec.js b/frontend/test/metabase/scenarios/permissions/reproductions/13347-cannot-select-saved-question-in-database-without-data-permissions.cy.spec.js
index 592a193edf7..b9b67103d90 100644
--- a/frontend/test/metabase/scenarios/permissions/reproductions/13347-cannot-select-saved-question-in-database-without-data-permissions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/permissions/reproductions/13347-cannot-select-saved-question-in-database-without-data-permissions.cy.spec.js
@@ -1,4 +1,8 @@
-import { restore, withDatabase } from "__support__/e2e/cypress";
+import {
+  restore,
+  withDatabase,
+  startNewQuestion,
+} from "__support__/e2e/cypress";
 import { USER_GROUPS } from "__support__/e2e/cypress_data";
 
 const { ALL_USERS_GROUP } = USER_GROUPS;
@@ -44,8 +48,7 @@ describe.skip("issue 13347", () => {
     it(`${test.toUpperCase()} version:\n should be able to select question (from "Saved Questions") which belongs to the database user doesn't have data-permissions for (metabase#13347)`, () => {
       cy.signIn("none");
 
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
 
       test === "QB" ? cy.findByText("Q1").click() : cy.findByText("Q2").click();
diff --git a/frontend/test/metabase/scenarios/question/loading.cy.spec.js b/frontend/test/metabase/scenarios/question/loading.cy.spec.js
index aa8dfa6dfde..42fede8808f 100644
--- a/frontend/test/metabase/scenarios/question/loading.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/loading.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore } from "__support__/e2e/cypress";
+import { restore, startNewQuestion } from "__support__/e2e/cypress";
 
 describe("scenarios > question > loading behavior", () => {
   beforeEach(() => {
@@ -16,8 +16,7 @@ describe("scenarios > question > loading behavior", () => {
     });
     // let the other preload happen since it matches the actual call from the component
     cy.route({ url: "/api/database?saved=true" }).as("fetch1");
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
+    startNewQuestion();
 
     cy.route({ url: "/api/database/1/schemas" }).as("fetch2");
     cy.route({ url: "/api/database/1/schema/PUBLIC" }).as("fetch3");
diff --git a/frontend/test/metabase/scenarios/question/nested.cy.spec.js b/frontend/test/metabase/scenarios/question/nested.cy.spec.js
index fbfb99ef1e4..7dacf269c68 100644
--- a/frontend/test/metabase/scenarios/question/nested.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/nested.cy.spec.js
@@ -8,6 +8,7 @@ import {
   getDimensionByName,
   summarize,
   visitDashboard,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 import { SAMPLE_DB_ID } from "__support__/e2e/cypress_data";
@@ -47,6 +48,10 @@ describe("scenarios > question > nested (metabase#12568)", () => {
       { loadMetadata: true, interceptAlias: "secondCardQuery" },
     );
 
+    startNewQuestion();
+
+    cy.contains("Saved Questions").click();
+
     // [quarantine] The whole CI was timing out
     // Create a complex native question
     // cy.createNativeQuestion({
@@ -83,10 +88,8 @@ describe("scenarios > question > nested (metabase#12568)", () => {
   });
 
   it("should allow Distribution on a Saved Simple Question", () => {
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
-    cy.contains("Saved Questions").click();
     cy.contains("GH_12568: Simple").click();
+    visualize();
     cy.contains("Count").click();
     cy.contains("Distribution").click();
     cy.contains("Count by Count: Auto binned");
@@ -94,10 +97,8 @@ describe("scenarios > question > nested (metabase#12568)", () => {
   });
 
   it("should allow Sum over time on a Saved Simple Question", () => {
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
-    cy.contains("Saved Questions").click();
     cy.contains("GH_12568: Simple").click();
+    visualize();
     cy.contains("Count").click();
     cy.contains("Sum over time").click();
     cy.contains("Sum of Count");
@@ -105,10 +106,8 @@ describe("scenarios > question > nested (metabase#12568)", () => {
   });
 
   it("should allow Distribution on a Saved SQL Question", () => {
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
-    cy.contains("Saved Questions").click();
     cy.contains("GH_12568: SQL").click();
+    visualize();
     cy.contains("COUNT").click();
     cy.contains("Distribution").click();
     cy.contains("Count by COUNT: Auto binned");
@@ -117,10 +116,8 @@ describe("scenarios > question > nested (metabase#12568)", () => {
 
   // [quarantine] The whole CI was timing out
   it.skip("should allow Sum over time on a Saved SQL Question", () => {
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
-    cy.contains("Saved Questions").click();
     cy.contains("GH_12568: SQL").click();
+    visualize();
     cy.contains("COUNT").click();
     cy.contains("Sum over time").click();
     cy.contains("Sum of COUNT");
@@ -129,10 +126,8 @@ describe("scenarios > question > nested (metabase#12568)", () => {
 
   // [quarantine] The whole CI was timing out
   it.skip("should allow Distribution on a Saved complex SQL Question", () => {
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
-    cy.contains("Saved Questions").click();
     cy.contains("GH_12568: Complex SQL").click();
+    visualize();
     cy.contains("Items Sold").click();
     cy.contains("Distribution").click();
     cy.contains("Count by Items Sold: Auto binned");
@@ -292,8 +287,7 @@ describe("scenarios > question > nested", () => {
       "Related issue [#14629](https://github.com/metabase/metabase/issues/14629)",
     );
 
-    cy.server();
-    cy.route("POST", "/api/dataset").as("dataset");
+    cy.intercept("POST", "/api/dataset").as("dataset");
 
     cy.log("Remap Product ID's display value to `title`");
     remapDisplayValueToFK({
@@ -308,14 +302,14 @@ describe("scenarios > question > nested", () => {
     });
 
     // Try to use saved question as a base for a new / nested question
-    cy.visit("/question/new");
-    cy.findByText("Simple question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
     cy.findByText("Orders (remapped)").click();
 
-    cy.wait("@dataset").then(xhr => {
-      expect(xhr.response.body.error).not.to.exist;
+    visualize(response => {
+      expect(response.body.error).not.to.exist;
     });
+
     cy.findAllByText("Awesome Concrete Shoes");
   });
 
@@ -342,14 +336,14 @@ describe("scenarios > question > nested", () => {
         ordersJoinProducts(QUESTION_NAME);
 
         // Start new question from a saved one
-        cy.visit("/question/new");
-        cy.findByText("Simple question").click();
+        startNewQuestion();
         cy.findByText("Saved Questions").click();
         cy.findByText(QUESTION_NAME).click();
 
-        cy.wait("@dataset").then(xhr => {
-          expect(xhr.response.body.error).not.to.exist;
+        visualize(response => {
+          expect(response.body.error).not.to.exist;
         });
+
         cy.contains("37.65");
       });
 
@@ -365,32 +359,30 @@ describe("scenarios > question > nested", () => {
         );
 
         // Start new question from already saved nested question
-        cy.visit("/question/new");
-        cy.findByText("Simple question").click();
+        startNewQuestion();
         cy.findByText("Saved Questions").click();
         cy.findByText(SECOND_QUESTION_NAME).click();
 
-        cy.wait("@dataset").then(xhr => {
-          expect(xhr.response.body.error).not.to.exist;
+        visualize(response => {
+          expect(response.body.error).not.to.exist;
         });
+
         cy.contains("37.65");
       });
     });
   });
 
   it("'distribution' should work on a joined table from a saved question (metabase#14787)", () => {
-    cy.intercept("POST", "/api/dataset").as("dataset");
-
     // Set the display really wide and really tall to avoid any scrolling
     cy.viewport(1600, 1200);
 
     ordersJoinProducts("14787");
     // This repro depends on these exact steps - it has to be opened from the saved questions
-    cy.visit("/question/new");
-    cy.findByText("Simple question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
     cy.findByText("14787").click();
-    cy.wait("@dataset");
+
+    visualize();
 
     // The column title
     cy.findByText("Products → Category").click();
@@ -398,6 +390,7 @@ describe("scenarios > question > nested", () => {
     cy.wait("@dataset");
 
     summarize();
+
     cy.findByText("Group by")
       .parent()
       .within(() => {
@@ -431,8 +424,6 @@ describe("scenarios > question > nested", () => {
 
   ["count", "average"].forEach(test => {
     it(`${test.toUpperCase()}:\n should be able to use aggregation functions on saved native question (metabase#15397)`, () => {
-      cy.intercept("POST", "/api/dataset").as("dataset");
-
       cy.createNativeQuestion(
         {
           name: "15397",
@@ -444,12 +435,11 @@ describe("scenarios > question > nested", () => {
         { loadMetadata: true },
       );
 
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("15397").click();
 
-      cy.wait("@dataset");
+      visualize();
       summarize();
 
       if (test === "average") {
@@ -528,10 +518,10 @@ describe("scenarios > question > nested", () => {
       cy.get(".ScalarValue").findByText(value);
 
       // Start new question based on the saved one
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText(name).click();
+      visualize();
       cy.get(".ScalarValue").findByText(value);
     }
   });
diff --git a/frontend/test/metabase/scenarios/question/new.cy.spec.js b/frontend/test/metabase/scenarios/question/new.cy.spec.js
index 5a1521d5abe..7872f16f435 100644
--- a/frontend/test/metabase/scenarios/question/new.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/new.cy.spec.js
@@ -39,14 +39,9 @@ describe("scenarios > question > new", () => {
       });
     }
 
-    // First test UI for Simple question
-    cy.visit("/question/new");
-    cy.findByText("Simple question").click();
-    cy.findByText("Pick your data");
-    cy.findByText("Sample3").isVisibleInPopover();
-
-    // Then move to the Custom question UI
     startNewQuestion();
+
+    cy.contains("Pick your starting data");
     cy.findByText("Sample3").isVisibleInPopover();
   });
 
@@ -71,31 +66,6 @@ describe("scenarios > question > new", () => {
   });
 
   describe("data picker search", () => {
-    describe("on a (simple) question page", () => {
-      beforeEach(() => {
-        cy.visit("/question/new");
-        cy.findByText("Simple question").click();
-        cy.findByPlaceholderText("Search for a table…").type("Ord");
-      });
-
-      it("should allow to search saved questions", () => {
-        cy.findByText("Orders, Count").click();
-        cy.findByText("18,760");
-      });
-
-      it("should allow to search and select tables", () => {
-        cy.findAllByText("Orders")
-          .closest("li")
-          .findByText("Table in")
-          .parent()
-          .findByTestId("search-result-item-name")
-          .click();
-        cy.url().should("include", "question#");
-        cy.findByText("Sample Database");
-        cy.findByText("Orders");
-      });
-    });
-
     describe("on a (custom) question page", () => {
       beforeEach(() => {
         startNewQuestion();
@@ -135,31 +105,6 @@ describe("scenarios > question > new", () => {
   });
 
   describe("saved question picker", () => {
-    describe("on a (simple) question page", () => {
-      beforeEach(() => {
-        cy.visit("/question/new");
-        cy.findByText("Simple question").click();
-        cy.findByText("Saved Questions").click();
-      });
-
-      it("should display the collection tree on the left side", () => {
-        popover().findByText("Our analytics");
-      });
-
-      it("should display the saved questions list on the right side", () => {
-        cy.findByText("Orders, Count, Grouped by Created At (year)");
-        cy.findByText("Orders");
-        cy.findByText("Orders, Count").click();
-        cy.findByText("18,760");
-      });
-
-      it("should perform a search scoped to saved questions", () => {
-        cy.findByPlaceholderText("Search for a question…").type("Grouped");
-        cy.findByText("Orders, Count, Grouped by Created At (year)").click();
-        cy.findByText("1,994");
-      });
-    });
-
     describe("on a (custom) question page", () => {
       beforeEach(() => {
         startNewQuestion();
@@ -223,14 +168,6 @@ describe("scenarios > question > new", () => {
   });
 
   describe("ask a (simple) question", () => {
-    it("should load orders table", () => {
-      cy.visit("/question/new");
-      cy.contains("Simple question").click();
-      cy.contains("Sample Database").click();
-      cy.contains("Orders").click();
-      cy.contains("37.65");
-    });
-
     it.skip("should handle (removing) multiple metrics when one is sorted (metabase#13990)", () => {
       cy.intercept("POST", `/api/dataset`).as("dataset");
 
@@ -412,7 +349,7 @@ describe("scenarios > question > new", () => {
 
     it("summarizing by distinct datetime should allow granular selection (metabase#13098)", () => {
       // Go straight to orders table in custom questions
-      cy.visit("/question/new?database=1&table=2&mode=notebook");
+      openOrdersTable({ mode: "notebook" });
 
       summarize({ mode: "notebook" });
       popover().within(() => {
diff --git a/frontend/test/metabase/scenarios/question/query-external.cy.spec.js b/frontend/test/metabase/scenarios/question/query-external.cy.spec.js
index 1cbd59a2d77..39e93ca08f5 100644
--- a/frontend/test/metabase/scenarios/question/query-external.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/query-external.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore } from "__support__/e2e/cypress";
+import { restore, startNewQuestion, visualize } from "__support__/e2e/cypress";
 
 const supportedDatabases = [
   {
@@ -23,12 +23,11 @@ supportedDatabases.forEach(({ database, snapshotName, dbName }) => {
     });
 
     it(`can query ${database} database`, () => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText(dbName).click();
       cy.findByText("Orders").click();
 
-      cy.wait("@dataset");
+      visualize();
       cy.contains("37.65");
     });
   });
diff --git a/frontend/test/metabase/scenarios/question/reproductions/13263-postgres-show-row-details-on-pk-click.js b/frontend/test/metabase/scenarios/question/reproductions/13263-postgres-show-row-details-on-pk-click.js
index 216964b5a56..2e5193598dd 100644
--- a/frontend/test/metabase/scenarios/question/reproductions/13263-postgres-show-row-details-on-pk-click.js
+++ b/frontend/test/metabase/scenarios/question/reproductions/13263-postgres-show-row-details-on-pk-click.js
@@ -1,4 +1,4 @@
-import { restore } from "__support__/e2e/cypress";
+import { restore, startNewQuestion, visualize } from "__support__/e2e/cypress";
 
 const PG_DB_NAME = "QA Postgres12";
 
@@ -8,12 +8,10 @@ export function issue13263() {
       restore("postgres-12");
       cy.signInAsAdmin();
 
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
-      cy.findByText(PG_DB_NAME)
-        .should("be.visible")
-        .click();
+      startNewQuestion();
+      cy.findByTextEnsureVisible(PG_DB_NAME).click();
       cy.findByTextEnsureVisible("Orders").click();
+      visualize();
     });
 
     it("should show row details when clicked on its entity key (metabase#13263)", () => {
diff --git a/frontend/test/metabase/scenarios/question/reproductions/14957-unable-to-save-question-before-query-executed.js b/frontend/test/metabase/scenarios/question/reproductions/14957-unable-to-save-question-before-query-executed.js
index e80cebb96bb..3b2e96eeced 100644
--- a/frontend/test/metabase/scenarios/question/reproductions/14957-unable-to-save-question-before-query-executed.js
+++ b/frontend/test/metabase/scenarios/question/reproductions/14957-unable-to-save-question-before-query-executed.js
@@ -1,4 +1,4 @@
-import { restore, modal } from "__support__/e2e/cypress";
+import { restore, modal, openNativeEditor } from "__support__/e2e/cypress";
 
 const PG_DB_NAME = "QA Postgres12";
 
@@ -7,16 +7,12 @@ export function issue14957() {
     beforeEach(() => {
       restore("postgres-12");
       cy.signInAsAdmin();
-
-      cy.visit("/question/new");
-      cy.findByText("Native query").click();
-      cy.findByText(PG_DB_NAME)
-        .should("be.visible")
-        .click();
     });
 
     it("should save a question before query has been executed (metabase#14957)", () => {
-      cy.get(".ace_content").type("select pg_sleep(60)");
+      openNativeEditor({ databaseName: PG_DB_NAME }).type(
+        "select pg_sleep(60)",
+      );
 
       cy.findByText("Save").click();
 
diff --git a/frontend/test/metabase/scenarios/question/saved.cy.spec.js b/frontend/test/metabase/scenarios/question/saved.cy.spec.js
index edfb85c188b..94cffd40c0b 100644
--- a/frontend/test/metabase/scenarios/question/saved.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/saved.cy.spec.js
@@ -5,6 +5,8 @@ import {
   openOrdersTable,
   summarize,
   visitQuestion,
+  startNewQuestion,
+  visualize,
 } from "__support__/e2e/cypress";
 
 describe("scenarios > question > saved", () => {
@@ -134,15 +136,15 @@ describe("scenarios > question > saved", () => {
     cy.findByText(/This is a question/i).should("not.exist");
   });
 
-  it("should be able to use integer filter on a saved native query (metabase#15808)", () => {
+  it("should be able to use integer filter on a nested query based on a saved native question (metabase#15808)", () => {
     cy.createNativeQuestion({
       name: "15808",
       native: { query: "select * from products" },
     });
-    cy.visit("/question/new");
-    cy.findByText("Simple question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
     cy.findByText("15808").click();
+    visualize();
     cy.findAllByText("Filter")
       .first()
       .click();
diff --git a/frontend/test/metabase/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js b/frontend/test/metabase/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js
index 813ef62d3a2..0d827c64c52 100644
--- a/frontend/test/metabase/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js
+++ b/frontend/test/metabase/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js
@@ -9,6 +9,7 @@ import {
   summarize,
   visitQuestion,
   visitDashboard,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 import { USER_GROUPS, SAMPLE_DB_ID } from "__support__/e2e/cypress_data";
@@ -281,8 +282,7 @@ describe("scenarios > visualizations > drillthroughs > chart drill", () => {
     // There's a slight hiccup in the UI with nested questions when we Summarize by City below.
     // Because there's only 5 rows, it automatically switches to the chart, but issues another
     // dataset request. So we wait for the dataset to load.
-    cy.server();
-    cy.route("POST", "/api/dataset").as("dataset");
+    cy.intercept("POST", "/api/dataset").as("dataset");
 
     // People in CA
     cy.createQuestion({
@@ -290,8 +290,7 @@ describe("scenarios > visualizations > drillthroughs > chart drill", () => {
       query: { "source-table": PEOPLE_ID, limit: 5 },
     });
     // Build a new question off that grouping by City
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
+    startNewQuestion();
     cy.contains("Saved Questions").click();
     cy.contains("CA People").click();
     cy.contains("Hudson Borer");
-- 
GitLab