fix(微信订阅): 用微信真实关键词修正歌曲排期模板(thing1/phrase2/time3/character_string4),并修掉字段认领顺序导致的校准失效

This commit is contained in:
2026-10-24 11:56:50 +08:00
parent dc2565da34
commit f5a43b37cc
7 changed files with 192 additions and 56 deletions
+60
View File
@@ -123,6 +123,66 @@ test('resolveFieldsFromKeywords:拿不到关键词表时一律沿用配置', (
assert.deepEqual(r.fields, configured)
})
/**
* 回归:线上真实踩过的坑。
*
* 旧配置是「按常见命名猜的」thing2/date4/time1/character_string3/phrase5,五个编号全错,
* 而且模板里**根本没有日期关键词**。当时按变量顺序贪心认领,playDate(首选 date,模板里
* 没有 date)先把 character_string4 抢走,轮到 sequence 就没位置了,整张模板退回旧配置,
* 发出去就是 `47003 data.thing1.value is empty`。
*/
const REAL_SONG_SELECTED_CONTENT =
'歌曲名称:{{thing1.DATA}}\n排期状态:{{phrase2.DATA}}\n播放时间:{{time3.DATA}}\n排期序号:{{character_string4.DATA}}\n'
test('回归:真实排期模板 + 猜错的旧配置 → 校准成正确的四个编号,并丢掉模板里没有的 playDate', () => {
const wrongConfigured = {
thing2: 'songTitle',
date4: 'playDate',
time1: 'playTime',
character_string3: 'sequence',
phrase5: 'status'
}
const r = resolveFieldsFromKeywords(
parseTemplateContent(REAL_SONG_SELECTED_CONTENT),
wrongConfigured
)
assert.equal(r.source, 'wechat-api')
assert.deepEqual(r.fields, {
thing1: 'songTitle',
phrase2: 'status',
time3: 'playTime',
character_string4: 'sequence'
})
// 模板里没有日期关键词 → playDate 被忽略(发了微信也不认)
assert.deepEqual(r.unresolvedVariables, ['playDate'])
assert.deepEqual(r.unclaimedCodes, [], '四个关键词必须全部填上,否则微信会报 value is empty')
assert.match(r.reason, /已忽略/)
})
test('回归:真实排期模板 + 已修正的内置配置 → 一致,不做任何改动', () => {
const good = {
thing1: 'songTitle',
phrase2: 'status',
time3: 'playTime',
character_string4: 'sequence'
}
const r = resolveFieldsFromKeywords(parseTemplateContent(REAL_SONG_SELECTED_CONTENT), good)
assert.equal(r.source, 'wechat-api')
assert.deepEqual(r.fields, good)
assert.deepEqual(r.invalidConfiguredCodes, [])
assert.deepEqual(r.unclaimedCodes, [])
assert.equal(r.reason, '配置与微信真实模板一致')
})
test('unclaimedCodes:模板里有、配置里没有的关键词要被点名(这是 value is empty 的来源)', () => {
const r = resolveFieldsFromKeywords(parseTemplateContent(REAL_SONG_SELECTED_CONTENT), {
thing1: 'songTitle'
})
assert.deepEqual(r.unclaimedCodes.sort(), ['character_string4', 'phrase2', 'time3'])
// 填不满模板时不动配置
assert.equal(r.source, 'config')
})
test('resolveFieldsFromKeywords:变量类型未知时不做自动映射', () => {
const r = resolveFieldsFromKeywords(parseTemplateContent(SONG_SELECTED_CONTENT), {
thing1: 'whateverCustomVar'