@provartesting/provardx-cli 1.4.7 → 1.5.0-beta.1
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/README.md +263 -9
- package/lib/commands/provar/automation/config/validate.js.map +1 -1
- package/lib/commands/provar/automation/project/validate.d.ts +14 -0
- package/lib/commands/provar/automation/project/validate.js +69 -0
- package/lib/commands/provar/automation/project/validate.js.map +1 -0
- package/lib/commands/provar/mcp/start.d.ts +16 -0
- package/lib/commands/provar/mcp/start.js +62 -0
- package/lib/commands/provar/mcp/start.js.map +1 -0
- package/lib/commands/provar/quality-hub/connect.d.ts +5 -0
- package/lib/commands/provar/quality-hub/connect.js +12 -0
- package/lib/commands/provar/quality-hub/connect.js.map +1 -0
- package/lib/commands/provar/quality-hub/display.d.ts +5 -0
- package/lib/commands/provar/quality-hub/display.js +12 -0
- package/lib/commands/provar/quality-hub/display.js.map +1 -0
- package/lib/commands/provar/quality-hub/open.d.ts +5 -0
- package/lib/commands/provar/quality-hub/open.js +12 -0
- package/lib/commands/provar/quality-hub/open.js.map +1 -0
- package/lib/commands/provar/quality-hub/test/run/abort.d.ts +5 -0
- package/lib/commands/provar/quality-hub/test/run/abort.js +12 -0
- package/lib/commands/provar/quality-hub/test/run/abort.js.map +1 -0
- package/lib/commands/provar/quality-hub/test/run/report.d.ts +5 -0
- package/lib/commands/provar/quality-hub/test/run/report.js +12 -0
- package/lib/commands/provar/quality-hub/test/run/report.js.map +1 -0
- package/lib/commands/provar/quality-hub/test/run.d.ts +5 -0
- package/lib/commands/provar/quality-hub/test/run.js +12 -0
- package/lib/commands/provar/quality-hub/test/run.js.map +1 -0
- package/lib/commands/provar/quality-hub/testcase/retrieve.d.ts +5 -0
- package/lib/commands/provar/quality-hub/testcase/retrieve.js +12 -0
- package/lib/commands/provar/quality-hub/testcase/retrieve.js.map +1 -0
- package/lib/mcp/licensing/algasClient.d.ts +19 -0
- package/lib/mcp/licensing/algasClient.js +153 -0
- package/lib/mcp/licensing/algasClient.js.map +1 -0
- package/lib/mcp/licensing/ideDetection.d.ts +22 -0
- package/lib/mcp/licensing/ideDetection.js +107 -0
- package/lib/mcp/licensing/ideDetection.js.map +1 -0
- package/lib/mcp/licensing/index.d.ts +5 -0
- package/lib/mcp/licensing/index.js +10 -0
- package/lib/mcp/licensing/index.js.map +1 -0
- package/lib/mcp/licensing/licenseCache.d.ts +20 -0
- package/lib/mcp/licensing/licenseCache.js +85 -0
- package/lib/mcp/licensing/licenseCache.js.map +1 -0
- package/lib/mcp/licensing/licenseError.d.ts +4 -0
- package/lib/mcp/licensing/licenseError.js +15 -0
- package/lib/mcp/licensing/licenseError.js.map +1 -0
- package/lib/mcp/licensing/licenseValidator.d.ts +33 -0
- package/lib/mcp/licensing/licenseValidator.js +110 -0
- package/lib/mcp/licensing/licenseValidator.js.map +1 -0
- package/lib/mcp/logging/logger.d.ts +7 -0
- package/lib/mcp/logging/logger.js +22 -0
- package/lib/mcp/logging/logger.js.map +1 -0
- package/lib/mcp/rules/page_object_validation_rules.json +344 -0
- package/lib/mcp/rules/provar_best_practices_rules.json +3192 -0
- package/lib/mcp/schemas/common.d.ts +20 -0
- package/lib/mcp/schemas/common.js +16 -0
- package/lib/mcp/schemas/common.js.map +1 -0
- package/lib/mcp/security/pathPolicy.d.ts +19 -0
- package/lib/mcp/security/pathPolicy.js +66 -0
- package/lib/mcp/security/pathPolicy.js.map +1 -0
- package/lib/mcp/server.d.ts +5 -0
- package/lib/mcp/server.js +62 -0
- package/lib/mcp/server.js.map +1 -0
- package/lib/mcp/tools/antTools.d.ts +21 -0
- package/lib/mcp/tools/antTools.js +614 -0
- package/lib/mcp/tools/antTools.js.map +1 -0
- package/lib/mcp/tools/automationTools.d.ts +15 -0
- package/lib/mcp/tools/automationTools.js +379 -0
- package/lib/mcp/tools/automationTools.js.map +1 -0
- package/lib/mcp/tools/bestPracticesEngine.d.ts +30 -0
- package/lib/mcp/tools/bestPracticesEngine.js +632 -0
- package/lib/mcp/tools/bestPracticesEngine.js.map +1 -0
- package/lib/mcp/tools/defectTools.d.ts +15 -0
- package/lib/mcp/tools/defectTools.js +211 -0
- package/lib/mcp/tools/defectTools.js.map +1 -0
- package/lib/mcp/tools/hierarchyValidate.d.ts +139 -0
- package/lib/mcp/tools/hierarchyValidate.js +540 -0
- package/lib/mcp/tools/hierarchyValidate.js.map +1 -0
- package/lib/mcp/tools/pageObjectGenerate.d.ts +3 -0
- package/lib/mcp/tools/pageObjectGenerate.js +153 -0
- package/lib/mcp/tools/pageObjectGenerate.js.map +1 -0
- package/lib/mcp/tools/pageObjectValidate.d.ts +18 -0
- package/lib/mcp/tools/pageObjectValidate.js +420 -0
- package/lib/mcp/tools/pageObjectValidate.js.map +1 -0
- package/lib/mcp/tools/projectInspect.d.ts +3 -0
- package/lib/mcp/tools/projectInspect.js +694 -0
- package/lib/mcp/tools/projectInspect.js.map +1 -0
- package/lib/mcp/tools/projectValidateFromPath.d.ts +3 -0
- package/lib/mcp/tools/projectValidateFromPath.js +153 -0
- package/lib/mcp/tools/projectValidateFromPath.js.map +1 -0
- package/lib/mcp/tools/propertiesTools.d.ts +7 -0
- package/lib/mcp/tools/propertiesTools.js +314 -0
- package/lib/mcp/tools/propertiesTools.js.map +1 -0
- package/lib/mcp/tools/qualityHubTools.d.ts +8 -0
- package/lib/mcp/tools/qualityHubTools.js +189 -0
- package/lib/mcp/tools/qualityHubTools.js.map +1 -0
- package/lib/mcp/tools/rcaTools.d.ts +4 -0
- package/lib/mcp/tools/rcaTools.js +620 -0
- package/lib/mcp/tools/rcaTools.js.map +1 -0
- package/lib/mcp/tools/sfSpawn.d.ts +28 -0
- package/lib/mcp/tools/sfSpawn.js +56 -0
- package/lib/mcp/tools/sfSpawn.js.map +1 -0
- package/lib/mcp/tools/testCaseGenerate.d.ts +3 -0
- package/lib/mcp/tools/testCaseGenerate.js +221 -0
- package/lib/mcp/tools/testCaseGenerate.js.map +1 -0
- package/lib/mcp/tools/testCaseValidate.d.ts +20 -0
- package/lib/mcp/tools/testCaseValidate.js +232 -0
- package/lib/mcp/tools/testCaseValidate.js.map +1 -0
- package/lib/mcp/tools/testPlanTools.d.ts +6 -0
- package/lib/mcp/tools/testPlanTools.js +311 -0
- package/lib/mcp/tools/testPlanTools.js.map +1 -0
- package/lib/mcp/tools/testPlanValidate.d.ts +2 -0
- package/lib/mcp/tools/testPlanValidate.js +75 -0
- package/lib/mcp/tools/testPlanValidate.js.map +1 -0
- package/lib/mcp/tools/testSuiteValidate.d.ts +2 -0
- package/lib/mcp/tools/testSuiteValidate.js +63 -0
- package/lib/mcp/tools/testSuiteValidate.js.map +1 -0
- package/lib/services/projectValidation.d.ts +119 -0
- package/lib/services/projectValidation.js +678 -0
- package/lib/services/projectValidation.js.map +1 -0
- package/messages/sf.provar.automation.project.validate.md +52 -0
- package/messages/sf.provar.mcp.start.md +74 -0
- package/oclif.manifest.json +1370 -1
- package/package.json +48 -26
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2024 Provar Limited.
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* Licensed under the BSD 3-Clause license.
|
|
5
|
+
* For full license text, see LICENSE.md file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
6
|
+
*/
|
|
7
|
+
/* eslint-disable camelcase */
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
10
|
+
import { validateTestCase } from './testCaseValidate.js';
|
|
11
|
+
// ── Rule registry (ported from batch_validator/handler.py) ───────────────────
|
|
12
|
+
const RULE_REGISTRY = {
|
|
13
|
+
'SUITE-EMPTY-001': { name: 'Empty Test Suite', description: 'A test suite must contain at least one test case or child suite.' },
|
|
14
|
+
'SUITE-DUP-001': { name: 'Duplicate Test Case Name in Suite', description: 'Test case names within a suite must be unique.' },
|
|
15
|
+
'SUITE-DUP-002': { name: 'Duplicate Child Suite Name', description: 'Child suite names within a parent suite must be unique.' },
|
|
16
|
+
'SUITE-SIZE-001': { name: 'Oversized Test Suite', description: 'A test suite should contain no more than 75 test cases.' },
|
|
17
|
+
'SUITE-NAMING-001': { name: 'Inconsistent Child Suite Naming', description: 'All child suite names should follow a consistent naming convention.' },
|
|
18
|
+
'SUITE-NAMING-002': { name: 'Inconsistent Test Case Naming', description: 'All test case names within a suite should follow a consistent naming convention.' },
|
|
19
|
+
'PLAN-EMPTY-001': { name: 'Empty Test Plan', description: 'A test plan must contain at least one test suite.' },
|
|
20
|
+
'PLAN-DUP-001': { name: 'Duplicate Suite Name in Plan', description: 'Suite names within a test plan must be unique.' },
|
|
21
|
+
'PLAN-META-001': { name: 'Missing Plan Objectives', description: 'Test plans should define clear testing objectives. This field is configured in the Provar Quality Hub app (not stored in local project files).' },
|
|
22
|
+
'PLAN-META-002': { name: 'Missing In-Scope Definition', description: 'Test plans should specify which features are in scope. This field is configured in the Provar Quality Hub app (not stored in local project files).' },
|
|
23
|
+
'PLAN-META-003': { name: 'Missing Testing Methodology', description: 'Test plans should document the testing methodology. This field is configured in the Provar Quality Hub app (not stored in local project files).' },
|
|
24
|
+
'PLAN-META-004': { name: 'Missing Acceptance Criteria', description: 'Test plans should define acceptance criteria or an acceptable pass rate. This field is configured in the Provar Quality Hub app (not stored in local project files).' },
|
|
25
|
+
'PLAN-META-005': { name: 'Missing Test Environments', description: 'Test plans should specify the target test environments. This field is configured in the Provar Quality Hub app (not stored in local project files).' },
|
|
26
|
+
'PLAN-META-006': { name: 'Missing Test Data Strategy', description: 'Test plans should document how test data will be prepared and cleaned up. This field is configured in the Provar Quality Hub app (not stored in local project files).' },
|
|
27
|
+
'PLAN-META-007': { name: 'Missing Risk Assessment', description: 'Test plans should identify potential risks and mitigations. This field is configured in the Provar Quality Hub app (not stored in local project files).' },
|
|
28
|
+
'PLAN-SIZE-001': { name: 'Oversized Test Plan', description: 'A test plan should contain no more than 20 test suites.' },
|
|
29
|
+
'PLAN-NAMING-001': { name: 'Inconsistent Suite Naming in Plan', description: 'All suite names within a test plan should follow a consistent naming convention.' },
|
|
30
|
+
'PROJ-EMPTY-001': { name: 'Empty Project', description: 'A project must contain at least one test plan.' },
|
|
31
|
+
'PROJ-DUP-001': { name: 'Duplicate Test Case Name Across Project', description: 'Test case names must be unique across the entire project.' },
|
|
32
|
+
'PROJ-DUP-002': { name: 'Duplicate Plan Name in Project', description: 'Test plan names within a project must be unique.' },
|
|
33
|
+
'PROJ-CALLABLE-001': { name: 'Unresolved caseCall Reference', description: 'All caseCall references must point to existing test cases in the project.' },
|
|
34
|
+
'PROJ-CALLABLE-002': { name: 'Missing Callable Test Case', description: 'All callable tests referenced by caseCall must exist in the project.' },
|
|
35
|
+
'PROJ-CONN-001': { name: 'Undefined Connection Name', description: 'All connection names used in test cases must be defined in the project context.' },
|
|
36
|
+
'PROJ-ENV-001': { name: 'Duplicate Environment Name', description: 'Environment names within a project must be unique.' },
|
|
37
|
+
'PROJ-ENV-002': { name: 'Invalid Environment Name', description: 'Environment names must contain only letters, digits, and underscores.' },
|
|
38
|
+
'PROJ-SECRET-001': { name: 'Missing Secrets Password', description: 'A Provar Secrets Password must be configured to protect sensitive test data.' },
|
|
39
|
+
'PROJ-ENC-001': { name: 'Unencrypted Credentials in .secrets', description: 'All values in the .secrets file must be wrapped in ENC1() encryption. Plaintext credentials are a critical security risk.' },
|
|
40
|
+
};
|
|
41
|
+
// ── Violation builder ─────────────────────────────────────────────────────────
|
|
42
|
+
function makeViolation(rule_id, category, severity, weight, message, recommendation, applies_to, affected_files) {
|
|
43
|
+
const entry = RULE_REGISTRY[rule_id] ?? { name: rule_id, description: '' };
|
|
44
|
+
const v = {
|
|
45
|
+
rule_id,
|
|
46
|
+
name: entry.name,
|
|
47
|
+
description: entry.description,
|
|
48
|
+
category,
|
|
49
|
+
severity,
|
|
50
|
+
weight,
|
|
51
|
+
message,
|
|
52
|
+
recommendation,
|
|
53
|
+
applies_to,
|
|
54
|
+
};
|
|
55
|
+
if (affected_files?.length)
|
|
56
|
+
v.affected_files = affected_files;
|
|
57
|
+
return v;
|
|
58
|
+
}
|
|
59
|
+
// ── Scoring helpers ───────────────────────────────────────────────────────────
|
|
60
|
+
const SEVERITY_MULTIPLIER = {
|
|
61
|
+
critical: 1.0, major: 0.75, minor: 0.5, info: 0.25,
|
|
62
|
+
};
|
|
63
|
+
export function computeViolationDeduction(violations) {
|
|
64
|
+
let total = 0;
|
|
65
|
+
for (const v of violations) {
|
|
66
|
+
const mult = SEVERITY_MULTIPLIER[v.severity] ?? 0.5;
|
|
67
|
+
total += v.weight * mult;
|
|
68
|
+
}
|
|
69
|
+
return total;
|
|
70
|
+
}
|
|
71
|
+
function childAvg(scores) {
|
|
72
|
+
return scores.length ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;
|
|
73
|
+
}
|
|
74
|
+
// ── Naming consistency helpers ────────────────────────────────────────────────
|
|
75
|
+
export function detectNamingStyle(nameStr) {
|
|
76
|
+
const stem = nameStr.includes('.') ? path.basename(nameStr, path.extname(nameStr)) : nameStr;
|
|
77
|
+
if (!stem)
|
|
78
|
+
return 'unknown';
|
|
79
|
+
if (stem.includes(' '))
|
|
80
|
+
return 'space separated';
|
|
81
|
+
if (stem.includes('-'))
|
|
82
|
+
return 'kebab-case';
|
|
83
|
+
if (stem.includes('_'))
|
|
84
|
+
return stem === stem.toUpperCase() ? 'UPPER_SNAKE' : 'snake_case';
|
|
85
|
+
if (/^[A-Z]/.test(stem) && /[a-z]/.test(stem))
|
|
86
|
+
return 'PascalCase';
|
|
87
|
+
if (/^[a-z]/.test(stem) && /[A-Z]/.test(stem))
|
|
88
|
+
return 'camelCase';
|
|
89
|
+
return 'unknown';
|
|
90
|
+
}
|
|
91
|
+
export function checkNamingConsistency(names, contextLabel, level, ruleId) {
|
|
92
|
+
if (names.length < 2)
|
|
93
|
+
return [];
|
|
94
|
+
const styles = {};
|
|
95
|
+
for (const n of names) {
|
|
96
|
+
const style = detectNamingStyle(n);
|
|
97
|
+
if (style !== 'unknown') {
|
|
98
|
+
(styles[style] ??= []).push(n);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (Object.keys(styles).length <= 1)
|
|
102
|
+
return [];
|
|
103
|
+
const styleSummary = Object.entries(styles)
|
|
104
|
+
.sort()
|
|
105
|
+
.map(([s, items]) => `${s} (${items.length})`)
|
|
106
|
+
.join(', ');
|
|
107
|
+
const examples = Object.entries(styles)
|
|
108
|
+
.sort()
|
|
109
|
+
.map(([s, items]) => `${s}: "${items[0]}"`)
|
|
110
|
+
.join(', ');
|
|
111
|
+
return [makeViolation(ruleId, 'NamingConventions', 'info', 2, `Inconsistent naming conventions in ${contextLabel}: ${styleSummary}`, `Adopt a single naming convention across all items. Examples found: ${examples}`, [level])];
|
|
112
|
+
}
|
|
113
|
+
// ── Test case validation (adapts existing validator to hierarchy result) ───────
|
|
114
|
+
export function validateHierarchyTestCase(tc, qualityThreshold) {
|
|
115
|
+
// Accept both `xml` (API standard) and `xml_content` (MCP original); prefer `xml`
|
|
116
|
+
const xmlSource = tc.xml ?? tc.xml_content ?? '';
|
|
117
|
+
try {
|
|
118
|
+
const r = validateTestCase(xmlSource, tc.name);
|
|
119
|
+
const status = !r.is_valid ? 'invalid' : r.quality_score < qualityThreshold ? 'invalid' : 'valid';
|
|
120
|
+
return {
|
|
121
|
+
name: tc.name,
|
|
122
|
+
level: 'test_case',
|
|
123
|
+
status,
|
|
124
|
+
quality_score: r.quality_score,
|
|
125
|
+
validity_score: r.validity_score,
|
|
126
|
+
is_valid: r.is_valid,
|
|
127
|
+
error_count: r.error_count,
|
|
128
|
+
warning_count: r.warning_count,
|
|
129
|
+
step_count: r.step_count,
|
|
130
|
+
issues: r.issues,
|
|
131
|
+
best_practices_violations: r.best_practices_violations ?? [],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
return {
|
|
136
|
+
name: tc.name,
|
|
137
|
+
level: 'test_case',
|
|
138
|
+
status: 'error',
|
|
139
|
+
quality_score: 0,
|
|
140
|
+
validity_score: 0,
|
|
141
|
+
is_valid: false,
|
|
142
|
+
error_count: 1,
|
|
143
|
+
warning_count: 0,
|
|
144
|
+
step_count: 0,
|
|
145
|
+
issues: [{
|
|
146
|
+
rule_id: 'TC_000',
|
|
147
|
+
severity: 'ERROR',
|
|
148
|
+
message: `Unexpected error: ${e.message}`,
|
|
149
|
+
applies_to: 'document',
|
|
150
|
+
}],
|
|
151
|
+
best_practices_violations: [],
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// ── Suite validation ──────────────────────────────────────────────────────────
|
|
156
|
+
function checkSuiteStructure(suiteName, childSuites, childCases) {
|
|
157
|
+
const violations = [];
|
|
158
|
+
if (!childSuites.length && !childCases.length) {
|
|
159
|
+
violations.push(makeViolation('SUITE-EMPTY-001', 'SuiteStructure', 'major', 5, `Test suite "${suiteName}" contains no test cases or child suites`, `Add at least one test case or child suite to "${suiteName}"`, ['TestSuite']));
|
|
160
|
+
}
|
|
161
|
+
return violations;
|
|
162
|
+
}
|
|
163
|
+
function checkSuiteDuplicates(suiteName, childSuites, childCases) {
|
|
164
|
+
const violations = [];
|
|
165
|
+
const seenCases = {};
|
|
166
|
+
for (const tc of childCases) {
|
|
167
|
+
const base = path.basename(tc.name, path.extname(tc.name)).toLowerCase();
|
|
168
|
+
if (seenCases[base]) {
|
|
169
|
+
violations.push(makeViolation('SUITE-DUP-001', 'Maintainability', 'major', 5, `Duplicate test case name "${base}" in suite "${suiteName}"`, 'Ensure all test case names within a suite are unique', ['TestSuite'], [seenCases[base], tc.name]));
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
seenCases[base] = tc.name;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const seenSuites = new Set();
|
|
176
|
+
for (const cs of childSuites) {
|
|
177
|
+
const lower = cs.name.toLowerCase();
|
|
178
|
+
if (seenSuites.has(lower)) {
|
|
179
|
+
violations.push(makeViolation('SUITE-DUP-002', 'Maintainability', 'major', 5, `Duplicate child suite name "${cs.name}" in suite "${suiteName}"`, 'Ensure all child suite names are unique within a parent suite', ['TestSuite']));
|
|
180
|
+
}
|
|
181
|
+
seenSuites.add(lower);
|
|
182
|
+
}
|
|
183
|
+
return violations;
|
|
184
|
+
}
|
|
185
|
+
function checkSuiteSize(suiteName, data) {
|
|
186
|
+
const explicit = data.test_case_count;
|
|
187
|
+
const count = explicit ?? (data.test_cases?.length ?? 0);
|
|
188
|
+
if (count > 75) {
|
|
189
|
+
return [makeViolation('SUITE-SIZE-001', 'SuiteStructure', 'minor', 2, `Test suite "${suiteName}" contains ${count} test cases (recommended maximum: 75)`, 'Break large suites into smaller, focused child suites', ['TestSuite'])];
|
|
190
|
+
}
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
export function validateSuite(data, qualityThreshold) {
|
|
194
|
+
const suiteName = data.name || 'Unnamed Suite';
|
|
195
|
+
const childSuites = data.test_suites ?? [];
|
|
196
|
+
const childCases = data.test_cases ?? [];
|
|
197
|
+
const violations = [
|
|
198
|
+
...checkSuiteStructure(suiteName, childSuites, childCases),
|
|
199
|
+
...checkSuiteDuplicates(suiteName, childSuites, childCases),
|
|
200
|
+
...checkSuiteSize(suiteName, data),
|
|
201
|
+
...checkNamingConsistency(childSuites.map((cs) => cs.name), `suite "${suiteName}" child suites`, 'TestSuite', 'SUITE-NAMING-001'),
|
|
202
|
+
...checkNamingConsistency(childCases.map((tc) => tc.name), `suite "${suiteName}" test cases`, 'TestSuite', 'SUITE-NAMING-002'),
|
|
203
|
+
];
|
|
204
|
+
const suiteResults = childSuites.map((cs) => validateSuite(cs, qualityThreshold));
|
|
205
|
+
const caseResults = childCases.map((tc) => validateHierarchyTestCase(tc, qualityThreshold));
|
|
206
|
+
const scores = [
|
|
207
|
+
...caseResults.map((r) => r.quality_score),
|
|
208
|
+
...suiteResults.map((r) => r.quality_score),
|
|
209
|
+
];
|
|
210
|
+
const quality_score = scores.length
|
|
211
|
+
? Math.max(0, Math.round((childAvg(scores) - computeViolationDeduction(violations)) * 100) / 100)
|
|
212
|
+
: 0;
|
|
213
|
+
return {
|
|
214
|
+
name: suiteName,
|
|
215
|
+
level: 'suite',
|
|
216
|
+
quality_score,
|
|
217
|
+
violations,
|
|
218
|
+
test_cases: caseResults,
|
|
219
|
+
test_suites: suiteResults,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
// ── Plan validation ───────────────────────────────────────────────────────────
|
|
223
|
+
function checkPlanMetadata(planName, meta) {
|
|
224
|
+
const v = [];
|
|
225
|
+
if (!meta.objectives)
|
|
226
|
+
v.push(makeViolation('PLAN-META-001', 'PlanCompleteness', 'info', 1, `Test plan "${planName}" has no objectives defined`, 'Add testing objectives via the Provar Quality Hub app', ['TestPlan']));
|
|
227
|
+
if (!meta.in_scope)
|
|
228
|
+
v.push(makeViolation('PLAN-META-002', 'PlanCompleteness', 'info', 1, `Test plan "${planName}" has no in-scope definition`, 'Specify in-scope features via the Provar Quality Hub app', ['TestPlan']));
|
|
229
|
+
if (!meta.testing_methodology)
|
|
230
|
+
v.push(makeViolation('PLAN-META-003', 'PlanCompleteness', 'info', 1, `Test plan "${planName}" has no testing methodology defined`, 'Document the testing methodology via the Provar Quality Hub app', ['TestPlan']));
|
|
231
|
+
if (!meta.acceptance_criteria && meta.acceptable_pass_rate === undefined)
|
|
232
|
+
v.push(makeViolation('PLAN-META-004', 'PlanCompleteness', 'info', 1, `Test plan "${planName}" has no acceptance criteria or acceptable pass rate`, 'Set acceptance criteria or an acceptable pass rate via the Provar Quality Hub app', ['TestPlan']));
|
|
233
|
+
if (!meta.environments?.length)
|
|
234
|
+
v.push(makeViolation('PLAN-META-005', 'PlanCompleteness', 'info', 1, `Test plan "${planName}" has no test environments defined`, 'Specify target environments (e.g., QA, Staging, UAT) via the Provar Quality Hub app', ['TestPlan']));
|
|
235
|
+
if (!meta.test_data_strategy)
|
|
236
|
+
v.push(makeViolation('PLAN-META-006', 'PlanCompleteness', 'minor', 2, `Test plan "${planName}" has no test data strategy`, 'Document the test data strategy via the Provar Quality Hub app', ['TestPlan']));
|
|
237
|
+
if (!meta.risks)
|
|
238
|
+
v.push(makeViolation('PLAN-META-007', 'PlanCompleteness', 'info', 1, `Test plan "${planName}" has no risks identified`, 'Identify risks and mitigations via the Provar Quality Hub app', ['TestPlan']));
|
|
239
|
+
return v;
|
|
240
|
+
}
|
|
241
|
+
export function validatePlan(data, qualityThreshold) {
|
|
242
|
+
const planName = data.name || 'Unnamed Plan';
|
|
243
|
+
const childSuites = data.test_suites ?? [];
|
|
244
|
+
const childCases = data.test_cases ?? [];
|
|
245
|
+
const violations = [];
|
|
246
|
+
if (!childSuites.length && !childCases.length) {
|
|
247
|
+
violations.push(makeViolation('PLAN-EMPTY-001', 'PlanStructure', 'major', 5, `Test plan "${planName}" contains no test suites or test cases`, `Add at least one test suite or test case to "${planName}"`, ['TestPlan']));
|
|
248
|
+
}
|
|
249
|
+
const seenSuites = new Set();
|
|
250
|
+
for (const s of childSuites) {
|
|
251
|
+
const lower = s.name.toLowerCase();
|
|
252
|
+
if (seenSuites.has(lower)) {
|
|
253
|
+
violations.push(makeViolation('PLAN-DUP-001', 'Maintainability', 'major', 5, `Duplicate suite name "${s.name}" in plan "${planName}"`, 'Ensure all suite names within a plan are unique', ['TestPlan']));
|
|
254
|
+
}
|
|
255
|
+
seenSuites.add(lower);
|
|
256
|
+
}
|
|
257
|
+
const meta = data.metadata ?? {};
|
|
258
|
+
violations.push(...checkPlanMetadata(planName, meta));
|
|
259
|
+
const suiteCount = data.test_suite_count ?? childSuites.length;
|
|
260
|
+
if (suiteCount > 20) {
|
|
261
|
+
violations.push(makeViolation('PLAN-SIZE-001', 'PlanStructure', 'minor', 2, `Test plan "${planName}" contains ${suiteCount} test suites (recommended maximum: 20)`, 'Split the plan into multiple focused test plans', ['TestPlan']));
|
|
262
|
+
}
|
|
263
|
+
violations.push(...checkNamingConsistency(childSuites.map((s) => s.name), `plan "${planName}"`, 'TestPlan', 'PLAN-NAMING-001'));
|
|
264
|
+
const suiteResults = childSuites.map((s) => validateSuite(s, qualityThreshold));
|
|
265
|
+
const caseResults = childCases.map((tc) => validateHierarchyTestCase(tc, qualityThreshold));
|
|
266
|
+
const scores = [
|
|
267
|
+
...suiteResults.map((r) => r.quality_score),
|
|
268
|
+
...caseResults.map((r) => r.quality_score),
|
|
269
|
+
];
|
|
270
|
+
const quality_score = scores.length
|
|
271
|
+
? Math.max(0, Math.round((childAvg(scores) - computeViolationDeduction(violations)) * 100) / 100)
|
|
272
|
+
: 0;
|
|
273
|
+
return {
|
|
274
|
+
name: planName,
|
|
275
|
+
level: 'plan',
|
|
276
|
+
quality_score,
|
|
277
|
+
violations,
|
|
278
|
+
test_suites: suiteResults,
|
|
279
|
+
test_cases: caseResults,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
// ── Project cross-cutting rules ───────────────────────────────────────────────
|
|
283
|
+
function buildCrossRefRegistry(testPlans, testSuites, testCases) {
|
|
284
|
+
const registry = {};
|
|
285
|
+
function addSuiteTree(s) {
|
|
286
|
+
for (const tc of s.test_cases ?? [])
|
|
287
|
+
registry[tc.name] = tc.xml ?? tc.xml_content ?? '';
|
|
288
|
+
for (const cs of s.test_suites ?? [])
|
|
289
|
+
addSuiteTree(cs);
|
|
290
|
+
}
|
|
291
|
+
for (const tc of testCases)
|
|
292
|
+
registry[tc.name] = tc.xml ?? tc.xml_content ?? '';
|
|
293
|
+
for (const s of testSuites)
|
|
294
|
+
addSuiteTree(s);
|
|
295
|
+
for (const p of testPlans) {
|
|
296
|
+
for (const tc of p.test_cases ?? [])
|
|
297
|
+
registry[tc.name] = tc.xml ?? tc.xml_content ?? '';
|
|
298
|
+
for (const s of p.test_suites ?? [])
|
|
299
|
+
addSuiteTree(s);
|
|
300
|
+
}
|
|
301
|
+
return registry;
|
|
302
|
+
}
|
|
303
|
+
function checkDuplicateNames(registry) {
|
|
304
|
+
const violations = [];
|
|
305
|
+
const seen = {};
|
|
306
|
+
for (const name of Object.keys(registry)) {
|
|
307
|
+
const base = path.basename(name, path.extname(name)).toLowerCase();
|
|
308
|
+
if (seen[base]) {
|
|
309
|
+
violations.push(makeViolation('PROJ-DUP-001', 'Maintainability', 'major', 5, `Duplicate test case name detected: "${base}"`, 'Ensure all test case names are unique across the project', ['Project'], [seen[base], name]));
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
seen[base] = name;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return violations;
|
|
316
|
+
}
|
|
317
|
+
function checkCaseCalls(registry, diskTestCaseNames = new Set()) {
|
|
318
|
+
const violations = [];
|
|
319
|
+
// Include all on-disk test cases (callables have no .testinstance so they're absent from
|
|
320
|
+
// the plan-built registry — merging diskTestCaseNames prevents false PROJ-CALLABLE-001/002)
|
|
321
|
+
const available = new Set([...Object.keys(registry), ...diskTestCaseNames]);
|
|
322
|
+
const availableBase = new Set([...Object.keys(registry).map((n) => path.basename(n, path.extname(n))), ...diskTestCaseNames]);
|
|
323
|
+
const calledPaths = new Set();
|
|
324
|
+
// Group callers by missing callee — avoids N violations for the same missing test
|
|
325
|
+
const missingCalleeCallers = new Map();
|
|
326
|
+
const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@_', parseAttributeValue: false });
|
|
327
|
+
for (const [testName, xml] of Object.entries(registry)) {
|
|
328
|
+
if (!xml)
|
|
329
|
+
continue;
|
|
330
|
+
try {
|
|
331
|
+
const parsed = parser.parse(xml);
|
|
332
|
+
const tc = parsed['testCase'];
|
|
333
|
+
if (!tc)
|
|
334
|
+
continue;
|
|
335
|
+
const steps = tc['steps'];
|
|
336
|
+
if (!steps)
|
|
337
|
+
continue;
|
|
338
|
+
const rawCalls = steps['caseCall'];
|
|
339
|
+
const calls = rawCalls ? (Array.isArray(rawCalls) ? rawCalls : [rawCalls]) : [];
|
|
340
|
+
for (const call of calls) {
|
|
341
|
+
const called = call['@_testCasePath']?.trim() ?? '';
|
|
342
|
+
if (!called)
|
|
343
|
+
continue;
|
|
344
|
+
calledPaths.add(path.basename(called, path.extname(called)));
|
|
345
|
+
if (!available.has(called) && !availableBase.has(path.basename(called, path.extname(called)))) {
|
|
346
|
+
if (!missingCalleeCallers.has(called))
|
|
347
|
+
missingCalleeCallers.set(called, new Set());
|
|
348
|
+
missingCalleeCallers.get(called).add(testName);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
// skip unparseable XML
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// One violation per unique missing callee (affected_files lists all callers)
|
|
357
|
+
for (const [called, callers] of missingCalleeCallers) {
|
|
358
|
+
const n = callers.size;
|
|
359
|
+
violations.push(makeViolation('PROJ-CALLABLE-001', 'ReusabilityAndCallables', 'major', 5, `caseCall references non-existent test: "${called}" (referenced in ${n} test case${n > 1 ? 's' : ''})`, `Ensure "${called}" exists in the project or update the reference`, ['Project'], [...callers].sort()));
|
|
360
|
+
}
|
|
361
|
+
for (const called of calledPaths) {
|
|
362
|
+
if (!availableBase.has(called)) {
|
|
363
|
+
violations.push(makeViolation('PROJ-CALLABLE-002', 'ReusabilityAndCallables', 'critical', 10, `Callable test "${called}" is referenced but does not exist in project`, `Add "${called}.testcase" to the project or remove the caseCall references`, ['Project']));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return violations;
|
|
367
|
+
}
|
|
368
|
+
function extractConnFromCall(call) {
|
|
369
|
+
if (call['@_apiId'] !== 'com.provar.plugins.forcedotcom.core.testapis.ApexConnect')
|
|
370
|
+
return undefined;
|
|
371
|
+
const args = call['argument'];
|
|
372
|
+
const argArr = args ? (Array.isArray(args) ? args : [args]) : [];
|
|
373
|
+
for (const arg of argArr) {
|
|
374
|
+
if (arg['@_id'] !== 'connectionName')
|
|
375
|
+
continue;
|
|
376
|
+
const val = arg['value'];
|
|
377
|
+
return (val?.['#text'] ?? val);
|
|
378
|
+
}
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
function checkConnectionConsistency(registry, ctx) {
|
|
382
|
+
const violations = [];
|
|
383
|
+
const defined = new Set(ctx.connection_names ?? []);
|
|
384
|
+
if (!defined.size)
|
|
385
|
+
return violations;
|
|
386
|
+
const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@_', parseAttributeValue: false });
|
|
387
|
+
const undefinedConns = {};
|
|
388
|
+
for (const [testName, xml] of Object.entries(registry)) {
|
|
389
|
+
if (!xml)
|
|
390
|
+
continue;
|
|
391
|
+
try {
|
|
392
|
+
const parsed = parser.parse(xml);
|
|
393
|
+
const tc = parsed['testCase'];
|
|
394
|
+
if (!tc)
|
|
395
|
+
continue;
|
|
396
|
+
const steps = tc['steps'];
|
|
397
|
+
if (!steps)
|
|
398
|
+
continue;
|
|
399
|
+
const rawCalls = steps['apiCall'];
|
|
400
|
+
const calls = rawCalls ? (Array.isArray(rawCalls) ? rawCalls : [rawCalls]) : [];
|
|
401
|
+
for (const call of calls) {
|
|
402
|
+
const conn = extractConnFromCall(call);
|
|
403
|
+
if (conn && !defined.has(conn)) {
|
|
404
|
+
(undefinedConns[conn] ??= []).push(testName);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
// skip
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
for (const [conn, files] of Object.entries(undefinedConns)) {
|
|
413
|
+
violations.push(makeViolation('PROJ-CONN-001', 'ConnectionsAndEnvironments', 'major', 5, `Connection "${conn}" used but not defined in project`, `Ensure connection "${conn}" is defined in your Provar project`, ['Project'], files));
|
|
414
|
+
}
|
|
415
|
+
return violations;
|
|
416
|
+
}
|
|
417
|
+
function checkEnvironments(ctx) {
|
|
418
|
+
const violations = [];
|
|
419
|
+
const envs = ctx.environments ?? [];
|
|
420
|
+
if (!envs.length)
|
|
421
|
+
return violations;
|
|
422
|
+
const seen = new Set();
|
|
423
|
+
const envPattern = /^[A-Za-z0-9_]+$/;
|
|
424
|
+
for (const env of envs) {
|
|
425
|
+
const lower = env.toLowerCase();
|
|
426
|
+
if (seen.has(lower)) {
|
|
427
|
+
violations.push(makeViolation('PROJ-ENV-001', 'ConnectionsAndEnvironments', 'major', 5, `Duplicate environment name: "${env}"`, 'Remove or rename duplicate environments', ['Project']));
|
|
428
|
+
}
|
|
429
|
+
seen.add(lower);
|
|
430
|
+
if (!envPattern.test(env)) {
|
|
431
|
+
violations.push(makeViolation('PROJ-ENV-002', 'ConnectionsAndEnvironments', 'major', 5, `Environment name "${env}" contains invalid characters`, 'Use only letters, digits, and underscores for environment names', ['Project']));
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return violations;
|
|
435
|
+
}
|
|
436
|
+
export function validateProject(data, qualityThreshold) {
|
|
437
|
+
const projectName = data.name || 'Unnamed Project';
|
|
438
|
+
const testPlans = data.test_plans ?? [];
|
|
439
|
+
const testSuites = data.test_suites ?? [];
|
|
440
|
+
const testCases = data.test_cases ?? [];
|
|
441
|
+
const ctx = { ...data.project_context };
|
|
442
|
+
const planResults = testPlans.map((p) => validatePlan(p, qualityThreshold));
|
|
443
|
+
const suiteResults = testSuites.map((s) => validateSuite(s, qualityThreshold));
|
|
444
|
+
const caseResults = testCases.map((tc) => validateHierarchyTestCase(tc, qualityThreshold));
|
|
445
|
+
const violations = [];
|
|
446
|
+
if (!testPlans.length && !testSuites.length && !testCases.length) {
|
|
447
|
+
violations.push(makeViolation('PROJ-EMPTY-001', 'ProjectStructure', 'major', 5, `Project "${projectName}" contains no test plans, test suites, or test cases`, `Add at least one test plan, test suite, or test case to "${projectName}"`, ['Project']));
|
|
448
|
+
}
|
|
449
|
+
const seenPlans = new Set();
|
|
450
|
+
for (const p of testPlans) {
|
|
451
|
+
const lower = p.name.toLowerCase();
|
|
452
|
+
if (seenPlans.has(lower)) {
|
|
453
|
+
violations.push(makeViolation('PROJ-DUP-002', 'Maintainability', 'major', 5, `Duplicate plan name "${p.name}" in project "${projectName}"`, 'Ensure all test plan names within a project are unique', ['Project']));
|
|
454
|
+
}
|
|
455
|
+
seenPlans.add(lower);
|
|
456
|
+
}
|
|
457
|
+
// Cross-cutting rules require the full test case registry
|
|
458
|
+
const registry = buildCrossRefRegistry(testPlans, testSuites, testCases);
|
|
459
|
+
violations.push(...checkDuplicateNames(registry));
|
|
460
|
+
violations.push(...checkCaseCalls(registry, new Set(data.all_disk_test_case_names ?? [])));
|
|
461
|
+
violations.push(...checkConnectionConsistency(registry, ctx));
|
|
462
|
+
violations.push(...checkEnvironments(ctx));
|
|
463
|
+
if (!ctx.secretsPasswordSet) {
|
|
464
|
+
violations.push(makeViolation('PROJ-SECRET-001', 'ConnectionsAndEnvironments', 'major', 5, 'Provar Secrets Password is not configured for this project', 'Set a Secrets Password in the Provar project settings to encrypt sensitive test data', ['Project']));
|
|
465
|
+
}
|
|
466
|
+
if (ctx.unencrypted_secret_count !== undefined && ctx.unencrypted_secret_count > 0) {
|
|
467
|
+
violations.push(makeViolation('PROJ-ENC-001', 'ConnectionsAndEnvironments', 'critical', 20, `${ctx.unencrypted_secret_count} credential(s) in .secrets are stored as plaintext (missing ENC1() wrapper)`, 'Re-configure the Provar Secrets Password and re-save all connections so credentials are re-encrypted', ['Project']));
|
|
468
|
+
}
|
|
469
|
+
const scores = [
|
|
470
|
+
...planResults.map((r) => r.quality_score),
|
|
471
|
+
...suiteResults.map((r) => r.quality_score),
|
|
472
|
+
...caseResults.map((r) => r.quality_score),
|
|
473
|
+
];
|
|
474
|
+
const quality_score = scores.length
|
|
475
|
+
? Math.max(0, Math.round((childAvg(scores) - computeViolationDeduction(violations)) * 100) / 100)
|
|
476
|
+
: 0;
|
|
477
|
+
return {
|
|
478
|
+
name: projectName,
|
|
479
|
+
level: 'project',
|
|
480
|
+
quality_score,
|
|
481
|
+
violations,
|
|
482
|
+
test_plans: planResults,
|
|
483
|
+
test_suites: suiteResults,
|
|
484
|
+
test_cases: caseResults,
|
|
485
|
+
project_context: ctx,
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
// ── Summary builder ───────────────────────────────────────────────────────────
|
|
489
|
+
export function buildHierarchySummary(result) {
|
|
490
|
+
const stats = {
|
|
491
|
+
total_test_cases: 0,
|
|
492
|
+
test_cases_valid: 0,
|
|
493
|
+
test_cases_invalid: 0,
|
|
494
|
+
test_cases_error: 0,
|
|
495
|
+
total_violations: 0,
|
|
496
|
+
violations_by_severity: { critical: 0, major: 0, minor: 0, info: 0 },
|
|
497
|
+
violations_by_level: { project: 0, plan: 0, suite: 0, test_case: 0 },
|
|
498
|
+
quality_score_avg: 0,
|
|
499
|
+
quality_score_min: null,
|
|
500
|
+
quality_score_max: null,
|
|
501
|
+
};
|
|
502
|
+
const scores = [];
|
|
503
|
+
function walkNode(node) {
|
|
504
|
+
const nodeLevel = node.level;
|
|
505
|
+
const nodeViolations = node.level === 'test_case' ? [] : node.violations;
|
|
506
|
+
stats.total_violations += nodeViolations.length;
|
|
507
|
+
if (nodeLevel in stats.violations_by_level)
|
|
508
|
+
stats.violations_by_level[nodeLevel] += nodeViolations.length;
|
|
509
|
+
for (const v of nodeViolations) {
|
|
510
|
+
if (v.severity in stats.violations_by_severity)
|
|
511
|
+
stats.violations_by_severity[v.severity]++;
|
|
512
|
+
}
|
|
513
|
+
if (node.level === 'test_case') {
|
|
514
|
+
stats.total_test_cases++;
|
|
515
|
+
if (node.status === 'valid')
|
|
516
|
+
stats.test_cases_valid++;
|
|
517
|
+
else if (node.status === 'invalid')
|
|
518
|
+
stats.test_cases_invalid++;
|
|
519
|
+
else
|
|
520
|
+
stats.test_cases_error++;
|
|
521
|
+
scores.push(node.quality_score);
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
for (const child of node.test_cases)
|
|
525
|
+
walkNode(child);
|
|
526
|
+
for (const child of node.test_suites)
|
|
527
|
+
walkNode(child);
|
|
528
|
+
if ('test_plans' in node)
|
|
529
|
+
for (const child of node.test_plans)
|
|
530
|
+
walkNode(child);
|
|
531
|
+
}
|
|
532
|
+
walkNode(result);
|
|
533
|
+
if (scores.length) {
|
|
534
|
+
stats.quality_score_avg = Math.round((scores.reduce((a, b) => a + b, 0) / scores.length) * 100) / 100;
|
|
535
|
+
stats.quality_score_min = Math.round(Math.min(...scores) * 100) / 100;
|
|
536
|
+
stats.quality_score_max = Math.round(Math.max(...scores) * 100) / 100;
|
|
537
|
+
}
|
|
538
|
+
return stats;
|
|
539
|
+
}
|
|
540
|
+
//# sourceMappingURL=hierarchyValidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchyValidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/hierarchyValidate.ts"],"names":[],"mappings":"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"}
|