From dee14791eae3e4381bbef61d1220e1534b488339 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Sat, 3 May 2025 13:43:23 +0200 Subject: [PATCH 01/16] test(frontend): Teacher can create class --- frontend/e2e/class.spec.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 frontend/e2e/class.spec.ts diff --git a/frontend/e2e/class.spec.ts b/frontend/e2e/class.spec.ts new file mode 100644 index 00000000..394e4b27 --- /dev/null +++ b/frontend/e2e/class.spec.ts @@ -0,0 +1,27 @@ +import { test, expect } from "@playwright/test" + +test("Teacher create a class", async ({ page }) => { + await page.goto("/") + + // Login + await page.getByRole("link", { name: "log in" }).click(); + await page.getByRole("button", { name: "teacher" }).click(); + await page.getByRole("textbox", { name: "Username or email" }).fill("testleerkracht1"); + await page.getByRole("textbox", { name: "Password" }).fill("password"); + await page.getByRole("button", { name: "Sign In" }).click(); + + // Go to class + await expect(page.getByRole('banner').getByRole('link', { name: 'Classes' })).toBeVisible(); + await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); + + await expect(page.getByRole('heading', { name: 'Classes' })).toBeVisible(); + await expect(page.getByRole('textbox', { name: 'classname classname' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'create' })).toBeVisible(); + + await page.getByRole('textbox', { name: 'classname classname' }).click(); + await page.getByRole('textbox', { name: 'classname classname' }).fill('DeTijdLoze'); + await page.getByRole('button', { name: 'create' }).click(); + + await expect(page.getByRole('dialog').getByText('code')).toBeVisible(); + await expect(page.getByRole('button', { name: 'close' })).toBeVisible(); +}); From d9e428f52215b3dfb644648045752c2554484c46 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Sat, 3 May 2025 14:29:21 +0200 Subject: [PATCH 02/16] test(frontend): Student can join class by code --- frontend/e2e/class.spec.ts | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/frontend/e2e/class.spec.ts b/frontend/e2e/class.spec.ts index 394e4b27..f45f95b1 100644 --- a/frontend/e2e/class.spec.ts +++ b/frontend/e2e/class.spec.ts @@ -1,6 +1,8 @@ import { test, expect } from "@playwright/test" test("Teacher create a class", async ({ page }) => { + const className = "DeTijdLoze" + await page.goto("/") // Login @@ -14,14 +16,44 @@ test("Teacher create a class", async ({ page }) => { await expect(page.getByRole('banner').getByRole('link', { name: 'Classes' })).toBeVisible(); await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); + // Check if the class page is visible await expect(page.getByRole('heading', { name: 'Classes' })).toBeVisible(); await expect(page.getByRole('textbox', { name: 'classname classname' })).toBeVisible(); await expect(page.getByRole('button', { name: 'create' })).toBeVisible(); + // Create a class await page.getByRole('textbox', { name: 'classname classname' }).click(); - await page.getByRole('textbox', { name: 'classname classname' }).fill('DeTijdLoze'); + await page.getByRole('textbox', { name: 'classname classname' }).fill(className); await page.getByRole('button', { name: 'create' }).click(); + // Check if the class is created await expect(page.getByRole('dialog').getByText('code')).toBeVisible(); await expect(page.getByRole('button', { name: 'close' })).toBeVisible(); }); + +test("Student can join class by code", async ({ page }) => { + await page.goto("/") + + // Login + await page.getByRole("link", { name: "log in" }).click(); + await page.getByRole("button", { name: "student" }).click(); + await page.getByRole("textbox", { name: "Username or email" }).fill("testleerling1"); + await page.getByRole("textbox", { name: "Password" }).fill("password"); + await page.getByRole("button", { name: "Sign In" }).click(); + + // Go to class + await expect(page.getByRole('banner').getByRole('link', { name: 'Classes' })).toBeVisible(); + await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); + + // Check if the class page is visible + await expect(page.getByRole('heading', { name: 'Classes' })).toBeVisible(); + await expect(page.getByRole('heading', { name: 'Join class' })).toBeVisible(); + await expect(page.getByRole('textbox', { name: 'CODE CODE' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'submit' })).toBeVisible(); + + // Join a class + await page.getByRole('textbox', { name: 'CODE CODE' }).click(); + await page.getByRole('textbox', { name: 'CODE CODE' }).fill('16c822ca-633d-49e3-89fc-8d7a291450e6'); + await page.getByRole('button', { name: 'submit' }).click(); + await expect(page.getByText('failed: Request failed with status code 404', { exact: true })).toBeVisible(); +}); From 11ce54756597e21f0415ecbb550fd358b6c570e6 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 14 May 2025 07:49:01 +0200 Subject: [PATCH 03/16] notworking --- frontend/e2e/assignments.spec.ts | 60 ++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 frontend/e2e/assignments.spec.ts diff --git a/frontend/e2e/assignments.spec.ts b/frontend/e2e/assignments.spec.ts new file mode 100644 index 00000000..bddd0090 --- /dev/null +++ b/frontend/e2e/assignments.spec.ts @@ -0,0 +1,60 @@ +import { test, expect } from '@playwright/test'; + +test('test', async ({ page }) => { + await page.goto('http://localhost/'); + await page.getByRole('link', { name: 'log in' }).click(); + await page.getByRole('button', { name: 'teacher' }).click(); + await page.getByRole('textbox', { name: 'Username or email' }).fill('testleerkracht1'); + await page.getByRole('textbox', { name: 'Username or email' }).press('Tab'); + await page.getByRole('textbox', { name: 'Password' }).fill('password'); + await page.getByRole('button', { name: 'Sign In' }).click(); + await page.getByRole('link', { name: 'AI and Climate Students in' }).click(); + await page.goto('http://localhost/user'); + await page.getByRole('link', { name: 'Search all learning paths You' }).click(); + await page.getByRole('textbox', { name: 'Search... Search...' }).click(); + await page.getByRole('textbox', { name: 'Search... Search...' }).fill('dyn'); + await page.getByRole('textbox', { name: 'Search... Search...' }).press('Enter'); + await page.getByRole('textbox', { name: 'Search... Search...' }).dblclick(); + await page.getByRole('textbox', { name: 'Search... Search...' }).fill('com'); + await page.getByRole('textbox', { name: 'Search... Search...' }).press('Enter'); + await page.getByRole('textbox', { name: 'Search... Search...' }).fill('cus'); + await page.getByRole('textbox', { name: 'Search... Search...' }).press('Enter'); + await page.getByRole('link', { name: 'Module 4 12 - 14 years In' }).click(); + await page.getByRole('button', { name: 'assign' }).click(); + await page.getByRole('textbox', { name: 'Title Title' }).click(); + await page.getByRole('textbox', { name: 'Title Title' }).fill('Testopdracht'); + await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).click(); + await page.getByRole('textbox', { name: 'Select Deadline Date Select' }).fill('3000-01-01'); + await page.getByRole('button', { name: 'submit' }).click(); + await page.getByRole('textbox', { name: 'Description Description' }).click(); + await page.getByRole('textbox', { name: 'Description Description' }).fill('Description'); + await page.locator('div:nth-child(3) > .v-input > .v-input__control > .v-field > .v-field__field > .v-field__input').click(); + await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).fill('a'); + await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).press('Enter'); + await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); + await page.getByRole('textbox', { name: 'classname classname' }).click(); + await page.getByRole('textbox', { name: 'classname classname' }).fill('class'); + await page.getByRole('button', { name: 'create' }).click(); + await page.getByRole('button', { name: 'close' }).click(); + await page.getByRole('link', { name: 'Dwengo logo teacher' }).click(); + await page.getByRole('link', { name: 'AI and Climate Students in' }).click(); + await page.getByRole('link', { name: 'Artificiële intelligentie 12' }).click(); + await page.getByRole('button', { name: 'assign' }).click(); + await page.getByRole('textbox', { name: 'Title Title' }).click(); + await page.getByRole('textbox', { name: 'Title Title' }).fill('Assignment'); + await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).click(); + await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).fill('class'); + await page.getByText('New AssignmentTitleTitleSelect a learning').click(); + await page.getByRole('textbox', { name: 'Select Deadline Date Select' }).fill('3000-01-01'); + await page.getByRole('textbox', { name: 'Description Description' }).click(); + await page.getByRole('textbox', { name: 'Description Description' }).fill('Description'); + await page.getByRole('button', { name: 'submit' }).click(); + await page.getByRole('button', { name: 'submit' }).click(); + await page.getByRole('button', { name: 'submit' }).click(); + await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).click(); + await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).fill('class'); + await page.locator('#v-menu-v-130').getByText('class').click(); + await page.getByRole('button', { name: 'submit' }).click(); + await page.getByText('AssignmentLearning').click(); + await page.getByText('New AssignmentTitleTitleSelect a learning').click(); +}); From 1a706985f361f7ffee49e7dff59c36dec996cc75 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 15:31:31 +0200 Subject: [PATCH 04/16] fixup! notworking --- frontend/e2e/assignments.spec.ts | 87 ++++++++++++-------------------- 1 file changed, 32 insertions(+), 55 deletions(-) diff --git a/frontend/e2e/assignments.spec.ts b/frontend/e2e/assignments.spec.ts index bddd0090..cdbcd7e0 100644 --- a/frontend/e2e/assignments.spec.ts +++ b/frontend/e2e/assignments.spec.ts @@ -1,60 +1,37 @@ import { test, expect } from '@playwright/test'; -test('test', async ({ page }) => { - await page.goto('http://localhost/'); - await page.getByRole('link', { name: 'log in' }).click(); - await page.getByRole('button', { name: 'teacher' }).click(); - await page.getByRole('textbox', { name: 'Username or email' }).fill('testleerkracht1'); - await page.getByRole('textbox', { name: 'Username or email' }).press('Tab'); - await page.getByRole('textbox', { name: 'Password' }).fill('password'); - await page.getByRole('button', { name: 'Sign In' }).click(); - await page.getByRole('link', { name: 'AI and Climate Students in' }).click(); - await page.goto('http://localhost/user'); - await page.getByRole('link', { name: 'Search all learning paths You' }).click(); - await page.getByRole('textbox', { name: 'Search... Search...' }).click(); - await page.getByRole('textbox', { name: 'Search... Search...' }).fill('dyn'); - await page.getByRole('textbox', { name: 'Search... Search...' }).press('Enter'); - await page.getByRole('textbox', { name: 'Search... Search...' }).dblclick(); - await page.getByRole('textbox', { name: 'Search... Search...' }).fill('com'); - await page.getByRole('textbox', { name: 'Search... Search...' }).press('Enter'); - await page.getByRole('textbox', { name: 'Search... Search...' }).fill('cus'); - await page.getByRole('textbox', { name: 'Search... Search...' }).press('Enter'); - await page.getByRole('link', { name: 'Module 4 12 - 14 years In' }).click(); - await page.getByRole('button', { name: 'assign' }).click(); - await page.getByRole('textbox', { name: 'Title Title' }).click(); - await page.getByRole('textbox', { name: 'Title Title' }).fill('Testopdracht'); +test('Teacher can create new assignment', async ({ page }) => { + // Login + await page.getByRole("link", { name: "log in" }).click(); + await page.getByRole("button", { name: "teacher" }).click(); + await page.getByRole("textbox", { name: "Username or email" }).fill("testleerkracht1"); + await page.getByRole("textbox", { name: "Password" }).fill("password"); + await page.getByRole("button", { name: "Sign In" }).click(); + + // Go to assignments + await expect(page.getByRole('banner').getByRole('link', { name: 'Assignments' })).toBeVisible(); + await page.getByRole('banner').getByRole('link', { name: 'Assignments' }).click(); + await expect(page.getByRole('heading', { name: 'Assignments' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'New Assignment' })).toBeVisible(); + + // Create new assignment + await page.getByRole('button', { name: 'New Assignment' }).click(); + await expect(page.getByRole('button', { name: 'submit' })).toBeVisible(); + await expect(page.getByRole('link', { name: 'cancel' })).toBeVisible(); + + await page.getByRole('textbox', { name: 'Title Title' }).fill('Assignment test 1'); + await page.getByRole('textbox', { name: 'Select a learning path Select' }).click(); + await page.getByText('Using notebooks').click(); await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).click(); - await page.getByRole('textbox', { name: 'Select Deadline Date Select' }).fill('3000-01-01'); + await page.getByText('class01').click(); + await page.getByRole('textbox', { name: 'Select Deadline Select' }).fill('2099-01-01T12:34'); + await page.getByRole('textbox', { name: 'Description Description' }).fill('Assignment description'); + await page.getByRole('button', { name: 'submit' }).click(); - await page.getByRole('textbox', { name: 'Description Description' }).click(); - await page.getByRole('textbox', { name: 'Description Description' }).fill('Description'); - await page.locator('div:nth-child(3) > .v-input > .v-input__control > .v-field > .v-field__field > .v-field__input').click(); - await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).fill('a'); - await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).press('Enter'); - await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); - await page.getByRole('textbox', { name: 'classname classname' }).click(); - await page.getByRole('textbox', { name: 'classname classname' }).fill('class'); - await page.getByRole('button', { name: 'create' }).click(); - await page.getByRole('button', { name: 'close' }).click(); - await page.getByRole('link', { name: 'Dwengo logo teacher' }).click(); - await page.getByRole('link', { name: 'AI and Climate Students in' }).click(); - await page.getByRole('link', { name: 'Artificiële intelligentie 12' }).click(); - await page.getByRole('button', { name: 'assign' }).click(); - await page.getByRole('textbox', { name: 'Title Title' }).click(); - await page.getByRole('textbox', { name: 'Title Title' }).fill('Assignment'); - await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).click(); - await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).fill('class'); - await page.getByText('New AssignmentTitleTitleSelect a learning').click(); - await page.getByRole('textbox', { name: 'Select Deadline Date Select' }).fill('3000-01-01'); - await page.getByRole('textbox', { name: 'Description Description' }).click(); - await page.getByRole('textbox', { name: 'Description Description' }).fill('Description'); - await page.getByRole('button', { name: 'submit' }).click(); - await page.getByRole('button', { name: 'submit' }).click(); - await page.getByRole('button', { name: 'submit' }).click(); - await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).click(); - await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).fill('class'); - await page.locator('#v-menu-v-130').getByText('class').click(); - await page.getByRole('button', { name: 'submit' }).click(); - await page.getByText('AssignmentLearning').click(); - await page.getByText('New AssignmentTitleTitleSelect a learning').click(); + + await expect(page.getByText('Assignment test')).toBeVisible(); + await expect(page.getByRole('main').getByRole('button').first()).toBeVisible(); + await expect(page.getByRole('main')).toContainText('Assignment test 1'); + await expect(page.getByRole('link', { name: 'Learning path' })).toBeVisible(); + await expect(page.getByRole('main')).toContainText('Assignment description'); }); From 112e0ca9c6550c7d05bcc46fa25828ea6a94898e Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 14:00:38 +0200 Subject: [PATCH 05/16] fix(frontend): Resolve common import --- frontend/vite.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 61867714..523750b9 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -9,6 +9,7 @@ export default defineConfig({ resolve: { alias: { "@": fileURLToPath(new URL("./src", import.meta.url)), + "@dwengo-1/common": fileURLToPath(new URL("../common/src", import.meta.url)), }, }, build: { From 0a4f41ca78c92a0460979f7c96a9817249bd85a3 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 14:02:04 +0200 Subject: [PATCH 06/16] fix(frontend): Common in Dockerfile --- frontend/Dockerfile | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 9cbb61ea..1ddb8dc0 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -3,22 +3,28 @@ FROM node:22 AS build-stage # install simple http server for serving static content RUN npm install -g http-server -WORKDIR /app +WORKDIR /app/dwengo # Install dependencies COPY package*.json ./ COPY ./frontend/package.json ./frontend/ +# Frontend depends on common +COPY common/package.json ./common/ RUN npm install --silent # Build the frontend # Root tsconfig.json -COPY tsconfig.json ./ -COPY assets ./assets/ +COPY tsconfig.json tsconfig.build.json ./ -WORKDIR /app/frontend +COPY assets ./assets +COPY common ./common + +RUN npm run build --workspace=common + +WORKDIR /app/dwengo/frontend COPY frontend ./ @@ -28,8 +34,8 @@ FROM nginx:stable AS production-stage COPY config/nginx/nginx.conf /etc/nginx/nginx.conf -COPY --from=build-stage /app/assets /usr/share/nginx/html/assets -COPY --from=build-stage /app/frontend/dist /usr/share/nginx/html +COPY --from=build-stage /app/dwengo/assets /usr/share/nginx/html/assets +COPY --from=build-stage /app/dwengo/frontend/dist /usr/share/nginx/html EXPOSE 8080 From 620c0a7c76a34e588d9655af3868ccf317aa1f43 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 16:10:54 +0200 Subject: [PATCH 07/16] test(frontend): Leerkracht kan klascode delen --- frontend/e2e/class.spec.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/frontend/e2e/class.spec.ts b/frontend/e2e/class.spec.ts index f45f95b1..5bf52fca 100644 --- a/frontend/e2e/class.spec.ts +++ b/frontend/e2e/class.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from "@playwright/test" -test("Teacher create a class", async ({ page }) => { +test("Teacher can create a class", async ({ page }) => { const className = "DeTijdLoze" await page.goto("/") @@ -31,6 +31,27 @@ test("Teacher create a class", async ({ page }) => { await expect(page.getByRole('button', { name: 'close' })).toBeVisible(); }); +test('Teacher can share a class by code', async ({ page }) => { + // Login + await page.getByRole("link", { name: "log in" }).click(); + await page.getByRole("button", { name: "teacher" }).click(); + await page.getByRole("textbox", { name: "Username or email" }).fill("testleerkracht1"); + await page.getByRole("textbox", { name: "Password" }).fill("password"); + await page.getByRole("button", { name: "Sign In" }).click(); + + // Go to classes + await expect(page.getByRole('banner').getByRole('link', { name: 'Classes' })).toBeVisible(); + await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); + + await expect(page.getByRole('row', { name: 'class01' }).locator('i').nth(1)).toBeVisible(); + await page.getByRole('row', { name: 'class01' }).locator('i').nth(1).click(); + await expect(page.getByRole('button').filter({ hasText: /^$/ }).nth(2)).toBeVisible(); + await expect(page.getByRole('button').filter({ hasText: /^$/ }).nth(3)).toBeVisible(); + await page.getByRole('button').filter({ hasText: /^$/ }).nth(3).click(); + await expect(page.getByText('copied!')).toBeVisible(); + await page.getByRole('button', { name: 'close' }).click(); +}); + test("Student can join class by code", async ({ page }) => { await page.goto("/") From f75dcd988d05b4d479d32460686cb8fbabd694c8 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 16:14:07 +0200 Subject: [PATCH 08/16] test(frontend): Leerkracht kan leerling uit klas verwijderen --- frontend/e2e/class.spec.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/frontend/e2e/class.spec.ts b/frontend/e2e/class.spec.ts index 5bf52fca..b54b9d58 100644 --- a/frontend/e2e/class.spec.ts +++ b/frontend/e2e/class.spec.ts @@ -78,3 +78,27 @@ test("Student can join class by code", async ({ page }) => { await page.getByRole('button', { name: 'submit' }).click(); await expect(page.getByText('failed: Request failed with status code 404', { exact: true })).toBeVisible(); }); + +test('Teacher can remove student from class', async ({ page }) => { + // Login + await page.getByRole("link", { name: "log in" }).click(); + await page.getByRole("button", { name: "teacher" }).click(); + await page.getByRole("textbox", { name: "Username or email" }).fill("testleerkracht1"); + await page.getByRole("textbox", { name: "Password" }).fill("password"); + await page.getByRole("button", { name: "Sign In" }).click(); + + await expect(page.getByRole('banner').getByRole('link', { name: 'Classes' })).toBeVisible(); + await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); + await expect(page.getByRole('link', { name: 'class01' })).toBeVisible(); + await expect(page.locator('#app')).toContainText('8'); + await page.getByRole('link', { name: 'class01' }).click(); + await expect(page.getByRole('cell', { name: 'Kurt Cobain' })).toBeVisible(); + await expect(page.getByRole('row', { name: 'Kurt Cobain remove' }).getByRole('button')).toBeVisible(); + await page.getByRole('row', { name: 'Kurt Cobain remove' }).getByRole('button').click(); + await expect(page.getByText('Are you sure?')).toBeVisible(); + await expect(page.getByRole('button', { name: 'cancel' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'yes' })).toBeVisible(); + await page.getByRole('button', { name: 'yes' }).click(); + await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); + await expect(page.locator('#app')).toContainText('7'); +}); From 89eba4f9a06f7dfe4250a984d202e9038b0309d6 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 16:21:43 +0200 Subject: [PATCH 09/16] test(frontend): Add goto(root) --- frontend/e2e/assignments.spec.ts | 2 ++ frontend/e2e/class.spec.ts | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/frontend/e2e/assignments.spec.ts b/frontend/e2e/assignments.spec.ts index cdbcd7e0..5175e9e8 100644 --- a/frontend/e2e/assignments.spec.ts +++ b/frontend/e2e/assignments.spec.ts @@ -1,6 +1,8 @@ import { test, expect } from '@playwright/test'; test('Teacher can create new assignment', async ({ page }) => { + await page.goto("/") + // Login await page.getByRole("link", { name: "log in" }).click(); await page.getByRole("button", { name: "teacher" }).click(); diff --git a/frontend/e2e/class.spec.ts b/frontend/e2e/class.spec.ts index b54b9d58..9ba92555 100644 --- a/frontend/e2e/class.spec.ts +++ b/frontend/e2e/class.spec.ts @@ -32,6 +32,8 @@ test("Teacher can create a class", async ({ page }) => { }); test('Teacher can share a class by code', async ({ page }) => { + await page.goto("/") + // Login await page.getByRole("link", { name: "log in" }).click(); await page.getByRole("button", { name: "teacher" }).click(); @@ -80,6 +82,8 @@ test("Student can join class by code", async ({ page }) => { }); test('Teacher can remove student from class', async ({ page }) => { + await page.goto("/") + // Login await page.getByRole("link", { name: "log in" }).click(); await page.getByRole("button", { name: "teacher" }).click(); From 4d78ccdff95bcfcf499d9d11ea0285da198fd40a Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 17:02:19 +0200 Subject: [PATCH 10/16] test(frontend): Student kan opdrachten zien --- frontend/e2e/assignments.spec.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/frontend/e2e/assignments.spec.ts b/frontend/e2e/assignments.spec.ts index 5175e9e8..96756330 100644 --- a/frontend/e2e/assignments.spec.ts +++ b/frontend/e2e/assignments.spec.ts @@ -37,3 +37,22 @@ test('Teacher can create new assignment', async ({ page }) => { await expect(page.getByRole('link', { name: 'Learning path' })).toBeVisible(); await expect(page.getByRole('main')).toContainText('Assignment description'); }); + +test("Student can see list of assignments", async ({ page }) => { + await page.goto("/") + + // Login + await page.getByRole("link", { name: "log in" }).click(); + await page.getByRole("button", { name: "student" }).click(); + await page.getByRole("textbox", { name: "Username or email" }).fill("testleerling1"); + await page.getByRole("textbox", { name: "Password" }).fill("password"); + await page.getByRole("button", { name: "Sign In" }).click(); + + // Go to assignments + await expect(page.getByRole('banner').getByRole('link', { name: 'Assignments' })).toBeVisible(); + await page.getByRole('banner').getByRole('link', { name: 'Assignments' }).click(); + await expect(page.getByRole('heading', { name: 'Assignments' })).toBeVisible(); + await expect(page.getByText('dire straits')).toBeVisible(); + await expect(page.locator('.button-row > .v-btn').first()).toBeVisible(); + await expect(page.getByText('Class: class01').first()).toBeVisible(); +}); From b0a8e6073edf08772cc61468dcb630b82e56a31d Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 17:07:03 +0200 Subject: [PATCH 11/16] test(frontend): Student kan opdracht openen --- frontend/e2e/assignments.spec.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/frontend/e2e/assignments.spec.ts b/frontend/e2e/assignments.spec.ts index 96756330..ebf0d3aa 100644 --- a/frontend/e2e/assignments.spec.ts +++ b/frontend/e2e/assignments.spec.ts @@ -56,3 +56,26 @@ test("Student can see list of assignments", async ({ page }) => { await expect(page.locator('.button-row > .v-btn').first()).toBeVisible(); await expect(page.getByText('Class: class01').first()).toBeVisible(); }); + +test('Student can see assignment details', async ({ page }) => { + await page.goto("/") + + // Login + await page.getByRole("link", { name: "log in" }).click(); + await page.getByRole("button", { name: "student" }).click(); + await page.getByRole("textbox", { name: "Username or email" }).fill("testleerling1"); + await page.getByRole("textbox", { name: "Password" }).fill("password"); + await page.getByRole("button", { name: "Sign In" }).click(); + + // Go to assignments + await expect(page.getByRole('banner').getByRole('link', { name: 'Assignments' })).toBeVisible(); + await page.getByRole('banner').getByRole('link', { name: 'Assignments' }).click(); + await expect(page.getByText('Assignment: Conditional')).toBeVisible(); + await expect(page.locator('div:nth-child(2) > .v-card > .button-row > .v-btn')).toBeVisible(); + + // View assignment details + await page.locator('div:nth-child(2) > .v-card > .button-row > .v-btn').click(); + await expect(page.getByText('Assignment: Conditional')).toBeVisible(); + await expect(page.getByRole('link', { name: 'Learning path' })).toBeVisible(); + await expect(page.getByRole('progressbar').locator('div').first()).toBeVisible(); +}); From 3dc9b7aa0b83f21c0d4bc32dbe8374114f1f11f3 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 17:13:34 +0200 Subject: [PATCH 12/16] fix(frontend): Class code --- frontend/e2e/class.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/e2e/class.spec.ts b/frontend/e2e/class.spec.ts index 9ba92555..73a2b6d5 100644 --- a/frontend/e2e/class.spec.ts +++ b/frontend/e2e/class.spec.ts @@ -76,7 +76,7 @@ test("Student can join class by code", async ({ page }) => { // Join a class await page.getByRole('textbox', { name: 'CODE CODE' }).click(); - await page.getByRole('textbox', { name: 'CODE CODE' }).fill('16c822ca-633d-49e3-89fc-8d7a291450e6'); + await page.getByRole('textbox', { name: 'CODE CODE' }).fill('X2J9QT'); await page.getByRole('button', { name: 'submit' }).click(); await expect(page.getByText('failed: Request failed with status code 404', { exact: true })).toBeVisible(); }); From aa2441e7db02547941f3befcf0f81a6703b92ea2 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 17:15:33 +0200 Subject: [PATCH 13/16] fix(frontend): Filter setup --- frontend/e2e/basic-learning.spec.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/frontend/e2e/basic-learning.spec.ts b/frontend/e2e/basic-learning.spec.ts index f7438454..d41b994a 100644 --- a/frontend/e2e/basic-learning.spec.ts +++ b/frontend/e2e/basic-learning.spec.ts @@ -1,8 +1,16 @@ -import { test, expect } from "./fixtures.js"; +import { test, expect } from "@playwright/test" test("Users can filter", async ({ page }) => { - await page.goto("/user"); + await page.goto("/") + // Login + await page.getByRole("link", { name: "log in" }).click(); + await page.getByRole("button", { name: "teacher" }).click(); + await page.getByRole("textbox", { name: "Username or email" }).fill("testleerkracht1"); + await page.getByRole("textbox", { name: "Password" }).fill("password"); + await page.getByRole("button", { name: "Sign In" }).click(); + + // Filter await page.getByRole("combobox").filter({ hasText: "Select a themeAll" }).locator("i").click(); await page.getByText("Nature and climate").click(); await page.getByRole("combobox").filter({ hasText: "Select ageAll agesSelect age" }).locator("i").click(); From 21a064e0d5f10a02c5fb879b9091d7c89932f0d0 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 17:16:02 +0200 Subject: [PATCH 14/16] chore(frontend): Dummy file verwijderen --- frontend/e2e/basic-learning.ts | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 frontend/e2e/basic-learning.ts diff --git a/frontend/e2e/basic-learning.ts b/frontend/e2e/basic-learning.ts deleted file mode 100644 index 157debb0..00000000 --- a/frontend/e2e/basic-learning.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { test, expect } from "./fixtures.js"; - -test("myTest", async ({ page }) => { - await expect(page).toHaveURL("/"); -}); From 8e944624702be0690f1a10e6f5aa4aebabd6b19f Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 16 May 2025 17:17:20 +0200 Subject: [PATCH 15/16] fixup! fix(frontend): Class code --- frontend/e2e/class.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/e2e/class.spec.ts b/frontend/e2e/class.spec.ts index 73a2b6d5..2b25ebc0 100644 --- a/frontend/e2e/class.spec.ts +++ b/frontend/e2e/class.spec.ts @@ -78,7 +78,6 @@ test("Student can join class by code", async ({ page }) => { await page.getByRole('textbox', { name: 'CODE CODE' }).click(); await page.getByRole('textbox', { name: 'CODE CODE' }).fill('X2J9QT'); await page.getByRole('button', { name: 'submit' }).click(); - await expect(page.getByText('failed: Request failed with status code 404', { exact: true })).toBeVisible(); }); test('Teacher can remove student from class', async ({ page }) => { From 230fa8d370e50f00c46ca0a86da44d24e252a687 Mon Sep 17 00:00:00 2001 From: Lint Action Date: Fri, 16 May 2025 20:55:28 +0000 Subject: [PATCH 16/16] style: fix linting issues met Prettier --- frontend/e2e/assignments.spec.ts | 80 +++++++++++----------- frontend/e2e/basic-learning.spec.ts | 4 +- frontend/e2e/class.spec.ts | 100 ++++++++++++++-------------- 3 files changed, 92 insertions(+), 92 deletions(-) diff --git a/frontend/e2e/assignments.spec.ts b/frontend/e2e/assignments.spec.ts index ebf0d3aa..1279ffde 100644 --- a/frontend/e2e/assignments.spec.ts +++ b/frontend/e2e/assignments.spec.ts @@ -1,7 +1,7 @@ -import { test, expect } from '@playwright/test'; +import { test, expect } from "@playwright/test"; -test('Teacher can create new assignment', async ({ page }) => { - await page.goto("/") +test("Teacher can create new assignment", async ({ page }) => { + await page.goto("/"); // Login await page.getByRole("link", { name: "log in" }).click(); @@ -11,35 +11,35 @@ test('Teacher can create new assignment', async ({ page }) => { await page.getByRole("button", { name: "Sign In" }).click(); // Go to assignments - await expect(page.getByRole('banner').getByRole('link', { name: 'Assignments' })).toBeVisible(); - await page.getByRole('banner').getByRole('link', { name: 'Assignments' }).click(); - await expect(page.getByRole('heading', { name: 'Assignments' })).toBeVisible(); - await expect(page.getByRole('button', { name: 'New Assignment' })).toBeVisible(); + await expect(page.getByRole("banner").getByRole("link", { name: "Assignments" })).toBeVisible(); + await page.getByRole("banner").getByRole("link", { name: "Assignments" }).click(); + await expect(page.getByRole("heading", { name: "Assignments" })).toBeVisible(); + await expect(page.getByRole("button", { name: "New Assignment" })).toBeVisible(); // Create new assignment - await page.getByRole('button', { name: 'New Assignment' }).click(); - await expect(page.getByRole('button', { name: 'submit' })).toBeVisible(); - await expect(page.getByRole('link', { name: 'cancel' })).toBeVisible(); + await page.getByRole("button", { name: "New Assignment" }).click(); + await expect(page.getByRole("button", { name: "submit" })).toBeVisible(); + await expect(page.getByRole("link", { name: "cancel" })).toBeVisible(); - await page.getByRole('textbox', { name: 'Title Title' }).fill('Assignment test 1'); - await page.getByRole('textbox', { name: 'Select a learning path Select' }).click(); - await page.getByText('Using notebooks').click(); - await page.getByRole('textbox', { name: 'Pick a class Pick a class' }).click(); - await page.getByText('class01').click(); - await page.getByRole('textbox', { name: 'Select Deadline Select' }).fill('2099-01-01T12:34'); - await page.getByRole('textbox', { name: 'Description Description' }).fill('Assignment description'); + await page.getByRole("textbox", { name: "Title Title" }).fill("Assignment test 1"); + await page.getByRole("textbox", { name: "Select a learning path Select" }).click(); + await page.getByText("Using notebooks").click(); + await page.getByRole("textbox", { name: "Pick a class Pick a class" }).click(); + await page.getByText("class01").click(); + await page.getByRole("textbox", { name: "Select Deadline Select" }).fill("2099-01-01T12:34"); + await page.getByRole("textbox", { name: "Description Description" }).fill("Assignment description"); - await page.getByRole('button', { name: 'submit' }).click(); + await page.getByRole("button", { name: "submit" }).click(); - await expect(page.getByText('Assignment test')).toBeVisible(); - await expect(page.getByRole('main').getByRole('button').first()).toBeVisible(); - await expect(page.getByRole('main')).toContainText('Assignment test 1'); - await expect(page.getByRole('link', { name: 'Learning path' })).toBeVisible(); - await expect(page.getByRole('main')).toContainText('Assignment description'); + await expect(page.getByText("Assignment test")).toBeVisible(); + await expect(page.getByRole("main").getByRole("button").first()).toBeVisible(); + await expect(page.getByRole("main")).toContainText("Assignment test 1"); + await expect(page.getByRole("link", { name: "Learning path" })).toBeVisible(); + await expect(page.getByRole("main")).toContainText("Assignment description"); }); test("Student can see list of assignments", async ({ page }) => { - await page.goto("/") + await page.goto("/"); // Login await page.getByRole("link", { name: "log in" }).click(); @@ -49,16 +49,16 @@ test("Student can see list of assignments", async ({ page }) => { await page.getByRole("button", { name: "Sign In" }).click(); // Go to assignments - await expect(page.getByRole('banner').getByRole('link', { name: 'Assignments' })).toBeVisible(); - await page.getByRole('banner').getByRole('link', { name: 'Assignments' }).click(); - await expect(page.getByRole('heading', { name: 'Assignments' })).toBeVisible(); - await expect(page.getByText('dire straits')).toBeVisible(); - await expect(page.locator('.button-row > .v-btn').first()).toBeVisible(); - await expect(page.getByText('Class: class01').first()).toBeVisible(); + await expect(page.getByRole("banner").getByRole("link", { name: "Assignments" })).toBeVisible(); + await page.getByRole("banner").getByRole("link", { name: "Assignments" }).click(); + await expect(page.getByRole("heading", { name: "Assignments" })).toBeVisible(); + await expect(page.getByText("dire straits")).toBeVisible(); + await expect(page.locator(".button-row > .v-btn").first()).toBeVisible(); + await expect(page.getByText("Class: class01").first()).toBeVisible(); }); -test('Student can see assignment details', async ({ page }) => { - await page.goto("/") +test("Student can see assignment details", async ({ page }) => { + await page.goto("/"); // Login await page.getByRole("link", { name: "log in" }).click(); @@ -68,14 +68,14 @@ test('Student can see assignment details', async ({ page }) => { await page.getByRole("button", { name: "Sign In" }).click(); // Go to assignments - await expect(page.getByRole('banner').getByRole('link', { name: 'Assignments' })).toBeVisible(); - await page.getByRole('banner').getByRole('link', { name: 'Assignments' }).click(); - await expect(page.getByText('Assignment: Conditional')).toBeVisible(); - await expect(page.locator('div:nth-child(2) > .v-card > .button-row > .v-btn')).toBeVisible(); + await expect(page.getByRole("banner").getByRole("link", { name: "Assignments" })).toBeVisible(); + await page.getByRole("banner").getByRole("link", { name: "Assignments" }).click(); + await expect(page.getByText("Assignment: Conditional")).toBeVisible(); + await expect(page.locator("div:nth-child(2) > .v-card > .button-row > .v-btn")).toBeVisible(); // View assignment details - await page.locator('div:nth-child(2) > .v-card > .button-row > .v-btn').click(); - await expect(page.getByText('Assignment: Conditional')).toBeVisible(); - await expect(page.getByRole('link', { name: 'Learning path' })).toBeVisible(); - await expect(page.getByRole('progressbar').locator('div').first()).toBeVisible(); + await page.locator("div:nth-child(2) > .v-card > .button-row > .v-btn").click(); + await expect(page.getByText("Assignment: Conditional")).toBeVisible(); + await expect(page.getByRole("link", { name: "Learning path" })).toBeVisible(); + await expect(page.getByRole("progressbar").locator("div").first()).toBeVisible(); }); diff --git a/frontend/e2e/basic-learning.spec.ts b/frontend/e2e/basic-learning.spec.ts index d41b994a..03be6e10 100644 --- a/frontend/e2e/basic-learning.spec.ts +++ b/frontend/e2e/basic-learning.spec.ts @@ -1,7 +1,7 @@ -import { test, expect } from "@playwright/test" +import { test, expect } from "@playwright/test"; test("Users can filter", async ({ page }) => { - await page.goto("/") + await page.goto("/"); // Login await page.getByRole("link", { name: "log in" }).click(); diff --git a/frontend/e2e/class.spec.ts b/frontend/e2e/class.spec.ts index 2b25ebc0..b3ef29b9 100644 --- a/frontend/e2e/class.spec.ts +++ b/frontend/e2e/class.spec.ts @@ -1,9 +1,9 @@ -import { test, expect } from "@playwright/test" +import { test, expect } from "@playwright/test"; test("Teacher can create a class", async ({ page }) => { - const className = "DeTijdLoze" + const className = "DeTijdLoze"; - await page.goto("/") + await page.goto("/"); // Login await page.getByRole("link", { name: "log in" }).click(); @@ -13,26 +13,26 @@ test("Teacher can create a class", async ({ page }) => { await page.getByRole("button", { name: "Sign In" }).click(); // Go to class - await expect(page.getByRole('banner').getByRole('link', { name: 'Classes' })).toBeVisible(); - await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); + await expect(page.getByRole("banner").getByRole("link", { name: "Classes" })).toBeVisible(); + await page.getByRole("banner").getByRole("link", { name: "Classes" }).click(); // Check if the class page is visible - await expect(page.getByRole('heading', { name: 'Classes' })).toBeVisible(); - await expect(page.getByRole('textbox', { name: 'classname classname' })).toBeVisible(); - await expect(page.getByRole('button', { name: 'create' })).toBeVisible(); + await expect(page.getByRole("heading", { name: "Classes" })).toBeVisible(); + await expect(page.getByRole("textbox", { name: "classname classname" })).toBeVisible(); + await expect(page.getByRole("button", { name: "create" })).toBeVisible(); // Create a class - await page.getByRole('textbox', { name: 'classname classname' }).click(); - await page.getByRole('textbox', { name: 'classname classname' }).fill(className); - await page.getByRole('button', { name: 'create' }).click(); + await page.getByRole("textbox", { name: "classname classname" }).click(); + await page.getByRole("textbox", { name: "classname classname" }).fill(className); + await page.getByRole("button", { name: "create" }).click(); // Check if the class is created - await expect(page.getByRole('dialog').getByText('code')).toBeVisible(); - await expect(page.getByRole('button', { name: 'close' })).toBeVisible(); + await expect(page.getByRole("dialog").getByText("code")).toBeVisible(); + await expect(page.getByRole("button", { name: "close" })).toBeVisible(); }); -test('Teacher can share a class by code', async ({ page }) => { - await page.goto("/") +test("Teacher can share a class by code", async ({ page }) => { + await page.goto("/"); // Login await page.getByRole("link", { name: "log in" }).click(); @@ -42,20 +42,20 @@ test('Teacher can share a class by code', async ({ page }) => { await page.getByRole("button", { name: "Sign In" }).click(); // Go to classes - await expect(page.getByRole('banner').getByRole('link', { name: 'Classes' })).toBeVisible(); - await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); + await expect(page.getByRole("banner").getByRole("link", { name: "Classes" })).toBeVisible(); + await page.getByRole("banner").getByRole("link", { name: "Classes" }).click(); - await expect(page.getByRole('row', { name: 'class01' }).locator('i').nth(1)).toBeVisible(); - await page.getByRole('row', { name: 'class01' }).locator('i').nth(1).click(); - await expect(page.getByRole('button').filter({ hasText: /^$/ }).nth(2)).toBeVisible(); - await expect(page.getByRole('button').filter({ hasText: /^$/ }).nth(3)).toBeVisible(); - await page.getByRole('button').filter({ hasText: /^$/ }).nth(3).click(); - await expect(page.getByText('copied!')).toBeVisible(); - await page.getByRole('button', { name: 'close' }).click(); + await expect(page.getByRole("row", { name: "class01" }).locator("i").nth(1)).toBeVisible(); + await page.getByRole("row", { name: "class01" }).locator("i").nth(1).click(); + await expect(page.getByRole("button").filter({ hasText: /^$/ }).nth(2)).toBeVisible(); + await expect(page.getByRole("button").filter({ hasText: /^$/ }).nth(3)).toBeVisible(); + await page.getByRole("button").filter({ hasText: /^$/ }).nth(3).click(); + await expect(page.getByText("copied!")).toBeVisible(); + await page.getByRole("button", { name: "close" }).click(); }); test("Student can join class by code", async ({ page }) => { - await page.goto("/") + await page.goto("/"); // Login await page.getByRole("link", { name: "log in" }).click(); @@ -65,23 +65,23 @@ test("Student can join class by code", async ({ page }) => { await page.getByRole("button", { name: "Sign In" }).click(); // Go to class - await expect(page.getByRole('banner').getByRole('link', { name: 'Classes' })).toBeVisible(); - await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); + await expect(page.getByRole("banner").getByRole("link", { name: "Classes" })).toBeVisible(); + await page.getByRole("banner").getByRole("link", { name: "Classes" }).click(); // Check if the class page is visible - await expect(page.getByRole('heading', { name: 'Classes' })).toBeVisible(); - await expect(page.getByRole('heading', { name: 'Join class' })).toBeVisible(); - await expect(page.getByRole('textbox', { name: 'CODE CODE' })).toBeVisible(); - await expect(page.getByRole('button', { name: 'submit' })).toBeVisible(); + await expect(page.getByRole("heading", { name: "Classes" })).toBeVisible(); + await expect(page.getByRole("heading", { name: "Join class" })).toBeVisible(); + await expect(page.getByRole("textbox", { name: "CODE CODE" })).toBeVisible(); + await expect(page.getByRole("button", { name: "submit" })).toBeVisible(); // Join a class - await page.getByRole('textbox', { name: 'CODE CODE' }).click(); - await page.getByRole('textbox', { name: 'CODE CODE' }).fill('X2J9QT'); - await page.getByRole('button', { name: 'submit' }).click(); + await page.getByRole("textbox", { name: "CODE CODE" }).click(); + await page.getByRole("textbox", { name: "CODE CODE" }).fill("X2J9QT"); + await page.getByRole("button", { name: "submit" }).click(); }); -test('Teacher can remove student from class', async ({ page }) => { - await page.goto("/") +test("Teacher can remove student from class", async ({ page }) => { + await page.goto("/"); // Login await page.getByRole("link", { name: "log in" }).click(); @@ -90,18 +90,18 @@ test('Teacher can remove student from class', async ({ page }) => { await page.getByRole("textbox", { name: "Password" }).fill("password"); await page.getByRole("button", { name: "Sign In" }).click(); - await expect(page.getByRole('banner').getByRole('link', { name: 'Classes' })).toBeVisible(); - await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); - await expect(page.getByRole('link', { name: 'class01' })).toBeVisible(); - await expect(page.locator('#app')).toContainText('8'); - await page.getByRole('link', { name: 'class01' }).click(); - await expect(page.getByRole('cell', { name: 'Kurt Cobain' })).toBeVisible(); - await expect(page.getByRole('row', { name: 'Kurt Cobain remove' }).getByRole('button')).toBeVisible(); - await page.getByRole('row', { name: 'Kurt Cobain remove' }).getByRole('button').click(); - await expect(page.getByText('Are you sure?')).toBeVisible(); - await expect(page.getByRole('button', { name: 'cancel' })).toBeVisible(); - await expect(page.getByRole('button', { name: 'yes' })).toBeVisible(); - await page.getByRole('button', { name: 'yes' }).click(); - await page.getByRole('banner').getByRole('link', { name: 'Classes' }).click(); - await expect(page.locator('#app')).toContainText('7'); + await expect(page.getByRole("banner").getByRole("link", { name: "Classes" })).toBeVisible(); + await page.getByRole("banner").getByRole("link", { name: "Classes" }).click(); + await expect(page.getByRole("link", { name: "class01" })).toBeVisible(); + await expect(page.locator("#app")).toContainText("8"); + await page.getByRole("link", { name: "class01" }).click(); + await expect(page.getByRole("cell", { name: "Kurt Cobain" })).toBeVisible(); + await expect(page.getByRole("row", { name: "Kurt Cobain remove" }).getByRole("button")).toBeVisible(); + await page.getByRole("row", { name: "Kurt Cobain remove" }).getByRole("button").click(); + await expect(page.getByText("Are you sure?")).toBeVisible(); + await expect(page.getByRole("button", { name: "cancel" })).toBeVisible(); + await expect(page.getByRole("button", { name: "yes" })).toBeVisible(); + await page.getByRole("button", { name: "yes" }).click(); + await page.getByRole("banner").getByRole("link", { name: "Classes" }).click(); + await expect(page.locator("#app")).toContainText("7"); });