From 6c287cba46bfe4b880c8543421b19f4ea1e69304 Mon Sep 17 00:00:00 2001 From: thiloho <123883702+thiloho@users.noreply.github.com> Date: Sat, 31 Aug 2024 18:27:25 +0200 Subject: [PATCH] Add additional end to end tests --- web-app/playwright.config.ts | 5 +- web-app/tests/account.spec.ts | 63 ++---- .../sample-files/archtika-logo-512x512.png | Bin 0 -> 7568 bytes web-app/tests/website.spec.ts | 205 ++++++++++++++++++ 4 files changed, 233 insertions(+), 40 deletions(-) create mode 100644 web-app/tests/sample-files/archtika-logo-512x512.png create mode 100644 web-app/tests/website.spec.ts diff --git a/web-app/playwright.config.ts b/web-app/playwright.config.ts index 5b9ccdb..1ff761a 100644 --- a/web-app/playwright.config.ts +++ b/web-app/playwright.config.ts @@ -3,7 +3,10 @@ import { type PlaywrightTestConfig } from "@playwright/test"; const config: PlaywrightTestConfig = { webServer: { command: "npm run build && npm run preview", - port: 4173 + url: "http://localhost:4173" + }, + use: { + baseURL: "http://localhost:4173" }, testDir: "tests", testMatch: /(.+\.)?(test|spec)\.ts/ diff --git a/web-app/tests/account.spec.ts b/web-app/tests/account.spec.ts index 34a0cb9..32f0474 100644 --- a/web-app/tests/account.spec.ts +++ b/web-app/tests/account.spec.ts @@ -1,68 +1,53 @@ -import { test, expect } from "@playwright/test"; +import { test as base, expect, type Page } from "@playwright/test"; +import { randomBytes } from "node:crypto"; + +const username = randomBytes(8).toString("hex"); +const password = "T3stuser??!!"; + +const test = base.extend<{ authenticatedPage: Page }>({ + authenticatedPage: async ({ page }, use) => { + await page.goto("/login"); + await page.getByLabel("Username:").fill(username); + await page.getByLabel("Password:").fill(password); + await page.getByRole("button", { name: "Submit" }).click(); + await use(page); + } +}); test("Register", async ({ page }) => { - await page.goto("/"); - await page.getByRole("link", { name: "Register" }).click(); + await page.goto("/register"); await page.getByLabel("Username:").click(); - await page.getByLabel("Username:").fill("archtika-test"); + await page.getByLabel("Username:").fill(username); await page.getByLabel("Password:").click(); - await page.getByLabel("Password:").fill("T3stuser??!!"); + await page.getByLabel("Password:").fill(password); await page.getByRole("button", { name: "Submit" }).click(); await expect(page.getByText("Successfully registered, you")).toBeVisible(); }); test("Login", async ({ page }) => { - await page.goto("/"); - await page.getByRole("link", { name: "Login" }).click(); + await page.goto("/login"); await page.getByLabel("Username:").click(); - await page.getByLabel("Username:").fill("archtika-test"); + await page.getByLabel("Username:").fill(username); await page.getByLabel("Password:").click(); - await page.getByLabel("Password:").fill("T3stuser??!!"); + await page.getByLabel("Password:").fill(password); await page.getByRole("button", { name: "Submit" }).click(); await expect(page.getByRole("heading", { name: "Dashboard" })).toBeVisible(); }); -test("Logout", async ({ page }) => { - await page.goto("/"); - await page.getByRole("link", { name: "Login" }).click(); - await page.getByLabel("Username:").click(); - await page.getByLabel("Username:").fill("archtika-test"); - await page.getByLabel("Password:").click(); - await page.getByLabel("Password:").fill("T3stuser??!!"); - await page.getByRole("button", { name: "Submit" }).click(); - await expect(page.getByRole("heading", { name: "Dashboard" })).toBeVisible(); +test("Logout", async ({ authenticatedPage: page }) => { await page.getByRole("link", { name: "Account" }).click(); await page.getByRole("button", { name: "Logout" }).click(); await expect(page.getByRole("heading", { name: "Login" })).toBeVisible(); }); -test("Delete account", async ({ page }) => { - await page.goto("/"); - await page.getByRole("link", { name: "Login" }).click(); - await page.getByLabel("Username:").click(); - await page.getByLabel("Username:").fill("archtika-test"); - await page.getByLabel("Password:").click(); - await page.getByLabel("Password:").fill("T3stuser??!!"); - await page.getByRole("button", { name: "Submit" }).click(); - await expect(page.getByRole("heading", { name: "Dashboard" })).toBeVisible(); +test("Delete account", async ({ authenticatedPage: page }) => { await page.getByRole("link", { name: "Account" }).click(); await page.getByRole("button", { name: "Delete account" }).click(); await page.getByLabel("Password:").click(); - await page.getByLabel("Password:").fill("T3stuser??!!"); + await page.getByLabel("Password:").fill(password); await page .locator("#delete-account-modal") .getByRole("button", { name: "Delete account" }) .click(); await expect(page.getByRole("heading", { name: "Login" })).toBeVisible(); }); - -test("Register after account deletion", async ({ page }) => { - await page.goto("/"); - await page.getByRole("link", { name: "Register" }).click(); - await page.getByLabel("Username:").click(); - await page.getByLabel("Username:").fill("archtika-test"); - await page.getByLabel("Password:").click(); - await page.getByLabel("Password:").fill("T3stuser??!!"); - await page.getByRole("button", { name: "Submit" }).click(); - await expect(page.getByText("Successfully registered, you")).toBeVisible(); -}); diff --git a/web-app/tests/sample-files/archtika-logo-512x512.png b/web-app/tests/sample-files/archtika-logo-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..5684dab1e1584aa9d4d0f4d01c4b5cbddb6811d8 GIT binary patch literal 7568 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 Zb2B~WlasOE#lXP8;OXk;vd$@?2>@F2GUNaN literal 0 HcmV?d00001 diff --git a/web-app/tests/website.spec.ts b/web-app/tests/website.spec.ts new file mode 100644 index 0000000..db23d80 --- /dev/null +++ b/web-app/tests/website.spec.ts @@ -0,0 +1,205 @@ +import { test as base, expect, type Page } from "@playwright/test"; +import { fileURLToPath } from "node:url"; +import { dirname, join } from "node:path"; +import { randomBytes } from "node:crypto"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const username = randomBytes(8).toString("hex"); +const collabUsername = randomBytes(8).toString("hex"); +const password = "T3stuser??!!"; + +const test = base.extend<{ authenticatedPage: Page }>({ + authenticatedPage: async ({ page }, use) => { + await page.goto("/login"); + await page.getByLabel("Username:").fill(username); + await page.getByLabel("Password:").fill(password); + await page.getByRole("button", { name: "Submit" }).click(); + await use(page); + } +}); + +test("Register", async ({ page }) => { + await page.goto("/register"); + + await page.getByLabel("Username:").click(); + await page.getByLabel("Username:").fill(username); + await page.getByLabel("Password:").click(); + await page.getByLabel("Password:").fill(password); + await page.getByRole("button", { name: "Submit" }).click(); + + await page.getByLabel("Username:").click(); + await page.getByLabel("Username:").fill(collabUsername); + await page.getByLabel("Password:").click(); + await page.getByLabel("Password:").fill(password); + await page.getByRole("button", { name: "Submit" }).click(); +}); + +test("Create websites", async ({ authenticatedPage: page }) => { + await page.getByRole("button", { name: "Create website" }).click(); + await page.getByLabel("Title:").click(); + await page.getByLabel("Title:").fill("Blog"); + await page.getByRole("button", { name: "Submit" }).click(); + await expect(page.getByRole("link", { name: "All websites" })).toBeVisible(); + await expect(page.getByText("Search & Sort & Filter")).toBeVisible(); + await expect(page.getByText("Blog Type: Blog Created at:")).toBeVisible(); + + await page.getByRole("button", { name: "Create website" }).click(); + await page.getByLabel("Type: BlogDocs").selectOption("Docs"); + await page.getByLabel("Title:").click(); + await page.getByLabel("Title:").fill("Documentation"); + await page.getByRole("button", { name: "Submit" }).click(); + await expect(page.getByRole("link", { name: "All websites" })).toBeVisible(); + await expect(page.getByText("Search & Sort & Filter")).toBeVisible(); + await expect(page.getByText("Documentation Type: Docs")).toBeVisible(); +}); + +test.describe("Update website", () => { + test("Update websites", async ({ authenticatedPage: page }) => { + await page.getByRole("button", { name: "Update" }).nth(1).click(); + await page.getByRole("textbox", { name: "Title" }).click(); + await page.getByRole("textbox", { name: "Title" }).fill("Blog updated"); + await page.getByRole("button", { name: "Submit" }).click(); + await expect(page.getByRole("link", { name: "Blog updated" })).toBeVisible(); + + await page.getByRole("button", { name: "Update" }).first().click(); + await page.getByRole("textbox", { name: "Title" }).click(); + await page.getByRole("textbox", { name: "Title" }).fill("Documentation updated"); + await page.getByRole("button", { name: "Submit" }).click(); + await expect(page.getByRole("link", { name: "Documentation updated" })).toBeVisible(); + }); + + test.describe("Update settings", () => { + test("Global", async ({ authenticatedPage: page }) => { + await page.getByRole("link", { name: "Blog" }).click(); + await page.getByLabel("Light accent color:").click(); + await page.getByLabel("Light accent color:").fill("#3975a2"); + await page.getByLabel("Dark accent color:").click(); + await page.getByLabel("Dark accent color:").fill("#41473e"); + await page.locator("#global").getByRole("button", { name: "Submit" }).click(); + await expect(page.getByText("Successfully updated global")).toBeVisible(); + await page.getByLabel("Favicon:").click(); + await page + .getByLabel("Favicon:") + .setInputFiles(join(__dirname, "sample-files", "archtika-logo-512x512.png")); + await page.locator("#global").getByRole("button", { name: "Submit" }).click(); + await expect(page.getByText("Successfully updated global")).toBeVisible(); + }); + + test("Header", async ({ authenticatedPage: page }) => { + await page.getByRole("link", { name: "Blog" }).click(); + await page.getByLabel("Logo text:").click(); + await page.getByLabel("Logo text:").fill("archtika Blog updated"); + await page.locator("#header").getByRole("button", { name: "Submit" }).click(); + await expect(page.getByText("Successfully updated header")).toBeVisible(); + await page.getByLabel("Logo type: TextImage").selectOption("image"); + await page.getByLabel("Logo image:").click(); + await page + .getByLabel("Logo image:") + .setInputFiles(join(__dirname, "sample-files", "archtika-logo-512x512.png")); + await page.locator("#header").getByRole("button", { name: "Submit" }).click(); + await expect(page.getByText("Successfully updated header")).toBeVisible(); + }); + + test("Home", async ({ authenticatedPage: page }) => { + await page.getByRole("link", { name: "Blog" }).click(); + await page.getByLabel("Main content:").click(); + await page.getByLabel("Main content:").press("Control+a"); + await page.getByLabel("Main content:").fill("## Some new content comes here"); + await expect(page.getByRole("link", { name: "Some new content comes here" })).toBeVisible(); + await page.locator("#home").getByRole("button", { name: "Submit" }).click(); + await expect(page.getByText("Successfully updated home")).toBeVisible(); + }); + + test("Footer", async ({ authenticatedPage: page }) => { + await page.getByRole("link", { name: "Blog" }).click(); + await page.getByLabel("Additional text:").click(); + await page + .getByLabel("Additional text:") + .fill( + "archtika is a free, open, modern, performant and lightweight CMS updated content comes here" + ); + await page.locator("#footer").getByRole("button", { name: "Submit" }).click(); + await expect(page.getByText("Successfully updated footer")).toBeVisible(); + }); + }); + + test.describe("Articles", () => { + test("Create article", async ({ authenticatedPage: page }) => { + await page.getByRole("link", { name: "Blog" }).click(); + await page.getByRole("link", { name: "Articles" }).click(); + await page.getByRole("button", { name: "Create article" }).click(); + await page.getByLabel("Title:").click(); + await page.getByLabel("Title:").fill("Test article"); + await page.getByRole("button", { name: "Submit" }).click(); + await expect(page.getByRole("link", { name: "All articles" })).toBeVisible(); + await expect(page.getByText("Search & Filter")).toBeVisible(); + await expect(page.getByText("Test article Edit Delete")).toBeVisible(); + }); + + test("Update article", async ({ authenticatedPage: page }) => { + await page.getByRole("link", { name: "Blog" }).click(); + await page.getByRole("link", { name: "Articles" }).click(); + await page.getByRole("link", { name: "Edit" }).click(); + await page.getByLabel("Description:").click(); + await page.getByLabel("Description:").fill("Sample article description"); + await page.getByLabel("Author:").click(); + await page.getByLabel("Author:").fill("John Doe"); + await page.getByLabel("Main content:").click(); + await page + .getByLabel("Main content:") + .fill( + "## Section\n\n### Subsection\n\n## Second section\n\n### Second subsection\n\n#### Sub Sub section" + ); + await expect( + page.getByText("Table of contents SectionSubsectionSecond sectionSecond subsectionSub Sub") + ).toBeVisible(); + await expect( + page.getByRole("heading", { name: "Section", exact: true }).getByRole("link") + ).toBeVisible(); + await page.getByRole("button", { name: "Submit" }).click(); + await expect(page.getByText("Successfully updated article")).toBeVisible(); + }); + + test("Delete article", async ({ authenticatedPage: page }) => { + await page.getByRole("link", { name: "Blog" }).click(); + await page.getByRole("link", { name: "Articles" }).click(); + await page.getByRole("button", { name: "Delete" }).click(); + await page.getByRole("button", { name: "Delete article" }).click(); + await expect(page.getByText("Successfully deleted article")).toBeVisible(); + }); + }); + + test.describe("Collaborators", () => { + test("Add collaborator", async ({ authenticatedPage: page }) => {}); + + test("Update collaborator", async ({ authenticatedPage: page }) => {}); + + test("Delete collaborator", async ({ authenticatedPage: page }) => {}); + }); +}); + +test("Delete websites", async ({ authenticatedPage: page }) => { + await page.getByRole("button", { name: "Delete" }).nth(1).click(); + await page.getByRole("button", { name: "Delete website" }).click(); + await expect(page.getByText("Successfully deleted website")).toBeVisible(); + + await page.getByRole("button", { name: "Delete" }).click(); + await page.getByRole("button", { name: "Delete website" }).click(); + await expect(page.getByText("Successfully deleted website")).toBeVisible(); + + await expect(page.getByRole("link", { name: "All websites" })).toBeHidden(); +}); + +test("Delete account", async ({ authenticatedPage: page }) => { + await page.getByRole("link", { name: "Account" }).click(); + await page.getByRole("button", { name: "Delete account" }).click(); + await page.getByLabel("Password:").click(); + await page.getByLabel("Password:").fill(password); + await page + .locator("#delete-account-modal") + .getByRole("button", { name: "Delete account" }) + .click(); + await expect(page.getByRole("heading", { name: "Login" })).toBeVisible(); +});