jwt.service.test.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { describe, it, expect, vi, beforeEach } from 'vitest';
  2. import { JWTService, JWTPayload } from '../../src/jwt.service.js';
  3. describe('JWT服务', () => {
  4. beforeEach(() => {
  5. vi.stubEnv('JWT_SECRET', 'test-secret');
  6. vi.stubEnv('JWT_EXPIRES_IN', '1h');
  7. });
  8. describe('生成token', () => {
  9. it('应该成功生成JWT token', () => {
  10. const payload: JWTPayload = {
  11. id: 1,
  12. username: 'testuser',
  13. roles: ['admin'],
  14. openid: 'test-openid'
  15. };
  16. const token = JWTService.generateToken(payload);
  17. expect(token).toBeDefined();
  18. expect(typeof token).toBe('string');
  19. expect(token.split('.')).toHaveLength(3); // JWT token 有3部分
  20. });
  21. it('应该使用自定义过期时间生成token', () => {
  22. const payload: JWTPayload = {
  23. id: 1,
  24. username: 'testuser'
  25. };
  26. const token = JWTService.generateToken(payload, '2h');
  27. expect(token).toBeDefined();
  28. });
  29. it('缺少用户ID时应该抛出错误', () => {
  30. const payload = {
  31. username: 'testuser'
  32. } as JWTPayload;
  33. expect(() => {
  34. JWTService.generateToken(payload);
  35. }).toThrow('用户ID和用户名不能为空');
  36. });
  37. it('缺少用户名时应该抛出错误', () => {
  38. const payload = {
  39. id: 1
  40. } as JWTPayload;
  41. expect(() => {
  42. JWTService.generateToken(payload);
  43. }).toThrow('用户ID和用户名不能为空');
  44. });
  45. });
  46. describe('验证token', () => {
  47. it('应该成功验证有效的token', () => {
  48. const payload: JWTPayload = {
  49. id: 1,
  50. username: 'testuser'
  51. };
  52. const token = JWTService.generateToken(payload);
  53. const decoded = JWTService.verifyToken(token);
  54. expect(decoded.id).toBe(payload.id);
  55. expect(decoded.username).toBe(payload.username);
  56. });
  57. it('验证无效token时应该抛出错误', () => {
  58. const invalidToken = 'invalid.token.here';
  59. expect(() => {
  60. JWTService.verifyToken(invalidToken);
  61. }).toThrow('无效的token');
  62. });
  63. });
  64. describe('解码token', () => {
  65. it('应该成功解码token', () => {
  66. const payload: JWTPayload = {
  67. id: 1,
  68. username: 'testuser'
  69. };
  70. const token = JWTService.generateToken(payload);
  71. const decoded = JWTService.decodeToken(token);
  72. expect(decoded?.id).toBe(payload.id);
  73. expect(decoded?.username).toBe(payload.username);
  74. });
  75. it('解码无效token时应该返回null', () => {
  76. const invalidToken = 'invalid.token.here';
  77. const decoded = JWTService.decodeToken(invalidToken);
  78. expect(decoded).toBeNull();
  79. });
  80. });
  81. describe('获取token剩余时间', () => {
  82. it('应该返回有效的剩余时间', () => {
  83. const payload: JWTPayload = {
  84. id: 1,
  85. username: 'testuser'
  86. };
  87. const token = JWTService.generateToken(payload, '1h');
  88. const remainingTime = JWTService.getTokenRemainingTime(token);
  89. expect(remainingTime).toBeGreaterThan(0);
  90. expect(remainingTime).toBeLessThanOrEqual(3600); // 1小时 = 3600秒
  91. });
  92. it('无效token应该返回0', () => {
  93. const invalidToken = 'invalid.token.here';
  94. const remainingTime = JWTService.getTokenRemainingTime(invalidToken);
  95. expect(remainingTime).toBe(0);
  96. });
  97. });
  98. });