2026-07-17 20:16:05 +08:00

67 lines
2.4 KiB
TypeScript

/** @jest-environment node */
import { NextRequest } from 'next/server'
import { POST } from './route'
import {
deleteDingtalkLoginHandoff,
getDingtalkLoginHandoff,
} from '@/lib/dingtalk-login-handoff'
describe('POST /api/dingtalk/session-transfer/start', () => {
const originalUseRedis = process.env.USE_REDIS
const originalRedisUrl = process.env.REDIS_URL
const originalOrigins = process.env.DINGTALK_INTERNAL_RETURN_ORIGINS
beforeEach(() => {
process.env.USE_REDIS = 'false'
delete process.env.REDIS_URL
process.env.DINGTALK_INTERNAL_RETURN_ORIGINS = 'http://192.168.58.20:4320'
})
afterAll(() => {
if (originalUseRedis === undefined) delete process.env.USE_REDIS
else process.env.USE_REDIS = originalUseRedis
if (originalRedisUrl === undefined) delete process.env.REDIS_URL
else process.env.REDIS_URL = originalRedisUrl
if (originalOrigins === undefined) delete process.env.DINGTALK_INTERNAL_RETURN_ORIGINS
else process.env.DINGTALK_INTERNAL_RETURN_ORIGINS = originalOrigins
})
test('仅在受信内网入口创建绑定 Cookie 与交接 ID', async () => {
const response = await POST(new NextRequest('https://sc.jiansun.vip/api/dingtalk/session-transfer/start', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Host: '192.168.58.20:4320',
'X-Forwarded-Proto': 'http',
},
body: JSON.stringify({ redirectPath: '/admin?tab=users' }),
}))
const data = await response.json()
expect(data).toMatchObject({ success: true, enabled: true })
expect(response.headers.get('set-cookie')).toContain('dingtalk-login-handoff=')
expect(response.headers.get('set-cookie')).not.toMatch(/;\s*Secure(?:;|$)/i)
const stored = await getDingtalkLoginHandoff(data.handoffId)
expect(stored).toMatchObject({
returnOrigin: 'http://192.168.58.20:4320',
redirectPath: '/admin?tab=users',
})
await deleteDingtalkLoginHandoff(data.handoffId)
})
test('公网入口不创建内网交接记录', async () => {
const response = await POST(new NextRequest('https://sc.jiansun.vip/api/dingtalk/session-transfer/start', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ redirectPath: '/admin' }),
}))
await expect(response.json()).resolves.toEqual({ success: true, enabled: false })
expect(response.headers.get('set-cookie')).toBeNull()
})
})