release: opensource snapshot 2026-02-27 19:25:00
This commit is contained in:
132
tests/helpers/auth.ts
Normal file
132
tests/helpers/auth.ts
Normal file
@@ -0,0 +1,132 @@
|
||||
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')
|
||||
}
|
||||
Reference in New Issue
Block a user