diff --git a/frontend/test/metabase/scenarios/collections/collection-pinned-overview.cy.spec.js b/frontend/test/metabase/scenarios/collections/collection-pinned-overview.cy.spec.js index 98bffdfd33d2048df628fe68853c36468dc43cb4..82fc0b5b0a9ec1ff078f2332f2c9f9616d3d3b75 100644 --- a/frontend/test/metabase/scenarios/collections/collection-pinned-overview.cy.spec.js +++ b/frontend/test/metabase/scenarios/collections/collection-pinned-overview.cy.spec.js @@ -1,133 +1,132 @@ import { popover, restore } from "__support__/e2e/cypress"; -const DASHBOARD_ITEM_NAME = "Orders in a dashboard"; -const CARD_ITEM_NAME = "Orders, Count"; -const MODE_ITEM_NAME = "Orders"; +const DASHBOARD_NAME = "Orders in a dashboard"; +const QUESTION_NAME = "Orders, Count"; +const MODEL_NAME = "Orders"; describe("scenarios > collection pinned items overview", () => { beforeEach(() => { restore(); cy.signInAsAdmin(); - cy.intercept("POST", `/api/card/*/query`).as("cardQuery"); - cy.intercept( - "GET", - "/api/collection/root/items?pinned_state=is_pinned*", - ).as("pinnedItemsGET"); + cy.intercept("POST", `/api/card/*/query`).as("getCardQuery"); + cy.intercept("GET", "/api/collection/*/items?pinned_state=is_pinned*").as( + "getPinnedItems", + ); }); - it("should let the user pin items", () => { - // Turn question 1 into a model - cy.request("PUT", "/api/card/1", { dataset: true }); - - cy.visit("/collection/root"); - cy.wait("@pinnedItemsGET"); + it("should be able to pin a dashboard", () => { + openRootCollection(); + openUnpinnedItemMenu(DASHBOARD_NAME); + popover().within(() => cy.findByText("Pin this").click()); + cy.wait("@getPinnedItems"); - // pin a dashboard - pinItem(DASHBOARD_ITEM_NAME); - cy.wait("@pinnedItemsGET"); - - // ensure the dashboard card is showing in the pinned section - cy.findByTestId("pinned-items").within(() => { - cy.icon("dashboard"); - cy.findByText("A dashboard"); - // click on the card to navigate to the dashboard - cy.findByText(DASHBOARD_ITEM_NAME).click(); + getPinnedSection().within(() => { + cy.icon("dashboard").should("be.visible"); + cy.findByText("A dashboard").should("be.visible"); + cy.findByText(DASHBOARD_NAME).click(); cy.url().should("include", "/dashboard/1"); }); + }); - cy.visit("/collection/root"); - cy.wait("@pinnedItemsGET"); - - // pin a card - pinItem(CARD_ITEM_NAME); - cy.wait(["@pinnedItemsGET", "@cardQuery"]); + it("should be able to pin a question", () => { + openRootCollection(); + openUnpinnedItemMenu(QUESTION_NAME); + popover().within(() => cy.findByText("Pin this").click()); + cy.wait(["@getPinnedItems", "@getCardQuery"]); - // ensure the card visualization is showing in the pinned section - cy.findByTestId("pinned-items").within(() => { - cy.findByText("18,760"); - cy.findByText(CARD_ITEM_NAME).click(); + getPinnedSection().within(() => { + cy.findByText("18,760").should("be.visible"); + cy.findByText(QUESTION_NAME).click(); cy.url().should("include", "/question/2"); }); + }); + + it("should be able to pin a model", () => { + cy.request("PUT", "/api/card/1", { dataset: true }); - cy.visit("/collection/root"); - cy.wait(["@pinnedItemsGET", "@cardQuery"]); + openRootCollection(); + openUnpinnedItemMenu(MODEL_NAME); + popover().within(() => cy.findByText("Pin this").click()); + cy.wait("@getPinnedItems"); - // pin a model - pinItem(MODE_ITEM_NAME); - cy.wait("@pinnedItemsGET"); - // ensure the model card is showing in the pinned section - cy.findByTestId("pinned-items").within(() => { - cy.findByText(MODE_ITEM_NAME); - cy.icon("model"); + getPinnedSection().within(() => { + cy.icon("model").should("be.visible"); + cy.findByText(MODEL_NAME).should("be.visible"); cy.findByText("A model").click(); cy.url().should("include", "/model/1"); }); }); - describe("pinned item actions", () => { - beforeEach(() => { - // pin a dashboard using the API - cy.request("PUT", "/api/dashboard/1", { - collection_position: 1, - }); - - cy.visit("/collection/root"); - cy.wait("@pinnedItemsGET"); - - // open the action menu - cy.findByTestId("pinned-items").within(() => { - cy.icon("dashboard"); - // the menu icon is hidden until the user hovers their mouse over the card - cy.icon("ellipsis").click({ force: true }); - }); - }); + it("should be able to unpin a pinned dashboard", () => { + cy.request("PUT", "/api/dashboard/1", { collection_position: 1 }); - it("should be able to unpin a pinned item", () => { - popover().within(() => { - cy.findByText("Unpin").click(); - }); + openRootCollection(); + openPinnedItemMenu(DASHBOARD_NAME); + popover().within(() => cy.findByText("Unpin").click()); + cy.wait("@getPinnedItems"); - // verify that the item is no longer in the pinned section - cy.wait("@pinnedItemsGET"); - cy.findByTestId("pinned-items").should("not.exist"); - }); + getPinnedSection().should("not.exist"); + }); - it("should be able to move a pinned item", () => { - popover().within(() => { - cy.findByText("Move").click(); - }); + it("should be able to move a pinned dashboard", () => { + cy.request("PUT", "/api/dashboard/1", { collection_position: 1 }); - // verify that the move modal is showing - cy.findByText(`Move "${DASHBOARD_ITEM_NAME}"?`); - }); + openRootCollection(); + openPinnedItemMenu(DASHBOARD_NAME); + popover().within(() => cy.findByText("Move").click()); - it("should be able to duplicate a pinned item", () => { - popover().within(() => { - cy.findByText("Duplicate").click(); - }); + cy.findByText(`Move "${DASHBOARD_NAME}"?`).should("be.visible"); + }); - // verify that the duplicate modal is showing - cy.findByText(`Duplicate "${DASHBOARD_ITEM_NAME}"`); - }); + it("should be able to duplicate a pinned dashboard", () => { + cy.request("PUT", "/api/dashboard/1", { collection_position: 1 }); - it("should be able to archive a pinned item", () => { - popover().within(() => { - cy.findByText("Archive").click(); - }); + openRootCollection(); + openPinnedItemMenu(DASHBOARD_NAME); + popover().within(() => cy.findByText("Duplicate").click()); - // verify that the item is no longer on the page - cy.wait("@pinnedItemsGET"); - cy.findByTestId("pinned-items").should("not.exist"); - cy.findByText(DASHBOARD_ITEM_NAME).should("not.exist"); - }); + cy.findByText(`Duplicate "${DASHBOARD_NAME}"`).should("be.visible"); + }); + + it("should be able to archive a pinned dashboard", () => { + cy.request("PUT", "/api/dashboard/1", { collection_position: 1 }); + + openRootCollection(); + openPinnedItemMenu(DASHBOARD_NAME); + popover().within(() => cy.findByText("Archive").click()); + cy.wait("@getPinnedItems"); + + getPinnedSection().should("not.exist"); + cy.findByText(DASHBOARD_NAME).should("not.exist"); }); }); -const pinItem = name => { - cy.findByText(name) - .closest("tr") - .within(() => cy.icon("ellipsis").click()); +const getPinnedSection = () => { + return cy.findByTestId("pinned-items"); +}; + +const getUnpinnedSection = () => { + return cy.findByRole("table"); +}; + +const openRootCollection = () => { + cy.visit("/collection/root"); + cy.wait("@getPinnedItems"); +}; - popover().within(() => cy.icon("pin").click()); +const openPinnedItemMenu = name => { + getPinnedSection().within(() => { + cy.findByText(name) + .closest("a") + .within(() => cy.icon("ellipsis").click({ force: true })); + }); +}; + +const openUnpinnedItemMenu = name => { + getUnpinnedSection().within(() => { + cy.findByText(name) + .closest("tr") + .within(() => cy.icon("ellipsis").click()); + }); };