/** @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() }) })