Update collab permission tests and minor fixes

This commit is contained in:
thiloho
2024-09-06 16:08:34 +02:00
parent a77d2b2d0c
commit b8d23eab00
16 changed files with 804 additions and 610 deletions

View File

@@ -84,3 +84,7 @@ FROM
ALTER TABLE internal.website ALTER TABLE internal.website
DROP COLUMN title_search; DROP COLUMN title_search;
GRANT SELECT, UPDATE, DELETE ON api.website TO authenticated_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON api.article TO authenticated_user;

View File

@@ -103,6 +103,8 @@ SELECT
FROM FROM
internal.article; internal.article;
GRANT SELECT, INSERT, UPDATE, DELETE ON api.article TO authenticated_user;
DROP VIEW api.docs_category; DROP VIEW api.docs_category;
ALTER TABLE internal.article ALTER TABLE internal.article

View File

@@ -104,3 +104,5 @@ FROM
JOIN internal.home ho ON w.id = ho.website_id JOIN internal.home ho ON w.id = ho.website_id
JOIN internal.footer f ON w.id = f.website_id; JOIN internal.footer f ON w.id = f.website_id;
GRANT SELECT ON api.website_overview TO authenticated_user;

View File

@@ -52,3 +52,5 @@ FROM
ALTER TABLE internal.article ALTER TABLE internal.article
DROP COLUMN article_weight; DROP COLUMN article_weight;
GRANT SELECT, INSERT, UPDATE, DELETE ON api.article TO authenticated_user;

View File

@@ -136,3 +136,5 @@ FROM
JOIN internal.home ho ON w.id = ho.website_id JOIN internal.home ho ON w.id = ho.website_id
JOIN internal.footer f ON w.id = f.website_id; JOIN internal.footer f ON w.id = f.website_id;
GRANT SELECT ON api.website_overview TO authenticated_user;

View File

@@ -136,3 +136,5 @@ FROM
JOIN internal.home ho ON w.id = ho.website_id JOIN internal.home ho ON w.id = ho.website_id
JOIN internal.footer f ON w.id = f.website_id; JOIN internal.footer f ON w.id = f.website_id;
GRANT SELECT ON api.website_overview TO authenticated_user;

View File

@@ -3,6 +3,13 @@ ALTER TABLE internal.article
ALTER COLUMN publication_date DROP NOT NULL; ALTER COLUMN publication_date DROP NOT NULL;
-- migrate:down -- migrate:down
UPDATE
internal.article
SET
publication_date = CURRENT_DATE
WHERE
publication_date IS NULL;
ALTER TABLE internal.article ALTER TABLE internal.article
ALTER COLUMN publication_date SET NOT NULL; ALTER COLUMN publication_date SET NOT NULL;

View File

@@ -33,3 +33,5 @@ SELECT
FROM FROM
internal.website; internal.website;
GRANT SELECT, UPDATE, DELETE ON api.website TO authenticated_user;

View File

@@ -6,10 +6,12 @@ const config: PlaywrightTestConfig = {
url: "http://localhost:4173" url: "http://localhost:4173"
}, },
use: { use: {
baseURL: "http://localhost:4173" baseURL: "http://localhost:4173",
video: "retain-on-failure"
}, },
testDir: "tests", testDir: "tests",
testMatch: /(.+\.)?(test|spec)\.ts/, testMatch: /(.+\.)?(test|spec)\.ts/,
retries: 3,
// Firefox and Webkit are not packaged yet, see https://github.com/NixOS/nixpkgs/issues/288826 // Firefox and Webkit are not packaged yet, see https://github.com/NixOS/nixpkgs/issues/288826
projects: [ projects: [
{ {

View File

@@ -5,33 +5,16 @@ import { join } from "node:path";
export const load: PageServerLoad = async ({ fetch, cookies, url, locals }) => { export const load: PageServerLoad = async ({ fetch, cookies, url, locals }) => {
const searchQuery = url.searchParams.get("website_search_query"); const searchQuery = url.searchParams.get("website_search_query");
const sortBy = url.searchParams.get("website_sort");
const filterBy = url.searchParams.get("website_filter"); const filterBy = url.searchParams.get("website_filter");
const params = new URLSearchParams(); const params = new URLSearchParams();
const baseFetchUrl = `${API_BASE_PREFIX}/website`; const baseFetchUrl = `${API_BASE_PREFIX}/website?order=last_modified_at.desc,created_at.desc`;
if (searchQuery) { if (searchQuery) {
params.append("title_search", `wfts(english).${searchQuery}`); params.append("title_search", `wfts(english).${searchQuery}`);
} }
switch (sortBy) {
case null:
case "creation-time":
params.append("order", "created_at.desc");
break;
case "last-modified":
params.append("order", "last_modified_at.desc");
break;
case "title-a-to-z":
params.append("order", "title.asc");
break;
case "title-z-to-a":
params.append("order", "title.desc");
break;
}
switch (filterBy) { switch (filterBy) {
case "creations": case "creations":
params.append("user_id", `eq.${locals.user.id}`); params.append("user_id", `eq.${locals.user.id}`);
@@ -41,7 +24,7 @@ export const load: PageServerLoad = async ({ fetch, cookies, url, locals }) => {
break; break;
} }
const constructedFetchUrl = `${baseFetchUrl}?${params.toString()}`; const constructedFetchUrl = `${baseFetchUrl}&${params.toString()}`;
const totalWebsitesData = await fetch(baseFetchUrl, { const totalWebsitesData = await fetch(baseFetchUrl, {
method: "HEAD", method: "HEAD",

View File

@@ -54,7 +54,7 @@
</h2> </h2>
<details> <details>
<summary>Search & Sort & Filter</summary> <summary>Search & Filter</summary>
<form method="GET"> <form method="GET">
<label> <label>
Search: Search:
@@ -64,16 +64,6 @@
value={$page.url.searchParams.get("website_search_query")} value={$page.url.searchParams.get("website_search_query")}
/> />
</label> </label>
<label>
Sort:
<select name="website_sort">
{#each sortOptions as { value, text }}
<option {value} selected={value === $page.url.searchParams.get("website_sort")}
>{text}</option
>
{/each}
</select>
</label>
<label> <label>
Filter: Filter:
<select name="website_filter"> <select name="website_filter">

View File

@@ -12,6 +12,11 @@ export const load: PageServerLoad = async ({ params, fetch, cookies, url, parent
baseFetchUrl += baseFetchUrl +=
",article_weight,docs_category(category_name,category_weight)&order=docs_category(category_weight).desc.nullslast,article_weight.desc.nullslast"; ",article_weight,docs_category(category_name,category_weight)&order=docs_category(category_weight).desc.nullslast,article_weight.desc.nullslast";
} }
if (website.content_type === "Blog") {
baseFetchUrl += "&order=last_modified_at.desc,created_at.desc";
}
console.log(baseFetchUrl);
const parameters = new URLSearchParams(); const parameters = new URLSearchParams();

View File

@@ -5,7 +5,7 @@ export const load: PageServerLoad = async ({ parent, params, fetch, cookies }) =
const { website, home } = await parent(); const { website, home } = await parent();
const collabData = await fetch( const collabData = await fetch(
`${API_BASE_PREFIX}/collab?website_id=eq.${params.websiteId}&select=*,user!user_id(*)`, `${API_BASE_PREFIX}/collab?website_id=eq.${params.websiteId}&select=*,user!user_id(*)&order=last_modified_at.desc,added_at.desc`,
{ {
method: "GET", method: "GET",
headers: { headers: {

View File

@@ -14,7 +14,8 @@ const test = base.extend<{ authenticatedPage: Page }>({
} }
}); });
test("Register", async ({ page }) => { test.describe.serial("Account tests", () => {
test("Register", async ({ page }) => {
await page.goto("/register"); await page.goto("/register");
await page.getByLabel("Username:").click(); await page.getByLabel("Username:").click();
await page.getByLabel("Username:").fill(username); await page.getByLabel("Username:").fill(username);
@@ -22,9 +23,9 @@ test("Register", async ({ page }) => {
await page.getByLabel("Password:").fill(password); await page.getByLabel("Password:").fill(password);
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await expect(page.getByText("Successfully registered, you")).toBeVisible(); await expect(page.getByText("Successfully registered, you")).toBeVisible();
}); });
test("Login", async ({ page }) => { test("Login", async ({ page }) => {
await page.goto("/login"); await page.goto("/login");
await page.getByLabel("Username:").click(); await page.getByLabel("Username:").click();
await page.getByLabel("Username:").fill(username); await page.getByLabel("Username:").fill(username);
@@ -32,15 +33,15 @@ test("Login", async ({ page }) => {
await page.getByLabel("Password:").fill(password); await page.getByLabel("Password:").fill(password);
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await expect(page.getByRole("heading", { name: "Dashboard" })).toBeVisible(); await expect(page.getByRole("heading", { name: "Dashboard" })).toBeVisible();
}); });
test("Logout", async ({ authenticatedPage: page }) => { test("Logout", async ({ authenticatedPage: page }) => {
await page.getByRole("link", { name: "Account" }).click(); await page.getByRole("link", { name: "Account" }).click();
await page.getByRole("button", { name: "Logout" }).click(); await page.getByRole("button", { name: "Logout" }).click();
await expect(page.getByRole("heading", { name: "Login" })).toBeVisible(); await expect(page.getByRole("heading", { name: "Login" })).toBeVisible();
}); });
test("Delete account", async ({ authenticatedPage: page }) => { test("Delete account", async ({ authenticatedPage: page }) => {
await page.getByRole("link", { name: "Account" }).click(); await page.getByRole("link", { name: "Account" }).click();
await page.getByRole("button", { name: "Delete account" }).click(); await page.getByRole("button", { name: "Delete account" }).click();
await page.getByLabel("Password:").click(); await page.getByLabel("Password:").click();
@@ -50,4 +51,5 @@ test("Delete account", async ({ authenticatedPage: page }) => {
.getByRole("button", { name: "Delete account" }) .getByRole("button", { name: "Delete account" })
.click(); .click();
await expect(page.getByRole("heading", { name: "Login" })).toBeVisible(); await expect(page.getByRole("heading", { name: "Login" })).toBeVisible();
});
}); });

View File

@@ -1,16 +1,17 @@
import { test, expect, type Page } from "@playwright/test"; import { test, expect } from "@playwright/test";
import { randomBytes } from "node:crypto"; import { randomBytes } from "node:crypto";
const username = randomBytes(8).toString("hex"); const username = randomBytes(8).toString("hex");
const collabUsername = randomBytes(8).toString("hex"); const collabUsername = randomBytes(8).toString("hex");
const collabUsername2 = randomBytes(8).toString("hex"); const collabUsername2 = randomBytes(8).toString("hex");
const collabUsername3 = randomBytes(8).toString("hex"); const collabUsername3 = randomBytes(8).toString("hex");
const collaborators = [collabUsername, collabUsername2, collabUsername3]; const collabUsername4 = randomBytes(8).toString("hex");
const password = "T3stuser??!!"; const password = "T3stuser??!!";
const permissionLevels = [10, 20, 30]; const permissionLevels = [10, 20, 30];
test("Setup", async ({ page }) => { test.describe.serial("Collaborator tests", () => {
test("Setup", async ({ page }) => {
await page.goto("/register"); await page.goto("/register");
await page.getByLabel("Username:").click(); await page.getByLabel("Username:").click();
@@ -37,6 +38,12 @@ test("Setup", async ({ page }) => {
await page.getByLabel("Password:").fill(password); await page.getByLabel("Password:").fill(password);
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await page.getByLabel("Username:").click();
await page.getByLabel("Username:").fill(collabUsername4);
await page.getByLabel("Password:").click();
await page.getByLabel("Password:").fill(password);
await page.getByRole("button", { name: "Submit" }).click();
await page.goto("/login"); await page.goto("/login");
await page.getByLabel("Username:").fill(username); await page.getByLabel("Username:").fill(username);
await page.getByLabel("Password:").fill(password); await page.getByLabel("Password:").fill(password);
@@ -57,7 +64,7 @@ test("Setup", async ({ page }) => {
await page.getByRole("link", { name: "Articles" }).click(); await page.getByRole("link", { name: "Articles" }).click();
await page.getByRole("button", { name: "Create article" }).click(); await page.getByRole("button", { name: "Create article" }).click();
await page.getByLabel("Title:").click(); await page.getByLabel("Title:").click();
await page.getByLabel("Title:").fill("Article"); await page.getByLabel("Title:").fill("Article-10");
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await page.getByRole("link", { name: "Collaborators" }).click(); await page.getByRole("link", { name: "Collaborators" }).click();
@@ -65,15 +72,24 @@ test("Setup", async ({ page }) => {
await page.getByLabel("Username:").click(); await page.getByLabel("Username:").click();
await page.getByLabel("Username:").fill(collabUsername); await page.getByLabel("Username:").fill(collabUsername);
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await page.getByRole("button", { name: "Add collaborator" }).click();
await page.getByLabel("Username:").click();
await page.getByLabel("Username:").fill(collabUsername2);
await page.getByRole("button", { name: "Submit" }).click();
await page.getByRole("button", { name: "Add collaborator" }).click();
await page.getByLabel("Username:").click();
await page.getByLabel("Username:").fill(collabUsername3);
await page.getByRole("combobox").selectOption("30");
await page.getByRole("button", { name: "Submit" }).click();
await page.goto("/"); await page.goto("/");
await page.getByRole("link", { name: "Documentation" }).click(); await page.getByRole("link", { name: "Documentation" }).click();
await page.getByRole("link", { name: "Categories" }).click(); await page.getByRole("link", { name: "Categories" }).click();
await page.getByRole("button", { name: "Create category" }).click(); await page.getByRole("button", { name: "Create category" }).click();
await page.getByLabel("Name:").click(); await page.getByLabel("Name:").click();
await page.getByLabel("Name:").fill("Category"); await page.getByLabel("Name:").fill("Category-10");
await page.getByLabel("Weight:").click(); await page.getByLabel("Weight:").click();
await page.getByLabel("Weight:").fill("1000"); await page.getByLabel("Weight:").fill("10");
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await page.getByRole("link", { name: "Collaborators" }).click(); await page.getByRole("link", { name: "Collaborators" }).click();
@@ -81,9 +97,9 @@ test("Setup", async ({ page }) => {
await page.getByLabel("Username:").click(); await page.getByLabel("Username:").click();
await page.getByLabel("Username:").fill(collabUsername); await page.getByLabel("Username:").fill(collabUsername);
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
}); });
for (const permissionLevel of permissionLevels) { for (const permissionLevel of permissionLevels) {
test(`Set collaborator permission level to ${permissionLevel}`, async ({ page }) => { test(`Set collaborator permission level to ${permissionLevel}`, async ({ page }) => {
await page.goto("/login"); await page.goto("/login");
await page.getByLabel("Username:").fill(username); await page.getByLabel("Username:").fill(username);
@@ -91,7 +107,24 @@ for (const permissionLevel of permissionLevels) {
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await page.getByRole("link", { name: "Blog" }).click(); await page.getByRole("link", { name: "Blog" }).click();
await page.getByRole("link", { name: "Collaborators" }).click(); await page.getByRole("link", { name: "Collaborators" }).click();
await page.getByRole("button", { name: "Update" }).click(); await page
.locator("li")
.filter({ hasText: collabUsername })
.getByRole("button")
.first()
.click();
await page.getByRole("combobox").selectOption(permissionLevel.toString());
await page.getByRole("button", { name: "Update collaborator" }).click();
await page.goto("/");
await page.getByRole("link", { name: "Documentation" }).click();
await page.getByRole("link", { name: "Collaborators" }).click();
await page
.locator("li")
.filter({ hasText: collabUsername })
.getByRole("button")
.first()
.click();
await page.getByRole("combobox").selectOption(permissionLevel.toString()); await page.getByRole("combobox").selectOption(permissionLevel.toString());
await page.getByRole("button", { name: "Update collaborator" }).click(); await page.getByRole("button", { name: "Update collaborator" }).click();
}); });
@@ -105,15 +138,17 @@ for (const permissionLevel of permissionLevels) {
}); });
test("Update website", async ({ page }) => { test("Update website", async ({ page }) => {
await page.getByRole("button", { name: "Update" }).nth(1).click(); await page.locator("li").filter({ hasText: "Blog" }).getByRole("button").first().click();
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully updated website")).toBeVisible();
} }
}); });
test("Delete website", async ({ page }) => { test("Delete website", async ({ page }) => {
await page.getByRole("button", { name: "Delete" }).nth(0).click(); await page.locator("li").filter({ hasText: "Blog" }).getByRole("button").nth(1).click();
await page.getByRole("button", { name: "Delete website" }).click(); await page.getByRole("button", { name: "Delete website" }).click();
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
}); });
@@ -123,6 +158,8 @@ for (const permissionLevel of permissionLevels) {
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully updated global")).toBeVisible();
} }
}); });
test("Update Header", async ({ page }) => { test("Update Header", async ({ page }) => {
@@ -131,6 +168,8 @@ for (const permissionLevel of permissionLevels) {
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully updated header")).toBeVisible();
} }
}); });
test("Update Home", async ({ page }) => { test("Update Home", async ({ page }) => {
@@ -139,6 +178,8 @@ for (const permissionLevel of permissionLevels) {
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully updated home")).toBeVisible();
} }
}); });
test("Update Footer", async ({ page }) => { test("Update Footer", async ({ page }) => {
@@ -147,6 +188,8 @@ for (const permissionLevel of permissionLevels) {
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully updated footer")).toBeVisible();
} }
}); });
test("Create article", async ({ page }) => { test("Create article", async ({ page }) => {
@@ -154,17 +197,23 @@ for (const permissionLevel of permissionLevels) {
await page.getByRole("link", { name: "Articles" }).click(); await page.getByRole("link", { name: "Articles" }).click();
await page.getByRole("button", { name: "Create article" }).click(); await page.getByRole("button", { name: "Create article" }).click();
await page.getByLabel("Title:").click(); await page.getByLabel("Title:").click();
await page.getByLabel("Title:").fill("Article"); await page.getByLabel("Title:").fill(`Article-${permissionLevel}`);
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully created article")).toBeVisible();
} }
}); });
test("Update article", async ({ page }) => { test("Update article", async ({ page }) => {
await page.getByRole("link", { name: "Blog" }).click(); await page.getByRole("link", { name: "Blog" }).click();
await page.getByRole("link", { name: "Articles" }).click(); await page.getByRole("link", { name: "Articles" }).click();
await page.getByRole("link", { name: "Edit" }).nth(0).click(); await page
.locator("li")
.filter({ hasText: `Article-${permissionLevel}` })
.getByRole("link")
.click();
await page.getByLabel("Description:").click(); await page.getByLabel("Description:").click();
await page.getByLabel("Description:").fill("Description"); await page.getByLabel("Description:").fill("Description");
await page.getByLabel("Author:").click(); await page.getByLabel("Author:").click();
@@ -175,50 +224,101 @@ for (const permissionLevel of permissionLevels) {
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully updated article")).toBeVisible();
} }
}); });
test("Delete article", async ({ page }) => { test("Delete article", async ({ page }) => {
await page.getByRole("link", { name: "Blog" }).click(); await page.getByRole("link", { name: "Blog" }).click();
await page.getByRole("link", { name: "Articles" }).click(); await page.getByRole("link", { name: "Articles" }).click();
await page.getByRole("button", { name: "Delete" }).nth(0).click(); await page
.locator("li")
.filter({ hasText: `Article-${permissionLevel}` })
.getByRole("button")
.click();
await page.getByRole("button", { name: "Delete article" }).click(); await page.getByRole("button", { name: "Delete article" }).click();
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} }
if ([20, 30].includes(permissionLevel)) {
await expect(page.getByText("Successfully deleted article")).toBeVisible();
await page.locator("li").filter({ hasText: `Article-10` }).getByRole("button").click();
await page.getByRole("button", { name: "Delete article" }).click();
if (permissionLevel === 20) {
await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully deleted article")).toBeVisible();
}
}
}); });
test("Add collaborator", async ({ page }) => { test("Add collaborator", async ({ page }) => {
await page.getByRole("link", { name: "Blog" }).click(); await page.getByRole("link", { name: "Blog" }).click();
await page.getByRole("link", { name: "Collaborators" }).click(); await page.getByRole("link", { name: "Collaborators" }).click();
await page.getByRole("button", { name: "Add collaborator" }).click(); await page.getByRole("button", { name: "Add collaborator" }).click();
await page.getByLabel("Username:").click(); await page.getByLabel("Username:").click();
await page await page.getByLabel("Username:").fill(collabUsername4);
.getByLabel("Username:")
.fill(collaborators[permissionLevels.indexOf(permissionLevel)]);
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
if (permissionLevel === 10) { if ([10, 20].includes(permissionLevel)) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully added")).toBeVisible();
} }
}); });
test("Update collaborator", async ({ page }) => { test("Update collaborator", async ({ page }) => {
await page.getByRole("link", { name: "Blog" }).click(); await page.getByRole("link", { name: "Blog" }).click();
await page.getByRole("link", { name: "Collaborators" }).click(); await page.getByRole("link", { name: "Collaborators" }).click();
await page.getByRole("button", { name: "Update" }).nth(0).click(); await page
.locator("li")
.filter({ hasText: collabUsername2 })
.getByRole("button")
.first()
.click();
await page.getByRole("combobox").selectOption("20"); await page.getByRole("combobox").selectOption("20");
await page.getByRole("button", { name: "Update collaborator" }).click(); await page.getByRole("button", { name: "Update collaborator" }).click();
if (permissionLevel === 10) { if ([10, 20].includes(permissionLevel)) {
await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully updated")).toBeVisible();
await page
.locator("li")
.filter({ hasText: collabUsername2 })
.getByRole("button")
.first()
.click();
await page.getByRole("combobox").selectOption("30");
await page.getByRole("button", { name: "Update collaborator" }).click();
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} }
}); });
test("Remove collaborator", async ({ page }) => { test("Remove collaborator", async ({ page }) => {
await page.getByRole("link", { name: "Blog" }).click(); await page.getByRole("link", { name: "Blog" }).click();
await page.getByRole("link", { name: "Collaborators" }).click(); await page.getByRole("link", { name: "Collaborators" }).click();
await page.getByRole("button", { name: "Remove" }).nth(0).click(); await page
.locator("li")
.filter({ hasText: collabUsername2 })
.getByRole("button")
.nth(1)
.click();
await page.getByRole("button", { name: "Remove collaborator" }).click(); await page.getByRole("button", { name: "Remove collaborator" }).click();
if (permissionLevel === 10) { if ([10, 20].includes(permissionLevel)) {
await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully removed")).toBeVisible();
await page
.locator("li")
.filter({ hasText: collabUsername3 })
.getByRole("button")
.nth(1)
.click();
await page.getByRole("button", { name: "Remove collaborator" }).click();
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} }
}); });
@@ -227,36 +327,69 @@ for (const permissionLevel of permissionLevels) {
await page.getByRole("link", { name: "Categories" }).click(); await page.getByRole("link", { name: "Categories" }).click();
await page.getByRole("button", { name: "Create category" }).click(); await page.getByRole("button", { name: "Create category" }).click();
await page.getByLabel("Name:").click(); await page.getByLabel("Name:").click();
await page.getByLabel("Name:").fill("Test"); await page.getByLabel("Name:").fill(`Category-${permissionLevel}`);
await page.getByRole("spinbutton", { name: "Weight:" }).click(); await page.getByRole("spinbutton", { name: "Weight:" }).click();
await page.getByRole("spinbutton", { name: "Weight:" }).fill("900"); await page.getByRole("spinbutton", { name: "Weight:" }).fill(permissionLevel.toString());
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully created category")).toBeVisible();
} }
}); });
test("Update category", async ({ page }) => { test("Update category", async ({ page }) => {
await page.getByRole("link", { name: "Documentation" }).click(); await page.getByRole("link", { name: "Documentation" }).click();
await page.getByRole("link", { name: "Categories" }).click(); await page.getByRole("link", { name: "Categories" }).click();
await page.getByRole("button", { name: "Update" }).nth(0).click(); await page
.locator("li")
.filter({ hasText: `Category-${permissionLevel}` })
.getByRole("button")
.first()
.click();
await page.getByRole("spinbutton", { name: "Weight:" }).click(); await page.getByRole("spinbutton", { name: "Weight:" }).click();
await page.getByRole("spinbutton", { name: "Weight:" }).fill("500"); await page
.getByRole("spinbutton", { name: "Weight:" })
.fill((permissionLevel * 2).toString());
await page.getByRole("button", { name: "Update category" }).click(); await page.getByRole("button", { name: "Update category" }).click();
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully updated category")).toBeVisible();
} }
}); });
test("Delete category", async ({ page }) => { test("Delete category", async ({ page }) => {
await page.getByRole("link", { name: "Documentation" }).click(); await page.getByRole("link", { name: "Documentation" }).click();
await page.getByRole("link", { name: "Categories" }).click(); await page.getByRole("link", { name: "Categories" }).click();
await page.getByRole("button", { name: "Delete" }).nth(0).click(); await page
.locator("li")
.filter({ hasText: `Category-${permissionLevel}` })
.getByRole("button")
.nth(1)
.click();
await page.getByRole("button", { name: "Delete category" }).click(); await page.getByRole("button", { name: "Delete category" }).click();
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} }
if ([20, 30].includes(permissionLevel)) {
await expect(page.getByText("Successfully deleted category")).toBeVisible();
await page
.locator("li")
.filter({ hasText: "Category-10" })
.getByRole("button")
.nth(1)
.click();
await page.getByRole("button", { name: "Delete category" }).click();
if (permissionLevel === 20) {
await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully deleted category")).toBeVisible();
}
}
}); });
test("Publish website", async ({ page }) => { test("Publish website", async ({ page }) => {
await page.getByRole("link", { name: "Blog" }).click(); await page.getByRole("link", { name: "Blog" }).click();
@@ -265,21 +398,67 @@ for (const permissionLevel of permissionLevels) {
if (permissionLevel === 10) { if (permissionLevel === 10) {
await expect(page.getByText("You do not have the required")).toBeVisible(); await expect(page.getByText("You do not have the required")).toBeVisible();
} else {
await expect(page.getByText("Successfully published website")).toBeVisible();
} }
}); });
}); });
} }
test.describe("Delete all accounts", () => { test("Delete all accounts", async ({ page }) => {
const allUsers = collaborators.concat(username);
for (const user of allUsers) {
test(`Delete account ${allUsers.indexOf(user)}`, async ({ page }) => {
await page.goto("/login"); await page.goto("/login");
await page.getByLabel("Username:").fill(user);
await page.getByLabel("Username:").fill(username);
await page.getByLabel("Password:").fill(password); await page.getByLabel("Password:").fill(password);
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
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 page.getByLabel("Username:").fill(collabUsername);
await page.getByLabel("Password:").fill(password);
await page.getByRole("button", { name: "Submit" }).click();
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 page.getByLabel("Username:").fill(collabUsername2);
await page.getByLabel("Password:").fill(password);
await page.getByRole("button", { name: "Submit" }).click();
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 page.getByLabel("Username:").fill(collabUsername3);
await page.getByLabel("Password:").fill(password);
await page.getByRole("button", { name: "Submit" }).click();
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 page.getByLabel("Username:").fill(collabUsername4);
await page.getByLabel("Password:").fill(password);
await page.getByRole("button", { name: "Submit" }).click();
await page.getByRole("link", { name: "Account" }).click(); await page.getByRole("link", { name: "Account" }).click();
await page.getByRole("button", { name: "Delete account" }).click(); await page.getByRole("button", { name: "Delete account" }).click();
await page.getByLabel("Password:").click(); await page.getByLabel("Password:").click();
@@ -289,5 +468,4 @@ test.describe("Delete all accounts", () => {
.getByRole("button", { name: "Delete account" }) .getByRole("button", { name: "Delete account" })
.click(); .click();
}); });
}
}); });

View File

@@ -21,7 +21,8 @@ const test = base.extend<{ authenticatedPage: Page }>({
} }
}); });
test("Register", async ({ page }) => { test.describe.serial("Website tests", () => {
test("Register", async ({ page }) => {
await page.goto("/register"); await page.goto("/register");
await page.getByLabel("Username:").click(); await page.getByLabel("Username:").click();
@@ -35,15 +36,15 @@ test("Register", async ({ page }) => {
await page.getByLabel("Password:").click(); await page.getByLabel("Password:").click();
await page.getByLabel("Password:").fill(password); await page.getByLabel("Password:").fill(password);
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
}); });
test("Create websites", async ({ authenticatedPage: page }) => { test("Create websites", async ({ authenticatedPage: page }) => {
await page.getByRole("button", { name: "Create website" }).click(); await page.getByRole("button", { name: "Create website" }).click();
await page.getByLabel("Title:").click(); await page.getByLabel("Title:").click();
await page.getByLabel("Title:").fill("Blog"); await page.getByLabel("Title:").fill("Blog");
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await expect(page.getByRole("link", { name: "All websites" })).toBeVisible(); await expect(page.getByRole("link", { name: "All websites" })).toBeVisible();
await expect(page.getByText("Search & Sort & Filter")).toBeVisible(); await expect(page.getByText("Search & Filter")).toBeVisible();
await expect(page.getByText("Blog Type: Blog Created at:")).toBeVisible(); await expect(page.getByText("Blog Type: Blog Created at:")).toBeVisible();
await page.getByRole("button", { name: "Create website" }).click(); await page.getByRole("button", { name: "Create website" }).click();
@@ -52,26 +53,31 @@ test("Create websites", async ({ authenticatedPage: page }) => {
await page.getByLabel("Title:").fill("Documentation"); await page.getByLabel("Title:").fill("Documentation");
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await expect(page.getByRole("link", { name: "All websites" })).toBeVisible(); await expect(page.getByRole("link", { name: "All websites" })).toBeVisible();
await expect(page.getByText("Search & Sort & Filter")).toBeVisible(); await expect(page.getByText("Search & Filter")).toBeVisible();
await expect(page.getByText("Documentation Type: Docs")).toBeVisible(); await expect(page.getByText("Documentation Type: Docs")).toBeVisible();
}); });
test("Update websites", async ({ authenticatedPage: page }) => { test("Update websites", async ({ authenticatedPage: page }) => {
await page.getByRole("button", { name: "Update" }).nth(1).click(); await page.locator("li").filter({ hasText: "Blog" }).getByRole("button").first().click();
await page.getByRole("textbox", { name: "Title" }).click(); await page.getByRole("textbox", { name: "Title" }).click();
await page.getByRole("textbox", { name: "Title" }).fill("Blog updated"); await page.getByRole("textbox", { name: "Title" }).fill("Blog updated");
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await expect(page.getByRole("link", { name: "Blog updated" })).toBeVisible(); await expect(page.getByRole("link", { name: "Blog updated" })).toBeVisible();
await page.getByRole("button", { name: "Update" }).first().click(); await page
.locator("li")
.filter({ hasText: "Documentation" })
.getByRole("button")
.first()
.click();
await page.getByRole("textbox", { name: "Title" }).click(); await page.getByRole("textbox", { name: "Title" }).click();
await page.getByRole("textbox", { name: "Title" }).fill("Documentation updated"); await page.getByRole("textbox", { name: "Title" }).fill("Documentation updated");
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await expect(page.getByRole("link", { name: "Documentation updated" })).toBeVisible(); await expect(page.getByRole("link", { name: "Documentation updated" })).toBeVisible();
}); });
test.describe("Blog", () => { test.describe.serial("Blog", () => {
test.describe("Update settings", () => { test.describe.serial("Update settings", () => {
test("Global", async ({ authenticatedPage: page }) => { test("Global", async ({ authenticatedPage: page }) => {
await page.getByRole("link", { name: "Blog" }).click(); await page.getByRole("link", { name: "Blog" }).click();
await page.getByLabel("Light accent color:").click(); await page.getByLabel("Light accent color:").click();
@@ -154,7 +160,9 @@ test.describe("Blog", () => {
"## Section\n\n### Subsection\n\n## Second section\n\n### Second subsection\n\n#### Sub Sub section" "## Section\n\n### Subsection\n\n## Second section\n\n### Second subsection\n\n#### Sub Sub section"
); );
await expect( await expect(
page.getByText("Table of contents SectionSubsectionSecond sectionSecond subsectionSub Sub") page.getByText(
"Table of contents SectionSubsectionSecond sectionSecond subsectionSub Sub"
)
).toBeVisible(); ).toBeVisible();
await expect( await expect(
page.getByRole("heading", { name: "Section", exact: true }).getByRole("link") page.getByRole("heading", { name: "Section", exact: true }).getByRole("link")
@@ -222,9 +230,9 @@ test.describe("Blog", () => {
await expect(page.getByText("Successfully removed")).toBeVisible(); await expect(page.getByText("Successfully removed")).toBeVisible();
}); });
}); });
}); });
test.describe("Docs", () => { test.describe.serial("Docs", () => {
test.describe.serial("Categories", () => { test.describe.serial("Categories", () => {
test("Create category", async ({ authenticatedPage: page }) => { test("Create category", async ({ authenticatedPage: page }) => {
await page.getByRole("link", { name: "Documentation" }).click(); await page.getByRole("link", { name: "Documentation" }).click();
@@ -285,7 +293,9 @@ test.describe("Docs", () => {
await page.getByLabel("Main content:").click(); await page.getByLabel("Main content:").click();
await page await page
.getByLabel("Main content:") .getByLabel("Main content:")
.fill("## Main content comes in here\n\n### First section\n\n### Second section\n\n## More"); .fill(
"## Main content comes in here\n\n### First section\n\n### Second section\n\n## More"
);
await page.getByRole("button", { name: "Submit" }).click(); await page.getByRole("button", { name: "Submit" }).click();
await expect(page.getByText("Successfully updated article")).toBeVisible(); await expect(page.getByText("Successfully updated article")).toBeVisible();
await expect(page.getByText("Table of contents Main")).toBeVisible(); await expect(page.getByText("Table of contents Main")).toBeVisible();
@@ -293,9 +303,9 @@ test.describe("Docs", () => {
page.getByRole("heading", { name: "Main content comes in here" }).getByRole("link") page.getByRole("heading", { name: "Main content comes in here" }).getByRole("link")
).toBeVisible(); ).toBeVisible();
}); });
}); });
test("Publish websites", async ({ authenticatedPage: page }) => { test("Publish websites", async ({ authenticatedPage: page }) => {
await page.getByRole("link", { name: "Blog" }).click(); await page.getByRole("link", { name: "Blog" }).click();
await page.getByRole("link", { name: "Publish" }).click(); await page.getByRole("link", { name: "Publish" }).click();
await page.getByRole("button", { name: "Publish" }).click(); await page.getByRole("button", { name: "Publish" }).click();
@@ -308,9 +318,9 @@ test("Publish websites", async ({ authenticatedPage: page }) => {
await page.getByRole("button", { name: "Publish" }).click(); await page.getByRole("button", { name: "Publish" }).click();
await expect(page.getByText("Successfully published website")).toBeVisible(); await expect(page.getByText("Successfully published website")).toBeVisible();
await expect(page.getByText("Your website is published at")).toBeVisible(); await expect(page.getByText("Your website is published at")).toBeVisible();
}); });
test("Delete websites", async ({ authenticatedPage: page }) => { test("Delete websites", async ({ authenticatedPage: page }) => {
await page.getByRole("button", { name: "Delete" }).nth(1).click(); await page.getByRole("button", { name: "Delete" }).nth(1).click();
await page.getByRole("button", { name: "Delete website" }).click(); await page.getByRole("button", { name: "Delete website" }).click();
await expect(page.getByText("Successfully deleted website")).toBeVisible(); await expect(page.getByText("Successfully deleted website")).toBeVisible();
@@ -320,9 +330,9 @@ test("Delete websites", async ({ authenticatedPage: page }) => {
await expect(page.getByText("Successfully deleted website")).toBeVisible(); await expect(page.getByText("Successfully deleted website")).toBeVisible();
await expect(page.getByRole("link", { name: "All websites" })).toBeHidden(); await expect(page.getByRole("link", { name: "All websites" })).toBeHidden();
}); });
test("Delete accounts", async ({ authenticatedPage: page }) => { test("Delete accounts", async ({ authenticatedPage: page }) => {
await page.getByRole("link", { name: "Account" }).click(); await page.getByRole("link", { name: "Account" }).click();
await page.getByRole("button", { name: "Delete account" }).click(); await page.getByRole("button", { name: "Delete account" }).click();
await page.getByLabel("Password:").click(); await page.getByLabel("Password:").click();
@@ -343,4 +353,5 @@ test("Delete accounts", async ({ authenticatedPage: page }) => {
.locator("#delete-account-modal") .locator("#delete-account-modal")
.getByRole("button", { name: "Delete account" }) .getByRole("button", { name: "Delete account" })
.click(); .click();
});
}); });