133 lines
2.8 KiB
TypeScript
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')
|
|
}
|