@provartesting/provardx-cli 1.4.6 → 1.5.0-dev
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 +292 -8
- 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 +144 -0
- package/lib/mcp/licensing/algasClient.js.map +1 -0
- package/lib/mcp/licensing/ideDetection.d.ts +34 -0
- package/lib/mcp/licensing/ideDetection.js +179 -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 +79 -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 +103 -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 +14 -0
- package/lib/mcp/security/pathPolicy.js +38 -0
- package/lib/mcp/security/pathPolicy.js.map +1 -0
- package/lib/mcp/server.d.ts +5 -0
- package/lib/mcp/server.js +59 -0
- package/lib/mcp/server.js.map +1 -0
- package/lib/mcp/tools/antTools.d.ts +21 -0
- package/lib/mcp/tools/antTools.js +602 -0
- package/lib/mcp/tools/antTools.js.map +1 -0
- package/lib/mcp/tools/automationTools.d.ts +14 -0
- package/lib/mcp/tools/automationTools.js +386 -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 +199 -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 +178 -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 +50 -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 +227 -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 +1298 -1
- package/package.json +29 -15
|
@@ -0,0 +1,602 @@
|
|
|
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 fs from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
12
|
+
import { assertPathAllowed, PathPolicyError } from '../security/pathPolicy.js';
|
|
13
|
+
import { makeError, makeRequestId } from '../schemas/common.js';
|
|
14
|
+
import { log } from '../logging/logger.js';
|
|
15
|
+
// ── Sub-schemas ───────────────────────────────────────────────────────────────
|
|
16
|
+
const FilesetSchema = z.object({
|
|
17
|
+
dir: z.string().describe('Directory path (relative or absolute) for the fileset'),
|
|
18
|
+
id: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('Fileset id — use "testplan" for plan-based runs, "testcases" for test case runs, omit for default'),
|
|
22
|
+
includes: z
|
|
23
|
+
.array(z.string())
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('Specific .testcase or .testplan file names to include (e.g. ["Login.testcase"]). Omit to run everything in dir.'),
|
|
26
|
+
});
|
|
27
|
+
const PlanFeatureSchema = z.object({
|
|
28
|
+
name: z
|
|
29
|
+
.enum(['PDF', 'PIECHART', 'EMAIL', 'JUNIT'])
|
|
30
|
+
.describe('Feature name (PDF, PIECHART, EMAIL, JUNIT)'),
|
|
31
|
+
type: z.enum(['OUTPUT', 'NOTIFICATION']).describe('Feature type'),
|
|
32
|
+
enabled: z.boolean().describe('Whether this feature is enabled'),
|
|
33
|
+
});
|
|
34
|
+
const EmailPropertiesSchema = z.object({
|
|
35
|
+
send_email: z.boolean().default(false),
|
|
36
|
+
primary_recipients: z.string().default(''),
|
|
37
|
+
cc_recipients: z.string().optional().default(''),
|
|
38
|
+
bcc_recipients: z.string().optional().default(''),
|
|
39
|
+
email_subject: z.string().default('Provar test run report'),
|
|
40
|
+
attach_execution_report: z.boolean().default(true),
|
|
41
|
+
attach_zip: z.boolean().default(false),
|
|
42
|
+
});
|
|
43
|
+
const AttachmentPropertiesSchema = z.object({
|
|
44
|
+
include_all_failures_in_summary: z.boolean().default(true),
|
|
45
|
+
include_only_failures: z.boolean().default(false),
|
|
46
|
+
include_bdd: z.boolean().default(false),
|
|
47
|
+
include_skipped: z.boolean().default(false),
|
|
48
|
+
include_test_case_description: z.boolean().default(false),
|
|
49
|
+
include_screenshots: z.boolean().default(true),
|
|
50
|
+
include_warning_messages: z.boolean().default(false),
|
|
51
|
+
include_info_messages: z.boolean().default(false),
|
|
52
|
+
include_debug_messages: z.boolean().default(false),
|
|
53
|
+
include_test_step_time: z.boolean().default(true),
|
|
54
|
+
include_test_step_path_hierarchy: z.boolean().default(true),
|
|
55
|
+
include_full_screen_shot: z.boolean().default(false),
|
|
56
|
+
});
|
|
57
|
+
// ── Generate tool ─────────────────────────────────────────────────────────────
|
|
58
|
+
export function registerAntGenerate(server, config) {
|
|
59
|
+
server.tool('provar.ant.generate', [
|
|
60
|
+
'Generate a Provar ANT build.xml file.',
|
|
61
|
+
'Produces the standard <project> skeleton with Provar-Compile and Run-Test-Case tasks.',
|
|
62
|
+
'Supports targeting tests by project folder, plan folder, or specific .testcase files via filesets.',
|
|
63
|
+
'Returns XML content. Writes to disk only when dry_run=false.',
|
|
64
|
+
].join(' '), {
|
|
65
|
+
// ── Core paths ──────────────────────────────────────────────────────────
|
|
66
|
+
provar_home: z
|
|
67
|
+
.string()
|
|
68
|
+
.describe('Absolute path to the Provar installation directory (e.g. "C:/Program Files/Provar/"). Used for provar.home property and ant taskdef classpaths.'),
|
|
69
|
+
project_path: z
|
|
70
|
+
.string()
|
|
71
|
+
.default('..')
|
|
72
|
+
.describe('Path to the Provar test project root. Defaults to ".." (parent of the ANT folder).'),
|
|
73
|
+
results_path: z
|
|
74
|
+
.string()
|
|
75
|
+
.default('../ANT/Results')
|
|
76
|
+
.describe('Path where test results are written. Defaults to "../ANT/Results".'),
|
|
77
|
+
project_cache_path: z
|
|
78
|
+
.string()
|
|
79
|
+
.optional()
|
|
80
|
+
.describe('Path to the .provarCaches directory. Defaults to "../../.provarCaches" relative to the ANT folder.'),
|
|
81
|
+
license_path: z
|
|
82
|
+
.string()
|
|
83
|
+
.optional()
|
|
84
|
+
.describe('Path to the Provar .licenses directory (e.g. "${env.PROVAR_HOME}/.licenses").'),
|
|
85
|
+
smtp_path: z
|
|
86
|
+
.string()
|
|
87
|
+
.optional()
|
|
88
|
+
.describe('Path to the Provar .smtp directory (e.g. "${env.PROVAR_HOME}/.smtp").'),
|
|
89
|
+
// ── Test selection ──────────────────────────────────────────────────────
|
|
90
|
+
filesets: z
|
|
91
|
+
.array(FilesetSchema)
|
|
92
|
+
.min(1)
|
|
93
|
+
.describe('One or more filesets defining which tests to run. ' +
|
|
94
|
+
'To run all tests under a folder: { dir: "../tests" }. ' +
|
|
95
|
+
'To run a plan: { id: "testplan", dir: "../plans/MyPlan" }. ' +
|
|
96
|
+
'To run specific test cases: { dir: "../tests/Suite", includes: ["MyTest.testcase"] }.'),
|
|
97
|
+
// ── Browser / environment ───────────────────────────────────────────────
|
|
98
|
+
web_browser: z
|
|
99
|
+
.enum(['Chrome', 'Chrome_Headless', 'Firefox', 'Edge', 'Edge_Legacy', 'Safari', 'IE'])
|
|
100
|
+
.default('Chrome')
|
|
101
|
+
.describe('Web browser to use for test execution.'),
|
|
102
|
+
web_browser_configuration: z
|
|
103
|
+
.string()
|
|
104
|
+
.default('Full Screen')
|
|
105
|
+
.describe('Browser window configuration (e.g. "Full Screen").'),
|
|
106
|
+
web_browser_provider_name: z
|
|
107
|
+
.string()
|
|
108
|
+
.default('Desktop')
|
|
109
|
+
.describe('Browser provider name (e.g. "Desktop").'),
|
|
110
|
+
web_browser_device_name: z
|
|
111
|
+
.string()
|
|
112
|
+
.default('Full Screen')
|
|
113
|
+
.describe('Browser device name (e.g. "Full Screen").'),
|
|
114
|
+
test_environment: z
|
|
115
|
+
.string()
|
|
116
|
+
.default('')
|
|
117
|
+
.describe('Named test environment to use (must match a connection in the project). Empty string uses default.'),
|
|
118
|
+
// ── Cache / metadata ────────────────────────────────────────────────────
|
|
119
|
+
salesforce_metadata_cache: z
|
|
120
|
+
.enum(['Reuse', 'Refresh', 'Reload'])
|
|
121
|
+
.default('Reuse')
|
|
122
|
+
.describe('Salesforce metadata cache strategy: Reuse (fastest, uses cached), Refresh (re-downloads), Reload (clears and re-downloads).'),
|
|
123
|
+
// ── Output / logging ────────────────────────────────────────────────────
|
|
124
|
+
results_path_disposition: z
|
|
125
|
+
.enum(['Increment', 'Replace', 'Reuse'])
|
|
126
|
+
.default('Increment')
|
|
127
|
+
.describe('How to handle the results folder when it already exists: Increment (new subfolder), Replace (overwrite), Reuse (append).'),
|
|
128
|
+
test_output_level: z
|
|
129
|
+
.enum(['BASIC', 'WARNING', 'DEBUG'])
|
|
130
|
+
.default('BASIC')
|
|
131
|
+
.describe('Verbosity level for test output logs.'),
|
|
132
|
+
plugin_output_level: z
|
|
133
|
+
.enum(['BASIC', 'WARNING', 'DEBUG'])
|
|
134
|
+
.default('WARNING')
|
|
135
|
+
.describe('Verbosity level for plugin output logs.'),
|
|
136
|
+
// ── Execution behaviour ─────────────────────────────────────────────────
|
|
137
|
+
stop_test_run_on_error: z
|
|
138
|
+
.boolean()
|
|
139
|
+
.default(false)
|
|
140
|
+
.describe('Abort the entire test run when any test case fails.'),
|
|
141
|
+
exclude_callable_test_cases: z
|
|
142
|
+
.boolean()
|
|
143
|
+
.default(true)
|
|
144
|
+
.describe('Skip test cases marked as callable (library/helper) when true.'),
|
|
145
|
+
dont_fail_build: z
|
|
146
|
+
.boolean()
|
|
147
|
+
.optional()
|
|
148
|
+
.describe('When true, the ANT build does not fail even if tests fail. Useful for CI pipelines that collect results separately.'),
|
|
149
|
+
invoke_test_run_monitor: z
|
|
150
|
+
.boolean()
|
|
151
|
+
.default(true)
|
|
152
|
+
.describe('Enable the Provar test run monitor.'),
|
|
153
|
+
// ── Secrets / security ──────────────────────────────────────────────────
|
|
154
|
+
secrets_password: z
|
|
155
|
+
.string()
|
|
156
|
+
.default('${env.ProvarSecretsPassword}')
|
|
157
|
+
.describe('Password for the Provar secrets store. Defaults to reading from the ProvarSecretsPassword environment variable.'),
|
|
158
|
+
test_environment_secrets_password: z
|
|
159
|
+
.string()
|
|
160
|
+
.optional()
|
|
161
|
+
.describe('Per-environment secrets password. Defaults to reading from the ProvarSecretsPassword_EnvName environment variable.'),
|
|
162
|
+
// ── Test Cycle ──────────────────────────────────────────────────────────
|
|
163
|
+
test_cycle_path: z
|
|
164
|
+
.string()
|
|
165
|
+
.optional()
|
|
166
|
+
.describe('Path to a TestCycle folder (used with test cycle reporting).'),
|
|
167
|
+
test_cycle_run_type: z
|
|
168
|
+
.enum(['ALL', 'FAILED', 'NEW'])
|
|
169
|
+
.optional()
|
|
170
|
+
.describe('Which tests in the cycle to run (ALL, FAILED, NEW).'),
|
|
171
|
+
// ── Plan features ───────────────────────────────────────────────────────
|
|
172
|
+
plan_features: z
|
|
173
|
+
.array(PlanFeatureSchema)
|
|
174
|
+
.optional()
|
|
175
|
+
.describe('Output and notification features to enable/disable (e.g. PDF, PIECHART, EMAIL). ' +
|
|
176
|
+
'Only meaningful when running by test plan.'),
|
|
177
|
+
// ── Email / attachment reporting ────────────────────────────────────────
|
|
178
|
+
email_properties: EmailPropertiesSchema.optional().describe('Email notification settings. Omit to exclude <emailProperties> from the XML.'),
|
|
179
|
+
attachment_properties: AttachmentPropertiesSchema.optional().describe('Attachment/report content settings. Omit to exclude <attachmentProperties> from the XML.'),
|
|
180
|
+
// ── File output ─────────────────────────────────────────────────────────
|
|
181
|
+
output_path: z
|
|
182
|
+
.string()
|
|
183
|
+
.optional()
|
|
184
|
+
.describe('Where to write the build.xml file (returned in response). Required when dry_run=false.'),
|
|
185
|
+
overwrite: z
|
|
186
|
+
.boolean()
|
|
187
|
+
.default(false)
|
|
188
|
+
.describe('Overwrite output_path if the file already exists.'),
|
|
189
|
+
dry_run: z
|
|
190
|
+
.boolean()
|
|
191
|
+
.default(true)
|
|
192
|
+
.describe('true = return XML only (default); false = write to output_path.'),
|
|
193
|
+
}, (input) => {
|
|
194
|
+
const requestId = makeRequestId();
|
|
195
|
+
log('info', 'provar.ant.generate', {
|
|
196
|
+
requestId,
|
|
197
|
+
output_path: input.output_path,
|
|
198
|
+
dry_run: input.dry_run,
|
|
199
|
+
});
|
|
200
|
+
try {
|
|
201
|
+
const xmlContent = buildAntXml(input);
|
|
202
|
+
const filePath = input.output_path ? path.resolve(input.output_path) : undefined;
|
|
203
|
+
let written = false;
|
|
204
|
+
if (filePath && !input.dry_run) {
|
|
205
|
+
assertPathAllowed(filePath, config.allowedPaths);
|
|
206
|
+
if (fs.existsSync(filePath) && !input.overwrite) {
|
|
207
|
+
const err = makeError('FILE_EXISTS', `File already exists: ${filePath}. Set overwrite=true to replace.`, requestId);
|
|
208
|
+
return { isError: true, content: [{ type: 'text', text: JSON.stringify(err) }] };
|
|
209
|
+
}
|
|
210
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
211
|
+
fs.writeFileSync(filePath, xmlContent, 'utf-8');
|
|
212
|
+
written = true;
|
|
213
|
+
log('info', 'provar.ant.generate: wrote file', { requestId, filePath });
|
|
214
|
+
}
|
|
215
|
+
const result = {
|
|
216
|
+
requestId,
|
|
217
|
+
xml_content: xmlContent,
|
|
218
|
+
file_path: filePath,
|
|
219
|
+
written,
|
|
220
|
+
dry_run: input.dry_run,
|
|
221
|
+
};
|
|
222
|
+
return {
|
|
223
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
224
|
+
structuredContent: result,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
const error = err;
|
|
229
|
+
const errResult = makeError(error instanceof PathPolicyError ? error.code : (error.code ?? 'GENERATE_ERROR'), error.message, requestId, false);
|
|
230
|
+
log('error', 'provar.ant.generate failed', { requestId, error: error.message });
|
|
231
|
+
return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
// ── Validate tool ─────────────────────────────────────────────────────────────
|
|
236
|
+
export function registerAntValidate(server, config) {
|
|
237
|
+
server.tool('provar.ant.validate', [
|
|
238
|
+
'Validate a Provar ANT build.xml for structural correctness.',
|
|
239
|
+
'Checks XML well-formedness, required <taskdef> declarations, <Provar-Compile> step,',
|
|
240
|
+
'<Run-Test-Case> with required attributes (provarHome, projectPath, resultsPath),',
|
|
241
|
+
'and at least one <fileset> child. Returns is_valid, issues list, and a validity_score.',
|
|
242
|
+
].join(' '), {
|
|
243
|
+
content: z
|
|
244
|
+
.string()
|
|
245
|
+
.optional()
|
|
246
|
+
.describe('XML content to validate directly'),
|
|
247
|
+
file_path: z
|
|
248
|
+
.string()
|
|
249
|
+
.optional()
|
|
250
|
+
.describe('Path to the build.xml file to validate'),
|
|
251
|
+
}, ({ content, file_path }) => {
|
|
252
|
+
const requestId = makeRequestId();
|
|
253
|
+
log('info', 'provar.ant.validate', { requestId, has_content: !!content, file_path });
|
|
254
|
+
try {
|
|
255
|
+
let source = content;
|
|
256
|
+
if (!source && file_path) {
|
|
257
|
+
assertPathAllowed(file_path, config.allowedPaths);
|
|
258
|
+
const resolved = path.resolve(file_path);
|
|
259
|
+
if (!fs.existsSync(resolved)) {
|
|
260
|
+
const err = makeError('FILE_NOT_FOUND', `File not found: ${resolved}`, requestId);
|
|
261
|
+
return { isError: true, content: [{ type: 'text', text: JSON.stringify(err) }] };
|
|
262
|
+
}
|
|
263
|
+
source = fs.readFileSync(resolved, 'utf-8');
|
|
264
|
+
}
|
|
265
|
+
if (!source) {
|
|
266
|
+
const err = makeError('MISSING_INPUT', 'Provide either content or file_path.', requestId);
|
|
267
|
+
return { isError: true, content: [{ type: 'text', text: JSON.stringify(err) }] };
|
|
268
|
+
}
|
|
269
|
+
const validation = validateAntXml(source);
|
|
270
|
+
const result = { requestId, ...validation };
|
|
271
|
+
return {
|
|
272
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
273
|
+
structuredContent: result,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
const error = err;
|
|
278
|
+
const errResult = makeError(error instanceof PathPolicyError ? error.code : 'VALIDATE_ERROR', error.message, requestId, false);
|
|
279
|
+
log('error', 'provar.ant.validate failed', { requestId, error: error.message });
|
|
280
|
+
return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
function buildRtcOptionalAttrs(input, a) {
|
|
285
|
+
const attrs = [];
|
|
286
|
+
if (input.dont_fail_build !== undefined) {
|
|
287
|
+
attrs.push(`\t\t\t\tdontFailBuild="${input.dont_fail_build}"`);
|
|
288
|
+
}
|
|
289
|
+
if (input.invoke_test_run_monitor) {
|
|
290
|
+
attrs.push('\t\t\t\tinvokeTestRunMonitor="true"');
|
|
291
|
+
}
|
|
292
|
+
if (input.license_path) {
|
|
293
|
+
attrs.push(`\t\t\t\tlicensePath="${a(input.license_path)}"`);
|
|
294
|
+
}
|
|
295
|
+
if (input.smtp_path) {
|
|
296
|
+
attrs.push(`\t\t\t\tsmtpPath="${a(input.smtp_path)}"`);
|
|
297
|
+
}
|
|
298
|
+
if (input.test_cycle_path) {
|
|
299
|
+
attrs.push('\t\t\t\ttestCyclePath="${testcycle.path}"');
|
|
300
|
+
}
|
|
301
|
+
if (input.test_cycle_run_type) {
|
|
302
|
+
attrs.push(`\t\t\t\ttestCycleRunType="${a(input.test_cycle_run_type)}"`);
|
|
303
|
+
}
|
|
304
|
+
return attrs;
|
|
305
|
+
}
|
|
306
|
+
function buildAntXml(input) {
|
|
307
|
+
const a = escapeXmlAttr;
|
|
308
|
+
const cachePath = input.project_cache_path ?? '../../.provarCaches';
|
|
309
|
+
// ── Properties ──────────────────────────────────────────────────────────────
|
|
310
|
+
const lines = [
|
|
311
|
+
'<project default="runtests">',
|
|
312
|
+
'\t<property environment="env"/>',
|
|
313
|
+
`\t<property name="provar.home" value="${a(input.provar_home)}"/>`,
|
|
314
|
+
`\t<property name="testproject.home" value="${a(input.project_path)}"/>`,
|
|
315
|
+
`\t<property name="testproject.results" value="${a(input.results_path)}"/>`,
|
|
316
|
+
`\t<property name="secrets.password" value="${a(input.secrets_password)}"/>`,
|
|
317
|
+
];
|
|
318
|
+
if (input.test_environment_secrets_password) {
|
|
319
|
+
lines.push(`\t<property name="testenvironment.secretspassword" value="${a(input.test_environment_secrets_password)}"/>`);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
lines.push('\t<property name="testenvironment.secretspassword" value="${env.ProvarSecretsPassword_EnvName}"/>');
|
|
323
|
+
}
|
|
324
|
+
if (input.test_cycle_path) {
|
|
325
|
+
lines.push(`\t<property name="testcycle.path" value="${a(input.test_cycle_path)}"/>`);
|
|
326
|
+
}
|
|
327
|
+
lines.push('');
|
|
328
|
+
// ── Taskdefs ────────────────────────────────────────────────────────────────
|
|
329
|
+
lines.push('\t<taskdef name="Provar-Compile" classname="com.provar.testrunner.ant.CompileTask" classpath="${provar.home}/ant/ant-provar.jar"/>', '\t<taskdef name="Run-Test-Case" classname="com.provar.testrunner.ant.RunnerTask" classpath="${provar.home}/ant/ant-provar.jar;${provar.home}/ant/ant-provar-bundled.jar;${provar.home}/ant/ant-provar-sf.jar"/>', '\t<taskdef name="Test-Cycle-Report" classname="com.provar.testrunner.ant.TestCycleReportTask" classpath="${provar.home}/ant/ant-provar.jar;${provar.home}/ant/ant-provar-bundled.jar;${provar.home}/ant/ant-provar-sf.jar"/>', '');
|
|
330
|
+
// ── Target ──────────────────────────────────────────────────────────────────
|
|
331
|
+
lines.push('\t<target name="runtests">', '');
|
|
332
|
+
lines.push('\t\t<Provar-Compile provarHome="${provar.home}" projectPath="${testproject.home}"/>', '');
|
|
333
|
+
// ── Run-Test-Case opening tag ────────────────────────────────────────────────
|
|
334
|
+
const rtcAttrs = [
|
|
335
|
+
'\t\t<Run-Test-Case provarHome="${provar.home}"',
|
|
336
|
+
'\t\t\t\tprojectPath="${testproject.home}"',
|
|
337
|
+
'\t\t\t\tresultsPath="${testproject.results}"',
|
|
338
|
+
`\t\t\t\tresultsPathDisposition="${a(input.results_path_disposition)}"`,
|
|
339
|
+
`\t\t\t\ttestEnvironment="${a(input.test_environment)}"`,
|
|
340
|
+
`\t\t\t\twebBrowser="${a(input.web_browser)}"`,
|
|
341
|
+
`\t\t\t\twebBrowserConfiguration="${a(input.web_browser_configuration)}"`,
|
|
342
|
+
`\t\t\t\twebBrowserProviderName="${a(input.web_browser_provider_name)}"`,
|
|
343
|
+
`\t\t\t\twebBrowserDeviceName="${a(input.web_browser_device_name)}"`,
|
|
344
|
+
`\t\t\t\texcludeCallableTestCases="${input.exclude_callable_test_cases}"`,
|
|
345
|
+
`\t\t\t\tsalesforceMetadataCache="${a(input.salesforce_metadata_cache)}"`,
|
|
346
|
+
`\t\t\t\tprojectCachePath="${a(cachePath)}"`,
|
|
347
|
+
`\t\t\t\ttestOutputlevel="${a(input.test_output_level)}"`,
|
|
348
|
+
`\t\t\t\tpluginOutputlevel="${a(input.plugin_output_level)}"`,
|
|
349
|
+
`\t\t\t\tstopTestRunOnError="${input.stop_test_run_on_error}"`,
|
|
350
|
+
'\t\t\t\tsecretsPassword="${secrets.password}"',
|
|
351
|
+
'\t\t\t\ttestEnvironmentSecretsPassword="${testenvironment.secretspassword}"',
|
|
352
|
+
];
|
|
353
|
+
rtcAttrs.push(...buildRtcOptionalAttrs(input, a));
|
|
354
|
+
// Join: all but last get no closing, last gets >
|
|
355
|
+
lines.push(rtcAttrs.join('\n') + '\n\t\t\t\t>');
|
|
356
|
+
lines.push('');
|
|
357
|
+
// ── Filesets ─────────────────────────────────────────────────────────────────
|
|
358
|
+
for (const fileset of input.filesets) {
|
|
359
|
+
const idAttr = fileset.id ? ` id="${a(fileset.id)}"` : '';
|
|
360
|
+
if (fileset.includes && fileset.includes.length > 0) {
|
|
361
|
+
lines.push(`\t\t\t<fileset${idAttr} dir="${a(fileset.dir)}">`);
|
|
362
|
+
for (const inc of fileset.includes) {
|
|
363
|
+
lines.push(`\t\t\t\t<include name="${a(inc)}"/>`);
|
|
364
|
+
}
|
|
365
|
+
lines.push('\t\t\t</fileset>');
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
lines.push(`\t\t\t<fileset${idAttr} dir="${a(fileset.dir)}"></fileset>`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
lines.push('');
|
|
372
|
+
// ── Plan features ─────────────────────────────────────────────────────────────
|
|
373
|
+
if (input.plan_features && input.plan_features.length > 0) {
|
|
374
|
+
for (const pf of input.plan_features) {
|
|
375
|
+
lines.push(`\t\t\t<planFeature name="${a(pf.name)}" type="${a(pf.type)}" enabled="${pf.enabled}"/>`);
|
|
376
|
+
}
|
|
377
|
+
lines.push('');
|
|
378
|
+
}
|
|
379
|
+
// ── Email properties ──────────────────────────────────────────────────────────
|
|
380
|
+
if (input.email_properties) {
|
|
381
|
+
const ep = input.email_properties;
|
|
382
|
+
lines.push(`\t\t\t<emailProperties sendEmail="${ep.send_email}" primaryRecipients="${a(ep.primary_recipients)}" ccRecipients="${a(ep.cc_recipients ?? '')}" bccRecipients="${a(ep.bcc_recipients ?? '')}" emailSubject="${a(ep.email_subject)}" attachExecutionReport="${ep.attach_execution_report}" attachZip="${ep.attach_zip}"/>`);
|
|
383
|
+
}
|
|
384
|
+
// ── Attachment properties ─────────────────────────────────────────────────────
|
|
385
|
+
if (input.attachment_properties) {
|
|
386
|
+
const ap = input.attachment_properties;
|
|
387
|
+
lines.push(`\t\t\t<attachmentProperties includeAllFailuresInSummary="${ap.include_all_failures_in_summary}" includeOnlyFailures="${ap.include_only_failures}" includeBdd="${ap.include_bdd}" includeSkipped="${ap.include_skipped}" includeTestCaseDescription="${ap.include_test_case_description}" includeScreenshots="${ap.include_screenshots}" includeWarningMessages="${ap.include_warning_messages}" includeInfoMessages="${ap.include_info_messages}" includeDebugMessages="${ap.include_debug_messages}" includeTestStepTime="${ap.include_test_step_time}" includeTestStepPathHierarchy="${ap.include_test_step_path_hierarchy}" includeFullScreenShot="${ap.include_full_screen_shot}"/>`);
|
|
388
|
+
}
|
|
389
|
+
lines.push('\t\t</Run-Test-Case>', '', '\t</target>', '</project>', '');
|
|
390
|
+
return lines.join('\n');
|
|
391
|
+
}
|
|
392
|
+
function escapeXmlAttr(value) {
|
|
393
|
+
return value
|
|
394
|
+
.replace(/&/g, '&')
|
|
395
|
+
.replace(/"/g, '"')
|
|
396
|
+
.replace(/</g, '<')
|
|
397
|
+
.replace(/>/g, '>');
|
|
398
|
+
}
|
|
399
|
+
const REQUIRED_TASKDEF_CLASSNAMES = [
|
|
400
|
+
'com.provar.testrunner.ant.CompileTask',
|
|
401
|
+
'com.provar.testrunner.ant.RunnerTask',
|
|
402
|
+
];
|
|
403
|
+
const VALID_BROWSERS = ['Chrome', 'Chrome_Headless', 'Firefox', 'Edge', 'Edge_Legacy', 'Safari', 'IE'];
|
|
404
|
+
const VALID_CACHE = ['Reuse', 'Refresh', 'Reload'];
|
|
405
|
+
const VALID_OUTPUT_LEVELS = ['BASIC', 'WARNING', 'DEBUG'];
|
|
406
|
+
const VALID_DISPOSITIONS = ['Increment', 'Replace', 'Reuse'];
|
|
407
|
+
function validateProjectStructure(project, defaultTarget, issues) {
|
|
408
|
+
if (!defaultTarget) {
|
|
409
|
+
issues.push({
|
|
410
|
+
rule_id: 'ANT_004',
|
|
411
|
+
severity: 'ERROR',
|
|
412
|
+
message: '<project> missing required "default" attribute.',
|
|
413
|
+
applies_to: 'project',
|
|
414
|
+
suggestion: 'Add default="runtests" (or your target name) to <project>.',
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
const taskdefs = project['taskdef'] ?? [];
|
|
418
|
+
for (const requiredClass of REQUIRED_TASKDEF_CLASSNAMES) {
|
|
419
|
+
const found = taskdefs.some((td) => td['@_classname'] === requiredClass);
|
|
420
|
+
if (!found) {
|
|
421
|
+
issues.push({
|
|
422
|
+
rule_id: 'ANT_005',
|
|
423
|
+
severity: 'ERROR',
|
|
424
|
+
message: `Missing <taskdef> for classname "${requiredClass}".`,
|
|
425
|
+
applies_to: 'taskdef',
|
|
426
|
+
suggestion: `Add <taskdef classname="${requiredClass}" ...> to the project.`,
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
const targets = project['target'] ?? [];
|
|
431
|
+
const defaultTargetEl = defaultTarget
|
|
432
|
+
? targets.find((t) => t['@_name'] === defaultTarget)
|
|
433
|
+
: undefined;
|
|
434
|
+
if (defaultTarget && !defaultTargetEl) {
|
|
435
|
+
issues.push({
|
|
436
|
+
rule_id: 'ANT_006',
|
|
437
|
+
severity: 'ERROR',
|
|
438
|
+
message: `Default target "${defaultTarget}" not found in <project>.`,
|
|
439
|
+
applies_to: 'project',
|
|
440
|
+
suggestion: `Add a <target name="${defaultTarget}"> element.`,
|
|
441
|
+
});
|
|
442
|
+
return null;
|
|
443
|
+
}
|
|
444
|
+
const target = defaultTargetEl ?? targets[0];
|
|
445
|
+
if (!target) {
|
|
446
|
+
issues.push({
|
|
447
|
+
rule_id: 'ANT_007',
|
|
448
|
+
severity: 'ERROR',
|
|
449
|
+
message: 'No <target> elements found in <project>.',
|
|
450
|
+
applies_to: 'project',
|
|
451
|
+
suggestion: 'Add at least one <target> element.',
|
|
452
|
+
});
|
|
453
|
+
return null;
|
|
454
|
+
}
|
|
455
|
+
return target;
|
|
456
|
+
}
|
|
457
|
+
function validateRtcEnumAttrs(rtc, webBrowser, issues) {
|
|
458
|
+
if (webBrowser && !VALID_BROWSERS.includes(webBrowser)) {
|
|
459
|
+
issues.push({ rule_id: 'ANT_030', severity: 'WARNING', message: `webBrowser "${webBrowser}" is not a recognised value. Expected one of: ${VALID_BROWSERS.join(', ')}.`, applies_to: 'Run-Test-Case', suggestion: `Use one of the supported browser values: ${VALID_BROWSERS.join(', ')}.` });
|
|
460
|
+
}
|
|
461
|
+
const metadataCache = rtc['@_salesforceMetadataCache'];
|
|
462
|
+
if (metadataCache && !VALID_CACHE.includes(metadataCache)) {
|
|
463
|
+
issues.push({ rule_id: 'ANT_031', severity: 'WARNING', message: `salesforceMetadataCache "${metadataCache}" is not a recognised value. Expected one of: ${VALID_CACHE.join(', ')}.`, applies_to: 'Run-Test-Case', suggestion: `Use one of: ${VALID_CACHE.join(', ')}.` });
|
|
464
|
+
}
|
|
465
|
+
const testOutputLevel = rtc['@_testOutputlevel'];
|
|
466
|
+
if (testOutputLevel && !VALID_OUTPUT_LEVELS.includes(testOutputLevel)) {
|
|
467
|
+
issues.push({ rule_id: 'ANT_032', severity: 'WARNING', message: `testOutputlevel "${testOutputLevel}" is not a recognised value. Expected one of: ${VALID_OUTPUT_LEVELS.join(', ')}.`, applies_to: 'Run-Test-Case', suggestion: `Use one of: ${VALID_OUTPUT_LEVELS.join(', ')}.` });
|
|
468
|
+
}
|
|
469
|
+
const disposition = rtc['@_resultsPathDisposition'];
|
|
470
|
+
if (disposition && !VALID_DISPOSITIONS.includes(disposition)) {
|
|
471
|
+
issues.push({ rule_id: 'ANT_033', severity: 'WARNING', message: `resultsPathDisposition "${disposition}" is not a recognised value. Expected one of: ${VALID_DISPOSITIONS.join(', ')}.`, applies_to: 'Run-Test-Case', suggestion: `Use one of: ${VALID_DISPOSITIONS.join(', ')}.` });
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
function validateRunTestCase(rtc, issues) {
|
|
475
|
+
const provarHome = rtc['@_provarHome'] ?? null;
|
|
476
|
+
const projectPath = rtc['@_projectPath'] ?? null;
|
|
477
|
+
const resultsPath = rtc['@_resultsPath'] ?? null;
|
|
478
|
+
const webBrowser = rtc['@_webBrowser'] ?? null;
|
|
479
|
+
const testEnvironment = rtc['@_testEnvironment'] ?? null;
|
|
480
|
+
if (!provarHome) {
|
|
481
|
+
issues.push({ rule_id: 'ANT_021', severity: 'ERROR', message: '<Run-Test-Case> missing required "provarHome" attribute.', applies_to: 'Run-Test-Case', suggestion: 'Add provarHome="${provar.home}" to <Run-Test-Case>.' });
|
|
482
|
+
}
|
|
483
|
+
if (!projectPath) {
|
|
484
|
+
issues.push({ rule_id: 'ANT_022', severity: 'ERROR', message: '<Run-Test-Case> missing required "projectPath" attribute.', applies_to: 'Run-Test-Case', suggestion: 'Add projectPath="${testproject.home}" to <Run-Test-Case>.' });
|
|
485
|
+
}
|
|
486
|
+
if (!resultsPath) {
|
|
487
|
+
issues.push({ rule_id: 'ANT_023', severity: 'ERROR', message: '<Run-Test-Case> missing required "resultsPath" attribute.', applies_to: 'Run-Test-Case', suggestion: 'Add resultsPath="${testproject.results}" to <Run-Test-Case>.' });
|
|
488
|
+
}
|
|
489
|
+
validateRtcEnumAttrs(rtc, webBrowser, issues);
|
|
490
|
+
const filesets = rtc['fileset'] ?? [];
|
|
491
|
+
if (filesets.length === 0) {
|
|
492
|
+
issues.push({ rule_id: 'ANT_040', severity: 'ERROR', message: '<Run-Test-Case> has no <fileset> children — no tests will be selected.', applies_to: 'Run-Test-Case', suggestion: 'Add at least one <fileset dir="..."/> pointing to your tests or plans folder.' });
|
|
493
|
+
}
|
|
494
|
+
for (const [i, fsEntry] of filesets.entries()) {
|
|
495
|
+
if (!fsEntry['@_dir']) {
|
|
496
|
+
issues.push({ rule_id: 'ANT_041', severity: 'ERROR', message: `<fileset> at index ${i} is missing required "dir" attribute.`, applies_to: 'fileset', suggestion: 'Add dir="..." to each <fileset> element.' });
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
return { provarHome, projectPath, resultsPath, webBrowser, testEnvironment, filesetCount: filesets.length };
|
|
500
|
+
}
|
|
501
|
+
/** Pure function — exported for unit testing */
|
|
502
|
+
export function validateAntXml(xmlContent) {
|
|
503
|
+
const issues = [];
|
|
504
|
+
// ANT_001: XML declaration
|
|
505
|
+
if (!xmlContent.trimStart().startsWith('<?xml')) {
|
|
506
|
+
issues.push({
|
|
507
|
+
rule_id: 'ANT_001',
|
|
508
|
+
severity: 'WARNING',
|
|
509
|
+
message: 'Missing XML declaration. Consider adding <?xml version="1.0" encoding="UTF-8"?> as the first line.',
|
|
510
|
+
applies_to: 'document',
|
|
511
|
+
suggestion: 'Add XML declaration as the first line.',
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
// Parse
|
|
515
|
+
const parser = new XMLParser({
|
|
516
|
+
ignoreAttributes: false,
|
|
517
|
+
attributeNamePrefix: '@_',
|
|
518
|
+
parseAttributeValue: false,
|
|
519
|
+
isArray: (tagName) => ['taskdef', 'target', 'fileset', 'include', 'planFeature'].includes(tagName),
|
|
520
|
+
});
|
|
521
|
+
let parsed;
|
|
522
|
+
try {
|
|
523
|
+
parsed = parser.parse(xmlContent);
|
|
524
|
+
}
|
|
525
|
+
catch (e) {
|
|
526
|
+
const parseError = e;
|
|
527
|
+
issues.push({
|
|
528
|
+
rule_id: 'ANT_002',
|
|
529
|
+
severity: 'ERROR',
|
|
530
|
+
message: `XML parse error: ${parseError.message}`,
|
|
531
|
+
applies_to: 'document',
|
|
532
|
+
suggestion: 'Fix XML syntax errors.',
|
|
533
|
+
});
|
|
534
|
+
return finalizeAnt(issues, null, null, null, null, null, 0);
|
|
535
|
+
}
|
|
536
|
+
// ANT_003: Root element must be <project>
|
|
537
|
+
if (!('project' in parsed)) {
|
|
538
|
+
issues.push({
|
|
539
|
+
rule_id: 'ANT_003',
|
|
540
|
+
severity: 'ERROR',
|
|
541
|
+
message: 'Root element must be <project>.',
|
|
542
|
+
applies_to: 'document',
|
|
543
|
+
suggestion: 'Wrap content in a <project> element.',
|
|
544
|
+
});
|
|
545
|
+
return finalizeAnt(issues, null, null, null, null, null, 0);
|
|
546
|
+
}
|
|
547
|
+
const project = parsed['project'];
|
|
548
|
+
const defaultTarget = project['@_default'];
|
|
549
|
+
const target = validateProjectStructure(project, defaultTarget, issues);
|
|
550
|
+
if (!target) {
|
|
551
|
+
return finalizeAnt(issues, null, null, null, null, null, 0);
|
|
552
|
+
}
|
|
553
|
+
// ANT_010: Provar-Compile step
|
|
554
|
+
const compileStep = target['Provar-Compile'];
|
|
555
|
+
if (!compileStep) {
|
|
556
|
+
issues.push({
|
|
557
|
+
rule_id: 'ANT_010',
|
|
558
|
+
severity: 'WARNING',
|
|
559
|
+
message: 'No <Provar-Compile> step found in the default target.',
|
|
560
|
+
applies_to: 'target',
|
|
561
|
+
suggestion: 'Add <Provar-Compile provarHome="..." projectPath="..."/> before Run-Test-Case.',
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
// ANT_020: Run-Test-Case step
|
|
565
|
+
const rtc = target['Run-Test-Case'];
|
|
566
|
+
if (!rtc) {
|
|
567
|
+
issues.push({
|
|
568
|
+
rule_id: 'ANT_020',
|
|
569
|
+
severity: 'ERROR',
|
|
570
|
+
message: 'No <Run-Test-Case> element found in the default target.',
|
|
571
|
+
applies_to: 'target',
|
|
572
|
+
suggestion: 'Add a <Run-Test-Case ...> element to run tests.',
|
|
573
|
+
});
|
|
574
|
+
return finalizeAnt(issues, null, null, null, null, null, 0);
|
|
575
|
+
}
|
|
576
|
+
const { provarHome, projectPath, resultsPath, webBrowser, testEnvironment, filesetCount } = validateRunTestCase(rtc, issues);
|
|
577
|
+
return finalizeAnt(issues, provarHome, projectPath, resultsPath, webBrowser, testEnvironment, filesetCount);
|
|
578
|
+
}
|
|
579
|
+
function finalizeAnt(issues, provarHome, projectPath, resultsPath, webBrowser, testEnvironment, filesetCount) {
|
|
580
|
+
const errorCount = issues.filter((i) => i.severity === 'ERROR').length;
|
|
581
|
+
const warningCount = issues.filter((i) => i.severity === 'WARNING').length;
|
|
582
|
+
const validityScore = Math.max(0, 100 - errorCount * 20);
|
|
583
|
+
return {
|
|
584
|
+
is_valid: errorCount === 0,
|
|
585
|
+
validity_score: validityScore,
|
|
586
|
+
provar_home: provarHome,
|
|
587
|
+
project_path: projectPath,
|
|
588
|
+
results_path: resultsPath,
|
|
589
|
+
web_browser: webBrowser,
|
|
590
|
+
test_environment: testEnvironment,
|
|
591
|
+
fileset_count: filesetCount,
|
|
592
|
+
error_count: errorCount,
|
|
593
|
+
warning_count: warningCount,
|
|
594
|
+
issues,
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
// ── Registration ──────────────────────────────────────────────────────────────
|
|
598
|
+
export function registerAllAntTools(server, config) {
|
|
599
|
+
registerAntGenerate(server, config);
|
|
600
|
+
registerAntValidate(server, config);
|
|
601
|
+
}
|
|
602
|
+
//# sourceMappingURL=antTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/antTools.ts"],"names":[],"mappings":"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"}
|