Files
waoowaoo/tests/helpers/auth.ts

133 lines
2.8 KiB
TypeScript

import { NextResponse } from 'next/server'
import { vi } from 'vitest'
type SessionUser = {
id: string
name?: string | null
email?: string | null
}
type SessionPayload = {
user: SessionUser
}
type MockAuthState = {
session: SessionPayload | null
projectAuthMode: 'allow' | 'forbidden' | 'not_found'
}
const defaultSession: SessionPayload = {
user: {
id: 'test-user-id',
name: 'test-user',
email: 'test@example.com',
},
}
let state: MockAuthState = {
session: defaultSession,
projectAuthMode: 'allow',
}
function unauthorizedResponse() {
return NextResponse.json(
{
success: false,
error: {
code: 'UNAUTHORIZED',
message: 'Unauthorized',
},
},
{ status: 401 },
)
}
function forbiddenResponse() {
return NextResponse.json(
{
success: false,
error: {
code: 'FORBIDDEN',
message: 'Forbidden',
},
},
{ status: 403 },
)
}
function notFoundResponse() {
return NextResponse.json(
{
success: false,
error: {
code: 'NOT_FOUND',
message: 'Project not found',
},
},
{ status: 404 },
)
}
export function installAuthMocks() {
vi.doMock('@/lib/api-auth', () => ({
isErrorResponse: (value: unknown) => value instanceof NextResponse,
requireUserAuth: async () => {
if (!state.session) return unauthorizedResponse()
return { session: state.session }
},
requireProjectAuth: async (projectId: string) => {
if (!state.session) return unauthorizedResponse()
if (state.projectAuthMode === 'forbidden') return forbiddenResponse()
if (state.projectAuthMode === 'not_found') return notFoundResponse()
return {
session: state.session,
project: { id: projectId, userId: state.session.user.id, name: 'project' },
novelData: { id: 'novel-data-id' },
}
},
requireProjectAuthLight: async (projectId: string) => {
if (!state.session) return unauthorizedResponse()
if (state.projectAuthMode === 'forbidden') return forbiddenResponse()
if (state.projectAuthMode === 'not_found') return notFoundResponse()
return {
session: state.session,
project: { id: projectId, userId: state.session.user.id, name: 'project' },
}
},
}))
}
export function mockAuthenticated(userId: string) {
state = {
...state,
session: {
user: {
...defaultSession.user,
id: userId,
},
},
}
}
export function mockUnauthenticated() {
state = {
...state,
session: null,
}
}
export function mockProjectAuth(mode: 'allow' | 'forbidden' | 'not_found') {
state = {
...state,
projectAuthMode: mode,
}
}
export function resetAuthMockState() {
state = {
session: defaultSession,
projectAuthMode: 'allow',
}
vi.doUnmock('@/lib/api-auth')
}