/ src / weixin-download.test.ts
weixin-download.test.ts
 1  import { describe, expect, it } from 'vitest';
 2  
 3  async function loadModule() {
 4    // @ts-expect-error JS adapter — no type declarations
 5    return import('../clis/weixin/download.js');
 6  }
 7  
 8  describe('weixin publish time extraction', () => {
 9    it('prefers publish_time text over create_time-like date strings', async () => {
10      const mod = await loadModule();
11  
12      expect(mod.extractWechatPublishTime(
13        '2026年3月24日 22:38',
14        'var create_time = "2026年3月24日 22:38";',
15      )).toBe('2026年3月24日 22:38');
16    });
17  
18    it('falls back to unix timestamp create_time values', async () => {
19      const mod = await loadModule();
20  
21      expect(mod.extractWechatPublishTime(
22        '',
23        'var create_time = "1711291080";',
24      )).toBe('2024-03-24 22:38:00');
25    });
26  
27    it('rejects malformed create_time values', async () => {
28      const mod = await loadModule();
29  
30      expect(mod.extractWechatPublishTime(
31        '',
32        'var create_time = "2026年3月24日 22:38";',
33      )).toBe('');
34      expect(mod.extractWechatPublishTime(
35        '',
36        'var create_time = "1711291080abc";',
37      )).toBe('');
38      expect(mod.extractWechatPublishTime(
39        '',
40        'var create_time = "17112910800";',
41      )).toBe('');
42    });
43  
44    it('builds a self-contained browser helper that matches fallback behavior', async () => {
45      const mod = await loadModule();
46  
47      const extractInPage = eval(mod.buildExtractWechatPublishTimeJs()) as (publishTimeText: string, htmlStr: string) => string;
48  
49      expect(extractInPage(
50        '',
51        'var create_time = "1711291080";',
52      )).toBe('2024-03-24 22:38:00');
53    });
54  
55    it('browser helper still prefers DOM publish_time text', async () => {
56      const mod = await loadModule();
57  
58      const extractInPage = eval(mod.buildExtractWechatPublishTimeJs()) as (publishTimeText: string, htmlStr: string) => string;
59  
60      expect(extractInPage(
61        '2026年3月24日 22:38',
62        'var create_time = "1711291080";',
63      )).toBe('2026年3月24日 22:38');
64    });
65  
66    it('detects WeChat verification gate pages', async () => {
67      const mod = await loadModule();
68  
69      expect(mod.detectWechatAccessIssue(
70        '环境异常 当前环境异常,完成验证后即可继续访问。 去验证',
71        '<html><body><a id="js_verify">去验证</a></body></html>',
72      )).toBe('environment verification required');
73    });
74  
75    it('browser access detector matches the server-side verifier', async () => {
76      const mod = await loadModule();
77  
78      const detectInPage = eval(mod.buildDetectWechatAccessIssueJs()) as (pageText: string, htmlStr: string) => string;
79  
80      expect(detectInPage(
81        '环境异常 当前环境异常,完成验证后即可继续访问。 去验证',
82        '<html>secitptpage/verify.html<a id="js_verify">去验证</a></html>',
83      )).toBe('environment verification required');
84    });
85  
86    it('picks the first non-empty WeChat metadata field', async () => {
87      const mod = await loadModule();
88  
89      expect(mod.pickFirstWechatMetaText('', 'Name cleared', '数字生命卡兹克')).toBe('数字生命卡兹克');
90      expect(mod.pickFirstWechatMetaText('', '  聊聊刚刚上线的PixVerse V6视频模型。  ')).toBe('聊聊刚刚上线的PixVerse V6视频模型。');
91    });
92  });