UNPKG

@vestige06/medusa-auth-wechat

Version:

Medusa 微信小程序第三方登录认证插件

180 lines 13.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const wechat_auth_1 = require("../wechat-auth"); // Mock fetch global.fetch = jest.fn(); describe('WechatAuthProvider', () => { let provider; const mockOptions = { appId: 'test_app_id', appSecret: 'test_app_secret' }; beforeEach(() => { provider = new wechat_auth_1.WechatAuthProvider(mockOptions); jest.clearAllMocks(); }); describe('authenticate', () => { /** * 测试成功认证流程 */ it('should authenticate successfully with valid code', async () => { // Mock 微信 API 响应 const mockWechatResponse = { openid: 'test_openid', session_key: 'test_session_key', unionid: 'test_unionid' }; fetch.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(mockWechatResponse) }); const authInput = { url: '/auth/wechat', headers: {}, body: { code: 'valid_code', userInfo: { nickName: '测试用户', avatarUrl: 'https://example.com/avatar.jpg' } }, authScope: 'customer' }; const result = await provider.authenticate(authInput); expect(result.success).toBe(true); expect(result.authIdentity).toBeDefined(); expect(result.authIdentity?.entity_id).toBe('test_openid'); expect(result.authIdentity?.user_metadata.openid).toBe('test_openid'); expect(result.authIdentity?.user_metadata.unionid).toBe('test_unionid'); expect(result.authIdentity?.app_metadata.provider).toBe('wechat'); }); /** * 测试缺少 code 的情况 */ it('should fail when code is missing', async () => { const authInput = { url: '/auth/wechat', headers: {}, body: {}, authScope: 'customer' }; const result = await provider.authenticate(authInput); expect(result.success).toBe(false); expect(result.error).toBe('缺少微信登录凭证'); }); /** * 测试微信 API 返回错误的情况 */ it('should fail when wechat API returns error', async () => { const mockWechatResponse = { errcode: 40013, errmsg: 'invalid appid' }; fetch.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(mockWechatResponse) }); const authInput = { url: '/auth/wechat', headers: {}, body: { code: 'invalid_code' }, authScope: 'customer' }; const result = await provider.authenticate(authInput); expect(result.success).toBe(false); expect(result.error).toBe('invalid appid'); }); /** * 测试网络请求失败的情况 */ it('should handle network errors', async () => { ; fetch.mockRejectedValueOnce(new Error('Network error')); const authInput = { url: '/auth/wechat', headers: {}, body: { code: 'valid_code' }, authScope: 'customer' }; const result = await provider.authenticate(authInput); expect(result.success).toBe(false); expect(result.error).toBe('认证过程中发生错误'); }); /** * 测试微信 API HTTP 错误响应 */ it('should handle HTTP errors from wechat API', async () => { ; fetch.mockResolvedValueOnce({ ok: false, status: 500 }); const authInput = { url: '/auth/wechat', headers: {}, body: { code: 'valid_code' }, authScope: 'customer' }; const result = await provider.authenticate(authInput); expect(result.success).toBe(false); expect(result.error).toBe('认证过程中发生错误'); }); }); describe('validateCallback', () => { /** * 测试回调验证(微信小程序通常不需要) */ it('should always return success for callback validation', async () => { const authInput = { url: '/auth/wechat/callback', headers: {}, body: {}, authScope: 'customer', authIdentity: { entity_id: 'test_openid', user_metadata: {}, app_metadata: {} } }; const result = await provider.validateCallback(authInput); expect(result.success).toBe(true); expect(result.authIdentity).toBe(authInput.authIdentity); }); }); describe('getWechatSession', () => { /** * 测试微信 API 请求 URL 构建 */ it('should construct correct wechat API URL', async () => { const mockWechatResponse = { openid: 'test_openid', session_key: 'test_session_key' }; fetch.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(mockWechatResponse) }); const authInput = { url: '/auth/wechat', headers: {}, body: { code: 'test_code' }, authScope: 'customer' }; await provider.authenticate(authInput); expect(fetch).toHaveBeenCalledWith(expect.stringContaining('https://api.weixin.qq.com/sns/jscode2session')); expect(fetch).toHaveBeenCalledWith(expect.stringContaining('appid=test_app_id')); expect(fetch).toHaveBeenCalledWith(expect.stringContaining('secret=test_app_secret')); expect(fetch).toHaveBeenCalledWith(expect.stringContaining('js_code=test_code')); expect(fetch).toHaveBeenCalledWith(expect.stringContaining('grant_type=authorization_code')); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0LWF1dGgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvX190ZXN0c19fL3dlY2hhdC1hdXRoLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxnREFBbUQ7QUFHbkQsYUFBYTtBQUNiLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFBO0FBRXhCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsSUFBSSxRQUE0QixDQUFBO0lBQ2hDLE1BQU0sV0FBVyxHQUFHO1FBQ2xCLEtBQUssRUFBRSxhQUFhO1FBQ3BCLFNBQVMsRUFBRSxpQkFBaUI7S0FDN0IsQ0FBQTtJQUVELFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxRQUFRLEdBQUcsSUFBSSxnQ0FBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM5QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDdEIsQ0FBQyxDQUFDLENBQUE7SUFFRixRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtRQUM1Qjs7V0FFRztRQUNILEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNoRSxpQkFBaUI7WUFDakIsTUFBTSxrQkFBa0IsR0FBRztnQkFDekIsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLFdBQVcsRUFBRSxrQkFBa0I7Z0JBQy9CLE9BQU8sRUFBRSxjQUFjO2FBQ3hCLENBRUE7WUFBQyxLQUFtQixDQUFDLHFCQUFxQixDQUFDO2dCQUMxQyxFQUFFLEVBQUUsSUFBSTtnQkFDUixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQzthQUNoRCxDQUFDLENBQUE7WUFFRixNQUFNLFNBQVMsR0FBd0I7Z0JBQ3JDLEdBQUcsRUFBRSxjQUFjO2dCQUNuQixPQUFPLEVBQUUsRUFBRTtnQkFDWCxJQUFJLEVB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