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 = `
${rich_media_content}
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(`
-
1
RSSHub1
2025-01-01
-
2
RSSHub2
2025-01-02
`)
),
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;