Files
digital-me-history/digital-me-backend/test/masters-revenue.test.js
T
admin 0593ff7e62
nginx serve /uploads direct (audio speed) / patch-nginx (push) Failing after 1m34s
数字我 Digital Me:全量入库(大文件走 Git LFS)
2026-10-10 16:24:43 +08:00

53 lines
2.7 KiB
JavaScript

// 大师版变现/知识两处"错了就丢钱/丢料"的纯逻辑回归护栏。
// splitRevenue:成交分账(必须合计精确、平台兜余数、比例对);sourceTitle:无标题资料按内容哈希起唯一名(防"删一条删全部")。
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { splitRevenue, INQUIRY_STREAM } from '../src/services/revenue.js';
import { sourceTitle } from '../src/services/knowledge.js';
test('splitRevenue: 各流分成比例正确且大师+平台合计精确=成交额', () => {
const merch = splitRevenue('merch', 1000);
assert.equal(merch.master, 700);
assert.equal(merch.platform, 300);
const lic = splitRevenue('license', 50000);
assert.equal(lic.master, 40000); // 机构授权 80/20
assert.equal(lic.platform, 10000);
const know = splitRevenue('knowledge', 999);
assert.equal(know.master + know.platform, 999); // 平台兜余数,合计不丢一分
assert.equal(know.master, 699);
});
test('splitRevenue: 边界输入(0/负数/非数字/未知流)一律安全,合计恒等于 amount', () => {
for (const [s, amt] of [['merch', 0], ['merch', 1], ['merch', -5], ['merch', 'abc'], ['license', 3], ['knowledge', 12345], ['nope', 1000]]) {
const r = splitRevenue(s, amt);
assert.ok(r.master >= 0 && r.platform >= 0, `非负: ${s} ${amt}`);
assert.equal(r.master + r.platform, r.amount, `合计精确: ${s} ${amt}`);
assert.ok(Number.isInteger(r.master) && Number.isInteger(r.platform), `整数元: ${s} ${amt}`);
}
// 未知流按 0% 大师、平台兜全额(不会把钱凭空分给大师)。
assert.equal(splitRevenue('nope', 1000).master, 0);
assert.equal(splitRevenue('nope', 1000).platform, 1000);
});
test('INQUIRY_STREAM: 留资类型映射到正确分成流', () => {
assert.equal(INQUIRY_STREAM.merch, 'merch');
assert.equal(INQUIRY_STREAM.license, 'license');
assert.equal(INQUIRY_STREAM.consult, 'knowledge'); // 付费咨询算知识付费流
assert.equal(INQUIRY_STREAM.membership, 'knowledge'); // 会员算知识付费流
});
test('sourceTitle: 有标题原样(截断);无标题按内容哈希起唯一名,不同内容不撞名', () => {
assert.equal(sourceTitle('谈艺录', 'xxx'), '谈艺录');
assert.equal(sourceTitle(' 留白 ', 'y'), '留白'); // trim
assert.equal(sourceTitle('a'.repeat(200), 'z').length, 120); // 截断
const t1 = sourceTitle('', '大师口述内容甲');
const t2 = sourceTitle('', '大师口述内容乙');
const t3 = sourceTitle(' ', '大师口述内容甲'); // 空白标题 + 同内容 → 同名(幂等)
assert.match(t1, /^资料·[0-9a-f]{8}$/);
assert.notEqual(t1, t2); // 不同内容 → 不同名(否则删一条删全部)
assert.equal(t1, t3); // 同内容 → 同名(重传幂等)
});