@vestige06/medusa-auth-wechat
Version:
Medusa 微信小程序第三方登录认证插件
180 lines • 13.5 kB
JavaScript
"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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