admin/lib/refreshSessionCookie.test.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

38 lines
1.6 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
expiredRefreshSessionSetCookieHeaders,
hasRefreshSessionCookie,
REFRESH_TOKEN_COOKIE_DEV,
REFRESH_TOKEN_COOKIE_HOST,
} from '@/lib/refreshSessionCookie'
describe('hasRefreshSessionCookie', () => {
it('detects the production __Host- cookie name', () => {
expect(hasRefreshSessionCookie((name) => (name === REFRESH_TOKEN_COOKIE_HOST ? { value: 'secret' } : undefined))).toBe(true)
})
it('detects the local HTTP cookie name', () => {
expect(hasRefreshSessionCookie((name) => (name === REFRESH_TOKEN_COOKIE_DEV ? { value: 'secret' } : undefined))).toBe(true)
})
it('ignores the legacy JS-readable refreshToken name', () => {
expect(hasRefreshSessionCookie((name) => (name === 'refreshToken' ? { value: 'secret' } : undefined))).toBe(false)
})
})
describe('expiredRefreshSessionSetCookieHeaders', () => {
it('expires both Nest names with HttpOnly Path=/ and Max-Age=0', () => {
const headers = expiredRefreshSessionSetCookieHeaders()
const hostHeader = headers.find((header) => header.startsWith(`${REFRESH_TOKEN_COOKIE_HOST}=`))
const insecureDev = headers.find((header) => header.startsWith(`${REFRESH_TOKEN_COOKIE_DEV}=`) && !header.includes('Secure'))
const secureDev = headers.find((header) => header.startsWith(`${REFRESH_TOKEN_COOKIE_DEV}=`) && header.includes('Secure'))
expect(insecureDev).toContain('HttpOnly')
expect(secureDev).toContain('HttpOnly')
expect(hostHeader).toContain('Secure')
expect(hostHeader).toContain('HttpOnly')
expect(headers.every((header) => header.includes('Path=/') && header.includes('Max-Age=0'))).toBe(true)
})
})