Andrey Antukh b660ea9d53 Route the app by query string with screen key
Move SPA routing out of the URL fragment into the normal query
string. The screen travels in a reserved `screen` key holding
the route name (`?screen=workspace&team-id=…`); every other
param keeps its name. `rt/nav` and `rt/resolve` keep their
signatures.

This deletes the fragment-mirroring URL surgery, simplifies
link-preview (the server sees everything) and nginx (single
path, no SPA fallback rules needed), and migrates OIDC
redirects, email links, e2e helpers and plugin test utils to
the new format.

Legacy `#/…` URLs translate client-side for one Penpot version
(`legacy-routes`, marked TODO(next-version)); non-SPA paths
are untouched.

AI-assisted-by: muse-spark-1.3-contributor
2026-09-15 17:10:54 +02:00

75 lines
2.1 KiB
JavaScript

import { test, expect } from "@playwright/test";
import { LoginPage } from "../pages/LoginPage";
test.beforeEach(async ({ page }) => {
await LoginPage.init(page);
const login = new LoginPage(page);
await login.initWithLoggedOutUser();
await page.goto("/?screen=auth-login");
});
test("User is redirected to the login page when logged out", async ({
page,
}) => {
const loginPage = new LoginPage(page);
await loginPage.setupLoggedInUser();
await expect(loginPage.page).toHaveURL(/screen=auth-login$/);
await expect(loginPage.initialHeading).toBeVisible();
});
test.describe("Login form", () => {
test("User navigates to register by clicking the create account link", async ({
page,
}) => {
await LoginPage.mockConfigFlags(page, ["registration"]);
await page.goto("/?screen=auth-login");
await page.getByTestId("register-submit").click();
await expect(page).toHaveURL(/screen=auth-register/);
});
test("User logs in by filling the login form", async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.setupLoginSuccess();
await loginPage.setupLoggedInUser();
await loginPage.fillEmailAndPasswordInputs("foo@example.com", "loremipsum");
await loginPage.clickLoginButton();
await page.waitForURL(/screen=dashboard/);
await expect(loginPage.page).toHaveURL(/screen=dashboard/);
});
test("User gets error message when submitting an bad formatted email ", async ({
page,
}) => {
const loginPage = new LoginPage(page);
await loginPage.setupLoginSuccess();
await loginPage.fillEmailAndPasswordInputs("foo", "lorenIpsum");
await expect(loginPage.invalidEmailError).toBeVisible();
});
test("User gets error message when submitting wrong credentials", async ({
page,
}) => {
const loginPage = new LoginPage(page);
await loginPage.setupLoginError();
await loginPage.fillEmailAndPasswordInputs(
"test@example.com",
"loremipsum",
);
await loginPage.clickLoginButton();
await expect(loginPage.invalidCredentialsError).toBeVisible();
await expect(loginPage.page).toHaveURL(/screen=auth-login$/);
});
});