mq-check
Verifies that specified messages exist in queue
Overview
e:mq-send
<e:mq-check name="someQueue">
<e:message>{"msg" : "1"}</e:message>
<e:message from="/data/mq/msg2.json"/>
</e:mq-check>
Usage
1. Configure a map of queue aliases to MqTester implementations via MqPlugin.
2. Use e:mq-send tag in specification:
<e:mq-check name="someQueue">
<e:message>{"msg" : "1"}</e:message>
<e:message from="/data/mq/msg2.json"/>
</e:mq-check>
Attributes
| attribute | desc | example |
|---|---|---|
name |
Key from the map of a queue aliases to MqTester implementations configured in MqPlugin. | Required. Default: - |
from |
Use content of the specified file as a value instead of the tag body (empty tag can be used) | Optional. Default: - |
vars |
Comma-separated list of name=value pairs to set as variables | Optional. Default: - |
varsSeparator |
name=value pairs separator to use in vars attribute |
Optional. Default: , |
headers |
Comma-separated name=value list of headers to pass to the MqTester.send method.
Specific implementation of the MqTester may use this list as the message headers.
|
Optional. Default: empty |
contains |
Messages list verifying mode. Supported values: EXACT, EXACT_IN_ANY_ORDER. |
Optional. Default: EXACT
|
verifyAs |
Content verifier to use. Built-in verifiers: json, xml.
May be extended by passing addContentVerifiers parameter to
MqPlugin constructor.
|
Optional. Default: json
|
jsonUnitOptions |
";"-separated list of
JsonUnit Options to override defaults.
Applicable only when verifyAs="json".
|
Optional. Default: -
|
layout |
How to layout list of messages in report. Supported values: horizontally, vertically. |
Optional. Default: vertically
|
collapsable |
Render message in report as a collapsable block. | Optional. Default: false |
awaitAtMostSec |
How long to wait in seconds before failing the verification * | Optional. Default: 4 |
awaitPollDelayMillis |
How long to wait in millis before starting to verify * | Optional. Default: 0 |
awaitPollIntervalMillis |
How long to wait in millis between verification attempts * | Optional. Default: 1000 |
awaitAtMostSec, awaitPollDelayMillis or awaitPollIntervalMillis
attributes are set
Examples
Verify single message
Specifying message in tag body
To verify single message short form of the command may be used:
expected message template may be specified without nested e:message tag.
Given
Queue has a message:
{
"date": "2022-03-12"
} |
Then
Verify that there is the message:
<e:mq-check name="myQueue">{"date" : "{{now 'yyyy-MM-dd'}}"}</e:mq-check>will be rendered as:{
"date": "2022-03-12"
} |
Specifying message in file
Expected message template could be specified in file via from attribute.
The vars attribute could be used to conveniently provide context variables for message template.
Given
Queue has the message:
{
"date": "2022-03-12",
"var1": "2022-03-12",
"var2": "Fri Mar 11 00:00:00 MSK 2022",
"var3": "str with commas , signs"
} |
| file | content |
|---|---|
| msg.json | {
"date": "{{now 'yyyy-MM-dd'}}",
"var1": "{{myVar1}}",
"var2": "{{myVar2}}",
"var3": "{{myVar3}}"
} |
Then
Verify that there is the message:
<e:mq-check name="myQueue" from="/specs/mq/check/msg.json" vars="myVar1={{now 'yyyy-MM-dd'}} | myVar2={{date myVar1 minus='1 d'}} | myVar3=str with commas , signs" varsSeparator="|"/>will be rendered as:{
"date": "2022-03-12",
"var1": "2022-03-12",
"var2": "Fri Mar 11 00:00:00 MSK 2022",
"var3": "str with commas , signs"
} |
Verify empty queue
To verify that queue is empty the e:check command with empty tag body could be used.
Then
Verify that queue is empty:
<e:mq-check name="myQueue"/>will be rendered as:| EMPTY |
Overriding verification configuration for specific check
To override global JsonUnit configuration for specific check
the jsonUnitOptions attribute could be used.
Given
Queue has the message:
{
"param1": "1",
"extra": "ignore",
"arr": [{
"param3": "3",
"extra": "ignore"
}, {
"extra": "ignore",
"param4": "4"
}]
} |
Then
Verify ignoring extra fields:
<e:mq-check name="myQueue" verifyAs="jsonIgnoreExtraFields"> { "param1": "1", "arr": [{ "param3": "3" }, { "param4": "4"}] } </e:mq-check>will be rendered as:{ "param1": "1", "arr": [{ "param3": "3" }, { "param4": "4"}] } |
Verifying message list
Overview
Expected message list may be specified via nestede:message tags. Each message template may be
specified either as e:message tag body or in a file via from attribute.
The vars attribute could be used to conveniently provide context variables for message template.
Given
Queue has messages:
{
"msg": "1"
} |
{
"date": "2022-03-12",
"var1": "2022-03-12",
"var2": "Fri Mar 11 00:00:00 MSK 2022",
"var3": "str with commas , signs"
} |
{
"msg": "3"
} |
Then
Verify that there is the exact message list:
<e:mq-check name="myQueue">
<e:message>{"msg" : "1"}</e:message>
<e:message from="/specs/mq/check/msg.json" vars="myVar1={{now 'yyyy-MM-dd'}} | myVar2={{date myVar1 minus='1 d'}} | myVar3=str with commas , signs" varsSeparator="|"/>
<e:message>{"msg" : "3"}</e:message>
</e:mq-check>will be rendered as:{
"msg": "1"
} |
{
"date": "2022-03-12",
"var1": "2022-03-12",
"var2": "Fri Mar 11 00:00:00 MSK 2022",
"var3": "str with commas , signs"
} |
{
"msg": "3"
} |
Message order
contains attribute could be used to specify message order restriction.
By default e:mq-checkcommand waits until exact specified message list will appear in a queue in
exact provided order. To ignore order set contains="EXACT_IN_ANY_ORDER".
Given
Queue has messages:
{
"msg": "1"
} |
{
"msg": "2"
} |
{
"msg": "3"
} |
Then
Verify that there is the exact message list but ignoring order:
<e:mq-check name="myQueue" contains="EXACT_IN_ANY_ORDER">
<e:message>{"msg" : "3"}</e:message>
<e:message>{"msg" : "2"}</e:message>
<e:message>{"msg" : "1"}</e:message>
</e:mq-check>will be rendered as:{
"msg": "3"
} |
{
"msg": "2"
} |
{
"msg": "1"
} |
Verifying message headers
The headers attribute could be used for message headers verification.
Extracting actual headers from the message is the MqTester implementation
responsibility.
Given
Queue has the message with headers
id = some-id
and contentEncoding = UTF-8:
| ||||
{} |
Then
Verify the message and its headers:
<e:mq-check name="myQueue" headers="id={{id}}, contentEncoding=UTF-8">{}</e:mq-check>will be rendered as:
| ||||
{} |
In case of message list verifying the headers attribute may be applicable
to e:message tag.
Given
Queue has the messages with headers:
| ||||
{} |
| ||||
{} |
Then
Verify the message list and their headers:
<e:mq-check name="myQueue">
<e:message headers="id=1, date={{ignore}}">{}</e:message>
<e:message headers="id=2, date={{after (today)}}">{}</e:message>
</e:mq-check>will be rendered as:
| ||||
{} | ||||
| ||||
{} |
Verifying different message formats
An implementation of io.github.adven27.concordion.extensions.exam.core.ContentVerifier interface
is responsible for actual message body verifying. There are following built-in implementation:
ContentVerifier.Json-
Enabled by default or by
verifyAs="json"Uses
JsonAssert.assertJsonEqualsfor verification. ContentVerifier.Xml-
Enabled by
verifyAs="xml".Uses
DiffBuilder.comparefor verification. ContentVerifier.Default-
Fallback verifier. Enabled if no verifier are found for specified
verifyAsattribute.Uses jUnit
Assert.assertEqualsfor verification.
Additional verifier implementations may be provided by addContentVerifiers parameter of
MqPlugin constructor.
When
Queue has the message in
xml format:
<data>
<date>2022-03-12</date>
</data> |
Then
Verify the message as
xml:
<e:mq-check name="myQueue" from="/data/mq/some.xml" verifyAs="xml"/>will be rendered as:<data>
<date>2022-03-12</date>
</data> |
When
Queue has the message in some custom format:
date 2022-03-12 |
Then
Verify the message as
customFormat:
<e:mq-check name="myQueue">
<e:message from="/data/mq/some.txt" verifyAs="customFormat"/>
</e:mq-check>will be rendered as:date 2022-03-12 |
When
Queue has the messages in
xml and some custom format:
<data>
<date>2022-03-12</date>
</data> |
date 2022-03-12 |
Then
Verify the first message as
xml and the second as customFormat:
<e:mq-check name="myQueue">
<e:message from="/data/mq/some.xml" verifyAs="xml"/>
<e:message from="/data/mq/some.txt" verifyAs="customFormat"/>
</e:mq-check>will be rendered as:<data>
<date>2022-03-12</date>
</data> |
date 2022-03-12 |
Pretty-printing
Collapsable view
Big messages may be collapsed in report via the collapsable attribute.
Given
Queue has some big message:
[{
"index": 0,
"isActive": false,
"age": 28,
"name": "LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong"
}, {
"index": 1,
"isActive": true,
"age": 29,
"name": "Kasey Burris"
}, {
"index": 2,
"isActive": false,
"age": 40,
"name": "Antoinette Morse"
}, {
"index": 3,
"isActive": true,
"age": 32,
"name": "Lilia Ramirez"
}, {
"index": 4,
"isActive": true,
"age": 35,
"name": "Lily Joyner"
}, {
"index": 5,
"isActive": false,
"age": 22,
"name": "Ronda Norton"
}, {
"index": 6,
"isActive": false,
"age": 31,
"name": "Tiffany Davidson"
}, {
"index": 7,
"isActive": false,
"age": 40,
"name": "Allie Wise"
}, {
"index": 8,
"isActive": true,
"age": 40,
"name": "Giles Lopez"
}, {
"index": 9,
"isActive": false,
"age": 25,
"name": "Ramsey Cain"
}] |
Then
Verified message may be hide in a collapsable block:
<e:mq-check name="myQueue" from="/data/mq/big.json" collapsable="true"/>will be rendered as:[{
"index": 0,
"isActive": false,
"age": 28,
"name": "LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong"
}, {
"index": 1,
"isActive": true,
"age": 29,
"name": "Kasey Burris"
}, {
"index": 2,
"isActive": false,
"age": 40,
"name": "Antoinette Morse"
}, {
"index": 3,
"isActive": true,
"age": 32,
"name": "Lilia Ramirez"
}, {
"index": 4,
"isActive": true,
"age": 35,
"name": "Lily Joyner"
}, {
"index": 5,
"isActive": false,
"age": 22,
"name": "Ronda Norton"
}, {
"index": 6,
"isActive": false,
"age": 31,
"name": "Tiffany Davidson"
}, {
"index": 7,
"isActive": false,
"age": 40,
"name": "Allie Wise"
}, {
"index": 8,
"isActive": true,
"age": 40,
"name": "Giles Lopez"
}, {
"index": 9,
"isActive": false,
"age": 25,
"name": "Ramsey Cain"
}] |
Layout
Layout of the message list in report may be changed via the layout attribute.
Given
Queue has messages:
[{
"index": 0,
"isActive": false,
"age": 28,
"name": "LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong"
}, {
"index": 1,
"isActive": true,
"age": 29,
"name": "Kasey Burris"
}, {
"index": 2,
"isActive": false,
"age": 40,
"name": "Antoinette Morse"
}, {
"index": 3,
"isActive": true,
"age": 32,
"name": "Lilia Ramirez"
}, {
"index": 4,
"isActive": true,
"age": 35,
"name": "Lily Joyner"
}, {
"index": 5,
"isActive": false,
"age": 22,
"name": "Ronda Norton"
}, {
"index": 6,
"isActive": false,
"age": 31,
"name": "Tiffany Davidson"
}, {
"index": 7,
"isActive": false,
"age": 40,
"name": "Allie Wise"
}, {
"index": 8,
"isActive": true,
"age": 40,
"name": "Giles Lopez"
}, {
"index": 9,
"isActive": false,
"age": 25,
"name": "Ramsey Cain"
}] |
[{
"index": 0,
"isActive": false,
"age": 28,
"name": "LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong"
}, {
"index": 1,
"isActive": true,
"age": 29,
"name": "Kasey Burris"
}, {
"index": 2,
"isActive": false,
"age": 40,
"name": "Antoinette Morse"
}, {
"index": 3,
"isActive": true,
"age": 32,
"name": "Lilia Ramirez"
}, {
"index": 4,
"isActive": true,
"age": 35,
"name": "Lily Joyner"
}, {
"index": 5,
"isActive": false,
"age": 22,
"name": "Ronda Norton"
}, {
"index": 6,
"isActive": false,
"age": 31,
"name": "Tiffany Davidson"
}, {
"index": 7,
"isActive": false,
"age": 40,
"name": "Allie Wise"
}, {
"index": 8,
"isActive": true,
"age": 40,
"name": "Giles Lopez"
}, {
"index": 9,
"isActive": false,
"age": 25,
"name": "Ramsey Cain"
}] |
Then
Verify and print in horizontal layout:
<e:mq-check name="myQueue" collapsable="true" layout="horizontally">
<e:message from="/data/mq/big.json"/>
<e:message from="/data/mq/big.json"/>
</e:mq-check>will be rendered as:[{
"index": 0,
"isActive": false,
"age": 28,
"name": "LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong"
}, {
"index": 1,
"isActive": true,
"age": 29,
"name": "Kasey Burris"
}, {
"index": 2,
"isActive": false,
"age": 40,
"name": "Antoinette Morse"
}, {
"index": 3,
"isActive": true,
"age": 32,
"name": "Lilia Ramirez"
}, {
"index": 4,
"isActive": true,
"age": 35,
"name": "Lily Joyner"
}, {
"index": 5,
"isActive": false,
"age": 22,
"name": "Ronda Norton"
}, {
"index": 6,
"isActive": false,
"age": 31,
"name": "Tiffany Davidson"
}, {
"index": 7,
"isActive": false,
"age": 40,
"name": "Allie Wise"
}, {
"index": 8,
"isActive": true,
"age": 40,
"name": "Giles Lopez"
}, {
"index": 9,
"isActive": false,
"age": 25,
"name": "Ramsey Cain"
}] |
[{
"index": 0,
"isActive": false,
"age": 28,
"name": "LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong"
}, {
"index": 1,
"isActive": true,
"age": 29,
"name": "Kasey Burris"
}, {
"index": 2,
"isActive": false,
"age": 40,
"name": "Antoinette Morse"
}, {
"index": 3,
"isActive": true,
"age": 32,
"name": "Lilia Ramirez"
}, {
"index": 4,
"isActive": true,
"age": 35,
"name": "Lily Joyner"
}, {
"index": 5,
"isActive": false,
"age": 22,
"name": "Ronda Norton"
}, {
"index": 6,
"isActive": false,
"age": 31,
"name": "Tiffany Davidson"
}, {
"index": 7,
"isActive": false,
"age": 40,
"name": "Allie Wise"
}, {
"index": 8,
"isActive": true,
"age": 40,
"name": "Giles Lopez"
}, {
"index": 9,
"isActive": false,
"age": 25,
"name": "Ramsey Cain"
}] |