diff --git a/frontend/test/metabase/scenarios/setup/setup.cy.spec.js b/frontend/test/metabase/scenarios/setup/setup.cy.spec.js index 61b4489fb632aa99e8fa8d6a6548145a243eea66..fa938a3c359c07a46aa98019b20ee330d1ab89e0 100644 --- a/frontend/test/metabase/scenarios/setup/setup.cy.spec.js +++ b/frontend/test/metabase/scenarios/setup/setup.cy.spec.js @@ -1,143 +1,156 @@ import path from "path"; import { restore } from "__support__/cypress"; +// we're testing for one known (en) and one unknown (xx) locale +const locales = ["en", "xx"]; + describe("scenarios > setup", () => { - before(() => restore("blank")); - - it("should allow you to sign up", () => { - // intial redirection and welcome page - cy.visit("/"); - cy.url().should("be", "/setup"); - cy.findByText("Welcome to Metabase"); - cy.findByText("Let's get started").click(); - - // ======== - // Language - // ======== - - cy.findByText("What's your preferred language?"); - cy.findByText("English").click(); - cy.findByText("Next").click(); - - // ==== - // User - // ==== - - // "Next" should be disabled on the blank form - // NOTE: unclear why cy.findByText("Next", { selector: "button" }) doesn't work - // alternative: cy.contains("Next").should("be.disabled"); - cy.findByText("Next") - .closest("button") - .should("be.disabled"); - - cy.findByLabelText("First name").type("Testy"); - cy.findByLabelText("Last name").type("McTestface"); - cy.findByLabelText("Email").type("testy@metabase.com"); - cy.findByLabelText("Your company or team name").type("Epic Team"); - - // test first with a weak password - cy.findByLabelText("Create a password").type("password"); - cy.findByLabelText("Confirm your password").type("password"); - - // the form shouldn't be valid yet and we should display an error - cy.findByText("must include one number", { exact: false }); - cy.findByText("Next") - .closest("button") - .should("be.disabled"); - - // now try a strong password that doesn't match - const strongPassword = "QJbHYJN3tPW["; - cy.findByLabelText("Create a password") - .clear() - .type(strongPassword); - cy.findByLabelText("Confirm your password") - .clear() - .type(strongPassword + "foobar") - .blur(); - - // tell the user about the mismatch after clicking "Next" - cy.findByText("Next") - .closest("button") - .should("be.disabled"); - cy.findByText("passwords do not match", { exact: false }); - - // fix that mismatch - cy.findByLabelText("Confirm your password") - .clear() - .type(strongPassword); - - // Submit the first section - cy.findByText("Next").click(); - - // ======== - // Database - // ======== - - // The database step should be open - cy.findByText("You’ll need some info about your database", { - exact: false, + locales.forEach(locale => { + beforeEach(() => restore("blank")); + + it(`should allow you to sign up using "${locale}" browser locale`, () => { + // intial redirection and welcome page + cy.visit("/", { + // set the browser language as per: + // https://glebbahmutov.com/blog/cypress-tips-and-tricks/index.html#control-navigatorlanguage + onBeforeLoad(win) { + Object.defineProperty(win.navigator, "language", { + value: locale, + }); + }, + }); + cy.url().should("be", "/setup"); + cy.findByText("Welcome to Metabase"); + cy.findByText("Let's get started").click(); + + // ======== + // Language + // ======== + + cy.findByText("What's your preferred language?"); + cy.findByText("English").click(); + cy.findByText("Next").click(); + + // ==== + // User + // ==== + + // "Next" should be disabled on the blank form + // NOTE: unclear why cy.findByText("Next", { selector: "button" }) doesn't work + // alternative: cy.contains("Next").should("be.disabled"); + cy.findByText("Next") + .closest("button") + .should("be.disabled"); + + cy.findByLabelText("First name").type("Testy"); + cy.findByLabelText("Last name").type("McTestface"); + cy.findByLabelText("Email").type("testy@metabase.com"); + cy.findByLabelText("Your company or team name").type("Epic Team"); + + // test first with a weak password + cy.findByLabelText("Create a password").type("password"); + cy.findByLabelText("Confirm your password").type("password"); + + // the form shouldn't be valid yet and we should display an error + cy.findByText("must include one number", { exact: false }); + cy.findByText("Next") + .closest("button") + .should("be.disabled"); + + // now try a strong password that doesn't match + const strongPassword = "QJbHYJN3tPW["; + cy.findByLabelText("Create a password") + .clear() + .type(strongPassword); + cy.findByLabelText("Confirm your password") + .clear() + .type(strongPassword + "foobar") + .blur(); + + // tell the user about the mismatch after clicking "Next" + cy.findByText("Next") + .closest("button") + .should("be.disabled"); + cy.findByText("passwords do not match", { exact: false }); + + // fix that mismatch + cy.findByLabelText("Confirm your password") + .clear() + .type(strongPassword); + + // Submit the first section + cy.findByText("Next").click(); + + // ======== + // Database + // ======== + + // The database step should be open + cy.findByText("You’ll need some info about your database", { + exact: false, + }); + + // test that you can return to user settings if you want + cy.findByText("Hi, Testy. Nice to meet you!").click(); + cy.findByLabelText("Email").should("have.value", "testy@metabase.com"); + + // now back to database setting + cy.findByText("Next").click(); + + // add h2 database + cy.findByText("Select a database").click(); + cy.findByText("H2").click(); + cy.findByLabelText("Name").type("Metabase H2"); + cy.findByText("Next") + .closest("button") + .should("be.disabled"); + + const dbPath = path.resolve( + Cypress.config("fileServerFolder"), + "frontend/test/__runner__/empty.db", + ); + cy.findByLabelText("Connection String").type(`file:${dbPath}`); + cy.findByText("Next") + .closest("button") + .should("not.be.disabled") + .click(); + + // return to db settings and turn on manual scheduling + cy.findByText("Connecting to Metabase H2").click(); + cy.findByLabelText( + "This is a large database, so let me choose when Metabase syncs and scans", + ).click(); + cy.findByText("Next").click(); + + // now, we should see the sync scheduling form + cy.findByText("Scanning for Filter Values"); + cy.findByText("Never, I'll do this manually if I need to").click(); + cy.findByText("Next").click(); + + // ================ + // Data Preferences + // ================ + + // collection defaults to on and describes data collection + cy.findByText("All collection is completely anonymous."); + // turn collection off, which hides data collection description + cy.findByLabelText( + "Allow Metabase to anonymously collect usage events", + ).click(); + cy.findByText("All collection is completely anonymous.").should( + "not.exist", + ); + cy.findByText("Next").click(); + + // ================== + // Finish & Subscribe + // ================== + cy.findByText("You're all set up!"); + cy.findByText( + "Get infrequent emails about new releases and feature updates.", + ); + cy.findByText("Take me to Metabase").click(); + cy.url().should("be", "/"); }); - - // test that you can return to user settings if you want - cy.findByText("Hi, Testy. Nice to meet you!").click(); - cy.findByLabelText("Email").should("have.value", "testy@metabase.com"); - - // now back to database setting - cy.findByText("Next").click(); - - // add h2 database - cy.findByText("Select a database").click(); - cy.findByText("H2").click(); - cy.findByLabelText("Name").type("Metabase H2"); - cy.findByText("Next") - .closest("button") - .should("be.disabled"); - - const dbPath = path.resolve( - Cypress.config("fileServerFolder"), - "frontend/test/__runner__/empty.db", - ); - cy.findByLabelText("Connection String").type(`file:${dbPath}`); - cy.findByText("Next") - .closest("button") - .should("not.be.disabled") - .click(); - - // return to db settings and turn on manual scheduling - cy.findByText("Connecting to Metabase H2").click(); - cy.findByLabelText( - "This is a large database, so let me choose when Metabase syncs and scans", - ).click(); - cy.findByText("Next").click(); - - // now, we should see the sync scheduling form - cy.findByText("Scanning for Filter Values"); - cy.findByText("Never, I'll do this manually if I need to").click(); - cy.findByText("Next").click(); - - // ================ - // Data Preferences - // ================ - - // collection defaults to on and describes data collection - cy.findByText("All collection is completely anonymous."); - // turn collection off, which hides data collection description - cy.findByLabelText( - "Allow Metabase to anonymously collect usage events", - ).click(); - cy.findByText("All collection is completely anonymous.").should( - "not.exist", - ); - cy.findByText("Next").click(); - - // ================== - // Finish & Subscribe - // ================== - cy.findByText("You're all set up!"); - cy.findByText( - "Get infrequent emails about new releases and feature updates.", - ); - cy.findByText("Take me to Metabase").click(); - cy.url().should("be", "/"); }); });