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-check
command 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.assertJsonEquals
for verification. ContentVerifier.Xml
-
Enabled by
verifyAs="xml"
.Uses
DiffBuilder.compare
for verification. ContentVerifier.Default
-
Fallback verifier. Enabled if no verifier are found for specified
verifyAs
attribute.Uses jUnit
Assert.assertEquals
for 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"
}] |