user.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /**
  2. * User Mock Handlers
  3. * 用户相关的 mock 处理器
  4. */
  5. /**
  6. * 用户登录 - 成功场景
  7. *
  8. * @description 用户登录认证,返回JWT token和用户信息
  9. * @method POST
  10. * @url /dr/api/v1/pub/login
  11. * @access 公开接口
  12. *
  13. * @param {Object} requestBody - 请求体
  14. * @param {string} requestBody.username - 用户名
  15. * @param {string} requestBody.password - 密码
  16. *
  17. * @returns {Object} 登录成功响应
  18. * @returns {string} data.token - JWT认证令牌
  19. * @returns {number} data.expire - 令牌过期时间戳
  20. * @returns {number} data.uid - 用户ID
  21. * @returns {string} data.name - 用户名
  22. * @returns {string} data.avatar - 用户头像URL
  23. *
  24. * @example
  25. * mockLoginSuccess();
  26. * cy.get('[data-testid="username"]').type('admin');
  27. * cy.get('[data-testid="password"]').type('123456');
  28. * cy.get('[data-testid="login-btn"]').click();
  29. * cy.wait('@loginSuccess');
  30. *
  31. * @see docs/DR.md - 章节7
  32. */
  33. export function mockLoginSuccess() {
  34. cy.intercept('POST', '/dr/api/v1/pub/login', (req) => {
  35. req.reply({
  36. statusCode: 200,
  37. body: {
  38. code: "0x000000",
  39. description: "Success",
  40. solution: "",
  41. data: {
  42. token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  43. expire: 1751277588,
  44. uid: 1,
  45. name: "admin",
  46. avatar: ""
  47. }
  48. }
  49. });
  50. }).as('loginSuccess');
  51. }
  52. /**
  53. * 用户登录 - 用户名或密码错误
  54. *
  55. * @description 登录失败场景:用户名或密码不正确
  56. * @method POST
  57. * @url /dr/api/v1/pub/login
  58. * @access 公开接口
  59. *
  60. * @returns {Object} 错误响应
  61. * @returns {string} code - 错误码(0x000001)
  62. * @returns {string} description - 错误描述
  63. *
  64. * @example
  65. * mockLoginInvalidCredentials();
  66. * cy.get('[data-testid="login-btn"]').click();
  67. * cy.wait('@loginInvalidCredentials');
  68. * cy.contains('Invalid username or password').should('be.visible');
  69. *
  70. * @see docs/DR.md - 章节7
  71. */
  72. export function mockLoginFail() {
  73. cy.intercept('POST', '/dr/api/v1/pub/login', (req) => {
  74. req.reply({
  75. statusCode: 200,
  76. body: {
  77. code: "0x000001",
  78. description: "Invalid username or password",
  79. solution: "Please check your credentials",
  80. data: {}
  81. }
  82. });
  83. }).as('loginFail');
  84. }
  85. /**
  86. * 获取用户列表 - 成功场景
  87. *
  88. * @description 获取系统所有用户列表
  89. * @method GET
  90. * @url /dr/api/v1/pub/users
  91. * @access 公开接口
  92. *
  93. * @returns {string[]} data - 用户名列表
  94. *
  95. * @example
  96. * mockGetUsersSuccess();
  97. * cy.wait('@getUsersSuccess').its('response.body.data').should('have.length.greaterThan', 0);
  98. *
  99. * @see docs/DR.md - 章节5
  100. */
  101. export function mockGetUsersSuccess() {
  102. cy.intercept('GET', '/dr/api/v1/pub/users', {
  103. statusCode: 200,
  104. body: {
  105. code: "0x000000",
  106. data: ["service", "admin", "mgr", "tech"],
  107. description: "Success",
  108. solution: ""
  109. }
  110. }).as('getUsersSuccess');
  111. }
  112. /**
  113. * 获取用户列表 - 空列表场景
  114. *
  115. * @description 获取用户列表,返回空列表
  116. * @method GET
  117. * @url /dr/api/v1/pub/users
  118. * @access 公开接口
  119. *
  120. * @returns {string[]} data - 空用户列表
  121. *
  122. * @example
  123. * mockGetUsersEmpty();
  124. * cy.wait('@getUsersEmpty').its('response.body.data').should('have.length', 0);
  125. *
  126. * @see docs/DR.md - 章节5
  127. */
  128. export function mockGetUsersEmpty() {
  129. cy.intercept('GET', '/dr/api/v1/pub/users', {
  130. statusCode: 200,
  131. body: {
  132. code: "0x000000",
  133. data: [],
  134. description: "Success",
  135. solution: ""
  136. }
  137. }).as('getUsersEmpty');
  138. }
  139. /**
  140. * 用户登出 - 成功场景
  141. *
  142. * @description 用户登出,清除服务端 session/token
  143. * @method POST
  144. * @url /dr/api/v1/pub/logout
  145. * @access 需要认证
  146. *
  147. * @returns {Object} 登出成功响应
  148. *
  149. * @example
  150. * mockLogoutSuccess();
  151. * cy.get('[data-testid="logout-btn"]').click();
  152. * cy.wait('@logoutSuccess');
  153. *
  154. * @see docs/DR.md
  155. */
  156. export function mockLogoutSuccess() {
  157. cy.intercept('POST', '/dr/api/v1/pub/logout', {
  158. statusCode: 200,
  159. body: {
  160. code: "0x000000",
  161. description: "Success",
  162. solution: "",
  163. data: {}
  164. }
  165. }).as('logoutSuccess');
  166. }