Files
eSIM-Tools/tests/simyo/auth-handler.test.js
Abner 4c8ab4b916 📝 docs: 规范 Simyo 客户端与接口注释表述
将注释与测试描述改为中性技术说明,仅保留接口路径与配置语义。
2026-07-22 19:26:13 +08:00

92 lines
3.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';
/**
* Simyo AuthHandler 冒烟测试
*/
import { authHandler, isMfaDisabledOrComplete } from '../../src/simyo/js/modules/auth-handler.js';
import { stateManager } from '../../src/simyo/js/modules/state-manager.js';
describe('Simyo AuthHandler', () => {
beforeEach(() => {
stateManager.clearSession();
global.fetch.mockReset();
});
it('非法手机号应直接抛错且不发起请求', async () => {
await expect(authHandler.login('123', 'secret')).rejects.toThrow();
expect(global.fetch).not.toHaveBeenCalled();
});
it('缺少密码应直接抛错且不发起请求', async () => {
await expect(authHandler.login('0612345678', '')).rejects.toThrow();
expect(global.fetch).not.toHaveBeenCalled();
});
it('登录成功应写入 token/手机号,且不保留 password', async () => {
// 登录响应:无顶层 successresult 内无 success 字段
global.fetch.mockResolvedValueOnce({
ok: true,
headers: { get: () => 'application/json' },
json: async () => ({
result: {
sessionToken: 'sess-abc',
mfaStatus: 'DISABLED_BY_CUSTOMER',
mfaMethod: '',
methodHint: ''
}
})
});
const result = await authHandler.login('0612345678', 'super-secret');
expect(result.success).toBe(true);
expect(result.sessionToken).toBe('sess-abc');
expect(stateManager.get('sessionToken')).toBe('sess-abc');
expect(stateManager.get('phoneNumber')).toBe('0612345678');
expect(stateManager.get('mfaStatus')).toBe('DISABLED_BY_CUSTOMER');
expect(stateManager.get('password')).toBeUndefined();
expect(Object.prototype.hasOwnProperty.call(stateManager.getState(), 'password')).toBe(false);
expect(authHandler.isLoggedIn()).toBe(true);
});
it('MFA 未关闭时应阻断并提示', async () => {
global.fetch.mockResolvedValueOnce({
ok: true,
headers: { get: () => 'application/json' },
json: async () => ({
result: {
sessionToken: 'sess-mfa',
mfaStatus: 'REQUIRED',
mfaMethod: 'EMAIL',
methodHint: 'email'
}
})
});
await expect(authHandler.login('0612345678', 'secret')).rejects.toThrow(/MFA|二次验证|mfa/i);
expect(stateManager.get('sessionToken')).toBe('sess-mfa');
});
it('响应缺少 sessionToken 应抛错', async () => {
global.fetch.mockResolvedValueOnce({
ok: true,
headers: { get: () => 'application/json' },
json: async () => ({
success: true,
result: {},
message: 'no token'
})
});
await expect(authHandler.login('0612345678', 'secret')).rejects.toThrow();
expect(stateManager.get('sessionToken')).toBe('');
});
it('isMfaDisabledOrComplete 识别 DISABLED_BY_CUSTOMER', () => {
expect(isMfaDisabledOrComplete('DISABLED_BY_CUSTOMER')).toBe(true);
expect(isMfaDisabledOrComplete('REQUIRED')).toBe(false);
expect(isMfaDisabledOrComplete('')).toBe(true);
});
});