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 69ef7020c0d3447d48b9a3b7c52177149048f89d..a6cc9408501db8e74554d3c8e8d8364baebdf47b 100644 --- a/frontend/test/metabase/scenarios/admin/datamodel/metrics.cy.spec.js +++ b/frontend/test/metabase/scenarios/admin/datamodel/metrics.cy.spec.js @@ -168,4 +168,57 @@ describe("scenarios > admin > datamodel > metrics", () => { .click(); }); }); + + describe("custom metrics", () => { + it("should save the metric using custom expressions (metabase#13022)", () => { + cy.visit("/admin/datamodel/metrics"); + cy.findByText("New metric").click(); + + cy.log("**Create new metric based on Custom Expression**"); + cy.findByText("Select a table").click(); + popover().within(() => { + cy.findByText("Sample Dataset"); + cy.findByText("Orders").click(); + }); + // "Count" is selected by defauult + cy.get(".QueryOption") + .contains("Count") + .click(); + // Override it with "Custom Expression" + popover().within(() => { + cy.findByText("Custom Expression").click(); + cy.get("[contenteditable='true']") + .click() + .clear() + .type("Sum([Discount] * [Quantity])", { delay: 100 }); + cy.findByPlaceholderText("Name (required)") + .click() + .type("CE", { delay: 100 }); + cy.findByText("Done").click(); + }); + + const metricName = "Test CE Metric"; + // Give it a name + cy.findByPlaceholderText("Something descriptive but not too long").type( + metricName, + ); + // and description + cy.findByPlaceholderText( + "This is a good place to be more specific about less obvious metric rules", + ).type("Description"); + // Save the custom metric + cy.findByText("Save changes") + .should("not.be.disabled") + .click(); + + cy.log("**Refresh the page and assert**"); + cy.reload(); + cy.url().should("be", "/admin/datamodel/metrics"); + cy.findByText( + 'Unexpected input given to normalize. Expected type to be "object", found "string".', + ).should("not.exist"); + + cy.findByText(metricName); + }); + }); });