import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; import { afterAll, afterEach } from 'vitest'; const genWeChatMpPage = (rich_media_content: string, scripts: string[] | string) => { if (!Array.isArray(scripts)) { scripts = [scripts]; } let pageHtml = `
mpName
`; for (const script of scripts) { pageHtml += ` `; } return pageHtml; }; const server = setupServer( http.post('https://api.openai.mock/v1/chat/completions', () => HttpResponse.json({ choices: [ { message: { content: 'AI processed content.', }, }, ], }) ), http.get('http://rsshub.test/config', () => HttpResponse.json({ UA: 'test', }) ), http.get('http://rsshub.test/buildData', () => HttpResponse.text(`
`) ), http.get('https://mp.weixin.qq.com/rsshub_test/appMsg', () => HttpResponse.text( genWeChatMpPage( ` description `, ` var item_show_type = "0"; var real_item_show_type = "0"; var appmsg_type = "9"; var ct = "${1_636_626_300}"; var msg_source_url = "https://mp.weixin.qq.com/rsshub_test/fake"; window.ip_wording = { countryName: '中国', countryId: '156', provinceName: '福建', provinceId: '', cityName: '', cityId: '' };` ) ) ), http.get('https://mp.weixin.qq.com/rsshub_test/original_empty', () => HttpResponse.text( `
mpName
` ) ), http.get('https://mp.weixin.qq.com/rsshub_test/original_source', () => HttpResponse.text( genWeChatMpPage( 'original content', ` var item_show_type = "0"; var real_item_show_type = "0"; var appmsg_type = "9"; var ct = "${1_636_626_300}"; var msg_source_url = "https://mp.weixin.qq.com/rsshub_test/fake";` ) ) ), http.get('https://mp.weixin.qq.com/rsshub_test/original_long', () => HttpResponse.text( genWeChatMpPage( 'long-content-'.repeat(10), ` var item_show_type = "0"; var real_item_show_type = "0"; var appmsg_type = "9"; var ct = "${1_636_626_300}"; var msg_source_url = "https://mp.weixin.qq.com/rsshub_test/fake";` ) ) ), http.get('https://mp.weixin.qq.com/rsshub_test/img', () => HttpResponse.text( genWeChatMpPage('fake_description', [ ` var item_show_type = "8"; var real_item_show_type = "8"; var appmsg_type = "9"; var ct = "${1_636_626_300}"; `, ` window.picture_page_info_list = [ { cdn_url: 'https://mmbiz.qpic.cn/rsshub_test/fake_img_1/0?wx_fmt=jpeg', }, { cdn_url: 'https://mmbiz.qpic.cn/rsshub_test/fake_img_2/0?wx_fmt=jpeg', }, ].slice(0, 20); `, ]) ) ), http.get('https://mp.weixin.qq.com/rsshub_test/audio', () => HttpResponse.text( genWeChatMpPage('fake_description', [ ` var item_show_type = "7"; var real_item_show_type = "7"; var appmsg_type = "9"; var ct = "${1_636_626_300}"; `, ` reportOpt = { voiceid: "", uin: "", biz: "", mid: "", idx: "" }; window.cgiData = { voiceid: "rsshub_test_voiceid_1", duration: "6567" * 1, }; `, ]) ) ), http.get('https://mp.weixin.qq.com/rsshub_test/video', () => HttpResponse.text( genWeChatMpPage( 'fake_description', ` var item_show_type = "5"; var real_item_show_type = "5"; var appmsg_type = "9"; var ct = "${1_636_626_300}"; ` ) ) ), http.get('https://mp.weixin.qq.com/rsshub_test/fallback', () => HttpResponse.text( genWeChatMpPage( 'fake_description', ` var item_show_type = "99988877"; var real_item_show_type = "99988877"; var appmsg_type = "9"; var ct = "${1_636_626_300}"; ` ) ) ), http.get('https://mp.weixin.qq.com/s/rsshub_test', () => HttpResponse.redirect('https://mp.weixin.qq.com/rsshub_test/fallback')), http.get('https://mp.weixin.qq.com/s', ({ request }) => { const url = new URL(request.url); if (url.searchParams.get('__biz') === 'rsshub_test' && url.searchParams.get('mid') === '1' && url.searchParams.get('idx') === '1' && url.searchParams.get('sn') === '1') { return HttpResponse.redirect('https://mp.weixin.qq.com/rsshub_test/fallback'); } }), http.get('https://mp.weixin.qq.com/mp/rsshub_test/waf', () => HttpResponse.text( ` Title

环境异常

当前环境异常,完成验证后即可继续访问。

去验证

` ) ), http.get('https://mp.weixin.qq.com/s/rsshub_test_hit_waf', () => HttpResponse.redirect('https://mp.weixin.qq.com/mp/rsshub_test/waf')), http.get('https://mp.weixin.qq.com/s/unknown_page', () => HttpResponse.text( ` Title

Unknown paragraph

` ) ), http.get('https://mp.weixin.qq.com/s/deleted_page', () => HttpResponse.text( ` Title

该内容已被发布者删除

` ) ), http.get('https://mp.weixin.qq.com/s/rsshub_test_redirect_no_location', () => HttpResponse.text('', { status: 302 })), http.get('https://mp.weixin.qq.com/s/rsshub_test_recursive_redirect', () => HttpResponse.redirect('https://mp.weixin.qq.com/s/rsshub_test_recursive_redirect')), http.get('http://rsshub.test/headers', ({ request }) => HttpResponse.json(Object.fromEntries(request.headers.entries()))), http.post('http://rsshub.test/form-post', async ({ request }) => { const formData = await request.formData(); return HttpResponse.json({ test: formData.get('test'), req: { headers: Object.fromEntries(request.headers.entries()) }, }); }), http.post('http://rsshub.test/json-post', async ({ request }) => { const jsonData = (await request.json()) as { test: string; }; return HttpResponse.json({ test: jsonData?.test, }); }), http.get('http://rsshub.test/rss', () => HttpResponse.text('')) ); server.listen({ onUnhandledRequest: 'bypass' }); afterAll(() => server.close()); afterEach(() => server.resetHandlers()); export default server;