@provartesting/provardx-cli 1.5.3 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -37
- package/lib/commands/provar/automation/project/validate.js +5 -3
- package/lib/commands/provar/automation/project/validate.js.map +1 -1
- package/lib/mcp/docs/PROVAR_TEST_STEP_REFERENCE.md +13 -1
- package/lib/mcp/docs/VALIDATION_RULE_REGISTRY.md +225 -0
- package/lib/mcp/rules/comparisonTypeSets.d.ts +21 -0
- package/lib/mcp/rules/comparisonTypeSets.js +45 -0
- package/lib/mcp/rules/comparisonTypeSets.js.map +1 -0
- package/lib/mcp/rules/provar_best_practices_rules.json +119 -8
- package/lib/mcp/rules/provar_layer1_rules.json +151 -0
- package/lib/mcp/rules/provar_test_step_schema.json +3005 -0
- package/lib/mcp/server.d.ts +15 -0
- package/lib/mcp/server.js +64 -1
- package/lib/mcp/server.js.map +1 -1
- package/lib/mcp/tools/automationTools.js +38 -1
- package/lib/mcp/tools/automationTools.js.map +1 -1
- package/lib/mcp/tools/bestPracticesEngine.js +1068 -6
- package/lib/mcp/tools/bestPracticesEngine.js.map +1 -1
- package/lib/mcp/tools/hierarchyValidate.d.ts +2 -1
- package/lib/mcp/tools/hierarchyValidate.js +7 -1
- package/lib/mcp/tools/hierarchyValidate.js.map +1 -1
- package/lib/mcp/tools/projectValidateFromPath.js +1 -2
- package/lib/mcp/tools/projectValidateFromPath.js.map +1 -1
- package/lib/mcp/tools/sfSpawn.d.ts +23 -0
- package/lib/mcp/tools/sfSpawn.js +72 -1
- package/lib/mcp/tools/sfSpawn.js.map +1 -1
- package/lib/mcp/tools/testCaseGenerate.js +146 -12
- package/lib/mcp/tools/testCaseGenerate.js.map +1 -1
- package/lib/mcp/tools/testCaseValidate.d.ts +46 -0
- package/lib/mcp/tools/testCaseValidate.js +307 -41
- package/lib/mcp/tools/testCaseValidate.js.map +1 -1
- package/lib/mcp/tools/testPlanValidate.js +3 -2
- package/lib/mcp/tools/testPlanValidate.js.map +1 -1
- package/lib/mcp/tools/testSuiteValidate.js +3 -2
- package/lib/mcp/tools/testSuiteValidate.js.map +1 -1
- package/lib/mcp/utils/qualityThreshold.d.ts +8 -0
- package/lib/mcp/utils/qualityThreshold.js +42 -0
- package/lib/mcp/utils/qualityThreshold.js.map +1 -0
- package/lib/mcp/utils/testCaseId.d.ts +23 -0
- package/lib/mcp/utils/testCaseId.js +156 -0
- package/lib/mcp/utils/testCaseId.js.map +1 -0
- package/lib/services/projectValidation.js +2 -1
- package/lib/services/projectValidation.js.map +1 -1
- package/messages/sf.provar.automation.project.validate.md +1 -1
- package/messages/sf.provar.mcp.start.md +1 -0
- package/oclif.manifest.json +4 -4
- package/package.json +3 -2
|
@@ -0,0 +1,3005 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$comment": "Provar-specific structural reference for test case XML (top-level keys are Provar domain entities such as testCase/apiCalls, not JSON-Schema keywords). Despite the $schema declaration this is NOT a standards-compliant constraint JSON Schema; it is consumed as the provar://schema/test-step MCP resource and as the source for the validator's API-ID / value-class sets.",
|
|
4
|
+
"title": "Provar Test Case XML Structure Schema",
|
|
5
|
+
"description": "Complete mapping of Provar test case XML elements, apiCall types, and their required/optional arguments - organized by Test Palette categories",
|
|
6
|
+
"version": "2.0.0",
|
|
7
|
+
|
|
8
|
+
"testCase": {
|
|
9
|
+
"description": "Root element of a Provar test case",
|
|
10
|
+
"required_attributes": ["id"],
|
|
11
|
+
"optional_attributes": ["guid", "registryId", "failureBehaviour", "visibility", "isTestTemplate"],
|
|
12
|
+
"child_elements": {
|
|
13
|
+
"summary": {
|
|
14
|
+
"description": "Human-readable description of test case",
|
|
15
|
+
"type": "text",
|
|
16
|
+
"required": false
|
|
17
|
+
},
|
|
18
|
+
"params": {
|
|
19
|
+
"description": "Test case parameters for data-driven testing",
|
|
20
|
+
"required": false,
|
|
21
|
+
"children": {
|
|
22
|
+
"param": {
|
|
23
|
+
"required_attributes": ["name", "linkedToUrl"],
|
|
24
|
+
"optional_attributes": ["type", "passwordVariableAllowed", "title"]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"args": {
|
|
29
|
+
"description": "Default argument values for test case parameters",
|
|
30
|
+
"required": false
|
|
31
|
+
},
|
|
32
|
+
"steps": {
|
|
33
|
+
"description": "Container for all test steps",
|
|
34
|
+
"required": true,
|
|
35
|
+
"children": ["apiCall"]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
"apiCall": {
|
|
41
|
+
"description": "Generic apiCall element representing a test step",
|
|
42
|
+
"required_attributes": ["guid", "apiId", "name", "testItemId"],
|
|
43
|
+
"optional_attributes": ["title", "isTitleTemplate", "disabled", "continueOnFailure"],
|
|
44
|
+
"guid_format": "UUID v4 format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
|
|
45
|
+
"validation_rules": [
|
|
46
|
+
"guid must be unique across all steps in test case",
|
|
47
|
+
"guid must be valid UUID v4 format",
|
|
48
|
+
"apiId must match a valid Provar API identifier",
|
|
49
|
+
"testItemId must be unique sequential integer starting from 1"
|
|
50
|
+
],
|
|
51
|
+
"note": "Every <apiCall> element MUST have a guid attribute - this is mandatory for Provar test case validation"
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
"apiCalls": {
|
|
55
|
+
"description": "All supported Provar test step types organized by Test Palette categories",
|
|
56
|
+
|
|
57
|
+
"Control": {
|
|
58
|
+
"description": "Control flow steps for loops, conditionals, assertions, and test flow management",
|
|
59
|
+
|
|
60
|
+
"AssertValues": {
|
|
61
|
+
"apiId": "com.provar.plugins.bundled.apis.AssertValues",
|
|
62
|
+
"description": "Validate values using various comparison operators. IMPORTANT: actualValue can be empty for NotEqualTo blank string checks.",
|
|
63
|
+
"category": "Control",
|
|
64
|
+
"required_arguments": [
|
|
65
|
+
{
|
|
66
|
+
"id": "expectedValue",
|
|
67
|
+
"type": "value",
|
|
68
|
+
"description": "Expected value for comparison"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "actualValue",
|
|
72
|
+
"type": "value",
|
|
73
|
+
"description": "Actual value to compare. Can be empty for NotEqualTo blank string checks."
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "comparisonType",
|
|
77
|
+
"type": "string",
|
|
78
|
+
"description": "Type of comparison (EqualTo, NotEqualTo, Contains, GreaterThan, LessThan, etc.)"
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
"optional_arguments": [
|
|
82
|
+
{
|
|
83
|
+
"id": "caseSensitive",
|
|
84
|
+
"type": "boolean",
|
|
85
|
+
"default": "true",
|
|
86
|
+
"description": "Whether comparison is case-sensitive"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "numeric",
|
|
90
|
+
"type": "boolean",
|
|
91
|
+
"default": "true",
|
|
92
|
+
"description": "Whether to treat values as numbers"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "retainDecimals",
|
|
96
|
+
"type": "boolean",
|
|
97
|
+
"default": "false",
|
|
98
|
+
"description": "Whether to retain decimal precision"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "nullGreater",
|
|
102
|
+
"type": "boolean",
|
|
103
|
+
"default": "false",
|
|
104
|
+
"description": "Whether null is greater than non-null"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"id": "matchMultiLine",
|
|
108
|
+
"type": "boolean",
|
|
109
|
+
"default": "false",
|
|
110
|
+
"description": "Whether to match across multiple lines (for regex)"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "matchDotAll",
|
|
114
|
+
"type": "boolean",
|
|
115
|
+
"default": "false",
|
|
116
|
+
"description": "Whether dot matches all characters (for regex)"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "failureMessage",
|
|
120
|
+
"type": "string",
|
|
121
|
+
"description": "Custom failure message"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"id": "continueOnFailure",
|
|
125
|
+
"type": "boolean",
|
|
126
|
+
"default": "false"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"validation_rules": [
|
|
130
|
+
"expectedValue and actualValue types should be compatible",
|
|
131
|
+
"comparisonType must be valid operator (EqualTo, NotEqualTo, Contains, NotContain, StartsWith, EndsWith, GreaterThan, LessThan, GreaterOrEqual, LessOrEqual, Matches, NotMatches)",
|
|
132
|
+
"For NotEqualTo blank string checks, actualValue can be empty"
|
|
133
|
+
],
|
|
134
|
+
"best_practices": [
|
|
135
|
+
"Use specific comparison types rather than generic EqualTo",
|
|
136
|
+
"Add meaningful failure messages",
|
|
137
|
+
"For blank string checks, use expectedValue={variable}, comparisonType='NotEqualTo', actualValue=<empty/>"
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
"Break": {
|
|
142
|
+
"apiId": "com.provar.plugins.bundled.apis.control.Break",
|
|
143
|
+
"description": "Exit from a loop (ForEach, While) prematurely",
|
|
144
|
+
"category": "Control",
|
|
145
|
+
"required_arguments": [],
|
|
146
|
+
"optional_arguments": [],
|
|
147
|
+
"validation_rules": ["Must be inside a ForEach or While loop"],
|
|
148
|
+
"best_practices": [
|
|
149
|
+
"Use Break sparingly - consider loop conditions instead",
|
|
150
|
+
"Document reason for breaking loop"
|
|
151
|
+
]
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
"Fail": {
|
|
155
|
+
"apiId": "com.provar.plugins.bundled.apis.control.Fail",
|
|
156
|
+
"description": "Immediately fail the test with a message",
|
|
157
|
+
"category": "Control",
|
|
158
|
+
"required_arguments": [
|
|
159
|
+
{
|
|
160
|
+
"id": "message",
|
|
161
|
+
"type": "string",
|
|
162
|
+
"description": "Failure message to display"
|
|
163
|
+
}
|
|
164
|
+
],
|
|
165
|
+
"optional_arguments": [],
|
|
166
|
+
"validation_rules": ["message should be descriptive"],
|
|
167
|
+
"best_practices": ["Use for critical validation failures", "Provide clear, actionable failure messages"]
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
"Finally": {
|
|
171
|
+
"apiId": "com.provar.plugins.bundled.apis.control.Finally",
|
|
172
|
+
"description": "Execute cleanup steps that always run regardless of test outcome",
|
|
173
|
+
"category": "Control",
|
|
174
|
+
"required_arguments": [],
|
|
175
|
+
"optional_arguments": [],
|
|
176
|
+
"substeps": true,
|
|
177
|
+
"validation_rules": ["Should be at end of test", "Typically contains cleanup operations"],
|
|
178
|
+
"best_practices": [
|
|
179
|
+
"Use for critical cleanup that must always execute",
|
|
180
|
+
"Keep Finally blocks simple and fast",
|
|
181
|
+
"Don't perform assertions in Finally"
|
|
182
|
+
]
|
|
183
|
+
},
|
|
184
|
+
|
|
185
|
+
"ForEach": {
|
|
186
|
+
"apiId": "com.provar.plugins.bundled.apis.control.ForEach",
|
|
187
|
+
"description": "Loop through collection of items",
|
|
188
|
+
"category": "Control",
|
|
189
|
+
"required_arguments": [
|
|
190
|
+
{
|
|
191
|
+
"id": "valuePath",
|
|
192
|
+
"type": "variable",
|
|
193
|
+
"description": "Collection to iterate over"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"id": "iterationPathName",
|
|
197
|
+
"type": "string",
|
|
198
|
+
"description": "Variable name for current item"
|
|
199
|
+
}
|
|
200
|
+
],
|
|
201
|
+
"optional_arguments": [],
|
|
202
|
+
"substeps": true,
|
|
203
|
+
"validation_rules": [
|
|
204
|
+
"valuePath must reference a valid list/collection",
|
|
205
|
+
"iterationPathName should be meaningful",
|
|
206
|
+
"Must contain substeps"
|
|
207
|
+
],
|
|
208
|
+
"best_practices": [
|
|
209
|
+
"Use descriptive iteration variable names",
|
|
210
|
+
"Consider performance with large collections",
|
|
211
|
+
"Avoid nested ForEach when possible"
|
|
212
|
+
]
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
"GroupSteps": {
|
|
216
|
+
"apiId": "com.provar.plugins.bundled.apis.control.StepGroup",
|
|
217
|
+
"description": "Organize related steps into logical groups",
|
|
218
|
+
"category": "Control",
|
|
219
|
+
"required_arguments": [
|
|
220
|
+
{
|
|
221
|
+
"id": "name",
|
|
222
|
+
"type": "string",
|
|
223
|
+
"description": "Group name"
|
|
224
|
+
}
|
|
225
|
+
],
|
|
226
|
+
"optional_arguments": [
|
|
227
|
+
{
|
|
228
|
+
"id": "description",
|
|
229
|
+
"type": "string",
|
|
230
|
+
"description": "Detailed group description"
|
|
231
|
+
}
|
|
232
|
+
],
|
|
233
|
+
"substeps": true,
|
|
234
|
+
"validation_rules": ["name should be descriptive", "Should contain multiple related steps"],
|
|
235
|
+
"best_practices": ["Use for tests with 10+ steps", "Group by logical functionality", "Add clear descriptions"]
|
|
236
|
+
},
|
|
237
|
+
|
|
238
|
+
"If": {
|
|
239
|
+
"apiId": "com.provar.plugins.bundled.apis.If",
|
|
240
|
+
"description": "Conditional execution based on boolean expression",
|
|
241
|
+
"category": "Control",
|
|
242
|
+
"required_arguments": [
|
|
243
|
+
{
|
|
244
|
+
"id": "condition",
|
|
245
|
+
"type": "boolean",
|
|
246
|
+
"description": "Boolean expression to evaluate"
|
|
247
|
+
}
|
|
248
|
+
],
|
|
249
|
+
"optional_arguments": [],
|
|
250
|
+
"substeps": true,
|
|
251
|
+
"clauses": ["then", "else"],
|
|
252
|
+
"validation_rules": [
|
|
253
|
+
"condition must be boolean expression",
|
|
254
|
+
"Must have then clause",
|
|
255
|
+
"else clause is optional"
|
|
256
|
+
],
|
|
257
|
+
"best_practices": [
|
|
258
|
+
"Keep conditions simple and readable",
|
|
259
|
+
"Consider using Switch for multiple conditions",
|
|
260
|
+
"Avoid deeply nested If statements"
|
|
261
|
+
]
|
|
262
|
+
},
|
|
263
|
+
|
|
264
|
+
"SetValues": {
|
|
265
|
+
"apiId": "com.provar.plugins.bundled.apis.control.SetValues",
|
|
266
|
+
"description": "Set variable values for use in test",
|
|
267
|
+
"category": "Control",
|
|
268
|
+
"required_arguments": [],
|
|
269
|
+
"optional_arguments": [],
|
|
270
|
+
"child_elements": {
|
|
271
|
+
"namedValues": {
|
|
272
|
+
"description": "Container for namedValue elements",
|
|
273
|
+
"children": ["namedValue"]
|
|
274
|
+
},
|
|
275
|
+
"namedValue": {
|
|
276
|
+
"required_attributes": ["name"],
|
|
277
|
+
"optional_attributes": ["readOnly", "value"],
|
|
278
|
+
"description": "Individual variable assignment"
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
"validation_rules": [
|
|
282
|
+
"Must contain namedValues container",
|
|
283
|
+
"Each namedValue must have name attribute",
|
|
284
|
+
"Variable names should follow naming conventions"
|
|
285
|
+
],
|
|
286
|
+
"best_practices": [
|
|
287
|
+
"Use at beginning of test for test data",
|
|
288
|
+
"Use descriptive variable names",
|
|
289
|
+
"Group related variables together"
|
|
290
|
+
]
|
|
291
|
+
},
|
|
292
|
+
|
|
293
|
+
"Sleep": {
|
|
294
|
+
"apiId": "com.provar.plugins.bundled.apis.control.Sleep",
|
|
295
|
+
"description": "Pause test execution for specified duration",
|
|
296
|
+
"category": "Control",
|
|
297
|
+
"required_arguments": [
|
|
298
|
+
{
|
|
299
|
+
"id": "sleepSecs",
|
|
300
|
+
"type": "decimal",
|
|
301
|
+
"description": "Sleep duration"
|
|
302
|
+
}
|
|
303
|
+
],
|
|
304
|
+
"optional_arguments": [
|
|
305
|
+
{
|
|
306
|
+
"id": "unit",
|
|
307
|
+
"type": "string",
|
|
308
|
+
"default": "seconds",
|
|
309
|
+
"description": "Time unit (seconds)"
|
|
310
|
+
}
|
|
311
|
+
],
|
|
312
|
+
"validation_rules": ["duration must be positive number", "Avoid long sleep durations"],
|
|
313
|
+
"best_practices": [
|
|
314
|
+
"Prefer WaitFor over fixed Sleep",
|
|
315
|
+
"Keep sleepSecs under 10 seconds",
|
|
316
|
+
"Document reason for sleep"
|
|
317
|
+
]
|
|
318
|
+
},
|
|
319
|
+
|
|
320
|
+
"Switch": {
|
|
321
|
+
"apiId": "com.provar.plugins.bundled.apis.Switch",
|
|
322
|
+
"description": "Multi-way conditional branching (similar to switch/case in programming languages)",
|
|
323
|
+
"category": "Control",
|
|
324
|
+
"required_arguments": [
|
|
325
|
+
{
|
|
326
|
+
"id": "value",
|
|
327
|
+
"type": "value",
|
|
328
|
+
"description": "Expression to evaluate against case values"
|
|
329
|
+
}
|
|
330
|
+
],
|
|
331
|
+
"optional_arguments": [],
|
|
332
|
+
"substeps": false,
|
|
333
|
+
"clauses": ["case"],
|
|
334
|
+
"structure": "Switch contains clause name='case' with steps containing multiple SwitchCase apiCalls",
|
|
335
|
+
"validation_rules": [
|
|
336
|
+
"Must have at least one case",
|
|
337
|
+
"Uses clause name='case' (not 'substeps')",
|
|
338
|
+
"Individual cases are SwitchCase apiCalls within the case clause"
|
|
339
|
+
],
|
|
340
|
+
"best_practices": [
|
|
341
|
+
"Use Switch instead of multiple If statements",
|
|
342
|
+
"Always include default case",
|
|
343
|
+
"Keep cases simple"
|
|
344
|
+
],
|
|
345
|
+
"note": "Individual case/default clauses use apiId='com.provar.plugins.bundled.apis.SwitchCase' as separate apiCall elements within the case clause"
|
|
346
|
+
},
|
|
347
|
+
|
|
348
|
+
"SwitchCase": {
|
|
349
|
+
"apiId": "com.provar.plugins.bundled.apis.SwitchCase",
|
|
350
|
+
"description": "Individual case or default clause within a Switch statement (similar to 'case' keyword in programming)",
|
|
351
|
+
"category": "Control",
|
|
352
|
+
"required_arguments": [
|
|
353
|
+
{
|
|
354
|
+
"id": "value",
|
|
355
|
+
"type": "value",
|
|
356
|
+
"description": "Value to match against Switch value (omitted or empty for default case)"
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"id": "caseSensitive",
|
|
360
|
+
"type": "value",
|
|
361
|
+
"description": "Whether comparison is case-sensitive (Yes/No)"
|
|
362
|
+
}
|
|
363
|
+
],
|
|
364
|
+
"optional_arguments": [
|
|
365
|
+
{
|
|
366
|
+
"id": "alreadyMatched",
|
|
367
|
+
"type": "value",
|
|
368
|
+
"description": "Internal flag indicating if a previous case matched"
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"id": "switchValue",
|
|
372
|
+
"type": "value",
|
|
373
|
+
"description": "Internal reference to parent Switch value"
|
|
374
|
+
}
|
|
375
|
+
],
|
|
376
|
+
"substeps": true,
|
|
377
|
+
"clauses": ["steps"],
|
|
378
|
+
"validation_rules": [
|
|
379
|
+
"Must be child of Switch step's case clause",
|
|
380
|
+
"Default case has empty or no value argument",
|
|
381
|
+
"Multiple SwitchCase elements can exist within same Switch"
|
|
382
|
+
],
|
|
383
|
+
"best_practices": [
|
|
384
|
+
"Keep case logic simple",
|
|
385
|
+
"Use default for catch-all behavior",
|
|
386
|
+
"Order cases from most to least likely"
|
|
387
|
+
],
|
|
388
|
+
"structure_example": "Switch > clause name='case' > steps > SwitchCase (with clause name='steps' containing substeps)"
|
|
389
|
+
},
|
|
390
|
+
|
|
391
|
+
"WaitFor": {
|
|
392
|
+
"apiId": "com.provar.plugins.bundled.apis.control.WaitFor",
|
|
393
|
+
"description": "Wait for condition or duration",
|
|
394
|
+
"category": "Control",
|
|
395
|
+
"required_arguments": [],
|
|
396
|
+
"optional_arguments": [
|
|
397
|
+
{
|
|
398
|
+
"id": "duration",
|
|
399
|
+
"type": "decimal",
|
|
400
|
+
"description": "Maximum wait duration"
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
"id": "condition",
|
|
404
|
+
"type": "boolean",
|
|
405
|
+
"description": "Condition to wait for"
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
"id": "pollInterval",
|
|
409
|
+
"type": "decimal",
|
|
410
|
+
"default": "1",
|
|
411
|
+
"description": "How often to check condition (seconds)"
|
|
412
|
+
}
|
|
413
|
+
],
|
|
414
|
+
"validation_rules": ["Must specify duration OR condition", "duration should be reasonable (< 60 seconds)"],
|
|
415
|
+
"best_practices": [
|
|
416
|
+
"Prefer condition-based over fixed duration",
|
|
417
|
+
"Set reasonable timeout values",
|
|
418
|
+
"Use for async operations"
|
|
419
|
+
]
|
|
420
|
+
},
|
|
421
|
+
|
|
422
|
+
"While": {
|
|
423
|
+
"apiId": "com.provar.plugins.bundled.apis.control.DoWhile",
|
|
424
|
+
"description": "Loop while condition is true",
|
|
425
|
+
"category": "Control",
|
|
426
|
+
"required_arguments": [
|
|
427
|
+
{
|
|
428
|
+
"id": "condition",
|
|
429
|
+
"type": "boolean",
|
|
430
|
+
"description": "Loop condition"
|
|
431
|
+
}
|
|
432
|
+
],
|
|
433
|
+
"optional_arguments": [
|
|
434
|
+
{
|
|
435
|
+
"id": "maxIterations",
|
|
436
|
+
"type": "decimal",
|
|
437
|
+
"description": "Maximum loop iterations to prevent infinite loops"
|
|
438
|
+
}
|
|
439
|
+
],
|
|
440
|
+
"substeps": true,
|
|
441
|
+
"validation_rules": [
|
|
442
|
+
"condition must be boolean",
|
|
443
|
+
"Should have maxIterations to prevent infinite loops",
|
|
444
|
+
"Must contain substeps"
|
|
445
|
+
],
|
|
446
|
+
"best_practices": [
|
|
447
|
+
"Always set maxIterations",
|
|
448
|
+
"Ensure condition will eventually become false",
|
|
449
|
+
"Prefer ForEach for collections"
|
|
450
|
+
]
|
|
451
|
+
}
|
|
452
|
+
},
|
|
453
|
+
|
|
454
|
+
"Data": {
|
|
455
|
+
"description": "Database, REST/Web, and messaging operations",
|
|
456
|
+
|
|
457
|
+
"DbConnect": {
|
|
458
|
+
"apiId": "com.provar.plugins.bundled.apis.db.DbConnect",
|
|
459
|
+
"description": "Connect to external database (Oracle, SQL Server, DB2, MySQL, PostgreSQL)",
|
|
460
|
+
"category": "Data",
|
|
461
|
+
"required_arguments": [
|
|
462
|
+
{
|
|
463
|
+
"id": "connectionName",
|
|
464
|
+
"type": "string",
|
|
465
|
+
"description": "Name of database connection"
|
|
466
|
+
}
|
|
467
|
+
],
|
|
468
|
+
"optional_arguments": [
|
|
469
|
+
{
|
|
470
|
+
"id": "connectionId",
|
|
471
|
+
"type": "id"
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
"id": "autoCommit",
|
|
475
|
+
"type": "boolean",
|
|
476
|
+
"default": "true"
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
"id": "commitBehavior",
|
|
480
|
+
"type": "string",
|
|
481
|
+
"default": "AfterTest"
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
"id": "ifAlreadyOpen",
|
|
485
|
+
"type": "string",
|
|
486
|
+
"default": "Fail"
|
|
487
|
+
}
|
|
488
|
+
],
|
|
489
|
+
"validation_rules": ["Should be first DB operation", "connectionName must be unique"],
|
|
490
|
+
"best_practices": ["Use connection pooling when possible", "Set appropriate commit behavior"]
|
|
491
|
+
},
|
|
492
|
+
|
|
493
|
+
"DbDelete": {
|
|
494
|
+
"apiId": "com.provar.plugins.bundled.apis.db.DbDelete",
|
|
495
|
+
"description": "Delete records from database table",
|
|
496
|
+
"category": "Data",
|
|
497
|
+
"required_arguments": [
|
|
498
|
+
{
|
|
499
|
+
"id": "dbConnectionName",
|
|
500
|
+
"type": "string"
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
"id": "tableName",
|
|
504
|
+
"type": "string"
|
|
505
|
+
}
|
|
506
|
+
],
|
|
507
|
+
"optional_arguments": [
|
|
508
|
+
{
|
|
509
|
+
"id": "whereClause",
|
|
510
|
+
"type": "string"
|
|
511
|
+
}
|
|
512
|
+
],
|
|
513
|
+
"validation_rules": [
|
|
514
|
+
"Must have DbConnect first",
|
|
515
|
+
"tableName must be valid",
|
|
516
|
+
"Should have whereClause to avoid deleting all records"
|
|
517
|
+
],
|
|
518
|
+
"best_practices": ["Always use WHERE clause", "Test with SELECT first"]
|
|
519
|
+
},
|
|
520
|
+
|
|
521
|
+
"DbInsert": {
|
|
522
|
+
"apiId": "com.provar.plugins.bundled.apis.db.DbInsert",
|
|
523
|
+
"description": "Insert records into database table",
|
|
524
|
+
"category": "Data",
|
|
525
|
+
"required_arguments": [
|
|
526
|
+
{
|
|
527
|
+
"id": "dbConnectionName",
|
|
528
|
+
"type": "string"
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
"id": "tableName",
|
|
532
|
+
"type": "string"
|
|
533
|
+
}
|
|
534
|
+
],
|
|
535
|
+
"optional_arguments": [
|
|
536
|
+
{
|
|
537
|
+
"id": "columnValues",
|
|
538
|
+
"type": "object",
|
|
539
|
+
"description": "Column name/value pairs"
|
|
540
|
+
}
|
|
541
|
+
],
|
|
542
|
+
"validation_rules": [
|
|
543
|
+
"Must have DbConnect first",
|
|
544
|
+
"tableName must be valid",
|
|
545
|
+
"columnValues should match table schema"
|
|
546
|
+
],
|
|
547
|
+
"best_practices": ["Validate data before insert", "Handle insert failures gracefully"]
|
|
548
|
+
},
|
|
549
|
+
|
|
550
|
+
"DbRead": {
|
|
551
|
+
"apiId": "com.provar.plugins.bundled.apis.db.DbRead",
|
|
552
|
+
"description": "Read records from database table",
|
|
553
|
+
"category": "Data",
|
|
554
|
+
"required_arguments": [
|
|
555
|
+
{
|
|
556
|
+
"id": "dbConnectionName",
|
|
557
|
+
"type": "string"
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
"id": "tableName",
|
|
561
|
+
"type": "string"
|
|
562
|
+
}
|
|
563
|
+
],
|
|
564
|
+
"optional_arguments": [
|
|
565
|
+
{
|
|
566
|
+
"id": "whereClause",
|
|
567
|
+
"type": "string"
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
"id": "resultName",
|
|
571
|
+
"type": "string"
|
|
572
|
+
}
|
|
573
|
+
],
|
|
574
|
+
"validation_rules": ["Must have DbConnect first", "Should store results in variable"],
|
|
575
|
+
"best_practices": ["Use WHERE clause to limit results", "Store in meaningful variable name"]
|
|
576
|
+
},
|
|
577
|
+
|
|
578
|
+
"DbUpdate": {
|
|
579
|
+
"apiId": "com.provar.plugins.bundled.apis.db.DbUpdate",
|
|
580
|
+
"description": "Update records in database table",
|
|
581
|
+
"category": "Data",
|
|
582
|
+
"required_arguments": [
|
|
583
|
+
{
|
|
584
|
+
"id": "dbConnectionName",
|
|
585
|
+
"type": "string"
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"id": "tableName",
|
|
589
|
+
"type": "string"
|
|
590
|
+
}
|
|
591
|
+
],
|
|
592
|
+
"optional_arguments": [
|
|
593
|
+
{
|
|
594
|
+
"id": "columnValues",
|
|
595
|
+
"type": "object"
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
"id": "whereClause",
|
|
599
|
+
"type": "string"
|
|
600
|
+
}
|
|
601
|
+
],
|
|
602
|
+
"validation_rules": ["Must have DbConnect first", "Should have WHERE clause"],
|
|
603
|
+
"best_practices": ["Always use WHERE clause", "Verify update with SELECT"]
|
|
604
|
+
},
|
|
605
|
+
|
|
606
|
+
"SqlQuery": {
|
|
607
|
+
"apiId": "com.provar.plugins.bundled.apis.db.SqlQuery",
|
|
608
|
+
"description": "Execute custom SQL query",
|
|
609
|
+
"category": "Data",
|
|
610
|
+
"required_arguments": [
|
|
611
|
+
{
|
|
612
|
+
"id": "dbConnectionName",
|
|
613
|
+
"type": "string"
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
"id": "query",
|
|
617
|
+
"type": "string",
|
|
618
|
+
"description": "SQL query to execute"
|
|
619
|
+
}
|
|
620
|
+
],
|
|
621
|
+
"optional_arguments": [
|
|
622
|
+
{
|
|
623
|
+
"id": "resultName",
|
|
624
|
+
"type": "string"
|
|
625
|
+
}
|
|
626
|
+
],
|
|
627
|
+
"validation_rules": ["Must have DbConnect first", "query must be valid SQL"],
|
|
628
|
+
"best_practices": ["Use parameterized queries", "Store results for verification"]
|
|
629
|
+
},
|
|
630
|
+
|
|
631
|
+
"WebConnect": {
|
|
632
|
+
"apiId": "com.provar.plugins.bundled.apis.restservice.WebConnect",
|
|
633
|
+
"description": "Connect to REST API or web service",
|
|
634
|
+
"category": "Data",
|
|
635
|
+
"required_arguments": [
|
|
636
|
+
{
|
|
637
|
+
"id": "connectionName",
|
|
638
|
+
"type": "string"
|
|
639
|
+
}
|
|
640
|
+
],
|
|
641
|
+
"optional_arguments": [
|
|
642
|
+
{
|
|
643
|
+
"id": "connectionId",
|
|
644
|
+
"type": "id"
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
"id": "resultName",
|
|
648
|
+
"type": "string"
|
|
649
|
+
}
|
|
650
|
+
],
|
|
651
|
+
"validation_rules": ["Required before RestRequest", "Required for Agentforce connections"],
|
|
652
|
+
"best_practices": ["Reuse connections when possible", "Configure authentication properly"]
|
|
653
|
+
},
|
|
654
|
+
|
|
655
|
+
"RestRequest": {
|
|
656
|
+
"apiId": "com.provar.plugins.bundled.apis.restservice.RestRequest",
|
|
657
|
+
"description": "Make REST API call",
|
|
658
|
+
"category": "Data",
|
|
659
|
+
"required_arguments": [
|
|
660
|
+
{
|
|
661
|
+
"id": "webConnectionName",
|
|
662
|
+
"type": "string"
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
"id": "endpoint",
|
|
666
|
+
"type": "string"
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
"id": "method",
|
|
670
|
+
"type": "string",
|
|
671
|
+
"description": "HTTP method (GET, POST, PUT, DELETE, PATCH)"
|
|
672
|
+
}
|
|
673
|
+
],
|
|
674
|
+
"optional_arguments": [
|
|
675
|
+
{
|
|
676
|
+
"id": "body",
|
|
677
|
+
"type": "string"
|
|
678
|
+
},
|
|
679
|
+
{
|
|
680
|
+
"id": "headers",
|
|
681
|
+
"type": "object"
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
"id": "resultName",
|
|
685
|
+
"type": "string"
|
|
686
|
+
}
|
|
687
|
+
],
|
|
688
|
+
"validation_rules": [
|
|
689
|
+
"Must have WebConnect first",
|
|
690
|
+
"method must be valid HTTP method",
|
|
691
|
+
"Body required for POST/PUT/PATCH"
|
|
692
|
+
],
|
|
693
|
+
"best_practices": ["Validate response status", "Store response for assertions"]
|
|
694
|
+
},
|
|
695
|
+
|
|
696
|
+
"SoapRequest": {
|
|
697
|
+
"apiId": "com.provar.plugins.bundled.apis.restservice.SoapRequest",
|
|
698
|
+
"description": "Make SOAP web service request",
|
|
699
|
+
"category": "Data",
|
|
700
|
+
"required_arguments": [
|
|
701
|
+
{
|
|
702
|
+
"id": "connectionName",
|
|
703
|
+
"type": "string"
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
"id": "operation",
|
|
707
|
+
"type": "string",
|
|
708
|
+
"description": "SOAP operation name"
|
|
709
|
+
}
|
|
710
|
+
],
|
|
711
|
+
"optional_arguments": [
|
|
712
|
+
{
|
|
713
|
+
"id": "requestBody",
|
|
714
|
+
"type": "string",
|
|
715
|
+
"description": "SOAP request XML"
|
|
716
|
+
},
|
|
717
|
+
{
|
|
718
|
+
"id": "headers",
|
|
719
|
+
"type": "object"
|
|
720
|
+
},
|
|
721
|
+
{
|
|
722
|
+
"id": "resultName",
|
|
723
|
+
"type": "string"
|
|
724
|
+
}
|
|
725
|
+
],
|
|
726
|
+
"validation_rules": [
|
|
727
|
+
"Must have WebConnect first",
|
|
728
|
+
"operation must be valid SOAP operation",
|
|
729
|
+
"requestBody should be well-formed XML"
|
|
730
|
+
],
|
|
731
|
+
"best_practices": ["Use REST instead of SOAP when possible", "Validate SOAP response"]
|
|
732
|
+
},
|
|
733
|
+
|
|
734
|
+
"PublishMessage": {
|
|
735
|
+
"apiId": "com.provar.plugins.bundled.apis.messaging.PublishMessage",
|
|
736
|
+
"description": "Publish message to messaging service",
|
|
737
|
+
"category": "Data",
|
|
738
|
+
"required_arguments": [
|
|
739
|
+
{
|
|
740
|
+
"id": "connectionName",
|
|
741
|
+
"type": "string"
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
"id": "message",
|
|
745
|
+
"type": "string"
|
|
746
|
+
}
|
|
747
|
+
],
|
|
748
|
+
"optional_arguments": [
|
|
749
|
+
{
|
|
750
|
+
"id": "topic",
|
|
751
|
+
"type": "string"
|
|
752
|
+
},
|
|
753
|
+
{
|
|
754
|
+
"id": "properties",
|
|
755
|
+
"type": "object"
|
|
756
|
+
}
|
|
757
|
+
],
|
|
758
|
+
"validation_rules": ["connectionName must be messaging connection", "message should be valid format"],
|
|
759
|
+
"best_practices": ["Use for async testing", "Validate message format"]
|
|
760
|
+
},
|
|
761
|
+
|
|
762
|
+
"ReceiveMessage": {
|
|
763
|
+
"apiId": "com.provar.plugins.bundled.apis.messaging.ReceiveMessage",
|
|
764
|
+
"description": "Receive message from messaging service",
|
|
765
|
+
"category": "Data",
|
|
766
|
+
"required_arguments": [
|
|
767
|
+
{
|
|
768
|
+
"id": "connectionName",
|
|
769
|
+
"type": "string"
|
|
770
|
+
}
|
|
771
|
+
],
|
|
772
|
+
"optional_arguments": [
|
|
773
|
+
{
|
|
774
|
+
"id": "timeout",
|
|
775
|
+
"type": "decimal",
|
|
776
|
+
"default": "30",
|
|
777
|
+
"description": "Timeout in seconds"
|
|
778
|
+
},
|
|
779
|
+
{
|
|
780
|
+
"id": "selector",
|
|
781
|
+
"type": "string",
|
|
782
|
+
"description": "Message selector/filter"
|
|
783
|
+
},
|
|
784
|
+
{
|
|
785
|
+
"id": "resultName",
|
|
786
|
+
"type": "string"
|
|
787
|
+
}
|
|
788
|
+
],
|
|
789
|
+
"validation_rules": ["timeout should be reasonable", "Store result for verification"],
|
|
790
|
+
"best_practices": ["Set appropriate timeout", "Use selector to filter messages"]
|
|
791
|
+
},
|
|
792
|
+
|
|
793
|
+
"SendMessage": {
|
|
794
|
+
"apiId": "com.provar.plugins.bundled.apis.messaging.SendMessage",
|
|
795
|
+
"description": "Send message to specific recipient",
|
|
796
|
+
"category": "Data",
|
|
797
|
+
"required_arguments": [
|
|
798
|
+
{
|
|
799
|
+
"id": "connectionName",
|
|
800
|
+
"type": "string"
|
|
801
|
+
},
|
|
802
|
+
{
|
|
803
|
+
"id": "message",
|
|
804
|
+
"type": "string"
|
|
805
|
+
},
|
|
806
|
+
{
|
|
807
|
+
"id": "recipient",
|
|
808
|
+
"type": "string"
|
|
809
|
+
}
|
|
810
|
+
],
|
|
811
|
+
"optional_arguments": [
|
|
812
|
+
{
|
|
813
|
+
"id": "properties",
|
|
814
|
+
"type": "object"
|
|
815
|
+
}
|
|
816
|
+
],
|
|
817
|
+
"validation_rules": ["recipient must be valid", "message format should be correct"],
|
|
818
|
+
"best_practices": ["Validate recipient exists", "Handle send failures"]
|
|
819
|
+
},
|
|
820
|
+
|
|
821
|
+
"Subscribe": {
|
|
822
|
+
"apiId": "com.provar.plugins.bundled.apis.messaging.Subscribe",
|
|
823
|
+
"description": "Subscribe to messaging topic/channel",
|
|
824
|
+
"category": "Data",
|
|
825
|
+
"required_arguments": [
|
|
826
|
+
{
|
|
827
|
+
"id": "connectionName",
|
|
828
|
+
"type": "string"
|
|
829
|
+
},
|
|
830
|
+
{
|
|
831
|
+
"id": "topic",
|
|
832
|
+
"type": "string"
|
|
833
|
+
}
|
|
834
|
+
],
|
|
835
|
+
"optional_arguments": [
|
|
836
|
+
{
|
|
837
|
+
"id": "resultName",
|
|
838
|
+
"type": "string"
|
|
839
|
+
}
|
|
840
|
+
],
|
|
841
|
+
"validation_rules": ["topic must exist", "Subscribe before ReceiveMessage"],
|
|
842
|
+
"best_practices": ["Unsubscribe in cleanup", "Handle subscription errors"]
|
|
843
|
+
}
|
|
844
|
+
},
|
|
845
|
+
|
|
846
|
+
"Design": {
|
|
847
|
+
"description": "BDD (Behavior-Driven Development) steps for Gherkin-style test organization",
|
|
848
|
+
|
|
849
|
+
"Given": {
|
|
850
|
+
"apiId": "com.provar.plugins.bundled.apis.bdd.Given",
|
|
851
|
+
"description": "BDD Given step - set up preconditions",
|
|
852
|
+
"category": "Design",
|
|
853
|
+
"required_arguments": [
|
|
854
|
+
{
|
|
855
|
+
"id": "description",
|
|
856
|
+
"type": "string",
|
|
857
|
+
"description": "Given statement description"
|
|
858
|
+
}
|
|
859
|
+
],
|
|
860
|
+
"optional_arguments": [],
|
|
861
|
+
"substeps": true,
|
|
862
|
+
"validation_rules": [
|
|
863
|
+
"Should be first BDD step in scenario",
|
|
864
|
+
"Description should start with present tense",
|
|
865
|
+
"Must contain substeps"
|
|
866
|
+
],
|
|
867
|
+
"best_practices": [
|
|
868
|
+
"Use for test setup and preconditions",
|
|
869
|
+
"Keep description clear and concise",
|
|
870
|
+
"Focus on system state, not actions"
|
|
871
|
+
]
|
|
872
|
+
},
|
|
873
|
+
|
|
874
|
+
"When": {
|
|
875
|
+
"apiId": "com.provar.plugins.bundled.apis.bdd.When",
|
|
876
|
+
"description": "BDD When step - perform actions",
|
|
877
|
+
"category": "Design",
|
|
878
|
+
"required_arguments": [
|
|
879
|
+
{
|
|
880
|
+
"id": "description",
|
|
881
|
+
"type": "string",
|
|
882
|
+
"description": "When statement description"
|
|
883
|
+
}
|
|
884
|
+
],
|
|
885
|
+
"optional_arguments": [],
|
|
886
|
+
"substeps": true,
|
|
887
|
+
"validation_rules": ["Should follow Given step", "Description should describe action", "Must contain substeps"],
|
|
888
|
+
"best_practices": [
|
|
889
|
+
"Use for test actions/operations",
|
|
890
|
+
"One When per scenario when possible",
|
|
891
|
+
"Describe user actions clearly"
|
|
892
|
+
]
|
|
893
|
+
},
|
|
894
|
+
|
|
895
|
+
"Then": {
|
|
896
|
+
"apiId": "com.provar.plugins.bundled.apis.bdd.Then",
|
|
897
|
+
"description": "BDD Then step - verify outcomes",
|
|
898
|
+
"category": "Design",
|
|
899
|
+
"required_arguments": [
|
|
900
|
+
{
|
|
901
|
+
"id": "description",
|
|
902
|
+
"type": "string",
|
|
903
|
+
"description": "Then statement description"
|
|
904
|
+
}
|
|
905
|
+
],
|
|
906
|
+
"optional_arguments": [],
|
|
907
|
+
"substeps": true,
|
|
908
|
+
"validation_rules": [
|
|
909
|
+
"Should follow When step",
|
|
910
|
+
"Description should describe expected outcome",
|
|
911
|
+
"Must contain substeps with assertions"
|
|
912
|
+
],
|
|
913
|
+
"best_practices": [
|
|
914
|
+
"Use for verification and assertions",
|
|
915
|
+
"Focus on observable outcomes",
|
|
916
|
+
"Each Then should verify one concept"
|
|
917
|
+
]
|
|
918
|
+
},
|
|
919
|
+
|
|
920
|
+
"And": {
|
|
921
|
+
"apiId": "com.provar.plugins.bundled.apis.bdd.And",
|
|
922
|
+
"description": "BDD And connector - additional steps of same type",
|
|
923
|
+
"category": "Design",
|
|
924
|
+
"required_arguments": [
|
|
925
|
+
{
|
|
926
|
+
"id": "description",
|
|
927
|
+
"type": "string",
|
|
928
|
+
"description": "And statement description"
|
|
929
|
+
}
|
|
930
|
+
],
|
|
931
|
+
"optional_arguments": [],
|
|
932
|
+
"substeps": true,
|
|
933
|
+
"validation_rules": [
|
|
934
|
+
"Should follow Given, When, or Then",
|
|
935
|
+
"Inherits context from previous step",
|
|
936
|
+
"Must contain substeps"
|
|
937
|
+
],
|
|
938
|
+
"best_practices": [
|
|
939
|
+
"Use to add additional steps of same type",
|
|
940
|
+
"Keep And chains reasonable (< 5)",
|
|
941
|
+
"Consider breaking into separate scenarios if too many Ands"
|
|
942
|
+
]
|
|
943
|
+
},
|
|
944
|
+
|
|
945
|
+
"But": {
|
|
946
|
+
"apiId": "com.provar.plugins.bundled.apis.bdd.But",
|
|
947
|
+
"description": "BDD But connector - contrasting additional steps",
|
|
948
|
+
"category": "Design",
|
|
949
|
+
"required_arguments": [
|
|
950
|
+
{
|
|
951
|
+
"id": "description",
|
|
952
|
+
"type": "string",
|
|
953
|
+
"description": "But statement description"
|
|
954
|
+
}
|
|
955
|
+
],
|
|
956
|
+
"optional_arguments": [],
|
|
957
|
+
"substeps": true,
|
|
958
|
+
"validation_rules": [
|
|
959
|
+
"Should follow Given, When, or Then",
|
|
960
|
+
"Used for contrasting conditions",
|
|
961
|
+
"Must contain substeps"
|
|
962
|
+
],
|
|
963
|
+
"best_practices": [
|
|
964
|
+
"Use for negative assertions or exceptions",
|
|
965
|
+
"Clarifies contrast with previous steps",
|
|
966
|
+
"Less common than And"
|
|
967
|
+
]
|
|
968
|
+
},
|
|
969
|
+
|
|
970
|
+
"ActualResult": {
|
|
971
|
+
"apiId": "com.provar.plugins.bundled.apis.control.ActualResult",
|
|
972
|
+
"description": "Document actual test result for manual review (Design phase step)",
|
|
973
|
+
"category": "Design",
|
|
974
|
+
"required_arguments": [
|
|
975
|
+
{
|
|
976
|
+
"id": "description",
|
|
977
|
+
"type": "string",
|
|
978
|
+
"description": "Actual result description"
|
|
979
|
+
}
|
|
980
|
+
],
|
|
981
|
+
"optional_arguments": [],
|
|
982
|
+
"substeps": true,
|
|
983
|
+
"validation_rules": ["description should be descriptive"],
|
|
984
|
+
"best_practices": [
|
|
985
|
+
"Use for exploratory testing",
|
|
986
|
+
"Document unexpected behavior",
|
|
987
|
+
"Helpful for test case design phase"
|
|
988
|
+
]
|
|
989
|
+
},
|
|
990
|
+
|
|
991
|
+
"DesignStep": {
|
|
992
|
+
"apiId": "com.provar.plugins.bundled.apis.control.DesignStep",
|
|
993
|
+
"description": "Placeholder step for test case design phase",
|
|
994
|
+
"category": "Design",
|
|
995
|
+
"required_arguments": [
|
|
996
|
+
{
|
|
997
|
+
"id": "name",
|
|
998
|
+
"type": "string",
|
|
999
|
+
"description": "Step name"
|
|
1000
|
+
},
|
|
1001
|
+
{
|
|
1002
|
+
"id": "description",
|
|
1003
|
+
"type": "string",
|
|
1004
|
+
"description": "Step description"
|
|
1005
|
+
},
|
|
1006
|
+
{
|
|
1007
|
+
"id": "expectedResult",
|
|
1008
|
+
"type": "string",
|
|
1009
|
+
"description": "Step expected result"
|
|
1010
|
+
}
|
|
1011
|
+
],
|
|
1012
|
+
"optional_arguments": [],
|
|
1013
|
+
"validation_rules": [
|
|
1014
|
+
"Should be replaced with actual implementation",
|
|
1015
|
+
"description should describe intended action"
|
|
1016
|
+
],
|
|
1017
|
+
"best_practices": [
|
|
1018
|
+
"Use during test design phase",
|
|
1019
|
+
"Replace with actual steps before execution",
|
|
1020
|
+
"Helps plan test structure"
|
|
1021
|
+
]
|
|
1022
|
+
}
|
|
1023
|
+
},
|
|
1024
|
+
|
|
1025
|
+
"ProvarAI": {
|
|
1026
|
+
"description": "AI-powered testing capabilities including Agentforce and test data generation",
|
|
1027
|
+
|
|
1028
|
+
"AIAgentSession": {
|
|
1029
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ai.AIAgentSession",
|
|
1030
|
+
"description": "Create Agentforce AI agent session",
|
|
1031
|
+
"category": "ProvarAI",
|
|
1032
|
+
"required_arguments": [
|
|
1033
|
+
{
|
|
1034
|
+
"id": "agentConnectionName",
|
|
1035
|
+
"type": "string",
|
|
1036
|
+
"description": "WebConnect connection name"
|
|
1037
|
+
},
|
|
1038
|
+
{
|
|
1039
|
+
"id": "agentId",
|
|
1040
|
+
"type": "string",
|
|
1041
|
+
"description": "Agent ID from Salesforce"
|
|
1042
|
+
},
|
|
1043
|
+
{
|
|
1044
|
+
"id": "resultName",
|
|
1045
|
+
"type": "string",
|
|
1046
|
+
"description": "Variable to store session ID"
|
|
1047
|
+
}
|
|
1048
|
+
],
|
|
1049
|
+
"optional_arguments": [
|
|
1050
|
+
{
|
|
1051
|
+
"id": "endSession",
|
|
1052
|
+
"type": "boolean",
|
|
1053
|
+
"default": "false",
|
|
1054
|
+
"description": "End session after creation"
|
|
1055
|
+
}
|
|
1056
|
+
],
|
|
1057
|
+
"validation_rules": [
|
|
1058
|
+
"Must have WebConnect step first",
|
|
1059
|
+
"agentId must be valid GUID format",
|
|
1060
|
+
"resultName should be unique"
|
|
1061
|
+
],
|
|
1062
|
+
"best_practices": [
|
|
1063
|
+
"Create session at start of agent testing",
|
|
1064
|
+
"Store session ID for subsequent conversations",
|
|
1065
|
+
"End session explicitly in cleanup"
|
|
1066
|
+
]
|
|
1067
|
+
},
|
|
1068
|
+
|
|
1069
|
+
"AIAgentConversation": {
|
|
1070
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ai.AIAgentConversation",
|
|
1071
|
+
"description": "Send message to AI agent and receive response",
|
|
1072
|
+
"category": "ProvarAI",
|
|
1073
|
+
"required_arguments": [
|
|
1074
|
+
{
|
|
1075
|
+
"id": "agentConnectionName",
|
|
1076
|
+
"type": "string"
|
|
1077
|
+
},
|
|
1078
|
+
{
|
|
1079
|
+
"id": "sessionID",
|
|
1080
|
+
"type": "variable",
|
|
1081
|
+
"description": "Session ID from AIAgentSession"
|
|
1082
|
+
},
|
|
1083
|
+
{
|
|
1084
|
+
"id": "message",
|
|
1085
|
+
"type": "string",
|
|
1086
|
+
"description": "Message to send to agent"
|
|
1087
|
+
},
|
|
1088
|
+
{
|
|
1089
|
+
"id": "resultName",
|
|
1090
|
+
"type": "string",
|
|
1091
|
+
"description": "Variable to store agent response"
|
|
1092
|
+
}
|
|
1093
|
+
],
|
|
1094
|
+
"optional_arguments": [
|
|
1095
|
+
{
|
|
1096
|
+
"id": "endSession",
|
|
1097
|
+
"type": "boolean",
|
|
1098
|
+
"default": "false"
|
|
1099
|
+
}
|
|
1100
|
+
],
|
|
1101
|
+
"validation_rules": [
|
|
1102
|
+
"Must have AIAgentSession first",
|
|
1103
|
+
"sessionID must reference valid session",
|
|
1104
|
+
"message should be meaningful test input"
|
|
1105
|
+
],
|
|
1106
|
+
"best_practices": [
|
|
1107
|
+
"Test various conversation scenarios",
|
|
1108
|
+
"Validate agent responses",
|
|
1109
|
+
"Use in ForEach for multiple messages"
|
|
1110
|
+
]
|
|
1111
|
+
},
|
|
1112
|
+
|
|
1113
|
+
"GenerateUtterance": {
|
|
1114
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ai.GenerateUtterance",
|
|
1115
|
+
"description": "Generate AI-powered test utterances for intent testing",
|
|
1116
|
+
"category": "ProvarAI",
|
|
1117
|
+
"required_arguments": [
|
|
1118
|
+
{
|
|
1119
|
+
"id": "intent",
|
|
1120
|
+
"type": "string",
|
|
1121
|
+
"description": "Intent to generate utterances for"
|
|
1122
|
+
},
|
|
1123
|
+
{
|
|
1124
|
+
"id": "resultName",
|
|
1125
|
+
"type": "string",
|
|
1126
|
+
"description": "Variable to store generated utterances"
|
|
1127
|
+
}
|
|
1128
|
+
],
|
|
1129
|
+
"optional_arguments": [
|
|
1130
|
+
{
|
|
1131
|
+
"id": "count",
|
|
1132
|
+
"type": "decimal",
|
|
1133
|
+
"default": "10",
|
|
1134
|
+
"description": "Number of utterances to generate"
|
|
1135
|
+
},
|
|
1136
|
+
{
|
|
1137
|
+
"id": "generateCsvFile",
|
|
1138
|
+
"type": "boolean",
|
|
1139
|
+
"default": "false"
|
|
1140
|
+
}
|
|
1141
|
+
],
|
|
1142
|
+
"validation_rules": ["intent should be descriptive", "count should be reasonable (1-100)"],
|
|
1143
|
+
"best_practices": [
|
|
1144
|
+
"Use for comprehensive intent testing",
|
|
1145
|
+
"Generate variety of phrasings",
|
|
1146
|
+
"Validate with IntentValidator"
|
|
1147
|
+
]
|
|
1148
|
+
},
|
|
1149
|
+
|
|
1150
|
+
"IntentValidator": {
|
|
1151
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ai.IntentValidator",
|
|
1152
|
+
"description": "Validate that utterance matches expected intent",
|
|
1153
|
+
"category": "ProvarAI",
|
|
1154
|
+
"required_arguments": [
|
|
1155
|
+
{
|
|
1156
|
+
"id": "intent",
|
|
1157
|
+
"type": "string",
|
|
1158
|
+
"description": "Expected intent"
|
|
1159
|
+
},
|
|
1160
|
+
{
|
|
1161
|
+
"id": "utterance",
|
|
1162
|
+
"type": "string",
|
|
1163
|
+
"description": "Utterance to validate"
|
|
1164
|
+
},
|
|
1165
|
+
{
|
|
1166
|
+
"id": "resultName",
|
|
1167
|
+
"type": "string",
|
|
1168
|
+
"description": "Variable to store validation result"
|
|
1169
|
+
}
|
|
1170
|
+
],
|
|
1171
|
+
"optional_arguments": [
|
|
1172
|
+
{
|
|
1173
|
+
"id": "continueOnFailure",
|
|
1174
|
+
"type": "boolean",
|
|
1175
|
+
"default": "false"
|
|
1176
|
+
}
|
|
1177
|
+
],
|
|
1178
|
+
"validation_rules": ["intent must be valid", "utterance should be test input"],
|
|
1179
|
+
"best_practices": [
|
|
1180
|
+
"Use with GenerateUtterance",
|
|
1181
|
+
"Test edge cases and variations",
|
|
1182
|
+
"Document validation failures"
|
|
1183
|
+
]
|
|
1184
|
+
},
|
|
1185
|
+
|
|
1186
|
+
"GenerateTestData": {
|
|
1187
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.generate.GenerateTestData",
|
|
1188
|
+
"description": "AI-powered test data generation",
|
|
1189
|
+
"category": "ProvarAI",
|
|
1190
|
+
"required_arguments": [
|
|
1191
|
+
{
|
|
1192
|
+
"id": "dataType",
|
|
1193
|
+
"type": "string",
|
|
1194
|
+
"description": "Type of data to generate (email, name, address, etc.)"
|
|
1195
|
+
},
|
|
1196
|
+
{
|
|
1197
|
+
"id": "resultName",
|
|
1198
|
+
"type": "string",
|
|
1199
|
+
"description": "Variable to store generated data"
|
|
1200
|
+
}
|
|
1201
|
+
],
|
|
1202
|
+
"optional_arguments": [
|
|
1203
|
+
{
|
|
1204
|
+
"id": "count",
|
|
1205
|
+
"type": "decimal",
|
|
1206
|
+
"default": "1",
|
|
1207
|
+
"description": "Number of data items to generate"
|
|
1208
|
+
}
|
|
1209
|
+
],
|
|
1210
|
+
"validation_rules": ["dataType must be supported type", "count should be reasonable"],
|
|
1211
|
+
"best_practices": [
|
|
1212
|
+
"Use for realistic test data",
|
|
1213
|
+
"Validate generated data format",
|
|
1214
|
+
"Consider data privacy requirements"
|
|
1215
|
+
]
|
|
1216
|
+
},
|
|
1217
|
+
|
|
1218
|
+
"ImageValidator": {
|
|
1219
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ai.ImageValidator",
|
|
1220
|
+
"description": "AI-powered image validation",
|
|
1221
|
+
"category": "ProvarAI",
|
|
1222
|
+
"required_arguments": [
|
|
1223
|
+
{
|
|
1224
|
+
"id": "imagePath",
|
|
1225
|
+
"type": "string",
|
|
1226
|
+
"description": "Path to image file"
|
|
1227
|
+
},
|
|
1228
|
+
{
|
|
1229
|
+
"id": "validationCriteria",
|
|
1230
|
+
"type": "string",
|
|
1231
|
+
"description": "What to validate in image"
|
|
1232
|
+
},
|
|
1233
|
+
{
|
|
1234
|
+
"id": "resultName",
|
|
1235
|
+
"type": "string"
|
|
1236
|
+
}
|
|
1237
|
+
],
|
|
1238
|
+
"optional_arguments": [
|
|
1239
|
+
{
|
|
1240
|
+
"id": "confidenceThreshold",
|
|
1241
|
+
"type": "decimal",
|
|
1242
|
+
"default": "0.8",
|
|
1243
|
+
"description": "Minimum confidence score (0.0-1.0)"
|
|
1244
|
+
}
|
|
1245
|
+
],
|
|
1246
|
+
"validation_rules": [
|
|
1247
|
+
"imagePath must be valid file path",
|
|
1248
|
+
"validationCriteria should be specific",
|
|
1249
|
+
"confidenceThreshold should be 0.0-1.0"
|
|
1250
|
+
],
|
|
1251
|
+
"best_practices": [
|
|
1252
|
+
"Use for visual regression testing",
|
|
1253
|
+
"Set appropriate confidence threshold",
|
|
1254
|
+
"Test with various image conditions"
|
|
1255
|
+
]
|
|
1256
|
+
}
|
|
1257
|
+
},
|
|
1258
|
+
|
|
1259
|
+
"ProvarLabs": {
|
|
1260
|
+
"description": "Experimental and advanced Provar features",
|
|
1261
|
+
|
|
1262
|
+
"GenerateTestCase": {
|
|
1263
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.GenerateTestCase",
|
|
1264
|
+
"description": "AI-powered test case generation from scenario",
|
|
1265
|
+
"category": "ProvarLabs",
|
|
1266
|
+
"required_arguments": [
|
|
1267
|
+
{
|
|
1268
|
+
"id": "scenario",
|
|
1269
|
+
"type": "string",
|
|
1270
|
+
"description": "Test scenario description"
|
|
1271
|
+
},
|
|
1272
|
+
{
|
|
1273
|
+
"id": "resultName",
|
|
1274
|
+
"type": "string",
|
|
1275
|
+
"description": "Variable to store generated test case"
|
|
1276
|
+
}
|
|
1277
|
+
],
|
|
1278
|
+
"optional_arguments": [
|
|
1279
|
+
{
|
|
1280
|
+
"id": "template",
|
|
1281
|
+
"type": "string",
|
|
1282
|
+
"description": "Template to use for generation"
|
|
1283
|
+
},
|
|
1284
|
+
{
|
|
1285
|
+
"id": "framework",
|
|
1286
|
+
"type": "string",
|
|
1287
|
+
"description": "Test framework (BDD, standard, etc.)"
|
|
1288
|
+
}
|
|
1289
|
+
],
|
|
1290
|
+
"validation_rules": ["scenario should be clear and detailed", "Review generated test before use"],
|
|
1291
|
+
"best_practices": [
|
|
1292
|
+
"Use for rapid test creation",
|
|
1293
|
+
"Review and refine generated tests",
|
|
1294
|
+
"Provide detailed scenarios for better results"
|
|
1295
|
+
]
|
|
1296
|
+
},
|
|
1297
|
+
|
|
1298
|
+
"PageObjectCleaner": {
|
|
1299
|
+
"apiId": "com.provar.plugins.bundled.apis.provarlabs.PageObjectCleaner",
|
|
1300
|
+
"description": "Clean up and optimize page object models",
|
|
1301
|
+
"category": "ProvarLabs",
|
|
1302
|
+
"required_arguments": [
|
|
1303
|
+
{
|
|
1304
|
+
"id": "pageObjectPath",
|
|
1305
|
+
"type": "string",
|
|
1306
|
+
"description": "Path to page object file"
|
|
1307
|
+
}
|
|
1308
|
+
],
|
|
1309
|
+
"optional_arguments": [
|
|
1310
|
+
{
|
|
1311
|
+
"id": "cleanupStrategy",
|
|
1312
|
+
"type": "string",
|
|
1313
|
+
"default": "RemoveUnused",
|
|
1314
|
+
"description": "Strategy for cleanup"
|
|
1315
|
+
},
|
|
1316
|
+
{
|
|
1317
|
+
"id": "resultName",
|
|
1318
|
+
"type": "string"
|
|
1319
|
+
}
|
|
1320
|
+
],
|
|
1321
|
+
"validation_rules": ["pageObjectPath must be valid", "Backup page objects before cleaning"],
|
|
1322
|
+
"best_practices": [
|
|
1323
|
+
"Run periodically to maintain page objects",
|
|
1324
|
+
"Review changes before committing",
|
|
1325
|
+
"Use in maintenance scripts"
|
|
1326
|
+
]
|
|
1327
|
+
}
|
|
1328
|
+
},
|
|
1329
|
+
|
|
1330
|
+
"Salesforce": {
|
|
1331
|
+
"description": "Salesforce-specific operations including Apex API, SOQL, and SF-specific features",
|
|
1332
|
+
|
|
1333
|
+
"ApexConnect": {
|
|
1334
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexConnect",
|
|
1335
|
+
"description": "Connect to Salesforce Apex API",
|
|
1336
|
+
"category": "Salesforce",
|
|
1337
|
+
"required_arguments": [
|
|
1338
|
+
{
|
|
1339
|
+
"id": "connectionName",
|
|
1340
|
+
"type": "string",
|
|
1341
|
+
"description": "Name of the Salesforce connection"
|
|
1342
|
+
}
|
|
1343
|
+
],
|
|
1344
|
+
"optional_arguments": [
|
|
1345
|
+
{
|
|
1346
|
+
"id": "connectionId",
|
|
1347
|
+
"type": "string"
|
|
1348
|
+
},
|
|
1349
|
+
{
|
|
1350
|
+
"id": "autoCleanup",
|
|
1351
|
+
"type": "boolean",
|
|
1352
|
+
"default": "true",
|
|
1353
|
+
"description": "Automatically delete created objects after test"
|
|
1354
|
+
},
|
|
1355
|
+
{
|
|
1356
|
+
"id": "enableObjectIdLogging",
|
|
1357
|
+
"type": "boolean",
|
|
1358
|
+
"default": "false"
|
|
1359
|
+
},
|
|
1360
|
+
{
|
|
1361
|
+
"id": "resultName",
|
|
1362
|
+
"type": "string"
|
|
1363
|
+
},
|
|
1364
|
+
{
|
|
1365
|
+
"id": "resultScope",
|
|
1366
|
+
"type": "string",
|
|
1367
|
+
"default": "Test"
|
|
1368
|
+
}
|
|
1369
|
+
],
|
|
1370
|
+
"validation_rules": [
|
|
1371
|
+
"Should be first step when using Apex API",
|
|
1372
|
+
"connectionName must be unique",
|
|
1373
|
+
"If autoCleanup=true, enableObjectIdLogging must be true"
|
|
1374
|
+
],
|
|
1375
|
+
"best_practices": [
|
|
1376
|
+
"Use meaningful connection names",
|
|
1377
|
+
"Set autoCleanup=true unless manual cleanup required",
|
|
1378
|
+
"Reuse connections when possible"
|
|
1379
|
+
]
|
|
1380
|
+
},
|
|
1381
|
+
|
|
1382
|
+
"ApexCreateObject": {
|
|
1383
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexCreateObject",
|
|
1384
|
+
"description": "Create Salesforce object via Apex",
|
|
1385
|
+
"category": "Salesforce",
|
|
1386
|
+
"required_arguments": [
|
|
1387
|
+
{
|
|
1388
|
+
"id": "apexConnectionName",
|
|
1389
|
+
"type": "string"
|
|
1390
|
+
},
|
|
1391
|
+
{
|
|
1392
|
+
"id": "resultIdName",
|
|
1393
|
+
"type": "string",
|
|
1394
|
+
"description": "Variable to store created object ID"
|
|
1395
|
+
},
|
|
1396
|
+
{
|
|
1397
|
+
"id": "objectType",
|
|
1398
|
+
"type": "string",
|
|
1399
|
+
"description": "Salesforce object type (Account, Contact, etc.)"
|
|
1400
|
+
}
|
|
1401
|
+
],
|
|
1402
|
+
"optional_arguments": [
|
|
1403
|
+
{
|
|
1404
|
+
"id": "fieldValues",
|
|
1405
|
+
"type": "object",
|
|
1406
|
+
"description": "Field values for the object"
|
|
1407
|
+
}
|
|
1408
|
+
],
|
|
1409
|
+
"validation_rules": [
|
|
1410
|
+
"Must have ApexConnect first",
|
|
1411
|
+
"objectType must be valid SF object",
|
|
1412
|
+
"Required fields must be provided"
|
|
1413
|
+
],
|
|
1414
|
+
"best_practices": ["Store result ID for later use", "Provide all required fields", "Use for test data setup"]
|
|
1415
|
+
},
|
|
1416
|
+
|
|
1417
|
+
"ApexReadObject": {
|
|
1418
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexReadObject",
|
|
1419
|
+
"description": "Read Salesforce object by ID",
|
|
1420
|
+
"category": "Salesforce",
|
|
1421
|
+
"required_arguments": [
|
|
1422
|
+
{
|
|
1423
|
+
"id": "apexConnectionName",
|
|
1424
|
+
"type": "string"
|
|
1425
|
+
},
|
|
1426
|
+
{
|
|
1427
|
+
"id": "objectType",
|
|
1428
|
+
"type": "string"
|
|
1429
|
+
},
|
|
1430
|
+
{
|
|
1431
|
+
"id": "resultName",
|
|
1432
|
+
"type": "string"
|
|
1433
|
+
},
|
|
1434
|
+
{
|
|
1435
|
+
"id": "objectId",
|
|
1436
|
+
"type": "variable",
|
|
1437
|
+
"description": "ID of object to read"
|
|
1438
|
+
}
|
|
1439
|
+
],
|
|
1440
|
+
"optional_arguments": [
|
|
1441
|
+
{
|
|
1442
|
+
"id": "fields",
|
|
1443
|
+
"type": "array",
|
|
1444
|
+
"description": "Fields to retrieve"
|
|
1445
|
+
}
|
|
1446
|
+
],
|
|
1447
|
+
"validation_rules": ["Must have ApexConnect first", "objectId must be valid 15 or 18 character SF ID"],
|
|
1448
|
+
"best_practices": ["Specify fields to retrieve", "Use for verification steps"]
|
|
1449
|
+
},
|
|
1450
|
+
|
|
1451
|
+
"ApexUpdateObject": {
|
|
1452
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexUpdateObject",
|
|
1453
|
+
"description": "Update Salesforce object",
|
|
1454
|
+
"category": "Salesforce",
|
|
1455
|
+
"required_arguments": [
|
|
1456
|
+
{
|
|
1457
|
+
"id": "apexConnectionName",
|
|
1458
|
+
"type": "string"
|
|
1459
|
+
},
|
|
1460
|
+
{
|
|
1461
|
+
"id": "objectType",
|
|
1462
|
+
"type": "string"
|
|
1463
|
+
},
|
|
1464
|
+
{
|
|
1465
|
+
"id": "objectId",
|
|
1466
|
+
"type": "variable"
|
|
1467
|
+
}
|
|
1468
|
+
],
|
|
1469
|
+
"optional_arguments": [
|
|
1470
|
+
{
|
|
1471
|
+
"id": "fieldValues",
|
|
1472
|
+
"type": "object"
|
|
1473
|
+
}
|
|
1474
|
+
],
|
|
1475
|
+
"validation_rules": ["Must have ApexConnect first", "objectId must be valid"],
|
|
1476
|
+
"best_practices": ["Only update fields that changed", "Verify update with ApexReadObject"]
|
|
1477
|
+
},
|
|
1478
|
+
|
|
1479
|
+
"ApexDeleteObject": {
|
|
1480
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexDeleteObject",
|
|
1481
|
+
"description": "Delete Salesforce object",
|
|
1482
|
+
"category": "Salesforce",
|
|
1483
|
+
"required_arguments": [
|
|
1484
|
+
{
|
|
1485
|
+
"id": "apexConnectionName",
|
|
1486
|
+
"type": "string"
|
|
1487
|
+
},
|
|
1488
|
+
{
|
|
1489
|
+
"id": "objectId",
|
|
1490
|
+
"type": "variable"
|
|
1491
|
+
}
|
|
1492
|
+
],
|
|
1493
|
+
"optional_arguments": [],
|
|
1494
|
+
"validation_rules": ["Must have ApexConnect first", "Use only if autoCleanup=false"],
|
|
1495
|
+
"best_practices": [
|
|
1496
|
+
"Prefer autoCleanup over manual delete",
|
|
1497
|
+
"Delete in Finally block for reliability",
|
|
1498
|
+
"Use ApexLogForCleanup for SOQL-based cleanup"
|
|
1499
|
+
]
|
|
1500
|
+
},
|
|
1501
|
+
|
|
1502
|
+
"ApexSoqlQuery": {
|
|
1503
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexSoqlQuery",
|
|
1504
|
+
"description": "Execute SOQL query",
|
|
1505
|
+
"category": "Salesforce",
|
|
1506
|
+
"required_arguments": [
|
|
1507
|
+
{
|
|
1508
|
+
"id": "apexConnectionName",
|
|
1509
|
+
"type": "string"
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
"id": "soqlQuery",
|
|
1513
|
+
"type": "string",
|
|
1514
|
+
"description": "SOQL query string"
|
|
1515
|
+
}
|
|
1516
|
+
],
|
|
1517
|
+
"optional_arguments": [
|
|
1518
|
+
{
|
|
1519
|
+
"id": "resultListName",
|
|
1520
|
+
"type": "string",
|
|
1521
|
+
"description": "Variable to store query results"
|
|
1522
|
+
},
|
|
1523
|
+
{
|
|
1524
|
+
"id": "resultScope",
|
|
1525
|
+
"type": "string",
|
|
1526
|
+
"default": "Test"
|
|
1527
|
+
}
|
|
1528
|
+
],
|
|
1529
|
+
"validation_rules": [
|
|
1530
|
+
"Must have ApexConnect first",
|
|
1531
|
+
"SOQL must have SELECT and FROM clauses",
|
|
1532
|
+
"Always retrieve Id field",
|
|
1533
|
+
"Use {VariableName[1].FieldName} syntax (1-indexed)"
|
|
1534
|
+
],
|
|
1535
|
+
"best_practices": [
|
|
1536
|
+
"Always select Id and Name fields",
|
|
1537
|
+
"Use WHERE clause to limit results",
|
|
1538
|
+
"Store results for later use",
|
|
1539
|
+
"Use ORDER BY for predictable results"
|
|
1540
|
+
]
|
|
1541
|
+
},
|
|
1542
|
+
|
|
1543
|
+
"ApexExecute": {
|
|
1544
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexExecute",
|
|
1545
|
+
"description": "Execute anonymous Apex code",
|
|
1546
|
+
"category": "Salesforce",
|
|
1547
|
+
"required_arguments": [
|
|
1548
|
+
{
|
|
1549
|
+
"id": "apexConnectionName",
|
|
1550
|
+
"type": "string"
|
|
1551
|
+
},
|
|
1552
|
+
{
|
|
1553
|
+
"id": "apexBlock",
|
|
1554
|
+
"type": "string",
|
|
1555
|
+
"description": "Apex code to execute"
|
|
1556
|
+
}
|
|
1557
|
+
],
|
|
1558
|
+
"optional_arguments": [
|
|
1559
|
+
{
|
|
1560
|
+
"id": "results",
|
|
1561
|
+
"type": "string",
|
|
1562
|
+
"description": "Variable to store execution results"
|
|
1563
|
+
}
|
|
1564
|
+
],
|
|
1565
|
+
"validation_rules": ["Must have ApexConnect first", "apexBlock must be valid Apex syntax"],
|
|
1566
|
+
"best_practices": [
|
|
1567
|
+
"Use for complex operations not available via API",
|
|
1568
|
+
"Keep Apex code simple",
|
|
1569
|
+
"Test Apex code in Developer Console first"
|
|
1570
|
+
]
|
|
1571
|
+
},
|
|
1572
|
+
|
|
1573
|
+
"ApexBulk": {
|
|
1574
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexBulk",
|
|
1575
|
+
"description": "Execute bulk Apex operations",
|
|
1576
|
+
"category": "Salesforce",
|
|
1577
|
+
"required_arguments": [
|
|
1578
|
+
{
|
|
1579
|
+
"id": "apexConnectionName",
|
|
1580
|
+
"type": "string"
|
|
1581
|
+
},
|
|
1582
|
+
{
|
|
1583
|
+
"id": "objectType",
|
|
1584
|
+
"type": "string"
|
|
1585
|
+
},
|
|
1586
|
+
{
|
|
1587
|
+
"id": "operation",
|
|
1588
|
+
"type": "string",
|
|
1589
|
+
"description": "Bulk operation (insert, update, delete, etc.)"
|
|
1590
|
+
}
|
|
1591
|
+
],
|
|
1592
|
+
"optional_arguments": [
|
|
1593
|
+
{
|
|
1594
|
+
"id": "records",
|
|
1595
|
+
"type": "array",
|
|
1596
|
+
"description": "Records to process"
|
|
1597
|
+
},
|
|
1598
|
+
{
|
|
1599
|
+
"id": "resultName",
|
|
1600
|
+
"type": "string"
|
|
1601
|
+
}
|
|
1602
|
+
],
|
|
1603
|
+
"validation_rules": [
|
|
1604
|
+
"Must have ApexConnect first",
|
|
1605
|
+
"operation must be valid bulk operation",
|
|
1606
|
+
"records must be valid for operation"
|
|
1607
|
+
],
|
|
1608
|
+
"best_practices": [
|
|
1609
|
+
"Use for large data volumes (> 200 records)",
|
|
1610
|
+
"Handle bulk API limits",
|
|
1611
|
+
"Monitor bulk job status"
|
|
1612
|
+
]
|
|
1613
|
+
},
|
|
1614
|
+
|
|
1615
|
+
"ApexApproveWorkItem": {
|
|
1616
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexApproveWorkItem",
|
|
1617
|
+
"description": "Approve Salesforce approval work item",
|
|
1618
|
+
"category": "Salesforce",
|
|
1619
|
+
"required_arguments": [
|
|
1620
|
+
{
|
|
1621
|
+
"id": "apexConnectionName",
|
|
1622
|
+
"type": "string"
|
|
1623
|
+
},
|
|
1624
|
+
{
|
|
1625
|
+
"id": "workItemId",
|
|
1626
|
+
"type": "string"
|
|
1627
|
+
}
|
|
1628
|
+
],
|
|
1629
|
+
"optional_arguments": [
|
|
1630
|
+
{
|
|
1631
|
+
"id": "comments",
|
|
1632
|
+
"type": "string"
|
|
1633
|
+
}
|
|
1634
|
+
],
|
|
1635
|
+
"validation_rules": ["Must have ApexConnect first", "workItemId must be valid"],
|
|
1636
|
+
"best_practices": ["Add approval comments", "Verify approval status after"]
|
|
1637
|
+
},
|
|
1638
|
+
|
|
1639
|
+
"SubmitForApproval": {
|
|
1640
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexSubmitForApproval",
|
|
1641
|
+
"description": "Submit record for approval",
|
|
1642
|
+
"category": "Salesforce",
|
|
1643
|
+
"required_arguments": [
|
|
1644
|
+
{
|
|
1645
|
+
"id": "apexConnectionName",
|
|
1646
|
+
"type": "string"
|
|
1647
|
+
},
|
|
1648
|
+
{
|
|
1649
|
+
"id": "objectId",
|
|
1650
|
+
"type": "variable"
|
|
1651
|
+
}
|
|
1652
|
+
],
|
|
1653
|
+
"optional_arguments": [
|
|
1654
|
+
{
|
|
1655
|
+
"id": "comments",
|
|
1656
|
+
"type": "string"
|
|
1657
|
+
},
|
|
1658
|
+
{
|
|
1659
|
+
"id": "processName",
|
|
1660
|
+
"type": "string"
|
|
1661
|
+
}
|
|
1662
|
+
],
|
|
1663
|
+
"validation_rules": ["Must have ApexConnect first", "Object must have approval process"],
|
|
1664
|
+
"best_practices": ["Verify record meets approval criteria", "Track approval process status"]
|
|
1665
|
+
},
|
|
1666
|
+
|
|
1667
|
+
"ConvertLead": {
|
|
1668
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexConvertLead",
|
|
1669
|
+
"description": "Convert Salesforce lead",
|
|
1670
|
+
"category": "Salesforce",
|
|
1671
|
+
"required_arguments": [
|
|
1672
|
+
{
|
|
1673
|
+
"id": "apexConnectionName",
|
|
1674
|
+
"type": "string"
|
|
1675
|
+
},
|
|
1676
|
+
{
|
|
1677
|
+
"id": "leadId",
|
|
1678
|
+
"type": "variable"
|
|
1679
|
+
},
|
|
1680
|
+
{
|
|
1681
|
+
"id": "convertedStatus",
|
|
1682
|
+
"type": "string"
|
|
1683
|
+
}
|
|
1684
|
+
],
|
|
1685
|
+
"optional_arguments": [
|
|
1686
|
+
{
|
|
1687
|
+
"id": "contactId",
|
|
1688
|
+
"type": "variable"
|
|
1689
|
+
},
|
|
1690
|
+
{
|
|
1691
|
+
"id": "accountId",
|
|
1692
|
+
"type": "variable"
|
|
1693
|
+
},
|
|
1694
|
+
{
|
|
1695
|
+
"id": "ownerId",
|
|
1696
|
+
"type": "variable"
|
|
1697
|
+
},
|
|
1698
|
+
{
|
|
1699
|
+
"id": "createOpportunity",
|
|
1700
|
+
"type": "boolean",
|
|
1701
|
+
"default": "false"
|
|
1702
|
+
},
|
|
1703
|
+
{
|
|
1704
|
+
"id": "opportunityName",
|
|
1705
|
+
"type": "string"
|
|
1706
|
+
}
|
|
1707
|
+
],
|
|
1708
|
+
"validation_rules": ["Must have ApexConnect first", "convertedStatus must be valid lead status"],
|
|
1709
|
+
"best_practices": ["Verify lead meets conversion criteria", "Store converted IDs for verification"]
|
|
1710
|
+
},
|
|
1711
|
+
|
|
1712
|
+
"ExtractSalesforceLayout": {
|
|
1713
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexExtractLayout",
|
|
1714
|
+
"description": "Extract Salesforce page layout for comparison",
|
|
1715
|
+
"category": "Salesforce",
|
|
1716
|
+
"required_arguments": [
|
|
1717
|
+
{
|
|
1718
|
+
"id": "apexConnectionName",
|
|
1719
|
+
"type": "string"
|
|
1720
|
+
},
|
|
1721
|
+
{
|
|
1722
|
+
"id": "objectName",
|
|
1723
|
+
"type": "string"
|
|
1724
|
+
}
|
|
1725
|
+
],
|
|
1726
|
+
"optional_arguments": [
|
|
1727
|
+
{
|
|
1728
|
+
"id": "extractRecordPageLayout",
|
|
1729
|
+
"type": "boolean",
|
|
1730
|
+
"default": "true"
|
|
1731
|
+
},
|
|
1732
|
+
{
|
|
1733
|
+
"id": "extractDynamicFormLayout",
|
|
1734
|
+
"type": "boolean",
|
|
1735
|
+
"default": "false"
|
|
1736
|
+
},
|
|
1737
|
+
{
|
|
1738
|
+
"id": "dataUrl",
|
|
1739
|
+
"type": "string",
|
|
1740
|
+
"description": "File path to save layout"
|
|
1741
|
+
}
|
|
1742
|
+
],
|
|
1743
|
+
"validation_rules": ["Must have ApexConnect first", "objectName must be valid"],
|
|
1744
|
+
"best_practices": ["Use for layout validation tests", "Save layouts for regression testing"]
|
|
1745
|
+
},
|
|
1746
|
+
|
|
1747
|
+
"AssertSalesforceLayout": {
|
|
1748
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexAssertLayout",
|
|
1749
|
+
"description": "Assert Salesforce page layout matches expected",
|
|
1750
|
+
"category": "Salesforce",
|
|
1751
|
+
"required_arguments": [
|
|
1752
|
+
{
|
|
1753
|
+
"id": "apexConnectionName",
|
|
1754
|
+
"type": "string"
|
|
1755
|
+
},
|
|
1756
|
+
{
|
|
1757
|
+
"id": "objectName",
|
|
1758
|
+
"type": "string"
|
|
1759
|
+
},
|
|
1760
|
+
{
|
|
1761
|
+
"id": "dataUrl",
|
|
1762
|
+
"type": "string",
|
|
1763
|
+
"description": "Path to expected layout file"
|
|
1764
|
+
}
|
|
1765
|
+
],
|
|
1766
|
+
"optional_arguments": [
|
|
1767
|
+
{
|
|
1768
|
+
"id": "extractRecordPageLayout",
|
|
1769
|
+
"type": "boolean",
|
|
1770
|
+
"default": "true"
|
|
1771
|
+
},
|
|
1772
|
+
{
|
|
1773
|
+
"id": "extractDynamicFormLayout",
|
|
1774
|
+
"type": "boolean",
|
|
1775
|
+
"default": "false"
|
|
1776
|
+
}
|
|
1777
|
+
],
|
|
1778
|
+
"validation_rules": [
|
|
1779
|
+
"Must have ApexConnect first",
|
|
1780
|
+
"Must have ExtractSalesforceLayout first",
|
|
1781
|
+
"dataUrl must point to valid layout file"
|
|
1782
|
+
],
|
|
1783
|
+
"best_practices": ["Use for regression testing", "Update baseline after intentional changes"]
|
|
1784
|
+
},
|
|
1785
|
+
|
|
1786
|
+
"LogForCleanup": {
|
|
1787
|
+
"apiId": "com.provar.plugins.forcedotcom.core.testapis.ApexLogForCleanup",
|
|
1788
|
+
"description": "Log SOQL query results for cleanup",
|
|
1789
|
+
"category": "Salesforce",
|
|
1790
|
+
"required_arguments": [
|
|
1791
|
+
{
|
|
1792
|
+
"id": "apexConnectionName",
|
|
1793
|
+
"type": "string"
|
|
1794
|
+
},
|
|
1795
|
+
{
|
|
1796
|
+
"id": "selector",
|
|
1797
|
+
"type": "string",
|
|
1798
|
+
"description": "SOQL query to select records for cleanup"
|
|
1799
|
+
}
|
|
1800
|
+
],
|
|
1801
|
+
"optional_arguments": [
|
|
1802
|
+
{
|
|
1803
|
+
"id": "maxMatches",
|
|
1804
|
+
"type": "decimal",
|
|
1805
|
+
"description": "Maximum records to log"
|
|
1806
|
+
}
|
|
1807
|
+
],
|
|
1808
|
+
"validation_rules": [
|
|
1809
|
+
"Must have ApexConnect first with enableObjectIdLogging=true",
|
|
1810
|
+
"selector must be valid SOQL",
|
|
1811
|
+
"Use ORDER BY CreatedDate DESC LIMIT 1 for latest record"
|
|
1812
|
+
],
|
|
1813
|
+
"best_practices": [
|
|
1814
|
+
"Use for dynamic cleanup",
|
|
1815
|
+
"Add after create operations",
|
|
1816
|
+
"Use with ORDER BY for predictable cleanup"
|
|
1817
|
+
]
|
|
1818
|
+
}
|
|
1819
|
+
},
|
|
1820
|
+
|
|
1821
|
+
"UI": {
|
|
1822
|
+
"description": "User interface automation steps for Salesforce and web applications",
|
|
1823
|
+
|
|
1824
|
+
"UiConnect": {
|
|
1825
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.UiConnect",
|
|
1826
|
+
"description": "Connect to Salesforce UI or web application",
|
|
1827
|
+
"category": "UI",
|
|
1828
|
+
"required_arguments": [
|
|
1829
|
+
{
|
|
1830
|
+
"id": "connectionName",
|
|
1831
|
+
"type": "string"
|
|
1832
|
+
}
|
|
1833
|
+
],
|
|
1834
|
+
"optional_arguments": [
|
|
1835
|
+
{
|
|
1836
|
+
"id": "connectionId",
|
|
1837
|
+
"type": "string"
|
|
1838
|
+
},
|
|
1839
|
+
{
|
|
1840
|
+
"id": "uiApplicationName",
|
|
1841
|
+
"type": "string",
|
|
1842
|
+
"default": "LightningSales"
|
|
1843
|
+
},
|
|
1844
|
+
{
|
|
1845
|
+
"id": "reuseConnectionName",
|
|
1846
|
+
"type": "string"
|
|
1847
|
+
},
|
|
1848
|
+
{
|
|
1849
|
+
"id": "closeAllOtherTabs",
|
|
1850
|
+
"type": "boolean",
|
|
1851
|
+
"default": "true"
|
|
1852
|
+
},
|
|
1853
|
+
{
|
|
1854
|
+
"id": "privateBrowsingMode",
|
|
1855
|
+
"type": "boolean",
|
|
1856
|
+
"default": "false"
|
|
1857
|
+
},
|
|
1858
|
+
{
|
|
1859
|
+
"id": "webBrowser",
|
|
1860
|
+
"type": "string",
|
|
1861
|
+
"default": "Chrome_Headless"
|
|
1862
|
+
}
|
|
1863
|
+
],
|
|
1864
|
+
"validation_rules": ["Should be first UI step", "connectionName must be unique"],
|
|
1865
|
+
"best_practices": [
|
|
1866
|
+
"Use headless mode for CI/CD",
|
|
1867
|
+
"Reuse connections when possible",
|
|
1868
|
+
"Close tabs for clean state"
|
|
1869
|
+
]
|
|
1870
|
+
},
|
|
1871
|
+
|
|
1872
|
+
"MSDynamics365Connect": {
|
|
1873
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-dynamics365",
|
|
1874
|
+
"description": "Connect to a Microsoft Dynamics 365 application via the NitroX connector. Use INSTEAD of UiConnect when targeting Microsoft Dynamics 365.",
|
|
1875
|
+
"category": "UI",
|
|
1876
|
+
"required_arguments": [
|
|
1877
|
+
{
|
|
1878
|
+
"id": "connectionName",
|
|
1879
|
+
"type": "string",
|
|
1880
|
+
"description": "Provar connection profile name configured for the Dynamics 365 environment"
|
|
1881
|
+
},
|
|
1882
|
+
{
|
|
1883
|
+
"id": "resultName",
|
|
1884
|
+
"type": "string",
|
|
1885
|
+
"description": "Variable name that downstream UI steps reference via uiConnectionName"
|
|
1886
|
+
},
|
|
1887
|
+
{
|
|
1888
|
+
"id": "resultScope",
|
|
1889
|
+
"type": "string",
|
|
1890
|
+
"default": "Test",
|
|
1891
|
+
"description": "Scope of the connection result (typically 'Test')"
|
|
1892
|
+
},
|
|
1893
|
+
{
|
|
1894
|
+
"id": "appName",
|
|
1895
|
+
"type": "string",
|
|
1896
|
+
"description": "Dynamics 365 app to open after sign-in (e.g., 'Sales Hub', 'Customer Service Hub'). May be left empty if declared as a runtime-bound <apiParam name=\"appName\"> in <generatedParameters>."
|
|
1897
|
+
}
|
|
1898
|
+
],
|
|
1899
|
+
"optional_arguments": [
|
|
1900
|
+
{ "id": "reuseConnectionName", "type": "string" },
|
|
1901
|
+
{ "id": "privateBrowsingMode", "type": "boolean", "default": "false" },
|
|
1902
|
+
{ "id": "webBrowser", "type": "string", "default": "Chrome_Headless" }
|
|
1903
|
+
],
|
|
1904
|
+
"validation_rules": [
|
|
1905
|
+
"Use INSTEAD of UiConnect/ApexConnect for Microsoft Dynamics 365 targets",
|
|
1906
|
+
"resultName is required so downstream UI steps can set uiConnectionName",
|
|
1907
|
+
"appName must be populated OR declared as a runtime parameter in <generatedParameters> (data-driven pattern)"
|
|
1908
|
+
],
|
|
1909
|
+
"best_practices": [
|
|
1910
|
+
"Set appName to the target model-driven app to land directly on the right surface",
|
|
1911
|
+
"Declare appName in <generatedParameters> when the value is supplied at runtime",
|
|
1912
|
+
"Use headless mode for CI/CD"
|
|
1913
|
+
]
|
|
1914
|
+
},
|
|
1915
|
+
|
|
1916
|
+
"MSDataverseConnect": {
|
|
1917
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-dataverse",
|
|
1918
|
+
"description": "Connect to a Microsoft Dataverse environment via the NitroX connector. Use INSTEAD of UiConnect when targeting Microsoft Dataverse.",
|
|
1919
|
+
"category": "UI",
|
|
1920
|
+
"required_arguments": [
|
|
1921
|
+
{
|
|
1922
|
+
"id": "connectionName",
|
|
1923
|
+
"type": "string",
|
|
1924
|
+
"description": "Provar connection profile name configured for the Dataverse environment"
|
|
1925
|
+
},
|
|
1926
|
+
{
|
|
1927
|
+
"id": "resultName",
|
|
1928
|
+
"type": "string",
|
|
1929
|
+
"description": "Variable name that downstream UI steps reference via uiConnectionName"
|
|
1930
|
+
},
|
|
1931
|
+
{
|
|
1932
|
+
"id": "resultScope",
|
|
1933
|
+
"type": "string",
|
|
1934
|
+
"default": "Test",
|
|
1935
|
+
"description": "Scope of the connection result (typically 'Test')"
|
|
1936
|
+
}
|
|
1937
|
+
],
|
|
1938
|
+
"optional_arguments": [
|
|
1939
|
+
{ "id": "reuseConnectionName", "type": "string" },
|
|
1940
|
+
{ "id": "privateBrowsingMode", "type": "boolean", "default": "false" },
|
|
1941
|
+
{ "id": "webBrowser", "type": "string", "default": "Chrome_Headless" }
|
|
1942
|
+
],
|
|
1943
|
+
"validation_rules": [
|
|
1944
|
+
"Use INSTEAD of UiConnect/ApexConnect for Microsoft Dataverse targets",
|
|
1945
|
+
"resultName is required so downstream UI steps can set uiConnectionName",
|
|
1946
|
+
"Has no variant-specific arguments; <generatedParameters/> stays empty"
|
|
1947
|
+
],
|
|
1948
|
+
"best_practices": [
|
|
1949
|
+
"Reuse the connection across the test rather than reconnecting",
|
|
1950
|
+
"Use headless mode for CI/CD"
|
|
1951
|
+
]
|
|
1952
|
+
},
|
|
1953
|
+
|
|
1954
|
+
"MSPowerAppConnect": {
|
|
1955
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-powerapp",
|
|
1956
|
+
"description": "Connect to a Microsoft Power App via the NitroX connector. Use INSTEAD of UiConnect when targeting Microsoft Power Apps.",
|
|
1957
|
+
"category": "UI",
|
|
1958
|
+
"required_arguments": [
|
|
1959
|
+
{
|
|
1960
|
+
"id": "connectionName",
|
|
1961
|
+
"type": "string",
|
|
1962
|
+
"description": "Provar connection profile name configured for the Power Apps tenant"
|
|
1963
|
+
},
|
|
1964
|
+
{
|
|
1965
|
+
"id": "resultName",
|
|
1966
|
+
"type": "string",
|
|
1967
|
+
"description": "Variable name that downstream UI steps reference via uiConnectionName"
|
|
1968
|
+
},
|
|
1969
|
+
{
|
|
1970
|
+
"id": "resultScope",
|
|
1971
|
+
"type": "string",
|
|
1972
|
+
"default": "Test",
|
|
1973
|
+
"description": "Scope of the connection result (typically 'Test')"
|
|
1974
|
+
},
|
|
1975
|
+
{
|
|
1976
|
+
"id": "powerAppName",
|
|
1977
|
+
"type": "string",
|
|
1978
|
+
"description": "Display name of the target Power App. May be left empty if declared as a runtime-bound <apiParam name=\"powerAppName\"> in <generatedParameters>."
|
|
1979
|
+
}
|
|
1980
|
+
],
|
|
1981
|
+
"optional_arguments": [
|
|
1982
|
+
{ "id": "reuseConnectionName", "type": "string" },
|
|
1983
|
+
{ "id": "privateBrowsingMode", "type": "boolean", "default": "false" },
|
|
1984
|
+
{ "id": "webBrowser", "type": "string", "default": "Chrome_Headless" }
|
|
1985
|
+
],
|
|
1986
|
+
"validation_rules": [
|
|
1987
|
+
"Use INSTEAD of UiConnect/ApexConnect for Microsoft Power Apps targets",
|
|
1988
|
+
"resultName is required so downstream UI steps can set uiConnectionName",
|
|
1989
|
+
"powerAppName must be populated OR declared as a runtime parameter in <generatedParameters> (data-driven pattern)"
|
|
1990
|
+
],
|
|
1991
|
+
"best_practices": [
|
|
1992
|
+
"Set powerAppName to the exact display name from the Power Apps maker portal",
|
|
1993
|
+
"Declare powerAppName in <generatedParameters> when the value is supplied at runtime",
|
|
1994
|
+
"Use headless mode for CI/CD"
|
|
1995
|
+
]
|
|
1996
|
+
},
|
|
1997
|
+
|
|
1998
|
+
"MSPowerPageConnect": {
|
|
1999
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-powerpage",
|
|
2000
|
+
"description": "Connect to a Microsoft Power Page via the NitroX connector. Use INSTEAD of UiConnect when targeting Microsoft Power Pages.",
|
|
2001
|
+
"category": "UI",
|
|
2002
|
+
"required_arguments": [
|
|
2003
|
+
{
|
|
2004
|
+
"id": "connectionName",
|
|
2005
|
+
"type": "string",
|
|
2006
|
+
"description": "Provar connection profile name configured for the Power Pages tenant"
|
|
2007
|
+
},
|
|
2008
|
+
{
|
|
2009
|
+
"id": "resultName",
|
|
2010
|
+
"type": "string",
|
|
2011
|
+
"description": "Variable name that downstream UI steps reference via uiConnectionName"
|
|
2012
|
+
},
|
|
2013
|
+
{
|
|
2014
|
+
"id": "resultScope",
|
|
2015
|
+
"type": "string",
|
|
2016
|
+
"default": "Test",
|
|
2017
|
+
"description": "Scope of the connection result (typically 'Test')"
|
|
2018
|
+
},
|
|
2019
|
+
{
|
|
2020
|
+
"id": "environment",
|
|
2021
|
+
"type": "string",
|
|
2022
|
+
"description": "Power Platform environment that hosts the page. May be left empty if declared as a runtime-bound <apiParam name=\"environment\"> in <generatedParameters>."
|
|
2023
|
+
},
|
|
2024
|
+
{
|
|
2025
|
+
"id": "powerPageName",
|
|
2026
|
+
"type": "string",
|
|
2027
|
+
"description": "Display name of the target Power Page site. May be left empty if declared as a runtime-bound <apiParam name=\"powerPageName\"> in <generatedParameters>."
|
|
2028
|
+
}
|
|
2029
|
+
],
|
|
2030
|
+
"optional_arguments": [
|
|
2031
|
+
{ "id": "reuseConnectionName", "type": "string" },
|
|
2032
|
+
{ "id": "privateBrowsingMode", "type": "boolean", "default": "false" },
|
|
2033
|
+
{ "id": "webBrowser", "type": "string", "default": "Chrome_Headless" }
|
|
2034
|
+
],
|
|
2035
|
+
"validation_rules": [
|
|
2036
|
+
"Use INSTEAD of UiConnect/ApexConnect for Microsoft Power Pages targets",
|
|
2037
|
+
"resultName is required so downstream UI steps can set uiConnectionName",
|
|
2038
|
+
"environment and powerPageName must each be populated OR declared as runtime parameters in <generatedParameters>"
|
|
2039
|
+
],
|
|
2040
|
+
"best_practices": [
|
|
2041
|
+
"Set environment and powerPageName so the test lands on the right Power Page site",
|
|
2042
|
+
"Declare environment / powerPageName in <generatedParameters> when supplied at runtime",
|
|
2043
|
+
"Use headless mode for CI/CD"
|
|
2044
|
+
]
|
|
2045
|
+
},
|
|
2046
|
+
|
|
2047
|
+
"UiWithScreen": {
|
|
2048
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.UiWithScreen",
|
|
2049
|
+
"description": "Navigate to and interact with Salesforce screen",
|
|
2050
|
+
"category": "UI",
|
|
2051
|
+
"required_arguments": [
|
|
2052
|
+
{
|
|
2053
|
+
"id": "screenName",
|
|
2054
|
+
"type": "string",
|
|
2055
|
+
"description": "Screen name (e.g., 'Account Home', 'Account New')"
|
|
2056
|
+
},
|
|
2057
|
+
{
|
|
2058
|
+
"id": "uiConnectionName",
|
|
2059
|
+
"type": "string"
|
|
2060
|
+
},
|
|
2061
|
+
{
|
|
2062
|
+
"id": "target",
|
|
2063
|
+
"type": "uiTarget",
|
|
2064
|
+
"description": "Screen target (sf:ui:target?object=X&action=Y)"
|
|
2065
|
+
}
|
|
2066
|
+
],
|
|
2067
|
+
"optional_arguments": [
|
|
2068
|
+
{
|
|
2069
|
+
"id": "navigate",
|
|
2070
|
+
"type": "string",
|
|
2071
|
+
"default": "Always",
|
|
2072
|
+
"description": "Always for first screen, Dont for subsequent"
|
|
2073
|
+
},
|
|
2074
|
+
{
|
|
2075
|
+
"id": "targetDescription",
|
|
2076
|
+
"type": "string"
|
|
2077
|
+
},
|
|
2078
|
+
{
|
|
2079
|
+
"id": "windowSelection",
|
|
2080
|
+
"type": "string",
|
|
2081
|
+
"default": "Default"
|
|
2082
|
+
},
|
|
2083
|
+
{
|
|
2084
|
+
"id": "windowSize",
|
|
2085
|
+
"type": "string",
|
|
2086
|
+
"default": "Default"
|
|
2087
|
+
},
|
|
2088
|
+
{
|
|
2089
|
+
"id": "sfUiTargetResultName",
|
|
2090
|
+
"type": "string",
|
|
2091
|
+
"description": "Store record ID (required for New screens)"
|
|
2092
|
+
},
|
|
2093
|
+
{
|
|
2094
|
+
"id": "sfUiTargetResultScope",
|
|
2095
|
+
"type": "string",
|
|
2096
|
+
"default": "Test"
|
|
2097
|
+
},
|
|
2098
|
+
{
|
|
2099
|
+
"id": "sfUiTargetObjectId",
|
|
2100
|
+
"type": "variable",
|
|
2101
|
+
"description": "Record ID to edit/view (required for Edit/View screens when navigate=Always)"
|
|
2102
|
+
}
|
|
2103
|
+
],
|
|
2104
|
+
"substeps": true,
|
|
2105
|
+
"naming_convention": "On {ObjectName} {ScreenType} screen",
|
|
2106
|
+
"validation_rules": [
|
|
2107
|
+
"Must have UiConnect first",
|
|
2108
|
+
"First screen: navigate=Always",
|
|
2109
|
+
"Subsequent screens: navigate=Dont",
|
|
2110
|
+
"New screens: must store sfUiTargetResultName",
|
|
2111
|
+
"Edit/View screens with navigate=Always: must have sfUiTargetObjectId"
|
|
2112
|
+
],
|
|
2113
|
+
"best_practices": [
|
|
2114
|
+
"Follow naming convention",
|
|
2115
|
+
"Store record IDs from New screens",
|
|
2116
|
+
"Group related UI actions in substeps"
|
|
2117
|
+
]
|
|
2118
|
+
},
|
|
2119
|
+
|
|
2120
|
+
"UiDoAction": {
|
|
2121
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.UiDoAction",
|
|
2122
|
+
"description": "Perform UI action (click, set, select, etc.)",
|
|
2123
|
+
"category": "UI",
|
|
2124
|
+
"required_arguments": [
|
|
2125
|
+
{
|
|
2126
|
+
"id": "locator",
|
|
2127
|
+
"type": "uiLocator",
|
|
2128
|
+
"description": "UI element locator"
|
|
2129
|
+
},
|
|
2130
|
+
{
|
|
2131
|
+
"id": "interaction",
|
|
2132
|
+
"type": "uiInteraction",
|
|
2133
|
+
"description": "Interaction type (click, set, check, etc.)"
|
|
2134
|
+
}
|
|
2135
|
+
],
|
|
2136
|
+
"optional_arguments": [
|
|
2137
|
+
{
|
|
2138
|
+
"id": "value",
|
|
2139
|
+
"type": "value",
|
|
2140
|
+
"description": "Value for set/select interactions"
|
|
2141
|
+
},
|
|
2142
|
+
{
|
|
2143
|
+
"id": "captureBefore",
|
|
2144
|
+
"type": "boolean",
|
|
2145
|
+
"default": "false"
|
|
2146
|
+
},
|
|
2147
|
+
{
|
|
2148
|
+
"id": "captureAfter",
|
|
2149
|
+
"type": "boolean",
|
|
2150
|
+
"default": "false"
|
|
2151
|
+
}
|
|
2152
|
+
],
|
|
2153
|
+
"parent_required": "UiWithScreen",
|
|
2154
|
+
"validation_rules": [
|
|
2155
|
+
"Must be inside UiWithScreen substeps",
|
|
2156
|
+
"value required for set/select interactions",
|
|
2157
|
+
"Picklist: use ui:interaction?name=set",
|
|
2158
|
+
"Lead Conversion buttons: MUST use name=submitConvert and action=submitConvert (NOT Convert, ConvertButton, or action=convert)",
|
|
2159
|
+
"Dialog fields (e.g., OpportunityName): MUST bind to the TARGET object (object=Opportunity with field=name, NOT object=Lead with field=OpportunityName)"
|
|
2160
|
+
],
|
|
2161
|
+
"locator_format": {
|
|
2162
|
+
"description": "uiLocator URI format for UiDoAction steps",
|
|
2163
|
+
"action_buttons": {
|
|
2164
|
+
"format": "ui:locator?name=<actionName>&binding=sf%3Aui%3Abinding%3Aobject%3Faction%3D<actionName>",
|
|
2165
|
+
"examples": {
|
|
2166
|
+
"lead_convert_button": "ui:locator?name=submitConvert&binding=sf%3Aui%3Abinding%3Aobject%3Faction%3DsubmitConvert",
|
|
2167
|
+
"save_button": "ui:locator?name=save&binding=sf%3Aui%3Abinding%3Aobject%3Fobject%3DAccount%26action%3Dsave",
|
|
2168
|
+
"new_button": "ui:locator?name=New&binding=sf%3Aui%3Abinding%3Aobject%3Fobject%3DAccount%26action%3DNew",
|
|
2169
|
+
"continue_button_record_type_selection": "ui:locator?name=save&path=selectRecordType",
|
|
2170
|
+
"cancel_button": "ui:locator?name=cancel&binding=sf%3Aui%3Abinding%3Aobject%3Faction%3Dcancel",
|
|
2171
|
+
"record_type_field": "ui:locator?name=RecordType&binding=sf%3Aui%3Abinding%3Aobject%3Fobject%3D%7BtargetUrl%3Aobject%7D%26field%3DRecordTypeId"
|
|
2172
|
+
}
|
|
2173
|
+
},
|
|
2174
|
+
"dialog_fields": {
|
|
2175
|
+
"format": "ui:locator?name=<fieldName>&binding=sf%3Aui%3Abinding%3Aobject%3Ffield%3D<fieldName>%26object%3D<targetObject>",
|
|
2176
|
+
"examples": {
|
|
2177
|
+
"opportunity_name_in_lead_convert": "ui:locator?name=name&binding=sf%3Aui%3Abinding%3Aobject%3Ffield%3Dname%26object%3DOpportunity"
|
|
2178
|
+
},
|
|
2179
|
+
"note": "Dialog fields reference the TARGET object being created, not the source object"
|
|
2180
|
+
}
|
|
2181
|
+
},
|
|
2182
|
+
"best_practices": [
|
|
2183
|
+
"Use descriptive locator names",
|
|
2184
|
+
"Validate values before setting",
|
|
2185
|
+
"Add screenshots for failures"
|
|
2186
|
+
]
|
|
2187
|
+
},
|
|
2188
|
+
|
|
2189
|
+
"UiAssert": {
|
|
2190
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.UiAssert",
|
|
2191
|
+
"description": "Assert UI element state or value",
|
|
2192
|
+
"category": "UI",
|
|
2193
|
+
"required_arguments": [
|
|
2194
|
+
{
|
|
2195
|
+
"id": "locator",
|
|
2196
|
+
"type": "uiLocator"
|
|
2197
|
+
},
|
|
2198
|
+
{
|
|
2199
|
+
"id": "assertionType",
|
|
2200
|
+
"type": "string",
|
|
2201
|
+
"description": "Type of assertion (EqualTo, Contains, etc.)"
|
|
2202
|
+
}
|
|
2203
|
+
],
|
|
2204
|
+
"optional_arguments": [
|
|
2205
|
+
{
|
|
2206
|
+
"id": "expectedValue",
|
|
2207
|
+
"type": "value"
|
|
2208
|
+
},
|
|
2209
|
+
{
|
|
2210
|
+
"id": "continueOnFailure",
|
|
2211
|
+
"type": "boolean",
|
|
2212
|
+
"default": "false"
|
|
2213
|
+
}
|
|
2214
|
+
],
|
|
2215
|
+
"parent_required": "UiWithScreen",
|
|
2216
|
+
"validation_rules": [
|
|
2217
|
+
"Must be inside UiWithScreen substeps",
|
|
2218
|
+
"Currency fields: format as $1,000.00",
|
|
2219
|
+
"Phone fields: format as (123) 456-7890",
|
|
2220
|
+
"Date/time: use Contains or EqualTo based on format"
|
|
2221
|
+
],
|
|
2222
|
+
"best_practices": [
|
|
2223
|
+
"Format values to match UI display",
|
|
2224
|
+
"Use appropriate assertion type",
|
|
2225
|
+
"Assert critical values"
|
|
2226
|
+
]
|
|
2227
|
+
},
|
|
2228
|
+
|
|
2229
|
+
"UiNavigate": {
|
|
2230
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.UiNavigate",
|
|
2231
|
+
"description": "Navigate to URL",
|
|
2232
|
+
"category": "UI",
|
|
2233
|
+
"required_arguments": [
|
|
2234
|
+
{
|
|
2235
|
+
"id": "url",
|
|
2236
|
+
"type": "string",
|
|
2237
|
+
"description": "URL to navigate to"
|
|
2238
|
+
}
|
|
2239
|
+
],
|
|
2240
|
+
"optional_arguments": [
|
|
2241
|
+
{
|
|
2242
|
+
"id": "uiConnectionName",
|
|
2243
|
+
"type": "string"
|
|
2244
|
+
}
|
|
2245
|
+
],
|
|
2246
|
+
"validation_rules": ["url must be valid", "Use for non-Salesforce sites or direct URLs"],
|
|
2247
|
+
"best_practices": [
|
|
2248
|
+
"Prefer UiWithScreen for Salesforce navigation",
|
|
2249
|
+
"Use for external sites",
|
|
2250
|
+
"Wait for page load after navigation"
|
|
2251
|
+
]
|
|
2252
|
+
},
|
|
2253
|
+
|
|
2254
|
+
"UiFill": {
|
|
2255
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.UiFill",
|
|
2256
|
+
"description": "Auto-fill form fields",
|
|
2257
|
+
"category": "UI",
|
|
2258
|
+
"required_arguments": [
|
|
2259
|
+
{
|
|
2260
|
+
"id": "formLocator",
|
|
2261
|
+
"type": "uiLocator",
|
|
2262
|
+
"description": "Form container locator"
|
|
2263
|
+
}
|
|
2264
|
+
],
|
|
2265
|
+
"optional_arguments": [
|
|
2266
|
+
{
|
|
2267
|
+
"id": "fieldValues",
|
|
2268
|
+
"type": "object",
|
|
2269
|
+
"description": "Field name/value pairs"
|
|
2270
|
+
}
|
|
2271
|
+
],
|
|
2272
|
+
"parent_required": "UiWithScreen",
|
|
2273
|
+
"validation_rules": ["Must be inside UiWithScreen substeps", "Field names must match form fields"],
|
|
2274
|
+
"best_practices": ["Use for multi-field forms", "Verify all fields filled", "Handle required fields first"]
|
|
2275
|
+
},
|
|
2276
|
+
|
|
2277
|
+
"UiWithRow": {
|
|
2278
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.UiWithRow",
|
|
2279
|
+
"description": "Work with specific table/list row",
|
|
2280
|
+
"category": "UI",
|
|
2281
|
+
"required_arguments": [
|
|
2282
|
+
{
|
|
2283
|
+
"id": "tableLocator",
|
|
2284
|
+
"type": "uiLocator",
|
|
2285
|
+
"description": "Table/list locator"
|
|
2286
|
+
},
|
|
2287
|
+
{
|
|
2288
|
+
"id": "rowSelector",
|
|
2289
|
+
"type": "string",
|
|
2290
|
+
"description": "Row selection criteria"
|
|
2291
|
+
}
|
|
2292
|
+
],
|
|
2293
|
+
"optional_arguments": [],
|
|
2294
|
+
"substeps": true,
|
|
2295
|
+
"parent_required": "UiWithScreen",
|
|
2296
|
+
"validation_rules": [
|
|
2297
|
+
"Must be inside UiWithScreen substeps",
|
|
2298
|
+
"rowSelector must be valid",
|
|
2299
|
+
"Must contain substeps"
|
|
2300
|
+
],
|
|
2301
|
+
"best_practices": [
|
|
2302
|
+
"Use for table interactions",
|
|
2303
|
+
"Specify unique row selector",
|
|
2304
|
+
"Handle multiple rows with ForEach"
|
|
2305
|
+
]
|
|
2306
|
+
},
|
|
2307
|
+
|
|
2308
|
+
"UiHandleAlert": {
|
|
2309
|
+
"apiId": "com.provar.plugins.forcedotcom.core.ui.UiHandleAlert",
|
|
2310
|
+
"description": "Handle browser alerts and pop-ups",
|
|
2311
|
+
"category": "UI",
|
|
2312
|
+
"required_arguments": [
|
|
2313
|
+
{
|
|
2314
|
+
"id": "action",
|
|
2315
|
+
"type": "string",
|
|
2316
|
+
"description": "Action to take (Accept, Dismiss, GetText)"
|
|
2317
|
+
}
|
|
2318
|
+
],
|
|
2319
|
+
"optional_arguments": [
|
|
2320
|
+
{
|
|
2321
|
+
"id": "resultName",
|
|
2322
|
+
"type": "string",
|
|
2323
|
+
"description": "Variable to store alert text"
|
|
2324
|
+
}
|
|
2325
|
+
],
|
|
2326
|
+
"validation_rules": ["action must be valid (Accept, Dismiss, GetText)", "Store text when using GetText"],
|
|
2327
|
+
"best_practices": ["Handle alerts promptly", "Validate alert text", "Use in Try/Catch for optional alerts"]
|
|
2328
|
+
}
|
|
2329
|
+
},
|
|
2330
|
+
|
|
2331
|
+
"Utility": {
|
|
2332
|
+
"description": "String manipulation, list operations, and file I/O utilities",
|
|
2333
|
+
|
|
2334
|
+
"Read": {
|
|
2335
|
+
"apiId": "com.provar.plugins.bundled.apis.io.Read",
|
|
2336
|
+
"description": "Read data from Excel/CSV file",
|
|
2337
|
+
"category": "Utility",
|
|
2338
|
+
"required_arguments": [
|
|
2339
|
+
{
|
|
2340
|
+
"id": "dataUrl",
|
|
2341
|
+
"type": "string",
|
|
2342
|
+
"description": "Path to Excel/CSV file"
|
|
2343
|
+
},
|
|
2344
|
+
{
|
|
2345
|
+
"id": "resultName",
|
|
2346
|
+
"type": "string",
|
|
2347
|
+
"description": "Variable to store read data"
|
|
2348
|
+
}
|
|
2349
|
+
],
|
|
2350
|
+
"optional_arguments": [
|
|
2351
|
+
{
|
|
2352
|
+
"id": "worksheetName",
|
|
2353
|
+
"type": "string",
|
|
2354
|
+
"description": "Excel worksheet name"
|
|
2355
|
+
},
|
|
2356
|
+
{
|
|
2357
|
+
"id": "valuesRange",
|
|
2358
|
+
"type": "string",
|
|
2359
|
+
"description": "Cell range to read (e.g., A1:D10)"
|
|
2360
|
+
},
|
|
2361
|
+
{
|
|
2362
|
+
"id": "namesLocation",
|
|
2363
|
+
"type": "string",
|
|
2364
|
+
"default": "FirstRowOfRange",
|
|
2365
|
+
"description": "Where column names are located"
|
|
2366
|
+
}
|
|
2367
|
+
],
|
|
2368
|
+
"validation_rules": [
|
|
2369
|
+
"dataUrl must be valid file path",
|
|
2370
|
+
"File must exist and be readable",
|
|
2371
|
+
"valuesRange must be valid Excel range"
|
|
2372
|
+
],
|
|
2373
|
+
"best_practices": ["Use for data-driven testing", "Store in meaningful variable", "Validate data after reading"]
|
|
2374
|
+
},
|
|
2375
|
+
|
|
2376
|
+
"Write": {
|
|
2377
|
+
"apiId": "com.provar.plugins.bundled.apis.io.Write",
|
|
2378
|
+
"description": "Write data to file",
|
|
2379
|
+
"category": "Utility",
|
|
2380
|
+
"required_arguments": [
|
|
2381
|
+
{
|
|
2382
|
+
"id": "data",
|
|
2383
|
+
"type": "variable",
|
|
2384
|
+
"description": "Data to write"
|
|
2385
|
+
},
|
|
2386
|
+
{
|
|
2387
|
+
"id": "dataUrl",
|
|
2388
|
+
"type": "string",
|
|
2389
|
+
"description": "Output file path"
|
|
2390
|
+
}
|
|
2391
|
+
],
|
|
2392
|
+
"optional_arguments": [
|
|
2393
|
+
{
|
|
2394
|
+
"id": "updateValueRange",
|
|
2395
|
+
"type": "string"
|
|
2396
|
+
},
|
|
2397
|
+
{
|
|
2398
|
+
"id": "updateMatchType",
|
|
2399
|
+
"type": "string"
|
|
2400
|
+
},
|
|
2401
|
+
{
|
|
2402
|
+
"id": "updateMatchLocator",
|
|
2403
|
+
"type": "string"
|
|
2404
|
+
}
|
|
2405
|
+
],
|
|
2406
|
+
"validation_rules": ["data must be valid variable", "dataUrl must be writable path"],
|
|
2407
|
+
"best_practices": ["Use for test result recording", "Ensure output directory exists", "Handle write failures"]
|
|
2408
|
+
},
|
|
2409
|
+
|
|
2410
|
+
"Replace": {
|
|
2411
|
+
"apiId": "com.provar.plugins.bundled.apis.string.Replace",
|
|
2412
|
+
"description": "Replace text in string",
|
|
2413
|
+
"category": "Utility",
|
|
2414
|
+
"required_arguments": [
|
|
2415
|
+
{
|
|
2416
|
+
"id": "input",
|
|
2417
|
+
"type": "string",
|
|
2418
|
+
"description": "Input string"
|
|
2419
|
+
},
|
|
2420
|
+
{
|
|
2421
|
+
"id": "searchString",
|
|
2422
|
+
"type": "string",
|
|
2423
|
+
"description": "Text to find"
|
|
2424
|
+
},
|
|
2425
|
+
{
|
|
2426
|
+
"id": "replacement",
|
|
2427
|
+
"type": "string",
|
|
2428
|
+
"description": "Replacement text"
|
|
2429
|
+
},
|
|
2430
|
+
{
|
|
2431
|
+
"id": "resultName",
|
|
2432
|
+
"type": "string"
|
|
2433
|
+
}
|
|
2434
|
+
],
|
|
2435
|
+
"optional_arguments": [
|
|
2436
|
+
{
|
|
2437
|
+
"id": "caseSensitive",
|
|
2438
|
+
"type": "boolean",
|
|
2439
|
+
"default": "true"
|
|
2440
|
+
},
|
|
2441
|
+
{
|
|
2442
|
+
"id": "replaceAll",
|
|
2443
|
+
"type": "boolean",
|
|
2444
|
+
"default": "true",
|
|
2445
|
+
"description": "Replace all occurrences vs first only"
|
|
2446
|
+
}
|
|
2447
|
+
],
|
|
2448
|
+
"validation_rules": ["searchString should not be empty", "Store result in variable"],
|
|
2449
|
+
"best_practices": ["Use for string formatting", "Consider regex for complex patterns", "Test with edge cases"]
|
|
2450
|
+
},
|
|
2451
|
+
|
|
2452
|
+
"Split": {
|
|
2453
|
+
"apiId": "com.provar.plugins.bundled.apis.string.Split",
|
|
2454
|
+
"description": "Split string into array",
|
|
2455
|
+
"category": "Utility",
|
|
2456
|
+
"required_arguments": [
|
|
2457
|
+
{
|
|
2458
|
+
"id": "input",
|
|
2459
|
+
"type": "string",
|
|
2460
|
+
"description": "String to split"
|
|
2461
|
+
},
|
|
2462
|
+
{
|
|
2463
|
+
"id": "delimiter",
|
|
2464
|
+
"type": "string",
|
|
2465
|
+
"description": "Delimiter character/string"
|
|
2466
|
+
},
|
|
2467
|
+
{
|
|
2468
|
+
"id": "resultName",
|
|
2469
|
+
"type": "string",
|
|
2470
|
+
"description": "Variable to store array"
|
|
2471
|
+
}
|
|
2472
|
+
],
|
|
2473
|
+
"optional_arguments": [
|
|
2474
|
+
{
|
|
2475
|
+
"id": "maxSplits",
|
|
2476
|
+
"type": "decimal",
|
|
2477
|
+
"description": "Maximum number of splits"
|
|
2478
|
+
}
|
|
2479
|
+
],
|
|
2480
|
+
"validation_rules": ["delimiter should not be empty", "Store result as list"],
|
|
2481
|
+
"best_practices": ["Use for parsing delimited data", "Iterate results with ForEach", "Handle empty splits"]
|
|
2482
|
+
},
|
|
2483
|
+
|
|
2484
|
+
"Match": {
|
|
2485
|
+
"apiId": "com.provar.plugins.bundled.apis.string.Match",
|
|
2486
|
+
"description": "Pattern matching and regex operations",
|
|
2487
|
+
"category": "Utility",
|
|
2488
|
+
"required_arguments": [
|
|
2489
|
+
{
|
|
2490
|
+
"id": "input",
|
|
2491
|
+
"type": "string",
|
|
2492
|
+
"description": "Input string to match against"
|
|
2493
|
+
},
|
|
2494
|
+
{
|
|
2495
|
+
"id": "pattern",
|
|
2496
|
+
"type": "string",
|
|
2497
|
+
"description": "Regex pattern or match string"
|
|
2498
|
+
},
|
|
2499
|
+
{
|
|
2500
|
+
"id": "resultName",
|
|
2501
|
+
"type": "string"
|
|
2502
|
+
}
|
|
2503
|
+
],
|
|
2504
|
+
"optional_arguments": [
|
|
2505
|
+
{
|
|
2506
|
+
"id": "isRegex",
|
|
2507
|
+
"type": "boolean",
|
|
2508
|
+
"default": "false",
|
|
2509
|
+
"description": "Treat pattern as regex"
|
|
2510
|
+
},
|
|
2511
|
+
{
|
|
2512
|
+
"id": "caseSensitive",
|
|
2513
|
+
"type": "boolean",
|
|
2514
|
+
"default": "true"
|
|
2515
|
+
}
|
|
2516
|
+
],
|
|
2517
|
+
"validation_rules": ["pattern must be valid regex if isRegex=true", "Store match results"],
|
|
2518
|
+
"best_practices": [
|
|
2519
|
+
"Use for validation and extraction",
|
|
2520
|
+
"Test regex patterns separately",
|
|
2521
|
+
"Handle no-match scenarios"
|
|
2522
|
+
]
|
|
2523
|
+
},
|
|
2524
|
+
|
|
2525
|
+
"ListCompare": {
|
|
2526
|
+
"apiId": "com.provar.plugins.bundled.apis.list.ListCompareListCompare",
|
|
2527
|
+
"description": "Compare two lists",
|
|
2528
|
+
"category": "Utility",
|
|
2529
|
+
"required_arguments": [
|
|
2530
|
+
{
|
|
2531
|
+
"id": "list1",
|
|
2532
|
+
"type": "variable",
|
|
2533
|
+
"description": "First list"
|
|
2534
|
+
},
|
|
2535
|
+
{
|
|
2536
|
+
"id": "list2",
|
|
2537
|
+
"type": "variable",
|
|
2538
|
+
"description": "Second list"
|
|
2539
|
+
},
|
|
2540
|
+
{
|
|
2541
|
+
"id": "resultName",
|
|
2542
|
+
"type": "string",
|
|
2543
|
+
"description": "Variable to store comparison results"
|
|
2544
|
+
}
|
|
2545
|
+
],
|
|
2546
|
+
"optional_arguments": [
|
|
2547
|
+
{
|
|
2548
|
+
"id": "compareType",
|
|
2549
|
+
"type": "string",
|
|
2550
|
+
"default": "Equal",
|
|
2551
|
+
"description": "Comparison type (Equal, Contains, etc.)"
|
|
2552
|
+
}
|
|
2553
|
+
],
|
|
2554
|
+
"validation_rules": ["Both lists must be valid", "Store comparison result"],
|
|
2555
|
+
"best_practices": [
|
|
2556
|
+
"Use for data validation",
|
|
2557
|
+
"Compare sorted lists for order-independent comparison",
|
|
2558
|
+
"Handle different list sizes"
|
|
2559
|
+
]
|
|
2560
|
+
}
|
|
2561
|
+
}
|
|
2562
|
+
},
|
|
2563
|
+
|
|
2564
|
+
"value_types": {
|
|
2565
|
+
"description": "Standard value class types used in Provar test steps. Based on corpus analysis of 329,424 value elements across 1,451 test files.",
|
|
2566
|
+
|
|
2567
|
+
"_valid_class_values": {
|
|
2568
|
+
"description": "Complete list of valid 'class' attribute values for <value> elements",
|
|
2569
|
+
"literal_and_container": ["value", "variable", "compound", "funcCall", "valueList", "namedValues"],
|
|
2570
|
+
"ui_types": ["uiWait", "uiLocator", "uiTarget", "uiInteraction"],
|
|
2571
|
+
"data_sources": ["restTarget", "excelTarget", "csvTarget", "url", "template"],
|
|
2572
|
+
"expression_operators": ["add", "sub", "mult", "div", "eq", "ne", "gt", "lt", "ge", "le", "and", "or", "match"],
|
|
2573
|
+
"invalid_never_use": ["null"]
|
|
2574
|
+
},
|
|
2575
|
+
|
|
2576
|
+
"_valid_valueClass_values": {
|
|
2577
|
+
"description": "Complete list of valid 'valueClass' attribute values when class='value'",
|
|
2578
|
+
"values": ["string", "boolean", "decimal", "id", "date", "dateTime"],
|
|
2579
|
+
"invalid_never_use": ["null", "integer", "number", "text"]
|
|
2580
|
+
},
|
|
2581
|
+
|
|
2582
|
+
"string": {
|
|
2583
|
+
"class": "value",
|
|
2584
|
+
"valueClass": "string",
|
|
2585
|
+
"description": "String literal value"
|
|
2586
|
+
},
|
|
2587
|
+
"boolean": {
|
|
2588
|
+
"class": "value",
|
|
2589
|
+
"valueClass": "boolean",
|
|
2590
|
+
"valid_values": ["true", "false"]
|
|
2591
|
+
},
|
|
2592
|
+
"decimal": {
|
|
2593
|
+
"class": "value",
|
|
2594
|
+
"valueClass": "decimal",
|
|
2595
|
+
"description": "Numeric value"
|
|
2596
|
+
},
|
|
2597
|
+
"id": {
|
|
2598
|
+
"class": "value",
|
|
2599
|
+
"valueClass": "id",
|
|
2600
|
+
"description": "Salesforce ID or GUID"
|
|
2601
|
+
},
|
|
2602
|
+
"date": {
|
|
2603
|
+
"class": "value",
|
|
2604
|
+
"valueClass": "date",
|
|
2605
|
+
"description": "Date value"
|
|
2606
|
+
},
|
|
2607
|
+
"dateTime": {
|
|
2608
|
+
"class": "value",
|
|
2609
|
+
"valueClass": "dateTime",
|
|
2610
|
+
"description": "DateTime value"
|
|
2611
|
+
},
|
|
2612
|
+
"variable": {
|
|
2613
|
+
"class": "variable",
|
|
2614
|
+
"description": "Reference to test variable",
|
|
2615
|
+
"syntax": "{VariableName} or {VariableName.FieldName} or {VariableName[index].FieldName}",
|
|
2616
|
+
"note": "Array indices are 1-based, not 0-based",
|
|
2617
|
+
"child_element": {
|
|
2618
|
+
"path": {
|
|
2619
|
+
"required_attribute": "element",
|
|
2620
|
+
"description": "Variable path (e.g., VariableName, VariableName.Field)"
|
|
2621
|
+
}
|
|
2622
|
+
}
|
|
2623
|
+
},
|
|
2624
|
+
"expression": {
|
|
2625
|
+
"class": "expression",
|
|
2626
|
+
"description": "Dynamic expression evaluation"
|
|
2627
|
+
},
|
|
2628
|
+
"uiLocator": {
|
|
2629
|
+
"class": "uiLocator",
|
|
2630
|
+
"description": "UI element locator",
|
|
2631
|
+
"uri_format": "ui:locator?..."
|
|
2632
|
+
},
|
|
2633
|
+
"uiTarget": {
|
|
2634
|
+
"class": "uiTarget",
|
|
2635
|
+
"description": "UI navigation target",
|
|
2636
|
+
"uri_format": "sf:ui:target?object=X&action=Y"
|
|
2637
|
+
},
|
|
2638
|
+
"uiInteraction": {
|
|
2639
|
+
"class": "uiInteraction",
|
|
2640
|
+
"description": "UI interaction type",
|
|
2641
|
+
"uri_format": "ui:interaction?name=set|click|check|..."
|
|
2642
|
+
}
|
|
2643
|
+
},
|
|
2644
|
+
|
|
2645
|
+
"common_patterns": {
|
|
2646
|
+
"description": "Common test case patterns and best practices",
|
|
2647
|
+
|
|
2648
|
+
"apex_crud_pattern": {
|
|
2649
|
+
"description": "Standard Salesforce Apex CRUD operation pattern",
|
|
2650
|
+
"category": "Salesforce",
|
|
2651
|
+
"steps": [
|
|
2652
|
+
{
|
|
2653
|
+
"step": "ApexConnect",
|
|
2654
|
+
"purpose": "Establish connection with autoCleanup=true"
|
|
2655
|
+
},
|
|
2656
|
+
{
|
|
2657
|
+
"step": "ApexCreateObject or ApexUpdateObject",
|
|
2658
|
+
"purpose": "Perform CRUD operation, store result ID"
|
|
2659
|
+
},
|
|
2660
|
+
{
|
|
2661
|
+
"step": "ApexSoqlQuery (optional)",
|
|
2662
|
+
"purpose": "Verify operation success"
|
|
2663
|
+
},
|
|
2664
|
+
{
|
|
2665
|
+
"step": "Automatic cleanup",
|
|
2666
|
+
"purpose": "autoCleanup deletes created objects"
|
|
2667
|
+
}
|
|
2668
|
+
],
|
|
2669
|
+
"best_practices": [
|
|
2670
|
+
"Enable autoCleanup for automatic cleanup",
|
|
2671
|
+
"Store object IDs for verification",
|
|
2672
|
+
"Use SOQL to verify operations"
|
|
2673
|
+
]
|
|
2674
|
+
},
|
|
2675
|
+
|
|
2676
|
+
"ui_interaction_pattern": {
|
|
2677
|
+
"description": "Standard UI interaction and verification pattern",
|
|
2678
|
+
"category": "UI",
|
|
2679
|
+
"steps": [
|
|
2680
|
+
{
|
|
2681
|
+
"step": "UiConnect",
|
|
2682
|
+
"purpose": "Establish UI connection"
|
|
2683
|
+
},
|
|
2684
|
+
{
|
|
2685
|
+
"step": "UiWithScreen (navigate=Always)",
|
|
2686
|
+
"purpose": "Navigate to target screen",
|
|
2687
|
+
"substeps": [
|
|
2688
|
+
{
|
|
2689
|
+
"step": "UiDoAction",
|
|
2690
|
+
"purpose": "Interact with UI elements"
|
|
2691
|
+
},
|
|
2692
|
+
{
|
|
2693
|
+
"step": "UiAssert",
|
|
2694
|
+
"purpose": "Verify UI state"
|
|
2695
|
+
}
|
|
2696
|
+
]
|
|
2697
|
+
},
|
|
2698
|
+
{
|
|
2699
|
+
"step": "UiWithScreen (navigate=Dont)",
|
|
2700
|
+
"purpose": "Subsequent screens",
|
|
2701
|
+
"substeps": ["More UI interactions"]
|
|
2702
|
+
}
|
|
2703
|
+
],
|
|
2704
|
+
"best_practices": [
|
|
2705
|
+
"First screen: navigate=Always",
|
|
2706
|
+
"Subsequent screens: navigate=Dont",
|
|
2707
|
+
"Store record IDs from New screens",
|
|
2708
|
+
"Group related actions in substeps"
|
|
2709
|
+
]
|
|
2710
|
+
},
|
|
2711
|
+
|
|
2712
|
+
"data_driven_pattern": {
|
|
2713
|
+
"description": "Data-driven testing with external data files",
|
|
2714
|
+
"category": "Control + Utility",
|
|
2715
|
+
"steps": [
|
|
2716
|
+
{
|
|
2717
|
+
"step": "Read",
|
|
2718
|
+
"purpose": "Read test data from Excel/CSV"
|
|
2719
|
+
},
|
|
2720
|
+
{
|
|
2721
|
+
"step": "ForEach",
|
|
2722
|
+
"purpose": "Loop through data rows",
|
|
2723
|
+
"substeps": [
|
|
2724
|
+
{
|
|
2725
|
+
"step": "SetValues",
|
|
2726
|
+
"purpose": "Extract current row data"
|
|
2727
|
+
},
|
|
2728
|
+
{
|
|
2729
|
+
"step": "Connection + Operations",
|
|
2730
|
+
"purpose": "Execute test with data"
|
|
2731
|
+
},
|
|
2732
|
+
{
|
|
2733
|
+
"step": "Assert",
|
|
2734
|
+
"purpose": "Verify results"
|
|
2735
|
+
},
|
|
2736
|
+
{
|
|
2737
|
+
"step": "Write",
|
|
2738
|
+
"purpose": "Record results back to file"
|
|
2739
|
+
}
|
|
2740
|
+
]
|
|
2741
|
+
}
|
|
2742
|
+
],
|
|
2743
|
+
"best_practices": ["Use Read to load test data", "Use ForEach to iterate rows", "Write results for reporting"]
|
|
2744
|
+
},
|
|
2745
|
+
|
|
2746
|
+
"agentforce_conversation_pattern": {
|
|
2747
|
+
"description": "Agentforce AI agent conversation testing pattern",
|
|
2748
|
+
"category": "ProvarAI + Data",
|
|
2749
|
+
"steps": [
|
|
2750
|
+
{
|
|
2751
|
+
"step": "Read",
|
|
2752
|
+
"purpose": "Load conversation test data"
|
|
2753
|
+
},
|
|
2754
|
+
{
|
|
2755
|
+
"step": "WebConnect",
|
|
2756
|
+
"purpose": "Establish agent connection"
|
|
2757
|
+
},
|
|
2758
|
+
{
|
|
2759
|
+
"step": "ApexConnect (optional)",
|
|
2760
|
+
"purpose": "Connect to Salesforce for record validation"
|
|
2761
|
+
},
|
|
2762
|
+
{
|
|
2763
|
+
"step": "AIAgentSession",
|
|
2764
|
+
"purpose": "Create agent session, store session ID"
|
|
2765
|
+
},
|
|
2766
|
+
{
|
|
2767
|
+
"step": "ForEach (conversation data)",
|
|
2768
|
+
"purpose": "Iterate through test scenarios",
|
|
2769
|
+
"substeps": [
|
|
2770
|
+
{
|
|
2771
|
+
"step": "GenerateUtterance (optional)",
|
|
2772
|
+
"purpose": "Generate test utterances for intent"
|
|
2773
|
+
},
|
|
2774
|
+
{
|
|
2775
|
+
"step": "AIAgentConversation",
|
|
2776
|
+
"purpose": "Send message, receive response"
|
|
2777
|
+
},
|
|
2778
|
+
{
|
|
2779
|
+
"step": "IntentValidator (optional)",
|
|
2780
|
+
"purpose": "Validate agent understood intent"
|
|
2781
|
+
},
|
|
2782
|
+
{
|
|
2783
|
+
"step": "ApexSoqlQuery (optional)",
|
|
2784
|
+
"purpose": "Verify agent created/updated records"
|
|
2785
|
+
},
|
|
2786
|
+
{
|
|
2787
|
+
"step": "LogForCleanup (optional)",
|
|
2788
|
+
"purpose": "Log created records for cleanup"
|
|
2789
|
+
},
|
|
2790
|
+
{
|
|
2791
|
+
"step": "Write",
|
|
2792
|
+
"purpose": "Record conversation results"
|
|
2793
|
+
}
|
|
2794
|
+
]
|
|
2795
|
+
},
|
|
2796
|
+
{
|
|
2797
|
+
"step": "AIAgentConversation (endSession=true)",
|
|
2798
|
+
"purpose": "End agent session"
|
|
2799
|
+
}
|
|
2800
|
+
],
|
|
2801
|
+
"best_practices": [
|
|
2802
|
+
"Test multiple conversation paths",
|
|
2803
|
+
"Validate agent responses",
|
|
2804
|
+
"Log records for cleanup",
|
|
2805
|
+
"End session explicitly"
|
|
2806
|
+
]
|
|
2807
|
+
},
|
|
2808
|
+
|
|
2809
|
+
"callable_test_case_pattern": {
|
|
2810
|
+
"description": "Calling reusable test cases with caseCall element",
|
|
2811
|
+
"category": "Design + Control",
|
|
2812
|
+
"usage": {
|
|
2813
|
+
"caseCall_element": {
|
|
2814
|
+
"description": "Reference to another test case to execute",
|
|
2815
|
+
"required_attributes": [
|
|
2816
|
+
{
|
|
2817
|
+
"name": "testCaseId",
|
|
2818
|
+
"description": "GUID of the callable test case"
|
|
2819
|
+
},
|
|
2820
|
+
{
|
|
2821
|
+
"name": "testCasePath",
|
|
2822
|
+
"description": "Relative path to the .testcase file"
|
|
2823
|
+
},
|
|
2824
|
+
{
|
|
2825
|
+
"name": "testItemId",
|
|
2826
|
+
"description": "Unique test item ID"
|
|
2827
|
+
}
|
|
2828
|
+
],
|
|
2829
|
+
"optional_attributes": [
|
|
2830
|
+
{
|
|
2831
|
+
"name": "guid",
|
|
2832
|
+
"description": "Unique GUID for this call instance"
|
|
2833
|
+
}
|
|
2834
|
+
]
|
|
2835
|
+
},
|
|
2836
|
+
"callable_test_requirements": {
|
|
2837
|
+
"visibility": "Internal or Callable",
|
|
2838
|
+
"description": "Test case being called must have visibility='Internal' or visibility='Callable'",
|
|
2839
|
+
"note": "Public tests cannot be called from other tests"
|
|
2840
|
+
}
|
|
2841
|
+
},
|
|
2842
|
+
"example": "<caseCall guid=\"unique-guid\" testCaseId=\"test-guid\" testCasePath=\"path/to/test.testcase\" testItemId=\"10\"/>",
|
|
2843
|
+
"best_practices": [
|
|
2844
|
+
"Use for reusable test logic (setup, cleanup, common flows)",
|
|
2845
|
+
"Ensure called test has visibility='Internal'",
|
|
2846
|
+
"Pass parameters using <argument> elements if test has <params>",
|
|
2847
|
+
"Use for modular test design"
|
|
2848
|
+
],
|
|
2849
|
+
"validation_rules": [
|
|
2850
|
+
"testCaseId must match an existing test case GUID",
|
|
2851
|
+
"testCasePath must be valid relative path",
|
|
2852
|
+
"Called test must have visibility='Internal' or visibility='Callable'",
|
|
2853
|
+
"Parameter types must match called test signature"
|
|
2854
|
+
]
|
|
2855
|
+
},
|
|
2856
|
+
|
|
2857
|
+
"parameterized_test_pattern": {
|
|
2858
|
+
"description": "Test case with input parameters for reusability",
|
|
2859
|
+
"category": "Design",
|
|
2860
|
+
"structure": {
|
|
2861
|
+
"params_section": {
|
|
2862
|
+
"description": "Define test case parameters in <params> element",
|
|
2863
|
+
"param_attributes": [
|
|
2864
|
+
{
|
|
2865
|
+
"name": "name",
|
|
2866
|
+
"required": true,
|
|
2867
|
+
"description": "Parameter name"
|
|
2868
|
+
},
|
|
2869
|
+
{
|
|
2870
|
+
"name": "passwordVariableAllowed",
|
|
2871
|
+
"required": false,
|
|
2872
|
+
"description": "Allow password variables"
|
|
2873
|
+
},
|
|
2874
|
+
{
|
|
2875
|
+
"name": "title",
|
|
2876
|
+
"required": false,
|
|
2877
|
+
"description": "Display title"
|
|
2878
|
+
}
|
|
2879
|
+
],
|
|
2880
|
+
"param_child_elements": [
|
|
2881
|
+
{
|
|
2882
|
+
"name": "summary",
|
|
2883
|
+
"description": "Parameter description"
|
|
2884
|
+
},
|
|
2885
|
+
{
|
|
2886
|
+
"name": "type",
|
|
2887
|
+
"description": "Parameter data type (textType, booleanType, etc.)"
|
|
2888
|
+
}
|
|
2889
|
+
]
|
|
2890
|
+
},
|
|
2891
|
+
"args_section": {
|
|
2892
|
+
"description": "Default parameter values in <args> element",
|
|
2893
|
+
"note": "Arguments can be overridden when calling the test via caseCall"
|
|
2894
|
+
}
|
|
2895
|
+
},
|
|
2896
|
+
"example_usage": {
|
|
2897
|
+
"define_params": "<params><param name=\"SEQUENCE_ID\" passwordVariableAllowed=\"true\" title=\"Sequence ID\">...</param></params>",
|
|
2898
|
+
"provide_defaults": "<args><argument id=\"SEQUENCE_ID\"><value class=\"value\" valueClass=\"string\">123</value></argument></args>",
|
|
2899
|
+
"call_with_params": "<caseCall testCaseId=\"...\"><arguments><argument id=\"SEQUENCE_ID\"><value>456</value></argument></arguments></caseCall>"
|
|
2900
|
+
},
|
|
2901
|
+
"best_practices": [
|
|
2902
|
+
"Define clear parameter names",
|
|
2903
|
+
"Provide default values in <args>",
|
|
2904
|
+
"Document parameter purpose in summary",
|
|
2905
|
+
"Use for reusable callable tests"
|
|
2906
|
+
]
|
|
2907
|
+
},
|
|
2908
|
+
|
|
2909
|
+
"bdd_scenario_pattern": {
|
|
2910
|
+
"description": "BDD (Behavior-Driven Development) test scenario structure",
|
|
2911
|
+
"category": "Design",
|
|
2912
|
+
"steps": [
|
|
2913
|
+
{
|
|
2914
|
+
"step": "Given",
|
|
2915
|
+
"purpose": "Set up preconditions",
|
|
2916
|
+
"substeps": ["Setup steps, data creation"]
|
|
2917
|
+
},
|
|
2918
|
+
{
|
|
2919
|
+
"step": "And (optional)",
|
|
2920
|
+
"purpose": "Additional Given conditions"
|
|
2921
|
+
},
|
|
2922
|
+
{
|
|
2923
|
+
"step": "When",
|
|
2924
|
+
"purpose": "Perform test action",
|
|
2925
|
+
"substeps": ["Action steps"]
|
|
2926
|
+
},
|
|
2927
|
+
{
|
|
2928
|
+
"step": "And (optional)",
|
|
2929
|
+
"purpose": "Additional When actions"
|
|
2930
|
+
},
|
|
2931
|
+
{
|
|
2932
|
+
"step": "Then",
|
|
2933
|
+
"purpose": "Verify outcomes",
|
|
2934
|
+
"substeps": ["Assertion steps"]
|
|
2935
|
+
},
|
|
2936
|
+
{
|
|
2937
|
+
"step": "And/But (optional)",
|
|
2938
|
+
"purpose": "Additional Then verifications"
|
|
2939
|
+
}
|
|
2940
|
+
],
|
|
2941
|
+
"best_practices": [
|
|
2942
|
+
"One When per scenario when possible",
|
|
2943
|
+
"Focus Given on state, not actions",
|
|
2944
|
+
"Use Then for observable outcomes",
|
|
2945
|
+
"Limit And/But chains to 3-5"
|
|
2946
|
+
]
|
|
2947
|
+
},
|
|
2948
|
+
|
|
2949
|
+
"database_testing_pattern": {
|
|
2950
|
+
"description": "External database testing pattern",
|
|
2951
|
+
"category": "Data",
|
|
2952
|
+
"steps": [
|
|
2953
|
+
{
|
|
2954
|
+
"step": "DbConnect",
|
|
2955
|
+
"purpose": "Establish database connection"
|
|
2956
|
+
},
|
|
2957
|
+
{
|
|
2958
|
+
"step": "DbInsert or DbUpdate",
|
|
2959
|
+
"purpose": "Set up test data"
|
|
2960
|
+
},
|
|
2961
|
+
{
|
|
2962
|
+
"step": "SqlQuery or DbRead",
|
|
2963
|
+
"purpose": "Verify data state"
|
|
2964
|
+
},
|
|
2965
|
+
{
|
|
2966
|
+
"step": "DbDelete",
|
|
2967
|
+
"purpose": "Clean up test data"
|
|
2968
|
+
}
|
|
2969
|
+
],
|
|
2970
|
+
"best_practices": ["Always use WHERE clauses", "Test queries with SELECT first", "Clean up in Finally block"]
|
|
2971
|
+
},
|
|
2972
|
+
|
|
2973
|
+
"rest_api_testing_pattern": {
|
|
2974
|
+
"description": "REST API testing pattern",
|
|
2975
|
+
"category": "Data",
|
|
2976
|
+
"steps": [
|
|
2977
|
+
{
|
|
2978
|
+
"step": "WebConnect",
|
|
2979
|
+
"purpose": "Establish API connection"
|
|
2980
|
+
},
|
|
2981
|
+
{
|
|
2982
|
+
"step": "RestRequest (GET)",
|
|
2983
|
+
"purpose": "Retrieve initial state"
|
|
2984
|
+
},
|
|
2985
|
+
{
|
|
2986
|
+
"step": "RestRequest (POST/PUT)",
|
|
2987
|
+
"purpose": "Modify data"
|
|
2988
|
+
},
|
|
2989
|
+
{
|
|
2990
|
+
"step": "RestRequest (GET)",
|
|
2991
|
+
"purpose": "Verify changes"
|
|
2992
|
+
},
|
|
2993
|
+
{
|
|
2994
|
+
"step": "Assert",
|
|
2995
|
+
"purpose": "Validate response data"
|
|
2996
|
+
}
|
|
2997
|
+
],
|
|
2998
|
+
"best_practices": [
|
|
2999
|
+
"Validate response status codes",
|
|
3000
|
+
"Store responses for assertions",
|
|
3001
|
+
"Handle authentication properly"
|
|
3002
|
+
]
|
|
3003
|
+
}
|
|
3004
|
+
}
|
|
3005
|
+
}
|