/** * 認證流程端到端場景 * * 此模組提供完整的認證流程場景,組合多個 API 場景形成業務流程。 * * 使用方式: * import { registerAndLoginFlow, loginAndRefreshFlow, passwordResetFlow } from './scenarios/e2e/authentication-flow.js'; */ import * as auth from '../apis/auth.js'; import { sleep } from 'k6'; /** * 註冊後立即登入流程 * @param {Object} options - 配置選項 * @param {string} options.baseUrl - API 基礎 URL * @param {string} options.loginId - 登入 ID * @param {string} options.password - 密碼 * @param {Object} options.customMetrics - 自定義指標對象(可選) * @returns {Object} 流程結果 */ export function registerAndLoginFlow(options = {}) { const { baseUrl = __ENV.BASE_URL || 'https://localhost:8888', loginId = `test_${Date.now()}@example.com`, password = 'Test123456!', customMetrics = null, } = options; // 步驟 1: 註冊 const registerResult = auth.registerWithCredentials({ baseUrl, loginId, password, customMetrics, }); if (!registerResult.success || !registerResult.tokens) { return { success: false, step: 'register', error: 'Registration failed', registerResult, }; } // 短暫等待,模擬真實用戶行為 sleep(1); // 步驟 2: 使用註冊的帳號登入 const loginResult = auth.loginWithCredentials({ baseUrl, loginId, password, customMetrics, }); if (!loginResult.success || !loginResult.tokens) { return { success: false, step: 'login', error: 'Login failed after registration', registerResult, loginResult, }; } return { success: true, registerResult, loginResult, tokens: loginResult.tokens, }; } /** * 登入後刷新 Token 流程 * @param {Object} options - 配置選項 * @param {string} options.baseUrl - API 基礎 URL * @param {string} options.loginId - 登入 ID * @param {string} options.password - 密碼 * @param {Object} options.customMetrics - 自定義指標對象(可選) * @returns {Object} 流程結果 */ export function loginAndRefreshFlow(options = {}) { const { baseUrl = __ENV.BASE_URL || 'https://localhost:8888', loginId, password, customMetrics = null, } = options; if (!loginId || !password) { throw new Error('loginId and password are required'); } // 步驟 1: 登入 const loginResult = auth.loginWithCredentials({ baseUrl, loginId, password, customMetrics, }); if (!loginResult.success || !loginResult.tokens) { return { success: false, step: 'login', error: 'Login failed', loginResult, }; } // 短暫等待 sleep(1); // 步驟 2: 刷新 Token const refreshResult = auth.refreshToken({ baseUrl, accessToken: loginResult.tokens.accessToken, refreshToken: loginResult.tokens.refreshToken, customMetrics, }); if (!refreshResult.success || !refreshResult.tokens) { return { success: false, step: 'refresh', error: 'Token refresh failed', loginResult, refreshResult, }; } return { success: true, loginResult, refreshResult, tokens: refreshResult.tokens, }; } /** * 完整密碼重設流程(請求 → 驗證 → 重設) * @param {Object} options - 配置選項 * @param {string} options.baseUrl - API 基礎 URL * @param {string} options.identifier - 使用者帳號(email 或 phone) * @param {string} options.accountType - 帳號類型(email/phone) * @param {string} options.verifyCode - 驗證碼(在實際測試中可能需要從外部獲取) * @param {string} options.newPassword - 新密碼 * @returns {Object} 流程結果 */ export function passwordResetFlow(options = {}) { const { baseUrl = __ENV.BASE_URL || 'https://localhost:8888', identifier, accountType = 'email', verifyCode, newPassword = 'NewPassword123!', } = options; if (!identifier) { throw new Error('identifier is required'); } // 步驟 1: 請求密碼重設驗證碼 const requestResult = auth.requestPasswordReset({ baseUrl, identifier, accountType, }); if (!requestResult.success) { return { success: false, step: 'request', error: 'Request password reset failed', requestResult, }; } // 短暫等待,模擬用戶收到驗證碼的時間 sleep(2); // 步驟 2: 驗證密碼重設驗證碼 if (!verifyCode) { // 在實際測試中,驗證碼可能需要從外部獲取(如測試資料庫、郵件服務等) return { success: false, step: 'verify', error: 'verifyCode is required but not provided', requestResult, note: 'In real testing, verifyCode should be retrieved from external source (DB, email service, etc.)', }; } const verifyResult = auth.verifyPasswordResetCode({ baseUrl, identifier, verifyCode, }); if (!verifyResult.success) { return { success: false, step: 'verify', error: 'Verify password reset code failed', requestResult, verifyResult, }; } // 短暫等待 sleep(1); // 步驟 3: 執行密碼重設 const resetResult = auth.resetPassword({ baseUrl, identifier, verifyCode, newPassword, }); if (!resetResult.success) { return { success: false, step: 'reset', error: 'Reset password failed', requestResult, verifyResult, resetResult, }; } return { success: true, requestResult, verifyResult, resetResult, }; }