Response Templating - Conditional Logic and Iteration
Taking actions conditionally and looping over collections of data are very common requirements from a templating system. This article explains how these are achieved in WireMock Cloud.
Conditional logic with if / else and unless
Handlebars provides a set of core helpers that implement if / else if / else logic of the kind found in many programming languages.
As with most implementations of if, the simples form is to take an action only if the condition is true:
An else clause can be used:
And any number of else if clauses can also be added:
Finally, you can take an action if a condition is false using unless
:
Comparison helpers
The if
, else if
and unless
helpers all take a single boolean value as their parameter. In practice you often need to derive that value by comparing other values, and for this we have a set of helpers implementing common comparison operations.
For instance if you needed to check that a variable equalled a particular string you would use the eq
helper:
You can nest comparison helpers inside the if
helper:
You can also use comparison helpers with else
:
The following comparison helpers are available:
eq
- equal
neq
- not equal
gt
- greater than
gte
- greater than or equal to
lt
- less than
lte
- less than or equal
and
- logical AND
or
- logical OR
not
- logical NOT
Iteration
You can loop over collections of data using the each
helper.
Iterating over JSON and XML elements
The jsonPath
and xPath
helpers both output collections so these can be used in an each
loop. See Working with JSON and Working with XML for details.
Detecting the first and last element while looping
Often it can be useful to know when you’re processing the first or last element in a collection e.g. so that you can decide whether to output a separate character.
You can do this using the @first
and @last
variables that are automatically provided to the scope inside the each
block.
For instance, if you wanted to output a list of JSON objects, separated with commas and avoiding an extraneous comma at the end:
Getting the loop index
The each
helper also creates an @index
variable in its scope which you can use to get at the (zero-indexed) element counter:
String and collection conditionals
Contains helper
The contains
helper returns a boolean value indicating whether the string or array passed as the first parameter contains the string passed in the second.
It can be used as parameter to the if
helper:
Or as a block element on its own:
Matches helper
The matches
helper returns a boolean value indicating whether the string passed as the first parameter matches the regular expression passed in the second:
Like the contains
helper it can be used as parameter to the if
helper:
Or as a block element on its own: