admin/e2e/fixtures/session.ts
alisaza e1eaf5eff5 feat: initial ghabilee-admin backoffice app
Extract admin dashboard from ghabilee-frontend2 into a dedicated Next.js
app for backoffice.ghabilee.ir (no SEO indexing / Clarity).
2026-09-05 13:12:59 +03:30

59 lines
1.8 KiB
TypeScript

import type { BrowserContext, Page } from '@playwright/test'
import { REFRESH_TOKEN_COOKIE_DEV } from '@/lib/refreshSessionCookie'
export const createAccessToken = (role: 'admin' | 'user' = 'user') => {
const payload = Buffer.from(
JSON.stringify({
sub: `${role}-id`,
role,
sessionId: `${role}-session`,
exp: Math.floor(Date.now() / 1000) + 3600,
})
).toString('base64url')
return `header.${payload}.signature`
}
export const E2E_MOCK_REFRESH_TOKEN = 'e2e-mock-refresh-token'
export const nestRefreshCookie = (value = E2E_MOCK_REFRESH_TOKEN) => ({
name: REFRESH_TOKEN_COOKIE_DEV,
value,
domain: '127.0.0.1',
path: '/',
httpOnly: true as const,
sameSite: 'Lax' as const,
})
export async function authenticateAs(context: BrowserContext, page: Page, role: 'admin' | 'user' = 'user') {
const accessToken = createAccessToken(role)
const expiresAt = Date.now() + 30 * 24 * 60 * 60 * 1000
await context.addCookies([
{ name: 'accessToken', value: accessToken, domain: '127.0.0.1', path: '/' },
nestRefreshCookie(),
{ name: 'userRole', value: role, domain: '127.0.0.1', path: '/' },
{ name: 'userStatus', value: 'active', domain: '127.0.0.1', path: '/' },
])
await page.addInitScript(
({ token, refreshExpiry, userRole }) => {
localStorage.setItem(
'user',
JSON.stringify({
accessToken: token,
userId: `${userRole}-id`,
role: userRole,
sessionId: `${userRole}-session`,
AccessTokenExpireTime: Date.now() + 3600_000,
refreshTokenExpireTime: refreshExpiry,
status: 'active',
})
)
},
{ token: accessToken, refreshExpiry: expiresAt, userRole: role }
)
}
export const authenticateConsumer = (context: BrowserContext, page: Page) => authenticateAs(context, page, 'user')