Selected Accounts

Mock accounts selected for a request can be used to form a response that is specific for this particular account or flow.

For example:

The values in the response can be taken from the mock account
The response can contain different number of nested items, e.g. order items
The response can be made to return an error or fault for some mock accounts
The response delay can be made to depend on the used mock account

Single Account

The selected account variable ($account for XML, account for JSON) contains one mock account selected for the response.

If no accounts were selected, $account will have an empty sequence () and account will be null.

One Account Out of Many

If more than one account is selected for the response, the value of $account and account is a single, randomly chosen account from the full set of selected accounts.

Please do not make an assumption about which account from a set becomes $account/account. It can be a different account for each call.

As XML

For XML responses, $account contains a sequence of elements named after the properties in the mock account and their text content has the values of those properties.

For example, for a mock account that contains 3 properties (ban, nag and subid) the variable $account will have the following structure:

      <account>
         <ban>33</ban>
         <nag>3</nag>
         <subid>333</subid>
      </account>

These values can be used in the response, for example:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
     <w:GetAccountsResponse xmlns:w="accounts:store">
         <w:Ban>{$account/*:ban/text()}</w:Ban>
         <w:Nag>{$account/*:nag/text()}</w:Nag>
         <w:Subid>{$account/*:subid/text()}</w:Subid>
     </w:GetAccountsResponse>
   </soapenv:Body>
</soapenv:Envelope>
Always use the namespace wildcard `*:` when dereferencing an account property. Sometimes, it may work without it but it depends on the response default namespace.

Note: you do not have to use the full path to a property in the account. You can just use the property name, e.g. {$subid}. Read Simplified Variables for more info.

As JSON

For JSON responses, account contains a map of mock account properties and their text content has the values of those properties.

For example, for a mock account that contains 3 properties (ban, nag and subid) the variable account will have the following structure:

   {
      "ban": "33",
      "nag": "3",
      "subid": "333"
   }

These values can be used in the response, for example:

{
  "Ban": account.ban,
  "Nag": account.nag,
  "Subid": account.subid
}

Multi-Values

When an account contains a multi-value (multiple values for the same property), the format of the variable values changes.

Imagine an account that has three values for property subid: 100, 200 and 300.

XML

When an account contains a multi-value for a property, $account has multiple elements for that property.

      <account>
         <subid>100</subid>
         <subid>200</subid>
         <subid>300</subid>
         <ban>30593002</ban>
         <nag>3059300</nag>
      </account>

The multi-values then can be iterated in the response using XQuery for loop:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
     <w:GetAccountsResponse xmlns:w="accounts:store">
         <w:Ban>{$account/*:ban/text()}</w:Ban>
         <w:Nag>{$account/*:nag/text()}</w:Nag>
         {
           for $subid in $account/*:subid/text()
           return
             <w:Subid>{$account/*:subid/text()}</w:Subid>
         }
     </w:GetAccountsResponse>
   </soapenv:Body>
</soapenv:Envelope>

JSON

The same account, when represented as JSON, has an array value for that property instead of a string:

   {
      "ban": "33",
      "nag": "3",
      "subid": [ "100","200","300" ]
   }

The multi-values can be iterated using a regular Javascript loop:

output = 
{
  "Ban": account.ban,
  "Nag": account.nag
}

for(var i=0; i<account.subid.length; i++ ) {
  var sub = account.subid[i];
  output["Subid"+i] = sub;
}

Multiple Accounts

When multiple accounts match the condition in the reaction, all of them are collected into a set under accounts variable ($accounts for XML, accounts for JSON).

If no accounts were selected, $accounts will have an empty sequence () and accounts will be an empty array [].

As XML

For XML reactions, $accounts contains a sequence of account elements that are identical in structure to $account variable. The order of accounts in the sequence is not specified.

For example:

<accounts>
    <account>
        <ban>33</ban>
        <nag>3</nag>
        <subid>333</subid>
    </account>
    <account>
        <ban>47</ban>
        <nag>2</nag>
        <subid>8710</subid>
    </account>
</accounts>

Accounts can be iterated with XQuery for loop, as, for example, in this response payload:

<GetOrders>
         {
           for $order in $accounts/*:account
           return
             <Order>
                 <OrderId>{$order/*:id/text()}</Order>
                 <Summary>{$order/*:summary/text()}</Summary>
                 ...
             </Order>
         }
</GetOrders>

As JSON

For JSON reactions, accounts contains an array if mock account objects.

[
   {
      "ban": "33",
      "nag": "3",
      "subid": "333"
   },
   {
      "ban": "47",
      "nag": "2",
      "subid": "8710"
   }
]

The accounts can be iterated with Javascript to form a response that contains a number of nested items:

output = 
{
  "account": account.id,
  "orders": []
}

for(var i=0; i<accounts.length; i++ ) {
  var acc = accounts[i];
  
  var order = {
    "id": acc.orderId,
    "summary": acc.summary,
    ...
  };

  output.orders.push(order);
}