search.test.js
1 import { describe, expect, it } from 'vitest'; 2 import { __test__ } from './search.js'; 3 4 describe('powerchina search helpers', () => { 5 it('builds candidate URLs with keyword variants', () => { 6 const candidates = __test__.buildSearchCandidates('procurement'); 7 expect(candidates[0]).toContain('keyword=procurement'); 8 expect(candidates.some((item) => item.includes('/search?keywords='))).toBe(true); 9 expect(candidates.some((item) => item === 'https://bid.powerchina.cn/search')).toBe(true); 10 }); 11 12 it('normalizes date text', () => { 13 expect(__test__.normalizeDate('2026-4-7')).toBe('2026-04-07'); 14 expect(__test__.normalizeDate('公告时间:2026年04月07日')).toBe('2026-04-07'); 15 }); 16 17 it('deduplicates title/url pairs', () => { 18 const deduped = __test__.dedupeCandidates([ 19 { title: 'A', url: 'https://a.com/1', date: '2026-04-07' }, 20 { title: 'A', url: 'https://a.com/1', date: '2026-04-07' }, 21 { title: 'B', url: 'https://a.com/1', date: '2026-04-07' }, 22 ]); 23 expect(deduped).toHaveLength(2); 24 }); 25 26 it('filters obvious navigation rows before quality gate', () => { 27 const filtered = __test__.filterNavigationRows([ 28 { title: '搜索', url: 'https://bid.powerchina.cn/search', date: '2026-04-07' }, 29 { title: '首页', url: 'https://bid.powerchina.cn/', date: '2026-04-07' }, 30 { title: 'English', url: 'https://bid.powerchina.cn/old/en', date: '' }, 31 { title: '某项目电梯采购公告', url: 'https://bid.powerchina.cn/notice/detail?id=123', date: '2026-04-07' }, 32 ]); 33 expect(filtered).toHaveLength(1); 34 expect(filtered[0].title).toContain('电梯采购公告'); 35 }); 36 37 it('treats old/en language switch urls as navigation', () => { 38 expect(__test__.isLikelyNavigationUrl('https://bid.powerchina.cn/old/en')).toBe(true); 39 }); 40 41 it('treats language-toggle labels as navigation titles', () => { 42 expect(__test__.isLikelyNavigationTitle('English')).toBe(true); 43 expect(__test__.isLikelyNavigationTitle('EN')).toBe(true); 44 }); 45 46 it('builds api detail urls with stable id', () => { 47 const url = __test__.buildApiDetailUrl('2409419657'); 48 expect(url).toBe('https://bid.powerchina.cn/newcbs/recpro-newmember/BidAnnouncementSummary/getInfo/2409419657'); 49 }); 50 51 it('maps api rows into normalized search candidates', () => { 52 const mapped = __test__.toApiCandidate({ 53 id: '2409419657', 54 title: '某项目电梯采购公告', 55 announcementType: '招采公告', 56 companyType: '3', 57 titleTypeName: '货物类', 58 source: '设备物资集中采购电子平台', 59 publishTime: '2026-04-07 17:05:02', 60 submissionDeadline: '2026-04-14', 61 }); 62 expect(mapped).not.toBeNull(); 63 expect(mapped?.title).toContain('电梯采购公告'); 64 expect(mapped?.date).toBe('2026-04-07'); 65 expect(mapped?.url).toBe('https://bid.powerchina.cn/newcbs/recpro-newmember/BidAnnouncementSummary/getInfo/2409419657'); 66 }); 67 });