gongxiangp2/middleware.test.ts

83 lines
2.8 KiB
TypeScript

/** @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: '运营中心',
})
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: '运营中心',
})
const response = await middleware(new NextRequest(
'https://sc.jiansun.vip/performance-survey/survey/survey-1',
{ headers: { cookie: `dingtalk-performance-session=${token}` } },
))
expect(response.status).toBe(200)
expect(response.headers.get('location')).toBeNull()
})
})