67 lines
2.4 KiB
TypeScript
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()
|
|
})
|
|
})
|