generated-scene: add scheduled monitoring runtime and helper lifecycle hardening
This commit is contained in:
115
tests/monitoring_action_mock_validation_runner.js
Normal file
115
tests/monitoring_action_mock_validation_runner.js
Normal file
@@ -0,0 +1,115 @@
|
||||
const assert = require('assert')
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
|
||||
const repoRoot = path.resolve(__dirname, '..')
|
||||
const skillRoot = path.join(
|
||||
repoRoot,
|
||||
'examples',
|
||||
'monitoring_action_detect_preview_anchor_2026-04-21',
|
||||
'skills',
|
||||
'command-center-fee-control-monitor'
|
||||
)
|
||||
const scriptPath = path.join(skillRoot, 'scripts', 'detect_preview.js')
|
||||
const fixturesPath = path.join(
|
||||
repoRoot,
|
||||
'tests',
|
||||
'fixtures',
|
||||
'generated_scene',
|
||||
'monitoring_action_mock_validation_fixtures_2026-04-22.json'
|
||||
)
|
||||
const resultsPath = path.join(
|
||||
repoRoot,
|
||||
'tests',
|
||||
'fixtures',
|
||||
'generated_scene',
|
||||
'monitoring_action_mock_validation_results_2026-04-22.json'
|
||||
)
|
||||
|
||||
const {
|
||||
buildBrowserEntrypointResult,
|
||||
assertPreviewOnly
|
||||
} = require(scriptPath)
|
||||
|
||||
async function main() {
|
||||
const fixtures = JSON.parse(fs.readFileSync(fixturesPath, 'utf8'))
|
||||
const sideEffectCounters = {
|
||||
repetCtrlSend: 0,
|
||||
sendMessages: 0,
|
||||
callOutLogin: 0,
|
||||
audioPlay: 0,
|
||||
exeTQueue: 0,
|
||||
productionLogWrite: 0
|
||||
}
|
||||
|
||||
const artifact = await buildBrowserEntrypointResult({
|
||||
mode: 'detect_preview',
|
||||
expected_domain: '',
|
||||
operator: 'mock-operator'
|
||||
}, {
|
||||
localStorage: {
|
||||
getItem(key) {
|
||||
return `mock-${key}`
|
||||
}
|
||||
},
|
||||
previewData: fixtures,
|
||||
sideEffects: {
|
||||
repetCtrlSend() { sideEffectCounters.repetCtrlSend += 1 },
|
||||
sendMessages() { sideEffectCounters.sendMessages += 1 },
|
||||
callOutLogin() { sideEffectCounters.callOutLogin += 1 },
|
||||
audioPlay() { sideEffectCounters.audioPlay += 1 },
|
||||
exeTQueue() { sideEffectCounters.exeTQueue += 1 },
|
||||
productionLogWrite() { sideEffectCounters.productionLogWrite += 1 }
|
||||
}
|
||||
})
|
||||
|
||||
assert.equal(artifact.type, 'monitoring-preview-artifact')
|
||||
assert.equal(artifact.status, 'preview-ok')
|
||||
assert.equal(artifact.mode, 'detect_preview')
|
||||
assert.ok(Array.isArray(artifact.pendingList))
|
||||
assert.ok(Array.isArray(artifact.notifyCandidates))
|
||||
assert.ok(Array.isArray(artifact.actionPlan))
|
||||
assert.ok(artifact.actionPlan.length >= 1)
|
||||
assert.ok(artifact.blockedSideEffects.blockedCallSignatures.includes('repetCtrlSend'))
|
||||
assert.ok(artifact.blockedSideEffects.blockedCallSignatures.includes('mac.sendMessages'))
|
||||
assert.equal(artifact.summary.pending_count, 1)
|
||||
assert.equal(artifact.summary.notify_count, 1)
|
||||
|
||||
for (const [name, count] of Object.entries(sideEffectCounters)) {
|
||||
assert.equal(count, 0, `side effect ${name} should not execute`)
|
||||
}
|
||||
|
||||
let blockedMode = false
|
||||
try {
|
||||
assertPreviewOnly('execute_dispatch_confirmed')
|
||||
} catch (error) {
|
||||
blockedMode = /blocked/.test(String(error.message))
|
||||
}
|
||||
assert.equal(blockedMode, true)
|
||||
|
||||
const result = {
|
||||
status: 'mock-validation-pass',
|
||||
family: 'monitoring_action_workflow',
|
||||
mode: 'detect_preview',
|
||||
artifactStatus: artifact.status,
|
||||
pendingCount: artifact.pendingList.length,
|
||||
notifyCount: artifact.notifyCandidates.length,
|
||||
actionPlanCount: artifact.actionPlan.length,
|
||||
blockedCallSignatures: artifact.blockedSideEffects.blockedCallSignatures,
|
||||
sideEffectCounters,
|
||||
nonPreviewModeBlocked: blockedMode,
|
||||
fixtures: path.relative(repoRoot, fixturesPath).replace(/\\/g, '/'),
|
||||
skillRoot: path.relative(repoRoot, skillRoot).replace(/\\/g, '/')
|
||||
}
|
||||
fs.writeFileSync(resultsPath, JSON.stringify(result, null, 2) + '\n', 'utf8')
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
const result = {
|
||||
status: 'mock-validation-fail',
|
||||
error: String(error && error.stack ? error.stack : error)
|
||||
}
|
||||
fs.writeFileSync(resultsPath, JSON.stringify(result, null, 2) + '\n', 'utf8')
|
||||
console.error(error)
|
||||
process.exit(1)
|
||||
})
|
||||
Reference in New Issue
Block a user