login.spec.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { describe, it, expect, vi, beforeEach } from 'vitest'
  2. import { login, getInfo, logout, changePassword } from '@/api/login'
  3. import * as request from '@/utils/request'
  4. // Mock request module
  5. vi.mock('@/utils/request', () => ({
  6. get: vi.fn(),
  7. post: vi.fn()
  8. }))
  9. describe('Login API', () => {
  10. beforeEach(() => {
  11. vi.clearAllMocks()
  12. })
  13. describe('login', () => {
  14. it('should call POST /admin/auth/login with credentials', async () => {
  15. const mockResponse = {
  16. code: 200,
  17. message: 'success',
  18. data: {
  19. token: 'test-token',
  20. tokenType: 'Bearer',
  21. expiresIn: 3600,
  22. admin: {
  23. id: 1,
  24. username: 'admin',
  25. nickname: 'Admin',
  26. role: 'admin'
  27. }
  28. }
  29. }
  30. vi.mocked(request.post).mockResolvedValue(mockResponse)
  31. const result = await login({ username: 'admin', password: 'password123' })
  32. expect(request.post).toHaveBeenCalledWith('/admin/auth/login', {
  33. username: 'admin',
  34. password: 'password123'
  35. })
  36. expect(result.code).toBe(200)
  37. expect(result.data.token).toBe('test-token')
  38. })
  39. it('should handle login failure', async () => {
  40. const mockResponse = {
  41. code: 401,
  42. message: '用户名或密码错误',
  43. data: null
  44. }
  45. vi.mocked(request.post).mockResolvedValue(mockResponse)
  46. const result = await login({ username: 'wrong', password: 'wrong' })
  47. expect(result.code).toBe(401)
  48. expect(result.message).toBe('用户名或密码错误')
  49. })
  50. })
  51. describe('getInfo', () => {
  52. it('should call GET /admin/auth/info', async () => {
  53. const mockResponse = {
  54. code: 200,
  55. message: 'success',
  56. data: {
  57. id: 1,
  58. username: 'admin',
  59. nickname: 'Admin',
  60. role: 'admin',
  61. lastLoginAt: '2024-01-01T00:00:00Z'
  62. }
  63. }
  64. vi.mocked(request.get).mockResolvedValue(mockResponse)
  65. const result = await getInfo()
  66. expect(request.get).toHaveBeenCalledWith('/admin/auth/info')
  67. expect(result.code).toBe(200)
  68. expect(result.data.username).toBe('admin')
  69. })
  70. })
  71. describe('logout', () => {
  72. it('should call POST /admin/auth/logout', async () => {
  73. const mockResponse = {
  74. code: 200,
  75. message: 'success',
  76. data: null
  77. }
  78. vi.mocked(request.post).mockResolvedValue(mockResponse)
  79. const result = await logout()
  80. expect(request.post).toHaveBeenCalledWith('/admin/auth/logout')
  81. expect(result.code).toBe(200)
  82. })
  83. })
  84. describe('changePassword', () => {
  85. it('should call POST /admin/auth/password with password data', async () => {
  86. const mockResponse = {
  87. code: 200,
  88. message: '密码修改成功',
  89. data: null
  90. }
  91. vi.mocked(request.post).mockResolvedValue(mockResponse)
  92. const result = await changePassword({
  93. oldPassword: 'oldpass',
  94. newPassword: 'newpass'
  95. })
  96. expect(request.post).toHaveBeenCalledWith('/admin/auth/password', {
  97. oldPassword: 'oldpass',
  98. newPassword: 'newpass'
  99. })
  100. expect(result.code).toBe(200)
  101. })
  102. it('should handle wrong old password', async () => {
  103. const mockResponse = {
  104. code: 400,
  105. message: '原密码错误',
  106. data: null
  107. }
  108. vi.mocked(request.post).mockResolvedValue(mockResponse)
  109. const result = await changePassword({
  110. oldPassword: 'wrongpass',
  111. newPassword: 'newpass'
  112. })
  113. expect(result.code).toBe(400)
  114. expect(result.message).toBe('原密码错误')
  115. })
  116. })
  117. })