144 lines
3.8 KiB
JavaScript
144 lines
3.8 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
|
|
import { trackApplicationPreviewFieldEdit } from '../src/utils/expenseApplicationDecisionFeedback.js'
|
|
|
|
function testTracksFirstExplicitEdit() {
|
|
const previous = {
|
|
decisionId: 'decision-feedback-1',
|
|
fields: {
|
|
reason: '客户拜访',
|
|
location: '上海'
|
|
}
|
|
}
|
|
const next = {
|
|
...previous,
|
|
fields: {
|
|
...previous.fields,
|
|
reason: '客户现场实施'
|
|
}
|
|
}
|
|
|
|
const tracked = trackApplicationPreviewFieldEdit(previous, next, 'reason')
|
|
|
|
assert.deepEqual(tracked.aiDecisionFeedback.changedFields, [
|
|
{
|
|
fieldKey: 'reason',
|
|
suggestedValue: '客户拜访',
|
|
finalValue: '客户现场实施'
|
|
}
|
|
])
|
|
assert.equal(tracked.aiDecisionFeedback.revision, 1)
|
|
assert.equal(tracked.decisionId, 'decision-feedback-1')
|
|
}
|
|
|
|
function testKeepsOriginalSuggestionAcrossRepeatedEdits() {
|
|
const first = trackApplicationPreviewFieldEdit(
|
|
{ decisionId: 'decision-feedback-2', fields: { transportMode: '火车' } },
|
|
{ decisionId: 'decision-feedback-2', fields: { transportMode: '飞机' } },
|
|
'transportMode'
|
|
)
|
|
const second = trackApplicationPreviewFieldEdit(
|
|
first,
|
|
{ ...first, fields: { transportMode: '自驾' } },
|
|
'transportMode'
|
|
)
|
|
|
|
assert.deepEqual(second.aiDecisionFeedback.changedFields, [
|
|
{
|
|
fieldKey: 'transportMode',
|
|
suggestedValue: '火车',
|
|
finalValue: '自驾'
|
|
}
|
|
])
|
|
assert.equal(second.decisionId, 'decision-feedback-2')
|
|
}
|
|
|
|
function testRemovesDiffWhenUserRestoresSuggestion() {
|
|
const edited = trackApplicationPreviewFieldEdit(
|
|
{ fields: { location: '上海' } },
|
|
{ fields: { location: '北京' } },
|
|
'location'
|
|
)
|
|
const restored = trackApplicationPreviewFieldEdit(
|
|
edited,
|
|
{ ...edited, fields: { location: '上海' } },
|
|
'location'
|
|
)
|
|
|
|
assert.deepEqual(restored.aiDecisionFeedback.changedFields, [])
|
|
}
|
|
|
|
function testReturnDateUsesCanonicalTimeField() {
|
|
const tracked = trackApplicationPreviewFieldEdit(
|
|
{ fields: { time: '2026-07-20 至 2026-07-22' } },
|
|
{ fields: { time: '2026-07-20 至 2026-07-24' } },
|
|
'time_return'
|
|
)
|
|
|
|
assert.equal(tracked.aiDecisionFeedback.changedFields[0].fieldKey, 'time')
|
|
}
|
|
|
|
function testTracksDateAndDerivedDaysTogether() {
|
|
const previous = {
|
|
fields: {
|
|
time: '2026-02-20 至 2026-02-23',
|
|
days: '4天'
|
|
}
|
|
}
|
|
const next = {
|
|
fields: {
|
|
time: '2026-02-20 至 2026-02-24',
|
|
days: '5天'
|
|
}
|
|
}
|
|
|
|
const tracked = trackApplicationPreviewFieldEdit(
|
|
previous,
|
|
next,
|
|
['time_return', 'days']
|
|
)
|
|
|
|
assert.deepEqual(tracked.aiDecisionFeedback.changedFields, [
|
|
{ fieldKey: 'days', suggestedValue: '4天', finalValue: '5天' },
|
|
{
|
|
fieldKey: 'time',
|
|
suggestedValue: '2026-02-20 至 2026-02-23',
|
|
finalValue: '2026-02-20 至 2026-02-24'
|
|
}
|
|
])
|
|
assert.equal(tracked.aiDecisionFeedback.revision, 1)
|
|
|
|
const editedAgain = trackApplicationPreviewFieldEdit(
|
|
tracked,
|
|
{
|
|
...tracked,
|
|
fields: {
|
|
time: '2026-02-20 至 2026-02-25',
|
|
days: '6天'
|
|
}
|
|
},
|
|
['time', 'days']
|
|
)
|
|
assert.equal(editedAgain.aiDecisionFeedback.changedFields[0].suggestedValue, '4天')
|
|
assert.equal(
|
|
editedAgain.aiDecisionFeedback.changedFields[1].suggestedValue,
|
|
'2026-02-20 至 2026-02-23'
|
|
)
|
|
assert.equal(editedAgain.aiDecisionFeedback.revision, 2)
|
|
|
|
const restored = trackApplicationPreviewFieldEdit(
|
|
editedAgain,
|
|
{ ...editedAgain, fields: previous.fields },
|
|
['time', 'days']
|
|
)
|
|
assert.deepEqual(restored.aiDecisionFeedback.changedFields, [])
|
|
assert.equal(restored.aiDecisionFeedback.revision, 3)
|
|
}
|
|
|
|
testTracksFirstExplicitEdit()
|
|
testKeepsOriginalSuggestionAcrossRepeatedEdits()
|
|
testRemovesDiffWhenUserRestoresSuggestion()
|
|
testReturnDateUsesCanonicalTimeField()
|
|
testTracksDateAndDerivedDaysTogether()
|
|
console.log('expense-application-decision-feedback tests passed')
|