From 85aa9fd2679044627b5159a01428db9edb2d3d19 Mon Sep 17 00:00:00 2001
From: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Date: Sat, 9 Apr 2022 08:28:47 +0200
Subject: [PATCH] Deprecate the `/question/new` route for custom questions
 (#21558)

---
 .../notebook/notebook.cy.spec.js              |  6 ++--
 .../admin/datamodel/hide_tables.cy.spec.js    |  5 ++-
 .../binning/binning-reproductions.cy.spec.js  | 12 +++----
 .../binning/qb-explicit-joins.cy.spec.js      |  4 +--
 .../metabase/scenarios/binning/sql.cy.spec.js |  4 +--
 ...3751-cc-allow-strings-in-filter.cy.spec.js |  4 +--
 ...o-not-remove-regex-escape-chars.cy.spec.js |  5 ++-
 .../scenarios/joins/joins-2.cy.spec.js        | 12 +++----
 .../metabase/scenarios/joins/joins.cy.spec.js |  4 +--
 ...15342-mysql-correct-joins-order.cy.spec.js | 10 ++++--
 ...-two-saved-questions-same-table.cy.spec.js | 10 ++++--
 ...implicit-explicit-grouped-field.cy.spec.js | 10 ++++--
 .../scenarios/models/models.cy.spec.js        | 12 +++----
 .../15946-mongo-pre-select-table.cy.spec.js   |  5 ++-
 .../permissions/sandboxes.cy.spec.js          |  5 +--
 .../scenarios/question/nested.cy.spec.js      |  7 ++--
 .../scenarios/question/new.cy.spec.js         | 19 ++++-------
 .../scenarios/question/notebook.cy.spec.js    | 19 ++++-------
 ...-postgres-percentile-accepts-two-params.js |  9 ++++--
 ...go-filter-expression-compare-two-fields.js | 10 ++++--
 .../reproductions/18207-string-min-max.js     | 32 +++----------------
 .../19341-disabled-nested-queries.js          | 10 ++++--
 ...ions-not-in-saved-questions-immediately.js |  3 +-
 23 files changed, 98 insertions(+), 119 deletions(-)

diff --git a/frontend/test/metabase-visual/notebook/notebook.cy.spec.js b/frontend/test/metabase-visual/notebook/notebook.cy.spec.js
index cd74b5b790a..29eacf3bcc6 100644
--- a/frontend/test/metabase-visual/notebook/notebook.cy.spec.js
+++ b/frontend/test/metabase-visual/notebook/notebook.cy.spec.js
@@ -12,8 +12,7 @@ describe("visual tests > notebook > major UI elements", () => {
   });
 
   it("renders correctly", () => {
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByTextEnsureVisible("Sample Database").click();
     cy.findByTextEnsureVisible("Orders").click();
 
@@ -67,8 +66,7 @@ describe("visual tests > notebook > Run buttons", () => {
 
   // This tests that the run buttons are the correct size on the Custom question page
   it("in Custom Question render correctly", () => {
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByTextEnsureVisible("Sample Database").click();
     cy.findByTextEnsureVisible("Orders").click();
     // Waiting for notebook icon to load
diff --git a/frontend/test/metabase/scenarios/admin/datamodel/hide_tables.cy.spec.js b/frontend/test/metabase/scenarios/admin/datamodel/hide_tables.cy.spec.js
index e8bc5618657..a419396decc 100644
--- a/frontend/test/metabase/scenarios/admin/datamodel/hide_tables.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/datamodel/hide_tables.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore } from "__support__/e2e/cypress";
+import { restore, startNewQuestion } from "__support__/e2e/cypress";
 
 const ORDERS_URL = "/admin/datamodel/database/1/table/2";
 
@@ -39,8 +39,7 @@ describe("scenarios > admin > datamodel > hidden tables (metabase#9759)", () =>
 
     // It shouldn't show up as a normal user either
     cy.signInAsNormalUser();
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
+    startNewQuestion();
     cy.contains("Sample Database").click();
     cy.contains("Products");
     cy.contains("Orders").should("not.exist");
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 2694382d71a..0bd9bbe1b2f 100644
--- a/frontend/test/metabase/scenarios/binning/binning-reproductions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/binning/binning-reproductions.cy.spec.js
@@ -7,6 +7,7 @@ import {
   getBinningButtonForDimension,
   startNewQuestion,
   summarize,
+  openOrdersTable,
 } from "__support__/e2e/cypress";
 
 import { SAMPLE_DB_ID } from "__support__/e2e/cypress_data";
@@ -26,8 +27,7 @@ describe("binning related reproductions", () => {
       native: { query: "select * from products limit 5" },
     });
 
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
     cy.findByText("16327").click();
 
@@ -89,8 +89,7 @@ describe("binning related reproductions", () => {
       { loadMetadata: true },
     );
 
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
     cy.findByText("17975").click();
 
@@ -119,10 +118,7 @@ describe("binning related reproductions", () => {
       { loadMetadata: true },
     );
 
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
-    cy.findByTextEnsureVisible("Sample Database").click();
-    cy.findByTextEnsureVisible("Orders").click();
+    openOrdersTable({ mode: "notebook" });
 
     cy.icon("join_left_outer").click();
 
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 1db8a8889ea..6acb9f26a42 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
@@ -3,6 +3,7 @@ import {
   visualize,
   changeBinningForDimension,
   summarize,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database";
 
@@ -129,8 +130,7 @@ describe("scenarios > binning > from a saved QB question with explicit joins", (
 
   context("via custom question", () => {
     beforeEach(() => {
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("QB Binning").click();
 
diff --git a/frontend/test/metabase/scenarios/binning/sql.cy.spec.js b/frontend/test/metabase/scenarios/binning/sql.cy.spec.js
index 3125afb123e..c067b1e6ff4 100644
--- a/frontend/test/metabase/scenarios/binning/sql.cy.spec.js
+++ b/frontend/test/metabase/scenarios/binning/sql.cy.spec.js
@@ -4,6 +4,7 @@ import {
   visualize,
   changeBinningForDimension,
   summarize,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 const questionDetails = {
@@ -95,8 +96,7 @@ describe("scenarios > binning > from a saved sql question", () => {
 
   context("via custom question", () => {
     beforeEach(() => {
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("SQL Binning").click();
 
diff --git a/frontend/test/metabase/scenarios/custom-column/reproductions/13751-cc-allow-strings-in-filter.cy.spec.js b/frontend/test/metabase/scenarios/custom-column/reproductions/13751-cc-allow-strings-in-filter.cy.spec.js
index 2a31b53f438..0b96abd842c 100644
--- a/frontend/test/metabase/scenarios/custom-column/reproductions/13751-cc-allow-strings-in-filter.cy.spec.js
+++ b/frontend/test/metabase/scenarios/custom-column/reproductions/13751-cc-allow-strings-in-filter.cy.spec.js
@@ -3,6 +3,7 @@ import {
   popover,
   visualize,
   restore,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 const CC_NAME = "C-States";
@@ -13,8 +14,7 @@ describe("issue 13751", () => {
     restore("postgres-12");
     cy.signInAsAdmin();
 
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByText(PG_DB_NAME)
       .should("be.visible")
       .click();
diff --git a/frontend/test/metabase/scenarios/custom-column/reproductions/14517-cc-do-not-remove-regex-escape-chars.cy.spec.js b/frontend/test/metabase/scenarios/custom-column/reproductions/14517-cc-do-not-remove-regex-escape-chars.cy.spec.js
index cbc6d3d6b82..c027b72cfed 100644
--- a/frontend/test/metabase/scenarios/custom-column/reproductions/14517-cc-do-not-remove-regex-escape-chars.cy.spec.js
+++ b/frontend/test/metabase/scenarios/custom-column/reproductions/14517-cc-do-not-remove-regex-escape-chars.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore, popover } from "__support__/e2e/cypress";
+import { restore, popover, startNewQuestion } from "__support__/e2e/cypress";
 
 const PG_DB_NAME = "QA Postgres12";
 
@@ -11,8 +11,7 @@ describe.skip("postgres > question > custom columns", () => {
     restore("postgres-12");
     cy.signInAsAdmin();
 
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByText(PG_DB_NAME)
       .should("be.visible")
       .click();
diff --git a/frontend/test/metabase/scenarios/joins/joins-2.cy.spec.js b/frontend/test/metabase/scenarios/joins/joins-2.cy.spec.js
index bf254726a93..f371823f46c 100644
--- a/frontend/test/metabase/scenarios/joins/joins-2.cy.spec.js
+++ b/frontend/test/metabase/scenarios/joins/joins-2.cy.spec.js
@@ -36,8 +36,7 @@ describe("scenarios > question > joined questions", () => {
       cy.intercept("/api/database/1/schema/PUBLIC").as("schema");
 
       // start a custom question with orders
-      cy.visit("/question/new");
-      cy.contains("Custom question").click();
+      startNewQuestion();
       cy.contains("Sample Database").click();
       cy.contains("Orders").click();
 
@@ -81,8 +80,7 @@ describe("scenarios > question > joined questions", () => {
       cy.intercept("/api/database/1/schema/PUBLIC").as("schema");
 
       cy.log("Start a custom question with Orders");
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       cy.findByTextEnsureVisible("Sample Database").click();
       cy.findByTextEnsureVisible("Orders").click();
 
@@ -133,8 +131,7 @@ describe("scenarios > question > joined questions", () => {
       });
 
       // start a custom question with question a
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("question a").click();
 
@@ -548,8 +545,7 @@ function joinTwoSavedQuestions() {
       },
     }).then(() => {
       cy.intercept("/api/database/1/schema/PUBLIC").as("schema");
-      cy.visit(`/question/new`);
-      cy.findByText("Custom question").click();
+      startNewQuestion();
 
       popover().within(() => {
         cy.findByText("Saved Questions").click();
diff --git a/frontend/test/metabase/scenarios/joins/joins.cy.spec.js b/frontend/test/metabase/scenarios/joins/joins.cy.spec.js
index 14a55cf9f02..db10b7df03a 100644
--- a/frontend/test/metabase/scenarios/joins/joins.cy.spec.js
+++ b/frontend/test/metabase/scenarios/joins/joins.cy.spec.js
@@ -4,6 +4,7 @@ import {
   popover,
   visualize,
   summarize,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database";
 
@@ -29,8 +30,7 @@ describe("scenarios > question > joined questions", () => {
       query: { "source-table": ORDERS_ID },
     });
 
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByTextEnsureVisible("Sample Database").click();
     cy.findByTextEnsureVisible("Products").click();
 
diff --git a/frontend/test/metabase/scenarios/joins/reproductions/15342-mysql-correct-joins-order.cy.spec.js b/frontend/test/metabase/scenarios/joins/reproductions/15342-mysql-correct-joins-order.cy.spec.js
index 6802a5a5a26..b56a03ca830 100644
--- a/frontend/test/metabase/scenarios/joins/reproductions/15342-mysql-correct-joins-order.cy.spec.js
+++ b/frontend/test/metabase/scenarios/joins/reproductions/15342-mysql-correct-joins-order.cy.spec.js
@@ -1,4 +1,9 @@
-import { restore, popover, visualize } from "__support__/e2e/cypress";
+import {
+  restore,
+  popover,
+  visualize,
+  startNewQuestion,
+} from "__support__/e2e/cypress";
 
 const MYSQL_DB_NAME = "QA MySQL8";
 
@@ -11,8 +16,7 @@ describe.skip("issue 15342", () => {
   });
 
   it("should correctly order joins for MySQL queries (metabase#15342)", () => {
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByText(MYSQL_DB_NAME).click();
     cy.findByText("People").click();
 
diff --git a/frontend/test/metabase/scenarios/joins/reproductions/18502-cannot-join-two-saved-questions-same-table.cy.spec.js b/frontend/test/metabase/scenarios/joins/reproductions/18502-cannot-join-two-saved-questions-same-table.cy.spec.js
index 2f79f8aaf20..160f432182f 100644
--- a/frontend/test/metabase/scenarios/joins/reproductions/18502-cannot-join-two-saved-questions-same-table.cy.spec.js
+++ b/frontend/test/metabase/scenarios/joins/reproductions/18502-cannot-join-two-saved-questions-same-table.cy.spec.js
@@ -1,4 +1,9 @@
-import { restore, popover, visualize } from "__support__/e2e/cypress";
+import {
+  restore,
+  popover,
+  visualize,
+  startNewQuestion,
+} from "__support__/e2e/cypress";
 import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database";
 
 const { PEOPLE, PEOPLE_ID } = SAMPLE_DATABASE;
@@ -19,8 +24,7 @@ describe("issue 18502", () => {
     cy.createQuestion(question1);
     cy.createQuestion(question2);
 
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
 
     cy.findByText("18502#1").click();
diff --git a/frontend/test/metabase/scenarios/joins/reproductions/18512-cannot-join-two-saved-questions-with-same-implicit-explicit-grouped-field.cy.spec.js b/frontend/test/metabase/scenarios/joins/reproductions/18512-cannot-join-two-saved-questions-with-same-implicit-explicit-grouped-field.cy.spec.js
index a6e3de9b0e0..f5b8d6b3e56 100644
--- a/frontend/test/metabase/scenarios/joins/reproductions/18512-cannot-join-two-saved-questions-with-same-implicit-explicit-grouped-field.cy.spec.js
+++ b/frontend/test/metabase/scenarios/joins/reproductions/18512-cannot-join-two-saved-questions-with-same-implicit-explicit-grouped-field.cy.spec.js
@@ -1,4 +1,9 @@
-import { restore, popover, visualize } from "__support__/e2e/cypress";
+import {
+  restore,
+  popover,
+  visualize,
+  startNewQuestion,
+} from "__support__/e2e/cypress";
 import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database";
 
 const { PRODUCTS, PRODUCTS_ID, REVIEWS, REVIEWS_ID } = SAMPLE_DATABASE;
@@ -20,8 +25,7 @@ describe("issue 18512", () => {
     cy.createQuestion(question1);
     cy.createQuestion(question2);
 
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
 
     cy.findByText("18512#1").click();
diff --git a/frontend/test/metabase/scenarios/models/models.cy.spec.js b/frontend/test/metabase/scenarios/models/models.cy.spec.js
index ef8e408faa9..02fc0a4b830 100644
--- a/frontend/test/metabase/scenarios/models/models.cy.spec.js
+++ b/frontend/test/metabase/scenarios/models/models.cy.spec.js
@@ -12,8 +12,11 @@ import {
   filter,
   visitQuestion,
   visitDashboard,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
+
 import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database";
+
 import {
   turnIntoModel,
   assertIsModel,
@@ -189,8 +192,7 @@ describe("scenarios > models", () => {
     });
 
     it("transforms the data picker", () => {
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
 
       popover().within(() => {
         testDataPickerSearch({
@@ -238,8 +240,7 @@ describe("scenarios > models", () => {
 
     it("allows to create a question based on a model", () => {
       cy.intercept("/api/database/1/schema/PUBLIC").as("schema");
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
 
       popover().within(() => {
         cy.findByText("Models").click();
@@ -278,8 +279,7 @@ describe("scenarios > models", () => {
 
     it("should not display models if nested queries are disabled", () => {
       mockSessionProperty("enable-nested-queries", false);
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       popover().within(() => {
         cy.findByText("Models").should("not.exist");
         cy.findByText("Saved Questions").should("not.exist");
diff --git a/frontend/test/metabase/scenarios/native/reproductions/15946-mongo-pre-select-table.cy.spec.js b/frontend/test/metabase/scenarios/native/reproductions/15946-mongo-pre-select-table.cy.spec.js
index c054e6cf4f4..0c68866bc93 100644
--- a/frontend/test/metabase/scenarios/native/reproductions/15946-mongo-pre-select-table.cy.spec.js
+++ b/frontend/test/metabase/scenarios/native/reproductions/15946-mongo-pre-select-table.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore, modal } from "__support__/e2e/cypress";
+import { restore, modal, startNewQuestion } from "__support__/e2e/cypress";
 
 const MONGO_DB_NAME = "QA Mongo4";
 
@@ -7,8 +7,7 @@ describe.skip("issue 15946", () => {
     restore("mongo-4");
     cy.signInAsAdmin();
 
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByText(MONGO_DB_NAME).click();
     cy.findByText("Orders").click();
   });
diff --git a/frontend/test/metabase/scenarios/permissions/sandboxes.cy.spec.js b/frontend/test/metabase/scenarios/permissions/sandboxes.cy.spec.js
index e2c2a81f635..7edc0e96491 100644
--- a/frontend/test/metabase/scenarios/permissions/sandboxes.cy.spec.js
+++ b/frontend/test/metabase/scenarios/permissions/sandboxes.cy.spec.js
@@ -13,7 +13,9 @@ import {
   filter,
   visitQuestion,
   visitDashboard,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
+
 import { USER_GROUPS, SAMPLE_DB_ID } from "__support__/e2e/cypress_data";
 
 import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database";
@@ -763,8 +765,7 @@ describeEE("formatting > sandboxes", () => {
     it("should be able to use summarize columns from joined table based on a saved question (metabase#14766)", () => {
       createJoinedQuestion("14766_joined");
 
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("14766_joined").click();
       cy.findByText("Pick the metric you want to see").click();
diff --git a/frontend/test/metabase/scenarios/question/nested.cy.spec.js b/frontend/test/metabase/scenarios/question/nested.cy.spec.js
index 2f3fb5070fd..fbfb99ef1e4 100644
--- a/frontend/test/metabase/scenarios/question/nested.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/nested.cy.spec.js
@@ -545,12 +545,15 @@ describe("scenarios > question > nested", () => {
       });
       // Window object gets recreated for every `cy.visit`
       // See: https://stackoverflow.com/a/65218352/8815185
-      cy.visit("/question/new", {
+      cy.visit("/", {
         onBeforeLoad(win) {
           cy.spy(win.console, "warn").as("consoleWarn");
         },
       });
-      cy.findByText("Custom question").click();
+      cy.findByText("New").click();
+      cy.findByText("Question")
+        .should("be.visible")
+        .click();
       cy.findByText("Saved Questions").click();
       cy.findByText("15725").click();
       cy.findByText("Pick the metric you want to see").click();
diff --git a/frontend/test/metabase/scenarios/question/new.cy.spec.js b/frontend/test/metabase/scenarios/question/new.cy.spec.js
index 97cc371a40e..5a1521d5abe 100644
--- a/frontend/test/metabase/scenarios/question/new.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/new.cy.spec.js
@@ -46,8 +46,7 @@ describe("scenarios > question > new", () => {
     cy.findByText("Sample3").isVisibleInPopover();
 
     // Then move to the Custom question UI
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByText("Sample3").isVisibleInPopover();
   });
 
@@ -72,12 +71,9 @@ describe("scenarios > question > new", () => {
   });
 
   describe("data picker search", () => {
-    beforeEach(() => {
-      cy.visit("/question/new");
-    });
-
     describe("on a (simple) question page", () => {
       beforeEach(() => {
+        cy.visit("/question/new");
         cy.findByText("Simple question").click();
         cy.findByPlaceholderText("Search for a table…").type("Ord");
       });
@@ -102,7 +98,7 @@ describe("scenarios > question > new", () => {
 
     describe("on a (custom) question page", () => {
       beforeEach(() => {
-        cy.findByText("Custom question").click();
+        startNewQuestion();
         cy.findByPlaceholderText("Search for a table…").type("Ord");
       });
 
@@ -133,18 +129,15 @@ describe("scenarios > question > new", () => {
       cy.intercept("/api/search", req => {
         expect("Unexpected call to /api/search").to.be.false;
       });
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       cy.findByPlaceholderText("Search for a table…").type("  ");
     });
   });
 
   describe("saved question picker", () => {
-    beforeEach(() => {
-      cy.visit("/question/new");
-    });
-
     describe("on a (simple) question page", () => {
       beforeEach(() => {
+        cy.visit("/question/new");
         cy.findByText("Simple question").click();
         cy.findByText("Saved Questions").click();
       });
@@ -169,7 +162,7 @@ describe("scenarios > question > new", () => {
 
     describe("on a (custom) question page", () => {
       beforeEach(() => {
-        cy.findByText("Custom question").click();
+        startNewQuestion();
         cy.findByText("Saved Questions").click();
       });
 
diff --git a/frontend/test/metabase/scenarios/question/notebook.cy.spec.js b/frontend/test/metabase/scenarios/question/notebook.cy.spec.js
index bc3b905bd37..3916e83bed7 100644
--- a/frontend/test/metabase/scenarios/question/notebook.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/notebook.cy.spec.js
@@ -10,6 +10,7 @@ import {
   visualize,
   summarize,
   filter,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 import { SAMPLE_DB_ID } from "__support__/e2e/cypress_data";
@@ -42,8 +43,7 @@ describe("scenarios > question > notebook", () => {
 
   it("should allow post-aggregation filters", () => {
     // start a custom question with orders
-    cy.visit("/question/new");
-    cy.contains("Custom question").click();
+    startNewQuestion();
     cy.contains("Sample Database").click();
     cy.contains("Orders").click();
 
@@ -195,8 +195,7 @@ describe("scenarios > question > notebook", () => {
   // flaky test (#19454)
   it.skip("should show an info popover for dimensions listened by the custom expression editor", () => {
     // start a custom question with orders
-    cy.visit("/question/new");
-    cy.contains("Custom question").click();
+    startNewQuestion();
     cy.contains("Sample Database").click();
     cy.contains("Orders").click();
 
@@ -220,8 +219,7 @@ describe("scenarios > question > notebook", () => {
       restore();
       cy.signInAsAdmin();
       cy.viewport(1280, 720);
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       cy.findByTextEnsureVisible("Sample Database").click();
       cy.findByTextEnsureVisible("Orders").click();
     });
@@ -375,8 +373,7 @@ describe("scenarios > question > notebook", () => {
   // intentional simplification of "Select none" to quickly
   // fix users' pain caused by the inability to unselect all columns
   it("select no columns select the first one", () => {
-    cy.visit("/question/new");
-    cy.contains("Custom question").click();
+    startNewQuestion();
     cy.contains("Sample Database").click();
     cy.contains("Orders").click();
     cy.findByTestId("fields-picker").click();
@@ -398,8 +395,7 @@ describe("scenarios > question > notebook", () => {
 
   // flaky test
   it.skip("should show an info popover when hovering over a field picker option for a table", () => {
-    cy.visit("/question/new");
-    cy.contains("Custom question").click();
+    startNewQuestion();
     cy.contains("Sample Database").click();
     cy.contains("Orders").click();
 
@@ -419,8 +415,7 @@ describe("scenarios > question > notebook", () => {
     });
 
     // start a custom question with question a
-    cy.visit("/question/new");
-    cy.findByText("Custom question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
     cy.findByText("question a").click();
 
diff --git a/frontend/test/metabase/scenarios/question/reproductions/15714-cc-postgres-percentile-accepts-two-params.js b/frontend/test/metabase/scenarios/question/reproductions/15714-cc-postgres-percentile-accepts-two-params.js
index 06217c2ba29..9ca4049a9bc 100644
--- a/frontend/test/metabase/scenarios/question/reproductions/15714-cc-postgres-percentile-accepts-two-params.js
+++ b/frontend/test/metabase/scenarios/question/reproductions/15714-cc-postgres-percentile-accepts-two-params.js
@@ -1,4 +1,8 @@
-import { enterCustomColumnDetails, restore } from "__support__/e2e/cypress";
+import {
+  enterCustomColumnDetails,
+  restore,
+  startNewQuestion,
+} from "__support__/e2e/cypress";
 
 const PG_DB_NAME = "QA Postgres12";
 
@@ -8,8 +12,7 @@ export function issue15714() {
       restore("postgres-12");
       cy.signInAsAdmin();
 
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       cy.findByText(PG_DB_NAME)
         .should("be.visible")
         .click();
diff --git a/frontend/test/metabase/scenarios/question/reproductions/17963-mongo-filter-expression-compare-two-fields.js b/frontend/test/metabase/scenarios/question/reproductions/17963-mongo-filter-expression-compare-two-fields.js
index 90fe67be956..1a9d2cae120 100644
--- a/frontend/test/metabase/scenarios/question/reproductions/17963-mongo-filter-expression-compare-two-fields.js
+++ b/frontend/test/metabase/scenarios/question/reproductions/17963-mongo-filter-expression-compare-two-fields.js
@@ -1,4 +1,9 @@
-import { restore, popover, visualize } from "__support__/e2e/cypress";
+import {
+  restore,
+  popover,
+  visualize,
+  startNewQuestion,
+} from "__support__/e2e/cypress";
 
 export function issue17963() {
   describe("issue 17963", () => {
@@ -6,8 +11,7 @@ export function issue17963() {
       restore("mongo-4");
       cy.signInAsAdmin();
 
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       cy.findByText("QA Mongo4").click();
       cy.findByText("Orders").click();
     });
diff --git a/frontend/test/metabase/scenarios/question/reproductions/18207-string-min-max.js b/frontend/test/metabase/scenarios/question/reproductions/18207-string-min-max.js
index 5760630808e..18e577dc6c1 100644
--- a/frontend/test/metabase/scenarios/question/reproductions/18207-string-min-max.js
+++ b/frontend/test/metabase/scenarios/question/reproductions/18207-string-min-max.js
@@ -3,6 +3,8 @@ import {
   popover,
   restore,
   visualize,
+  openProductsTable,
+  summarize,
 } from "__support__/e2e/cypress";
 
 export function issue18207() {
@@ -12,16 +14,12 @@ export function issue18207() {
 
       restore();
       cy.signInAsAdmin();
+
+      openProductsTable({ mode: "notebook" });
+      summarize({ mode: "notebook" });
     });
 
     it("should be possible to use MIN on a string column (metabase#18207)", () => {
-      cy.visit("/question/new");
-      cy.contains("Custom question").click();
-      cy.contains("Sample Database").click();
-      cy.contains("Products").click();
-
-      cy.contains("Pick the metric").click();
-
       cy.contains("Minimum of").click();
       cy.findByText("Price");
       cy.findByText("Rating");
@@ -33,13 +31,6 @@ export function issue18207() {
     });
 
     it("should be possible to use MAX on a string column (metabase#18207)", () => {
-      cy.visit("/question/new");
-      cy.contains("Custom question").click();
-      cy.contains("Sample Database").click();
-      cy.contains("Products").click();
-
-      cy.contains("Pick the metric").click();
-
       cy.contains("Maximum of").click();
       cy.findByText("Price");
       cy.findByText("Rating");
@@ -51,13 +42,6 @@ export function issue18207() {
     });
 
     it("should be not possible to use AVERAGE on a string column (metabase#18207)", () => {
-      cy.visit("/question/new");
-      cy.contains("Custom question").click();
-      cy.contains("Sample Database").click();
-      cy.contains("Products").click();
-
-      cy.contains("Pick the metric").click();
-
       cy.contains("Average of").click();
       cy.findByText("Price");
       cy.findByText("Rating");
@@ -65,12 +49,6 @@ export function issue18207() {
     });
 
     it("should be possible to group by a string expression (metabase#18207)", () => {
-      cy.visit("/question/new");
-      cy.contains("Custom question").click();
-      cy.contains("Sample Database").click();
-      cy.contains("Products").click();
-
-      cy.contains("Pick the metric").click();
       popover()
         .contains("Custom Expression")
         .click();
diff --git a/frontend/test/metabase/scenarios/question/reproductions/19341-disabled-nested-queries.js b/frontend/test/metabase/scenarios/question/reproductions/19341-disabled-nested-queries.js
index 7583c4226a5..3e1aacb2797 100644
--- a/frontend/test/metabase/scenarios/question/reproductions/19341-disabled-nested-queries.js
+++ b/frontend/test/metabase/scenarios/question/reproductions/19341-disabled-nested-queries.js
@@ -1,4 +1,9 @@
-import { restore, mockSessionProperty, popover } from "__support__/e2e/cypress";
+import {
+  restore,
+  mockSessionProperty,
+  popover,
+  startNewQuestion,
+} from "__support__/e2e/cypress";
 
 export function issue19341() {
   describe("issue 19341", () => {
@@ -19,8 +24,7 @@ export function issue19341() {
 
     it("should correctly disable nested queries (metabase#19341)", () => {
       // Test "Saved Questions" table is hidden in QB data selector
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       popover().within(() => {
         // Wait until picker init
         // When working as expected, the test environment only has "Sample Database" DB
diff --git a/frontend/test/metabase/scenarios/question/reproductions/9027-new-questions-not-in-saved-questions-immediately.js b/frontend/test/metabase/scenarios/question/reproductions/9027-new-questions-not-in-saved-questions-immediately.js
index 64e0d91b1f9..fb871a63b6a 100644
--- a/frontend/test/metabase/scenarios/question/reproductions/9027-new-questions-not-in-saved-questions-immediately.js
+++ b/frontend/test/metabase/scenarios/question/reproductions/9027-new-questions-not-in-saved-questions-immediately.js
@@ -15,8 +15,7 @@ export function issue9027() {
       restore();
       cy.signInAsAdmin();
 
-      cy.visit("/question/new");
-      cy.findByText("Custom question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
 
       // Wait for the existing questions to load
-- 
GitLab