From 57f3d52649ef489b49a0f5e230a7bf94a6d1dc47 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Wed, 4 Jan 2023 17:33:56 +0000 Subject: [PATCH 01/10] Fix type error in first user setup --- site/e2e/globalSetup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/e2e/globalSetup.ts b/site/e2e/globalSetup.ts index 0845d96ad..0aaddb859 100644 --- a/site/e2e/globalSetup.ts +++ b/site/e2e/globalSetup.ts @@ -6,9 +6,9 @@ const globalSetup = async (): Promise => { axios.defaults.baseURL = `http://localhost:${constants.basePort}` await createFirstUser({ email: constants.email, - organization: constants.organization, username: constants.username, password: constants.password, + trial: false }) } From 5975f1b663d8b1db8e656e1b0acbf8a65a0854a4 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Wed, 4 Jan 2023 20:49:39 +0000 Subject: [PATCH 02/10] Save auth state --- .gitignore | 1 + site/e2e/playwright.config.ts | 2 ++ site/e2e/tests/login.spec.ts | 3 +++ 3 files changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 40fd51d16..2bf54faa0 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ site/build-storybook.log site/coverage/ site/storybook-static/ site/test-results/ +site/e2e/storageState.json # Make target for updating golden files. cli/testdata/.gen-golden diff --git a/site/e2e/playwright.config.ts b/site/e2e/playwright.config.ts index 30d46b383..c5e23ec0a 100644 --- a/site/e2e/playwright.config.ts +++ b/site/e2e/playwright.config.ts @@ -15,6 +15,8 @@ const config: PlaywrightTestConfig = { use: { baseURL: `http://localhost:${basePort}`, video: "retain-on-failure", + // use stored login after first test + storageState: "e2e/storageState.json" }, // `webServer` tells Playwright to launch a test server - more details here: diff --git a/site/e2e/tests/login.spec.ts b/site/e2e/tests/login.spec.ts index 2b3d26670..221745cb1 100644 --- a/site/e2e/tests/login.spec.ts +++ b/site/e2e/tests/login.spec.ts @@ -9,5 +9,8 @@ test("Login takes user to /workspaces", async ({ baseURL, page }) => { const signInPage = new SignInPage(baseURL, page) await signInPage.submitBuiltInAuthentication(email, password) + // Save login state so we don't have to log in for other tests + await page.context().storageState({ path: 'e2e/storageState.json' }) + await page.waitForSelector("text=Workspaces") }) From 3040187b82c4cd3695d2e7307be476b7f442d63b Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Thu, 5 Jan 2023 21:32:41 +0000 Subject: [PATCH 03/10] Add template creation - wip Remove saved auth state because it wasn't working --- site/e2e/globalSetup.ts | 1 + site/e2e/helpers.ts | 19 +++++++++++++++++++ site/e2e/playwright.config.ts | 2 -- site/e2e/tests/basicFlow.spec.ts | 27 +++++++++++++++++++++++++++ site/e2e/tests/login.spec.ts | 16 ---------------- 5 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 site/e2e/helpers.ts create mode 100644 site/e2e/tests/basicFlow.spec.ts delete mode 100644 site/e2e/tests/login.spec.ts diff --git a/site/e2e/globalSetup.ts b/site/e2e/globalSetup.ts index 0aaddb859..ae1ae45a9 100644 --- a/site/e2e/globalSetup.ts +++ b/site/e2e/globalSetup.ts @@ -4,6 +4,7 @@ import * as constants from "./constants" const globalSetup = async (): Promise => { axios.defaults.baseURL = `http://localhost:${constants.basePort}` + // Create a user await createFirstUser({ email: constants.email, username: constants.username, diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts new file mode 100644 index 000000000..32a2948fd --- /dev/null +++ b/site/e2e/helpers.ts @@ -0,0 +1,19 @@ +import { Page } from "@playwright/test" + +export const urls = { + templates: "/templates", + starterTemplates: "/starter-templates", + dockerTemplate: "/starter-templates/docker", + createDockerTemplate: "/templates/new?exampleId=docker" +} + +export const buttons = { + starterTemplates: "Starter templates", + dockerTemplate: "Develop in Docker", + useTemplate: "Use template", + createTemplate: "Create template" +} + +export const clickButtonByText = async (page: Page, text: string): Promise => { + await page.click(`button:has-text("${text}")`) +} diff --git a/site/e2e/playwright.config.ts b/site/e2e/playwright.config.ts index c5e23ec0a..30d46b383 100644 --- a/site/e2e/playwright.config.ts +++ b/site/e2e/playwright.config.ts @@ -15,8 +15,6 @@ const config: PlaywrightTestConfig = { use: { baseURL: `http://localhost:${basePort}`, video: "retain-on-failure", - // use stored login after first test - storageState: "e2e/storageState.json" }, // `webServer` tells Playwright to launch a test server - more details here: diff --git a/site/e2e/tests/basicFlow.spec.ts b/site/e2e/tests/basicFlow.spec.ts new file mode 100644 index 000000000..6680d888f --- /dev/null +++ b/site/e2e/tests/basicFlow.spec.ts @@ -0,0 +1,27 @@ +import { test } from "@playwright/test" +import { email, password } from "../constants" +import { SignInPage } from "../pom" +import { clickButtonByText, buttons, urls } from "../helpers"; + +test("Basic flow", async ({ baseURL, page }) => { + await page.goto(baseURL + "/", { waitUntil: "networkidle" }) + + // Log-in with the default credentials we set up in the development server + const signInPage = new SignInPage(baseURL, page) + await signInPage.submitBuiltInAuthentication(email, password) + + await page.waitForSelector("text=Workspaces") + + // create Docker template + await page.goto(urls.templates); + await clickButtonByText(page, buttons.starterTemplates) + + await page.goto(urls.starterTemplates); + await clickButtonByText(page, buttons.dockerTemplate) + + await page.goto(urls.dockerTemplate); + await clickButtonByText(page, buttons.useTemplate) + + await page.goto(urls.createDockerTemplate); + await clickButtonByText(page, buttons.createTemplate) +}) diff --git a/site/e2e/tests/login.spec.ts b/site/e2e/tests/login.spec.ts deleted file mode 100644 index 221745cb1..000000000 --- a/site/e2e/tests/login.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { test } from "@playwright/test" -import { email, password } from "../constants" -import { SignInPage } from "../pom" - -test("Login takes user to /workspaces", async ({ baseURL, page }) => { - await page.goto(baseURL + "/", { waitUntil: "networkidle" }) - - // Log-in with the default credentials we set up in the development server - const signInPage = new SignInPage(baseURL, page) - await signInPage.submitBuiltInAuthentication(email, password) - - // Save login state so we don't have to log in for other tests - await page.context().storageState({ path: 'e2e/storageState.json' }) - - await page.waitForSelector("text=Workspaces") -}) From 095662721d9209234c134d7e559ecb8012337fc1 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Fri, 6 Jan 2023 15:56:56 +0000 Subject: [PATCH 04/10] Try adding the rest of the tests Can't see if they work yet, waiting on a release --- site/e2e/helpers.ts | 13 +++++++++---- site/e2e/tests/basicFlow.spec.ts | 18 ++++++++++++++---- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 32a2948fd..3cb8c650e 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -2,18 +2,23 @@ import { Page } from "@playwright/test" export const urls = { templates: "/templates", - starterTemplates: "/starter-templates", - dockerTemplate: "/starter-templates/docker", - createDockerTemplate: "/templates/new?exampleId=docker" } export const buttons = { starterTemplates: "Starter templates", dockerTemplate: "Develop in Docker", useTemplate: "Use template", - createTemplate: "Create template" + createTemplate: "Create template", + createWorkspace: "Create workspace", + submitCreateWorkspace: "Create workspace", + stopWorkspace: "Stop", + startWorkspace: "Start" } export const clickButtonByText = async (page: Page, text: string): Promise => { await page.click(`button:has-text("${text}")`) } + +export const fillInput = async (page: Page, label: string, value: string): Promise => { + await page.fill(`text=${label}`, value) +} diff --git a/site/e2e/tests/basicFlow.spec.ts b/site/e2e/tests/basicFlow.spec.ts index 6680d888f..e7f9712f0 100644 --- a/site/e2e/tests/basicFlow.spec.ts +++ b/site/e2e/tests/basicFlow.spec.ts @@ -1,7 +1,7 @@ import { test } from "@playwright/test" import { email, password } from "../constants" import { SignInPage } from "../pom" -import { clickButtonByText, buttons, urls } from "../helpers"; +import { clickButtonByText, buttons, urls, fillInput } from "../helpers"; test("Basic flow", async ({ baseURL, page }) => { await page.goto(baseURL + "/", { waitUntil: "networkidle" }) @@ -16,12 +16,22 @@ test("Basic flow", async ({ baseURL, page }) => { await page.goto(urls.templates); await clickButtonByText(page, buttons.starterTemplates) - await page.goto(urls.starterTemplates); await clickButtonByText(page, buttons.dockerTemplate) - await page.goto(urls.dockerTemplate); await clickButtonByText(page, buttons.useTemplate) - await page.goto(urls.createDockerTemplate); await clickButtonByText(page, buttons.createTemplate) + + // create workspace + await page.click('span:has-text("docker")') + await clickButtonByText(page, buttons.createWorkspace) + + await fillInput(page, "Workspace Name", "my-workspace") + await clickButtonByText(page, buttons.submitCreateWorkspace) + + // stop workspace + await clickButtonByText(page, buttons.stopWorkspace) + + // start workspace + await clickButtonByText(page, buttons.startWorkspace) }) From 79d5c50553219182382eef5b3eaada413e4c1ebe Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Mon, 9 Jan 2023 21:12:13 +0000 Subject: [PATCH 05/10] Update playwright --- site/package.json | 3 ++- site/yarn.lock | 25 ++++++++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/site/package.json b/site/package.json index 9339a751c..361c254c9 100644 --- a/site/package.json +++ b/site/package.json @@ -57,6 +57,7 @@ "i18next": "21.9.1", "js-untar": "2.0.0", "just-debounce-it": "3.1.1", + "playwright": "^1.29.2", "react": "18.2.0", "react-chartjs-2": "4.3.1", "react-color": "2.19.3", @@ -81,7 +82,7 @@ "yup": "0.32.11" }, "devDependencies": { - "@playwright/test": "1.26.1", + "@playwright/test": "1.29.2", "@storybook/addon-actions": "6.5.9", "@storybook/addon-essentials": "6.5.12", "@storybook/addon-links": "6.5.9", diff --git a/site/yarn.lock b/site/yarn.lock index 51cb6738d..bbcb7cfd4 100644 --- a/site/yarn.lock +++ b/site/yarn.lock @@ -1921,13 +1921,13 @@ tiny-glob "^0.2.9" tslib "^2.4.0" -"@playwright/test@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.26.1.tgz#73ada4e70f618bca69ba7509c4ba65b5a41c4b10" - integrity sha512-bNxyZASVt2adSZ9gbD7NCydzcb5JaI0OR9hc7s+nmPeH604gwp0zp17NNpwXY4c8nvuBGQQ9oGDx72LE+cUWvw== +"@playwright/test@1.29.2": + version "1.29.2" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.29.2.tgz#c48184721d0f0b7627a886e2ec42f1efb2be339d" + integrity sha512-+3/GPwOgcoF0xLz/opTnahel1/y42PdcgZ4hs+BZGIUjtmEFSXGg+nFoaH3NSmuc7a6GSFwXDJ5L7VXpqzigNg== dependencies: "@types/node" "*" - playwright-core "1.26.1" + playwright-core "1.29.2" "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": version "0.5.9" @@ -11326,10 +11326,17 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" -playwright-core@1.26.1: - version "1.26.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.26.1.tgz#a162f476488312dcf12638d97685144de6ada512" - integrity sha512-hzFchhhxnEiPc4qVPs9q2ZR+5eKNifY2hQDHtg1HnTTUuphYCBP8ZRb2si+B1TR7BHirgXaPi48LIye5SgrLAA== +playwright-core@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.29.2.tgz#2e8347e7e8522409f22b244e600e703b64022406" + integrity sha512-94QXm4PMgFoHAhlCuoWyaBYKb92yOcGVHdQLoxQ7Wjlc7Flg4aC/jbFW7xMR52OfXMVkWicue4WXE7QEegbIRA== + +playwright@^1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.29.2.tgz#d6a0a3e8e44f023f7956ed19ffa8af915a042769" + integrity sha512-hKBYJUtdmYzcjdhYDkP9WGtORwwZBBKAW8+Lz7sr0ZMxtJr04ASXVzH5eBWtDkdb0c3LLFsehfPBTRfvlfKJOA== + dependencies: + playwright-core "1.29.2" pluralize@^8.0.0: version "8.0.0" From 1c54e0d2dc8dd5a42d8f4c9ffe82ffc00b93bd07 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Mon, 9 Jan 2023 21:12:19 +0000 Subject: [PATCH 06/10] Update gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2bf54faa0..5580ff0a6 100644 --- a/.gitignore +++ b/.gitignore @@ -23,8 +23,10 @@ site/**/*.typegen.ts site/build-storybook.log site/coverage/ site/storybook-static/ -site/test-results/ +site/test-results/* +site/e2e/test-results/* site/e2e/storageState.json +site/playwright-report/* # Make target for updating golden files. cli/testdata/.gen-golden From 0a4605709e310396f38015f63d8e798242b31310 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Mon, 9 Jan 2023 21:12:32 +0000 Subject: [PATCH 07/10] Write tests --- site/e2e/helpers.ts | 8 ++------ site/e2e/tests/basicFlow.spec.ts | 28 +++++++++++++++------------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 3cb8c650e..8cd8f653f 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -1,9 +1,5 @@ import { Page } from "@playwright/test" -export const urls = { - templates: "/templates", -} - export const buttons = { starterTemplates: "Starter templates", dockerTemplate: "Develop in Docker", @@ -15,8 +11,8 @@ export const buttons = { startWorkspace: "Start" } -export const clickButtonByText = async (page: Page, text: string): Promise => { - await page.click(`button:has-text("${text}")`) +export const clickButton = async (page: Page, name: string): Promise => { + await page.getByRole("button", { name, exact: true }).click() } export const fillInput = async (page: Page, label: string, value: string): Promise => { diff --git a/site/e2e/tests/basicFlow.spec.ts b/site/e2e/tests/basicFlow.spec.ts index e7f9712f0..5d8d60fb6 100644 --- a/site/e2e/tests/basicFlow.spec.ts +++ b/site/e2e/tests/basicFlow.spec.ts @@ -1,37 +1,39 @@ import { test } from "@playwright/test" import { email, password } from "../constants" import { SignInPage } from "../pom" -import { clickButtonByText, buttons, urls, fillInput } from "../helpers"; +import { clickButton, buttons, fillInput } from "../helpers"; test("Basic flow", async ({ baseURL, page }) => { + test.slow() await page.goto(baseURL + "/", { waitUntil: "networkidle" }) // Log-in with the default credentials we set up in the development server const signInPage = new SignInPage(baseURL, page) await signInPage.submitBuiltInAuthentication(email, password) - await page.waitForSelector("text=Workspaces") - // create Docker template - await page.goto(urls.templates); - await clickButtonByText(page, buttons.starterTemplates) + await page.waitForSelector("text=Templates") + await page.click("text=Templates") + + await clickButton(page, buttons.starterTemplates) - await clickButtonByText(page, buttons.dockerTemplate) + await page.click(`text=${buttons.dockerTemplate}`) - await clickButtonByText(page, buttons.useTemplate) + await clickButton(page, buttons.useTemplate) - await clickButtonByText(page, buttons.createTemplate) + await clickButton(page, buttons.createTemplate) // create workspace - await page.click('span:has-text("docker")') - await clickButtonByText(page, buttons.createWorkspace) + await clickButton(page, buttons.createWorkspace) await fillInput(page, "Workspace Name", "my-workspace") - await clickButtonByText(page, buttons.submitCreateWorkspace) + await clickButton(page, buttons.submitCreateWorkspace) // stop workspace - await clickButtonByText(page, buttons.stopWorkspace) + await page.waitForSelector("text=Started") + await clickButton(page, buttons.stopWorkspace) // start workspace - await clickButtonByText(page, buttons.startWorkspace) + await page.waitForSelector("text=Stopped") + await clickButton(page, buttons.startWorkspace) }) From a6497664f95a5e34882aaf95f1fa9e4725d5edf0 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Mon, 9 Jan 2023 21:24:21 +0000 Subject: [PATCH 08/10] Format --- site/e2e/globalSetup.ts | 2 +- site/e2e/helpers.ts | 8 ++++++-- site/e2e/tests/basicFlow.spec.ts | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/site/e2e/globalSetup.ts b/site/e2e/globalSetup.ts index ae1ae45a9..a396acbff 100644 --- a/site/e2e/globalSetup.ts +++ b/site/e2e/globalSetup.ts @@ -9,7 +9,7 @@ const globalSetup = async (): Promise => { email: constants.email, username: constants.username, password: constants.password, - trial: false + trial: false, }) } diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 8cd8f653f..fa37dc999 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -8,13 +8,17 @@ export const buttons = { createWorkspace: "Create workspace", submitCreateWorkspace: "Create workspace", stopWorkspace: "Stop", - startWorkspace: "Start" + startWorkspace: "Start", } export const clickButton = async (page: Page, name: string): Promise => { await page.getByRole("button", { name, exact: true }).click() } -export const fillInput = async (page: Page, label: string, value: string): Promise => { +export const fillInput = async ( + page: Page, + label: string, + value: string, +): Promise => { await page.fill(`text=${label}`, value) } diff --git a/site/e2e/tests/basicFlow.spec.ts b/site/e2e/tests/basicFlow.spec.ts index 5d8d60fb6..5af21ead9 100644 --- a/site/e2e/tests/basicFlow.spec.ts +++ b/site/e2e/tests/basicFlow.spec.ts @@ -1,7 +1,7 @@ import { test } from "@playwright/test" import { email, password } from "../constants" import { SignInPage } from "../pom" -import { clickButton, buttons, fillInput } from "../helpers"; +import { clickButton, buttons, fillInput } from "../helpers" test("Basic flow", async ({ baseURL, page }) => { test.slow() From 279bb5112c4d97893f27c6043965ac499add012e Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Mon, 9 Jan 2023 21:50:01 +0000 Subject: [PATCH 09/10] Update ignores --- .prettierignore | 5 ++++- site/.eslintignore | 5 ++++- site/.prettierignore | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.prettierignore b/.prettierignore index 59afc5922..8d8a89216 100644 --- a/.prettierignore +++ b/.prettierignore @@ -26,7 +26,10 @@ site/**/*.typegen.ts site/build-storybook.log site/coverage/ site/storybook-static/ -site/test-results/ +site/test-results/* +site/e2e/test-results/* +site/e2e/storageState.json +site/playwright-report/* # Make target for updating golden files. cli/testdata/.gen-golden diff --git a/site/.eslintignore b/site/.eslintignore index f76cd1a6d..e5f5eba85 100644 --- a/site/.eslintignore +++ b/site/.eslintignore @@ -26,7 +26,10 @@ yarn-error.log build-storybook.log coverage/ storybook-static/ -test-results/ +test-results/* +e2e/test-results/* +e2e/storageState.json +playwright-report/* # Make target for updating golden files. ../cli/testdata/.gen-golden diff --git a/site/.prettierignore b/site/.prettierignore index f76cd1a6d..e5f5eba85 100644 --- a/site/.prettierignore +++ b/site/.prettierignore @@ -26,7 +26,10 @@ yarn-error.log build-storybook.log coverage/ storybook-static/ -test-results/ +test-results/* +e2e/test-results/* +e2e/storageState.json +playwright-report/* # Make target for updating golden files. ../cli/testdata/.gen-golden From 443fbc5f770b09475be6e14586060dc19c904467 Mon Sep 17 00:00:00 2001 From: Presley Pizzo <1290996+presleyp@users.noreply.github.com> Date: Tue, 10 Jan 2023 10:49:18 -0500 Subject: [PATCH 10/10] Check that start worked Co-authored-by: Ben Potter --- site/e2e/tests/basicFlow.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/site/e2e/tests/basicFlow.spec.ts b/site/e2e/tests/basicFlow.spec.ts index 5af21ead9..6d506af8b 100644 --- a/site/e2e/tests/basicFlow.spec.ts +++ b/site/e2e/tests/basicFlow.spec.ts @@ -36,4 +36,5 @@ test("Basic flow", async ({ baseURL, page }) => { // start workspace await page.waitForSelector("text=Stopped") await clickButton(page, buttons.startWorkspace) + await page.waitForSelector("text=Started") })