/** @jest-environment node */ import { NextRequest } from 'next/server' import { getToken } from 'next-auth/jwt' import { middleware } from './middleware' import { createDingtalkPerformanceSessionToken } from '@/lib/dingtalk-performance-session' jest.mock('next-auth/jwt', () => ({ getToken: jest.fn(), })) describe('品牌中心门禁与钉钉绩效调研入口', () => { const originalSecret = process.env.NEXTAUTH_SECRET beforeAll(() => { process.env.NEXTAUTH_SECRET = 'middleware-performance-test-secret' }) afterAll(() => { if (originalSecret === undefined) delete process.env.NEXTAUTH_SECRET else process.env.NEXTAUTH_SECRET = originalSecret }) beforeEach(() => { jest.clearAllMocks() ;(getToken as jest.Mock).mockResolvedValue(null) }) test('带钉钉绩效会话 Cookie 时放行指定调研页面', async () => { const token = createDingtalkPerformanceSessionToken({ id: 'external-user', email: 'external@example.com', username: '跨部门同事', role: 'USER', department: '运营中心', }, { kind: 'assignment', surveyId: 'survey-1', targetId: 'target-1' }) const response = await middleware(new NextRequest( 'https://sc.jiansun.vip/performance-survey/survey/survey-1?targetId=target-1', { headers: { cookie: `dingtalk-performance-session=${token}` } }, )) expect(response.status).toBe(200) expect(response.headers.get('location')).toBeNull() }) test('没有普通会话或钉钉绩效会话时仍跳转登录', async () => { const response = await middleware(new NextRequest( 'https://sc.jiansun.vip/performance-survey/survey/survey-1', )) expect(response.status).toBe(307) expect(response.headers.get('location')).toBe('https://sc.jiansun.vip/login') }) test('外部普通会话访问品牌中心页面仍进入素材库', async () => { ;(getToken as jest.Mock).mockResolvedValue({ canAccessBrandCenter: false }) const response = await middleware(new NextRequest( 'https://sc.jiansun.vip/workspaces/dashboard/core-metrics', )) expect(response.status).toBe(307) expect(response.headers.get('location')).toBe('https://sc.jiansun.vip/assets/material-library') }) test('外部普通会话带钉钉绩效会话时只放行绩效页面', async () => { ;(getToken as jest.Mock).mockResolvedValue({ canAccessBrandCenter: false }) const token = createDingtalkPerformanceSessionToken({ id: 'external-user', email: 'external@example.com', username: '跨部门同事', role: 'USER', department: '运营中心', }, { kind: 'assignment', surveyId: 'survey-1', targetId: 'target-1' }) const response = await middleware(new NextRequest( 'https://sc.jiansun.vip/performance-survey/survey/survey-1?targetId=target-1', { headers: { cookie: `dingtalk-performance-session=${token}` } }, )) expect(response.status).toBe(200) expect(response.headers.get('location')).toBeNull() }) test('评分通知专用会话离开对应评分项时会被送回原评分项', async () => { const token = createDingtalkPerformanceSessionToken({ id: 'external-user', email: 'external@example.com', username: '跨部门同事', role: 'USER', department: '运营中心', }, { kind: 'assignment', surveyId: 'survey-1', targetId: 'target-1' }) const response = await middleware(new NextRequest( 'https://sc.jiansun.vip/performance-survey?tab=manage', { headers: { cookie: `dingtalk-performance-session=${token}` } }, )) expect(response.status).toBe(307) expect(response.headers.get('location')).toBe( 'https://sc.jiansun.vip/performance-survey/survey/survey-1?targetId=target-1', ) }) })