test(reporting-governance): tighten deployment profile schema semantics

This commit is contained in:
Eve
2026-05-08 12:38:02 +08:00
parent 74fbf43e83
commit c19fd21aab
2 changed files with 240 additions and 5 deletions

View File

@@ -43,6 +43,8 @@ spec:
overdueAction: force_checkpoint
escalationAfterMisses: 2
adapters:
hook:
enabled: true
watchdog:
enabled: true
scheduleMode: cron
@@ -98,7 +100,15 @@ test('deployment profile schema validator rejects malformed profile', () => {
metadata: { id: 'x', version: '1.0.0', runtime: 'openclaw' },
spec: {
package: { pluginVersion: 7 },
adapters: {},
adapters: {
hook: { enabled: true },
watchdog: { enabled: true },
queue: { enabled: true },
dispatcher: { enabled: true },
bridge: { enabled: true },
sender: { mode: 'openclaw-cli' },
orchestrator: { enabled: true },
},
notifications: {
operatorVisibleRecoveryRequired: true,
allowedTerminalStates: ['acked'],
@@ -111,6 +121,137 @@ test('deployment profile schema validator rejects malformed profile', () => {
);
});
test('deployment profile schema validator rejects tightened semantic violations', () => {
const validBase = {
apiVersion: 'reporting-governance/v1alpha1',
kind: 'DeploymentProfile',
metadata: { id: 'strict', version: '1.0.0', runtime: 'openclaw' },
spec: {
package: { pluginVersion: '0.1.0-mainline' },
adapters: {
hook: { enabled: true },
watchdog: { enabled: true },
queue: { enabled: true },
dispatcher: { enabled: true },
bridge: { enabled: true },
sender: { mode: 'openclaw-cli' },
orchestrator: { enabled: true },
},
notifications: {
operatorVisibleRecoveryRequired: true,
allowedTerminalStates: ['acked'],
},
audit: {
portableArtifactsRequired: true,
requiredArtifacts: ['queue_items'],
},
capability_expectations: { required: [] },
},
};
assert.throws(
() => validateDeploymentProfileSchema({
...validBase,
spec: {
...validBase.spec,
audit: {
portableArtifactsRequired: true,
requiredArtifacts: [],
},
},
}),
/deployment profile schema validation failed: .*\/spec\/audit\/requiredArtifacts must NOT have fewer than 1 items/
);
assert.throws(
() => validateDeploymentProfileSchema({
...validBase,
spec: {
...validBase.spec,
notifications: {
operatorVisibleRecoveryRequired: 'yes',
allowedTerminalStates: ['acked'],
},
},
}),
/deployment profile schema validation failed: .*\/spec\/notifications\/operatorVisibleRecoveryRequired must be boolean/
);
assert.throws(
() => validateDeploymentProfileSchema({
...validBase,
spec: {
...validBase.spec,
notifications: {
operatorVisibleRecoveryRequired: true,
allowedTerminalStates: ['done'],
},
},
}),
/deployment profile schema validation failed: .*\/spec\/notifications\/allowedTerminalStates\/0 must be equal to one of the allowed values/
);
assert.throws(
() => validateDeploymentProfileSchema({
...validBase,
spec: {
...validBase.spec,
audit: {
portableArtifactsRequired: 'true',
requiredArtifacts: ['queue_items'],
},
},
}),
/deployment profile schema validation failed: .*\/spec\/audit\/portableArtifactsRequired must be boolean/
);
assert.throws(
() => validateDeploymentProfileSchema({
...validBase,
spec: {
...validBase.spec,
adapters: {
...validBase.spec.adapters,
queue: { enabled: 'true' },
},
},
}),
/deployment profile schema validation failed: .*\/spec\/adapters\/queue\/enabled must be boolean/
);
assert.throws(
() => validateDeploymentProfileSchema({
...validBase,
spec: {
...validBase.spec,
adapters: {
...validBase.spec.adapters,
sender: { mode: 'shim' },
},
},
}),
/deployment profile schema validation failed: .*\/spec\/adapters\/sender\/mode must be equal to one of the allowed values/
);
assert.throws(
() => validateDeploymentProfileSchema({
...validBase,
spec: {
...validBase.spec,
adapters: {
watchdog: { enabled: true },
queue: { enabled: true },
dispatcher: { enabled: true },
bridge: { enabled: true },
sender: { mode: 'openclaw-cli' },
orchestrator: { enabled: true },
},
},
}),
/deployment profile schema validation failed: .*\/spec\/adapters missing required property hook/
);
});
test('deployment profile yaml parser covers composite nested yaml structure', () => {
const profile = parseDeploymentProfileYaml(complexProfileYaml);
@@ -159,7 +300,21 @@ metadata:
spec:
package:
pluginVersion: 123
adapters: {}
adapters:
hook:
enabled: true
watchdog:
enabled: true
queue:
enabled: true
dispatcher:
enabled: true
bridge:
enabled: true
sender:
mode: openclaw-cli
orchestrator:
enabled: true
notifications:
operatorVisibleRecoveryRequired: true
allowedTerminalStates: