From 8a1234227a05f18ce159e3b9bd2859e4f66a5dc3 Mon Sep 17 00:00:00 2001 From: Vincent Chalamon <407859+vincentchalamon@users.noreply.github.com> Date: Fri, 19 Apr 2024 17:07:02 +0200 Subject: [PATCH] test: add logout admin e2e test --- pwa/components/admin/authProvider.tsx | 15 +++++----- pwa/tests/User.spec.ts | 4 +-- pwa/tests/admin/User.spec.ts | 41 +++++++++++++++++++++++++++ pwa/tests/admin/pages/UserPage.ts | 4 +++ pwa/tests/admin/test.ts | 5 ++++ 5 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 pwa/tests/admin/User.spec.ts create mode 100644 pwa/tests/admin/pages/UserPage.ts diff --git a/pwa/components/admin/authProvider.tsx b/pwa/components/admin/authProvider.tsx index 25be2f222..a2edcd1eb 100644 --- a/pwa/components/admin/authProvider.tsx +++ b/pwa/components/admin/authProvider.tsx @@ -1,25 +1,24 @@ import { AuthProvider } from "react-admin"; -import { signIn, signOut } from "next-auth/react"; +import { signIn, signOut, useSession } from "next-auth/react"; -import { auth } from "../../app/auth"; import { OIDC_SERVER_URL } from "../../config/keycloak"; const authProvider: AuthProvider = { // Nothing to do here, this function will never be called login: async () => Promise.resolve(), logout: async () => { - const session = await auth(); + const { data: session } = await useSession(); if (!session) { return; } - await signOut(/*{ + await signOut({ // @ts-ignore callbackUrl: `${OIDC_SERVER_URL}/protocol/openid-connect/logout?id_token_hint=${session.idToken}&post_logout_redirect_uri=${window.location.origin}`, - }*/); + }); }, checkError: async (error) => { - const session = await auth(); + const { data: session } = await useSession(); const status = error.status; // @ts-ignore if (!session || session?.error === "RefreshAccessTokenError" || status === 401) { @@ -33,7 +32,7 @@ const authProvider: AuthProvider = { } }, checkAuth: async () => { - const session = await auth(); + const { data: session } = await useSession(); // @ts-ignore if (!session || session?.error === "RefreshAccessTokenError") { await signIn("keycloak"); @@ -46,7 +45,7 @@ const authProvider: AuthProvider = { getPermissions: () => Promise.resolve(), // @ts-ignore getIdentity: async () => { - const session = await auth(); + const { data: session } = await useSession(); return session ? Promise.resolve(session.user) : Promise.reject(); }, diff --git a/pwa/tests/User.spec.ts b/pwa/tests/User.spec.ts index a03bd1a1b..2ea332348 100644 --- a/pwa/tests/User.spec.ts +++ b/pwa/tests/User.spec.ts @@ -5,7 +5,7 @@ test.describe("User authentication", () => { await bookPage.gotoList(); }); - test("I can log in @login", async ({ userPage, page }) => { + test("I can log in Books Store @login", async ({ userPage, page }) => { await expect(page.getByText("Log in")).toBeVisible(); await expect(page.getByText("Sign out")).toHaveCount(0); @@ -22,7 +22,7 @@ test.describe("User authentication", () => { await expect(page.getByText("Sign out")).toBeVisible(); }); - test("I can sign out @login", async ({ userPage, page }) => { + test("I can sign out of Books Store @login", async ({ userPage, page }) => { await page.getByText("Log in").click(); await userPage.login(); await page.getByText("Sign out").click(); diff --git a/pwa/tests/admin/User.spec.ts b/pwa/tests/admin/User.spec.ts new file mode 100644 index 000000000..c8d465fab --- /dev/null +++ b/pwa/tests/admin/User.spec.ts @@ -0,0 +1,41 @@ +import { expect, test } from "./test"; + +test.describe("User authentication", () => { + test.beforeEach(async ({ bookPage }) => { + await bookPage.gotoList(); + }); + + test("I can log in Admin @login", async ({ userPage, page }) => { + await expect(page.getByText("Log in")).toBeVisible(); + await expect(page.getByText("Sign out")).toHaveCount(0); + + await page.getByText("Log in").click(); + await page.getByText("Log in").waitFor({ state: "hidden" }); + // @ts-ignore assert declared on test.ts + await expect(page).toBeOnLoginPage(); + await expect(page.locator("#kc-header-wrapper")).toContainText("API Platform - Demo"); + await expect(page.locator("#kc-form-login")).toContainText("Login as user: john.doe@example.com"); + await expect(page.locator("#kc-form-login")).toContainText("Login as admin: chuck.norris@example.com"); + await userPage.login(); + + await expect(page.getByText("Log in")).toHaveCount(0); + await expect(page.getByText("Sign out")).toBeVisible(); + }); + + test("I can sign out of Admin @login", async ({ userPage, page }) => { + await page.getByText("Log in").click(); + await userPage.login(); + await page.getByText("Sign out").click(); + + await expect(page.getByText("Log in")).toBeVisible(); + await expect(page.getByText("Sign out")).toHaveCount(0); + + // I should be logged out from Keycloak also + await page.getByText("Log in").click(); + // @ts-ignore assert declared on test.ts + await expect(page).toBeOnLoginPage(); + await expect(page.locator("#kc-header-wrapper")).toContainText("API Platform - Demo"); + await expect(page.locator("#kc-form-login")).toContainText("Login as user: john.doe@example.com"); + await expect(page.locator("#kc-form-login")).toContainText("Login as admin: chuck.norris@example.com"); + }); +}); diff --git a/pwa/tests/admin/pages/UserPage.ts b/pwa/tests/admin/pages/UserPage.ts new file mode 100644 index 000000000..d6196b120 --- /dev/null +++ b/pwa/tests/admin/pages/UserPage.ts @@ -0,0 +1,4 @@ +import { AbstractPage } from "./AbstractPage"; + +export class UserPage extends AbstractPage { +} diff --git a/pwa/tests/admin/test.ts b/pwa/tests/admin/test.ts index a5acafa99..a87e58536 100644 --- a/pwa/tests/admin/test.ts +++ b/pwa/tests/admin/test.ts @@ -3,10 +3,12 @@ import { test as playwrightTest } from "@playwright/test"; import { expect } from "../test"; import { BookPage } from "./pages/BookPage"; import { ReviewPage } from "./pages/ReviewPage"; +import { UserPage } from "./pages/UserPage"; type Test = { bookPage: BookPage, reviewPage: ReviewPage, + userPage: UserPage, } export const test = playwrightTest.extend({ @@ -16,6 +18,9 @@ export const test = playwrightTest.extend({ reviewPage: async ({ page }, use) => { await use(new ReviewPage(page)); }, + userPage: async ({ page }, use) => { + await use(new UserPage(page)); + }, }); export { expect };