From 3c5071c1ca488a2e4f006a45e2ce439c8f95a362 Mon Sep 17 00:00:00 2001
From: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Date: Thu, 14 Jan 2021 17:26:53 +0100
Subject: [PATCH] Run Cypress OSS tests in isolation (#14372)

* Run all tests in isolation for `frontend/test/metabase/scenarios/permissions.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/admin/datamodel/hide_tables.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/admin/datamodel/table.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/admin/databases/list.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/question/data_ref.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/question/operators.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/question/settings.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/question/trendline.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/reference/databases.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/question/downloads.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/admin/datamodel/segments.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/admin/datamodel/metrics.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/admin/permissions/permissions.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/admin/settings/spinner.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/auth/search.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/auth/signin.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/dashboard/dashboard_data_permissions.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/dashboard/dashboard-drill.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/dashboard/embed.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/dashboard/title-drill.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/question/loading.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/dashboard/nested-cards.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/dashboard/text-box.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/home/activity-page.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/question/native_subquery.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/question/nested.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/question/view.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/visualizations/drillthroughs/dash_drill.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/home/overworld.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase-db/postgres/custom-column.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/alert/alert.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/dashboard/parameters-embedded.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/admin/settings/settings.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/alert/alert.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/dashboard/permissions.cy.spec.js`

* Run all tests in isolation for `frontend/test/metabase/scenarios/pulse/pulse.cy.spec.js` [ci skip]

* Run all tests in isolation for `frontend/test/metabase/scenarios/question/snippets.cy.spec.js` (#14380)
---
 .../postgres/custom-column.cy.spec.js         |  2 +-
 .../scenarios/admin/databases/add.cy.spec.js  |  3 +-
 .../scenarios/admin/databases/edit.cy.spec.js | 17 ++++-
 .../scenarios/admin/databases/list.cy.spec.js |  4 +-
 .../admin/datamodel/hide_tables.cy.spec.js    |  2 +-
 .../admin/datamodel/metrics.cy.spec.js        | 76 +++++++------------
 .../admin/datamodel/segments.cy.spec.js       |  6 +-
 .../admin/datamodel/table.cy.spec.js          |  6 +-
 .../admin/permissions/permissions.cy.spec.js  |  6 +-
 .../admin/settings/settings.cy.spec.js        | 15 +++-
 .../admin/settings/spinner.cy.spec.js         |  6 +-
 .../metabase/scenarios/alert/alert.cy.spec.js |  9 ++-
 .../metabase/scenarios/auth/search.cy.spec.js |  2 +-
 .../metabase/scenarios/auth/signin.cy.spec.js |  6 +-
 .../dashboard/dashboard-drill.cy.spec.js      |  6 +-
 .../dashboard_data_permissions.cy.spec.js     |  3 +-
 .../scenarios/dashboard/embed.cy.spec.js      |  6 +-
 .../dashboard/nested-cards.cy.spec.js         |  8 +-
 .../dashboard/parameters-embedded.cy.spec.js  | 14 ++--
 .../dashboard/permissions.cy.spec.js          |  6 +-
 .../scenarios/dashboard/text-box.cy.spec.js   | 10 +--
 .../dashboard/title-drill.cy.spec.js          |  6 +-
 .../scenarios/home/activity-page.cy.spec.js   |  6 +-
 .../scenarios/home/overworld.cy.spec.js       |  2 +-
 .../metabase/scenarios/permissions.cy.spec.js |  2 +-
 .../metabase/scenarios/pulse/pulse.cy.spec.js | 60 ++++++++++-----
 .../scenarios/question/data_ref.cy.spec.js    |  6 +-
 .../scenarios/question/downloads.cy.spec.js   |  2 +-
 .../scenarios/question/loading.cy.spec.js     |  6 +-
 .../question/native_subquery.cy.spec.js       |  6 +-
 .../scenarios/question/nested.cy.spec.js      | 14 +---
 .../scenarios/question/operators.cy.spec.js   |  6 +-
 .../scenarios/question/settings.cy.spec.js    |  6 +-
 .../scenarios/question/snippets.cy.spec.js    | 53 ++++++++-----
 .../scenarios/question/trendline.cy.spec.js   |  6 +-
 .../scenarios/question/view.cy.spec.js        | 11 +--
 .../scenarios/reference/databases.cy.spec.js  |  6 +-
 .../drillthroughs/chart_drill.cy.spec.js      |  4 +-
 .../drillthroughs/dash_drill.cy.spec.js       | 25 ++----
 39 files changed, 243 insertions(+), 197 deletions(-)

diff --git a/frontend/test/metabase-db/postgres/custom-column.cy.spec.js b/frontend/test/metabase-db/postgres/custom-column.cy.spec.js
index 413b97510ef..125a68bc2d2 100644
--- a/frontend/test/metabase-db/postgres/custom-column.cy.spec.js
+++ b/frontend/test/metabase-db/postgres/custom-column.cy.spec.js
@@ -8,7 +8,7 @@ import {
 const PG_DB_NAME = "QA Postgres12";
 
 describe("postgres > question > custom columns", () => {
-  before(() => {
+  beforeEach(() => {
     restore();
     signInAsAdmin();
     addPostgresDatabase(PG_DB_NAME);
diff --git a/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js b/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js
index 0abde5e5680..810ad99558f 100644
--- a/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js
@@ -15,9 +15,8 @@ function toggleFieldWithDisplayName(displayName) {
 }
 
 describe("scenarios > admin > databases > add", () => {
-  before(restore);
-
   beforeEach(() => {
+    restore();
     signInAsAdmin();
     cy.server();
   });
diff --git a/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js b/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js
index 8868d4467cf..d5335be7959 100644
--- a/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js
@@ -1,9 +1,8 @@
 import { signInAsAdmin, restore, popover, modal } from "__support__/cypress";
 
 describe("scenarios > admin > databases > edit", () => {
-  before(restore);
-
   beforeEach(() => {
+    restore();
     signInAsAdmin();
     cy.server();
     cy.route("GET", "/api/database/*").as("databaseGet");
@@ -65,13 +64,23 @@ describe("scenarios > admin > databases > edit", () => {
   });
 
   describe("Scheduling tab", () => {
+    beforeEach(() => {
+      // Turn on scheduling without relying on the previous test(s)
+      cy.request("PUT", "/api/database/1", {
+        details: {
+          "let-user-control-scheduling": true,
+        },
+        engine: "h2",
+      });
+    });
+
     it("shows the initial scheduling settings correctly", () => {
       cy.visit("/admin/databases/1");
 
       cy.findByText("Scheduling").click();
 
       cy.findByText("Database syncing")
-        .parent()
+        .closest(".Form-field")
         .findByText("Hourly");
 
       cy.findByText("Regularly, on a schedule")
@@ -85,7 +94,7 @@ describe("scenarios > admin > databases > edit", () => {
       cy.findByText("Scheduling").click();
 
       cy.findByText("Database syncing")
-        .parent()
+        .closest(".Form-field")
         .as("sync");
 
       cy.get("@sync")
diff --git a/frontend/test/metabase/scenarios/admin/databases/list.cy.spec.js b/frontend/test/metabase/scenarios/admin/databases/list.cy.spec.js
index e4887b91604..e1e7b846e71 100644
--- a/frontend/test/metabase/scenarios/admin/databases/list.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/databases/list.cy.spec.js
@@ -1,9 +1,8 @@
 import { signInAsAdmin, restore } from "__support__/cypress";
 
 describe("scenarios > admin > databases > list", () => {
-  before(restore);
-
   beforeEach(() => {
+    restore();
     signInAsAdmin();
     cy.server();
   });
@@ -60,6 +59,7 @@ describe("scenarios > admin > databases > list", () => {
   it("should let you bring back the sample dataset", () => {
     cy.route("POST", "/api/database/sample_dataset").as("sample_dataset");
 
+    cy.request("DELETE", "/api/database/1").as("delete");
     cy.visit("/admin/databases");
     cy.contains("Bring the sample dataset back").click();
     cy.wait("@sample_dataset");
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 9c27c14f81f..0dac0fc421a 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
@@ -7,7 +7,7 @@ import {
 const ORDERS_URL = "/admin/datamodel/database/1/table/2";
 
 describe("scenarios > admin > datamodel > hidden tables (metabase#9759)", () => {
-  before(restore);
+  beforeEach(restore);
 
   it("can hide a table and not show up in 'Our Data'", () => {
     cy.server();
diff --git a/frontend/test/metabase/scenarios/admin/datamodel/metrics.cy.spec.js b/frontend/test/metabase/scenarios/admin/datamodel/metrics.cy.spec.js
index bdb53ebfc98..065cedab85b 100644
--- a/frontend/test/metabase/scenarios/admin/datamodel/metrics.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/datamodel/metrics.cy.spec.js
@@ -1,11 +1,11 @@
 import { restore, signInAsAdmin, popover, modal } from "__support__/cypress";
 import { SAMPLE_DATASET } from "__support__/cypress_sample_dataset";
 
-const { ORDERS_ID } = SAMPLE_DATASET;
+const { ORDERS, ORDERS_ID } = SAMPLE_DATASET;
 
 describe("scenarios > admin > datamodel > metrics", () => {
-  before(restore);
   beforeEach(() => {
+    restore();
     signInAsAdmin();
     cy.viewport(1400, 860);
   });
@@ -43,50 +43,23 @@ describe("scenarios > admin > datamodel > metrics", () => {
   });
 
   describe("with metrics", () => {
-    before(() => {
+    beforeEach(() => {
       // CREATE METRIC
-      signInAsAdmin();
-      cy.visit("/admin");
-      cy.contains("Data Model").click();
-      cy.contains("Metrics").click();
-      cy.contains("New metric").click();
-      cy.contains("Select a table").click();
-      popover()
-        .contains("Orders")
-        .click({ force: true }); // this shouldn't be needed, but there were issues with reordering as loads happeend
-
-      cy.url().should("match", /metric\/create$/);
-      cy.contains("Create Your Metric");
-
-      // filter to orders with total under 100
-      cy.contains("Add filters").click();
-      cy.contains("Total").click();
-      cy.contains("Equal to").click();
-      cy.contains("Less than").click();
-      cy.get('[placeholder="Enter a number"]').type("100");
-      popover()
-        .contains("Add filter")
-        .click();
-
-      //
-      cy.contains("Result: 12765");
-
-      // fill in name/description
-      cy.get('[name="name"]').type("orders <100");
-      cy.get('[name="description"]').type(
-        "Count of orders with a total under $100.",
-      );
-
-      // saving bounces you back and you see new metric in the list
-      cy.contains("Save changes").click();
-      cy.url().should("match", /datamodel\/metrics$/);
-      cy.contains("orders <100");
-      cy.contains("Count, Filtered by Total");
+      cy.request("POST", "/api/metric", {
+        definition: {
+          aggregation: ["count"],
+          filter: ["<", ["field-id", ORDERS.TOTAL], 100],
+          "source-table": ORDERS_ID,
+        },
+        name: "orders < 100",
+        description: "Count of orders with a total under $100.",
+        table_id: ORDERS_ID,
+      });
     });
 
     it("should show no questions based on a new metric", () => {
       cy.visit("/reference/metrics/1/questions");
-      cy.findAllByText("Questions about orders <100");
+      cy.findAllByText("Questions about orders < 100");
       cy.findByText("Loading...");
       cy.findByText("Loading...").should("not.exist");
       cy.findByText(
@@ -115,8 +88,8 @@ describe("scenarios > admin > datamodel > metrics", () => {
       // Check the list
       cy.visit("/reference/metrics/1/questions");
       cy.findByText("Our analysis").should("not.exist");
-      cy.findAllByText("Questions about orders <100");
-      cy.findByText("Orders, orders <100, Filtered by Total");
+      cy.findAllByText("Questions about orders < 100");
+      cy.findByText("Orders, orders < 100, Filtered by Total");
     });
 
     it("should show the metric detail view for a specific id", () => {
@@ -130,7 +103,7 @@ describe("scenarios > admin > datamodel > metrics", () => {
       cy.contains("Data Model").click();
       cy.contains("Metrics").click();
 
-      cy.contains("orders <100")
+      cy.contains("orders < 100")
         .parent()
         .parent()
         .find(".Icon-ellipsis")
@@ -158,7 +131,7 @@ describe("scenarios > admin > datamodel > metrics", () => {
       cy.contains("Result: 18703");
 
       // update name and description, set a revision note, and save the update
-      cy.get('[name="name"]').type("{selectall}orders >10");
+      cy.get('[name="name"]').type("{selectall}orders > 10");
       cy.get('[name="description"]').type(
         "{selectall}Count of orders with a total over $10.",
       );
@@ -167,10 +140,10 @@ describe("scenarios > admin > datamodel > metrics", () => {
 
       // get redirected to previous page and see the new metric name
       cy.url().should("match", /datamodel\/metrics$/);
-      cy.contains("orders >10");
+      cy.contains("orders > 10");
 
       // clean up
-      cy.contains("orders >10")
+      cy.contains("orders > 10")
         .parent()
         .parent()
         .find(".Icon-ellipsis")
@@ -196,7 +169,14 @@ describe("scenarios > admin > datamodel > metrics", () => {
           aggregation: [
             [
               "aggregation-options",
-              ["sum", ["*", ["field-id", 9], ["field-id", 10]]],
+              [
+                "sum",
+                [
+                  "*",
+                  ["field-id", ORDERS.DISCOUNT],
+                  ["field-id", ORDERS.QUANTITY],
+                ],
+              ],
               { "display-name": "CE" },
             ],
           ],
diff --git a/frontend/test/metabase/scenarios/admin/datamodel/segments.cy.spec.js b/frontend/test/metabase/scenarios/admin/datamodel/segments.cy.spec.js
index 77005418777..69827904beb 100644
--- a/frontend/test/metabase/scenarios/admin/datamodel/segments.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/datamodel/segments.cy.spec.js
@@ -12,8 +12,8 @@ import { SAMPLE_DATASET } from "__support__/cypress_sample_dataset";
 const { ORDERS, ORDERS_ID } = SAMPLE_DATASET;
 
 describe("scenarios > admin > datamodel > segments", () => {
-  before(restore);
   beforeEach(() => {
+    restore();
     signInAsAdmin();
     cy.viewport(1400, 860);
   });
@@ -52,9 +52,7 @@ describe("scenarios > admin > datamodel > segments", () => {
   describe("with segment", () => {
     const SEGMENT_NAME = "Orders < 100";
 
-    before(() => {
-      signInAsAdmin();
-
+    beforeEach(() => {
       // Create a segment through API
       cy.request("POST", "/api/segment", {
         name: SEGMENT_NAME,
diff --git a/frontend/test/metabase/scenarios/admin/datamodel/table.cy.spec.js b/frontend/test/metabase/scenarios/admin/datamodel/table.cy.spec.js
index 50abdca2fce..e7ab0112fc3 100644
--- a/frontend/test/metabase/scenarios/admin/datamodel/table.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/datamodel/table.cy.spec.js
@@ -2,8 +2,10 @@ import { signInAsAdmin, restore } from "__support__/cypress";
 // Ported from `databases.e2e.spec.js`
 
 describe("scenarios > admin > databases > table", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   it("should see four tables in sample database", () => {
     cy.visit("/admin/datamodel/database/1");
diff --git a/frontend/test/metabase/scenarios/admin/permissions/permissions.cy.spec.js b/frontend/test/metabase/scenarios/admin/permissions/permissions.cy.spec.js
index 2e96dedbede..296c446200e 100644
--- a/frontend/test/metabase/scenarios/admin/permissions/permissions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/permissions/permissions.cy.spec.js
@@ -1,8 +1,10 @@
 import { restore, signInAsAdmin } from "__support__/cypress";
 
 describe("scenarios > admin > permissions", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   it("should display error on failed save", () => {
     // revoke some permissions
diff --git a/frontend/test/metabase/scenarios/admin/settings/settings.cy.spec.js b/frontend/test/metabase/scenarios/admin/settings/settings.cy.spec.js
index 86144543d27..fce822bffcd 100644
--- a/frontend/test/metabase/scenarios/admin/settings/settings.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/settings/settings.cy.spec.js
@@ -7,8 +7,10 @@ import {
 } from "__support__/cypress";
 
 describe("scenarios > admin > settings", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   it("should surface an error when validation for any field fails (metabase#4506)", () => {
     const BASE_URL = Cypress.config().baseUrl;
@@ -280,6 +282,15 @@ describe("scenarios > admin > settings", () => {
       cy.findByText("Changes saved!");
     });
     it("should show an error if test email fails", () => {
+      // Reuse Email setup without relying on the previous test
+      cy.request("PUT", "/api/setting", {
+        "email-from-address": "admin@metabase.com",
+        "email-smtp-host": "localhost",
+        "email-smtp-password": null,
+        "email-smtp-port": "1234",
+        "email-smtp-security": "none",
+        "email-smtp-username": null,
+      });
       cy.visit("/admin/settings/email");
       cy.findByText("Send test email").click();
       cy.findByText("Sorry, something went wrong. Please try again.");
diff --git a/frontend/test/metabase/scenarios/admin/settings/spinner.cy.spec.js b/frontend/test/metabase/scenarios/admin/settings/spinner.cy.spec.js
index 82219a9113e..d2fa5c80c5a 100644
--- a/frontend/test/metabase/scenarios/admin/settings/spinner.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/settings/spinner.cy.spec.js
@@ -1,8 +1,10 @@
 import { restore, signInAsAdmin } from "__support__/cypress";
 
 describe("scenarios > admin > spinner", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   describe("API request", () => {
     it("should return correct DB", () => {
diff --git a/frontend/test/metabase/scenarios/alert/alert.cy.spec.js b/frontend/test/metabase/scenarios/alert/alert.cy.spec.js
index c4cf6279617..41b5a7a2bc7 100644
--- a/frontend/test/metabase/scenarios/alert/alert.cy.spec.js
+++ b/frontend/test/metabase/scenarios/alert/alert.cy.spec.js
@@ -27,10 +27,12 @@ export function setGoal(number) {
 }
 
 describe("scenarios > alert", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
-
   describe("with nothing set", () => {
+    beforeEach(() => {
+      restore();
+      signInAsAdmin();
+    });
+
     it("should prompt you to add email/slack credentials", () => {
       cy.visit("/question/1");
       cy.get(".Icon-bell").click();
@@ -38,6 +40,7 @@ describe("scenarios > alert", () => {
         "To send alerts, you'll need to set up email or Slack integration.",
       );
     });
+
     it("should say to non-admins that admin must add email credentials", () => {
       signInAsNormalUser();
       cy.visit("/question/1");
diff --git a/frontend/test/metabase/scenarios/auth/search.cy.spec.js b/frontend/test/metabase/scenarios/auth/search.cy.spec.js
index 8412c99940c..d1cb4c81fe9 100644
--- a/frontend/test/metabase/scenarios/auth/search.cy.spec.js
+++ b/frontend/test/metabase/scenarios/auth/search.cy.spec.js
@@ -6,7 +6,7 @@ import {
 } from "__support__/cypress";
 
 describe("scenarios > auth > search", () => {
-  before(restore);
+  beforeEach(restore);
 
   describe("universal search", () => {
     it("should work for admin", () => {
diff --git a/frontend/test/metabase/scenarios/auth/signin.cy.spec.js b/frontend/test/metabase/scenarios/auth/signin.cy.spec.js
index 0d05175c8dd..521717442ff 100644
--- a/frontend/test/metabase/scenarios/auth/signin.cy.spec.js
+++ b/frontend/test/metabase/scenarios/auth/signin.cy.spec.js
@@ -3,8 +3,10 @@ import { restore, signIn, signOut, USERS } from "__support__/cypress";
 const sizes = [[1280, 800], [640, 360]];
 
 describe("scenarios > auth > signin", () => {
-  before(restore);
-  beforeEach(signOut);
+  beforeEach(() => {
+    restore();
+    signOut();
+  });
 
   it("should redirect to  /auth/login", () => {
     cy.visit("/");
diff --git a/frontend/test/metabase/scenarios/dashboard/dashboard-drill.cy.spec.js b/frontend/test/metabase/scenarios/dashboard/dashboard-drill.cy.spec.js
index bfcfd677a60..c5bb976e1d5 100644
--- a/frontend/test/metabase/scenarios/dashboard/dashboard-drill.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard/dashboard-drill.cy.spec.js
@@ -11,8 +11,10 @@ import { SAMPLE_DATASET } from "__support__/cypress_sample_dataset";
 const { REVIEWS, REVIEWS_ID } = SAMPLE_DATASET;
 
 describe("scenarios > dashboard > dashboard drill", () => {
-  before(restore);
-  beforeEach(signIn);
+  beforeEach(() => {
+    restore();
+    signIn();
+  });
 
   it("should handle URL click through on a table", () => {
     createDashboardWithQuestion({}, dashboardId =>
diff --git a/frontend/test/metabase/scenarios/dashboard/dashboard_data_permissions.cy.spec.js b/frontend/test/metabase/scenarios/dashboard/dashboard_data_permissions.cy.spec.js
index f60edbe8aa9..b5afd1750a0 100644
--- a/frontend/test/metabase/scenarios/dashboard/dashboard_data_permissions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard/dashboard_data_permissions.cy.spec.js
@@ -25,7 +25,7 @@ function filterDashboard(suggests = true) {
 }
 
 describe("support > permissions (metabase#8472)", () => {
-  before(() => {
+  beforeEach(() => {
     restore();
     signIn("admin");
 
@@ -48,7 +48,6 @@ describe("support > permissions (metabase#8472)", () => {
   });
 
   it("should allow an admin user to select the filter", () => {
-    signIn("admin");
     filterDashboard();
   });
 
diff --git a/frontend/test/metabase/scenarios/dashboard/embed.cy.spec.js b/frontend/test/metabase/scenarios/dashboard/embed.cy.spec.js
index 3eb53c1ca3b..2f659609458 100644
--- a/frontend/test/metabase/scenarios/dashboard/embed.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard/embed.cy.spec.js
@@ -1,8 +1,10 @@
 import { signInAsAdmin, restore, popover, modal } from "__support__/cypress";
 
 describe("scenarios > dashboard > embed", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   it("should have the correct embed snippet", () => {
     cy.visit("/dashboard/1");
diff --git a/frontend/test/metabase/scenarios/dashboard/nested-cards.cy.spec.js b/frontend/test/metabase/scenarios/dashboard/nested-cards.cy.spec.js
index ffe6864ef9b..c950d01fce8 100644
--- a/frontend/test/metabase/scenarios/dashboard/nested-cards.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard/nested-cards.cy.spec.js
@@ -1,8 +1,10 @@
 import { signIn, restore, popover } from "__support__/cypress";
 
 describe("scenarios > dashboard > nested cards", () => {
-  before(restore);
-  beforeEach(signIn);
+  beforeEach(() => {
+    restore();
+    signIn();
+  });
 
   it("should show fields on nested cards", () => {
     createDashboardWithNestedCard(dashId => {
@@ -32,9 +34,7 @@ function createDashboardWithNestedCard(callback) {
       database: 1,
     },
     display: "table",
-    description: null,
     visualization_settings: {},
-    collection_id: null,
   }).then(({ body }) =>
     cy
       .request("POST", "/api/card", {
diff --git a/frontend/test/metabase/scenarios/dashboard/parameters-embedded.cy.spec.js b/frontend/test/metabase/scenarios/dashboard/parameters-embedded.cy.spec.js
index a9cf7e62fb0..39e26626838 100644
--- a/frontend/test/metabase/scenarios/dashboard/parameters-embedded.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard/parameters-embedded.cy.spec.js
@@ -19,7 +19,7 @@ const DASHBOARD_JWT_TOKEN =
 describe("scenarios > dashboard > parameters-embedded", () => {
   let dashboardId, questionId, dashcardId;
 
-  before(() => {
+  beforeEach(() => {
     restore();
     signInAsAdmin();
 
@@ -86,8 +86,7 @@ describe("scenarios > dashboard > parameters-embedded", () => {
 
   describe("public question", () => {
     let uuid;
-    before(() => {
-      signInAsAdmin();
+    beforeEach(() => {
       cy.request("POST", `/api/card/${questionId}/public_link`).then(
         res => (uuid = res.body.uuid),
       );
@@ -103,8 +102,7 @@ describe("scenarios > dashboard > parameters-embedded", () => {
   });
 
   describe("embedded question", () => {
-    before(() => {
-      signInAsAdmin();
+    beforeEach(() => {
       cy.request("PUT", `/api/card/${questionId}`, {
         embedding_params: {
           id: "enabled",
@@ -138,8 +136,7 @@ describe("scenarios > dashboard > parameters-embedded", () => {
 
   describe("public dashboard", () => {
     let uuid;
-    before(() => {
-      signInAsAdmin();
+    beforeEach(() => {
       cy.request("POST", `/api/dashboard/${dashboardId}/public_link`).then(
         res => (uuid = res.body.uuid),
       );
@@ -155,8 +152,7 @@ describe("scenarios > dashboard > parameters-embedded", () => {
   });
 
   describe("embedded dashboard", () => {
-    before(() => {
-      signInAsAdmin();
+    beforeEach(() => {
       cy.request("PUT", `/api/dashboard/${dashboardId}`, {
         embedding_params: {
           id: "enabled",
diff --git a/frontend/test/metabase/scenarios/dashboard/permissions.cy.spec.js b/frontend/test/metabase/scenarios/dashboard/permissions.cy.spec.js
index 029d7407a86..b59c52b868a 100644
--- a/frontend/test/metabase/scenarios/dashboard/permissions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard/permissions.cy.spec.js
@@ -1,10 +1,10 @@
 import { signInAsAdmin, signIn, restore } from "__support__/cypress";
 
 describe("scenarios > dashboard > permissions", () => {
-  before(restore);
   let dashboardId;
 
-  it("should let admins view all cards in a dashboard", () => {
+  beforeEach(() => {
+    restore();
     // This first test creates a dashboard with two questions.
     // One is in Our Analytics the other is in a more locked down collection.
     signInAsAdmin();
@@ -87,7 +87,9 @@ describe("scenarios > dashboard > permissions", () => {
         cy.visit(`/dashboard/${dashId}`);
       },
     );
+  });
 
+  it("should let admins view all cards in a dashboard", () => {
     // Admin can see both questions
     cy.findByText("First Question");
     cy.findByText("foo");
diff --git a/frontend/test/metabase/scenarios/dashboard/text-box.cy.spec.js b/frontend/test/metabase/scenarios/dashboard/text-box.cy.spec.js
index e7cd9b399b7..4cc01f532f5 100644
--- a/frontend/test/metabase/scenarios/dashboard/text-box.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard/text-box.cy.spec.js
@@ -9,13 +9,13 @@ function addTextBox(string) {
 }
 
 describe("scenarios > dashboard > text-box", () => {
-  before(restore);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   describe("Editing", () => {
     beforeEach(() => {
-      restore();
-      signInAsAdmin();
-
       // Create text box card
       cy.visit("/dashboard/1");
       addTextBox("Text *text* __text__");
@@ -45,8 +45,6 @@ describe("scenarios > dashboard > text-box", () => {
 
   describe("when text-box is the only element on the dashboard", () => {
     beforeEach(() => {
-      restore(); // restore before each so we can reuse dashboard id
-      signInAsAdmin();
       // Create dashboard
       cy.server();
       cy.request("POST", "/api/dashboard", {
diff --git a/frontend/test/metabase/scenarios/dashboard/title-drill.cy.spec.js b/frontend/test/metabase/scenarios/dashboard/title-drill.cy.spec.js
index 2ac52d0e818..f39c5b8699f 100644
--- a/frontend/test/metabase/scenarios/dashboard/title-drill.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard/title-drill.cy.spec.js
@@ -1,8 +1,10 @@
 import { signIn, restore } from "__support__/cypress";
 
 describe("scenarios > dashboard > title drill", () => {
-  before(restore);
-  beforeEach(signIn);
+  beforeEach(() => {
+    restore();
+    signIn();
+  });
 
   it("should let you click through the title to the query builder", () => {
     createDashboard(dashId => {
diff --git a/frontend/test/metabase/scenarios/home/activity-page.cy.spec.js b/frontend/test/metabase/scenarios/home/activity-page.cy.spec.js
index 58e47b1fa1b..dd3ac17a319 100644
--- a/frontend/test/metabase/scenarios/home/activity-page.cy.spec.js
+++ b/frontend/test/metabase/scenarios/home/activity-page.cy.spec.js
@@ -8,8 +8,10 @@ import {
 //Replaces HomepageApp.e2e.spec.js
 
 describe("metabase > scenarios > home > activity-page", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   it("should show test startup activity ", () => {
     cy.visit("/activity");
diff --git a/frontend/test/metabase/scenarios/home/overworld.cy.spec.js b/frontend/test/metabase/scenarios/home/overworld.cy.spec.js
index 9709fe383c4..e4b389446b0 100644
--- a/frontend/test/metabase/scenarios/home/overworld.cy.spec.js
+++ b/frontend/test/metabase/scenarios/home/overworld.cy.spec.js
@@ -5,7 +5,7 @@ import {
 } from "__support__/cypress";
 
 describe("scenarios > home > overworld", () => {
-  before(restore);
+  beforeEach(restore);
 
   describe("content management", () => {
     describe("as admin", () => {
diff --git a/frontend/test/metabase/scenarios/permissions.cy.spec.js b/frontend/test/metabase/scenarios/permissions.cy.spec.js
index d93c9cb2eea..cfbc0d134e3 100644
--- a/frontend/test/metabase/scenarios/permissions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/permissions.cy.spec.js
@@ -1,7 +1,7 @@
 import { signIn, restore } from "__support__/cypress";
 
 describe("scenarios > permissions", () => {
-  before(restore);
+  beforeEach(restore);
 
   const PATHS = [
     "/dashboard/1",
diff --git a/frontend/test/metabase/scenarios/pulse/pulse.cy.spec.js b/frontend/test/metabase/scenarios/pulse/pulse.cy.spec.js
index 24b313abe17..9ec17e4cbf5 100644
--- a/frontend/test/metabase/scenarios/pulse/pulse.cy.spec.js
+++ b/frontend/test/metabase/scenarios/pulse/pulse.cy.spec.js
@@ -14,8 +14,10 @@ const MOCK_PULSE_FORM_INPUT = {
 };
 
 describe("scenarios > pulse", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
   it("should be able get to the new pulse page from the nav bar", () => {
     cy.visit("/");
 
@@ -31,8 +33,8 @@ describe("scenarios > pulse", () => {
 
     cy.visit("/pulse/create");
 
-    cy.get('[placeholder="Important metrics"]')
-      .wait(100)
+    cy.findByPlaceholderText("Important metrics")
+      .click()
       .type("pulse title");
 
     cy.contains("Select a question").click();
@@ -47,20 +49,44 @@ describe("scenarios > pulse", () => {
     cy.contains("pulse title");
   });
 
-  it("should load existing pulses", () => {
-    cy.visit("/collection/root");
-    cy.contains("pulse title").click({ force: true });
-    cy.contains("18,760");
-  });
+  describe("existing pulses", () => {
+    beforeEach(() => {
+      cy.server();
+      // Create new pulse without relying on the previous test
+      cy.request("POST", "/api/pulse", {
+        name: "pulse title",
+        cards: [{ id: 2, include_csv: false, include_xls: false }],
+        channels: [
+          {
+            channel_type: "email",
+            details: {},
+            enabled: true,
+            recipients: [],
+            schedule_day: "mon",
+            schedule_frame: "first",
+            schedule_hour: 8,
+            schedule_type: "daily",
+          },
+        ],
+        skip_if_empty: false,
+      });
+    });
 
-  it("should edit existing pulses", () => {
-    cy.visit("/pulse/1");
-    cy.get('[placeholder="Important metrics"]')
-      .clear()
-      .type("new pulse title");
+    it("should load existing pulses", () => {
+      cy.visit("/collection/root");
+      cy.contains("pulse title").click({ force: true });
+      cy.contains("18,760");
+    });
 
-    cy.contains("Save changes").click();
-    cy.url().should("match", /\/collection\/root$/);
-    cy.contains("new pulse title");
+    it("should edit existing pulses", () => {
+      cy.visit("/pulse/1");
+      cy.get('[placeholder="Important metrics"]')
+        .clear()
+        .type("new pulse title");
+
+      cy.contains("Save changes").click();
+      cy.url().should("match", /\/collection\/root$/);
+      cy.contains("new pulse title");
+    });
   });
 });
diff --git a/frontend/test/metabase/scenarios/question/data_ref.cy.spec.js b/frontend/test/metabase/scenarios/question/data_ref.cy.spec.js
index 562f9e42026..87a34ffb070 100644
--- a/frontend/test/metabase/scenarios/question/data_ref.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/data_ref.cy.spec.js
@@ -1,8 +1,10 @@
 import { signInAsAdmin, restore } from "__support__/cypress";
 
 describe("scenarios > question > data reference sidebar", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   it("should load needed data", () => {
     cy.visit("/question/new");
diff --git a/frontend/test/metabase/scenarios/question/downloads.cy.spec.js b/frontend/test/metabase/scenarios/question/downloads.cy.spec.js
index e13b05dec44..c5559ce96b0 100644
--- a/frontend/test/metabase/scenarios/question/downloads.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/downloads.cy.spec.js
@@ -9,8 +9,8 @@ const testCases = [
 ];
 
 describe("scenarios > question > download", () => {
-  before(restore);
   beforeEach(() => {
+    restore();
     signInAsAdmin();
   });
 
diff --git a/frontend/test/metabase/scenarios/question/loading.cy.spec.js b/frontend/test/metabase/scenarios/question/loading.cy.spec.js
index 5fb0627e133..6fd3c77a6f5 100644
--- a/frontend/test/metabase/scenarios/question/loading.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/loading.cy.spec.js
@@ -1,8 +1,10 @@
 import { signInAsAdmin, restore } from "__support__/cypress";
 
 describe("scenarios > question > loading behavior", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   it("should preload tables on the new question page", () => {
     cy.server();
diff --git a/frontend/test/metabase/scenarios/question/native_subquery.cy.spec.js b/frontend/test/metabase/scenarios/question/native_subquery.cy.spec.js
index 6613577d23f..6ea4e627652 100644
--- a/frontend/test/metabase/scenarios/question/native_subquery.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/native_subquery.cy.spec.js
@@ -1,8 +1,10 @@
 import { signInAsAdmin, restore, signIn } from "__support__/cypress";
 
 describe("scenarios > question > native subquery", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   it("should allow a user with no data access to execute a native subquery", () => {
     // Create the initial SQL question and followup nested question
diff --git a/frontend/test/metabase/scenarios/question/nested.cy.spec.js b/frontend/test/metabase/scenarios/question/nested.cy.spec.js
index 8af02c5c08e..56237792619 100644
--- a/frontend/test/metabase/scenarios/question/nested.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/nested.cy.spec.js
@@ -11,7 +11,7 @@ import { SAMPLE_DATASET } from "__support__/cypress_sample_dataset";
 const { ORDERS, ORDERS_ID, PRODUCTS } = SAMPLE_DATASET;
 
 describe("scenarios > question > nested (metabase#12568)", () => {
-  before(() => {
+  beforeEach(() => {
     restore();
     signInAsAdmin();
 
@@ -45,11 +45,7 @@ describe("scenarios > question > nested (metabase#12568)", () => {
         database: 1,
       },
       display: "scalar",
-      description: null,
       visualization_settings: {},
-      collection_id: null,
-      result_metadata: null,
-      metadata_checksum: null,
     });
 
     // Create a complex native question
@@ -87,16 +83,10 @@ describe("scenarios > question > nested (metabase#12568)", () => {
         database: 1,
       },
       display: "scalar",
-      description: null,
       visualization_settings: {},
-      collection_id: null,
-      result_metadata: null,
-      metadata_checksum: null,
     });
   });
 
-  beforeEach(signInAsAdmin);
-
   it("should allow Distribution on a Saved Simple Question", () => {
     cy.visit("/question/new");
     cy.contains("Simple question").click();
@@ -154,7 +144,7 @@ describe("scenarios > question > nested (metabase#12568)", () => {
 });
 
 describe("scenarios > question > nested", () => {
-  before(() => {
+  beforeEach(() => {
     restore();
     signInAsAdmin();
   });
diff --git a/frontend/test/metabase/scenarios/question/operators.cy.spec.js b/frontend/test/metabase/scenarios/question/operators.cy.spec.js
index a9cba2ce680..ae4fc18c56b 100644
--- a/frontend/test/metabase/scenarios/question/operators.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/operators.cy.spec.js
@@ -1,8 +1,10 @@
 import { restore, signInAsNormalUser, popover } from "__support__/cypress";
 
 describe("operators in questions", () => {
-  before(restore);
-  beforeEach(signInAsNormalUser);
+  beforeEach(() => {
+    restore();
+    signInAsNormalUser();
+  });
 
   const expected = {
     text: {
diff --git a/frontend/test/metabase/scenarios/question/settings.cy.spec.js b/frontend/test/metabase/scenarios/question/settings.cy.spec.js
index d7e4fdd1d12..a4458131357 100644
--- a/frontend/test/metabase/scenarios/question/settings.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/settings.cy.spec.js
@@ -1,8 +1,10 @@
 import { signInAsAdmin, restore, openOrdersTable } from "__support__/cypress";
 
 describe("scenarios > question > settings", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   describe("column settings", () => {
     it("should allow you to remove a column and add two foreign columns", () => {
diff --git a/frontend/test/metabase/scenarios/question/snippets.cy.spec.js b/frontend/test/metabase/scenarios/question/snippets.cy.spec.js
index e291d86e13e..7106d1b6f84 100644
--- a/frontend/test/metabase/scenarios/question/snippets.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/snippets.cy.spec.js
@@ -18,44 +18,61 @@ function _clearAndIterativelyTypeUsingLabel(label, string) {
 //       - There is a related issue: https://github.com/metabase/metabase-enterprise/issues/543
 // TODO: Once the above issue is (re)solved, change back to `signInAsNormalUser`
 describe("scenarios > question > snippets", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   it("should let you create and use a snippet", () => {
     cy.visit("/question/new");
     cy.contains("Native query").click();
 
-    // type a query and highlight some of the text
-    cy.get(".ace_content").as("ace");
-    cy.get("@ace").type(
+    // Type a query and highlight some of the text
+    cy.get(".ace_content").as("editor");
+    cy.get("@editor").type(
       "select 'stuff'" + "{shift}{leftarrow}".repeat("'stuff'".length),
     );
 
-    // add a snippet of that text
+    // Add a snippet of that text
     cy.get(".Icon-snippet").click();
     cy.contains("Create a snippet").click();
 
-    modal()
-      .find("input[name=name]")
-      .type("stuff-snippet");
-    modal()
-      .contains("Save")
-      .click();
+    modal().within(() => {
+      cy.findByLabelText("Give your snippet a name").type("stuff-snippet");
+      cy.findByText("Save").click();
+    });
 
     // SQL editor should get updated automatically
-    cy.get("@ace").contains("select {{snippet: stuff-snippet}}");
+    cy.get("@editor").contains("select {{snippet: stuff-snippet}}");
 
-    // run the query and check the displayed scalar
+    // Run the query and check the value
     cy.get(".NativeQueryEditor .Icon-play").click();
     cy.get(".ScalarValue").contains("stuff");
   });
 
   it("should let you edit snippet", () => {
-    // open the snippet edit modal
+    // Re-create the above snippet via API without the need to rely on the previous test
+    cy.request("POST", "/api/native-query-snippet", {
+      name: "stuff-snippet",
+      content: "stuff",
+    });
+
+    cy.visit("/question/new");
+    cy.findByText("Native query").click();
+
+    // Populate the native editor first
+    // 1. select
+    cy.get(".ace_content").as("editor");
+    cy.get("@editor").type("select ");
+    // 2. snippet
+    cy.get(".Icon-snippet").click();
+    cy.findByText("stuff-snippet").click();
+
+    // Open the snippet edit modal
     cy.get(".Icon-chevrondown").click({ force: true });
     cy.findByText("Edit").click();
 
-    // update the name and content
+    // Update the name and content
     modal().within(() => {
       cy.findByText("Editing stuff-snippet");
 
@@ -69,9 +86,9 @@ describe("scenarios > question > snippets", () => {
     });
 
     // SQL editor should get updated automatically
-    cy.get(".ace_content").contains("select {{snippet: Math}}");
+    cy.get("@editor").contains("select {{snippet: Math}}");
 
-    // run the query and check the displayed scalar
+    // Run the query and check the new value
     cy.get(".NativeQueryEditor .Icon-play").click();
     cy.get(".ScalarValue").contains("2");
   });
diff --git a/frontend/test/metabase/scenarios/question/trendline.cy.spec.js b/frontend/test/metabase/scenarios/question/trendline.cy.spec.js
index 0d441f65080..022b8dd1d1a 100644
--- a/frontend/test/metabase/scenarios/question/trendline.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/trendline.cy.spec.js
@@ -6,8 +6,10 @@ import {
 } from "__support__/cypress";
 
 describe("scenarios > question > trendline", () => {
-  before(restore);
-  beforeEach(signInAsNormalUser);
+  beforeEach(() => {
+    restore();
+    signInAsNormalUser();
+  });
 
   it.skip("displays trendline when there are multiple numeric outputs (for simple question) (metabase#12781)", () => {
     // Create question: orders summarized with "Average of Subtotal" and "Sum of Total" by CreatedAt:Year
diff --git a/frontend/test/metabase/scenarios/question/view.cy.spec.js b/frontend/test/metabase/scenarios/question/view.cy.spec.js
index 84bfe35308b..686c715c429 100644
--- a/frontend/test/metabase/scenarios/question/view.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/view.cy.spec.js
@@ -11,8 +11,10 @@ import { SAMPLE_DATASET } from "__support__/cypress_sample_dataset";
 const { PRODUCTS } = SAMPLE_DATASET;
 
 describe("scenarios > question > view", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   describe("summarize sidebar", () => {
     it("should summarize by category and show a bar chart", () => {
@@ -92,10 +94,9 @@ describe("scenarios > question > view", () => {
     });
   });
 
-  describe.only("apply filters without data permissions", () => {
-    before(() => {
+  describe("apply filters without data permissions", () => {
+    beforeEach(() => {
       // All users upgraded to collection view access
-      signInAsAdmin();
       cy.visit("/admin/permissions/collections");
       cy.get(".Icon-close")
         .first()
diff --git a/frontend/test/metabase/scenarios/reference/databases.cy.spec.js b/frontend/test/metabase/scenarios/reference/databases.cy.spec.js
index 68ec8c10391..fabc026e902 100644
--- a/frontend/test/metabase/scenarios/reference/databases.cy.spec.js
+++ b/frontend/test/metabase/scenarios/reference/databases.cy.spec.js
@@ -1,8 +1,10 @@
 import { signInAsAdmin, restore } from "__support__/cypress";
 
 describe("scenarios > reference > databases", () => {
-  before(restore);
-  beforeEach(signInAsAdmin);
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+  });
 
   it("should see the listing", () => {
     cy.visit("/reference/databases");
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 f55f77d0e09..db0c5253f3f 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
@@ -331,9 +331,7 @@ describe("scenarios > visualizations > drillthroughs > chart drill", () => {
   });
 
   describe("for an unsaved question", () => {
-    before(() => {
-      restore();
-      signInAsAdmin();
+    beforeEach(() => {
       // Build a question without saving
       openProductsTable();
       cy.findByText("Summarize").click();
diff --git a/frontend/test/metabase/scenarios/visualizations/drillthroughs/dash_drill.cy.spec.js b/frontend/test/metabase/scenarios/visualizations/drillthroughs/dash_drill.cy.spec.js
index 5972426d375..a46e5a6e8d4 100644
--- a/frontend/test/metabase/scenarios/visualizations/drillthroughs/dash_drill.cy.spec.js
+++ b/frontend/test/metabase/scenarios/visualizations/drillthroughs/dash_drill.cy.spec.js
@@ -12,13 +12,14 @@ const Q2 = {
 
 describe("scenarios > visualizations > drillthroughs > dash_drill", () => {
   describe("card title click action", () => {
+    beforeEach(() => {
+      restore();
+      signInAsAdmin();
+    });
     describe("from a scalar card", () => {
       const DASHBOARD_NAME = "Scalar Dash";
 
-      before(() => {
-        restore();
-        signInAsAdmin();
-
+      beforeEach(() => {
         // Convert the second question to a scalar (Orders, summarized by count)
         cy.request("PUT", `/api/card/${Q2.id}`, {
           display: "scalar",
@@ -41,10 +42,7 @@ describe("scenarios > visualizations > drillthroughs > dash_drill", () => {
     describe("from a scalar with active filter applied", () => {
       const DASHBOARD_NAME = "Scalar w Filter Dash";
 
-      before(() => {
-        restore();
-        signInAsAdmin();
-
+      beforeEach(() => {
         // Convert Q2 to a scalar with a filter applied
         cy.request("PUT", `/api/card/${Q2.id}`, {
           dataset_query: {
@@ -75,10 +73,7 @@ describe("scenarios > visualizations > drillthroughs > dash_drill", () => {
       const DASHBOARD_NAME = "Multiscalar Dash";
       const CARD_NAME = "Multiscalar Question";
 
-      before(() => {
-        restore();
-        signInAsAdmin();
-
+      beforeEach(() => {
         // Create muliscalar card
         cy.request("POST", "/api/card", {
           name: CARD_NAME,
@@ -131,11 +126,6 @@ describe("scenarios > visualizations > drillthroughs > dash_drill", () => {
     });
 
     describe("saved visualizations", () => {
-      beforeEach(() => {
-        restore();
-        signInAsAdmin();
-      });
-
       it.skip("should respect visualization type when entering a question from a dashboard (metabase#13415)", () => {
         const QUESTION_NAME = "13415";
 
@@ -159,7 +149,6 @@ describe("scenarios > visualizations > drillthroughs > dash_drill", () => {
             type: "query",
           },
           display: "table",
-          description: null,
           visualization_settings: {
             "table.pivot_column": "CATEGORY",
             "table.cell_column": "count",
-- 
GitLab