|
@@ -1,9 +1,10 @@
|
|
|
/**
|
|
/**
|
|
|
* 验证写 DMS 时**到底发了哪些字段**(不需要 token,也不碰真实 DMS)。
|
|
* 验证写 DMS 时**到底发了哪些字段**(不需要 token,也不碰真实 DMS)。
|
|
|
*
|
|
*
|
|
|
- * 为什么要单独测这个:用户明确要求 —— **「我的需求是传 title,不要传类似于 summary
|
|
|
|
|
- * 的多余的字段」**。字段多发/少发是很容易在后续改动里被"顺手"改掉的,
|
|
|
|
|
- * 而且它不像业务逻辑那样有直观的行为反馈,所以直接把请求体抓下来断言。
|
|
|
|
|
|
|
+ * 为什么要单独测这个:写入字段的规矩是**踩出来的**——
|
|
|
|
|
+ * 1887 的模型把 summary/qpyszx/qyzt/rzqpyx 设为 must=true(不带就 214),
|
|
|
|
|
+ * 但它们**只能传空值**(业务口径由业务方定,前端不猜);而 1889 不需要这些字段。
|
|
|
|
|
+ * 多发/少发字段没有直观的行为反馈、极易被"顺手"改掉,所以直接把请求体抓下来断言。
|
|
|
*
|
|
*
|
|
|
* 做法:把 `globalThis.fetch` 打桩,捕获模块真实发出的 form body,
|
|
* 做法:把 `globalThis.fetch` 打桩,捕获模块真实发出的 form body,
|
|
|
* 解析出 `content` 的键集合,断言「不多不少」。
|
|
* 解析出 `content` 的键集合,断言「不多不少」。
|
|
@@ -64,10 +65,18 @@ const DISALLOWED = ['summary', 'qpyszx', 'qyzt', 'rzqpyx'];
|
|
|
console.log('\n【1】会话新增:字段必须「不多不少」');
|
|
console.log('\n【1】会话新增:字段必须「不多不少」');
|
|
|
await upsertDmsSession({ sessionId: 'sess-A', title: '会话标题甲', creditCode: '91310118TEST' });
|
|
await upsertDmsSession({ sessionId: 'sess-A', title: '会话标题甲', creditCode: '91310118TEST' });
|
|
|
let keys = keysOfLast('/content/addContent');
|
|
let keys = keysOfLast('/content/addContent');
|
|
|
-const EXPECT_SESSION_ADD = ['c_created_at', 'c_credit_code', 'c_session_id', 'c_source', 'c_title', 'c_updated_at', 'title'].sort();
|
|
|
|
|
|
|
+const EXPECT_SESSION_ADD = ['c_created_at', 'c_credit_code', 'c_session_id', 'c_source', 'c_title', 'c_updated_at', 'title',
|
|
|
|
|
+ // 1887 的模型把这四个设为 must=true,四个全带才写得进去(少一个就 214);
|
|
|
|
|
+ // 值故意留空 —— 运营口径由业务方定,前端不猜
|
|
|
|
|
+ 'summary', 'qpyszx', 'qyzt', 'rzqpyx'].sort();
|
|
|
check('字段集合与预期完全一致', JSON.stringify(keys) === JSON.stringify(EXPECT_SESSION_ADD), `实际 ${JSON.stringify(keys)}`);
|
|
check('字段集合与预期完全一致', JSON.stringify(keys) === JSON.stringify(EXPECT_SESSION_ADD), `实际 ${JSON.stringify(keys)}`);
|
|
|
check('**带 title**(用户需求)', keys?.includes('title') === true);
|
|
check('**带 title**(用户需求)', keys?.includes('title') === true);
|
|
|
-check('不含 summary/qpyszx/qyzt/rzqpyx 等多余字段', !DISALLOWED.some((k) => keys?.includes(k)), JSON.stringify(keys));
|
|
|
|
|
|
|
+check('带上四个必填运营字段(值必须为空/默认,不是业务值)', ['summary','qpyszx','qyzt','rzqpyx'].every((k) => keys?.includes(k)), JSON.stringify(keys));
|
|
|
|
|
+check('这四个字段的值是空值/默认(不是猜的业务值)', (() => {
|
|
|
|
|
+ const hit = [...captured].reverse().find((c) => c.url.includes('/content/addContent'));
|
|
|
|
|
+ const c = JSON.parse(new URLSearchParams(hit.body).get('content'));
|
|
|
|
|
+ return c.summary === '' && c.qpyszx === false && c.qyzt === false && c.rzqpyx === false;
|
|
|
|
|
+})(), '');
|
|
|
|
|
|
|
|
console.log('\n【2】会话改名(更新):也要带 title');
|
|
console.log('\n【2】会话改名(更新):也要带 title');
|
|
|
captured.length = 0;
|
|
captured.length = 0;
|
|
@@ -84,7 +93,7 @@ await upsertDmsSession({ sessionId: 'sess-A', title: '会话标题乙', creditCo
|
|
|
keys = keysOfLast('/content/updateContent');
|
|
keys = keysOfLast('/content/updateContent');
|
|
|
check('更新走的是 updateContent', keys !== null);
|
|
check('更新走的是 updateContent', keys !== null);
|
|
|
check('**更新也带 title**(原先不带,改名后 DMS 里标题不变)', keys?.includes('title') === true, JSON.stringify(keys));
|
|
check('**更新也带 title**(原先不带,改名后 DMS 里标题不变)', keys?.includes('title') === true, JSON.stringify(keys));
|
|
|
-check('更新不带多余的运营字段', !DISALLOWED.some((k) => keys?.includes(k)), JSON.stringify(keys));
|
|
|
|
|
|
|
+check('**更新不带这四个字段**(否则会把后端回填的值冲成空)', !DISALLOWED.some((k) => keys?.includes(k)), JSON.stringify(keys));
|
|
|
|
|
|
|
|
console.log('\n【3】问答记录新增:title = 问题文本,且不多发字段');
|
|
console.log('\n【3】问答记录新增:title = 问题文本,且不多发字段');
|
|
|
captured.length = 0;
|
|
captured.length = 0;
|