/** * User Mock Handlers * 用户相关的 mock 处理器 */ /** * 用户登录 - 成功场景 * * @description 用户登录认证,返回JWT token和用户信息 * @method POST * @url /dr/api/v1/pub/login * @access 公开接口 * * @param {Object} requestBody - 请求体 * @param {string} requestBody.username - 用户名 * @param {string} requestBody.password - 密码 * * @returns {Object} 登录成功响应 * @returns {string} data.token - JWT认证令牌 * @returns {number} data.expire - 令牌过期时间戳 * @returns {number} data.uid - 用户ID * @returns {string} data.name - 用户名 * @returns {string} data.avatar - 用户头像URL * * @example * mockLoginSuccess(); * cy.get('[data-testid="username"]').type('admin'); * cy.get('[data-testid="password"]').type('123456'); * cy.get('[data-testid="login-btn"]').click(); * cy.wait('@loginSuccess'); * * @see docs/DR.md - 章节7 */ export function mockLoginSuccess() { cy.intercept('POST', '/dr/api/v1/pub/login', (req) => { req.reply({ statusCode: 200, body: { code: "0x000000", description: "Success", solution: "", data: { token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", expire: 1751277588, uid: 1, name: "admin", avatar: "" } } }); }).as('loginSuccess'); } /** * 用户登录 - 用户名或密码错误 * * @description 登录失败场景:用户名或密码不正确 * @method POST * @url /dr/api/v1/pub/login * @access 公开接口 * * @returns {Object} 错误响应 * @returns {string} code - 错误码(0x000001) * @returns {string} description - 错误描述 * * @example * mockLoginInvalidCredentials(); * cy.get('[data-testid="login-btn"]').click(); * cy.wait('@loginInvalidCredentials'); * cy.contains('Invalid username or password').should('be.visible'); * * @see docs/DR.md - 章节7 */ export function mockLoginFail() { cy.intercept('POST', '/dr/api/v1/pub/login', (req) => { req.reply({ statusCode: 200, body: { code: "0x000001", description: "Invalid username or password", solution: "Please check your credentials", data: {} } }); }).as('loginFail'); } /** * 获取用户列表 - 成功场景 * * @description 获取系统所有用户列表 * @method GET * @url /dr/api/v1/pub/users * @access 公开接口 * * @returns {string[]} data - 用户名列表 * * @example * mockGetUsersSuccess(); * cy.wait('@getUsersSuccess').its('response.body.data').should('have.length.greaterThan', 0); * * @see docs/DR.md - 章节5 */ export function mockGetUsersSuccess() { cy.intercept('GET', '/dr/api/v1/pub/users', { statusCode: 200, body: { code: "0x000000", data: ["service", "admin", "mgr", "tech"], description: "Success", solution: "" } }).as('getUsersSuccess'); } /** * 获取用户列表 - 空列表场景 * * @description 获取用户列表,返回空列表 * @method GET * @url /dr/api/v1/pub/users * @access 公开接口 * * @returns {string[]} data - 空用户列表 * * @example * mockGetUsersEmpty(); * cy.wait('@getUsersEmpty').its('response.body.data').should('have.length', 0); * * @see docs/DR.md - 章节5 */ export function mockGetUsersEmpty() { cy.intercept('GET', '/dr/api/v1/pub/users', { statusCode: 200, body: { code: "0x000000", data: [], description: "Success", solution: "" } }).as('getUsersEmpty'); } /** * 用户登出 - 成功场景 * * @description 用户登出,清除服务端 session/token * @method POST * @url /dr/api/v1/pub/logout * @access 需要认证 * * @returns {Object} 登出成功响应 * * @example * mockLogoutSuccess(); * cy.get('[data-testid="logout-btn"]').click(); * cy.wait('@logoutSuccess'); * * @see docs/DR.md */ export function mockLogoutSuccess() { cy.intercept('POST', '/dr/api/v1/pub/logout', { statusCode: 200, body: { code: "0x000000", description: "Success", solution: "", data: {} } }).as('logoutSuccess'); }