| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- import { describe, it, expect, vi, beforeEach } from 'vitest';
- import { JWTService, JWTPayload } from '../../src/jwt.service.js';
- describe('JWT服务', () => {
- beforeEach(() => {
- vi.stubEnv('JWT_SECRET', 'test-secret');
- vi.stubEnv('JWT_EXPIRES_IN', '1h');
- });
- describe('生成token', () => {
- it('应该成功生成JWT token', () => {
- const payload: JWTPayload = {
- id: 1,
- username: 'testuser',
- roles: ['admin'],
- openid: 'test-openid'
- };
- const token = JWTService.generateToken(payload);
- expect(token).toBeDefined();
- expect(typeof token).toBe('string');
- expect(token.split('.')).toHaveLength(3); // JWT token 有3部分
- });
- it('应该使用自定义过期时间生成token', () => {
- const payload: JWTPayload = {
- id: 1,
- username: 'testuser'
- };
- const token = JWTService.generateToken(payload, '2h');
- expect(token).toBeDefined();
- });
- it('缺少用户ID时应该抛出错误', () => {
- const payload = {
- username: 'testuser'
- } as JWTPayload;
- expect(() => {
- JWTService.generateToken(payload);
- }).toThrow('用户ID和用户名不能为空');
- });
- it('缺少用户名时应该抛出错误', () => {
- const payload = {
- id: 1
- } as JWTPayload;
- expect(() => {
- JWTService.generateToken(payload);
- }).toThrow('用户ID和用户名不能为空');
- });
- });
- describe('验证token', () => {
- it('应该成功验证有效的token', () => {
- const payload: JWTPayload = {
- id: 1,
- username: 'testuser'
- };
- const token = JWTService.generateToken(payload);
- const decoded = JWTService.verifyToken(token);
- expect(decoded.id).toBe(payload.id);
- expect(decoded.username).toBe(payload.username);
- });
- it('验证无效token时应该抛出错误', () => {
- const invalidToken = 'invalid.token.here';
- expect(() => {
- JWTService.verifyToken(invalidToken);
- }).toThrow('无效的token');
- });
- });
- describe('解码token', () => {
- it('应该成功解码token', () => {
- const payload: JWTPayload = {
- id: 1,
- username: 'testuser'
- };
- const token = JWTService.generateToken(payload);
- const decoded = JWTService.decodeToken(token);
- expect(decoded?.id).toBe(payload.id);
- expect(decoded?.username).toBe(payload.username);
- });
- it('解码无效token时应该返回null', () => {
- const invalidToken = 'invalid.token.here';
- const decoded = JWTService.decodeToken(invalidToken);
- expect(decoded).toBeNull();
- });
- });
- describe('获取token剩余时间', () => {
- it('应该返回有效的剩余时间', () => {
- const payload: JWTPayload = {
- id: 1,
- username: 'testuser'
- };
- const token = JWTService.generateToken(payload, '1h');
- const remainingTime = JWTService.getTokenRemainingTime(token);
- expect(remainingTime).toBeGreaterThan(0);
- expect(remainingTime).toBeLessThanOrEqual(3600); // 1小时 = 3600秒
- });
- it('无效token应该返回0', () => {
- const invalidToken = 'invalid.token.here';
- const remainingTime = JWTService.getTokenRemainingTime(invalidToken);
- expect(remainingTime).toBe(0);
- });
- });
- });
|