import assert from 'node:assert/strict'; import test from 'node:test'; import { assessNewsSourceUrl, classifyNewsSafetyText, filterNewsSearchGroupsForSafety, maskBlockedNewsTerms, } from './news-content-safety-rules.mjs'; function levelOf(text, options) { return classifyNewsSafetyText(text, options).level; } test('adult explicit content is blocked, sexual-crime news goes to review', () => { assert.equal(levelOf('某平台被曝传播色情视频'), 'block'); assert.equal(levelOf('91每日大赛-今日吃瓜爆料资讯平台,热门黑料绯闻每日更新'), 'block'); assert.equal(levelOf('男子强奸案一审宣判,被判有期徒刑十年'), 'review'); assert.equal(levelOf('央行宣布下调存款准备金率 0.5 个百分点'), 'clean'); assert.equal(levelOf('AI短剧王鹤棣的3厘米鸡巴第1集 打玻尿酸坏死只剩3cm... | 海角网'), 'block'); assert.equal(levelOf('熟女 - 热门标签,每日更新最新内容'), 'block'); assert.equal(levelOf('51吃瓜 今日最新'), 'block'); assert.equal(assessNewsSourceUrl('https://www.haijiao.com/post/123').level, 'block'); assert.equal(assessNewsSourceUrl('https://heiliao.com/archives/1').level, 'block'); assert.equal(levelOf('海角七号重映,票房破亿'), 'clean'); }); test('common news phrases are not false positives', () => { assert.equal(levelOf('商场国庆跳楼价大甩卖'), 'clean'); assert.equal(levelOf('今日露点温度 18℃,体感闷热'), 'clean'); assert.equal(levelOf('监管部门严查打擦边球的违规营销'), 'clean'); assert.equal(levelOf('小知识:恐龙是怎么死的?'), 'clean'); assert.equal(levelOf('高盛上调腾讯目标价至 600 港元'), 'clean'); }); test('minor harm, suicide and tragedy tone rules', () => { assert.equal(levelOf('某地一名初中生坠楼身亡,警方介入调查'), 'review'); assert.equal(levelOf('网友分享自杀方法引发关注'), 'block'); assert.equal(levelOf('台风致 3 人遇难 😂'), 'block'); assert.equal(levelOf('台风致 3 人遇难,救援持续进行'), 'clean'); }); test('finance rules block stock tips and crypto promotion but review price news', () => { assert.equal(levelOf('分析师荐股:这只股票明日涨停'), 'block'); assert.equal(levelOf('比特币暴涨,现在上车还来得及,注册返佣'), 'block'); assert.equal(levelOf('比特币价格暴涨突破 10 万美元'), 'review'); assert.equal(levelOf('多部门重申虚拟货币相关业务属于非法金融活动'), 'clean'); }); test('source provenance: non-news domains always blocked, self-media only for politics', () => { assert.equal(assessNewsSourceUrl('https://m.ah.huatu.com/list/szrd/').level, 'block'); assert.equal(assessNewsSourceUrl('https://x.com/nasa/status/1', { political: true }).level, 'block'); assert.equal(assessNewsSourceUrl('https://x.com/nasa/status/1', { political: false }).level, 'clean'); assert.equal(assessNewsSourceUrl('https://m.sohu.com/a/123456_1', { political: true }).level, 'block'); assert.equal(assessNewsSourceUrl('https://www.news.cn/politics/20260923/abc.html', { political: true }).level, 'clean'); assert.equal(assessNewsSourceUrl('https://www.pornhub.com/view').level, 'block'); assert.equal(levelOf('外交部发言人就相关问题答记者问', { url: 'https://weibo.com/123' }), 'block'); assert.equal(levelOf('宇树科技冲刺 A 股 IPO', { url: 'https://www.toutiao.com/article/1/', sectionId: 'domestic' }), 'clean'); assert.equal(levelOf('央行存款新规落地', { url: 'https://www.toutiao.com/article/1/', sectionId: 'policy' }), 'block'); }); test('maskBlockedNewsTerms masks block-level terms only', () => { const masked = maskBlockedNewsTerms('标签:色情网站, 荐股, 强奸案宣判'); assert.equal(masked.count, 2); assert.doesNotMatch(masked.text, /色情网站|荐股/u); assert.match(masked.text, /强奸案宣判/u); }); test('filterNewsSearchGroupsForSafety drops blocked results and keeps review items', () => { const { groups, removed } = filterNewsSearchGroupsForSafety([ { id: 'domestic', results: [ { title: '『时事政治』2026年时事政治热点汇总', url: 'https://m.ah.huatu.com/list/szrd/', snippet: '' }, { title: '初中生坠楼身亡,警方介入', url: 'https://www.thepaper.cn/newsDetail_1', snippet: '' }, { title: '国产大飞机交付第 100 架', url: 'https://www.news.cn/a/1.html', snippet: '' }, ], }, { id: 'culture', results: [{ title: '某明星出轨风波', url: 'https://ent.example.com/1', snippet: '' }] }, ]); assert.equal(removed.length, 2); assert.deepEqual(groups[0].results.map((item) => item.title), ['初中生坠楼身亡,警方介入', '国产大飞机交付第 100 架']); assert.equal(groups[1].results.length, 0); });