agentic-qe 3.5.4 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/v3/README.md +1 -1
- package/.claude/agents/v3/qe-message-broker-tester.md +380 -0
- package/.claude/agents/v3/qe-middleware-validator.md +423 -0
- package/.claude/agents/v3/qe-odata-contract-tester.md +484 -0
- package/.claude/agents/v3/qe-pentest-validator.md +359 -0
- package/.claude/agents/v3/qe-qx-partner.md +85 -3
- package/.claude/agents/v3/qe-sap-idoc-tester.md +407 -0
- package/.claude/agents/v3/qe-sap-rfc-tester.md +357 -0
- package/.claude/agents/v3/qe-soap-tester.md +340 -0
- package/.claude/agents/v3/qe-sod-analyzer.md +528 -0
- package/.claude/agents/v3/templates/qx-report-template.html +437 -0
- package/.claude/skills/debug-loop/SKILL.md +61 -0
- package/.claude/skills/enterprise-integration-testing/SKILL.md +735 -0
- package/.claude/skills/middleware-testing-patterns/SKILL.md +798 -0
- package/.claude/skills/observability-testing-patterns/SKILL.md +930 -0
- package/.claude/skills/pentest-validation/SKILL.md +268 -0
- package/.claude/skills/pentest-validation/evals/pentest-validation.yaml +708 -0
- package/.claude/skills/pentest-validation/schemas/output.json +281 -0
- package/.claude/skills/pentest-validation/scripts/validate.sh +402 -0
- package/.claude/skills/pr-review/SKILL.md +61 -0
- package/.claude/skills/qcsd-cicd-swarm/SKILL.md +315 -13
- package/.claude/skills/qcsd-development-swarm/SKILL.md +331 -16
- package/.claude/skills/qcsd-ideation-swarm/SKILL.md +258 -9
- package/.claude/skills/qcsd-refinement-swarm/SKILL.md +344 -22
- package/.claude/skills/release/SKILL.md +333 -0
- package/.claude/skills/skills-manifest.json +5 -4
- package/.claude/skills/wms-testing-patterns/SKILL.md +949 -0
- package/README.md +30 -21
- package/package.json +2 -2
- package/v3/CHANGELOG.md +57 -0
- package/v3/README.md +23 -20
- package/v3/assets/agents/v3/qe-message-broker-tester.md +380 -0
- package/v3/assets/agents/v3/qe-middleware-validator.md +423 -0
- package/v3/assets/agents/v3/qe-odata-contract-tester.md +484 -0
- package/v3/assets/agents/v3/qe-pentest-validator.md +359 -0
- package/v3/assets/agents/v3/qe-qx-partner.md +90 -12
- package/v3/assets/agents/v3/qe-sap-idoc-tester.md +407 -0
- package/v3/assets/agents/v3/qe-sap-rfc-tester.md +357 -0
- package/v3/assets/agents/v3/qe-soap-tester.md +340 -0
- package/v3/assets/agents/v3/qe-sod-analyzer.md +528 -0
- package/v3/assets/agents/v3/templates/qx-report-template.html +437 -0
- package/v3/assets/skills/debug-loop/SKILL.md +61 -0
- package/v3/assets/skills/enterprise-integration-testing/SKILL.md +735 -0
- package/v3/assets/skills/middleware-testing-patterns/SKILL.md +798 -0
- package/v3/assets/skills/observability-testing-patterns/SKILL.md +930 -0
- package/v3/assets/skills/pentest-validation/SKILL.md +268 -0
- package/v3/assets/skills/pentest-validation/evals/pentest-validation.yaml +708 -0
- package/v3/assets/skills/pentest-validation/schemas/output.json +281 -0
- package/v3/assets/skills/pentest-validation/scripts/validate.sh +402 -0
- package/v3/assets/skills/pr-review/SKILL.md +61 -0
- package/v3/assets/skills/qcsd-cicd-swarm/SKILL.md +2206 -0
- package/v3/assets/skills/qcsd-development-swarm/SKILL.md +2154 -0
- package/v3/assets/skills/qcsd-ideation-swarm/SKILL.md +2008 -1753
- package/v3/assets/skills/qcsd-refinement-swarm/SKILL.md +2398 -0
- package/v3/assets/skills/security-visual-testing/SKILL.md +223 -0
- package/v3/assets/skills/security-visual-testing/evals/security-visual-testing.yaml +163 -0
- package/v3/assets/skills/security-visual-testing/schemas/output.json +486 -0
- package/v3/assets/skills/security-visual-testing/scripts/validate.sh +748 -0
- package/v3/assets/skills/sfdipot-product-factors/SKILL.md +239 -0
- package/v3/assets/skills/test-idea-rewriting/SKILL.md +229 -0
- package/v3/assets/skills/wms-testing-patterns/SKILL.md +949 -0
- package/v3/dist/cli/bundle.js +10816 -4625
- package/v3/dist/cli/commands/coverage.d.ts.map +1 -1
- package/v3/dist/cli/commands/coverage.js +29 -0
- package/v3/dist/cli/commands/coverage.js.map +1 -1
- package/v3/dist/cli/commands/learning.d.ts.map +1 -1
- package/v3/dist/cli/commands/learning.js +9 -0
- package/v3/dist/cli/commands/learning.js.map +1 -1
- package/v3/dist/cli/commands/token-usage.d.ts.map +1 -1
- package/v3/dist/cli/commands/token-usage.js +6 -2
- package/v3/dist/cli/commands/token-usage.js.map +1 -1
- package/v3/dist/coordination/protocols/learning-consolidation.d.ts.map +1 -1
- package/v3/dist/coordination/protocols/learning-consolidation.js +1 -0
- package/v3/dist/coordination/protocols/learning-consolidation.js.map +1 -1
- package/v3/dist/domains/coverage-analysis/coordinator.d.ts +8 -0
- package/v3/dist/domains/coverage-analysis/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/coordinator.js +67 -0
- package/v3/dist/domains/coverage-analysis/coordinator.js.map +1 -1
- package/v3/dist/domains/coverage-analysis/interfaces.d.ts +33 -0
- package/v3/dist/domains/coverage-analysis/interfaces.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/plugin.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/plugin.js +17 -0
- package/v3/dist/domains/coverage-analysis/plugin.js.map +1 -1
- package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.d.ts +125 -0
- package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.d.ts.map +1 -0
- package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.js +317 -0
- package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.js.map +1 -0
- package/v3/dist/domains/coverage-analysis/services/index.d.ts +1 -0
- package/v3/dist/domains/coverage-analysis/services/index.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/services/index.js +4 -0
- package/v3/dist/domains/coverage-analysis/services/index.js.map +1 -1
- package/v3/dist/domains/enterprise-integration/coordinator.d.ts +91 -0
- package/v3/dist/domains/enterprise-integration/coordinator.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/coordinator.js +672 -0
- package/v3/dist/domains/enterprise-integration/coordinator.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/index.d.ts +14 -0
- package/v3/dist/domains/enterprise-integration/index.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/index.js +18 -0
- package/v3/dist/domains/enterprise-integration/index.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/interfaces.d.ts +376 -0
- package/v3/dist/domains/enterprise-integration/interfaces.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/interfaces.js +11 -0
- package/v3/dist/domains/enterprise-integration/interfaces.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/plugin.d.ts +88 -0
- package/v3/dist/domains/enterprise-integration/plugin.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/plugin.js +515 -0
- package/v3/dist/domains/enterprise-integration/plugin.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.d.ts +67 -0
- package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.js +670 -0
- package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/index.d.ts +13 -0
- package/v3/dist/domains/enterprise-integration/services/index.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/index.js +13 -0
- package/v3/dist/domains/enterprise-integration/services/index.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/message-broker-service.d.ts +88 -0
- package/v3/dist/domains/enterprise-integration/services/message-broker-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/message-broker-service.js +560 -0
- package/v3/dist/domains/enterprise-integration/services/message-broker-service.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/odata-service.d.ts +75 -0
- package/v3/dist/domains/enterprise-integration/services/odata-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/odata-service.js +618 -0
- package/v3/dist/domains/enterprise-integration/services/odata-service.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/sap-integration-service.d.ts +73 -0
- package/v3/dist/domains/enterprise-integration/services/sap-integration-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/sap-integration-service.js +513 -0
- package/v3/dist/domains/enterprise-integration/services/sap-integration-service.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.d.ts +84 -0
- package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.js +639 -0
- package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.d.ts +90 -0
- package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.js +389 -0
- package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.js.map +1 -0
- package/v3/dist/domains/index.d.ts +1 -0
- package/v3/dist/domains/index.d.ts.map +1 -1
- package/v3/dist/domains/index.js +1 -0
- package/v3/dist/domains/index.js.map +1 -1
- package/v3/dist/domains/learning-optimization/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/learning-optimization/coordinator.js +1 -0
- package/v3/dist/domains/learning-optimization/coordinator.js.map +1 -1
- package/v3/dist/domains/learning-optimization/services/learning-coordinator.d.ts.map +1 -1
- package/v3/dist/domains/learning-optimization/services/learning-coordinator.js +1 -0
- package/v3/dist/domains/learning-optimization/services/learning-coordinator.js.map +1 -1
- package/v3/dist/domains/learning-optimization/services/transfer-specialist.d.ts.map +1 -1
- package/v3/dist/domains/learning-optimization/services/transfer-specialist.js +1 -0
- package/v3/dist/domains/learning-optimization/services/transfer-specialist.js.map +1 -1
- package/v3/dist/domains/test-execution/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/test-execution/coordinator.js +34 -0
- package/v3/dist/domains/test-execution/coordinator.js.map +1 -1
- package/v3/dist/domains/test-generation/services/test-data-generator.d.ts +7 -1
- package/v3/dist/domains/test-generation/services/test-data-generator.d.ts.map +1 -1
- package/v3/dist/domains/test-generation/services/test-data-generator.js +116 -98
- package/v3/dist/domains/test-generation/services/test-data-generator.js.map +1 -1
- package/v3/dist/init/agents-installer.d.ts +4 -0
- package/v3/dist/init/agents-installer.d.ts.map +1 -1
- package/v3/dist/init/agents-installer.js +32 -3
- package/v3/dist/init/agents-installer.js.map +1 -1
- package/v3/dist/init/skills-installer.d.ts.map +1 -1
- package/v3/dist/init/skills-installer.js +4 -1
- package/v3/dist/init/skills-installer.js.map +1 -1
- package/v3/dist/init/types.d.ts.map +1 -1
- package/v3/dist/init/types.js +1 -0
- package/v3/dist/init/types.js.map +1 -1
- package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.d.ts +16 -0
- package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.d.ts.map +1 -1
- package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.js +41 -0
- package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.js.map +1 -1
- package/v3/dist/integrations/ruvector/provider.d.ts.map +1 -1
- package/v3/dist/integrations/ruvector/provider.js +1 -0
- package/v3/dist/integrations/ruvector/provider.js.map +1 -1
- package/v3/dist/kernel/anti-drift-middleware.d.ts +160 -0
- package/v3/dist/kernel/anti-drift-middleware.d.ts.map +1 -0
- package/v3/dist/kernel/anti-drift-middleware.js +376 -0
- package/v3/dist/kernel/anti-drift-middleware.js.map +1 -0
- package/v3/dist/kernel/event-bus.d.ts +29 -1
- package/v3/dist/kernel/event-bus.d.ts.map +1 -1
- package/v3/dist/kernel/event-bus.js +69 -6
- package/v3/dist/kernel/event-bus.js.map +1 -1
- package/v3/dist/kernel/interfaces.d.ts +35 -0
- package/v3/dist/kernel/interfaces.d.ts.map +1 -1
- package/v3/dist/kernel/kernel.d.ts.map +1 -1
- package/v3/dist/kernel/kernel.js +14 -17
- package/v3/dist/kernel/kernel.js.map +1 -1
- package/v3/dist/kernel/unified-memory.d.ts +5 -0
- package/v3/dist/kernel/unified-memory.d.ts.map +1 -1
- package/v3/dist/kernel/unified-memory.js +28 -0
- package/v3/dist/kernel/unified-memory.js.map +1 -1
- package/v3/dist/learning/asymmetric-learning.d.ts +133 -0
- package/v3/dist/learning/asymmetric-learning.d.ts.map +1 -0
- package/v3/dist/learning/asymmetric-learning.js +170 -0
- package/v3/dist/learning/asymmetric-learning.js.map +1 -0
- package/v3/dist/learning/pattern-lifecycle.d.ts +26 -0
- package/v3/dist/learning/pattern-lifecycle.d.ts.map +1 -1
- package/v3/dist/learning/pattern-lifecycle.js +83 -0
- package/v3/dist/learning/pattern-lifecycle.js.map +1 -1
- package/v3/dist/learning/qe-patterns.d.ts +8 -0
- package/v3/dist/learning/qe-patterns.d.ts.map +1 -1
- package/v3/dist/learning/qe-patterns.js.map +1 -1
- package/v3/dist/learning/real-qe-reasoning-bank.d.ts +28 -0
- package/v3/dist/learning/real-qe-reasoning-bank.d.ts.map +1 -1
- package/v3/dist/learning/real-qe-reasoning-bank.js +72 -4
- package/v3/dist/learning/real-qe-reasoning-bank.js.map +1 -1
- package/v3/dist/learning/token-tracker.d.ts +22 -0
- package/v3/dist/learning/token-tracker.d.ts.map +1 -1
- package/v3/dist/learning/token-tracker.js +67 -0
- package/v3/dist/learning/token-tracker.js.map +1 -1
- package/v3/dist/mcp/bundle.js +11099 -4879
- package/v3/dist/mcp/tool-registry.d.ts.map +1 -1
- package/v3/dist/mcp/tool-registry.js +4 -0
- package/v3/dist/mcp/tool-registry.js.map +1 -1
- package/v3/dist/mcp/tools/analysis/token-usage.d.ts +1 -1
- package/v3/dist/mcp/tools/analysis/token-usage.d.ts.map +1 -1
- package/v3/dist/mcp/tools/analysis/token-usage.js +23 -3
- package/v3/dist/mcp/tools/analysis/token-usage.js.map +1 -1
- package/v3/dist/mcp/tools/base.d.ts.map +1 -1
- package/v3/dist/mcp/tools/base.js +1 -15
- package/v3/dist/mcp/tools/base.js.map +1 -1
- package/v3/dist/mcp/tools/coverage-analysis/index.d.ts +7 -0
- package/v3/dist/mcp/tools/coverage-analysis/index.d.ts.map +1 -1
- package/v3/dist/mcp/tools/coverage-analysis/index.js +30 -0
- package/v3/dist/mcp/tools/coverage-analysis/index.js.map +1 -1
- package/v3/dist/optimization/token-optimizer-service.d.ts +7 -0
- package/v3/dist/optimization/token-optimizer-service.d.ts.map +1 -1
- package/v3/dist/optimization/token-optimizer-service.js +10 -1
- package/v3/dist/optimization/token-optimizer-service.js.map +1 -1
- package/v3/dist/shared/types/index.d.ts +20 -1
- package/v3/dist/shared/types/index.d.ts.map +1 -1
- package/v3/dist/shared/types/index.js +1 -0
- package/v3/dist/shared/types/index.js.map +1 -1
- package/v3/dist/strange-loop/healing-controller.d.ts.map +1 -1
- package/v3/dist/strange-loop/healing-controller.js +12 -0
- package/v3/dist/strange-loop/healing-controller.js.map +1 -1
- package/v3/dist/strange-loop/strange-loop.d.ts +14 -0
- package/v3/dist/strange-loop/strange-loop.d.ts.map +1 -1
- package/v3/dist/strange-loop/strange-loop.js +24 -0
- package/v3/dist/strange-loop/strange-loop.js.map +1 -1
- package/v3/dist/strange-loop/types.d.ts +2 -2
- package/v3/dist/strange-loop/types.d.ts.map +1 -1
- package/v3/dist/strange-loop/types.js.map +1 -1
- package/v3/dist/sync/claude-flow-bridge.d.ts.map +1 -1
- package/v3/dist/sync/claude-flow-bridge.js +3 -24
- package/v3/dist/sync/claude-flow-bridge.js.map +1 -1
- package/v3/package.json +12 -9
- /package/{v3/assets/skills/sfdipot-product-factors/skill.md → .claude/skills/sfdipot-product-factors/SKILL.md} +0 -0
- /package/{v3/assets/skills/test-idea-rewriting/skill.md → .claude/skills/test-idea-rewriting/SKILL.md} +0 -0
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Message Broker Testing Service
|
|
3
|
+
* Tests message publish/consume flows, validates message schemas,
|
|
4
|
+
* and tests dead-letter queue (DLQ) behavior.
|
|
5
|
+
*
|
|
6
|
+
* ADR-063: Enterprise Integration Testing Gap Closure
|
|
7
|
+
*/
|
|
8
|
+
import { ok, err } from '../../../shared/types/index.js';
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
defaultDeliveryTimeout: 30000,
|
|
11
|
+
maxRetries: 3,
|
|
12
|
+
retryInterval: 1000,
|
|
13
|
+
validateSchemas: true,
|
|
14
|
+
maxMessageSize: 1048576, // 1MB
|
|
15
|
+
cacheSchemas: true,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Message Broker Testing Service
|
|
19
|
+
* Provides message flow testing, schema validation, and DLQ analysis
|
|
20
|
+
*/
|
|
21
|
+
export class MessageBrokerService {
|
|
22
|
+
memory;
|
|
23
|
+
config;
|
|
24
|
+
schemaCache = new Map();
|
|
25
|
+
constructor(memory, config = {}) {
|
|
26
|
+
this.memory = memory;
|
|
27
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
28
|
+
}
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Message Flow Testing
|
|
31
|
+
// ============================================================================
|
|
32
|
+
/**
|
|
33
|
+
* Test a message publish/consume flow against expected outcomes.
|
|
34
|
+
* Validates message delivery, transformation, routing, and timing.
|
|
35
|
+
*/
|
|
36
|
+
async testMessageFlow(brokerConfig, testCase) {
|
|
37
|
+
const sentAt = new Date();
|
|
38
|
+
try {
|
|
39
|
+
// Validate broker configuration
|
|
40
|
+
const configErrors = this.validateBrokerConfig(brokerConfig);
|
|
41
|
+
if (configErrors.length > 0) {
|
|
42
|
+
return ok({
|
|
43
|
+
testCaseId: testCase.id,
|
|
44
|
+
passed: false,
|
|
45
|
+
sentAt,
|
|
46
|
+
errors: configErrors,
|
|
47
|
+
actualOutcome: {
|
|
48
|
+
delivered: false,
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// Validate the test case structure
|
|
53
|
+
const testCaseErrors = this.validateTestCase(testCase);
|
|
54
|
+
if (testCaseErrors.length > 0) {
|
|
55
|
+
return ok({
|
|
56
|
+
testCaseId: testCase.id,
|
|
57
|
+
passed: false,
|
|
58
|
+
sentAt,
|
|
59
|
+
errors: testCaseErrors,
|
|
60
|
+
actualOutcome: {
|
|
61
|
+
delivered: false,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// Validate message payload
|
|
66
|
+
const payloadErrors = this.validateMessagePayload(testCase.message);
|
|
67
|
+
if (payloadErrors.length > 0) {
|
|
68
|
+
return ok({
|
|
69
|
+
testCaseId: testCase.id,
|
|
70
|
+
passed: false,
|
|
71
|
+
sentAt,
|
|
72
|
+
errors: payloadErrors,
|
|
73
|
+
actualOutcome: {
|
|
74
|
+
delivered: false,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// Simulate message delivery analysis
|
|
79
|
+
const actualOutcome = this.analyzeExpectedOutcome(brokerConfig, testCase);
|
|
80
|
+
const receivedAt = new Date();
|
|
81
|
+
const latency = receivedAt.getTime() - sentAt.getTime();
|
|
82
|
+
// Compare actual vs expected outcome
|
|
83
|
+
const outcomeErrors = this.compareOutcomes(testCase.expectedOutcome, actualOutcome, testCase.id);
|
|
84
|
+
const passed = outcomeErrors.length === 0;
|
|
85
|
+
const result = {
|
|
86
|
+
testCaseId: testCase.id,
|
|
87
|
+
passed,
|
|
88
|
+
sentAt,
|
|
89
|
+
receivedAt,
|
|
90
|
+
latency,
|
|
91
|
+
actualOutcome,
|
|
92
|
+
errors: outcomeErrors,
|
|
93
|
+
};
|
|
94
|
+
// Store test result for learning
|
|
95
|
+
await this.memory.set(`enterprise-integration:msg-test:${testCase.id}:${Date.now()}`, {
|
|
96
|
+
testCaseId: testCase.id,
|
|
97
|
+
protocol: brokerConfig.protocol,
|
|
98
|
+
queue: testCase.queue,
|
|
99
|
+
passed,
|
|
100
|
+
latency,
|
|
101
|
+
errorCount: outcomeErrors.length,
|
|
102
|
+
timestamp: new Date().toISOString(),
|
|
103
|
+
}, { namespace: 'enterprise-integration', ttl: 86400 * 30 });
|
|
104
|
+
return ok(result);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ============================================================================
|
|
111
|
+
// Message Schema Validation
|
|
112
|
+
// ============================================================================
|
|
113
|
+
/**
|
|
114
|
+
* Validate a message payload against a registered schema.
|
|
115
|
+
* Supports JSON, XML, and flat-file formats.
|
|
116
|
+
*/
|
|
117
|
+
validateMessageSchema(payload, schema) {
|
|
118
|
+
try {
|
|
119
|
+
const errors = [];
|
|
120
|
+
switch (payload.format) {
|
|
121
|
+
case 'json':
|
|
122
|
+
this.validateJsonMessage(payload.body, schema, errors);
|
|
123
|
+
break;
|
|
124
|
+
case 'xml':
|
|
125
|
+
this.validateXmlMessage(payload.body, schema, errors);
|
|
126
|
+
break;
|
|
127
|
+
case 'flat-file':
|
|
128
|
+
this.validateFlatFileMessage(payload.body, schema, errors);
|
|
129
|
+
break;
|
|
130
|
+
case 'csv':
|
|
131
|
+
this.validateCsvMessage(payload.body, schema, errors);
|
|
132
|
+
break;
|
|
133
|
+
case 'edi-x12':
|
|
134
|
+
this.validateEdiX12Message(payload.body, schema, errors);
|
|
135
|
+
break;
|
|
136
|
+
case 'edifact':
|
|
137
|
+
this.validateEdifactMessage(payload.body, schema, errors);
|
|
138
|
+
break;
|
|
139
|
+
default:
|
|
140
|
+
errors.push(`Unsupported message format: ${payload.format}`);
|
|
141
|
+
}
|
|
142
|
+
return ok(errors);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Register a message schema for validation.
|
|
150
|
+
*/
|
|
151
|
+
async registerSchema(queueName, schemaEntry) {
|
|
152
|
+
const key = `${queueName}:${schemaEntry.version}`;
|
|
153
|
+
this.schemaCache.set(key, schemaEntry);
|
|
154
|
+
await this.memory.set(`enterprise-integration:msg-schema:${key}`, schemaEntry, { namespace: 'enterprise-integration', persist: true });
|
|
155
|
+
}
|
|
156
|
+
// ============================================================================
|
|
157
|
+
// DLQ Testing
|
|
158
|
+
// ============================================================================
|
|
159
|
+
/**
|
|
160
|
+
* Test dead-letter queue behavior by analyzing DLQ messages.
|
|
161
|
+
* Checks for poison messages, reprocessable messages, and error patterns.
|
|
162
|
+
*/
|
|
163
|
+
async testDlqHandling(brokerConfig, queue, dlqMessages) {
|
|
164
|
+
try {
|
|
165
|
+
// Validate broker configuration
|
|
166
|
+
const configErrors = this.validateBrokerConfig(brokerConfig);
|
|
167
|
+
if (configErrors.length > 0) {
|
|
168
|
+
return err(new Error(`Invalid broker configuration: ${configErrors.join('; ')}`));
|
|
169
|
+
}
|
|
170
|
+
if (!queue || queue.trim() === '') {
|
|
171
|
+
return err(new Error('Queue name is required for DLQ testing'));
|
|
172
|
+
}
|
|
173
|
+
const dlqErrors = [];
|
|
174
|
+
let poisonMessages = 0;
|
|
175
|
+
let reprocessable = 0;
|
|
176
|
+
for (const msg of dlqMessages) {
|
|
177
|
+
// Analyze each DLQ message
|
|
178
|
+
const isPoisonMessage = this.isPoisonMessage(msg, brokerConfig);
|
|
179
|
+
const canReprocess = this.canReprocess(msg, brokerConfig);
|
|
180
|
+
if (isPoisonMessage) {
|
|
181
|
+
poisonMessages++;
|
|
182
|
+
}
|
|
183
|
+
if (canReprocess) {
|
|
184
|
+
reprocessable++;
|
|
185
|
+
}
|
|
186
|
+
dlqErrors.push({
|
|
187
|
+
messageId: msg.id,
|
|
188
|
+
reason: msg.lastError || 'Unknown error',
|
|
189
|
+
retryCount: msg.retryCount,
|
|
190
|
+
lastAttempt: msg.lastAttempt,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
const result = {
|
|
194
|
+
queue,
|
|
195
|
+
messageCount: dlqMessages.length,
|
|
196
|
+
poisonMessages,
|
|
197
|
+
reprocessable,
|
|
198
|
+
errors: dlqErrors,
|
|
199
|
+
};
|
|
200
|
+
// Store DLQ analysis for learning
|
|
201
|
+
await this.memory.set(`enterprise-integration:dlq-test:${queue}:${Date.now()}`, {
|
|
202
|
+
queue,
|
|
203
|
+
messageCount: dlqMessages.length,
|
|
204
|
+
poisonMessages,
|
|
205
|
+
reprocessable,
|
|
206
|
+
protocol: brokerConfig.protocol,
|
|
207
|
+
timestamp: new Date().toISOString(),
|
|
208
|
+
}, { namespace: 'enterprise-integration', ttl: 86400 * 30 });
|
|
209
|
+
return ok(result);
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Clear cached schemas.
|
|
217
|
+
*/
|
|
218
|
+
clearSchemaCache() {
|
|
219
|
+
this.schemaCache.clear();
|
|
220
|
+
}
|
|
221
|
+
// ============================================================================
|
|
222
|
+
// Private Helper Methods
|
|
223
|
+
// ============================================================================
|
|
224
|
+
validateBrokerConfig(config) {
|
|
225
|
+
const errors = [];
|
|
226
|
+
if (!config.host || config.host.trim() === '') {
|
|
227
|
+
errors.push('Broker host is required');
|
|
228
|
+
}
|
|
229
|
+
if (!config.port || config.port <= 0 || config.port > 65535) {
|
|
230
|
+
errors.push('Broker port must be between 1 and 65535');
|
|
231
|
+
}
|
|
232
|
+
const validProtocols = [
|
|
233
|
+
'soap', 'jms', 'amqp', 'mqtt', 'kafka', 'ibm-mq', 'rabbitmq',
|
|
234
|
+
];
|
|
235
|
+
if (!validProtocols.includes(config.protocol)) {
|
|
236
|
+
errors.push(`Unsupported protocol: ${config.protocol}. Supported: ${validProtocols.join(', ')}`);
|
|
237
|
+
}
|
|
238
|
+
// IBM MQ requires channel and queue manager
|
|
239
|
+
if (config.protocol === 'ibm-mq' && config.credentials) {
|
|
240
|
+
if (!config.credentials.channel) {
|
|
241
|
+
errors.push('IBM MQ requires a channel in credentials');
|
|
242
|
+
}
|
|
243
|
+
if (!config.credentials.queueManager) {
|
|
244
|
+
errors.push('IBM MQ requires a queueManager in credentials');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return errors;
|
|
248
|
+
}
|
|
249
|
+
validateTestCase(testCase) {
|
|
250
|
+
const errors = [];
|
|
251
|
+
if (!testCase.id || testCase.id.trim() === '') {
|
|
252
|
+
errors.push('Test case ID is required');
|
|
253
|
+
}
|
|
254
|
+
if (!testCase.queue || testCase.queue.trim() === '') {
|
|
255
|
+
errors.push('Queue name is required');
|
|
256
|
+
}
|
|
257
|
+
if (testCase.timeout <= 0) {
|
|
258
|
+
errors.push('Timeout must be a positive number');
|
|
259
|
+
}
|
|
260
|
+
if (testCase.timeout > this.config.defaultDeliveryTimeout * 10) {
|
|
261
|
+
errors.push(`Timeout ${testCase.timeout}ms exceeds maximum allowed (${this.config.defaultDeliveryTimeout * 10}ms)`);
|
|
262
|
+
}
|
|
263
|
+
return errors;
|
|
264
|
+
}
|
|
265
|
+
validateMessagePayload(payload) {
|
|
266
|
+
const errors = [];
|
|
267
|
+
if (!payload.body && payload.body !== '') {
|
|
268
|
+
errors.push('Message body is required');
|
|
269
|
+
}
|
|
270
|
+
if (payload.body && payload.body.length > this.config.maxMessageSize) {
|
|
271
|
+
errors.push(`Message size (${payload.body.length} bytes) exceeds maximum allowed (${this.config.maxMessageSize} bytes)`);
|
|
272
|
+
}
|
|
273
|
+
if (payload.priority !== undefined && (payload.priority < 0 || payload.priority > 9)) {
|
|
274
|
+
errors.push('Message priority must be between 0 and 9');
|
|
275
|
+
}
|
|
276
|
+
// Validate format-specific payload structure
|
|
277
|
+
if (payload.format === 'json') {
|
|
278
|
+
try {
|
|
279
|
+
JSON.parse(payload.body);
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
errors.push('Message body is not valid JSON');
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (payload.format === 'xml') {
|
|
286
|
+
if (!payload.body.includes('<') || !payload.body.includes('>')) {
|
|
287
|
+
errors.push('Message body does not appear to be valid XML');
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return errors;
|
|
291
|
+
}
|
|
292
|
+
analyzeExpectedOutcome(_brokerConfig, testCase) {
|
|
293
|
+
// Analyze the test case to determine the expected actual outcome
|
|
294
|
+
// This simulates what would happen when a message is sent
|
|
295
|
+
// Check for conditions that would cause DLQ routing
|
|
296
|
+
if (testCase.expectedOutcome.dlq) {
|
|
297
|
+
return {
|
|
298
|
+
delivered: false,
|
|
299
|
+
transformedTo: testCase.expectedOutcome.transformedTo,
|
|
300
|
+
routedTo: testCase.expectedOutcome.routedTo,
|
|
301
|
+
dlq: true,
|
|
302
|
+
retryCount: testCase.expectedOutcome.retryCount ?? this.config.maxRetries,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
delivered: true,
|
|
307
|
+
transformedTo: testCase.expectedOutcome.transformedTo,
|
|
308
|
+
routedTo: testCase.expectedOutcome.routedTo,
|
|
309
|
+
dlq: false,
|
|
310
|
+
retryCount: 0,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
compareOutcomes(expected, actual, testCaseId) {
|
|
314
|
+
const errors = [];
|
|
315
|
+
if (expected.delivered !== actual.delivered) {
|
|
316
|
+
errors.push(`[${testCaseId}] Delivery mismatch: expected delivered=${expected.delivered}, actual=${actual.delivered}`);
|
|
317
|
+
}
|
|
318
|
+
if (expected.dlq !== undefined && expected.dlq !== actual.dlq) {
|
|
319
|
+
errors.push(`[${testCaseId}] DLQ routing mismatch: expected dlq=${expected.dlq}, actual=${actual.dlq}`);
|
|
320
|
+
}
|
|
321
|
+
if (expected.routedTo !== undefined && expected.routedTo !== actual.routedTo) {
|
|
322
|
+
errors.push(`[${testCaseId}] Routing mismatch: expected routedTo='${expected.routedTo}', actual='${actual.routedTo}'`);
|
|
323
|
+
}
|
|
324
|
+
if (expected.transformedTo !== undefined && expected.transformedTo !== actual.transformedTo) {
|
|
325
|
+
errors.push(`[${testCaseId}] Transformation mismatch: expected format='${expected.transformedTo}', actual='${actual.transformedTo}'`);
|
|
326
|
+
}
|
|
327
|
+
return errors;
|
|
328
|
+
}
|
|
329
|
+
isPoisonMessage(msg, _brokerConfig) {
|
|
330
|
+
// A poison message is one that has exceeded retry limits
|
|
331
|
+
// or consistently fails with the same error
|
|
332
|
+
if (msg.retryCount >= this.config.maxRetries) {
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
// Check for known unrecoverable error patterns
|
|
336
|
+
const unrecoverablePatterns = [
|
|
337
|
+
'deserialization',
|
|
338
|
+
'schema validation',
|
|
339
|
+
'malformed',
|
|
340
|
+
'corrupt',
|
|
341
|
+
'invalid format',
|
|
342
|
+
'parse error',
|
|
343
|
+
];
|
|
344
|
+
const lowerError = msg.lastError.toLowerCase();
|
|
345
|
+
return unrecoverablePatterns.some(pattern => lowerError.includes(pattern));
|
|
346
|
+
}
|
|
347
|
+
canReprocess(msg, _brokerConfig) {
|
|
348
|
+
// A message can be reprocessed if the error is transient
|
|
349
|
+
const transientPatterns = [
|
|
350
|
+
'timeout',
|
|
351
|
+
'connection refused',
|
|
352
|
+
'service unavailable',
|
|
353
|
+
'temporary',
|
|
354
|
+
'rate limit',
|
|
355
|
+
'too many requests',
|
|
356
|
+
'circuit breaker',
|
|
357
|
+
];
|
|
358
|
+
const lowerError = msg.lastError.toLowerCase();
|
|
359
|
+
const isTransient = transientPatterns.some(pattern => lowerError.includes(pattern));
|
|
360
|
+
// Only reprocess if retries haven't been exhausted and error is transient
|
|
361
|
+
return isTransient && msg.retryCount < this.config.maxRetries;
|
|
362
|
+
}
|
|
363
|
+
validateJsonMessage(body, schema, errors) {
|
|
364
|
+
try {
|
|
365
|
+
const data = JSON.parse(body);
|
|
366
|
+
const schemaDef = JSON.parse(schema);
|
|
367
|
+
// Basic JSON Schema validation
|
|
368
|
+
if (schemaDef.type && typeof data !== schemaDef.type) {
|
|
369
|
+
if (!(schemaDef.type === 'object' && typeof data === 'object' && data !== null)) {
|
|
370
|
+
errors.push(`Expected type '${schemaDef.type}' but got '${typeof data}'`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// Check required properties
|
|
374
|
+
if (schemaDef.required && Array.isArray(schemaDef.required) && typeof data === 'object' && data !== null) {
|
|
375
|
+
for (const prop of schemaDef.required) {
|
|
376
|
+
if (!(prop in data)) {
|
|
377
|
+
errors.push(`Required property '${prop}' is missing`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// Check properties if defined
|
|
382
|
+
if (schemaDef.properties && typeof data === 'object' && data !== null) {
|
|
383
|
+
for (const [prop, propSchema] of Object.entries(schemaDef.properties)) {
|
|
384
|
+
if (prop in data) {
|
|
385
|
+
const propDef = propSchema;
|
|
386
|
+
if (propDef.type) {
|
|
387
|
+
const actualType = Array.isArray(data[prop]) ? 'array' : typeof data[prop];
|
|
388
|
+
if (actualType !== propDef.type && !(propDef.type === 'number' && actualType === 'number')) {
|
|
389
|
+
errors.push(`Property '${prop}' expected type '${propDef.type}' but got '${actualType}'`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
catch {
|
|
397
|
+
errors.push('Failed to validate JSON message against schema');
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
validateXmlMessage(body, schema, errors) {
|
|
401
|
+
// Basic XML structure validation
|
|
402
|
+
if (!body.trim().startsWith('<')) {
|
|
403
|
+
errors.push('XML message must start with an opening tag');
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
// Check for balanced tags
|
|
407
|
+
const openTags = [];
|
|
408
|
+
const tagRegex = /<\/?(\w+[\w:.-]*)[^>]*\/?>/g;
|
|
409
|
+
let match;
|
|
410
|
+
while ((match = tagRegex.exec(body)) !== null) {
|
|
411
|
+
const fullMatch = match[0];
|
|
412
|
+
const tagName = match[1];
|
|
413
|
+
if (fullMatch.endsWith('/>'))
|
|
414
|
+
continue;
|
|
415
|
+
if (fullMatch.startsWith('</')) {
|
|
416
|
+
if (openTags.length === 0 || openTags[openTags.length - 1] !== tagName) {
|
|
417
|
+
errors.push(`Mismatched closing tag: </${tagName}>`);
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
openTags.pop();
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
openTags.push(tagName);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
if (openTags.length > 0) {
|
|
427
|
+
errors.push(`Unclosed XML tags: ${openTags.join(', ')}`);
|
|
428
|
+
}
|
|
429
|
+
// Validate required elements from schema (basic check)
|
|
430
|
+
if (schema) {
|
|
431
|
+
try {
|
|
432
|
+
const schemaDef = JSON.parse(schema);
|
|
433
|
+
if (schemaDef.requiredElements && Array.isArray(schemaDef.requiredElements)) {
|
|
434
|
+
for (const element of schemaDef.requiredElements) {
|
|
435
|
+
const elementRegex = new RegExp(`<(?:\\w+:)?${element}[\\s>]`, 'i');
|
|
436
|
+
if (!elementRegex.test(body)) {
|
|
437
|
+
errors.push(`Required element '${element}' is missing`);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch {
|
|
443
|
+
// Schema is not JSON, skip element validation
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
validateFlatFileMessage(body, schema, errors) {
|
|
448
|
+
if (!body || body.trim() === '') {
|
|
449
|
+
errors.push('Flat file message body is empty');
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
try {
|
|
453
|
+
const schemaDef = JSON.parse(schema);
|
|
454
|
+
const lines = body.split('\n');
|
|
455
|
+
// Validate record length if specified
|
|
456
|
+
if (schemaDef.recordLength && typeof schemaDef.recordLength === 'number') {
|
|
457
|
+
for (let i = 0; i < lines.length; i++) {
|
|
458
|
+
if (lines[i].length !== schemaDef.recordLength && lines[i].trim() !== '') {
|
|
459
|
+
errors.push(`Line ${i + 1}: expected length ${schemaDef.recordLength} but got ${lines[i].length}`);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
// Validate minimum number of records
|
|
464
|
+
if (schemaDef.minRecords && typeof schemaDef.minRecords === 'number') {
|
|
465
|
+
const nonEmptyLines = lines.filter(l => l.trim() !== '').length;
|
|
466
|
+
if (nonEmptyLines < schemaDef.minRecords) {
|
|
467
|
+
errors.push(`Expected at least ${schemaDef.minRecords} records but found ${nonEmptyLines}`);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
catch {
|
|
472
|
+
// Schema is not JSON, skip detailed validation
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
validateCsvMessage(body, schema, errors) {
|
|
476
|
+
if (!body || body.trim() === '') {
|
|
477
|
+
errors.push('CSV message body is empty');
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
const lines = body.split('\n').filter(l => l.trim() !== '');
|
|
481
|
+
if (lines.length === 0) {
|
|
482
|
+
errors.push('CSV message contains no data rows');
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
// Check for consistent column count
|
|
486
|
+
const delimiter = body.includes('\t') ? '\t' : ',';
|
|
487
|
+
const headerColumnCount = lines[0].split(delimiter).length;
|
|
488
|
+
for (let i = 1; i < lines.length; i++) {
|
|
489
|
+
const columnCount = lines[i].split(delimiter).length;
|
|
490
|
+
if (columnCount !== headerColumnCount) {
|
|
491
|
+
errors.push(`Row ${i + 1}: expected ${headerColumnCount} columns but found ${columnCount}`);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
// Validate against schema if provided
|
|
495
|
+
try {
|
|
496
|
+
const schemaDef = JSON.parse(schema);
|
|
497
|
+
if (schemaDef.columns && Array.isArray(schemaDef.columns)) {
|
|
498
|
+
const headerColumns = lines[0].split(delimiter).map(c => c.trim());
|
|
499
|
+
for (const expectedCol of schemaDef.columns) {
|
|
500
|
+
if (!headerColumns.includes(expectedCol)) {
|
|
501
|
+
errors.push(`Expected column '${expectedCol}' not found in CSV header`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
catch {
|
|
507
|
+
// Schema is not JSON, skip column validation
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
validateEdiX12Message(body, _schema, errors) {
|
|
511
|
+
if (!body || body.trim() === '') {
|
|
512
|
+
errors.push('EDI X12 message body is empty');
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
// X12 messages start with ISA (Interchange Header)
|
|
516
|
+
if (!body.startsWith('ISA')) {
|
|
517
|
+
errors.push('EDI X12 message must start with ISA segment');
|
|
518
|
+
}
|
|
519
|
+
// Check for IEA (Interchange Trailer)
|
|
520
|
+
if (!body.includes('IEA')) {
|
|
521
|
+
errors.push('EDI X12 message must contain IEA (Interchange Trailer) segment');
|
|
522
|
+
}
|
|
523
|
+
// Check for GS/GE (Functional Group)
|
|
524
|
+
if (!body.includes('GS')) {
|
|
525
|
+
errors.push('EDI X12 message must contain GS (Functional Group Header) segment');
|
|
526
|
+
}
|
|
527
|
+
if (!body.includes('GE')) {
|
|
528
|
+
errors.push('EDI X12 message must contain GE (Functional Group Trailer) segment');
|
|
529
|
+
}
|
|
530
|
+
// Check for ST/SE (Transaction Set)
|
|
531
|
+
if (!body.includes('ST')) {
|
|
532
|
+
errors.push('EDI X12 message must contain ST (Transaction Set Header) segment');
|
|
533
|
+
}
|
|
534
|
+
if (!body.includes('SE')) {
|
|
535
|
+
errors.push('EDI X12 message must contain SE (Transaction Set Trailer) segment');
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
validateEdifactMessage(body, _schema, errors) {
|
|
539
|
+
if (!body || body.trim() === '') {
|
|
540
|
+
errors.push('EDIFACT message body is empty');
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
// EDIFACT messages start with UNB (Interchange Header)
|
|
544
|
+
if (!body.startsWith('UNB') && !body.startsWith('UNA')) {
|
|
545
|
+
errors.push('EDIFACT message must start with UNA or UNB segment');
|
|
546
|
+
}
|
|
547
|
+
// Check for UNZ (Interchange Trailer)
|
|
548
|
+
if (!body.includes('UNZ')) {
|
|
549
|
+
errors.push('EDIFACT message must contain UNZ (Interchange Trailer) segment');
|
|
550
|
+
}
|
|
551
|
+
// Check for UNH/UNT (Message Header/Trailer)
|
|
552
|
+
if (!body.includes('UNH')) {
|
|
553
|
+
errors.push('EDIFACT message must contain UNH (Message Header) segment');
|
|
554
|
+
}
|
|
555
|
+
if (!body.includes('UNT')) {
|
|
556
|
+
errors.push('EDIFACT message must contain UNT (Message Trailer) segment');
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
//# sourceMappingURL=message-broker-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-broker-service.js","sourceRoot":"","sources":["../../../../src/domains/enterprise-integration/services/message-broker-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - OData Testing Service
|
|
3
|
+
* Parses OData metadata ($metadata), tests CRUD operations,
|
|
4
|
+
* and validates entity sets and navigation properties.
|
|
5
|
+
*
|
|
6
|
+
* ADR-063: Enterprise Integration Testing Gap Closure
|
|
7
|
+
*/
|
|
8
|
+
import { Result } from '../../../shared/types/index.js';
|
|
9
|
+
import type { MemoryBackend } from '../../../kernel/interfaces.js';
|
|
10
|
+
import type { ODataMetadata, ODataTestResult, ODataValidationError } from '../interfaces.js';
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for the OData service
|
|
13
|
+
*/
|
|
14
|
+
export interface ODataServiceConfig {
|
|
15
|
+
/** Default OData version */
|
|
16
|
+
defaultVersion: 'v2' | 'v4';
|
|
17
|
+
/** Enable strict metadata validation */
|
|
18
|
+
strictValidation: boolean;
|
|
19
|
+
/** Cache parsed metadata */
|
|
20
|
+
cacheMetadata: boolean;
|
|
21
|
+
/** Validate navigation property targets */
|
|
22
|
+
validateNavigations: boolean;
|
|
23
|
+
/** Maximum number of entity sets to test in batch */
|
|
24
|
+
maxBatchSize: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* OData Testing Service
|
|
28
|
+
* Provides metadata parsing, CRUD testing, and entity set validation
|
|
29
|
+
*/
|
|
30
|
+
export declare class ODataService {
|
|
31
|
+
private readonly memory;
|
|
32
|
+
private readonly config;
|
|
33
|
+
private readonly metadataCache;
|
|
34
|
+
constructor(memory: MemoryBackend, config?: Partial<ODataServiceConfig>);
|
|
35
|
+
/**
|
|
36
|
+
* Parse OData $metadata XML document into a structured ODataMetadata object.
|
|
37
|
+
* Extracts entity sets, function imports, actions, and navigation properties.
|
|
38
|
+
*/
|
|
39
|
+
parseMetadata(serviceUrl: string, metadataXml: string): Promise<Result<ODataMetadata>>;
|
|
40
|
+
/**
|
|
41
|
+
* Test an entity set for CRUD operation compliance.
|
|
42
|
+
* Validates that the entity set supports expected operations and returns valid responses.
|
|
43
|
+
*/
|
|
44
|
+
testEntitySet(metadata: ODataMetadata, entitySetName: string, testData?: {
|
|
45
|
+
createPayload?: Record<string, unknown>;
|
|
46
|
+
updatePayload?: Record<string, unknown>;
|
|
47
|
+
queryOptions?: string;
|
|
48
|
+
responseData?: unknown;
|
|
49
|
+
responseStatusCode?: number;
|
|
50
|
+
}): Promise<Result<ODataTestResult>>;
|
|
51
|
+
/**
|
|
52
|
+
* Test a function import for correct parameter and return type handling.
|
|
53
|
+
*/
|
|
54
|
+
testFunctionImport(metadata: ODataMetadata, functionName: string, parameters: Record<string, unknown>): Result<ODataValidationError[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Clear cached metadata.
|
|
57
|
+
*/
|
|
58
|
+
clearCache(): void;
|
|
59
|
+
private detectVersion;
|
|
60
|
+
private extractEntitySets;
|
|
61
|
+
private extractNavigationProperties;
|
|
62
|
+
private extractFunctionImports;
|
|
63
|
+
private extractFunctionParameters;
|
|
64
|
+
private extractActions;
|
|
65
|
+
private hasAnnotation;
|
|
66
|
+
private validateMetadataConsistency;
|
|
67
|
+
private validateReadCapability;
|
|
68
|
+
private validateQueryCapabilities;
|
|
69
|
+
private validateCreatePayload;
|
|
70
|
+
private validateUpdatePayload;
|
|
71
|
+
private validateNavigationProperties;
|
|
72
|
+
private validateResponseData;
|
|
73
|
+
private validateParameterType;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=odata-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odata-service.d.ts","sourceRoot":"","sources":["../../../../src/domains/enterprise-integration/services/odata-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAW,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EACV,aAAa,EAMb,eAAe,EACf,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,wCAAwC;IACxC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,4BAA4B;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,mBAAmB,EAAE,OAAO,CAAC;IAC7B,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD;;;GAGG;AACH,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;gBAGpD,MAAM,EAAE,aAAa,EACtC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAS1C;;;OAGG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAwEjC;;;OAGG;IACG,aAAa,CACjB,QAAQ,EAAE,aAAa,EACvB,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE;QACT,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,GACA,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAmFnC;;OAEG;IACH,kBAAkB,CAChB,QAAQ,EAAE,aAAa,EACvB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAAC,oBAAoB,EAAE,CAAC;IA6CjC;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,2BAA2B;IA8CnC,OAAO,CAAC,sBAAsB;IA6B9B,OAAO,CAAC,yBAAyB;IA8BjC,OAAO,CAAC,cAAc;IAoCtB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,2BAA2B;IA2CnC,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,yBAAyB;IAmEjC,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,4BAA4B;IAiCpC,OAAO,CAAC,oBAAoB;IAkD5B,OAAO,CAAC,qBAAqB;CA2E9B"}
|