@provartesting/provardx-cli 1.5.0-beta → 1.5.0-beta.10

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.
Files changed (92) hide show
  1. package/README.md +137 -13
  2. package/lib/commands/provar/auth/clear.d.ts +7 -0
  3. package/lib/commands/provar/auth/clear.js +36 -0
  4. package/lib/commands/provar/auth/clear.js.map +1 -0
  5. package/lib/commands/provar/auth/login.d.ts +10 -0
  6. package/lib/commands/provar/auth/login.js +90 -0
  7. package/lib/commands/provar/auth/login.js.map +1 -0
  8. package/lib/commands/provar/auth/rotate.d.ts +7 -0
  9. package/lib/commands/provar/auth/rotate.js +42 -0
  10. package/lib/commands/provar/auth/rotate.js.map +1 -0
  11. package/lib/commands/provar/auth/status.d.ts +7 -0
  12. package/lib/commands/provar/auth/status.js +107 -0
  13. package/lib/commands/provar/auth/status.js.map +1 -0
  14. package/lib/mcp/docs/PROVAR_TEST_STEP_REFERENCE.md +1430 -0
  15. package/lib/mcp/licensing/algasClient.js +14 -5
  16. package/lib/mcp/licensing/algasClient.js.map +1 -1
  17. package/lib/mcp/licensing/ideDetection.d.ts +0 -12
  18. package/lib/mcp/licensing/ideDetection.js +0 -72
  19. package/lib/mcp/licensing/ideDetection.js.map +1 -1
  20. package/lib/mcp/licensing/licenseCache.js +7 -1
  21. package/lib/mcp/licensing/licenseCache.js.map +1 -1
  22. package/lib/mcp/licensing/licenseValidator.d.ts +3 -3
  23. package/lib/mcp/licensing/licenseValidator.js +11 -4
  24. package/lib/mcp/licensing/licenseValidator.js.map +1 -1
  25. package/lib/mcp/prompts/index.d.ts +2 -0
  26. package/lib/mcp/prompts/index.js +19 -0
  27. package/lib/mcp/prompts/index.js.map +1 -0
  28. package/lib/mcp/prompts/loopPrompts.d.ts +6 -0
  29. package/lib/mcp/prompts/loopPrompts.js +435 -0
  30. package/lib/mcp/prompts/loopPrompts.js.map +1 -0
  31. package/lib/mcp/prompts/migrationPrompts.d.ts +4 -0
  32. package/lib/mcp/prompts/migrationPrompts.js +207 -0
  33. package/lib/mcp/prompts/migrationPrompts.js.map +1 -0
  34. package/lib/mcp/rules/provar_best_practices_rules.json +256 -544
  35. package/lib/mcp/security/pathPolicy.d.ts +5 -0
  36. package/lib/mcp/security/pathPolicy.js +30 -2
  37. package/lib/mcp/security/pathPolicy.js.map +1 -1
  38. package/lib/mcp/server.js +51 -4
  39. package/lib/mcp/server.js.map +1 -1
  40. package/lib/mcp/tools/antTools.d.ts +15 -0
  41. package/lib/mcp/tools/antTools.js +216 -50
  42. package/lib/mcp/tools/antTools.js.map +1 -1
  43. package/lib/mcp/tools/automationTools.d.ts +39 -5
  44. package/lib/mcp/tools/automationTools.js +341 -55
  45. package/lib/mcp/tools/automationTools.js.map +1 -1
  46. package/lib/mcp/tools/bestPracticesEngine.js +161 -23
  47. package/lib/mcp/tools/bestPracticesEngine.js.map +1 -1
  48. package/lib/mcp/tools/connectionTools.d.ts +4 -0
  49. package/lib/mcp/tools/connectionTools.js +168 -0
  50. package/lib/mcp/tools/connectionTools.js.map +1 -0
  51. package/lib/mcp/tools/nitroXTools.d.ts +22 -0
  52. package/lib/mcp/tools/nitroXTools.js +750 -0
  53. package/lib/mcp/tools/nitroXTools.js.map +1 -0
  54. package/lib/mcp/tools/pageObjectGenerate.js +103 -35
  55. package/lib/mcp/tools/pageObjectGenerate.js.map +1 -1
  56. package/lib/mcp/tools/propertiesTools.d.ts +2 -0
  57. package/lib/mcp/tools/propertiesTools.js +277 -39
  58. package/lib/mcp/tools/propertiesTools.js.map +1 -1
  59. package/lib/mcp/tools/qualityHubApiTools.d.ts +3 -0
  60. package/lib/mcp/tools/qualityHubApiTools.js +134 -0
  61. package/lib/mcp/tools/qualityHubApiTools.js.map +1 -0
  62. package/lib/mcp/tools/qualityHubTools.js +139 -20
  63. package/lib/mcp/tools/qualityHubTools.js.map +1 -1
  64. package/lib/mcp/tools/rcaTools.d.ts +3 -2
  65. package/lib/mcp/tools/rcaTools.js +145 -20
  66. package/lib/mcp/tools/rcaTools.js.map +1 -1
  67. package/lib/mcp/tools/sfSpawn.d.ts +1 -1
  68. package/lib/mcp/tools/sfSpawn.js +8 -2
  69. package/lib/mcp/tools/sfSpawn.js.map +1 -1
  70. package/lib/mcp/tools/testCaseGenerate.js +88 -59
  71. package/lib/mcp/tools/testCaseGenerate.js.map +1 -1
  72. package/lib/mcp/tools/testCaseStepTools.d.ts +4 -0
  73. package/lib/mcp/tools/testCaseStepTools.js +221 -0
  74. package/lib/mcp/tools/testCaseStepTools.js.map +1 -0
  75. package/lib/mcp/tools/testCaseValidate.d.ts +11 -0
  76. package/lib/mcp/tools/testCaseValidate.js +146 -19
  77. package/lib/mcp/tools/testCaseValidate.js.map +1 -1
  78. package/lib/services/auth/credentials.d.ts +21 -0
  79. package/lib/services/auth/credentials.js +75 -0
  80. package/lib/services/auth/credentials.js.map +1 -0
  81. package/lib/services/auth/loginFlow.d.ts +68 -0
  82. package/lib/services/auth/loginFlow.js +216 -0
  83. package/lib/services/auth/loginFlow.js.map +1 -0
  84. package/lib/services/qualityHub/client.d.ts +161 -0
  85. package/lib/services/qualityHub/client.js +226 -0
  86. package/lib/services/qualityHub/client.js.map +1 -0
  87. package/messages/sf.provar.auth.clear.md +16 -0
  88. package/messages/sf.provar.auth.login.md +31 -0
  89. package/messages/sf.provar.auth.rotate.md +23 -0
  90. package/messages/sf.provar.auth.status.md +16 -0
  91. package/oclif.manifest.json +241 -28
  92. package/package.json +8 -5
@@ -34,9 +34,7 @@
34
34
  "category": "XMLSchema",
35
35
  "name": "Test case root element must be testCase",
36
36
  "description": "The root XML element must be <testCase>. Any other root element prevents the test from being imported into Provar.",
37
- "appliesTo": [
38
- "TestCase"
39
- ],
37
+ "appliesTo": ["TestCase"],
40
38
  "severity": "critical",
41
39
  "weight": 10,
42
40
  "recommendation": "Ensure the root element is <testCase> with proper namespace and attributes.",
@@ -52,9 +50,7 @@
52
50
  "category": "XMLSchema",
53
51
  "name": "Test case must have valid identifier",
54
52
  "description": "Test case must have one of: 'id' (recommended), 'guid' (Provar V3), or 'registryId' (legacy) attribute. Missing identifier prevents test case import.",
55
- "appliesTo": [
56
- "TestCase"
57
- ],
53
+ "appliesTo": ["TestCase"],
58
54
  "severity": "critical",
59
55
  "weight": 10,
60
56
  "recommendation": "Add 'id' attribute to <testCase> element (e.g., id=\"1\"), or use 'guid' for Provar V3 compatibility.",
@@ -70,9 +66,7 @@
70
66
  "category": "XMLSchema",
71
67
  "name": "Test case should have failureBehaviour attribute",
72
68
  "description": "The 'failureBehaviour' attribute is recommended for new tests (default: 'Continue'). While not required, it makes test behavior explicit.",
73
- "appliesTo": [
74
- "TestCase"
75
- ],
69
+ "appliesTo": ["TestCase"],
76
70
  "severity": "info",
77
71
  "weight": 1,
78
72
  "recommendation": "Add failureBehaviour=\"Continue\" to <testCase> element for explicit failure handling.",
@@ -88,9 +82,7 @@
88
82
  "category": "XMLSchema",
89
83
  "name": "Consider migrating from registryId to id or guid",
90
84
  "description": "Using legacy 'registryId' attribute. Consider migrating to 'id' (simple) or 'guid' (Provar V3) for better compatibility.",
91
- "appliesTo": [
92
- "TestCase"
93
- ],
85
+ "appliesTo": ["TestCase"],
94
86
  "severity": "info",
95
87
  "weight": 1,
96
88
  "recommendation": "Replace registryId with 'id' or 'guid' attribute for Provar V3 compatibility.",
@@ -106,9 +98,7 @@
106
98
  "category": "XMLSchema",
107
99
  "name": "Value elements must not use text attribute",
108
100
  "description": "Content must be inside <value> element, not as text=\"...\" attribute. Using text attribute causes XML parsing errors.",
109
- "appliesTo": [
110
- "Step"
111
- ],
101
+ "appliesTo": ["Step"],
112
102
  "severity": "critical",
113
103
  "weight": 10,
114
104
  "recommendation": "Change <value text=\"content\"/> to <value>content</value>",
@@ -124,9 +114,7 @@
124
114
  "category": "XMLSchema",
125
115
  "name": "URI attributes must properly encode ampersands",
126
116
  "description": "Ampersands in URI attributes must be encoded as &amp; for valid XML. Unencoded & causes XML parsing errors.",
127
- "appliesTo": [
128
- "Step"
129
- ],
117
+ "appliesTo": ["Step"],
130
118
  "severity": "critical",
131
119
  "weight": 10,
132
120
  "recommendation": "Replace & with &amp; in all uri=\"...\" attributes (e.g., uri=\"sf:ui:binding:object?object=Lead&amp;action=View\")",
@@ -142,9 +130,7 @@
142
130
  "category": "XMLSchema",
143
131
  "name": "Test case must have steps element",
144
132
  "description": "Test case must contain a <steps> element with at least one apiCall. Missing steps element prevents test case from loading.",
145
- "appliesTo": [
146
- "TestCase"
147
- ],
133
+ "appliesTo": ["TestCase"],
148
134
  "severity": "critical",
149
135
  "weight": 10,
150
136
  "recommendation": "Add <steps> element containing apiCall steps to the test case.",
@@ -160,9 +146,7 @@
160
146
  "category": "XMLSchema",
161
147
  "name": "Test case should not be empty",
162
148
  "description": "Test case <steps> element should contain at least one <apiCall>. Empty test cases have no executable logic.",
163
- "appliesTo": [
164
- "TestCase"
165
- ],
149
+ "appliesTo": ["TestCase"],
166
150
  "severity": "minor",
167
151
  "weight": 2,
168
152
  "recommendation": "Add apiCall steps to implement test logic.",
@@ -178,9 +162,7 @@
178
162
  "category": "XMLSchema",
179
163
  "name": "API identifier must be a valid Provar API",
180
164
  "description": "The apiId attribute must reference a real Provar API. Unknown or hallucinated apiIds (like 'ApexDescribeObject') cause complete test step failures because Provar cannot find the API implementation.",
181
- "appliesTo": [
182
- "Step"
183
- ],
165
+ "appliesTo": ["Step"],
184
166
  "severity": "critical",
185
167
  "weight": 10,
186
168
  "recommendation": "Use only valid Provar apiIds. Common corrections: ApexDescribeObject→ApexReadObject, ApexQueryObject→ApexSoqlQuery, ApexInsertObject→ApexCreateObject. Refer to provar_test_step_schema.json for the complete list of valid APIs.",
@@ -195,10 +177,7 @@
195
177
  "category": "NamingConventions",
196
178
  "name": "Folder names are modular and title-cased",
197
179
  "description": "Test folders must be concise, modular, alphabetic, and use Title Case with spaces between words.",
198
- "appliesTo": [
199
- "Folder",
200
- "TestCase"
201
- ],
180
+ "appliesTo": ["Folder", "TestCase"],
202
181
  "severity": "major",
203
182
  "weight": 5,
204
183
  "recommendation": "Rename folder to be concise, alphabetic only, and in Title Case (e.g. 'Test Case Design').",
@@ -214,9 +193,7 @@
214
193
  "category": "NamingConventions",
215
194
  "name": "Test case names use consistent naming convention",
216
195
  "description": "Test case names must follow a consistent naming pattern. NOTE: This rule only applies to test cases with an explicit 'name' attribute (typically callable test cases). The 'id' attribute can be any format.",
217
- "appliesTo": [
218
- "TestCase"
219
- ],
196
+ "appliesTo": ["TestCase"],
220
197
  "severity": "minor",
221
198
  "weight": 2,
222
199
  "recommendation": "Use a consistent naming style for callable test case names. Examples: 'CreateAndConvertLead', 'createAndConvertLead', 'Create And Convert Lead'.",
@@ -233,9 +210,7 @@
233
210
  "category": "NamingConventions",
234
211
  "name": "Parameters and variables use camelCase",
235
212
  "description": "Test parameters, variables, and return values must be camelCase and unique within their scope.",
236
- "appliesTo": [
237
- "Parameter"
238
- ],
213
+ "appliesTo": ["Parameter"],
239
214
  "severity": "major",
240
215
  "weight": 5,
241
216
  "recommendation": "Rename parameters and variables to camelCase and ensure no duplicates in the same scope.",
@@ -251,10 +226,7 @@
251
226
  "category": "NamingConventions",
252
227
  "name": "Page Objects use PascalCase",
253
228
  "description": "Page Object names must follow PascalCase and represent a single logical page or screen.",
254
- "appliesTo": [
255
- "PageObject",
256
- "TestCase"
257
- ],
229
+ "appliesTo": ["PageObject", "TestCase"],
258
230
  "severity": "major",
259
231
  "weight": 5,
260
232
  "recommendation": "Rename Page Object to PascalCase (e.g. 'AccountDetailsPage').",
@@ -270,10 +242,7 @@
270
242
  "category": "NamingConventions",
271
243
  "name": "Field names use camelCase",
272
244
  "description": "Field mapping names must be camelCase for consistency and readability.",
273
- "appliesTo": [
274
- "Field",
275
- "TestCase"
276
- ],
245
+ "appliesTo": ["Field", "TestCase"],
277
246
  "severity": "minor",
278
247
  "weight": 2,
279
248
  "recommendation": "Rename field mapping to camelCase (e.g. 'billingStreet').",
@@ -289,9 +258,7 @@
289
258
  "category": "StructureAndGrouping",
290
259
  "name": "All steps are inside Group steps or BDD structure",
291
260
  "description": "Every test step must be contained within a Group Step, BDD design step (Given/When/Then/And/But), or Finally block to improve readability and maintenance.",
292
- "appliesTo": [
293
- "TestCase"
294
- ],
261
+ "appliesTo": ["TestCase"],
295
262
  "severity": "minor",
296
263
  "weight": 2,
297
264
  "recommendation": "Wrap root-level steps into logically named Group Steps, BDD steps (Given/When/Then), or Finally blocks.",
@@ -308,9 +275,7 @@
308
275
  "category": "StructureAndGrouping",
309
276
  "name": "Test case has top-level summary",
310
277
  "description": "Each test case must have a summary describing its purpose and usage.",
311
- "appliesTo": [
312
- "TestCase"
313
- ],
278
+ "appliesTo": ["TestCase"],
314
279
  "severity": "info",
315
280
  "weight": 1,
316
281
  "recommendation": "Add a concise summary describing scenario, preconditions, and outcome.",
@@ -325,19 +290,14 @@
325
290
  "category": "StructureAndGrouping",
326
291
  "name": "Custom step names for UI asserts and sets",
327
292
  "description": "UI Assert, Set Values, and long SOQL query steps must be renamed to be descriptive.",
328
- "appliesTo": [
329
- "Step",
330
- "TestCase"
331
- ],
293
+ "appliesTo": ["Step", "TestCase"],
332
294
  "severity": "minor",
333
295
  "weight": 2,
334
296
  "recommendation": "Rename the step to describe what is being asserted or set (e.g. 'assertAccountStatusIsActive').",
335
297
  "check": {
336
298
  "type": "semanticPattern",
337
299
  "target": "step",
338
- "appliesWhen": [
339
- "step.type in ['UIAssert','SetValues','SOQL']"
340
- ],
300
+ "appliesWhen": ["step.type in ['UIAssert','SetValues','SOQL']"],
341
301
  "mustHaveCustomName": true
342
302
  },
343
303
  "source": "README: Naming Conventions - Test Step Names"
@@ -347,9 +307,7 @@
347
307
  "category": "DataDrivenTesting",
348
308
  "name": "Excel headers match field label or API name",
349
309
  "description": "Excel/data source column headers must match either the field label or API name.",
350
- "appliesTo": [
351
- "DataSource"
352
- ],
310
+ "appliesTo": ["DataSource"],
353
311
  "severity": "major",
354
312
  "weight": 5,
355
313
  "recommendation": "Rename Excel column headers to match Salesforce field labels or API names.",
@@ -365,10 +323,7 @@
365
323
  "category": "DataDrivenTesting",
366
324
  "name": "No Excel functions in data",
367
325
  "description": "Excel test data must be static; functions are not allowed in cells.",
368
- "appliesTo": [
369
- "DataSource",
370
- "TestCase"
371
- ],
326
+ "appliesTo": ["DataSource", "TestCase"],
372
327
  "severity": "major",
373
328
  "weight": 5,
374
329
  "recommendation": "Replace Excel formulas with static values to keep tests deterministic.",
@@ -384,9 +339,7 @@
384
339
  "category": "DataDrivenTesting",
385
340
  "name": "Variable names must use valid identifiers",
386
341
  "description": "Variable names, field references, and result names must contain only letters, digits, and underscores. Spaces, hyphens, and special characters cause RUNTIME FAILURES in Provar. Examples: {Account.Name} ✅ | {Account.Account Name} ❌ (space will fail)",
387
- "appliesTo": [
388
- "Step"
389
- ],
342
+ "appliesTo": ["Step"],
390
343
  "severity": "critical",
391
344
  "weight": 8,
392
345
  "recommendation": "Replace spaces and special characters with underscores. Use API field names (e.g., Account.Name) instead of field labels (e.g., Account.Account Name).",
@@ -403,10 +356,7 @@
403
356
  "category": "DataDrivenTesting",
404
357
  "name": "No hardcoded values in steps",
405
358
  "description": "Fields and values used more than once in a test must be parameterized or stored in variables.",
406
- "appliesTo": [
407
- "Step",
408
- "TestCase"
409
- ],
359
+ "appliesTo": ["Step", "TestCase"],
410
360
  "severity": "minor",
411
361
  "weight": 3,
412
362
  "recommendation": "Replace repeated literal values with variables or parameters defined in the test case.",
@@ -423,9 +373,7 @@
423
373
  "category": "ReusabilityAndCallables",
424
374
  "name": "Callable tests reside in Callables folder",
425
375
  "description": "Callable tests must be stored under a designated Callables folder for discoverability.",
426
- "appliesTo": [
427
- "TestCase"
428
- ],
376
+ "appliesTo": ["TestCase"],
429
377
  "severity": "minor",
430
378
  "weight": 2,
431
379
  "recommendation": "Move callable test into 'tests/Callables' (or equivalent) folder.",
@@ -440,9 +388,7 @@
440
388
  "category": "ReusabilityAndCallables",
441
389
  "name": "Callable tests are parameterized",
442
390
  "description": "Callable tests must define input parameters instead of using internal hardcoded values.",
443
- "appliesTo": [
444
- "TestCase"
445
- ],
391
+ "appliesTo": ["TestCase"],
446
392
  "severity": "minor",
447
393
  "weight": 2,
448
394
  "recommendation": "Add input parameters to the callable test and reference them in steps instead of literals.",
@@ -458,9 +404,7 @@
458
404
  "category": "ReusabilityAndCallables",
459
405
  "name": "Callable tests executable in isolation",
460
406
  "description": "Callable tests must be self-contained and executable independently for debugging.",
461
- "appliesTo": [
462
- "TestCase"
463
- ],
407
+ "appliesTo": ["TestCase"],
464
408
  "severity": "minor",
465
409
  "weight": 2,
466
410
  "recommendation": "Ensure callable tests create their own preconditions (records, connections) or accept them as parameters.",
@@ -476,9 +420,7 @@
476
420
  "category": "ConnectionsAndEnvironments",
477
421
  "name": "Admin connection supports Login-As",
478
422
  "description": "There must be an Admin connection configured to perform Login-As for other profiles.",
479
- "appliesTo": [
480
- "Project"
481
- ],
423
+ "appliesTo": ["Project"],
482
424
  "severity": "major",
483
425
  "weight": 5,
484
426
  "recommendation": "Create an Admin connection with 'login as' permissions for target profiles.",
@@ -494,9 +436,7 @@
494
436
  "category": "ConnectionsAndEnvironments",
495
437
  "name": "Connection names should not contain environment specifiers",
496
438
  "description": "Connection names should be environment-agnostic. Avoid embedding UAT, QA, Sandbox, Prod, Production, or Scratch in connection names. Use environment overrides instead.",
497
- "appliesTo": [
498
- "TestCase"
499
- ],
439
+ "appliesTo": ["TestCase"],
500
440
  "severity": "minor",
501
441
  "weight": 2,
502
442
  "recommendation": "Remove environment specifiers from connection names. Create environment-specific connections via Provar environment overrides.",
@@ -511,9 +451,7 @@
511
451
  "category": "TestCaseDesign",
512
452
  "name": "Prefer API for setup where possible",
513
453
  "description": "Test setup steps that only prepare data should use API/SOQL instead of UI flows when feasible.",
514
- "appliesTo": [
515
- "Step"
516
- ],
454
+ "appliesTo": ["Step"],
517
455
  "severity": "minor",
518
456
  "weight": 3,
519
457
  "recommendation": "Replace UI-based record creation for setup with API or SOQL-based data creation where appropriate.",
@@ -530,9 +468,7 @@
530
468
  "category": "TestCaseDesign",
531
469
  "name": "Use Group Steps or BDD structure for logical phases",
532
470
  "description": "Long tests should be organized using Group Steps, BDD design steps (Given/When/Then/And/But), or Finally blocks that represent logical phases of the flow.",
533
- "appliesTo": [
534
- "TestCase"
535
- ],
471
+ "appliesTo": ["TestCase"],
536
472
  "severity": "minor",
537
473
  "weight": 2,
538
474
  "recommendation": "Organize test with Group Steps (e.g. 'Setup', 'Execute Scenario', 'Validate Results'), BDD steps (Given/When/Then), or Finally blocks around related actions.",
@@ -550,9 +486,7 @@
550
486
  "category": "TestCaseDesign",
551
487
  "name": "Disabled test steps should be removed",
552
488
  "description": "Test steps marked with <tags><string>disabled</string></tags> should be removed from the test case to maintain clean, maintainable code. Disabled steps create technical debt and confusion.",
553
- "appliesTo": [
554
- "Step"
555
- ],
489
+ "appliesTo": ["Step"],
556
490
  "severity": "minor",
557
491
  "weight": 2,
558
492
  "recommendation": "Remove disabled test steps entirely. If the step is needed for future use, consider creating a separate test case or adding it when actually required.",
@@ -567,9 +501,7 @@
567
501
  "category": "MaintenanceAndFolders",
568
502
  "name": "Folder-level setup test per application segment",
569
503
  "description": "Each folder representing an application segment must include a setup test case for connections.",
570
- "appliesTo": [
571
- "Folder"
572
- ],
504
+ "appliesTo": ["Folder"],
573
505
  "severity": "minor",
574
506
  "weight": 3,
575
507
  "recommendation": "Add a setup test case that establishes folder-wide connections (even if folder scope bug exists).",
@@ -585,9 +517,7 @@
585
517
  "category": "MaintenanceAndFolders",
586
518
  "name": "Consistent Provar/OS/browser versions",
587
519
  "description": "Execution environments and authors should align on Provar, OS, and browser versions.",
588
- "appliesTo": [
589
- "Project"
590
- ],
520
+ "appliesTo": ["Project"],
591
521
  "severity": "info",
592
522
  "weight": 1,
593
523
  "recommendation": "Document and standardize supported Provar, OS, and browser versions in project configuration.",
@@ -602,9 +532,7 @@
602
532
  "category": "BuildAndCI",
603
533
  "name": "Regression Test Plan exists for CI",
604
534
  "description": "A Regression Test Plan must exist and be referenced by CI builds.",
605
- "appliesTo": [
606
- "Project"
607
- ],
535
+ "appliesTo": ["Project"],
608
536
  "severity": "major",
609
537
  "weight": 5,
610
538
  "recommendation": "Ensure there is a 'Regression' plan and that the CI workflow references it.",
@@ -620,9 +548,7 @@
620
548
  "category": "TestCaseDesign",
621
549
  "name": "Test case has valid identifier",
622
550
  "description": "Test case must have a valid identifier: 'guid' (V3), 'id', or 'registryId' (legacy) attribute.",
623
- "appliesTo": [
624
- "TestCase"
625
- ],
551
+ "appliesTo": ["TestCase"],
626
552
  "severity": "critical",
627
553
  "weight": 8,
628
554
  "recommendation": "Add a valid identifier to the <testCase> element: guid (preferred), id, or registryId attribute.",
@@ -637,9 +563,7 @@
637
563
  "category": "TestCaseDesign",
638
564
  "name": "Test case has steps element",
639
565
  "description": "Test case must contain a <steps> element with at least one step.",
640
- "appliesTo": [
641
- "TestCase"
642
- ],
566
+ "appliesTo": ["TestCase"],
643
567
  "severity": "critical",
644
568
  "weight": 8,
645
569
  "recommendation": "Add a <steps> element containing apiCall steps.",
@@ -654,9 +578,7 @@
654
578
  "category": "ConnectionsAndEnvironments",
655
579
  "name": "UiConnect has invalid arguments (ApexConnect arguments used)",
656
580
  "description": "UiConnect steps have different arguments than ApexConnect. UiConnect does NOT support: autoCleanup, enableObjectIdLogging, quickUiLogin, closeAllPrimaryTabs, alreadyOpenBehaviour, lightningMode, uiApplicationName, cleanupConnectionName. Valid UiConnect arguments are: connectionName, connectionId, resultName, resultScope, reuseConnectionName, privateBrowsingMode, webBrowser.",
657
- "appliesTo": [
658
- "Step"
659
- ],
581
+ "appliesTo": ["Step"],
660
582
  "severity": "critical",
661
583
  "weight": 10,
662
584
  "recommendation": "Remove invalid arguments from UiConnect. For Salesforce connections requiring autoCleanup, use ApexConnect instead of UiConnect. UiConnect is for non-Salesforce UI connections only.",
@@ -671,9 +593,7 @@
671
593
  "category": "ConnectionsAndEnvironments",
672
594
  "name": "Prefer autoCleanup over manual ApexDeleteObject steps",
673
595
  "description": "ApexConnect should use autoCleanup=true instead of manual ApexDeleteObject steps. autoCleanup is preferred because it requires fewer steps, is more reliable (cleanup happens even if test fails), and automatically handles deletion order. Only use manual deletes when records are created indirectly and IDs aren't captured. Note: With multiple ApexConnect steps, autoCleanup only deletes records created using that specific connection's resultName.",
674
- "appliesTo": [
675
- "Step"
676
- ],
596
+ "appliesTo": ["Step"],
677
597
  "severity": "minor",
678
598
  "weight": 2,
679
599
  "recommendation": "Set autoCleanup=true in ApexConnect and remove manual ApexDeleteObject steps. autoCleanup automatically deletes records created via ApexCreateObject and UiWithScreen action=New (when sfUiTargetResultName captures the ID). With multiple connections, each autoCleanup only handles its own connection's records.",
@@ -688,9 +608,7 @@
688
608
  "category": "TestCaseDesign",
689
609
  "name": "First UiWithScreen must use navigate=Always or IfNeccessary",
690
610
  "description": "The first UiWithScreen step must use navigate='Always' or 'IfNeccessary' to ensure proper navigation. Using 'Dont' will cause failures in CLI/debug mode. This rule is skipped for callable tests (visibility='Internal').",
691
- "appliesTo": [
692
- "Step"
693
- ],
611
+ "appliesTo": ["Step"],
694
612
  "severity": "major",
695
613
  "weight": 5,
696
614
  "recommendation": "Set navigate='Always' (preferred) or 'IfNeccessary' for the first UiWithScreen step. Never use 'Dont' on the first UiWithScreen unless in a callable test.",
@@ -705,9 +623,7 @@
705
623
  "category": "TestCaseDesign",
706
624
  "name": "First UiWithScreen should prefer navigate=Always over IfNeccessary",
707
625
  "description": "The first UiWithScreen step should use navigate='Always' rather than 'IfNeccessary' for more reliable navigation. While 'IfNeccessary' works, 'Always' provides more consistent behavior. This rule is skipped for callable tests (visibility='Internal').",
708
- "appliesTo": [
709
- "Step"
710
- ],
626
+ "appliesTo": ["Step"],
711
627
  "severity": "minor",
712
628
  "weight": 2,
713
629
  "recommendation": "Change navigate='IfNeccessary' to navigate='Always' for the first UiWithScreen step for more reliable navigation.",
@@ -722,9 +638,7 @@
722
638
  "category": "TestCaseDesign",
723
639
  "name": "UiWithScreen with navigate=Always for Edit/View must have sfUiTargetObjectId",
724
640
  "description": "When UiWithScreen navigates to an Edit or View screen with navigate='Always', the sfUiTargetObjectId argument must be populated to specify which record to edit or view. Without this, Provar cannot determine which record to navigate to. This does not apply to New screens (which create new records) or List/Home screens.",
725
- "appliesTo": [
726
- "Step"
727
- ],
641
+ "appliesTo": ["Step"],
728
642
  "severity": "major",
729
643
  "weight": 5,
730
644
  "recommendation": "Add sfUiTargetObjectId argument referencing a previously captured record ID variable (e.g., AccountId from a prior UiWithScreen with action=New or ApexCreateObject).",
@@ -739,9 +653,7 @@
739
653
  "category": "NamingConventions",
740
654
  "name": "ApexConnect resultName is unique",
741
655
  "description": "Each ApexConnect step must have a unique resultName for proper connection tracking.",
742
- "appliesTo": [
743
- "Step"
744
- ],
656
+ "appliesTo": ["Step"],
745
657
  "severity": "minor",
746
658
  "weight": 2,
747
659
  "recommendation": "Use unique resultName values like 'ApexConnection', 'ApexConnection2', etc.",
@@ -757,9 +669,7 @@
757
669
  "category": "TestCaseDesign",
758
670
  "name": "testItemId values are whole numbers",
759
671
  "description": "All testItemId attributes must be whole numbers, not decimals.",
760
- "appliesTo": [
761
- "Step"
762
- ],
672
+ "appliesTo": ["Step"],
763
673
  "severity": "critical",
764
674
  "weight": 8,
765
675
  "recommendation": "Use whole numbers for testItemId (1, 2, 3...) not decimals (1.0, 2.5).",
@@ -774,9 +684,7 @@
774
684
  "category": "DataDrivenTesting",
775
685
  "name": "Variable references use correct syntax",
776
686
  "description": "Variable references must use {VarName[1].Field} syntax, not {VarName.1.Field}.",
777
- "appliesTo": [
778
- "Step"
779
- ],
687
+ "appliesTo": ["Step"],
780
688
  "severity": "minor",
781
689
  "weight": 2,
782
690
  "recommendation": "Use {ResultName[index].FieldName} where index starts at 1, not 0.",
@@ -792,9 +700,7 @@
792
700
  "category": "NamingConventions",
793
701
  "name": "Custom fields end with __c",
794
702
  "description": "Custom field references must end with '__c' suffix.",
795
- "appliesTo": [
796
- "Step"
797
- ],
703
+ "appliesTo": ["Step"],
798
704
  "severity": "major",
799
705
  "weight": 5,
800
706
  "recommendation": "Add '__c' suffix to custom field names (e.g. 'CustomField__c').",
@@ -809,9 +715,7 @@
809
715
  "category": "TestCaseDesign",
810
716
  "name": "SOQL queries include Id and Name",
811
717
  "description": "SOQL queries should retrieve Id and Name fields by default.",
812
- "appliesTo": [
813
- "Step"
814
- ],
718
+ "appliesTo": ["Step"],
815
719
  "severity": "minor",
816
720
  "weight": 2,
817
721
  "recommendation": "Add 'Id, Name' to SELECT clause for object queries.",
@@ -827,9 +731,7 @@
827
731
  "category": "TestCaseDesign",
828
732
  "name": "ForEach loops have valid source collection",
829
733
  "description": "ForEach steps must specify a valid source collection to iterate over.",
830
- "appliesTo": [
831
- "Step"
832
- ],
734
+ "appliesTo": ["Step"],
833
735
  "severity": "major",
834
736
  "weight": 4,
835
737
  "recommendation": "Add 'list' argument to ForEach step referencing a valid collection variable.",
@@ -845,9 +747,7 @@
845
747
  "category": "TestCaseDesign",
846
748
  "name": "If statements have conditions",
847
749
  "description": "If steps must have a boolean condition expression.",
848
- "appliesTo": [
849
- "Step"
850
- ],
750
+ "appliesTo": ["Step"],
851
751
  "severity": "critical",
852
752
  "weight": 8,
853
753
  "recommendation": "Add 'condition' argument to If step with valid boolean expression.",
@@ -863,9 +763,7 @@
863
763
  "category": "TestCaseDesign",
864
764
  "name": "While loops have exit conditions",
865
765
  "description": "While loops must have a condition to prevent infinite loops.",
866
- "appliesTo": [
867
- "Step"
868
- ],
766
+ "appliesTo": ["Step"],
869
767
  "severity": "critical",
870
768
  "weight": 8,
871
769
  "recommendation": "Add 'condition' argument to While step that will eventually evaluate to false.",
@@ -881,9 +779,7 @@
881
779
  "category": "TestCaseDesign",
882
780
  "name": "ForEach loops have valueName to store current item",
883
781
  "description": "ForEach steps must specify a valueName argument to store the current iteration value.",
884
- "appliesTo": [
885
- "Step"
886
- ],
782
+ "appliesTo": ["Step"],
887
783
  "severity": "critical",
888
784
  "weight": 8,
889
785
  "recommendation": "Add 'valueName' argument to ForEach step to name the variable that will hold each item during iteration.",
@@ -899,9 +795,7 @@
899
795
  "category": "TestCaseDesign",
900
796
  "name": "Switch statements have value expression",
901
797
  "description": "Switch steps must specify a value argument to evaluate against cases.",
902
- "appliesTo": [
903
- "Step"
904
- ],
798
+ "appliesTo": ["Step"],
905
799
  "severity": "critical",
906
800
  "weight": 8,
907
801
  "recommendation": "Add 'value' argument to Switch step with the expression to evaluate.",
@@ -917,9 +811,7 @@
917
811
  "category": "TestCaseDesign",
918
812
  "name": "Sleep steps have duration specified",
919
813
  "description": "Sleep steps must specify sleepSecs argument with the number of seconds to wait.",
920
- "appliesTo": [
921
- "Step"
922
- ],
814
+ "appliesTo": ["Step"],
923
815
  "severity": "critical",
924
816
  "weight": 8,
925
817
  "recommendation": "Add 'sleepSecs' argument to Sleep step with a positive decimal value.",
@@ -935,9 +827,7 @@
935
827
  "category": "TestCaseDesign",
936
828
  "name": "WaitFor steps have condition",
937
829
  "description": "WaitFor steps must specify a condition argument to evaluate each iteration.",
938
- "appliesTo": [
939
- "Step"
940
- ],
830
+ "appliesTo": ["Step"],
941
831
  "severity": "critical",
942
832
  "weight": 8,
943
833
  "recommendation": "Add 'condition' argument to WaitFor step with a boolean expression to wait for.",
@@ -953,9 +843,7 @@
953
843
  "category": "TestCaseDesign",
954
844
  "name": "WaitFor steps have max iterations limit",
955
845
  "description": "WaitFor steps must specify maxIterations to prevent infinite waiting.",
956
- "appliesTo": [
957
- "Step"
958
- ],
846
+ "appliesTo": ["Step"],
959
847
  "severity": "major",
960
848
  "weight": 5,
961
849
  "recommendation": "Add 'maxIterations' argument to WaitFor step to limit wait cycles.",
@@ -971,9 +859,7 @@
971
859
  "category": "TestCaseDesign",
972
860
  "name": "AssertValues has comparisonType",
973
861
  "description": "AssertValues steps must specify a comparisonType argument (EqualTo, Contains, etc.).",
974
- "appliesTo": [
975
- "Step"
976
- ],
862
+ "appliesTo": ["Step"],
977
863
  "severity": "critical",
978
864
  "weight": 8,
979
865
  "recommendation": "Add 'comparisonType' argument with valid value: EqualTo, NotEqualTo, Contains, NotContains, StartsWith, EndsWith, GreaterThan, LessThan, Matches, IsNull, NotNull.",
@@ -989,9 +875,7 @@
989
875
  "category": "TestCaseDesign",
990
876
  "name": "AssertValues has expectedValue",
991
877
  "description": "AssertValues steps must specify an expectedValue argument containing the value to test.",
992
- "appliesTo": [
993
- "Step"
994
- ],
878
+ "appliesTo": ["Step"],
995
879
  "severity": "critical",
996
880
  "weight": 8,
997
881
  "recommendation": "Add 'expectedValue' argument with the variable or value being verified.",
@@ -1007,9 +891,7 @@
1007
891
  "category": "TestCaseDesign",
1008
892
  "name": "AssertValues has actualValue",
1009
893
  "description": "AssertValues steps must specify an actualValue argument containing the expected result. NOTE: actualValue CAN be empty when using NotEqualTo to check if a string is NOT blank (common pattern for null/blank checks).",
1010
- "appliesTo": [
1011
- "Step"
1012
- ],
894
+ "appliesTo": ["Step"],
1013
895
  "severity": "critical",
1014
896
  "weight": 8,
1015
897
  "recommendation": "Add 'actualValue' argument with the expected result to compare against. For blank string checks, actualValue can be empty with NotEqualTo comparison.",
@@ -1025,9 +907,7 @@
1025
907
  "category": "TestCaseDesign",
1026
908
  "name": "Given steps have description",
1027
909
  "description": "BDD Given steps must specify a description argument explaining the precondition.",
1028
- "appliesTo": [
1029
- "Step"
1030
- ],
910
+ "appliesTo": ["Step"],
1031
911
  "severity": "major",
1032
912
  "weight": 5,
1033
913
  "recommendation": "Add 'description' argument to Given step with a clear precondition statement.",
@@ -1043,9 +923,7 @@
1043
923
  "category": "TestCaseDesign",
1044
924
  "name": "When steps have description",
1045
925
  "description": "BDD When steps must specify a description argument explaining the action.",
1046
- "appliesTo": [
1047
- "Step"
1048
- ],
926
+ "appliesTo": ["Step"],
1049
927
  "severity": "major",
1050
928
  "weight": 5,
1051
929
  "recommendation": "Add 'description' argument to When step with a clear action statement.",
@@ -1061,9 +939,7 @@
1061
939
  "category": "TestCaseDesign",
1062
940
  "name": "Then steps have description",
1063
941
  "description": "BDD Then steps must specify a description argument explaining the expected outcome.",
1064
- "appliesTo": [
1065
- "Step"
1066
- ],
942
+ "appliesTo": ["Step"],
1067
943
  "severity": "major",
1068
944
  "weight": 5,
1069
945
  "recommendation": "Add 'description' argument to Then step with a clear expected outcome statement.",
@@ -1079,9 +955,7 @@
1079
955
  "category": "TestCaseDesign",
1080
956
  "name": "ApexSoqlQuery has soqlQuery argument",
1081
957
  "description": "ApexSoqlQuery steps must specify a soqlQuery argument with the SOQL statement.",
1082
- "appliesTo": [
1083
- "Step"
1084
- ],
958
+ "appliesTo": ["Step"],
1085
959
  "severity": "critical",
1086
960
  "weight": 8,
1087
961
  "recommendation": "Add 'soqlQuery' argument with valid SOQL statement (e.g., SELECT Id, Name FROM Account).",
@@ -1097,9 +971,7 @@
1097
971
  "category": "ConnectionsAndEnvironments",
1098
972
  "name": "DbConnect has connectionName",
1099
973
  "description": "DbConnect steps must specify a connectionName argument identifying the database connection.",
1100
- "appliesTo": [
1101
- "Step"
1102
- ],
974
+ "appliesTo": ["Step"],
1103
975
  "severity": "critical",
1104
976
  "weight": 8,
1105
977
  "recommendation": "Add 'connectionName' argument with the database connection identifier from environment settings.",
@@ -1115,9 +987,7 @@
1115
987
  "category": "ConnectionsAndEnvironments",
1116
988
  "name": "DbConnect has resultName",
1117
989
  "description": "DbConnect steps must specify a resultName argument to store the connection reference.",
1118
- "appliesTo": [
1119
- "Step"
1120
- ],
990
+ "appliesTo": ["Step"],
1121
991
  "severity": "critical",
1122
992
  "weight": 8,
1123
993
  "recommendation": "Add 'resultName' argument with the variable name to store the connection reference.",
@@ -1133,9 +1003,7 @@
1133
1003
  "category": "TestCaseDesign",
1134
1004
  "name": "SqlQuery has query argument",
1135
1005
  "description": "SqlQuery steps must specify a query argument with the SQL statement.",
1136
- "appliesTo": [
1137
- "Step"
1138
- ],
1006
+ "appliesTo": ["Step"],
1139
1007
  "severity": "critical",
1140
1008
  "weight": 8,
1141
1009
  "recommendation": "Add 'query' argument with valid SQL statement.",
@@ -1151,9 +1019,7 @@
1151
1019
  "category": "TestCaseDesign",
1152
1020
  "name": "SqlQuery has dbConnectionName",
1153
1021
  "description": "SqlQuery steps must specify a dbConnectionName argument referencing the database connection.",
1154
- "appliesTo": [
1155
- "Step"
1156
- ],
1022
+ "appliesTo": ["Step"],
1157
1023
  "severity": "critical",
1158
1024
  "weight": 8,
1159
1025
  "recommendation": "Add 'dbConnectionName' argument with the resultName from a DbConnect step.",
@@ -1169,9 +1035,7 @@
1169
1035
  "category": "ConnectionsAndEnvironments",
1170
1036
  "name": "WebConnect has connectionName",
1171
1037
  "description": "WebConnect steps must specify a connectionName argument identifying the web service connection.",
1172
- "appliesTo": [
1173
- "Step"
1174
- ],
1038
+ "appliesTo": ["Step"],
1175
1039
  "severity": "critical",
1176
1040
  "weight": 8,
1177
1041
  "recommendation": "Add 'connectionName' argument with the web service connection identifier.",
@@ -1187,9 +1051,7 @@
1187
1051
  "category": "ConnectionsAndEnvironments",
1188
1052
  "name": "WebConnect has resultName",
1189
1053
  "description": "WebConnect steps must specify a resultName argument to store the connection reference.",
1190
- "appliesTo": [
1191
- "Step"
1192
- ],
1054
+ "appliesTo": ["Step"],
1193
1055
  "severity": "critical",
1194
1056
  "weight": 8,
1195
1057
  "recommendation": "Add 'resultName' argument with the variable name to store the connection reference.",
@@ -1205,9 +1067,7 @@
1205
1067
  "category": "TestCaseDesign",
1206
1068
  "name": "RestRequest has connectionName",
1207
1069
  "description": "RestRequest steps must specify a connectionName argument referencing the web service connection.",
1208
- "appliesTo": [
1209
- "Step"
1210
- ],
1070
+ "appliesTo": ["Step"],
1211
1071
  "severity": "critical",
1212
1072
  "weight": 8,
1213
1073
  "recommendation": "Add 'connectionName' argument with the resultName from a WebConnect step.",
@@ -1223,10 +1083,7 @@
1223
1083
  "category": "TestCaseDesign",
1224
1084
  "name": "Variables are defined before use",
1225
1085
  "description": "Variables referenced in test should be defined via SetValues or result from previous steps.",
1226
- "appliesTo": [
1227
- "Step",
1228
- "TestCase"
1229
- ],
1086
+ "appliesTo": ["Step", "TestCase"],
1230
1087
  "severity": "major",
1231
1088
  "weight": 5,
1232
1089
  "recommendation": "Define variable with SetValues step or ensure it's populated by previous step (SOQL, CreateObject, etc.).",
@@ -1241,9 +1098,7 @@
1241
1098
  "category": "ConnectionsAndEnvironments",
1242
1099
  "name": "Apex API calls reference valid connections",
1243
1100
  "description": "Apex API operations must reference an existing ApexConnect connection.",
1244
- "appliesTo": [
1245
- "Step"
1246
- ],
1101
+ "appliesTo": ["Step"],
1247
1102
  "severity": "critical",
1248
1103
  "weight": 8,
1249
1104
  "recommendation": "Ensure ApexConnect step exists before Apex API calls and connection names match.",
@@ -1258,9 +1113,7 @@
1258
1113
  "category": "ConnectionsAndEnvironments",
1259
1114
  "name": "Database operations reference valid connections",
1260
1115
  "description": "Database API operations must reference an existing DbConnect connection.",
1261
- "appliesTo": [
1262
- "Step"
1263
- ],
1116
+ "appliesTo": ["Step"],
1264
1117
  "severity": "critical",
1265
1118
  "weight": 8,
1266
1119
  "recommendation": "Ensure DbConnect step exists before database operations and connection names match.",
@@ -1275,9 +1128,7 @@
1275
1128
  "category": "ConnectionsAndEnvironments",
1276
1129
  "name": "UI operations reference valid connections",
1277
1130
  "description": "UI API operations must reference an existing UiConnect connection.",
1278
- "appliesTo": [
1279
- "Step"
1280
- ],
1131
+ "appliesTo": ["Step"],
1281
1132
  "severity": "critical",
1282
1133
  "weight": 8,
1283
1134
  "recommendation": "Ensure UiConnect step exists before UI operations and connection names match.",
@@ -1292,9 +1143,7 @@
1292
1143
  "category": "ConnectionsAndEnvironments",
1293
1144
  "name": "uiConnectionName must be a literal string",
1294
1145
  "description": "UiWithScreen/UiDoAction/UiAssert steps must set uiConnectionName to a literal string (the resultName from UiConnect/ApexConnect). Using <value class=\"variable\"> for uiConnectionName causes Provar to error.",
1295
- "appliesTo": [
1296
- "Step"
1297
- ],
1146
+ "appliesTo": ["Step"],
1298
1147
  "severity": "critical",
1299
1148
  "weight": 8,
1300
1149
  "recommendation": "Set uiConnectionName using <value class=\"value\" valueClass=\"string\">AdminConnection</value> (not a variable reference).",
@@ -1309,9 +1158,7 @@
1309
1158
  "category": "TestCaseDesign",
1310
1159
  "name": "SOQL queries have SELECT and FROM clauses",
1311
1160
  "description": "Valid SOQL queries must contain both SELECT and FROM clauses.",
1312
- "appliesTo": [
1313
- "Step"
1314
- ],
1161
+ "appliesTo": ["Step"],
1315
1162
  "severity": "critical",
1316
1163
  "weight": 8,
1317
1164
  "recommendation": "Ensure SOQL query has format: SELECT <fields> FROM <object>",
@@ -1327,9 +1174,7 @@
1327
1174
  "category": "TestCaseDesign",
1328
1175
  "name": "SOQL queries include WHERE or LIMIT clause",
1329
1176
  "description": "SOQL queries must have WHERE clause or LIMIT to prevent unreasonably large result sets and potential heap size errors. This prevents Apex governance violations and performance issues.",
1330
- "appliesTo": [
1331
- "Step"
1332
- ],
1177
+ "appliesTo": ["Step"],
1333
1178
  "severity": "major",
1334
1179
  "weight": 5,
1335
1180
  "recommendation": "Add WHERE clause to filter results (e.g. WHERE Id = :recordId) or LIMIT clause to cap result size (e.g. LIMIT 100). For large data volumes, always include both WHERE and LIMIT.",
@@ -1345,9 +1190,7 @@
1345
1190
  "category": "TestCaseDesign",
1346
1191
  "name": "SOQL queries must not be inside loops",
1347
1192
  "description": "SOQL queries inside For/ForEach/While/DoWhile loops violate Apex governor limits. Each SOQL query execution consumes from the 100 SOQL query limit per transaction. Queries in loops can quickly exceed this limit causing 'Too many SOQL queries: 101' errors.",
1348
- "appliesTo": [
1349
- "Step"
1350
- ],
1193
+ "appliesTo": ["Step"],
1351
1194
  "severity": "major",
1352
1195
  "weight": 5,
1353
1196
  "recommendation": "Move SOQL query outside the loop and store results in a collection. Then iterate over the collection. Use SOQL WHERE clauses to filter in the query rather than filtering in a loop. Consider using aggregate queries or bulk processing patterns.",
@@ -1363,9 +1206,7 @@
1363
1206
  "category": "ApexAPI",
1364
1207
  "name": "Apex API steps must reference a valid connection",
1365
1208
  "description": "All Apex API calls (ApexCreate, ApexUpdate, ApexDelete, ApexRead, ApexSoqlQuery) must reference a valid Salesforce connection defined earlier in the test using ApexConnect. Tests will fail if connection is missing, empty, or references an undefined connection name.",
1366
- "appliesTo": [
1367
- "Step"
1368
- ],
1209
+ "appliesTo": ["Step"],
1369
1210
  "severity": "major",
1370
1211
  "weight": 5,
1371
1212
  "recommendation": "Add an ApexConnect step before any Apex API calls to establish a Salesforce connection. Reference the connection name in all subsequent Apex API calls. Use variables for connection names if dynamically determined.",
@@ -1380,9 +1221,7 @@
1380
1221
  "category": "ApexAPI",
1381
1222
  "name": "Apex CRUD operations must have valid object types",
1382
1223
  "description": "ApexCreate, ApexUpdate, ApexDelete, and ApexRead steps must specify a valid Salesforce object type (e.g., Account, Contact, Broker__c). Object type must start with capital letter and contain only alphanumeric characters and underscores. Invalid or missing object types cause test failures.",
1383
- "appliesTo": [
1384
- "Step"
1385
- ],
1224
+ "appliesTo": ["Step"],
1386
1225
  "severity": "major",
1387
1226
  "weight": 5,
1388
1227
  "recommendation": "Specify the correct Salesforce object API name (e.g., Account, Contact, Custom__c). Use standard object names or custom object API names ending with __c. Verify object exists in the target Salesforce org.",
@@ -1397,9 +1236,7 @@
1397
1236
  "category": "ApexAPI",
1398
1237
  "name": "ApexUpdateObject must have valid record ID",
1399
1238
  "description": "ApexUpdateObject requires a valid Salesforce record ID (15 or 18 characters) or a variable reference containing the ID. Missing, empty, or invalid record IDs cause test failures. Record IDs must be alphanumeric Salesforce IDs.",
1400
- "appliesTo": [
1401
- "Step"
1402
- ],
1239
+ "appliesTo": ["Step"],
1403
1240
  "severity": "major",
1404
1241
  "weight": 5,
1405
1242
  "recommendation": "Provide a valid 15 or 18 character Salesforce record ID, or use a variable like {AccountId} that contains a valid ID from a prior Create or Read operation. Verify the record exists before attempting update.",
@@ -1414,9 +1251,7 @@
1414
1251
  "category": "ApexAPI",
1415
1252
  "name": "ApexUpdateObject must specify fields to update",
1416
1253
  "description": "ApexUpdateObject steps should specify at least one field to update in the field definitions. Update operations without field specifications have no effect and represent incomplete test logic. System arguments (objectType, recordId, objectId, apexConnectionName, resultScope, assignmentRuleId, resultIdName) are excluded from this check.",
1417
- "appliesTo": [
1418
- "Step"
1419
- ],
1254
+ "appliesTo": ["Step"],
1420
1255
  "severity": "major",
1421
1256
  "weight": 5,
1422
1257
  "recommendation": "Add field definitions to the ApexUpdateObject step and provide values for at least one field to update. For example, specify Name, Status, or other relevant fields with test data or variable references.",
@@ -1431,9 +1266,7 @@
1431
1266
  "category": "ApexAPI",
1432
1267
  "name": "ApexDeleteObject must have valid record ID",
1433
1268
  "description": "ApexDeleteObject requires a valid Salesforce record ID (15 or 18 characters) or a variable reference containing the ID. Missing, empty, or invalid record IDs cause test failures. Record IDs must be alphanumeric Salesforce IDs.",
1434
- "appliesTo": [
1435
- "Step"
1436
- ],
1269
+ "appliesTo": ["Step"],
1437
1270
  "severity": "major",
1438
1271
  "weight": 5,
1439
1272
  "recommendation": "Provide a valid 15 or 18 character Salesforce record ID, or use a variable like {AccountId} that contains a valid ID from a prior Create or Read operation. Verify the record exists before attempting delete.",
@@ -1448,9 +1281,7 @@
1448
1281
  "category": "ApexAPI",
1449
1282
  "name": "ApexReadObject must have valid record ID",
1450
1283
  "description": "ApexReadObject requires a valid Salesforce record ID (15 or 18 characters) or a variable reference containing the ID. Missing, empty, or invalid record IDs cause test failures. Record IDs must be alphanumeric Salesforce IDs.",
1451
- "appliesTo": [
1452
- "Step"
1453
- ],
1284
+ "appliesTo": ["Step"],
1454
1285
  "severity": "major",
1455
1286
  "weight": 5,
1456
1287
  "recommendation": "Provide a valid 15 or 18 character Salesforce record ID, or use a variable like {AccountId} that contains a valid ID from a prior Create operation. Verify the record exists before attempting read.",
@@ -1465,9 +1296,7 @@
1465
1296
  "category": "ApexAPI",
1466
1297
  "name": "ApexCreateObject with fields must populate at least one field",
1467
1298
  "description": "When ApexCreateObject includes a fields structure, at least one field must be populated with a value. Empty field structures indicate incomplete test implementation and may cause test failures or create records with default values only.",
1468
- "appliesTo": [
1469
- "Step"
1470
- ],
1299
+ "appliesTo": ["Step"],
1471
1300
  "severity": "major",
1472
1301
  "weight": 5,
1473
1302
  "recommendation": "Populate at least one field with a value or variable reference in the ApexCreateObject fields structure. Remove the fields structure if not needed. Verify required fields for the object are populated.",
@@ -1482,9 +1311,7 @@
1482
1311
  "category": "ApexAPI",
1483
1312
  "name": "ApexCreateObject and ApexUpdateObject must include parameter metadata",
1484
1313
  "description": "ApexCreateObject and ApexUpdateObject steps MUST include <parameterGeneratorProperties> and <generatedParameters> sections after </arguments>. These metadata sections enable Provar IDE features like field auto-complete, field suggestions, and proper object binding. Missing metadata causes degraded IDE experience and prevents field discovery.",
1485
- "appliesTo": [
1486
- "Step"
1487
- ],
1314
+ "appliesTo": ["Step"],
1488
1315
  "severity": "major",
1489
1316
  "weight": 5,
1490
1317
  "recommendation": "Add <parameterGeneratorProperties> with ConnectionName and CustomObjectName properties, and <generatedParameters> with apiParam elements for each field used in arguments. Study existing tier4 examples to see the exact structure required.",
@@ -1499,9 +1326,7 @@
1499
1326
  "category": "ApexAPI",
1500
1327
  "name": "ApexUpdateObject/ApexCreateObject field arguments must be direct, not nested in uiObjectFieldValue",
1501
1328
  "description": "ApexUpdateObject and ApexCreateObject steps MUST use direct field arguments (e.g., <argument id='Status'><value.../></argument>) instead of nesting fields within uiObjectFieldValue elements inside the values argument. The values argument should contain only an empty valueList. Nested uiObjectFieldValue structures cause runtime failures and prevent proper field serialization.",
1502
- "appliesTo": [
1503
- "Step"
1504
- ],
1329
+ "appliesTo": ["Step"],
1505
1330
  "severity": "major",
1506
1331
  "weight": 5,
1507
1332
  "recommendation": "Use direct field arguments: <argument id='FieldName'><value class='value' valueClass='string'>FieldValue</value></argument> with a separate empty <argument id='values'><value class='valueList' mutable='Mutable'/></argument>. Do NOT nest fields inside uiObjectFieldValue within the values argument.",
@@ -1516,9 +1341,7 @@
1516
1341
  "category": "ApexAPI",
1517
1342
  "name": "ApexReadObject must use generatedParameters for field references, not fields argument with textType",
1518
1343
  "description": "ApexReadObject steps should NOT use a 'fields' argument containing textType elements for field names. Instead, fields must be properly referenced via generatedParameters with modelBinding attributes. The incorrect pattern uses <argument id='fields'><value class='valueList'><textType>FieldName</textType></value></argument> which prevents proper field metadata and IDE integration. The correct pattern includes proper <generatedParameters> with <apiParam group='fields' modelBinding='sf:ui:binding:object?field=FieldName&object=ObjectType'> elements.",
1519
- "appliesTo": [
1520
- "Step"
1521
- ],
1344
+ "appliesTo": ["Step"],
1522
1345
  "severity": "major",
1523
1346
  "weight": 5,
1524
1347
  "recommendation": "Remove the 'fields' argument with textType elements. Ensure each field has a corresponding <apiParam> entry in <generatedParameters> with proper modelBinding. Fields should be declared through generatedParameters, not through a fields argument.",
@@ -1533,9 +1356,7 @@
1533
1356
  "category": "XMLSchema",
1534
1357
  "name": "Apex CRUD apiParam elements must be self-closing without summary/type children",
1535
1358
  "description": "In ApexCreateObject, ApexUpdateObject, and ApexReadObject steps, <apiParam> elements within <generatedParameters> MUST be self-closing tags without child elements. LLMs commonly hallucinate <summary> and <type> elements inside apiParam, which causes Provar to reject the test case as invalid XML. The correct pattern is: <apiParam group=\"fields\" modelBinding=\"sf:ui:binding:object?object=Account&field=Name\" name=\"Name\" title=\"Name\"/>. The hallucinated pattern includes <summary>description</summary> and <type><textType>...</textType></type> children which are ONLY valid in other contexts (RestRequest, UiDoAction) but NEVER in Apex CRUD operations.",
1536
- "appliesTo": [
1537
- "Step"
1538
- ],
1359
+ "appliesTo": ["Step"],
1539
1360
  "severity": "critical",
1540
1361
  "weight": 10,
1541
1362
  "recommendation": "Remove all <summary> and <type> child elements from apiParam elements in ApexCreateObject, ApexUpdateObject, and ApexReadObject steps. Use self-closing <apiParam .../> tags. For example: <apiParam group=\"fields\" modelBinding=\"sf:ui:binding:object?object=Account&amp;field=Name\" name=\"Name\" title=\"Name\"/>",
@@ -1551,9 +1372,7 @@
1551
1372
  "category": "ApexAPI",
1552
1373
  "name": "ApexReadObject should use resultAssertions instead of separate AssertValues",
1553
1374
  "description": "When asserting field values after ApexReadObject, use <resultAssertions> within the ApexReadObject step rather than separate AssertValues API calls. This pattern is more efficient, provides better error messages, and maintains field metadata associations. The resultAssertions element should contain <resultAssertion> children with comparisonType, resultName, title, and optional <expected> elements.",
1554
- "appliesTo": [
1555
- "Step"
1556
- ],
1375
+ "appliesTo": ["Step"],
1557
1376
  "severity": "minor",
1558
1377
  "weight": 3,
1559
1378
  "recommendation": "Add <resultAssertions> block within ApexReadObject after the <arguments> section. Move AssertValues logic into <resultAssertion> elements with appropriate comparisonType (EqualTo, IsPresent, NotEqualTo, etc.) and expected values where applicable.",
@@ -1568,9 +1387,7 @@
1568
1387
  "category": "ApexAPI",
1569
1388
  "name": "ApexExtractLayout must have object, file type, and path",
1570
1389
  "description": "ApexExtractLayout requires three parameters: object (Salesforce object API name), fileType (.xlsx only supported), and filePath (where to save the layout). Missing any parameter causes test failure. Only .xlsx file format is supported for layout extraction.",
1571
- "appliesTo": [
1572
- "Step"
1573
- ],
1390
+ "appliesTo": ["Step"],
1574
1391
  "severity": "major",
1575
1392
  "weight": 5,
1576
1393
  "recommendation": "Specify the Salesforce object API name, set fileType to .xlsx, and provide a valid file path for the extracted layout. Ensure the directory path exists and is writable. Use relative paths for portability.",
@@ -1585,9 +1402,7 @@
1585
1402
  "category": "ApexAPI",
1586
1403
  "name": "ApexAssertLayout must have object and expected file",
1587
1404
  "description": "ApexAssertLayout requires two parameters: object (Salesforce object API name) and expectedFile (path to expected .xlsx layout file). Missing either parameter causes test failure. Only .xlsx file format is supported for layout assertions.",
1588
- "appliesTo": [
1589
- "Step"
1590
- ],
1405
+ "appliesTo": ["Step"],
1591
1406
  "severity": "major",
1592
1407
  "weight": 5,
1593
1408
  "recommendation": "Specify the Salesforce object API name and provide path to expected .xlsx layout file. Ensure the expected file exists and is in .xlsx format. Use ApexExtractLayout to generate baseline layouts.",
@@ -1602,9 +1417,7 @@
1602
1417
  "category": "ApexAPI",
1603
1418
  "name": "Connection arguments must use correct naming convention",
1604
1419
  "description": "Different step types require specific connection argument names: 'connectionName' for Connect steps (ApexConnect, UiConnect, DbConnect, WebConnect) and web requests (RestRequest, SoapRequest); 'apexConnectionName' for Apex CRUD/SOQL operations (ApexCreateObject, ApexReadObject, ApexUpdateObject, ApexDeleteObject, ApexSoqlQuery, ApexBulk, etc.); 'uiConnectionName' for UI steps (UiWithScreen, UiDoAction, UiAssert); 'dbConnectionName' for database operations (DbDelete, DbInsert, DbRead, DbUpdate, SqlQuery). Using incorrect connection argument names causes connection lookup failures.",
1605
- "appliesTo": [
1606
- "Step"
1607
- ],
1420
+ "appliesTo": ["Step"],
1608
1421
  "severity": "minor",
1609
1422
  "weight": 2,
1610
1423
  "recommendation": "Use the correct connection argument name for each step type. Connect steps and web requests use 'connectionName'. Apex CRUD/SOQL operations use 'apexConnectionName'. UI steps use 'uiConnectionName'. Database operations use 'dbConnectionName'. Review Provar API documentation for the specific step type being used.",
@@ -1619,9 +1432,7 @@
1619
1432
  "category": "ApexAPI",
1620
1433
  "name": "Apex CRUD operations should include parameterGeneratorUri",
1621
1434
  "description": "ApexCreateObject, ApexReadObject, and ApexUpdateObject steps should include the parameterGeneratorUri attribute for proper IDE support. This attribute enables field auto-complete, field suggestions, and proper object binding in Provar IDE. Missing this attribute degrades IDE experience and may cause issues in some Provar versions.",
1622
- "appliesTo": [
1623
- "Step"
1624
- ],
1435
+ "appliesTo": ["Step"],
1625
1436
  "severity": "minor",
1626
1437
  "weight": 2,
1627
1438
  "recommendation": "Add parameterGeneratorUri attribute to Apex CRUD steps: ApexCreateObject uses 'command:com.provar.plugins.forcedotcom.ui.commands.CreateCustomObjectTestStepCommand', ApexReadObject uses 'command:com.provar.plugins.forcedotcom.ui.commands.ReadCustomObjectTestStepCommand', ApexUpdateObject uses 'command:com.provar.plugins.forcedotcom.ui.commands.UpdateCustomObjectTestStepCommand'.",
@@ -1636,9 +1447,7 @@
1636
1447
  "category": "TestCaseDesign",
1637
1448
  "name": "AssertValues arguments must be in correct order",
1638
1449
  "description": "AssertValues steps should contain the variable being tested (from Read/Query operations) and actualValue containing the expected literal value. Reversed arguments cause assertion logic to be backwards - comparing literals against variables instead of variables against expected values. This can result in unclear test step outcomes, although results are the same.",
1639
- "appliesTo": [
1640
- "Step"
1641
- ],
1450
+ "appliesTo": ["Step"],
1642
1451
  "severity": "info",
1643
1452
  "weight": 1,
1644
1453
  "recommendation": "Correct the argument order: expectedValue should contain the variable reference (e.g., {OpportunityRead.Name}), actualValue should contain the expected literal value (e.g., 'Demo Opportunity'). The assertion logic is: 'Assert that expectedValue equals actualValue', which reads as 'Assert that {variable} equals literal'.",
@@ -1653,9 +1462,7 @@
1653
1462
  "category": "TestCaseDesign",
1654
1463
  "name": "Must use AssertValues API, not deprecated Assert API",
1655
1464
  "description": "Test cases must use the supported com.provar.plugins.bundled.apis.AssertValues API with expectedValue/actualValue/comparisonType arguments. The com.provar.plugins.bundled.core.testapis.Assert API is not supported and will not load properly in Provar. AssertValues provides more flexible comparison operators and clearer assertion semantics.",
1656
- "appliesTo": [
1657
- "Step"
1658
- ],
1465
+ "appliesTo": ["Step"],
1659
1466
  "severity": "critical",
1660
1467
  "weight": 8,
1661
1468
  "recommendation": "Replace com.provar.plugins.bundled.core.testapis.Assert steps with com.provar.plugins.bundled.apis.AssertValues. Use expectedValue (the variable being tested), comparisonType (EqualTo, NotEqualTo, etc.), actualValue (the expected result), and failureMessage (explanation of what failed).",
@@ -1670,9 +1477,7 @@
1670
1477
  "category": "TestCaseDesign",
1671
1478
  "name": "AssertValues should have meaningful expected values",
1672
1479
  "description": "AssertValues steps using comparison operators (EqualTo, Contains, GreaterThan, etc.) should specify meaningful expectedValue arguments. Empty or missing expected values defeat the purpose of assertions and provide no validation. Without expected values, assertions cannot verify correct behavior. Comparison types requiring values: EqualTo, NotEqualTo, Contains, NotContains, StartsWith, NotStartsWith, EndsWith, NotEndsWith, Matches, NotMatches, GreaterThan, LessThan, GreaterThanOrEqualTo, LessThanOrEqualTo.",
1673
- "appliesTo": [
1674
- "Step"
1675
- ],
1480
+ "appliesTo": ["Step"],
1676
1481
  "severity": "major",
1677
1482
  "weight": 5,
1678
1483
  "recommendation": "Specify a clear expectedValue for the assertion based on requirements. Use test data variables or literals that represent the expected state. Empty expected values provide no validation. For example: expectedValue='{Account.Name}', comparisonType='EqualTo', actualValue='ACME Corporation'.",
@@ -1681,16 +1486,14 @@
1681
1486
  "target": "step",
1682
1487
  "apiId": "com.provar.plugins.bundled.apis.AssertValues"
1683
1488
  },
1684
- "source": "Provar Test Step Schema: Meaningful Assertions (Phase 2 API Usage Analysis)"
1489
+ "source": "Provar Test Step Schema: Meaningful Assertions (API Usage Analysis)"
1685
1490
  },
1686
1491
  {
1687
1492
  "id": "CONTROL-SLEEP-001",
1688
1493
  "category": "TestCaseDesign",
1689
1494
  "name": "Sleep step duration and frequency issues",
1690
1495
  "description": "Sleep steps with duration > 10 seconds cause unnecessary test execution time (major). Sleep inside loops multiplies wait time and indicates polling anti-pattern (minor). More than 5 sleeps per 50 steps indicates excessive waiting rather than proper synchronization (minor).",
1691
- "appliesTo": [
1692
- "Step"
1693
- ],
1496
+ "appliesTo": ["Step"],
1694
1497
  "severity": "major",
1695
1498
  "weight": 5,
1696
1499
  "recommendation": "Replace long sleeps with explicit waits for conditions. Move sleeps outside loops and use proper wait-until-ready patterns. Replace multiple sleeps with single targeted waits. Use UI wait conditions, API polling with timeout, or event-driven synchronization.",
@@ -1705,9 +1508,7 @@
1705
1508
  "category": "TestCaseDesign",
1706
1509
  "name": "While loop must have termination condition",
1707
1510
  "description": "While loops without counterEnd and without a terminating condition (<=, <, >=, >, ==, !=) can run infinitely if no termination is defined (major). While loops with condition='true' or '{true}' are infinite loops that rely solely on break statements, making them difficult to debug (minor). A loop is valid if it has either counterEnd OR a comparison condition.",
1708
- "appliesTo": [
1709
- "Step"
1710
- ],
1511
+ "appliesTo": ["Step"],
1711
1512
  "severity": "major",
1712
1513
  "weight": 5,
1713
1514
  "recommendation": "Either set counterEnd to a reasonable limit (e.g., 10, 50, 100) OR use a terminating condition with a comparison operator (e.g., {Counter <= MaxIterations}). Avoid while{true} - use a meaningful condition instead. Add timeout handling and clear exit conditions. Consider using For loop with fixed iteration count if possible.",
@@ -1722,9 +1523,7 @@
1722
1523
  "category": "TestCaseDesign",
1723
1524
  "name": "Finally block must have description and be at end",
1724
1525
  "description": "Finally blocks without descriptions make it unclear what cleanup actions are performed (major). Finally blocks not at the end of the test may not execute if test stops before reaching them (minor). Finally is meant for cleanup that always runs regardless of test outcome.",
1725
- "appliesTo": [
1726
- "Step"
1727
- ],
1526
+ "appliesTo": ["Step"],
1728
1527
  "severity": "major",
1729
1528
  "weight": 5,
1730
1529
  "recommendation": "Add clear description to Finally block explaining what cleanup actions are performed (e.g., 'Delete test data', 'Logout'). Move Finally block to the end of the test to ensure cleanup runs. Use Finally for critical cleanup like deleting test records or closing connections.",
@@ -1739,9 +1538,7 @@
1739
1538
  "category": "TestCaseDesign",
1740
1539
  "name": "SOQL queries specify resultListName",
1741
1540
  "description": "SOQL queries must specify resultListName to capture query results.",
1742
- "appliesTo": [
1743
- "Step"
1744
- ],
1541
+ "appliesTo": ["Step"],
1745
1542
  "severity": "critical",
1746
1543
  "weight": 8,
1747
1544
  "recommendation": "Add 'resultListName' argument to store query results.",
@@ -1757,9 +1554,7 @@
1757
1554
  "category": "TestCaseDesign",
1758
1555
  "name": "Boolean values are 'true' or 'false'",
1759
1556
  "description": "Boolean value elements must contain exactly 'true' or 'false' (lowercase).",
1760
- "appliesTo": [
1761
- "Step"
1762
- ],
1557
+ "appliesTo": ["Step"],
1763
1558
  "severity": "critical",
1764
1559
  "weight": 8,
1765
1560
  "recommendation": "Set boolean value to 'true' or 'false' (not 'True', 'FALSE', '1', '0', etc.).",
@@ -1774,9 +1569,7 @@
1774
1569
  "category": "TestCaseDesign",
1775
1570
  "name": "Numeric values are valid numbers",
1776
1571
  "description": "DISABLED: Rule generates false positives. Flags numeric-looking strings in SetValues without checking Salesforce field types. Many text fields (ZIP codes, IDs with leading zeros, year fields) legitimately store numeric strings.",
1777
- "appliesTo": [
1778
- "Step"
1779
- ],
1572
+ "appliesTo": ["Step"],
1780
1573
  "severity": "info",
1781
1574
  "weight": 0,
1782
1575
  "recommendation": "Review if this value should be valueClass='decimal' for calculations, or valueClass='string' for text fields like IDs, ZIP codes, phone numbers. Consider field type in Salesforce.",
@@ -1791,9 +1584,7 @@
1791
1584
  "category": "TestCaseDesign",
1792
1585
  "name": "SetValues steps have namedValues container",
1793
1586
  "description": "SetValues steps must have <namedValues> container element.",
1794
- "appliesTo": [
1795
- "Step"
1796
- ],
1587
+ "appliesTo": ["Step"],
1797
1588
  "severity": "critical",
1798
1589
  "weight": 8,
1799
1590
  "recommendation": "Add <namedValues> container inside values argument.",
@@ -1809,9 +1600,7 @@
1809
1600
  "category": "NamingConventions",
1810
1601
  "name": "SetValues namedValue elements have name attribute",
1811
1602
  "description": "Each namedValue element must have a 'name' attribute defining the variable name.",
1812
- "appliesTo": [
1813
- "Step"
1814
- ],
1603
+ "appliesTo": ["Step"],
1815
1604
  "severity": "critical",
1816
1605
  "weight": 8,
1817
1606
  "recommendation": "Add 'name' attribute to each <namedValue> element.",
@@ -1827,9 +1616,7 @@
1827
1616
  "category": "TestCaseDesign",
1828
1617
  "name": "SetValues namedValue elements have value element",
1829
1618
  "description": "Each namedValue must contain a <value> element defining the variable value.",
1830
- "appliesTo": [
1831
- "Step"
1832
- ],
1619
+ "appliesTo": ["Step"],
1833
1620
  "severity": "critical",
1834
1621
  "weight": 8,
1835
1622
  "recommendation": "Add <value> element inside each <namedValue>.",
@@ -1845,9 +1632,7 @@
1845
1632
  "category": "StructureAndGrouping",
1846
1633
  "name": "SetValues must not contain invalid child elements",
1847
1634
  "description": "SetValues steps must use the correct structure with <namedValues> containing <namedValue> elements. AI models sometimes hallucinate invalid elements like <namedValueSet>, <name>, or nested <namedValues> incorrectly. The correct structure is: <namedValues mutable=\"Mutable\"><namedValue name=\"valuePath\">...</namedValue><namedValue name=\"value\">...</namedValue><namedValue name=\"valueScope\">...</namedValue></namedValues>",
1848
- "appliesTo": [
1849
- "Step"
1850
- ],
1635
+ "appliesTo": ["Step"],
1851
1636
  "severity": "critical",
1852
1637
  "weight": 10,
1853
1638
  "recommendation": "Use correct SetValues structure: <value class=\"valueList\" mutable=\"Mutable\"><namedValues mutable=\"Mutable\"><namedValue name=\"valuePath\"><value class=\"value\" valueClass=\"string\">VariableName</value></namedValue><namedValue name=\"value\"><value>...</value></namedValue><namedValue name=\"valueScope\"><value class=\"value\" valueClass=\"string\">Test</value></namedValue></namedValues></value>. Each variable requires one <namedValues> block with three <namedValue> children: valuePath, value, and valueScope.",
@@ -1865,9 +1650,7 @@
1865
1650
  "category": "TestCaseDesign",
1866
1651
  "name": "Variable property references must be valid",
1867
1652
  "description": "Variable property references (<path element>) must reference valid properties. For SOQL query results, only fields in the SELECT clause are valid. Common hallucinations include: .size, .length, .count (use Count() function), duplicate path elements, and referencing fields not in the query.",
1868
- "appliesTo": [
1869
- "Step"
1870
- ],
1653
+ "appliesTo": ["Step"],
1871
1654
  "severity": "major",
1872
1655
  "weight": 6,
1873
1656
  "recommendation": "For list size, use Count(variable) function. For properties, ensure the field is included in the SOQL SELECT clause or ApexReadObject generatedParameters. Remove duplicate path elements.",
@@ -1884,9 +1667,7 @@
1884
1667
  "category": "TestCaseDesign",
1885
1668
  "name": "Manual cleanup matches object creation",
1886
1669
  "description": "When autoCleanup=false, test should have ApexDeleteObject steps matching ApexCreateObject steps.",
1887
- "appliesTo": [
1888
- "TestCase"
1889
- ],
1670
+ "appliesTo": ["TestCase"],
1890
1671
  "severity": "major",
1891
1672
  "weight": 5,
1892
1673
  "recommendation": "Add ApexDeleteObject steps for created objects or set autoCleanup=true.",
@@ -1901,9 +1682,7 @@
1901
1682
  "category": "TestCaseDesign",
1902
1683
  "name": "Cleanup deletes objects in reverse order",
1903
1684
  "description": "When manually deleting objects, delete child objects before parent objects.",
1904
- "appliesTo": [
1905
- "TestCase"
1906
- ],
1685
+ "appliesTo": ["TestCase"],
1907
1686
  "severity": "minor",
1908
1687
  "weight": 2,
1909
1688
  "recommendation": "Reorder ApexDeleteObject steps: delete child records before parent records.",
@@ -1918,9 +1697,7 @@
1918
1697
  "category": "TestCaseDesign",
1919
1698
  "name": "ApexCreateObject steps specify resultIdName",
1920
1699
  "description": "ApexCreateObject should specify resultIdName to capture created record ID for later reference or cleanup.",
1921
- "appliesTo": [
1922
- "Step"
1923
- ],
1700
+ "appliesTo": ["Step"],
1924
1701
  "severity": "major",
1925
1702
  "weight": 5,
1926
1703
  "recommendation": "Add 'resultIdName' argument to store created record ID (e.g. 'CreatedAccountId', 'OpportunityId').",
@@ -1936,9 +1713,7 @@
1936
1713
  "category": "ReusabilityAndCallables",
1937
1714
  "name": "Called test cases are marked as Callable",
1938
1715
  "description": "Test cases invoked via TestCaseCall must have visibility='Callable' attribute.",
1939
- "appliesTo": [
1940
- "Step"
1941
- ],
1716
+ "appliesTo": ["Step"],
1942
1717
  "severity": "critical",
1943
1718
  "weight": 8,
1944
1719
  "recommendation": "Set visibility='Callable' on called test case or reference a callable test.",
@@ -1954,9 +1729,7 @@
1954
1729
  "category": "TestCaseDesign",
1955
1730
  "name": "Log messages use appropriate log levels",
1956
1731
  "description": "Log steps should use appropriate log levels: INFO for general info, WARN for warnings, ERROR for errors.",
1957
- "appliesTo": [
1958
- "Step"
1959
- ],
1732
+ "appliesTo": ["Step"],
1960
1733
  "severity": "info",
1961
1734
  "weight": 1,
1962
1735
  "recommendation": "Set logLevel argument to appropriate value: INFO, WARN, ERROR, or DEBUG.",
@@ -1972,9 +1745,7 @@
1972
1745
  "category": "TestCaseDesign",
1973
1746
  "name": "UiAssert steps specify assertion type",
1974
1747
  "description": "UiAssert steps should specify assertionType (Visible, Value, Enabled, etc.) for clarity.",
1975
- "appliesTo": [
1976
- "Step"
1977
- ],
1748
+ "appliesTo": ["Step"],
1978
1749
  "severity": "minor",
1979
1750
  "weight": 2,
1980
1751
  "recommendation": "Add 'assertionType' argument specifying the type of assertion.",
@@ -1990,9 +1761,7 @@
1990
1761
  "category": "TestCaseDesign",
1991
1762
  "name": "UiDoAction Set requires value argument",
1992
1763
  "description": "UiDoAction steps with interactionType='Set' must have a value argument.",
1993
- "appliesTo": [
1994
- "Step"
1995
- ],
1764
+ "appliesTo": ["Step"],
1996
1765
  "severity": "critical",
1997
1766
  "weight": 8,
1998
1767
  "recommendation": "Add 'value' argument when using Set interaction type.",
@@ -2008,9 +1777,7 @@
2008
1777
  "category": "TestCaseDesign",
2009
1778
  "name": "Ui locator built-in actions use object binding",
2010
1779
  "description": "For Salesforce built-in actions (New, Edit, Save, Convert, etc.), uiLocator URIs must use an object binding (sf:ui:binding:object?object=...&action=...). Using the action binding form (sf:ui:binding:action?actionName=...) is known to cause runtime execution failures in generated tests.",
2011
- "appliesTo": [
2012
- "Step"
2013
- ],
1780
+ "appliesTo": ["Step"],
2014
1781
  "severity": "major",
2015
1782
  "weight": 5,
2016
1783
  "recommendation": "Use an object-binding locator like: ui:locator?name=<ActionName>&binding=sf%3Aui%3Abinding%3Aobject%3Fobject%3D<ObjectApiName>%26action%3D<ActionName> (replace object/action accordingly).",
@@ -2026,9 +1793,7 @@
2026
1793
  "category": "TestCaseDesign",
2027
1794
  "name": "UiAssert fieldLocator uses object+field binding",
2028
1795
  "description": "UiAssert embedded field assertions (uiFieldAssertion) must use a fieldLocator with an object binding (sf:ui:binding:object?field=<Field>&object=<Object>) and a locator name matching the field (name=<Field>). Incorrect fieldLocator bindings can cause runtime failures or assertions targeting the wrong element.",
2029
- "appliesTo": [
2030
- "Step"
2031
- ],
1796
+ "appliesTo": ["Step"],
2032
1797
  "severity": "major",
2033
1798
  "weight": 5,
2034
1799
  "recommendation": "Use one of: (1) sf:ui:locator?name=<FieldApiName>&binding=sf%3Aui%3Abinding%3Aobject%3Ffield%3D<FieldApiName>%26object%3D<ObjectApiName> (ensure name and field match), (2) ui:pageobject:field?field=<elementName>&pageId=pageobjects.<PageObjectClass>, or (3) ui:locator?name=<fieldName> for Page Object locator references.",
@@ -2044,9 +1809,7 @@
2044
1809
  "category": "TestCaseDesign",
2045
1810
  "name": "UiAssert fieldAssertion must not wrap fieldLocator in uiLocator",
2046
1811
  "description": "UiAssert embedded field assertions (uiFieldAssertion) must use fieldLocator with a uri attribute directly. DO NOT wrap the locator in a nested <uiLocator/> element. The correct format is <fieldLocator uri=\"...\"/> not <fieldLocator><uiLocator uri=\"...\"/></fieldLocator>. This incorrect nesting causes runtime failures.",
2047
- "appliesTo": [
2048
- "Step"
2049
- ],
1812
+ "appliesTo": ["Step"],
2050
1813
  "severity": "major",
2051
1814
  "weight": 5,
2052
1815
  "recommendation": "Use <fieldLocator uri=\"ui:locator?name=FieldApiName&amp;binding=sf%3Aui%3Abinding%3Aobject%3Ffield%3DFieldApiName%26object%3DObjectApiName\"/> directly without wrapping in <uiLocator/>.",
@@ -2062,9 +1825,7 @@
2062
1825
  "category": "TestCaseDesign",
2063
1826
  "name": "UiAssert bare locator in Salesforce metadata context causes render failure",
2064
1827
  "description": "UiAssert uiFieldAssertion using a bare locator reference (ui:locator?name=X without a binding parameter) inside a UiWithScreen whose target is a Salesforce metadata context (sf:ui:target?object=...) will fail to render in Provar Automation. Bare locators are only valid inside Page Object contexts. In Salesforce metadata contexts, the fieldLocator must include a full binding (ui:locator?name=X&binding=sf%3Aui%3Abinding%3Aobject%3Fobject%3D...%26field%3D...). This commonly occurs when asserting button visibility (e.g., Run, Edit, Delete buttons) as uiFieldAssertions — buttons are not Salesforce fields and cannot be asserted this way.",
2065
- "appliesTo": [
2066
- "Step"
2067
- ],
1828
+ "appliesTo": ["Step"],
2068
1829
  "severity": "critical",
2069
1830
  "weight": 10,
2070
1831
  "recommendation": "Remove the bare-locator uiFieldAssertion for non-field elements (buttons, actions). If you need to verify a button exists, use a UiDoAction click interaction instead of a UiAssert fieldAssertion. For Salesforce field assertions, always include the full binding: <fieldLocator uri=\"ui:locator?name=FieldApiName&amp;binding=sf%3Aui%3Abinding%3Aobject%3Fobject%3DObjectApiName%26field%3DFieldApiName\"/>. NEVER use bare ui:locator?name=X without a binding inside a Salesforce metadata UiWithScreen.",
@@ -2080,9 +1841,7 @@
2080
1841
  "category": "TestCaseDesign",
2081
1842
  "name": "UiDoAction locator URIs must use valid patterns",
2082
1843
  "description": "Validates all UiDoAction locator URI patterns including: (1) SF locators: ui:locator?name=...&binding=sf:ui:binding:object?... with required name and binding params, (2) Page Object Fields: ui:pageobject:field?field=...&pageId=pageobjects... with required field and pageId params, (3) Page Object Methods: ui:pageobject:method?pageId=...&operation=... with required pageId and operation params, (4) Lead Conversion context-aware patterns (Convert on View vs submitConvert in Dialog). Detects malformed URIs like '%3Action' which should be '%3Faction'.",
2083
- "appliesTo": [
2084
- "Step"
2085
- ],
1844
+ "appliesTo": ["Step"],
2086
1845
  "severity": "major",
2087
1846
  "weight": 5,
2088
1847
  "recommendation": "SF locators: ui:locator?name=<Name>&binding=sf%3Aui%3Abinding%3Aobject%3F<params>. Page Object Fields: ui:pageobject:field?field=<elementName>&pageId=pageobjects.<Class>. Page Object Methods: ui:pageobject:method?pageId=pageobjects.<Class>&operation=<methodName>. Ensure '%3F' (?) precedes query params in bindings, not '%3A' (colon).",
@@ -2099,9 +1858,7 @@
2099
1858
  "category": "TestCaseDesign",
2100
1859
  "name": "UiWithScreen target URIs must use valid patterns",
2101
1860
  "description": "Validates all UiWithScreen target URI patterns including: (1) SF targets with valid parameters (object/action, lightningComponent, lightningWebComponent, auraComponent, application/tab, lookup, fieldService, action-only), (2) Page Object targets: ui:pageobject:target?pageId=pageobjects... with required pageId param starting with 'pageobjects.' prefix.",
2102
- "appliesTo": [
2103
- "Step"
2104
- ],
1861
+ "appliesTo": ["Step"],
2105
1862
  "severity": "major",
2106
1863
  "weight": 5,
2107
1864
  "recommendation": "SF Object-Action targets: sf:ui:target?object=<Object>&action=<Action>. SF Lightning targets: sf:ui:target?lightningComponent=<Component>. Page Object targets: ui:pageobject:target?pageId=pageobjects.<PageObjectClass>.",
@@ -2118,9 +1875,7 @@
2118
1875
  "category": "TestCaseDesign",
2119
1876
  "name": "ApexConnect reuseConnectionName should be left blank",
2120
1877
  "description": "The reuseConnectionName argument in ApexConnect steps should be left empty/blank. AI models may hallucinate invalid values like 'Reuse' which cause runtime errors.",
2121
- "appliesTo": [
2122
- "Step"
2123
- ],
1878
+ "appliesTo": ["Step"],
2124
1879
  "severity": "major",
2125
1880
  "weight": 5,
2126
1881
  "recommendation": "Leave reuseConnectionName blank: <argument id=\"reuseConnectionName\"/> or <argument id=\"reuseConnectionName\"><value class=\"value\"/></argument>. Do not use string values.",
@@ -2137,9 +1892,7 @@
2137
1892
  "category": "XMLSchema",
2138
1893
  "name": "ApexConnect - Only valid argument IDs allowed",
2139
1894
  "description": "ApexConnect steps must use ONLY the 21 valid argument IDs defined in Provar schema. AI models commonly hallucinate plausible-sounding but invalid arguments like autoPopulateRequiredFields, assertObjectFieldsPopulated, commandTimeout which cause Provar to reject the test case.",
2140
- "appliesTo": [
2141
- "Step"
2142
- ],
1895
+ "appliesTo": ["Step"],
2143
1896
  "severity": "critical",
2144
1897
  "weight": 10,
2145
1898
  "recommendation": "Only use these 21 valid ApexConnect argument IDs: connectionName, resultName, resultScope, uiApplicationName, quickUiLogin, closeAllPrimaryTabs, reuseConnectionName, alreadyOpenBehaviour, autoCleanup, cleanupConnectionName, logFileLocation, connectionId, enableObjectIdLogging, privateBrowsingMode, lightningMode, username, password, securityToken, environment, webBrowser. If you don't have a value, leave the argument empty: <argument id=\"username\"/> rather than inventing values.",
@@ -2178,9 +1931,7 @@
2178
1931
  "category": "XMLSchema",
2179
1932
  "name": "ApexConnect connectionId must use valueClass='id'",
2180
1933
  "description": "The connectionId argument in ApexConnect steps MUST use valueClass='id' with a GUID format value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx), NOT valueClass='string'. Using valueClass='string' breaks connection references in Provar.",
2181
- "appliesTo": [
2182
- "Step"
2183
- ],
1934
+ "appliesTo": ["Step"],
2184
1935
  "severity": "critical",
2185
1936
  "weight": 10,
2186
1937
  "recommendation": "Use correct format: <argument id=\"connectionId\"><value class=\"value\" valueClass=\"id\">bce7fd3f-0f81-4c5c-ab68-c3edd44b5d1e</value></argument>. NEVER use valueClass=\"string\" or value=\"default\". If you don't have a specific GUID, leave the argument empty: <argument id=\"connectionId\"/>",
@@ -2197,9 +1948,7 @@
2197
1948
  "category": "TestCaseDesign",
2198
1949
  "name": "Wait arguments must use uiWait value class",
2199
1950
  "description": "The beforeWait, afterWait, and autoRetry arguments in UiDoAction and UiAssert steps must use class=\"uiWait\" with a uri attribute. Using valueClass=\"boolean\" is incorrect and causes runtime errors.",
2200
- "appliesTo": [
2201
- "Step"
2202
- ],
1951
+ "appliesTo": ["Step"],
2203
1952
  "severity": "major",
2204
1953
  "weight": 5,
2205
1954
  "recommendation": "Use uiWait class with uri: <value class=\"uiWait\" uri=\"default\"/> or <value class=\"uiWait\" uri=\"ui:wait:timed?seconds=5\"/>. Valid uri patterns: default, NoWait, ui:wait:timed?seconds=N, ui:wait:autoRetry:timeout=N, ui:wait:auraBusy?timeout=N, ui:wait:pageload?timeout=N.",
@@ -2216,9 +1965,7 @@
2216
1965
  "category": "TestCaseDesign",
2217
1966
  "name": "Save button locator must use correct pattern",
2218
1967
  "description": "Save button locators in UiDoAction steps must use lowercase 'save' and correct URI parameter order. Common error: using 'Save' (capital S) with action before object, or using %3A instead of %3F after object?",
2219
- "appliesTo": [
2220
- "Step"
2221
- ],
1968
+ "appliesTo": ["Step"],
2222
1969
  "severity": "major",
2223
1970
  "weight": 5,
2224
1971
  "recommendation": "Use correct pattern: name=save (lowercase), binding=sf%3Aui%3Abinding%3Aobject%3Fobject%3D<Object>%26action%3Dsave. Common mistakes: (1) Capital S in 'Save', (2) action before object in binding, (3) using %3Action instead of %3Faction, (4) using %3A instead of %3F after 'object?'",
@@ -2235,9 +1982,7 @@
2235
1982
  "category": "TestCaseDesign",
2236
1983
  "name": "UiWithScreen target uses invalid action value",
2237
1984
  "description": "The action parameter in sf:ui:target URIs must use valid Provar action names. AI models commonly hallucinate 'action=Home' when the correct value is 'action=ObjectHome'.",
2238
- "appliesTo": [
2239
- "Step"
2240
- ],
1985
+ "appliesTo": ["Step"],
2241
1986
  "severity": "major",
2242
1987
  "weight": 5,
2243
1988
  "recommendation": "Use valid action values: ObjectHome (for object list/home), New, View, Edit, List, Convert, GlobalSearch, QuickAction, etc. Common fixes: Home→ObjectHome, Create→New, Update→Edit, Details→View.",
@@ -2254,9 +1999,7 @@
2254
1999
  "category": "TestCaseDesign",
2255
2000
  "name": "Sleep duration should be under 5 seconds",
2256
2001
  "description": "Fixed sleep durations should be kept short (<5 seconds). Prefer WaitFor with condition over fixed Sleep.",
2257
- "appliesTo": [
2258
- "Step"
2259
- ],
2002
+ "appliesTo": ["Step"],
2260
2003
  "severity": "info",
2261
2004
  "weight": 1,
2262
2005
  "recommendation": "Use WaitFor with condition instead of Sleep, or reduce sleep duration to <5 seconds.",
@@ -2273,9 +2016,7 @@
2273
2016
  "category": "StructureAndGrouping",
2274
2017
  "name": "Finally block should be at end of test",
2275
2018
  "description": "Finally blocks should be placed at the end of the test to ensure cleanup always executes.",
2276
- "appliesTo": [
2277
- "Step"
2278
- ],
2019
+ "appliesTo": ["Step"],
2279
2020
  "severity": "major",
2280
2021
  "weight": 5,
2281
2022
  "recommendation": "Move Finally block to end of test case.",
@@ -2291,9 +2032,7 @@
2291
2032
  "category": "StructureAndGrouping",
2292
2033
  "name": "BDD scenario should start with Given",
2293
2034
  "description": "BDD test cases should start with Given step to establish preconditions.",
2294
- "appliesTo": [
2295
- "TestCase"
2296
- ],
2035
+ "appliesTo": ["TestCase"],
2297
2036
  "severity": "info",
2298
2037
  "weight": 1,
2299
2038
  "recommendation": "Start BDD scenario with Given step.",
@@ -2308,9 +2047,7 @@
2308
2047
  "category": "StructureAndGrouping",
2309
2048
  "name": "BDD steps should follow logical order",
2310
2049
  "description": "BDD steps should follow Given->When->Then order (with And/But as connectors).",
2311
- "appliesTo": [
2312
- "TestCase"
2313
- ],
2050
+ "appliesTo": ["TestCase"],
2314
2051
  "severity": "info",
2315
2052
  "weight": 1,
2316
2053
  "recommendation": "Reorder BDD steps to follow Given->When->Then pattern.",
@@ -2325,9 +2062,7 @@
2325
2062
  "category": "StructureAndGrouping",
2326
2063
  "name": "Limit And/But chain length",
2327
2064
  "description": "Chains of And/But steps should be limited to 3-5 for readability.",
2328
- "appliesTo": [
2329
- "TestCase"
2330
- ],
2065
+ "appliesTo": ["TestCase"],
2331
2066
  "severity": "info",
2332
2067
  "weight": 1,
2333
2068
  "recommendation": "Break long And/But chains into separate scenarios.",
@@ -2343,9 +2078,7 @@
2343
2078
  "category": "TestCaseDesign",
2344
2079
  "name": "ApexExecute code should be valid Apex syntax",
2345
2080
  "description": "Anonymous Apex code blocks should be syntactically valid.",
2346
- "appliesTo": [
2347
- "Step"
2348
- ],
2081
+ "appliesTo": ["Step"],
2349
2082
  "severity": "critical",
2350
2083
  "weight": 8,
2351
2084
  "recommendation": "Validate Apex syntax before execution. Test in Developer Console first.",
@@ -2361,9 +2094,7 @@
2361
2094
  "category": "TestCaseDesign",
2362
2095
  "name": "ApexBulk should be used for large data volumes",
2363
2096
  "description": "Use ApexBulk for operations with more than 200 records.",
2364
- "appliesTo": [
2365
- "Step"
2366
- ],
2097
+ "appliesTo": ["Step"],
2367
2098
  "severity": "info",
2368
2099
  "weight": 1,
2369
2100
  "recommendation": "Use ApexBulk instead of individual CRUD operations for >200 records.",
@@ -2378,9 +2109,7 @@
2378
2109
  "category": "TestCaseDesign",
2379
2110
  "name": "Prefer UiWithScreen over UiNavigate for Salesforce",
2380
2111
  "description": "For Salesforce navigation, prefer UiWithScreen over direct URL navigation with UiNavigate.",
2381
- "appliesTo": [
2382
- "Step"
2383
- ],
2112
+ "appliesTo": ["Step"],
2384
2113
  "severity": "info",
2385
2114
  "weight": 1,
2386
2115
  "recommendation": "Use UiWithScreen for Salesforce screens instead of UiNavigate.",
@@ -2396,9 +2125,7 @@
2396
2125
  "category": "TestCaseDesign",
2397
2126
  "name": "Verify fields after UiFill",
2398
2127
  "description": "UiFill should be followed by UiAssert to verify all fields were filled correctly.",
2399
- "appliesTo": [
2400
- "Step"
2401
- ],
2128
+ "appliesTo": ["Step"],
2402
2129
  "severity": "info",
2403
2130
  "weight": 1,
2404
2131
  "recommendation": "Add UiAssert steps after UiFill to verify field values.",
@@ -2414,9 +2141,7 @@
2414
2141
  "category": "TestCaseDesign",
2415
2142
  "name": "UiHandleAlert should capture alert text",
2416
2143
  "description": "When handling alerts with GetText action, store the text in a result variable.",
2417
- "appliesTo": [
2418
- "Step"
2419
- ],
2144
+ "appliesTo": ["Step"],
2420
2145
  "severity": "info",
2421
2146
  "weight": 1,
2422
2147
  "recommendation": "Set resultName when using GetText action on UiHandleAlert.",
@@ -2432,9 +2157,7 @@
2432
2157
  "category": "TestCaseDesign",
2433
2158
  "name": "Replace searchString should not be empty",
2434
2159
  "description": "Replace step searchString parameter should not be empty string.",
2435
- "appliesTo": [
2436
- "Step"
2437
- ],
2160
+ "appliesTo": ["Step"],
2438
2161
  "severity": "major",
2439
2162
  "weight": 5,
2440
2163
  "recommendation": "Provide non-empty searchString for Replace operation.",
@@ -2450,9 +2173,7 @@
2450
2173
  "category": "TestCaseDesign",
2451
2174
  "name": "Split delimiter should not be empty",
2452
2175
  "description": "Split step delimiter parameter should not be empty string.",
2453
- "appliesTo": [
2454
- "Step"
2455
- ],
2176
+ "appliesTo": ["Step"],
2456
2177
  "severity": "major",
2457
2178
  "weight": 5,
2458
2179
  "recommendation": "Provide non-empty delimiter for Split operation.",
@@ -2468,9 +2189,7 @@
2468
2189
  "category": "TestCaseDesign",
2469
2190
  "name": "Match regex pattern should be valid",
2470
2191
  "description": "When using isRegex=true, pattern must be valid regular expression.",
2471
- "appliesTo": [
2472
- "Step"
2473
- ],
2192
+ "appliesTo": ["Step"],
2474
2193
  "severity": "critical",
2475
2194
  "weight": 8,
2476
2195
  "recommendation": "Validate regex pattern syntax before using in Match step.",
@@ -2486,19 +2205,14 @@
2486
2205
  "category": "TestCaseDesign",
2487
2206
  "name": "DbDelete and DbUpdate should have WHERE clause",
2488
2207
  "description": "Database delete and update operations should include WHERE clause to avoid affecting all records.",
2489
- "appliesTo": [
2490
- "Step"
2491
- ],
2208
+ "appliesTo": ["Step"],
2492
2209
  "severity": "critical",
2493
2210
  "weight": 8,
2494
2211
  "recommendation": "Add WHERE clause to DbDelete/DbUpdate to limit affected records.",
2495
2212
  "check": {
2496
2213
  "type": "dbWhereClause",
2497
2214
  "target": "step",
2498
- "apiIds": [
2499
- "com.provar.plugins.bundled.apis.db.DbDelete",
2500
- "com.provar.plugins.bundled.apis.db.DbUpdate"
2501
- ]
2215
+ "apiIds": ["com.provar.plugins.bundled.apis.db.DbDelete", "com.provar.plugins.bundled.apis.db.DbUpdate"]
2502
2216
  },
2503
2217
  "source": "Database Testing Best Practices"
2504
2218
  },
@@ -2507,9 +2221,7 @@
2507
2221
  "category": "TestCaseDesign",
2508
2222
  "name": "RestRequest method should be valid HTTP method",
2509
2223
  "description": "RestRequest method must be one of: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS.",
2510
- "appliesTo": [
2511
- "Step"
2512
- ],
2224
+ "appliesTo": ["Step"],
2513
2225
  "severity": "critical",
2514
2226
  "weight": 8,
2515
2227
  "recommendation": "Use valid HTTP method (GET, POST, PUT, DELETE, PATCH).",
@@ -2517,15 +2229,7 @@
2517
2229
  "type": "restHttpMethod",
2518
2230
  "target": "step",
2519
2231
  "apiId": "com.provar.plugins.bundled.apis.restservice.RestRequest",
2520
- "validMethods": [
2521
- "GET",
2522
- "POST",
2523
- "PUT",
2524
- "DELETE",
2525
- "PATCH",
2526
- "HEAD",
2527
- "OPTIONS"
2528
- ]
2232
+ "validMethods": ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"]
2529
2233
  },
2530
2234
  "source": "REST API Testing Best Practices"
2531
2235
  },
@@ -2534,9 +2238,7 @@
2534
2238
  "category": "TestCaseDesign",
2535
2239
  "name": "POST/PUT/PATCH should have request body",
2536
2240
  "description": "RestRequest with POST, PUT, or PATCH method should include request body.",
2537
- "appliesTo": [
2538
- "Step"
2539
- ],
2241
+ "appliesTo": ["Step"],
2540
2242
  "severity": "major",
2541
2243
  "weight": 5,
2542
2244
  "recommendation": "Add request body for POST/PUT/PATCH operations.",
@@ -2552,9 +2254,7 @@
2552
2254
  "category": "TestCaseDesign",
2553
2255
  "name": "Validate REST response status",
2554
2256
  "description": "RestRequest should be followed by assertion to validate response status code.",
2555
- "appliesTo": [
2556
- "Step"
2557
- ],
2257
+ "appliesTo": ["Step"],
2558
2258
  "severity": "info",
2559
2259
  "weight": 1,
2560
2260
  "recommendation": "Add Assert step to validate REST response status code.",
@@ -2570,9 +2270,7 @@
2570
2270
  "category": "TestCaseDesign",
2571
2271
  "name": "SOAP request body should be well-formed XML",
2572
2272
  "description": "WebServiceRequest requestBody must be valid XML for SOAP operations.",
2573
- "appliesTo": [
2574
- "Step"
2575
- ],
2273
+ "appliesTo": ["Step"],
2576
2274
  "severity": "critical",
2577
2275
  "weight": 8,
2578
2276
  "recommendation": "Validate SOAP XML syntax before execution.",
@@ -2588,9 +2286,7 @@
2588
2286
  "category": "TestCaseDesign",
2589
2287
  "name": "AIAgentSession requires WebConnect first",
2590
2288
  "description": "AIAgentSession step must be preceded by WebConnect step.",
2591
- "appliesTo": [
2592
- "Step"
2593
- ],
2289
+ "appliesTo": ["Step"],
2594
2290
  "severity": "critical",
2595
2291
  "weight": 8,
2596
2292
  "recommendation": "Add WebConnect step before AIAgentSession.",
@@ -2606,9 +2302,7 @@
2606
2302
  "category": "TestCaseDesign",
2607
2303
  "name": "AIAgentConversation requires valid session",
2608
2304
  "description": "AIAgentConversation must reference sessionID from AIAgentSession.",
2609
- "appliesTo": [
2610
- "Step"
2611
- ],
2305
+ "appliesTo": ["Step"],
2612
2306
  "severity": "critical",
2613
2307
  "weight": 8,
2614
2308
  "recommendation": "Ensure AIAgentSession is called first and sessionID is stored.",
@@ -2624,9 +2318,7 @@
2624
2318
  "category": "TestCaseDesign",
2625
2319
  "name": "GenerateUtterance count should be reasonable",
2626
2320
  "description": "GenerateUtterance count parameter should be between 1-100 for performance.",
2627
- "appliesTo": [
2628
- "Step"
2629
- ],
2321
+ "appliesTo": ["Step"],
2630
2322
  "severity": "info",
2631
2323
  "weight": 1,
2632
2324
  "recommendation": "Set GenerateUtterance count between 1-100.",
@@ -2644,9 +2336,7 @@
2644
2336
  "category": "TestCaseDesign",
2645
2337
  "name": "ImageValidator confidence should be 0.0-1.0",
2646
2338
  "description": "ImageValidator confidenceThreshold must be between 0.0 and 1.0.",
2647
- "appliesTo": [
2648
- "Step"
2649
- ],
2339
+ "appliesTo": ["Step"],
2650
2340
  "severity": "major",
2651
2341
  "weight": 5,
2652
2342
  "recommendation": "Set confidenceThreshold between 0.0 and 1.0.",
@@ -2664,9 +2354,7 @@
2664
2354
  "category": "TestCaseDesign",
2665
2355
  "name": "ExtractSalesforceLayout before AssertSalesforceLayout",
2666
2356
  "description": "AssertSalesforceLayout should be preceded by ExtractSalesforceLayout to create baseline. Otherwise ensure you have a compatible data source to compare to.",
2667
- "appliesTo": [
2668
- "Step"
2669
- ],
2357
+ "appliesTo": ["Step"],
2670
2358
  "severity": "minor",
2671
2359
  "weight": 2,
2672
2360
  "recommendation": "Run ExtractSalesforceLayout first to create baseline layout file.",
@@ -2682,9 +2370,7 @@
2682
2370
  "category": "TestCaseDesign",
2683
2371
  "name": "ConvertLead status must be valid",
2684
2372
  "description": "ConvertLead convertedStatus must be a valid lead conversion status.",
2685
- "appliesTo": [
2686
- "Step"
2687
- ],
2373
+ "appliesTo": ["Step"],
2688
2374
  "severity": "critical",
2689
2375
  "weight": 8,
2690
2376
  "recommendation": "Use valid lead conversion status (Converted, Qualified, etc.).",
@@ -2700,9 +2386,7 @@
2700
2386
  "category": "TestCaseDesign",
2701
2387
  "name": "Read dataUrl should be valid file path",
2702
2388
  "description": "Read step dataUrl must point to existing Excel/CSV file.",
2703
- "appliesTo": [
2704
- "Step"
2705
- ],
2389
+ "appliesTo": ["Step"],
2706
2390
  "severity": "critical",
2707
2391
  "weight": 8,
2708
2392
  "recommendation": "Verify file exists before Read operation.",
@@ -2718,9 +2402,7 @@
2718
2402
  "category": "TestCaseDesign",
2719
2403
  "name": "Write dataUrl should be writable",
2720
2404
  "description": "Write step dataUrl directory must be writable.",
2721
- "appliesTo": [
2722
- "Step"
2723
- ],
2405
+ "appliesTo": ["Step"],
2724
2406
  "severity": "critical",
2725
2407
  "weight": 8,
2726
2408
  "recommendation": "Ensure output directory exists and is writable.",
@@ -2736,9 +2418,7 @@
2736
2418
  "category": "TestCaseDesign",
2737
2419
  "name": "Subscribe before ReceiveMessage",
2738
2420
  "description": "ReceiveMessage should be preceded by Subscribe to topic/channel.",
2739
- "appliesTo": [
2740
- "Step"
2741
- ],
2421
+ "appliesTo": ["Step"],
2742
2422
  "severity": "critical",
2743
2423
  "weight": 8,
2744
2424
  "recommendation": "Add Subscribe step before ReceiveMessage.",
@@ -2754,9 +2434,7 @@
2754
2434
  "category": "TestCaseDesign",
2755
2435
  "name": "ReceiveMessage timeout should be reasonable",
2756
2436
  "description": "ReceiveMessage timeout should be between 5-60 seconds.",
2757
- "appliesTo": [
2758
- "Step"
2759
- ],
2437
+ "appliesTo": ["Step"],
2760
2438
  "severity": "info",
2761
2439
  "weight": 1,
2762
2440
  "recommendation": "Set timeout between 5-60 seconds.",
@@ -2774,10 +2452,7 @@
2774
2452
  "category": "StructureAndGrouping",
2775
2453
  "name": "All arguments must have value elements",
2776
2454
  "description": "Every <argument> element must contain a <value> child element, even if empty. Missing <value> elements prevent test cases from loading in Provar.",
2777
- "appliesTo": [
2778
- "TestCase",
2779
- "Step"
2780
- ],
2455
+ "appliesTo": ["TestCase", "Step"],
2781
2456
  "severity": "critical",
2782
2457
  "weight": 10,
2783
2458
  "recommendation": "Add <value class=\"value\" valueClass=\"string\"></value> (or appropriate type) to all <argument> elements.",
@@ -2793,10 +2468,7 @@
2793
2468
  "category": "StructureAndGrouping",
2794
2469
  "name": "valueClass attributes must use lowercase",
2795
2470
  "description": "All valueClass attributes must use lowercase values (e.g., 'boolean' not 'Boolean', 'string' not 'String'). Incorrect casing prevents test cases from loading in Provar.",
2796
- "appliesTo": [
2797
- "TestCase",
2798
- "Step"
2799
- ],
2471
+ "appliesTo": ["TestCase", "Step"],
2800
2472
  "severity": "critical",
2801
2473
  "weight": 10,
2802
2474
  "recommendation": "Change all valueClass attributes to lowercase: boolean, string, decimal, integer, date, datetime, variable, compound, funcCall, value, valueList.",
@@ -2811,10 +2483,7 @@
2811
2483
  "category": "StructureAndGrouping",
2812
2484
  "name": "Boolean values must use lowercase",
2813
2485
  "description": "Boolean values in <value> elements must be lowercase 'true' or 'false', not 'True', 'False', 'TRUE', or 'FALSE'. Incorrect casing prevents test cases from loading in Provar.",
2814
- "appliesTo": [
2815
- "TestCase",
2816
- "Step"
2817
- ],
2486
+ "appliesTo": ["TestCase", "Step"],
2818
2487
  "severity": "critical",
2819
2488
  "weight": 10,
2820
2489
  "recommendation": "Change all boolean values to lowercase: true, false.",
@@ -2829,9 +2498,7 @@
2829
2498
  "category": "StructureAndGrouping",
2830
2499
  "name": "Test case root element should not have unknown attributes",
2831
2500
  "description": "The root <testCase> element should only contain known attributes: guid, id, name, visibility, registryId, failureBehaviour. Unknown attributes may prevent test cases from loading in Provar.",
2832
- "appliesTo": [
2833
- "TestCase"
2834
- ],
2501
+ "appliesTo": ["TestCase"],
2835
2502
  "severity": "minor",
2836
2503
  "weight": 3,
2837
2504
  "recommendation": "Remove unknown attributes from the root <testCase> element.",
@@ -2846,9 +2513,7 @@
2846
2513
  "category": "TestCaseDesign",
2847
2514
  "name": "Test case should not be excessively long",
2848
2515
  "description": "Test cases with more than 150 steps become difficult to maintain, debug, and understand. Consider breaking long tests into smaller, focused test cases or using callable test cases.",
2849
- "appliesTo": [
2850
- "TestCase"
2851
- ],
2516
+ "appliesTo": ["TestCase"],
2852
2517
  "severity": "minor",
2853
2518
  "weight": 3,
2854
2519
  "recommendation": "Break test into smaller test cases or extract common logic into callable test cases.",
@@ -2863,10 +2528,7 @@
2863
2528
  "category": "TestCaseDesign",
2864
2529
  "name": "Picklist values should match Salesforce metadata",
2865
2530
  "description": "Picklist values used in test data should match the valid values defined in Salesforce. Common hallucinated values like 'Active' for Campaign.Status or 'Open' for Opportunity.StageName are often invalid and will cause test failures.",
2866
- "appliesTo": [
2867
- "Step",
2868
- "TestCase"
2869
- ],
2531
+ "appliesTo": ["Step", "TestCase"],
2870
2532
  "severity": "major",
2871
2533
  "weight": 7,
2872
2534
  "recommendation": "Use only picklist values provided in the metadata context. For Campaign.Status, valid values are typically: Planned, In Progress, Completed, Aborted. For Opportunity.StageName, check your org's sales process stages. For Lead.Status, check your org's lead process. Never assume generic values like 'Active', 'Inactive', 'Open', 'Closed' unless explicitly confirmed.",
@@ -2890,17 +2552,43 @@
2890
2552
  "category": "StructureAndGrouping",
2891
2553
  "name": "Value elements must use valid class attribute",
2892
2554
  "description": "The 'class' attribute on <value> elements must be one of the valid Provar value classes. Invalid class values like 'null' cause runtime errors. Valid classes are: value, variable, compound, funcCall, valueList, uiWait, uiLocator, uiTarget, uiInteraction, restTarget, excelTarget, csvTarget, namedValues, url, template, and expression operators (add, sub, mult, div, eq, ne, gt, lt, ge, le, and, or, match).",
2893
- "appliesTo": [
2894
- "Step",
2895
- "TestCase"
2896
- ],
2555
+ "appliesTo": ["Step", "TestCase"],
2897
2556
  "severity": "critical",
2898
2557
  "weight": 10,
2899
2558
  "recommendation": "Use a valid class attribute. For literal values use class='value' with appropriate valueClass (string, boolean, decimal, id, date, dateTime). For variables use class='variable'. For empty/optional arguments, omit the <value> element entirely: <argument id=\"argId\"/>",
2900
2559
  "check": {
2901
2560
  "type": "invalidValueClass",
2902
2561
  "target": "step",
2903
- "validClasses": ["value", "variable", "compound", "funcCall", "valueList", "uiWait", "uiLocator", "uiTarget", "uiInteraction", "restTarget", "excelTarget", "csvTarget", "namedValues", "url", "template", "add", "sub", "mult", "div", "eq", "ne", "gt", "lt", "ge", "le", "and", "or", "match"],
2562
+ "validClasses": [
2563
+ "value",
2564
+ "variable",
2565
+ "compound",
2566
+ "funcCall",
2567
+ "valueList",
2568
+ "uiWait",
2569
+ "uiLocator",
2570
+ "uiTarget",
2571
+ "uiInteraction",
2572
+ "restTarget",
2573
+ "excelTarget",
2574
+ "csvTarget",
2575
+ "namedValues",
2576
+ "url",
2577
+ "template",
2578
+ "add",
2579
+ "sub",
2580
+ "mult",
2581
+ "div",
2582
+ "eq",
2583
+ "ne",
2584
+ "gt",
2585
+ "lt",
2586
+ "ge",
2587
+ "le",
2588
+ "and",
2589
+ "or",
2590
+ "match"
2591
+ ],
2904
2592
  "validValueClasses": ["string", "boolean", "decimal", "id", "date", "dateTime"]
2905
2593
  },
2906
2594
  "notes": "Based on corpus analysis of 1451 test files with 329,424 <value> elements. Common AI hallucination: class='null' (never valid). Empty arguments should have no <value> child.",
@@ -2911,16 +2599,22 @@
2911
2599
  "category": "StructureAndGrouping",
2912
2600
  "name": "UiAssert steps must include all required arguments",
2913
2601
  "description": "UiAssert steps must include columnAssertions, pageAssertions, resultScope, captureAfter, beforeWait, and autoRetry arguments. Based on corpus analysis of 4,577 UiAssert instances, 100% include these arguments (even if empty). Missing these required arguments causes Provar validation failures at runtime.",
2914
- "appliesTo": [
2915
- "Step"
2916
- ],
2602
+ "appliesTo": ["Step"],
2917
2603
  "severity": "critical",
2918
2604
  "weight": 8,
2919
2605
  "recommendation": "Include all required arguments in UiAssert steps. Use empty value lists for unused assertions: <argument id=\"columnAssertions\"><value class=\"valueList\" mutable=\"Mutable\"/></argument>. For resultScope use 'Test'. For captureAfter use 'false'. For beforeWait and autoRetry, include empty argument tags: <argument id=\"beforeWait\"/><argument id=\"autoRetry\"/>",
2920
2606
  "check": {
2921
2607
  "type": "uiAssertMissingArguments",
2922
2608
  "target": "step",
2923
- "requiredArguments": ["fieldAssertions", "columnAssertions", "pageAssertions", "resultScope", "captureAfter", "beforeWait", "autoRetry"],
2609
+ "requiredArguments": [
2610
+ "fieldAssertions",
2611
+ "columnAssertions",
2612
+ "pageAssertions",
2613
+ "resultScope",
2614
+ "captureAfter",
2615
+ "beforeWait",
2616
+ "autoRetry"
2617
+ ],
2924
2618
  "recommendedArguments": ["resultName"]
2925
2619
  },
2926
2620
  "notes": "Based on corpus analysis of 4,577 UiAssert instances across 694 test files. All instances include these arguments. AI commonly omits columnAssertions, pageAssertions, resultScope, beforeWait, and autoRetry.",
@@ -2931,9 +2625,7 @@
2931
2625
  "category": "StructureAndGrouping",
2932
2626
  "name": "UiAssert steps must NOT contain generatedParameters",
2933
2627
  "description": "UiAssert steps should NOT contain <generatedParameters> element. Based on corpus analysis of 4,577 UiAssert instances, 0% contain generatedParameters. This element is 100% hallucinated by AI and causes Provar validation failures.",
2934
- "appliesTo": [
2935
- "Step"
2936
- ],
2628
+ "appliesTo": ["Step"],
2937
2629
  "severity": "critical",
2938
2630
  "weight": 10,
2939
2631
  "recommendation": "Remove the entire <generatedParameters> section from UiAssert steps. Unlike UiDoAction steps which use generatedParameters for field metadata, UiAssert steps never use this element. The assertion configuration is entirely within the arguments element.",
@@ -2949,9 +2641,7 @@
2949
2641
  "category": "LocatorPatterns",
2950
2642
  "name": "UI binding parameter order must have object= first",
2951
2643
  "description": "In UI binding URIs, the object= parameter MUST come FIRST, followed by field= or action=. Wrong order causes 'Unknown control' errors in Provar at runtime.",
2952
- "appliesTo": [
2953
- "Step"
2954
- ],
2644
+ "appliesTo": ["Step"],
2955
2645
  "severity": "critical",
2956
2646
  "weight": 10,
2957
2647
  "recommendation": "Correct the binding parameter order. Use 'object?object=ObjectName&action=ActionName' or 'object?object=ObjectName&field=FieldName'. Never put action= or field= before object=.",
@@ -2979,9 +2669,7 @@
2979
2669
  "category": "TestCaseDesign",
2980
2670
  "name": "UiDoAction/UiAssert fields should exist in Salesforce metadata",
2981
2671
  "description": "When Salesforce object metadata is provided in the context, UI operations (UiDoAction field sets, UiAssert field assertions) should only reference fields that exist in the metadata. Fields mentioned in user story but not present in Salesforce metadata may cause 'Unknown control' errors at runtime. This validation catches hallucinated or non-existent fields before test execution.",
2982
- "appliesTo": [
2983
- "Step"
2984
- ],
2672
+ "appliesTo": ["Step"],
2985
2673
  "severity": "major",
2986
2674
  "weight": 5,
2987
2675
  "recommendation": "Only use fields that exist in the Salesforce org metadata. If a field from the user story shows 'Unknown control' in Provar, either: (1) the field doesn't exist in this org, (2) the field API name is different, or (3) the field isn't on the page layout. Check the org's metadata or remove the field operation from the test.",
@@ -3001,9 +2689,7 @@
3001
2689
  "category": "TestCaseDesign",
3002
2690
  "name": "Page Object locator references non-existent field",
3003
2691
  "description": "When Page Objects are provided, ui:pageobject:field locators must reference fields (WebElement variables) that actually exist in the corresponding Page Object Java class. AI models commonly hallucinate field names that are not defined in the provided Page Objects, causing 'Unknown control' errors at runtime.",
3004
- "appliesTo": [
3005
- "Step"
3006
- ],
2692
+ "appliesTo": ["Step"],
3007
2693
  "severity": "major",
3008
2694
  "weight": 5,
3009
2695
  "recommendation": "Only reference field names that exist in the provided Page Object definitions. Check the Page Object class for available WebElement variables. If the field you need is not in the Page Object, either: (1) use SF metadata binding (sf:ui:binding:object) instead, or (2) ensure the Page Object includes the required field. Available fields are listed in the Page Object section of the generation context.",
@@ -3023,9 +2709,7 @@
3023
2709
  "category": "XMLSchema",
3024
2710
  "name": "funcCall id must be a valid Provar function",
3025
2711
  "description": "When using <value class=\"funcCall\" id=\"FunctionName\">, the function name must be one of Provar's known built-in functions. Unknown function names cause runtime errors as Provar cannot evaluate them. Common hallucinations include JavaScript-style functions like 'concat', 'toString', 'parseInt' instead of Provar's actual functions.",
3026
- "appliesTo": [
3027
- "TestCase"
3028
- ],
2712
+ "appliesTo": ["TestCase"],
3029
2713
  "severity": "major",
3030
2714
  "weight": 6,
3031
2715
  "recommendation": "Use only valid Provar function names: Count, DateAdd, DateFormat, DateParse, GetEnvironmentVariable, GetSelectedEnvironment, IsSorted, Not, NumberFormat, Round, StringNormalize, StringReplace, StringTrim, TestCaseErrors, TestCaseName, TestCaseOutcome, TestCasePath, TestCaseSuccessful, TestRunErrors, UniqueId. NOTE: Concatenate, PadLeft, PadRight, Substring are NOT valid - use valueList for string building.",
@@ -3057,9 +2741,7 @@
3057
2741
  "category": "TestCaseDesign",
3058
2742
  "name": "UiAssert must use compound fields for component field assertions",
3059
2743
  "description": "Salesforce compound fields (Name=FirstName+LastName, BillingAddress=BillingStreet+BillingCity+BillingState+BillingPostalCode+BillingCountry, ShippingAddress, MailingAddress) are displayed as single fields in the UI View screen but set as individual component fields in UiDoAction. UiAssert steps MUST assert the compound field (e.g., 'Name', 'BillingAddress') using a compound value that combines the individual component variables, NOT assert the individual component fields directly which don't exist in the View UI.",
3060
- "appliesTo": [
3061
- "Step"
3062
- ],
2744
+ "appliesTo": ["Step"],
3063
2745
  "severity": "major",
3064
2746
  "weight": 6,
3065
2747
  "recommendation": "For Name field: Assert 'Name' using <value class=\"compound\"><parts><variable><path element=\"FirstName\"/></variable><value class=\"value\" valueClass=\"string\"> </value><variable><path element=\"LastName\"/></variable></parts></value>. For Address fields: Assert 'BillingAddress' or 'ShippingAddress' as the compound field, not individual BillingStreet/BillingCity etc. The fieldLocator should reference the compound field name (e.g., field=Name, field=BillingAddress).",
@@ -3069,9 +2751,39 @@
3069
2751
  "apiId": "com.provar.plugins.forcedotcom.core.ui.UiAssert",
3070
2752
  "compoundFields": {
3071
2753
  "Name": ["FirstName", "LastName", "Salutation", "MiddleName", "Suffix"],
3072
- "BillingAddress": ["BillingStreet", "BillingCity", "BillingState", "BillingStateCode", "BillingPostalCode", "BillingCountry", "BillingCountryCode", "BillingLatitude", "BillingLongitude"],
3073
- "ShippingAddress": ["ShippingStreet", "ShippingCity", "ShippingState", "ShippingStateCode", "ShippingPostalCode", "ShippingCountry", "ShippingCountryCode", "ShippingLatitude", "ShippingLongitude"],
3074
- "MailingAddress": ["MailingStreet", "MailingCity", "MailingState", "MailingStateCode", "MailingPostalCode", "MailingCountry", "MailingCountryCode", "MailingLatitude", "MailingLongitude"]
2754
+ "BillingAddress": [
2755
+ "BillingStreet",
2756
+ "BillingCity",
2757
+ "BillingState",
2758
+ "BillingStateCode",
2759
+ "BillingPostalCode",
2760
+ "BillingCountry",
2761
+ "BillingCountryCode",
2762
+ "BillingLatitude",
2763
+ "BillingLongitude"
2764
+ ],
2765
+ "ShippingAddress": [
2766
+ "ShippingStreet",
2767
+ "ShippingCity",
2768
+ "ShippingState",
2769
+ "ShippingStateCode",
2770
+ "ShippingPostalCode",
2771
+ "ShippingCountry",
2772
+ "ShippingCountryCode",
2773
+ "ShippingLatitude",
2774
+ "ShippingLongitude"
2775
+ ],
2776
+ "MailingAddress": [
2777
+ "MailingStreet",
2778
+ "MailingCity",
2779
+ "MailingState",
2780
+ "MailingStateCode",
2781
+ "MailingPostalCode",
2782
+ "MailingCountry",
2783
+ "MailingCountryCode",
2784
+ "MailingLatitude",
2785
+ "MailingLongitude"
2786
+ ]
3075
2787
  }
3076
2788
  },
3077
2789
  "examples": {
@@ -3092,9 +2804,7 @@
3092
2804
  "category": "TestCaseDesign",
3093
2805
  "name": "UiDoAction lookup fields should use Name values, not IDs",
3094
2806
  "description": "When setting lookup/reference fields via UiDoAction (UI automation), use the record Name (text value the user sees) instead of the record Id. The Salesforce UI expects display values like 'ABC Corp' for Account lookups, not 18-character IDs like '001xx000003DGWaAAO'. Using IDs in UI fields causes lookup failures. Note: Apex CRUD operations (ApexCreateObject, ApexUpdateObject) correctly use IDs for lookup fields.",
3095
- "appliesTo": [
3096
- "Step"
3097
- ],
2807
+ "appliesTo": ["Step"],
3098
2808
  "severity": "major",
3099
2809
  "weight": 6,
3100
2810
  "recommendation": "For UiDoAction on lookup fields (AccountId, ContactId, OwnerId, etc.): 1) Create a variable for the record Name BEFORE creating the record (e.g., AccountName = 'ABC Corp'), 2) Use that Name variable in UiDoAction for lookups, 3) Only use ID variables for Apex CRUD operations or sfUiTargetObjectId navigation. Example: Set AccountName='ABC Corp' via SetValues, then use {AccountName} for UiDoAction on AccountId field.",
@@ -3124,20 +2834,25 @@
3124
2834
  "category": "TestCaseDesign",
3125
2835
  "name": "Date/DateTime assertions should use proper format functions",
3126
2836
  "description": "Salesforce Date and DateTime fields are stored in specific formats: DateTime uses ISO 8601 format (2026-01-14T05:36:12.000+0000) and Date uses yyyy-MM-dd format (2026-01-14). When asserting these fields in UI or API tests, raw date strings may cause assertion failures due to format mismatches, timezone differences, or precision issues. Use Provar's date functions (DateFormat, DateParse, DateAdd, TODAY, NOW) for reliable date comparisons.",
3127
- "appliesTo": [
3128
- "Step"
3129
- ],
2837
+ "appliesTo": ["Step"],
3130
2838
  "severity": "minor",
3131
2839
  "weight": 4,
3132
2840
  "recommendation": "For date assertions: 1) Use DateFormat() to format dates consistently: DateFormat(variable, 'yyyy-MM-dd', 'GMT'), 2) Use DateParse() to parse date strings with known formats, 3) Use TODAY for current date comparisons (yyyy-MM-dd format), 4) Use NOW for current datetime (yyyy-MM-dd HH:mm:ss.SSS format), 5) Use DateAdd() for date calculations. Always specify timezone for DateTime comparisons. Example: Assert CloseDate equals DateFormat(ExpectedDate, 'yyyy-MM-dd').",
3133
2841
  "check": {
3134
2842
  "type": "dateFormatAssertion",
3135
2843
  "target": "step",
3136
- "apiIds": [
3137
- "com.provar.plugins.forcedotcom.core.ui.UiAssert",
3138
- "com.provar.plugins.bundled.apis.AssertValues"
2844
+ "apiIds": ["com.provar.plugins.forcedotcom.core.ui.UiAssert", "com.provar.plugins.bundled.apis.AssertValues"],
2845
+ "dateFieldPatterns": [
2846
+ "Date$",
2847
+ "DateTime$",
2848
+ "^Close",
2849
+ "^Start",
2850
+ "^End",
2851
+ "^Created",
2852
+ "^LastModified",
2853
+ "^Birth",
2854
+ "^Expir"
3139
2855
  ],
3140
- "dateFieldPatterns": ["Date$", "DateTime$", "^Close", "^Start", "^End", "^Created", "^LastModified", "^Birth", "^Expir"],
3141
2856
  "sfDateTimeFormat": "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
3142
2857
  "sfDateFormat": "yyyy-MM-dd"
3143
2858
  },
@@ -3162,10 +2877,7 @@
3162
2877
  "category": "XMLSchema",
3163
2878
  "name": "valueClass='date' requires epoch timestamp, not date string",
3164
2879
  "description": "When using valueClass='date' or valueClass='dateTime' in Provar test cases, the value MUST be an epoch timestamp in milliseconds (a numeric value like 1736899200000), NOT an ISO date string like '2025-01-15' or '2025-01-15T00:00:00.000Z'. Using string date formats with valueClass='date' causes the test case to fail loading in Provar IDE. This is a critical XML schema violation that completely breaks the test case.",
3165
- "appliesTo": [
3166
- "Step",
3167
- "TestCase"
3168
- ],
2880
+ "appliesTo": ["Step", "TestCase"],
3169
2881
  "severity": "critical",
3170
2882
  "weight": 10,
3171
2883
  "recommendation": "Either: 1) Use valueClass='string' if you want to specify dates as strings like '2025-01-15', OR 2) Use valueClass='date' with epoch timestamp in milliseconds (e.g., 1736899200000 for 2025-01-15). For ApexCreateObject/ApexUpdateObject date fields, use valueClass='string' with the date in 'YYYY-MM-DD' format. To convert: new Date('2025-01-15').getTime() = 1736899200000.",
@@ -3189,4 +2901,4 @@
3189
2901
  "source": "Corpus analysis: All valueClass='date' values are epoch timestamps; string dates cause Provar IDE load failures"
3190
2902
  }
3191
2903
  ]
3192
- }
2904
+ }