Files
prowler/ui/tests/auth/auth-middleware.spec.ts

78 lines
2.7 KiB
TypeScript

import { expect, test } from "@playwright/test";
import { TEST_CREDENTIALS } from "../helpers";
import { ProvidersPage } from "../providers/providers-page";
import { SignInPage } from "../sign-in-base/sign-in-base-page";
import { SignUpPage } from "../sign-up/sign-up-page";
test.describe("Middleware Error Handling", () => {
// Increase timeout for tests that involve multiple navigations under load
test.setTimeout(60000);
test(
"should allow access to public routes without session",
{ tag: ["@e2e", "@auth", "@middleware", "@AUTH-MW-E2E-001"] },
async ({ page, context }) => {
const signInPage = new SignInPage(page);
const signUpPage = new SignUpPage(page);
await context.clearCookies();
await signInPage.goto();
await signInPage.verifyOnSignInPage();
await signUpPage.goto();
await signUpPage.verifyPageLoaded();
},
);
test(
"should maintain protection after session error",
{ tag: ["@e2e", "@auth", "@middleware", "@AUTH-MW-E2E-002"] },
async ({ page, context, browser }) => {
const signInPage = new SignInPage(page);
const providersPage = new ProvidersPage(page);
await signInPage.loginAndVerify(TEST_CREDENTIALS.VALID);
await providersPage.goto();
await providersPage.verifyPageLoaded();
// Build an isolated context with an explicitly invalid auth token.
// This avoids races from active tabs rehydrating cookies in the original context.
const authenticatedState = await context.storageState();
const authCookies = authenticatedState.cookies.filter((cookie) =>
/(authjs|next-auth)/i.test(cookie.name),
);
expect(authCookies.length).toBeGreaterThan(0);
const invalidSessionContext = await browser.newContext({
storageState: {
origins: authenticatedState.origins,
cookies: authenticatedState.cookies.map((cookie) =>
/(authjs|next-auth)/i.test(cookie.name)
? { ...cookie, value: "invalid.session.token" }
: cookie,
),
},
});
try {
// Use a fresh page to force a full navigation through proxy in Next.js 16.
const freshPage = await invalidSessionContext.newPage();
const freshSignInPage = new SignInPage(freshPage);
const cacheBuster = Date.now();
await freshPage.goto(`/scans?e2e_mw=${cacheBuster}`, {
waitUntil: "commit",
});
await freshSignInPage.verifyRedirectWithCallback("/scans");
} finally {
await invalidSessionContext.close();
}
},
);
// Note: Billing and integrations permission tests removed
// These features only exist in Prowler Cloud, not in the open-source version
});