diff --git a/README.md b/README.md index b3e3a07..cb8ca60 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ npm run lint ## Testdatenerstellung durch die Playwright-Tests -Neue Testdaten, die während der Testausführung erstellt werden, haben den Prefix 'TAuto-PW-', gefolgt von einem Buchstaben für den Typ + einen Zufallswert aus der Methode generateRandomString. Der Name einer Rolle ist z.B. TAuto-PW-R-xxxxxxxxx. Somit ist es einfacher, die Testdaten zu erkennen, die durch die Playwright-Tests erstellt wurden. +Neue Testdaten, die während der Testausführung erstellt werden, haben den Prefix 'TAuto-PW-', gefolgt von einem Buchstaben für den Typ des Objekts + einen Zufallswert aus faker oder einem festen Wert. Der Name einer Rolle ist z.B. TAuto-PW-R-xxxxxxxxx. Somit ist es einfacher, die Testdaten zu erkennen, die durch die Playwright-Tests erstellt wurden. ## Hinweise für die Entwicklung der Tests diff --git a/base/api/testHelper.page.ts b/base/api/testHelper.page.ts new file mode 100644 index 0000000..5832209 --- /dev/null +++ b/base/api/testHelper.page.ts @@ -0,0 +1,7 @@ +export interface UserInfo { + username: string, + password: string, + rolleId: string, + organisationId: string, + personId: string; +} \ No newline at end of file diff --git a/base/api/testHelperOrganisation.page.ts b/base/api/testHelperOrganisation.page.ts new file mode 100644 index 0000000..779e3ff --- /dev/null +++ b/base/api/testHelperOrganisation.page.ts @@ -0,0 +1,29 @@ +import { Page, expect } from '@playwright/test'; +import { faker } from "@faker-js/faker/locale/de"; + +const FRONTEND_URL = process.env.FRONTEND_URL || ""; + +export async function createOrganisation(page: Page, name: string): Promise { + const response = await page.request.post(FRONTEND_URL + 'api/organisationen/', { + data: { + "administriertVon": null, + "zugehoerigZu": null, + "kennung": faker.string.numeric({length: 6}), + "name": name, + "namensergaenzung": null, + "kuerzel": null, + "typ": "SCHULE", + "traegerschaft": null + } + }); + expect(response.status()).toBe(201); + const json = await response.json(); + return json.id; +} + +export async function getOrganisationId(page: Page, nameOrganisation: string): Promise { + const response = await page.request.get(FRONTEND_URL + `api/organisationen?name=${nameOrganisation}`, {}); + expect(response.status()).toBe(200); + const json = await response.json(); + return json[0].id; +} \ No newline at end of file diff --git a/base/api/testHelperPerson.page.ts b/base/api/testHelperPerson.page.ts new file mode 100644 index 0000000..6112ca1 --- /dev/null +++ b/base/api/testHelperPerson.page.ts @@ -0,0 +1,40 @@ +import { Page, expect } from '@playwright/test'; +import { getOrganisationId } from "./testHelperOrganisation.page"; +import { createRolle, addSPToRolle } from "./testHelperRolle.page"; +import { UserInfo } from "./testHelper.page"; + +const FRONTEND_URL = process.env.FRONTEND_URL || ""; + +export async function createPerson(page: Page, familienname: string, vorname: string, organisationId: string, rolleId: string): Promise { + const response = await page.request.post(FRONTEND_URL + 'api/personenkontext-workflow/', { + data: { + "familienname": familienname, + "vorname": vorname, + "organisationId": organisationId, + "rolleId": rolleId + } + }); + expect(response.status()).toBe(201); + const json = await response.json(); + return { + username: json.person.referrer, + password: json.person.startpasswort, + rolleId: rolleId, + organisationId: organisationId, + personId: json.person.id + } +} + +export async function createPersonWithUserContext(page: Page, organisationName: string, rollenArt: string, familienname: string, vorname: string, idSP: string, rolleName: string): Promise { + // API-Calls machen und Benutzer mit Kontext anlegen + const organisationId: string = await getOrganisationId(page, organisationName); + const rolleId: string = await createRolle(page, rollenArt, organisationId, rolleName); + await addSPToRolle(page, rolleId, idSP); + const userInfo: UserInfo = await createPerson(page, familienname, vorname, organisationId, rolleId); + return userInfo; +} + +export async function deletePersonen(page: Page, personId: string): Promise { + const response = await page.request.delete(FRONTEND_URL + `api/personen/${personId}`, {}); + expect(response.status()).toBe(204); +} \ No newline at end of file diff --git a/base/api/testHelperRolle.page.ts b/base/api/testHelperRolle.page.ts new file mode 100644 index 0000000..b784d17 --- /dev/null +++ b/base/api/testHelperRolle.page.ts @@ -0,0 +1,41 @@ +import { Page, expect } from '@playwright/test'; + +const FRONTEND_URL = process.env.FRONTEND_URL || ""; + +export async function createRolle(page: Page, rollenArt: string, organisationId: string, rolleName?: string): Promise { + const response = await page.request.post(FRONTEND_URL + 'api/rolle/', { + data: { + "name": rolleName, + "administeredBySchulstrukturknoten": organisationId, + "rollenart": rollenArt, + "merkmale": [], + "systemrechte": [] + } + }); + expect(response.status()).toBe(201); + const json = await response.json(); + return json.id; +} + +export async function addSPToRolle(page: Page, rolleId: string, idSP: string): Promise { + const response = await page.request.post(FRONTEND_URL + `api/rolle/${rolleId}/serviceProviders`, { + data: { + "serviceProviderId": idSP + } + }); + expect(response.status()).toBe(201); +} + +export async function addSystemrechtToRolle(page: Page, rolleId: string, systemrecht: string): Promise { + const response = await page.request.patch(FRONTEND_URL + `api/rolle/${rolleId}`, { + data: { + "systemRecht": systemrecht + } + }); + expect(response.status()).toBe(200); +} + +export async function deleteRolle(page: Page, RolleId: string): Promise { + const response = await page.request.delete(FRONTEND_URL + `api/rolle/${RolleId}`, {}); + expect(response.status()).toBe(204); +} \ No newline at end of file diff --git a/base/api/testHelperServiceprovider.page.ts b/base/api/testHelperServiceprovider.page.ts new file mode 100644 index 0000000..f3db176 --- /dev/null +++ b/base/api/testHelperServiceprovider.page.ts @@ -0,0 +1,18 @@ +import { Page, expect } from '@playwright/test'; + +const FRONTEND_URL = process.env.FRONTEND_URL || ""; + +export async function getSPId(page: Page, nameSP: string): Promise { + const response = await page.request.get(FRONTEND_URL + `api/provider/all`, {}); + expect(response.status()).toBe(200); + const json = await response.json(); + expect(response.status()).toBe(200); + let idSP = ''; + + json.forEach((element) => { + if (element.name === nameSP) { + idSP = element.id; + } + }); + return idSP; +} \ No newline at end of file diff --git a/tests/Klasse.spec.ts b/tests/Klasse.spec.ts index 591cef5..b102df6 100644 --- a/tests/Klasse.spec.ts +++ b/tests/Klasse.spec.ts @@ -6,6 +6,7 @@ import { MenuPage } from "../pages/MenuBar.page"; import { KlasseCreationViewPage } from "../pages/admin/KlasseCreationView.page"; import { KlasseManagementViewPage } from "../pages/admin/KlasseManagementView.page"; import { faker } from "@faker-js/faker/locale/de"; +import { HeaderPage } from "../pages/Header.page"; const PW = process.env.PW; const ADMIN = process.env.USER; @@ -25,6 +26,13 @@ test.describe(`Testfälle für die Administration von Klassen: Umgebung: ${proce }); }); + test.afterEach(async ({ page }) => { + await test.step(`Abmelden`, async () => { + const Header = new HeaderPage(page); + await Header.button_logout.click(); + }); + }); + test("Eine Klasse anlegen und die Klasse anschließend in der Ergebnisliste suchen", async ({ page }) => { const Startseite = new StartPage(page); const Menue = new MenuPage(page); diff --git a/tests/MenuBar.spec.ts b/tests/MenuBar.spec.ts index 3a05489..538148c 100644 --- a/tests/MenuBar.spec.ts +++ b/tests/MenuBar.spec.ts @@ -3,6 +3,7 @@ import { LandingPage } from '../pages/LandingView.page'; import { StartPage } from '../pages/StartView.page'; import { LoginPage } from '../pages/LoginView.page'; import { MenuPage } from '../pages/MenuBar.page'; +import { HeaderPage } from "../pages/Header.page"; const PW = process.env.PW; const ADMIN = process.env.USER; @@ -21,6 +22,13 @@ test.describe(`Testfälle für die Hauptmenue-Leiste: Umgebung: ${process.env.UM await expect(Startseite.text_h2_Ueberschrift).toBeVisible(); }); }); + + test.afterEach(async ({ page }) => { + await test.step(`Abmelden`, async () => { + const Header = new HeaderPage(page); + await Header.button_logout.click(); + }); + }); test('Test der Hauptmenue-Leiste und Untermenues auf Vollständigkeit', async ({ page }) => { const Startseite = new StartPage(page) diff --git a/tests/Person.spec.ts b/tests/Person.spec.ts index 4181ced..ddff0d5 100644 --- a/tests/Person.spec.ts +++ b/tests/Person.spec.ts @@ -25,6 +25,13 @@ test.describe(`Testfälle für die Administration von Personen": Umgebung: ${pro }); }); + test.afterEach(async ({ page }) => { + await test.step(`Login`, async () => { + const Header = new HeaderPage(page); + await Header.button_logout.click(); + }); + }); + test("Einen Benutzer mit der Rolle Lehrkraft anlegen und anschließend mit diesem Benutzer anmelden", async ({ page, }) => { diff --git a/tests/Rolle.spec.ts b/tests/Rolle.spec.ts index 5568c33..3d03387 100644 --- a/tests/Rolle.spec.ts +++ b/tests/Rolle.spec.ts @@ -6,6 +6,7 @@ import { MenuPage } from "../pages/MenuBar.page"; import { RolleCreationViewPage } from "../pages/admin/RolleCreationView.page"; import { RolleManagementViewPage } from "../pages/admin/RolleManagementView.page"; import { faker } from "@faker-js/faker/locale/de"; +import { HeaderPage } from "../pages/Header.page"; const PW = process.env.PW; const ADMIN = process.env.USER; @@ -25,6 +26,13 @@ test.describe(`Testfälle für die Administration von Rollen: Umgebung: ${proces }); }); + test.afterEach(async ({ page }) => { + await test.step(`Abmelden`, async () => { + const Header = new HeaderPage(page); + await Header.button_logout.click(); + }); + }); + test("2 Rollen nacheinander anlegen", async ({ page }) => { const Startseite = new StartPage(page); const Menue = new MenuPage(page); diff --git a/tests/Schule.spec.ts b/tests/Schule.spec.ts index 1bc8fa0..f1dcdbc 100644 --- a/tests/Schule.spec.ts +++ b/tests/Schule.spec.ts @@ -6,6 +6,7 @@ import { MenuPage } from "../pages/MenuBar.page"; import { SchuleCreationViewPage } from "../pages/admin/SchuleCreationView.page"; import { SchuleManagementViewPage } from "../pages/admin/SchuleManagementView.page"; import { faker } from "@faker-js/faker/locale/de"; +import { HeaderPage } from "../pages/Header.page"; const PW = process.env.PW; const ADMIN = process.env.USER; @@ -25,6 +26,13 @@ test.describe(`Testfälle für die Administration von Schulen: Umgebung: ${proce }); }); + test.afterEach(async ({ page }) => { + await test.step(`Abmelden`, async () => { + const Header = new HeaderPage(page); + await Header.button_logout.click(); + }); + }); + test("2 Schulen nacheinander anlegen", async ({ page }) => { const Startseite = new StartPage(page); const Menue = new MenuPage(page); diff --git a/tests/SchulportalAdministration.spec.ts b/tests/SchulportalAdministration.spec.ts new file mode 100644 index 0000000..2757f0e --- /dev/null +++ b/tests/SchulportalAdministration.spec.ts @@ -0,0 +1,120 @@ +import { expect, test } from "@playwright/test"; +import { LandingPage } from "../pages/LandingView.page"; +import { StartPage } from "../pages/StartView.page"; +import { LoginPage } from "../pages/LoginView.page"; +import { HeaderPage } from "../pages/Header.page"; +import { getSPId } from "../base/api/testHelperServiceprovider.page"; +import { createPersonWithUserContext, deletePersonen } from "../base/api/testHelperPerson.page"; +import { addSystemrechtToRolle, deleteRolle } from "../base/api/testHelperRolle.page"; +import { UserInfo } from "../base/api/testHelper.page"; + +const PW = process.env.PW; +const ADMIN = process.env.USER; +const FRONTEND_URL = process.env.FRONTEND_URL || ""; + +test.describe(`Testfälle für Schulportal Administration": Umgebung: ${process.env.UMGEBUNG}: URL: ${process.env.FRONTEND_URL}:`, () => { + test.afterEach(async ({ page }) => { + await test.step(`Abmelden`, async () => { + const Header = new HeaderPage(page); + await Header.button_logout.click(); + }); + }); + + test("Prüfen, dass die Schulportal-Administration Kachel nicht sichtbar ist für Lehrkräfte", async ({page}) => { + const Landing = new LandingPage(page); + const Login = new LoginPage(page); + const Header = new HeaderPage(page); + + // Testdaten erstellen + await page.goto(FRONTEND_URL); + await Landing.button_Anmelden.click(); + await Login.login(ADMIN, PW); + + const idSP = await getSPId(page, 'E-Mail'); + const userInfo: UserInfo = await createPersonWithUserContext(page, 'Testschule Schulportal', 'LEHR', 'TAuto-PW-B-MeierLehrer', 'TAuto-PW-B-Hans', idSP, 'TAuto-PW-R-RolleLehrer'); + await Header.button_logout.click(); + + // Test durchführen + await Landing.button_Anmelden.click(); + await Login.login(userInfo.username, userInfo.password); + await Login.UpdatePW(); + const Startseite = new StartPage(page); + await test.step(`Prüfen, dass die Kachel E-Mail angezeigt wird und die Kachel Schulportal-Administration nicht angezeigt wird`, async () => { + await expect(Startseite.card_item_schulportal_administration).toBeHidden(); + await expect(Startseite.card_item_email).toBeVisible(); + }); + await Header.button_logout.click(); + + // Testdaten löschen + await Landing.button_Anmelden.click(); + await Login.login(ADMIN, PW); + await deletePersonen(page, userInfo.personId); + await deleteRolle(page, userInfo.rolleId); + }); + + test("Prüfen, dass die Schulportal-Administration Kachel nicht sichtbar ist für Schüler", async ({page}) => { + const Landing = new LandingPage(page); + const Login = new LoginPage(page); + const Header = new HeaderPage(page); + + // Testdaten erstellen + await page.goto(FRONTEND_URL); + await Landing.button_Anmelden.click(); + await Login.login(ADMIN, PW); + + const idSP = await getSPId(page, 'itslearning'); + const userInfo: UserInfo = await createPersonWithUserContext(page, 'Testschule Schulportal', 'LERN', 'TAuto-PW-B-JansenSchüler', 'TAuto-PW-B-Helga', idSP, 'TAuto-PW-R-RolleSuS'); + await Header.button_logout.click(); + + // Test durchführen + await Landing.button_Anmelden.click(); + await Login.login(userInfo.username, userInfo.password); + await Login.UpdatePW(); + const Startseite = new StartPage(page); + await test.step(`Prüfen, dass die Kachel E-Mail angezeigt wird und die Kachel Schulportal-Administration nicht angezeigt wird`, async () => { + await expect(Startseite.card_item_schulportal_administration).toBeHidden(); + await expect(Startseite.card_item_itslearning).toBeVisible(); + }); + await Header.button_logout.click(); + + // Testdaten löschen + await Landing.button_Anmelden.click(); + await Login.login(ADMIN, PW); + await deletePersonen(page, userInfo.personId); + await deleteRolle(page, userInfo.rolleId); + }); + + test("Prüfen, dass die Schulportal-Administration Kachel sichtbar ist für Schuladmins", async ({page}) => { + const Landing = new LandingPage(page); + const Login = new LoginPage(page); + const Header = new HeaderPage(page); + + // Testdaten erstellen + await page.goto(FRONTEND_URL); + await Landing.button_Anmelden.click(); + await Login.login(ADMIN, PW); + + const idSP = await getSPId(page, 'Schulportal-Administration'); + const userInfo: UserInfo = await createPersonWithUserContext(page, 'Testschule Schulportal', 'LEIT', 'TAuto-PW-B-MeierAdmin', 'TAuto-PW-B-Peter', idSP, 'TAuto-PW-R-RolleSchuladmin'); + + await addSystemrechtToRolle(page, userInfo.rolleId, 'PERSONEN_VERWALTEN'); + await Header.button_logout.click(); + + // Test durchführen + await Landing.button_Anmelden.click(); + await Login.login(userInfo.username, userInfo.password); + await Login.UpdatePW(); + const Startseite = new StartPage(page); + await test.step(`Prüfen, dass die Kachel E-Mail nicht angezeigt wird und die Kachel Schulportal-Administration angezeigt wird`, async () => { + await expect(Startseite.card_item_schulportal_administration).toBeVisible(); + await expect(Startseite.card_item_email).toBeHidden(); + }); + await Header.button_logout.click(); + + // Testdaten löschen + await Landing.button_Anmelden.click(); + await Login.login(ADMIN, PW); + await deletePersonen(page, userInfo.personId); + await deleteRolle(page, userInfo.rolleId); + }); +}); \ No newline at end of file diff --git a/tests/api.spec.ts b/tests/api.spec.ts index f31e79b..29c1286 100644 --- a/tests/api.spec.ts +++ b/tests/api.spec.ts @@ -4,12 +4,20 @@ import { LandingPage } from '../pages/LandingView.page'; import { StartPage } from '../pages/StartView.page'; import { faker } from "@faker-js/faker/locale/de"; import { PersonManagementViewPage } from "../pages/admin/PersonManagementView.page"; +import { HeaderPage } from "../pages/Header.page"; const PW = process.env.PW; const USER = process.env.USER; const FRONTEND_URL = process.env.FRONTEND_URL || ''; test.describe(`Spike um die API anzusprechen: Umgebung: ${process.env.UMGEBUNG}: URL: ${process.env.FRONTEND_URL}:`, () => { + test.afterEach(async ({ page }) => { + await test.step(`Abmelden`, async () => { + const Header = new HeaderPage(page); + await Header.button_logout.click(); + }); + }); + test('GET und Post request', async ({ page}) => { const Login = new LoginPage(page); const Landing = new LandingPage(page); diff --git a/tests/login.spec.ts b/tests/login.spec.ts index 9a07fd7..604bebb 100644 --- a/tests/login.spec.ts +++ b/tests/login.spec.ts @@ -2,6 +2,7 @@ import { test, expect } from '@playwright/test'; import { LoginPage } from '../pages/LoginView.page'; import { LandingPage } from '../pages/LandingView.page'; import { StartPage } from '../pages/StartView.page'; +import { HeaderPage } from "../pages/Header.page"; const PW = process.env.PW; const USER = process.env.USER; @@ -12,6 +13,7 @@ test.describe(`Testfälle für die Authentifizierung: Umgebung: ${process.env.UM const Login = new LoginPage(page); const Landing = new LandingPage(page); const Start = new StartPage(page); + const Header = new HeaderPage(page); await test.step(`Anmelden mit Benutzer ${USER}`, async () => { await page.goto(FRONTEND_URL); @@ -19,6 +21,7 @@ test.describe(`Testfälle für die Authentifizierung: Umgebung: ${process.env.UM await Landing.button_Anmelden.click(); await Login.login(USER, PW); await expect(Start.text_h2_Ueberschrift).toBeVisible(); + await Header.button_logout.click(); }) })