@provartesting/provardx-cli 1.5.2 → 1.5.3

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.
@@ -8,83 +8,90 @@
8
8
 
9
9
  ## API ID Reference
10
10
 
11
- | Step Type | API ID |
12
- | --------------------- | ------------------------------------------------------------------------ |
13
- | **Connection** | |
14
- | ApexConnect | `com.provar.plugins.forcedotcom.core.testapis.ApexConnect` |
15
- | UiConnect | `com.provar.plugins.forcedotcom.core.ui.UiConnect` |
16
- | **Apex CRUD** | |
17
- | ApexCreateObject | `com.provar.plugins.forcedotcom.core.testapis.ApexCreateObject` |
18
- | ApexReadObject | `com.provar.plugins.forcedotcom.core.testapis.ApexReadObject` |
19
- | ApexUpdateObject | `com.provar.plugins.forcedotcom.core.testapis.ApexUpdateObject` |
20
- | ApexDeleteObject | `com.provar.plugins.forcedotcom.core.testapis.ApexDeleteObject` |
21
- | ApexSoqlQuery | `com.provar.plugins.forcedotcom.core.testapis.ApexSoqlQuery` |
22
- | **Apex Advanced** | |
23
- | ApexBulk | `com.provar.plugins.forcedotcom.core.testapis.ApexBulk` |
24
- | ApexExecute | `com.provar.plugins.forcedotcom.core.testapis.ApexExecute` |
25
- | ApexConvertLead | `com.provar.plugins.forcedotcom.core.testapis.ApexConvertLead` |
26
- | ApexExtractLayout | `com.provar.plugins.forcedotcom.core.testapis.ApexExtractLayout` |
27
- | ApexAssertLayout | `com.provar.plugins.forcedotcom.core.testapis.ApexAssertLayout` |
28
- | ApexApproveWorkItem | `com.provar.plugins.forcedotcom.core.testapis.ApexApproveWorkItem` |
29
- | ApexSubmitForApproval | `com.provar.plugins.forcedotcom.core.testapis.ApexSubmitForApproval` |
30
- | ApexLogForCleanup | `com.provar.plugins.forcedotcom.core.testapis.ApexLogForCleanup` |
31
- | **UI Steps** | |
32
- | UiWithScreen | `com.provar.plugins.forcedotcom.core.ui.UiWithScreen` |
33
- | UiDoAction | `com.provar.plugins.forcedotcom.core.ui.UiDoAction` |
34
- | UiAssert | `com.provar.plugins.forcedotcom.core.ui.UiAssert` |
35
- | UiWithRow | `com.provar.plugins.forcedotcom.core.ui.UiWithRow` |
36
- | UiHandleAlert | `com.provar.plugins.forcedotcom.core.ui.UiHandleAlert` |
37
- | UiNavigate | `com.provar.plugins.forcedotcom.core.ui.UiNavigate` |
38
- | **Control Flow** | |
39
- | SetValues | `com.provar.plugins.bundled.apis.control.SetValues` |
40
- | StepGroup | `com.provar.plugins.bundled.apis.control.StepGroup` |
41
- | If | `com.provar.plugins.bundled.apis.If` |
42
- | ForEach | `com.provar.plugins.bundled.apis.control.ForEach` |
43
- | DoWhile | `com.provar.plugins.bundled.apis.control.DoWhile` |
44
- | WaitFor | `com.provar.plugins.bundled.apis.control.WaitFor` |
45
- | TryCatchFinally | `com.provar.plugins.bundled.apis.control.TryCatchFinally` |
46
- | Switch | `com.provar.plugins.bundled.apis.Switch` |
47
- | Sleep | `com.provar.plugins.bundled.apis.control.Sleep` |
48
- | Fail | `com.provar.plugins.bundled.apis.control.Fail` |
49
- | CallTest | `com.provar.plugins.bundled.apis.control.CallTest` |
50
- | **Assertions** | |
51
- | AssertValues | `com.provar.plugins.bundled.apis.AssertValues` |
52
- | **BDD** | |
53
- | Given | `com.provar.plugins.bundled.apis.bdd.Given` |
54
- | When | `com.provar.plugins.bundled.apis.bdd.When` |
55
- | Then | `com.provar.plugins.bundled.apis.bdd.Then` |
56
- | And | `com.provar.plugins.bundled.apis.bdd.And` |
57
- | But | `com.provar.plugins.bundled.apis.bdd.But` |
58
- | **Design** | |
59
- | ActualResult | `com.provar.plugins.bundled.apis.control.ActualResult` |
60
- | DesignStep | `com.provar.plugins.bundled.apis.control.DesignStep` |
61
- | **Database** | |
62
- | DbConnect | `com.provar.plugins.bundled.apis.db.DbConnect` |
63
- | DbRead | `com.provar.plugins.bundled.apis.db.DbRead` |
64
- | DbInsert | `com.provar.plugins.bundled.apis.db.DbInsert` |
65
- | DbUpdate | `com.provar.plugins.bundled.apis.db.DbUpdate` |
66
- | DbDelete | `com.provar.plugins.bundled.apis.db.DbDelete` |
67
- | SqlQuery | `com.provar.plugins.bundled.apis.db.SqlQuery` |
68
- | **Web Service** | |
69
- | WebConnect | `com.provar.plugins.bundled.apis.restservice.WebConnect` |
70
- | RestRequest | `com.provar.plugins.bundled.apis.restservice.RestRequest` |
71
- | SoapRequest | `com.provar.plugins.bundled.apis.restservice.SoapRequest` |
72
- | **Messaging** | |
73
- | PublishMessage | `com.provar.plugins.bundled.apis.messaging.PublishMessage` |
74
- | Subscribe | `com.provar.plugins.bundled.apis.messaging.Subscribe` |
75
- | ReceiveMessage | `com.provar.plugins.bundled.apis.messaging.ReceiveMessage` |
76
- | SendMessage | `com.provar.plugins.bundled.apis.messaging.SendMessage` |
77
- | **Utility** | |
78
- | ListCompare | `com.provar.plugins.bundled.apis.list.ListCompare` |
79
- | Match | `com.provar.plugins.bundled.apis.string.Match` |
80
- | Read | `com.provar.plugins.bundled.apis.io.Read` |
81
- | Write | `com.provar.plugins.bundled.apis.io.Write` |
82
- | Split | `com.provar.plugins.bundled.apis.string.Split` |
83
- | Replace | `com.provar.plugins.bundled.apis.string.Replace` |
84
- | **ProvarAI / Labs** | |
85
- | GenerateTestData | `com.provar.plugins.forcedotcom.core.testapis.generate.GenerateTestData` |
86
- | GenerateTestCase | `com.provar.plugins.forcedotcom.core.testapis.GenerateTestCase` |
87
- | PageObjectCleaner | `com.provar.plugins.bundled.apis.provarlabs.PageObjectCleaner` |
11
+ | Step Type | API ID |
12
+ | ------------------------------------------------ | ------------------------------------------------------------------------ |
13
+ | **Connection** | |
14
+ | ApexConnect | `com.provar.plugins.forcedotcom.core.testapis.ApexConnect` |
15
+ | UiConnect | `com.provar.plugins.forcedotcom.core.ui.UiConnect` |
16
+ | **MS Dynamics / Power Platform** (Provar 3.0.7+) | |
17
+ | MSDynamics365Connect | `com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-dynamics365` |
18
+ | MSDataverseConnect | `com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-dataverse` |
19
+ | MSPowerAppConnect | `com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-powerapp` |
20
+ | MSPowerPageConnect | `com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-powerpage` |
21
+ | **Apex CRUD** | |
22
+ | ApexCreateObject | `com.provar.plugins.forcedotcom.core.testapis.ApexCreateObject` |
23
+ | ApexReadObject | `com.provar.plugins.forcedotcom.core.testapis.ApexReadObject` |
24
+ | ApexUpdateObject | `com.provar.plugins.forcedotcom.core.testapis.ApexUpdateObject` |
25
+ | ApexDeleteObject | `com.provar.plugins.forcedotcom.core.testapis.ApexDeleteObject` |
26
+ | ApexSoqlQuery | `com.provar.plugins.forcedotcom.core.testapis.ApexSoqlQuery` |
27
+ | **Apex Advanced** | |
28
+ | ApexBulk | `com.provar.plugins.forcedotcom.core.testapis.ApexBulk` |
29
+ | ApexExecute | `com.provar.plugins.forcedotcom.core.testapis.ApexExecute` |
30
+ | ApexConvertLead | `com.provar.plugins.forcedotcom.core.testapis.ApexConvertLead` |
31
+ | ApexExtractLayout | `com.provar.plugins.forcedotcom.core.testapis.ApexExtractLayout` |
32
+ | ApexAssertLayout | `com.provar.plugins.forcedotcom.core.testapis.ApexAssertLayout` |
33
+ | ApexApproveWorkItem | `com.provar.plugins.forcedotcom.core.testapis.ApexApproveWorkItem` |
34
+ | ApexSubmitForApproval | `com.provar.plugins.forcedotcom.core.testapis.ApexSubmitForApproval` |
35
+ | ApexLogForCleanup | `com.provar.plugins.forcedotcom.core.testapis.ApexLogForCleanup` |
36
+ | **UI Steps** | |
37
+ | UiWithScreen | `com.provar.plugins.forcedotcom.core.ui.UiWithScreen` |
38
+ | UiDoAction | `com.provar.plugins.forcedotcom.core.ui.UiDoAction` |
39
+ | UiAssert | `com.provar.plugins.forcedotcom.core.ui.UiAssert` |
40
+ | UiRead | `com.provar.plugins.forcedotcom.core.ui.UiRead` |
41
+ | UiFill | `com.provar.plugins.forcedotcom.core.ui.UiFill` |
42
+ | UiWithRow | `com.provar.plugins.forcedotcom.core.ui.UiWithRow` |
43
+ | UiHandleAlert | `com.provar.plugins.forcedotcom.core.ui.UiHandleAlert` |
44
+ | UiNavigate | `com.provar.plugins.forcedotcom.core.ui.UiNavigate` |
45
+ | **Control Flow** | |
46
+ | SetValues | `com.provar.plugins.bundled.apis.control.SetValues` |
47
+ | StepGroup | `com.provar.plugins.bundled.apis.control.StepGroup` |
48
+ | If | `com.provar.plugins.bundled.apis.If` |
49
+ | ForEach | `com.provar.plugins.bundled.apis.control.ForEach` |
50
+ | DoWhile | `com.provar.plugins.bundled.apis.control.DoWhile` |
51
+ | WaitFor | `com.provar.plugins.bundled.apis.control.WaitFor` |
52
+ | TryCatchFinally | `com.provar.plugins.bundled.apis.control.TryCatchFinally` |
53
+ | Switch | `com.provar.plugins.bundled.apis.Switch` |
54
+ | Sleep | `com.provar.plugins.bundled.apis.control.Sleep` |
55
+ | Fail | `com.provar.plugins.bundled.apis.control.Fail` |
56
+ | CallTest | `com.provar.plugins.bundled.apis.control.CallTest` |
57
+ | **Assertions** | |
58
+ | AssertValues | `com.provar.plugins.bundled.apis.AssertValues` |
59
+ | **BDD** | |
60
+ | Given | `com.provar.plugins.bundled.apis.bdd.Given` |
61
+ | When | `com.provar.plugins.bundled.apis.bdd.When` |
62
+ | Then | `com.provar.plugins.bundled.apis.bdd.Then` |
63
+ | And | `com.provar.plugins.bundled.apis.bdd.And` |
64
+ | But | `com.provar.plugins.bundled.apis.bdd.But` |
65
+ | **Design** | |
66
+ | ActualResult | `com.provar.plugins.bundled.apis.control.ActualResult` |
67
+ | DesignStep | `com.provar.plugins.bundled.apis.control.DesignStep` |
68
+ | **Database** | |
69
+ | DbConnect | `com.provar.plugins.bundled.apis.db.DbConnect` |
70
+ | DbRead | `com.provar.plugins.bundled.apis.db.DbRead` |
71
+ | DbInsert | `com.provar.plugins.bundled.apis.db.DbInsert` |
72
+ | DbUpdate | `com.provar.plugins.bundled.apis.db.DbUpdate` |
73
+ | DbDelete | `com.provar.plugins.bundled.apis.db.DbDelete` |
74
+ | SqlQuery | `com.provar.plugins.bundled.apis.db.SqlQuery` |
75
+ | **Web Service** | |
76
+ | WebConnect | `com.provar.plugins.bundled.apis.restservice.WebConnect` |
77
+ | RestRequest | `com.provar.plugins.bundled.apis.restservice.RestRequest` |
78
+ | SoapRequest | `com.provar.plugins.bundled.apis.restservice.SoapRequest` |
79
+ | **Messaging** | |
80
+ | PublishMessage | `com.provar.plugins.bundled.apis.messaging.PublishMessage` |
81
+ | Subscribe | `com.provar.plugins.bundled.apis.messaging.Subscribe` |
82
+ | ReceiveMessage | `com.provar.plugins.bundled.apis.messaging.ReceiveMessage` |
83
+ | SendMessage | `com.provar.plugins.bundled.apis.messaging.SendMessage` |
84
+ | **Utility** | |
85
+ | ListCompare | `com.provar.plugins.bundled.apis.list.ListCompare` |
86
+ | Match | `com.provar.plugins.bundled.apis.string.Match` |
87
+ | Read | `com.provar.plugins.bundled.apis.io.Read` |
88
+ | Write | `com.provar.plugins.bundled.apis.io.Write` |
89
+ | Split | `com.provar.plugins.bundled.apis.string.Split` |
90
+ | Replace | `com.provar.plugins.bundled.apis.string.Replace` |
91
+ | **ProvarAI / Labs** | |
92
+ | GenerateTestData | `com.provar.plugins.forcedotcom.core.testapis.generate.GenerateTestData` |
93
+ | GenerateTestCase | `com.provar.plugins.forcedotcom.core.testapis.GenerateTestCase` |
94
+ | PageObjectCleaner | `com.provar.plugins.bundled.apis.provarlabs.PageObjectCleaner` |
88
95
 
89
96
  ---
90
97
 
@@ -200,7 +207,7 @@ Opens a browser-only UI session. Use this when you have a separate ApexConnect f
200
207
 
201
208
  ## UI Steps
202
209
 
203
- UI steps must always be nested inside a `UiWithScreen` block. Never place `UiDoAction` or `UiAssert` directly in the top-level `<steps>` list.
210
+ UI steps must always be nested inside a `UiWithScreen` block. Never place any of the 7 UI action types (`UiDoAction`, `UiAssert`, `UiRead`, `UiFill`, `UiNavigate`, `UiWithRow`, `UiHandleAlert`) directly in the top-level `<steps>` list — they must descend from a `UiWithScreen` or `UiWithRow` ancestor through a `<clause name="substeps">` path. Validator rule **UI-NEST-STRUCT-001** fires once per offending step.
204
211
 
205
212
  ### UiWithScreen
206
213
 
@@ -568,6 +575,70 @@ Verifies field values or element state on the current screen. Must always includ
568
575
 
569
576
  **Valid `comparisonType` values:** `EqualTo` | `NotEqualTo` | `Contains` | `NotContains` | `StartsWith` | `EndsWith` | `None`
570
577
 
578
+ ### UiRead
579
+
580
+ Reads the current value of a field or element on the screen and binds it to a result variable so subsequent steps can reference it. Useful for capturing IDs from the URL bar, the value of a calculated field after Save, or any visible text whose value depends on prior screen state.
581
+
582
+ > The `locator` argument must use `class="uiLocator"` (validator rule **UI-LOCATOR-001**). In `provar_testcase_generate` the `locator` attribute is converted automatically.
583
+
584
+ ```xml
585
+ <apiCall apiId="com.provar.plugins.forcedotcom.core.ui.UiRead"
586
+ name="UiRead" testItemId="9"
587
+ title="Read the Account Id">
588
+ <arguments>
589
+ <argument id="locator">
590
+ <value class="uiLocator" uri="sf:ui:locator?name=Id&amp;binding=sf%3Aui%3Abinding%3Aobject%3Fobject%3DAccount%26field%3DId"/>
591
+ </argument>
592
+ <argument id="resultName">
593
+ <value class="value" valueClass="string">AccountId</value>
594
+ </argument>
595
+ <argument id="resultScope">
596
+ <value class="value" valueClass="string">Test</value>
597
+ </argument>
598
+ </arguments>
599
+ </apiCall>
600
+ ```
601
+
602
+ **Locator URI format:** `sf:ui:locator?name=FIELD_NAME&binding=...` — the URL-encoded `binding` parameter is required for Salesforce field references.
603
+
604
+ ### UiFill
605
+
606
+ Fills multiple fields on a form in a single step using a list of field-value pairs. Equivalent to a sequence of `UiDoAction` (`set`) calls but more compact when populating many fields at once.
607
+
608
+ > The `locator` argument must use `class="uiLocator"` (validator rule **UI-LOCATOR-001**). In `provar_testcase_generate` the `locator` attribute is converted automatically.
609
+ >
610
+ > **Best practice (rule UI-FILL-VERIFY-001):** follow each `UiFill` with a `UiAssert` to verify the fields actually accepted the values.
611
+
612
+ ```xml
613
+ <apiCall apiId="com.provar.plugins.forcedotcom.core.ui.UiFill"
614
+ name="UiFill" testItemId="11"
615
+ title="Fill required Lead fields">
616
+ <arguments>
617
+ <argument id="locator">
618
+ <value class="uiLocator" uri="sf:ui:locator?name=LeadForm"/>
619
+ </argument>
620
+ <argument id="fieldValues">
621
+ <value class="valueList" mutable="Mutable">
622
+ <namedValues>
623
+ <namedValue name="LastName">
624
+ <value class="value" valueClass="string">Provar_TestLead</value>
625
+ </namedValue>
626
+ <namedValue name="Company">
627
+ <value class="value" valueClass="string">Provar Test Company</value>
628
+ </namedValue>
629
+ </namedValues>
630
+ </value>
631
+ </argument>
632
+ <argument id="captureBefore">
633
+ <value class="value" valueClass="string">false</value>
634
+ </argument>
635
+ <argument id="captureAfter">
636
+ <value class="value" valueClass="string">false</value>
637
+ </argument>
638
+ </arguments>
639
+ </apiCall>
640
+ ```
641
+
571
642
  ### UiWithRow
572
643
 
573
644
  Targets a specific row in a related list or table. Substeps inside the clause operate in the row context (locators can use `rowLocator` parameter for scoping).
@@ -822,6 +893,113 @@ Runs a SOQL query and stores results as a list variable. Always include `Id` and
822
893
 
823
894
  ---
824
895
 
896
+ ## Microsoft Dynamics & Power Platform Steps (Provar 3.0.7+)
897
+
898
+ Four `NitroXConnect:ms-*` connection-step variants ship in Provar 3.0.7 for the Microsoft Dynamics 365 and Microsoft Power Platform product family. All four share a common apiId base (`com.provar.plugins.forcedotcom.core.ui.NitroXConnect`) and differ only in the suffix after the colon.
899
+
900
+ | Shorthand | Fully-qualified apiId | Product |
901
+ | -------------------- | ------------------------------- | ------------------------ |
902
+ | MSDynamics365Connect | `…NitroXConnect:ms-dynamics365` | Dynamics 365 (CRM/ERP) |
903
+ | MSDataverseConnect | `…NitroXConnect:ms-dataverse` | Dataverse (data backend) |
904
+ | MSPowerAppConnect | `…NitroXConnect:ms-powerapp` | Power Apps |
905
+ | MSPowerPageConnect | `…NitroXConnect:ms-powerpage` | Power Pages |
906
+
907
+ > **First-class generation:** all four shorthand names auto-expand via `provar_testcase_generate` to the fully-qualified runtime ID. Validation (`API-UNKNOWN-001`) recognises every variant.
908
+
909
+ ### Shared arguments (all four variants)
910
+
911
+ | Argument | Required | Notes |
912
+ | --------------------- | -------- | ------------------------------------------------- |
913
+ | `connectionName` | yes | Reference to a UI connection configured in Provar |
914
+ | `resultName` | yes | Identifier for the connection result variable |
915
+ | `resultScope` | yes | `Test` / `Global` / `Folder` |
916
+ | `reuseConnectionName` | no | Reuse an existing browser session |
917
+ | `privateBrowsingMode` | no | Enable private/incognito mode |
918
+ | `webBrowser` | no | Override default browser |
919
+
920
+ ### Variant-specific arguments
921
+
922
+ | Variant | Variant-specific args |
923
+ | ---------------- | ------------------------------ |
924
+ | `ms-dynamics365` | `appName` |
925
+ | `ms-dataverse` | _(none)_ |
926
+ | `ms-powerapp` | `powerAppName` |
927
+ | `ms-powerpage` | `environment`, `powerPageName` |
928
+
929
+ ### Validation rules
930
+
931
+ - **`UI-NITROX-CONNECT-ARGS-001`** (critical) — rejects ApexConnect-only args (`autoCleanup`, `lightningMode`, `alreadyOpenBehaviour`, `closeAllPrimaryTabs`, `enableObjectIdLogging`, `quickUiLogin`, `uiApplicationName`, `cleanupConnectionName`) and rejects cross-variant args (e.g. `powerAppName` on `:ms-dynamics365`).
932
+ - **`UI-NITROX-VARIANT-ARG-001`** (minor) — flags missing or empty variant-specific args **unless** they are declared as runtime-bound parameters under `<generatedParameters>` (the data-driven test pattern, see below).
933
+
934
+ ### Data-driven pattern (runtime-bound parameters)
935
+
936
+ When a variant-specific arg is left empty intentionally — because the value is supplied at runtime by a test plan or data table — declare it as a parameter in a sibling `<generatedParameters>` block. `UI-NITROX-VARIANT-ARG-001` recognises this pattern and stays silent.
937
+
938
+ ```xml
939
+ <apiCall apiId="…NitroXConnect:ms-powerpage" name="NitroXConnect" testItemId="4"
940
+ title="MS Power Page Connect">
941
+ <arguments>
942
+ <argument id="connectionName"><value class="value" valueClass="string">UiConnection</value></argument>
943
+ <argument id="resultName"><value class="value" valueClass="string">MSPowerPageConnection</value></argument>
944
+ <argument id="resultScope"><value class="value" valueClass="string">Test</value></argument>
945
+ <argument id="environment"/>
946
+ <argument id="powerPageName"/>
947
+ </arguments>
948
+ <generatedParameters>
949
+ <apiParam group="ui" name="environment" title="Environment">
950
+ <type><textType/></type>
951
+ </apiParam>
952
+ <apiParam group="ui" name="powerPageName" title="Power Page Name">
953
+ <type><textType/></type>
954
+ </apiParam>
955
+ </generatedParameters>
956
+ </apiCall>
957
+ ```
958
+
959
+ ### Example: MSDynamics365Connect (literal args)
960
+
961
+ ```xml
962
+ <apiCall apiId="com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-dynamics365"
963
+ name="NitroXConnect" testItemId="1" title="MS Dynamics 365 Connect: (UiConnection)">
964
+ <arguments>
965
+ <argument id="connectionName"><value class="value" valueClass="string">UiConnection</value></argument>
966
+ <argument id="resultName"><value class="value" valueClass="string">MSDynamics365Connection</value></argument>
967
+ <argument id="resultScope"><value class="value" valueClass="string">Test</value></argument>
968
+ <argument id="appName"><value class="value" valueClass="string">Sales Hub</value></argument>
969
+ </arguments>
970
+ </apiCall>
971
+ ```
972
+
973
+ ### Example: MSDataverseConnect (no variant args)
974
+
975
+ ```xml
976
+ <apiCall apiId="com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-dataverse"
977
+ name="NitroXConnect" testItemId="2" title="MS Dataverse Connect: (UiConnection)">
978
+ <arguments>
979
+ <argument id="connectionName"><value class="value" valueClass="string">UiConnection</value></argument>
980
+ <argument id="resultName"><value class="value" valueClass="string">MSDataverseConnection</value></argument>
981
+ <argument id="resultScope"><value class="value" valueClass="string">Test</value></argument>
982
+ </arguments>
983
+ <generatedParameters/>
984
+ </apiCall>
985
+ ```
986
+
987
+ ### Example: MSPowerAppConnect
988
+
989
+ ```xml
990
+ <apiCall apiId="com.provar.plugins.forcedotcom.core.ui.NitroXConnect:ms-powerapp"
991
+ name="NitroXConnect" testItemId="3" title="MS Power App Connect: (UiConnection)">
992
+ <arguments>
993
+ <argument id="connectionName"><value class="value" valueClass="string">UiConnection</value></argument>
994
+ <argument id="resultName"><value class="value" valueClass="string">MSPowerAppConnection</value></argument>
995
+ <argument id="resultScope"><value class="value" valueClass="string">Test</value></argument>
996
+ <argument id="powerAppName"><value class="value" valueClass="string">MyCanvasApp</value></argument>
997
+ </arguments>
998
+ </apiCall>
999
+ ```
1000
+
1001
+ ---
1002
+
825
1003
  ## Control Flow
826
1004
 
827
1005
  ### SetValues
@@ -52,8 +52,9 @@ Follow these steps in order:
52
52
  formats, then continue.
53
53
 
54
54
  3. **Map acceptance criteria to steps** — for each acceptance criterion, identify the corresponding Provar
55
- step type: field fills → UiDoAction (set), button clicks UiDoAction (action), field checks
56
- UiAssert, API data setupApexCreateObject, API verification ApexReadObject.
55
+ step type: field fills → UiDoAction (set) for one field at a time, or UiFill for multiple fields at once;
56
+ button clicks UiDoAction (action); field checks UiAssert; reading a value from the screen into a
57
+ variable → UiRead; API data setup → ApexCreateObject; API verification → ApexReadObject.
57
58
 
58
59
  4. **Generate the test case** — produce a valid Provar XML test case that tests the story's acceptance
59
60
  criteria. Base the structure entirely on the corpus examples. Follow these rules:
@@ -218,7 +219,7 @@ Follow these steps in order:
218
219
  **Structure**
219
220
  - [ ] Does the first UiWithScreen use navigate="Always" or "IfNecessary"?
220
221
  - [ ] Do Edit/View UiWithScreen steps with navigate="Always" include sfUiTargetObjectId?
221
- - [ ] Are all UiDoAction and UiAssert steps inside UiWithScreen substeps clauses?
222
+ - [ ] Are all UiDoAction, UiAssert, UiRead, UiFill, UiNavigate, UiWithRow, and UiHandleAlert steps inside UiWithScreen substeps clauses?
222
223
 
223
224
  **Unmapped steps**
224
225
  - [ ] Are there any \`<!-- TODO: -->\` comments indicating steps that couldn't be automated?
@@ -1 +1 @@
1
- {"version":3,"file":"loopPrompts.js","sourceRoot":"","sources":["../../../src/mcp/prompts/loopPrompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loopPrompts.js","sourceRoot":"","sources":["../../../src/mcp/prompts/loopPrompts.ts"],"names":[],"mappings":"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"}
@@ -588,6 +588,36 @@
588
588
  },
589
589
  "source": "Provar API Reference: UiConnect vs ApexConnect"
590
590
  },
591
+ {
592
+ "id": "UI-NITROX-CONNECT-ARGS-001",
593
+ "category": "ConnectionsAndEnvironments",
594
+ "name": "NitroX MS connect step has invalid arguments",
595
+ "description": "NitroXConnect:ms-* steps share a common argument set (connectionName, reuseConnectionName, privateBrowsingMode, resultName, resultScope, webBrowser) plus variant-specific args: ms-dynamics365 → appName; ms-powerapp → powerAppName; ms-powerpage → environment, powerPageName; ms-dataverse → none. NitroX MS variants do NOT support ApexConnect-only args (autoCleanup, lightningMode, alreadyOpenBehaviour, etc.) or arguments from sibling variants (e.g. powerAppName on ms-dynamics365).",
596
+ "appliesTo": ["Step"],
597
+ "severity": "critical",
598
+ "weight": 10,
599
+ "recommendation": "Remove invalid arguments from the NitroX MS connect step. Cross-variant args (e.g. powerAppName on ms-dynamics365) usually indicate the wrong apiId variant — verify which Microsoft product the step targets and update the apiId suffix accordingly.",
600
+ "check": {
601
+ "type": "nitroxConnectInvalidArgs",
602
+ "target": "step"
603
+ },
604
+ "source": "Provar 3.0.7 API Reference: NitroXConnect Microsoft variants"
605
+ },
606
+ {
607
+ "id": "UI-NITROX-VARIANT-ARG-001",
608
+ "category": "ConnectionsAndEnvironments",
609
+ "name": "NitroX MS connect step missing variant-specific argument",
610
+ "description": "Variants ms-dynamics365 (appName), ms-powerapp (powerAppName), and ms-powerpage (environment, powerPageName) each have variant-specific arguments. They may be left empty when declared as runtime-bound parameters via <generatedParameters><apiParam name=\"...\"/> (the data-driven test pattern). Otherwise they should be populated to avoid runtime null binding.",
611
+ "appliesTo": ["Step"],
612
+ "severity": "minor",
613
+ "weight": 2,
614
+ "recommendation": "Either populate the argument with a literal/variable value, or declare it as a runtime parameter under <generatedParameters> for data-driven tests.",
615
+ "check": {
616
+ "type": "nitroxVariantArgRequired",
617
+ "target": "step"
618
+ },
619
+ "source": "Provar 3.0.7 API Reference: NitroXConnect Microsoft variants"
620
+ },
591
621
  {
592
622
  "id": "APEX-AUTOCLEANUP-001",
593
623
  "category": "ConnectionsAndEnvironments",
@@ -2899,6 +2929,35 @@
2899
2929
  },
2900
2930
  "notes": "Provar internally stores dates as epoch timestamps (milliseconds since 1970-01-01). When valueClass='date' is used, Provar expects a numeric epoch value. String dates cause XML parsing/loading failures. All valid corpus examples use epoch timestamps with valueClass='date': 1637798400000, 1513209600000, etc.",
2901
2931
  "source": "Corpus analysis: All valueClass='date' values are epoch timestamps; string dates cause Provar IDE load failures"
2932
+ },
2933
+ {
2934
+ "id": "UI-NEST-STRUCT-001",
2935
+ "category": "XMLSchema",
2936
+ "name": "UI action steps must be nested inside a UiWithScreen substeps clause",
2937
+ "description": "UiDoAction, UiAssert, UiRead, UiFill, UiNavigate, UiWithRow, and UiHandleAlert steps must descend from a UiWithScreen or UiWithRow ancestor through a <clause name=\"substeps\"> path. Control-flow wrappers (IfThen, ForEach, DoWhile, WaitFor, Switch) between the screen ancestor and the UI action are allowed. Steps inside <clause name=\"hidden\"> are exempt. When emitted flat (e.g. as siblings of UiWithScreen in the root <steps>), Provar IDE cannot bind them to a screen context and they will not render correctly.",
2938
+ "appliesTo": ["Step"],
2939
+ "severity": "major",
2940
+ "weight": 7,
2941
+ "recommendation": "Wrap each UI action inside a parent UiWithScreen using this structure:\n\n <apiCall apiId=\"com.provar.plugins.forcedotcom.core.ui.UiWithScreen\" ...>\n <arguments>...</arguments>\n <clauses>\n <clause name=\"substeps\" testItemId=\"...\">\n <steps>\n <apiCall apiId=\"...UiDoAction\" .../>\n <apiCall apiId=\"...UiWithRow\" ...> ... </apiCall>\n </steps>\n </clause>\n </clauses>\n </apiCall>\n\nUiWithRow may contain its own <clauses><clause name=\"substeps\"> with further UI actions inside. Control-flow wrappers (IfThen, ForEach, DoWhile, WaitFor) between the screen ancestor and the UI action are allowed; <clause name=\"hidden\"> is exempt (disabled/settings blocks).",
2942
+ "check": {
2943
+ "type": "uiActionNestingStructure",
2944
+ "target": "step",
2945
+ "uiActionApiIds": [
2946
+ "com.provar.plugins.forcedotcom.core.ui.UiDoAction",
2947
+ "com.provar.plugins.forcedotcom.core.ui.UiAssert",
2948
+ "com.provar.plugins.forcedotcom.core.ui.UiRead",
2949
+ "com.provar.plugins.forcedotcom.core.ui.UiFill",
2950
+ "com.provar.plugins.forcedotcom.core.ui.UiNavigate",
2951
+ "com.provar.plugins.forcedotcom.core.ui.UiWithRow",
2952
+ "com.provar.plugins.forcedotcom.core.ui.UiHandleAlert"
2953
+ ],
2954
+ "screenContainerApiIds": [
2955
+ "com.provar.plugins.forcedotcom.core.ui.UiWithScreen",
2956
+ "com.provar.plugins.forcedotcom.core.ui.UiWithRow"
2957
+ ]
2958
+ },
2959
+ "notes": "Mirrors QH UiActionNestingStructureValidator (lambda/src/validator/best_practices_engine.py). Emits one violation per offending step so that (rule_id, test_item_id) de-dups against the API. UiWithRow plays a dual role: itself a UI action that must be nested, and a container whose substeps clause satisfies the rule for its descendants.",
2960
+ "source": "Field observation: flat-emitted UI actions (sibling of UiWithScreen) fail to render in Provar IDE despite scoring 100/94 in earlier local validation"
2902
2961
  }
2903
2962
  ]
2904
2963
  }