diff --git a/output/examples.json b/output/examples.json index ab30be3a..bab0846d 100644 --- a/output/examples.json +++ b/output/examples.json @@ -1,7 +1,7 @@ { "valid": true, "name": "enqueuer", - "id": "1326090316_44deaa57a3_508005", + "id": "1511140200_44deaa57a3_808603", "level": 0, "subscriptions": [], "publishers": [], @@ -12,14 +12,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } }, "onFinish": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 5162 + "elapsedTime": 5156 } }, "onParsed": { @@ -28,15 +28,15 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.361Z", - "endTime": "2020-02-02T16:26:14.523Z", - "totalTime": 5162 + "startTime": "2020-02-07T18:11:14.234Z", + "endTime": "2020-02-07T18:11:19.390Z", + "totalTime": 5156 }, "requisitions": [ { "valid": true, "name": "examples/assertions.yml", - "id": "1326090317_2ca609e341_839850", + "id": "1511140200_2ca609e341_31474", "level": 1, "subscriptions": [], "publishers": [], @@ -150,14 +150,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 94 + "elapsedTime": 87 } } }, "time": { - "startTime": "2020-02-02T16:26:09.364Z", - "endTime": "2020-02-02T16:26:09.459Z", - "totalTime": 95, + "startTime": "2020-02-07T18:11:14.236Z", + "endTime": "2020-02-07T18:11:14.324Z", + "totalTime": 88, "timeout": 5000 }, "requisitions": [] @@ -165,11 +165,11 @@ { "valid": true, "name": "examples/avoid.yml", - "id": "1326090317_852d538668_231533", + "id": "1511140200_852d538668_115134", "level": 1, "subscriptions": [ { - "id": "1326090317_2e0cc1fd7c_790611", + "id": "1511140200_2e0cc1fd7c_988098", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -190,15 +190,15 @@ } ], "arguments": { - "elapsedTime": 3067 + "elapsedTime": 3060 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.358Z" }, { - "id": "1326090317_8444956d6a_697018", + "id": "1511140200_8444956d6a_524639", "name": "Subscription #1", "type": "HTTP", "hooks": { @@ -219,12 +219,12 @@ } ], "arguments": { - "elapsedTime": 3066 + "elapsedTime": 3060 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [], @@ -242,14 +242,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 3067 + "elapsedTime": 3060 } } }, "time": { - "startTime": "2020-02-02T16:26:09.367Z", - "endTime": "2020-02-02T16:26:12.434Z", - "totalTime": 3067, + "startTime": "2020-02-07T18:11:14.239Z", + "endTime": "2020-02-07T18:11:17.299Z", + "totalTime": 3060, "timeout": 5000 }, "requisitions": [] @@ -257,7 +257,7 @@ { "valid": true, "name": "examples/crypto-require.yml", - "id": "1326090317_1d33e31a27_241634", + "id": "1511140200_1d33e31a27_1000169", "level": 1, "subscriptions": [], "publishers": [], @@ -281,14 +281,14 @@ } ], "arguments": { - "elapsedTime": 90 + "elapsedTime": 83 } } }, "time": { - "startTime": "2020-02-02T16:26:09.368Z", - "endTime": "2020-02-02T16:26:09.459Z", - "totalTime": 91, + "startTime": "2020-02-07T18:11:14.240Z", + "endTime": "2020-02-07T18:11:14.324Z", + "totalTime": 84, "timeout": 5000 }, "requisitions": [] @@ -296,11 +296,11 @@ { "valid": true, "name": "examples/custom.yml", - "id": "1326090317_6da5232086_169407", + "id": "1511140201_6da5232086_498716", "level": 1, "subscriptions": [ { - "id": "1326090317_f6315a7fbc_588889", + "id": "1511140201_f6315a7fbc_709568", "name": "subscription description", "type": "custom", "hooks": { @@ -321,7 +321,7 @@ } ], "arguments": { - "elapsedTime": 153 + "elapsedTime": 156 } }, "onMessageReceived": { @@ -349,20 +349,20 @@ "remoteInfo": { "address": "127.0.0.1", "family": "IPv4", - "port": 53319, + "port": 60675, "size": 2 }, - "elapsedTime": 153 + "elapsedTime": 155 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.452Z" + "subscriptionTime": "2020-02-07T18:11:14.318Z" } ], "publishers": [ { - "id": "1326090317_816cec1424_16152", + "id": "1511140201_816cec1424_3624", "name": "publisher description", "valid": true, "hooks": { @@ -375,7 +375,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 152 + "elapsedTime": 156 }, "tests": [ { @@ -388,7 +388,7 @@ } }, "type": "custom", - "publishTime": "2020-02-02T16:26:09.504Z" + "publishTime": "2020-02-07T18:11:14.369Z" } ], "iteration": 0, @@ -405,14 +405,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 153 + "elapsedTime": 157 } } }, "time": { - "startTime": "2020-02-02T16:26:09.369Z", - "endTime": "2020-02-02T16:26:09.522Z", - "totalTime": 153, + "startTime": "2020-02-07T18:11:14.241Z", + "endTime": "2020-02-07T18:11:14.398Z", + "totalTime": 157, "timeout": 5000 }, "requisitions": [] @@ -420,7 +420,7 @@ { "valid": true, "name": "examples/file-placeholder.yml", - "id": "1326090317_a5f62352f4_408120", + "id": "1511140201_a5f62352f4_130626", "level": 1, "subscriptions": [], "publishers": [], @@ -438,21 +438,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 99 + "elapsedTime": 92 } } }, "time": { - "startTime": "2020-02-02T16:26:09.372Z", - "endTime": "2020-02-02T16:26:09.472Z", - "totalTime": 100, + "startTime": "2020-02-07T18:11:14.243Z", + "endTime": "2020-02-07T18:11:14.336Z", + "totalTime": 93, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090317_374c18eaf8_136516", + "id": "1511140201_374c18eaf8_484646", "level": 2, "subscriptions": [], "publishers": [], @@ -491,14 +491,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 40 + "elapsedTime": 39 } } }, "time": { - "startTime": "2020-02-02T16:26:09.419Z", - "endTime": "2020-02-02T16:26:09.459Z", - "totalTime": 40, + "startTime": "2020-02-07T18:11:14.285Z", + "endTime": "2020-02-07T18:11:14.324Z", + "totalTime": 39, "timeout": 5000 }, "requisitions": [] @@ -506,7 +506,7 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090317_8067e3ed86_482921", + "id": "1511140201_8067e3ed86_814949", "level": 2, "subscriptions": [], "publishers": [], @@ -535,8 +535,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.462Z", - "endTime": "2020-02-02T16:26:09.467Z", + "startTime": "2020-02-07T18:11:14.327Z", + "endTime": "2020-02-07T18:11:14.332Z", "totalTime": 5, "timeout": 5000 }, @@ -547,11 +547,11 @@ { "valid": true, "name": "examples/file.yml", - "id": "1326090317_d7a8d31f32_965694", + "id": "1511140201_d7a8d31f32_590115", "level": 1, "subscriptions": [ { - "id": "1326090318_3dd85e61fc_704384", + "id": "1511140201_3dd85e61fc_199645", "name": "subscription description", "type": "file-system-watcher", "hooks": { @@ -572,7 +572,7 @@ } ], "arguments": { - "elapsedTime": 144 + "elapsedTime": 150 } }, "onMessageReceived": { @@ -581,12 +581,12 @@ { "name": "Some time has passed", "valid": true, - "description": "Expected 'now' to be greater than or equal to '1580660769373'. Received '1580660769516'" + "description": "Expected 'now' to be greater than or equal to '1581099006822'. Received '1581099074392'" }, { "name": "Filename", "valid": true, - "description": "Expecting 'temp/fileTest1326090455_1f3e20bfac_364027.file' (name) to contain 'temp/'" + "description": "Expecting 'temp/fileTest1510060896_615fe60a48_840107.file' (name) to contain 'temp/'" }, { "name": "Content", @@ -610,22 +610,22 @@ } ], "arguments": { - "content": "1580660769373", - "name": "temp/fileTest1326090455_1f3e20bfac_364027.file", + "content": "1581099006822", + "name": "temp/fileTest1510060896_615fe60a48_840107.file", "size": 13, - "modified": "2020-02-02T16:26:09.456Z", - "created": "2020-02-02T16:26:09.456Z", - "elapsedTime": 143 + "modified": "2020-02-07T18:10:06.897Z", + "created": "2020-02-07T18:10:06.897Z", + "elapsedTime": 148 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.450Z" + "subscriptionTime": "2020-02-07T18:11:14.316Z" } ], "publishers": [ { - "id": "1326090318_4b5a457015_35923", + "id": "1511140201_4b5a457015_419508", "name": "publisher description", "valid": true, "hooks": { @@ -638,7 +638,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 144 + "elapsedTime": 150 }, "tests": [ { @@ -651,7 +651,7 @@ } }, "type": "file", - "publishTime": "2020-02-02T16:26:09.458Z" + "publishTime": "2020-02-07T18:11:14.324Z" } ], "iteration": 0, @@ -668,14 +668,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 144 + "elapsedTime": 150 } } }, "time": { - "startTime": "2020-02-02T16:26:09.373Z", - "endTime": "2020-02-02T16:26:09.517Z", - "totalTime": 144, + "startTime": "2020-02-07T18:11:14.244Z", + "endTime": "2020-02-07T18:11:14.394Z", + "totalTime": 150, "timeout": 3000 }, "requisitions": [] @@ -683,11 +683,11 @@ { "valid": true, "name": "examples/hooks.yml", - "id": "1326090318_75b8872357_781943", + "id": "1511140201_75b8872357_374739", "level": 1, "subscriptions": [ { - "id": "1326090318_fbe2d8d804_817690", + "id": "1511140201_fbe2d8d804_922984", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -724,7 +724,7 @@ } ], "arguments": { - "elapsedTime": 2150 + "elapsedTime": 2160 } }, "onMessageReceived": { @@ -753,17 +753,17 @@ "family": "IPv6", "port": 23080 }, - "elapsedTime": 151 + "elapsedTime": 157 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.358Z" } ], "publishers": [ { - "id": "1326090318_ca0fe1e8c5_636544", + "id": "1511140201_ca0fe1e8c5_89497", "name": "Publisher #0", "valid": true, "hooks": { @@ -802,7 +802,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 2149 + "elapsedTime": 2160 }, "tests": [ { @@ -819,11 +819,31 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 50494 + "port": 52234 }, - "elapsedTime": 2150 + "elapsedTime": 2161 }, "tests": [ + { + "name": "Publisher exists onMessageReceived", + "valid": true, + "description": "Expecting 'publisher' to be defined" + }, + { + "name": "Requisition onInit", + "valid": true, + "description": "Expecting 'requisition::onInit-> subscription::onInit-> publisher::onInit-> publisher::onMessageReceived' (store.sequence) to contain 'requisition::onInit'" + }, + { + "name": "Publisher name changed", + "valid": true, + "description": "Expected 'publisher.name' to be equal to 'changed'. Received 'changed'" + }, + { + "name": "Publisher onInit executed", + "valid": true, + "description": "Expecting 'requisition::onInit-> subscription::onInit-> publisher::onInit-> publisher::onMessageReceived' (store.sequence) to contain 'publisher::onInit'" + }, { "name": "Publisher exists onMessageReceived", "valid": true, @@ -849,7 +869,7 @@ } }, "type": "tcp", - "publishTime": "2020-02-02T16:26:11.526Z" + "publishTime": "2020-02-07T18:11:16.407Z" } ], "iteration": 0, @@ -877,14 +897,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2150 + "elapsedTime": 2160 } } }, "time": { - "startTime": "2020-02-02T16:26:09.376Z", - "endTime": "2020-02-02T16:26:11.526Z", - "totalTime": 2150, + "startTime": "2020-02-07T18:11:14.247Z", + "endTime": "2020-02-07T18:11:16.407Z", + "totalTime": 2160, "timeout": 3000 }, "requisitions": [] @@ -892,11 +912,11 @@ { "valid": true, "name": "examples/http-auth-basic.yml", - "id": "1326090318_6420f75659_433640", + "id": "1511140201_6420f75659_876027", "level": 1, "subscriptions": [ { - "id": "1326090318_94e20b540b_452567", + "id": "1511140201_94e20b540b_749887", "name": "Subscription #0", "type": "http", "hooks": { @@ -917,7 +937,7 @@ } ], "arguments": { - "elapsedTime": 168 + "elapsedTime": 191 } }, "onMessageReceived": { @@ -941,17 +961,17 @@ "query": {}, "url": "/basic", "body": "basic auth", - "elapsedTime": 153 + "elapsedTime": 162 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [ { - "id": "1326090318_f4551bd7af_491704", + "id": "1511140201_f4551bd7af_663759", "name": "Publisher #0", "valid": true, "hooks": { @@ -964,7 +984,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 168 + "elapsedTime": 191 }, "tests": [ { @@ -986,7 +1006,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "19", "etag": "W/\"13-nGN7LEwCUKXpQoLxNqKZXSglYNc\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -1026,7 +1046,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "19", "etag": "W/\"13-nGN7LEwCUKXpQoLxNqKZXSglYNc\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -1063,7 +1083,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.547Z" + "publishTime": "2020-02-07T18:11:14.440Z" } ], "iteration": 0, @@ -1080,14 +1100,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 169 + "elapsedTime": 191 } } }, "time": { - "startTime": "2020-02-02T16:26:09.378Z", - "endTime": "2020-02-02T16:26:09.547Z", - "totalTime": 169, + "startTime": "2020-02-07T18:11:14.249Z", + "endTime": "2020-02-07T18:11:14.440Z", + "totalTime": 191, "timeout": 3000 }, "requisitions": [] @@ -1095,11 +1115,11 @@ { "valid": true, "name": "examples/http-auth-bearer.yml", - "id": "1326090318_5e821857a3_880154", + "id": "1511140201_5e821857a3_426607", "level": 1, "subscriptions": [ { - "id": "1326090318_dab3c9a05e_653545", + "id": "1511140201_dab3c9a05e_636929", "name": "Subscription #0", "type": "http", "hooks": { @@ -1120,7 +1140,7 @@ } ], "arguments": { - "elapsedTime": 168 + "elapsedTime": 192 } }, "onMessageReceived": { @@ -1144,17 +1164,17 @@ "query": {}, "url": "/bearer", "body": "Rech", - "elapsedTime": 155 + "elapsedTime": 170 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [ { - "id": "1326090318_388c1593e3_386189", + "id": "1511140201_388c1593e3_123886", "name": "Publisher #0", "valid": true, "hooks": { @@ -1167,7 +1187,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 169 + "elapsedTime": 193 }, "tests": [ { @@ -1189,7 +1209,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "15", "etag": "W/\"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -1229,7 +1249,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "15", "etag": "W/\"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -1266,7 +1286,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.548Z" + "publishTime": "2020-02-07T18:11:14.442Z" } ], "iteration": 0, @@ -1283,14 +1303,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 168 + "elapsedTime": 193 } } }, "time": { - "startTime": "2020-02-02T16:26:09.380Z", - "endTime": "2020-02-02T16:26:09.549Z", - "totalTime": 169, + "startTime": "2020-02-07T18:11:14.250Z", + "endTime": "2020-02-07T18:11:14.443Z", + "totalTime": 193, "timeout": 3000 }, "requisitions": [] @@ -1298,11 +1318,11 @@ { "valid": true, "name": "examples/http-auth-digest.yml", - "id": "1326090319_784968c016_601958", + "id": "1511140201_784968c016_176616", "level": 1, "subscriptions": [ { - "id": "1326090319_b8f024a270_119399", + "id": "1511140202_b8f024a270_687770", "name": "Subscription #0", "type": "http", "hooks": { @@ -1323,7 +1343,7 @@ } ], "arguments": { - "elapsedTime": 167 + "elapsedTime": 189 } }, "onMessageReceived": { @@ -1347,17 +1367,17 @@ "query": {}, "url": "/digest", "body": "Rech", - "elapsedTime": 154 + "elapsedTime": 166 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [ { - "id": "1326090319_b553ccdd3b_753448", + "id": "1511140201_b553ccdd3b_773032", "name": "Publisher #0", "valid": true, "hooks": { @@ -1370,7 +1390,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 167 + "elapsedTime": 190 }, "tests": [ { @@ -1392,7 +1412,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "15", "etag": "W/\"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -1432,7 +1452,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "15", "etag": "W/\"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -1469,7 +1489,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.549Z" + "publishTime": "2020-02-07T18:11:14.441Z" } ], "iteration": 0, @@ -1486,14 +1506,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 167 + "elapsedTime": 190 } } }, "time": { - "startTime": "2020-02-02T16:26:09.382Z", - "endTime": "2020-02-02T16:26:09.549Z", - "totalTime": 167, + "startTime": "2020-02-07T18:11:14.252Z", + "endTime": "2020-02-07T18:11:14.442Z", + "totalTime": 190, "timeout": 3000 }, "requisitions": [] @@ -1501,7 +1521,7 @@ { "valid": true, "name": "examples/http-more-examples.yml", - "id": "1326090319_a064465f3e_659685", + "id": "1511140202_a064465f3e_455669", "level": 1, "subscriptions": [], "publishers": [], @@ -1519,25 +1539,25 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2393 + "elapsedTime": 2379 } } }, "time": { - "startTime": "2020-02-02T16:26:09.388Z", - "endTime": "2020-02-02T16:26:11.781Z", - "totalTime": 2393, + "startTime": "2020-02-07T18:11:14.258Z", + "endTime": "2020-02-07T18:11:16.637Z", + "totalTime": 2379, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090319_f13fd961e3_727879", + "id": "1511140202_f13fd961e3_94808", "level": 2, "subscriptions": [ { - "id": "1326090319_e916596275_350239", + "id": "1511140202_e916596275_512431", "name": "Subscription #0", "type": "http", "hooks": { @@ -1558,7 +1578,7 @@ } ], "arguments": { - "elapsedTime": 335 + "elapsedTime": 334 } }, "onMessageReceived": { @@ -1601,15 +1621,15 @@ }, "url": "/enqueuer/idStuff?query=2345", "body": "{\"enqueuer\":\"virgs\"}", - "elapsedTime": 119 + "elapsedTime": 141 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" }, { - "id": "1326090319_ba5a509689_251012", + "id": "1511140202_ba5a509689_413033", "name": "same port", "type": "http", "hooks": { @@ -1646,15 +1666,15 @@ "query": {}, "url": "/samePort", "body": "virgs", - "elapsedTime": 119 + "elapsedTime": 143 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" }, { - "id": "1326090319_42d8fc1293_581038", + "id": "1511140202_42d8fc1293_453458", "name": "yet another, but avoidable", "type": "http", "hooks": { @@ -1680,12 +1700,12 @@ } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [ { - "id": "1326090319_acd0fb7e94_331041", + "id": "1511140202_acd0fb7e94_772145", "name": "Publisher #0", "valid": true, "hooks": { @@ -1721,7 +1741,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "27", "etag": "W/\"1b-e5esTWfu+XftewZ5g2Tclr7ClTo\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -1778,7 +1798,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "27", "etag": "W/\"1b-e5esTWfu+XftewZ5g2Tclr7ClTo\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -1809,10 +1829,10 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.551Z" + "publishTime": "2020-02-07T18:11:14.444Z" }, { - "id": "1326090319_72ad57ec09_657940", + "id": "1511140202_72ad57ec09_850261", "name": "Publisher #1", "valid": true, "hooks": { @@ -1847,7 +1867,7 @@ "content-type": "application/json; charset=utf-8", "content-length": "17", "etag": "W/\"11-nJYBwrCE3yNNre0RUpA2SJDxlIY\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -1896,7 +1916,7 @@ "content-type": "application/json; charset=utf-8", "content-length": "17", "etag": "W/\"11-nJYBwrCE3yNNre0RUpA2SJDxlIY\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -1925,7 +1945,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.551Z" + "publishTime": "2020-02-07T18:11:14.445Z" } ], "iteration": 0, @@ -1942,13 +1962,13 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 335 + "elapsedTime": 334 } } }, "time": { - "startTime": "2020-02-02T16:26:09.421Z", - "endTime": "2020-02-02T16:26:09.756Z", + "startTime": "2020-02-07T18:11:14.288Z", + "endTime": "2020-02-07T18:11:14.623Z", "totalTime": 335, "timeout": 3000 }, @@ -1957,11 +1977,11 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090319_16e7db54dd_567488", + "id": "1511140202_16e7db54dd_527937", "level": 2, "subscriptions": [ { - "id": "1326090319_34a6878700_409948", + "id": "1511140202_34a6878700_25225", "name": "Subscription #0", "type": "http", "hooks": { @@ -2014,12 +2034,12 @@ } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.759Z" + "subscriptionTime": "2020-02-07T18:11:14.625Z" } ], "publishers": [ { - "id": "1326090319_45f272e419_966998", + "id": "1511140202_45f272e419_801119", "name": "publisher description", "valid": true, "hooks": { @@ -2054,7 +2074,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "25", "etag": "W/\"19-yZRAgggcER0sMyRTVBBpErTPT/A\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -2104,7 +2124,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "25", "etag": "W/\"19-yZRAgggcER0sMyRTVBBpErTPT/A\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -2134,7 +2154,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.762Z" + "publishTime": "2020-02-07T18:11:14.628Z" } ], "iteration": 0, @@ -2156,9 +2176,9 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.758Z", - "endTime": "2020-02-02T16:26:09.763Z", - "totalTime": 5, + "startTime": "2020-02-07T18:11:14.624Z", + "endTime": "2020-02-07T18:11:14.628Z", + "totalTime": 4, "timeout": 5000 }, "requisitions": [] @@ -2166,11 +2186,11 @@ { "valid": true, "name": "requisition 2 (port 23076)", - "id": "1326090319_eff03cbee0_266401", + "id": "1511140202_eff03cbee0_49250", "level": 2, "subscriptions": [ { - "id": "1326090319_e5e0d9ff8c_632462", + "id": "1511140202_e5e0d9ff8c_519336", "name": "subscription description", "type": "http", "hooks": { @@ -2191,12 +2211,12 @@ } ], "arguments": { - "elapsedTime": 1005 + "elapsedTime": 1000 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.764Z" + "subscriptionTime": "2020-02-07T18:11:14.629Z" } ], "publishers": [], @@ -2207,21 +2227,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } }, "onFinish": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 1005 + "elapsedTime": 1001 } } }, "time": { - "startTime": "2020-02-02T16:26:09.763Z", - "endTime": "2020-02-02T16:26:10.768Z", - "totalTime": 1005, + "startTime": "2020-02-07T18:11:14.628Z", + "endTime": "2020-02-07T18:11:15.629Z", + "totalTime": 1001, "timeout": 5000 }, "requisitions": [] @@ -2229,11 +2249,11 @@ { "valid": true, "name": "check port releasing (23076)", - "id": "1326090319_33f3725983_86305", + "id": "1511140202_33f3725983_932621", "level": 2, "subscriptions": [ { - "id": "1326090319_eb12b4faec_226996", + "id": "1511140202_eb12b4faec_243186", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -2254,12 +2274,12 @@ } ], "arguments": { - "elapsedTime": 1006 + "elapsedTime": 1001 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:10.770Z" + "subscriptionTime": "2020-02-07T18:11:15.630Z" } ], "publishers": [], @@ -2277,14 +2297,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1006 + "elapsedTime": 1001 } } }, "time": { - "startTime": "2020-02-02T16:26:10.769Z", - "endTime": "2020-02-02T16:26:11.775Z", - "totalTime": 1006, + "startTime": "2020-02-07T18:11:15.630Z", + "endTime": "2020-02-07T18:11:16.631Z", + "totalTime": 1001, "timeout": 5000 }, "requisitions": [] @@ -2292,11 +2312,11 @@ { "valid": true, "name": "Requisition #4", - "id": "1326090320_33d13bbd7c_919489", + "id": "1511140202_33d13bbd7c_154108", "level": 2, "subscriptions": [ { - "id": "1326090320_017ca7e673_366424", + "id": "1511140202_017ca7e673_125320", "name": "numbered payload", "type": "http", "hooks": { @@ -2317,7 +2337,7 @@ } ], "arguments": { - "elapsedTime": 4 + "elapsedTime": 5 } }, "onMessageReceived": { @@ -2333,17 +2353,17 @@ "query": {}, "url": "/number-payload", "body": "virgs", - "elapsedTime": 3 + "elapsedTime": 4 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:11.777Z" + "subscriptionTime": "2020-02-07T18:11:16.633Z" } ], "publishers": [ { - "id": "1326090320_25240a3992_208834", + "id": "1511140202_25240a3992_286157", "name": "Publisher #0", "valid": true, "hooks": { @@ -2356,7 +2376,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 4 + "elapsedTime": 5 }, "tests": [ { @@ -2378,7 +2398,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-HLLQjeteIwK7Xuhlj4t8Bu7p124\"", - "date": "Sun, 02 Feb 2020 16:26:11 GMT", + "date": "Fri, 07 Feb 2020 18:11:16 GMT", "connection": "close" }, "request": { @@ -2416,7 +2436,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-HLLQjeteIwK7Xuhlj4t8Bu7p124\"", - "date": "Sun, 02 Feb 2020 16:26:11 GMT", + "date": "Fri, 07 Feb 2020 18:11:16 GMT", "connection": "close" }, "request": { @@ -2445,7 +2465,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:11.781Z" + "publishTime": "2020-02-07T18:11:16.636Z" } ], "iteration": 0, @@ -2467,8 +2487,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:11.776Z", - "endTime": "2020-02-02T16:26:11.781Z", + "startTime": "2020-02-07T18:11:16.632Z", + "endTime": "2020-02-07T18:11:16.637Z", "totalTime": 5, "timeout": 5000 }, @@ -2479,7 +2499,7 @@ { "valid": true, "name": "examples/http-parallel.yml", - "id": "1326090320_ffaed7f194_909243", + "id": "1511140202_ffaed7f194_647259", "level": 1, "subscriptions": [], "publishers": [], @@ -2497,25 +2517,25 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 454 + "elapsedTime": 456 } } }, "time": { - "startTime": "2020-02-02T16:26:09.390Z", - "endTime": "2020-02-02T16:26:09.844Z", - "totalTime": 454, + "startTime": "2020-02-07T18:11:14.259Z", + "endTime": "2020-02-07T18:11:14.715Z", + "totalTime": 456, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090320_f46fd5fb16_212127", + "id": "1511140202_f46fd5fb16_802771", "level": 2, "subscriptions": [ { - "id": "1326090320_e4de1090c9_768078", + "id": "1511140202_e4de1090c9_914939", "name": "Subscription #0", "type": "http", "hooks": { @@ -2557,7 +2577,7 @@ } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [], @@ -2580,8 +2600,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.422Z", - "endTime": "2020-02-02T16:26:09.633Z", + "startTime": "2020-02-07T18:11:14.289Z", + "endTime": "2020-02-07T18:11:14.500Z", "totalTime": 211, "timeout": 5000 }, @@ -2590,11 +2610,11 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090320_f46fd5fb16_212127", + "id": "1511140202_f46fd5fb16_802771", "level": 2, "subscriptions": [ { - "id": "1326090320_e4de1090c9_768078", + "id": "1511140202_e4de1090c9_914939", "name": "Subscription #0", "type": "http", "hooks": { @@ -2615,7 +2635,7 @@ } ], "arguments": { - "elapsedTime": 208 + "elapsedTime": 207 } }, "onMessageReceived": { @@ -2631,12 +2651,12 @@ "query": {}, "url": "/first", "body": "", - "elapsedTime": 208 + "elapsedTime": 207 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.633Z" + "subscriptionTime": "2020-02-07T18:11:14.501Z" } ], "publishers": [], @@ -2654,14 +2674,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 209 + "elapsedTime": 208 } } }, "time": { - "startTime": "2020-02-02T16:26:09.633Z", - "endTime": "2020-02-02T16:26:09.842Z", - "totalTime": 209, + "startTime": "2020-02-07T18:11:14.501Z", + "endTime": "2020-02-07T18:11:14.709Z", + "totalTime": 208, "timeout": 5000 }, "requisitions": [] @@ -2669,11 +2689,11 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090320_4788339776_54726", + "id": "1511140202_4788339776_624546", "level": 2, "subscriptions": [ { - "id": "1326090320_16f5b5fa56_587835", + "id": "1511140202_16f5b5fa56_217492", "name": "Subscription #0", "type": "http", "hooks": { @@ -2694,7 +2714,7 @@ } ], "arguments": { - "elapsedTime": 208 + "elapsedTime": 216 } }, "onMessageReceived": { @@ -2710,12 +2730,12 @@ "query": {}, "url": "/second", "body": "", - "elapsedTime": 419 + "elapsedTime": 425 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [], @@ -2733,14 +2753,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 208 + "elapsedTime": 217 } } }, "time": { - "startTime": "2020-02-02T16:26:09.423Z", - "endTime": "2020-02-02T16:26:09.631Z", - "totalTime": 208, + "startTime": "2020-02-07T18:11:14.289Z", + "endTime": "2020-02-07T18:11:14.506Z", + "totalTime": 217, "timeout": 5000 }, "requisitions": [] @@ -2748,11 +2768,11 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090320_4788339776_54726", + "id": "1511140202_4788339776_624546", "level": 2, "subscriptions": [ { - "id": "1326090320_16f5b5fa56_587835", + "id": "1511140202_16f5b5fa56_217492", "name": "Subscription #0", "type": "http", "hooks": { @@ -2773,7 +2793,7 @@ } ], "arguments": { - "elapsedTime": 211 + "elapsedTime": 208 } }, "onMessageReceived": { @@ -2789,12 +2809,12 @@ "query": {}, "url": "/second", "body": "", - "elapsedTime": 210 + "elapsedTime": 207 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.632Z" + "subscriptionTime": "2020-02-07T18:11:14.509Z" } ], "publishers": [], @@ -2812,14 +2832,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 211 + "elapsedTime": 208 } } }, "time": { - "startTime": "2020-02-02T16:26:09.632Z", - "endTime": "2020-02-02T16:26:09.843Z", - "totalTime": 211, + "startTime": "2020-02-07T18:11:14.507Z", + "endTime": "2020-02-07T18:11:14.715Z", + "totalTime": 208, "timeout": 5000 }, "requisitions": [] @@ -2827,12 +2847,12 @@ { "valid": true, "name": "Requisition #2", - "id": "1326090320_26a61bc62a_223623", + "id": "1511140202_26a61bc62a_132703", "level": 2, "subscriptions": [], "publishers": [ { - "id": "1326090320_fb73e2d9b8_78874", + "id": "1511140202_fb73e2d9b8_909643", "name": "Publisher #0", "valid": true, "hooks": { @@ -2845,7 +2865,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 212 + "elapsedTime": 214 }, "tests": [ { @@ -2867,7 +2887,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "5", "etag": "W/\"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -2911,7 +2931,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "5", "etag": "W/\"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -2940,7 +2960,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.635Z" + "publishTime": "2020-02-07T18:11:14.503Z" } ], "iteration": 0, @@ -2957,14 +2977,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 212 + "elapsedTime": 214 } } }, "time": { - "startTime": "2020-02-02T16:26:09.423Z", - "endTime": "2020-02-02T16:26:09.635Z", - "totalTime": 212, + "startTime": "2020-02-07T18:11:14.289Z", + "endTime": "2020-02-07T18:11:14.503Z", + "totalTime": 214, "timeout": 5000 }, "requisitions": [] @@ -2972,12 +2992,12 @@ { "valid": true, "name": "Requisition #2", - "id": "1326090320_26a61bc62a_223623", + "id": "1511140202_26a61bc62a_132703", "level": 2, "subscriptions": [], "publishers": [ { - "id": "1326090320_fb73e2d9b8_78874", + "id": "1511140202_fb73e2d9b8_909643", "name": "Publisher #0", "valid": true, "hooks": { @@ -3012,7 +3032,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "5", "etag": "W/\"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3056,7 +3076,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "5", "etag": "W/\"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3085,7 +3105,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.844Z" + "publishTime": "2020-02-07T18:11:14.712Z" } ], "iteration": 1, @@ -3107,8 +3127,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.635Z", - "endTime": "2020-02-02T16:26:09.844Z", + "startTime": "2020-02-07T18:11:14.503Z", + "endTime": "2020-02-07T18:11:14.712Z", "totalTime": 209, "timeout": 5000 }, @@ -3117,12 +3137,12 @@ { "valid": true, "name": "Requisition #3", - "id": "1326090320_6099fb1229_509225", + "id": "1511140202_6099fb1229_581197", "level": 2, "subscriptions": [], "publishers": [ { - "id": "1326090320_7d016346aa_194481", + "id": "1511140202_7d016346aa_261298", "name": "Publisher #0", "valid": true, "hooks": { @@ -3135,7 +3155,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 210 + "elapsedTime": 221 }, "tests": [ { @@ -3157,7 +3177,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "6", "etag": "W/\"6-NS94KaI4SwAcwSsMJhPHVkVKH2o\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3201,7 +3221,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "6", "etag": "W/\"6-NS94KaI4SwAcwSsMJhPHVkVKH2o\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3230,7 +3250,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.634Z" + "publishTime": "2020-02-07T18:11:14.511Z" } ], "iteration": 0, @@ -3247,14 +3267,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 210 + "elapsedTime": 221 } } }, "time": { - "startTime": "2020-02-02T16:26:09.424Z", - "endTime": "2020-02-02T16:26:09.634Z", - "totalTime": 210, + "startTime": "2020-02-07T18:11:14.290Z", + "endTime": "2020-02-07T18:11:14.511Z", + "totalTime": 221, "timeout": 5000 }, "requisitions": [] @@ -3262,12 +3282,12 @@ { "valid": true, "name": "Requisition #3", - "id": "1326090320_6099fb1229_509225", + "id": "1511140202_6099fb1229_581197", "level": 2, "subscriptions": [], "publishers": [ { - "id": "1326090320_7d016346aa_194481", + "id": "1511140202_7d016346aa_261298", "name": "Publisher #0", "valid": true, "hooks": { @@ -3280,7 +3300,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 210 + "elapsedTime": 203 }, "tests": [ { @@ -3302,7 +3322,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "6", "etag": "W/\"6-NS94KaI4SwAcwSsMJhPHVkVKH2o\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3346,7 +3366,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "6", "etag": "W/\"6-NS94KaI4SwAcwSsMJhPHVkVKH2o\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3375,7 +3395,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.844Z" + "publishTime": "2020-02-07T18:11:14.715Z" } ], "iteration": 1, @@ -3392,14 +3412,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 210 + "elapsedTime": 203 } } }, "time": { - "startTime": "2020-02-02T16:26:09.634Z", - "endTime": "2020-02-02T16:26:09.844Z", - "totalTime": 210, + "startTime": "2020-02-07T18:11:14.512Z", + "endTime": "2020-02-07T18:11:14.715Z", + "totalTime": 203, "timeout": 5000 }, "requisitions": [] @@ -3409,11 +3429,11 @@ { "valid": true, "name": "examples/http-proxy.yml", - "id": "1326090320_aba5464e08_187492", + "id": "1511140202_aba5464e08_809011", "level": 1, "subscriptions": [ { - "id": "1326090320_be017cf7e2_842625", + "id": "1511140203_be017cf7e2_112367", "name": "proxy subscription", "type": "http-proxy", "hooks": { @@ -3434,7 +3454,7 @@ } ], "arguments": { - "elapsedTime": 172 + "elapsedTime": 203 } }, "onOriginalMessageReceived": { @@ -3460,7 +3480,7 @@ }, "url": "/proxy/enqueuer/123456?query=proxied", "body": "original", - "elapsedTime": 146 + "elapsedTime": 161 } }, "onMessageReceived": { @@ -3487,7 +3507,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "25", "etag": "W/\"19-t4VpDbTMvQQ876rQU32330fLSVI\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3517,10 +3537,10 @@ } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" }, { - "id": "1326090320_9421bcf470_203004", + "id": "1511140203_9421bcf470_904077", "name": "real", "type": "http", "hooks": { @@ -3541,7 +3561,7 @@ } ], "arguments": { - "elapsedTime": 172 + "elapsedTime": 203 } }, "onMessageReceived": { @@ -3577,17 +3597,17 @@ }, "url": "/real/enqueuer/123456?query=proxied", "body": "original -> proxy", - "elapsedTime": 169 + "elapsedTime": 191 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [ { - "id": "1326090320_8e53ccc444_41068", + "id": "1511140203_8e53ccc444_700959", "name": "publisher proxy", "valid": true, "hooks": { @@ -3600,7 +3620,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 172 + "elapsedTime": 203 }, "tests": [ { @@ -3622,7 +3642,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "42", "etag": "W/\"19-t4VpDbTMvQQ876rQU32330fLSVI\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3660,7 +3680,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "42", "etag": "W/\"19-t4VpDbTMvQQ876rQU32330fLSVI\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3700,7 +3720,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.563Z" + "publishTime": "2020-02-07T18:11:14.462Z" } ], "iteration": 0, @@ -3717,14 +3737,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 172 + "elapsedTime": 203 } } }, "time": { - "startTime": "2020-02-02T16:26:09.392Z", - "endTime": "2020-02-02T16:26:09.564Z", - "totalTime": 172, + "startTime": "2020-02-07T18:11:14.261Z", + "endTime": "2020-02-07T18:11:14.464Z", + "totalTime": 203, "timeout": 5000 }, "requisitions": [] @@ -3732,11 +3752,11 @@ { "valid": true, "name": "examples/http.yml", - "id": "1326090320_07461360b5_734473", + "id": "1511140203_07461360b5_286032", "level": 1, "subscriptions": [ { - "id": "1326090320_a0523c01e7_25676", + "id": "1511140203_a0523c01e7_151835", "name": "Subscription #0", "type": "http", "hooks": { @@ -3757,7 +3777,7 @@ } ], "arguments": { - "elapsedTime": 157 + "elapsedTime": 181 } }, "onMessageReceived": { @@ -3779,17 +3799,17 @@ "query": {}, "url": "/resource", "body": "enqueuer", - "elapsedTime": 146 + "elapsedTime": 165 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [ { - "id": "1326090320_7b553c9aff_703118", + "id": "1511140203_7b553c9aff_605740", "name": "Publisher #0", "valid": true, "hooks": { @@ -3802,7 +3822,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 157 + "elapsedTime": 182 }, "tests": [ { @@ -3824,7 +3844,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-W/H9kn37hnlJai5s8Ay+UMHIcUU\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3873,7 +3893,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-W/H9kn37hnlJai5s8Ay+UMHIcUU\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -3902,7 +3922,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.550Z" + "publishTime": "2020-02-07T18:11:14.443Z" } ], "iteration": 0, @@ -3919,14 +3939,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 157 + "elapsedTime": 182 } } }, "time": { - "startTime": "2020-02-02T16:26:09.393Z", - "endTime": "2020-02-02T16:26:09.550Z", - "totalTime": 157, + "startTime": "2020-02-07T18:11:14.262Z", + "endTime": "2020-02-07T18:11:14.444Z", + "totalTime": 182, "timeout": 5000 }, "requisitions": [] @@ -3934,11 +3954,11 @@ { "valid": true, "name": "examples/https.yml", - "id": "1326090321_d6075fad05_832376", + "id": "1511140203_d6075fad05_911967", "level": 1, "subscriptions": [ { - "id": "1326090321_81e3a69582_402937", + "id": "1511140203_81e3a69582_116454", "name": "Subscription #0", "type": "https", "hooks": { @@ -3959,7 +3979,7 @@ } ], "arguments": { - "elapsedTime": 166 + "elapsedTime": 187 } }, "onMessageReceived": { @@ -3982,17 +4002,17 @@ "query": {}, "url": "/enqueuer", "body": "{\"https\":\"works!\"}", - "elapsedTime": 163 + "elapsedTime": 185 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [ { - "id": "1326090321_5cd9b40d14_601302", + "id": "1511140203_5cd9b40d14_7542", "name": "Publisher #0", "valid": true, "hooks": { @@ -4005,7 +4025,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 165 + "elapsedTime": 187 }, "tests": [ { @@ -4027,7 +4047,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "5", "etag": "W/\"5-w0N9vHwSVdOiHURNhuvy6SNMIr0\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -4066,7 +4086,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "5", "etag": "W/\"5-w0N9vHwSVdOiHURNhuvy6SNMIr0\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -4107,7 +4127,7 @@ } }, "type": "HTTPS", - "publishTime": "2020-02-02T16:26:09.559Z" + "publishTime": "2020-02-07T18:11:14.451Z" } ], "iteration": 0, @@ -4124,14 +4144,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 166 + "elapsedTime": 187 } } }, "time": { - "startTime": "2020-02-02T16:26:09.394Z", - "endTime": "2020-02-02T16:26:09.560Z", - "totalTime": 166, + "startTime": "2020-02-07T18:11:14.264Z", + "endTime": "2020-02-07T18:11:14.451Z", + "totalTime": 187, "timeout": 3000 }, "requisitions": [] @@ -4139,7 +4159,7 @@ { "valid": true, "name": "examples/ignore.yml", - "id": "1326090321_8ea767da7b_346541", + "id": "1511140203_8ea767da7b_456430", "level": 1, "subscriptions": [], "publishers": [], @@ -4157,26 +4177,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 78 + "elapsedTime": 72 } } }, "time": { - "startTime": "2020-02-02T16:26:09.396Z", - "endTime": "2020-02-02T16:26:09.475Z", - "totalTime": 79, + "startTime": "2020-02-07T18:11:14.265Z", + "endTime": "2020-02-07T18:11:14.337Z", + "totalTime": 72, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090321_cbabde97ea_95474", + "id": "1511140203_cbabde97ea_911200", "level": 2, "subscriptions": [], "publishers": [ { - "id": "1326090321_c325787526_586630", + "id": "1511140203_c325787526_140802", "name": "Publisher #0", "ignored": true, "valid": true, @@ -4207,13 +4227,13 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 35 + "elapsedTime": 34 } } }, "time": { - "startTime": "2020-02-02T16:26:09.424Z", - "endTime": "2020-02-02T16:26:09.459Z", + "startTime": "2020-02-07T18:11:14.290Z", + "endTime": "2020-02-07T18:11:14.325Z", "totalTime": 35, "timeout": 5000 }, @@ -4222,11 +4242,11 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090321_24ec47c05e_170447", + "id": "1511140203_24ec47c05e_638744", "level": 2, "subscriptions": [ { - "id": "1326090321_41bbcab029_167199", + "id": "1511140203_41bbcab029_897668", "name": "Subscription #0", "ignored": true, "type": "file", @@ -4263,8 +4283,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.465Z", - "endTime": "2020-02-02T16:26:09.468Z", + "startTime": "2020-02-07T18:11:14.330Z", + "endTime": "2020-02-07T18:11:14.333Z", "totalTime": 3, "timeout": 5000 }, @@ -4273,7 +4293,7 @@ { "valid": true, "name": "Requisition #2", - "id": "1326090321_73301c2bc1_413442", + "id": "1511140203_73301c2bc1_237262", "ignored": true, "level": 2, "subscriptions": [], @@ -4291,8 +4311,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.471Z", - "endTime": "2020-02-02T16:26:09.471Z", + "startTime": "2020-02-07T18:11:14.335Z", + "endTime": "2020-02-07T18:11:14.335Z", "totalTime": 0 }, "requisitions": [] @@ -4302,7 +4322,7 @@ { "valid": true, "name": "examples/import.yml", - "id": "1326090321_11d1ffbd36_772185", + "id": "1511140203_11d1ffbd36_485899", "level": 1, "subscriptions": [], "publishers": [], @@ -4320,21 +4340,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 154 + "elapsedTime": 178 } } }, "time": { - "startTime": "2020-02-02T16:26:09.398Z", - "endTime": "2020-02-02T16:26:09.552Z", - "totalTime": 154, + "startTime": "2020-02-07T18:11:14.268Z", + "endTime": "2020-02-07T18:11:14.446Z", + "totalTime": 178, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "static importRequisition", - "id": "1326090321_0c14282f98_32518", + "id": "1511140203_0c14282f98_951202", "level": 2, "subscriptions": [], "publishers": [], @@ -4358,14 +4378,14 @@ } ], "arguments": { - "elapsedTime": 35 + "elapsedTime": 33 } } }, "time": { - "startTime": "2020-02-02T16:26:09.424Z", - "endTime": "2020-02-02T16:26:09.459Z", - "totalTime": 35, + "startTime": "2020-02-07T18:11:14.291Z", + "endTime": "2020-02-07T18:11:14.324Z", + "totalTime": 33, "timeout": 5000 }, "requisitions": [] @@ -4373,7 +4393,7 @@ { "valid": true, "name": "dynamic importRequisition", - "id": "1326090321_6857a59a1d_797112", + "id": "1511140203_6857a59a1d_794429", "level": 2, "subscriptions": [], "publishers": [], @@ -4402,14 +4422,14 @@ } ], "arguments": { - "elapsedTime": 5 + "elapsedTime": 4 } } }, "time": { - "startTime": "2020-02-02T16:26:09.462Z", - "endTime": "2020-02-02T16:26:09.467Z", - "totalTime": 5, + "startTime": "2020-02-07T18:11:14.328Z", + "endTime": "2020-02-07T18:11:14.332Z", + "totalTime": 4, "timeout": 5000 }, "requisitions": [] @@ -4417,11 +4437,11 @@ { "valid": true, "name": "Requisition #2", - "id": "1326090322_28f1b301b5_255517", + "id": "1511140203_28f1b301b5_371530", "level": 2, "subscriptions": [ { - "id": "1326090322_a7a23228b4_719138", + "id": "1511140203_a7a23228b4_722571", "name": "Subscription #0", "type": "http", "hooks": { @@ -4452,7 +4472,7 @@ } ], "arguments": { - "elapsedTime": 83 + "elapsedTime": 112 } }, "onMessageReceived": { @@ -4468,17 +4488,17 @@ "query": {}, "url": "/subscription-reuse", "body": "virgs", - "elapsedTime": 72 + "elapsedTime": 98 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [ { - "id": "1326090322_5163661566_411752", + "id": "1511140203_5163661566_646046", "name": "Publisher #0", "valid": true, "hooks": { @@ -4491,9 +4511,14 @@ }, "onFinish": { "arguments": { - "elapsedTime": 83 + "elapsedTime": 112 }, "tests": [ + { + "name": "Published", + "valid": true, + "description": "Published successfully" + }, { "name": "Assertion #0", "valid": true, @@ -4503,11 +4528,6 @@ "name": "Assertion #1", "valid": true, "description": "Expected 'publisher.method' to be equal to 'POST'. Received 'POST'" - }, - { - "name": "Published", - "valid": true, - "description": "Published successfully" } ], "valid": true @@ -4523,7 +4543,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-W/H9kn37hnlJai5s8Ay+UMHIcUU\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -4561,7 +4581,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-W/H9kn37hnlJai5s8Ay+UMHIcUU\"", - "date": "Sun, 02 Feb 2020 16:26:09 GMT", + "date": "Fri, 07 Feb 2020 18:11:14 GMT", "connection": "close" }, "request": { @@ -4596,7 +4616,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:09.552Z" + "publishTime": "2020-02-07T18:11:14.445Z" } ], "iteration": 0, @@ -4613,14 +4633,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 83 + "elapsedTime": 112 } } }, "time": { - "startTime": "2020-02-02T16:26:09.469Z", - "endTime": "2020-02-02T16:26:09.552Z", - "totalTime": 83, + "startTime": "2020-02-07T18:11:14.334Z", + "endTime": "2020-02-07T18:11:14.446Z", + "totalTime": 112, "timeout": 5000 }, "requisitions": [] @@ -4630,7 +4650,7 @@ { "valid": true, "name": "examples/no-tests.yml", - "id": "1326090322_92334e1554_246985", + "id": "1511140203_92334e1554_191311", "level": 1, "subscriptions": [], "publishers": [], @@ -4648,21 +4668,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 208 + "elapsedTime": 201 } } }, "time": { - "startTime": "2020-02-02T16:26:09.398Z", - "endTime": "2020-02-02T16:26:09.606Z", - "totalTime": 208, + "startTime": "2020-02-07T18:11:14.268Z", + "endTime": "2020-02-07T18:11:14.469Z", + "totalTime": 201, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090322_35cb1b4ae8_243851", + "id": "1511140203_35cb1b4ae8_74363", "level": 2, "subscriptions": [], "publishers": [], @@ -4680,14 +4700,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 103 + "elapsedTime": 101 } } }, "time": { - "startTime": "2020-02-02T16:26:09.503Z", - "endTime": "2020-02-02T16:26:09.606Z", - "totalTime": 103, + "startTime": "2020-02-07T18:11:14.368Z", + "endTime": "2020-02-07T18:11:14.469Z", + "totalTime": 101, "timeout": 5000 }, "requisitions": [] @@ -4697,7 +4717,7 @@ { "valid": true, "name": "examples/parallel-requisition.yml", - "id": "1326090322_e05b5acab1_736607", + "id": "1511140203_e05b5acab1_305073", "level": 1, "subscriptions": [], "publishers": [], @@ -4715,21 +4735,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 867 + "elapsedTime": 860 } } }, "time": { - "startTime": "2020-02-02T16:26:09.400Z", - "endTime": "2020-02-02T16:26:10.267Z", - "totalTime": 867, + "startTime": "2020-02-07T18:11:14.269Z", + "endTime": "2020-02-07T18:11:15.129Z", + "totalTime": 860, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090322_e2f0694b46_827544", + "id": "1511140203_e2f0694b46_165482", "level": 2, "subscriptions": [], "publishers": [], @@ -4749,30 +4769,30 @@ { "name": "started at the same time", "valid": true, - "description": "Expected 'Math.abs(requisition.requisitions[1].startTime.getTime() - requisition.requisitions[0].startTime.getTime())' not to be less than or equal to '100'. Received '0'" + "description": "Expected 'Math.abs(requisition.requisitions[1].startTime.getTime() - requisition.requisitions[0].startTime.getTime())' not to be less than or equal to '100'. Received '1'" }, { "name": "Assertion #1", "valid": true, - "description": "Expected 'elapsedTime' not to be less than or equal to '400'. Received '328'" + "description": "Expected 'elapsedTime' not to be less than or equal to '400'. Received '329'" } ], "arguments": { - "elapsedTime": 328 + "elapsedTime": 329 } } }, "time": { - "startTime": "2020-02-02T16:26:09.425Z", - "endTime": "2020-02-02T16:26:09.753Z", - "totalTime": 328, + "startTime": "2020-02-07T18:11:14.291Z", + "endTime": "2020-02-07T18:11:14.620Z", + "totalTime": 329, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090322_913ffe0794_136423", + "id": "1511140204_913ffe0794_415154", "level": 3, "subscriptions": [], "publishers": [], @@ -4790,14 +4810,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 202 + "elapsedTime": 201 } } }, "time": { - "startTime": "2020-02-02T16:26:09.448Z", - "endTime": "2020-02-02T16:26:09.650Z", - "totalTime": 202, + "startTime": "2020-02-07T18:11:14.314Z", + "endTime": "2020-02-07T18:11:14.515Z", + "totalTime": 201, "timeout": 5000 }, "requisitions": [] @@ -4805,7 +4825,7 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090322_fdabeaad92_143120", + "id": "1511140204_fdabeaad92_20710", "level": 3, "subscriptions": [], "publishers": [], @@ -4823,14 +4843,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 303 + "elapsedTime": 305 } } }, "time": { - "startTime": "2020-02-02T16:26:09.449Z", - "endTime": "2020-02-02T16:26:09.753Z", - "totalTime": 304, + "startTime": "2020-02-07T18:11:14.315Z", + "endTime": "2020-02-07T18:11:14.620Z", + "totalTime": 305, "timeout": 5000 }, "requisitions": [] @@ -4840,7 +4860,7 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090322_30bc9c1ac3_79610", + "id": "1511140204_30bc9c1ac3_25092", "level": 2, "subscriptions": [], "publishers": [], @@ -4860,30 +4880,30 @@ { "name": "started after the other", "valid": true, - "description": "Expected 'requisition.requisitions[1].startTime.getTime() - requisition.requisitions[0].startTime.getTime()' to be greater than or equal to '200'. Received '205'" + "description": "Expected 'requisition.requisitions[1].startTime.getTime() - requisition.requisitions[0].startTime.getTime()' to be greater than or equal to '200'. Received '202'" }, { "name": "Assertion #1", "valid": true, - "description": "Expected 'elapsedTime' not to be less than or equal to '600'. Received '511'" + "description": "Expected 'elapsedTime' not to be less than or equal to '600'. Received '507'" } ], "arguments": { - "elapsedTime": 511 + "elapsedTime": 507 } } }, "time": { - "startTime": "2020-02-02T16:26:09.755Z", - "endTime": "2020-02-02T16:26:10.267Z", - "totalTime": 512, + "startTime": "2020-02-07T18:11:14.622Z", + "endTime": "2020-02-07T18:11:15.129Z", + "totalTime": 507, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090322_913ffe0794_744929", + "id": "1511140204_913ffe0794_53669", "level": 3, "subscriptions": [], "publishers": [], @@ -4901,14 +4921,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 204 + "elapsedTime": 201 } } }, "time": { - "startTime": "2020-02-02T16:26:09.755Z", - "endTime": "2020-02-02T16:26:09.960Z", - "totalTime": 205, + "startTime": "2020-02-07T18:11:14.622Z", + "endTime": "2020-02-07T18:11:14.823Z", + "totalTime": 201, "timeout": 5000 }, "requisitions": [] @@ -4916,7 +4936,7 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090322_463f29d694_740706", + "id": "1511140204_463f29d694_778799", "level": 3, "subscriptions": [], "publishers": [], @@ -4934,14 +4954,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 306 + "elapsedTime": 304 } } }, "time": { - "startTime": "2020-02-02T16:26:09.960Z", - "endTime": "2020-02-02T16:26:10.266Z", - "totalTime": 306, + "startTime": "2020-02-07T18:11:14.824Z", + "endTime": "2020-02-07T18:11:15.128Z", + "totalTime": 304, "timeout": 5000 }, "requisitions": [] @@ -4953,12 +4973,12 @@ { "valid": true, "name": "examples/parallel-test-publisher.yml", - "id": "1326090322_98a37b717a_945444", + "id": "1511140204_98a37b717a_5258", "level": 1, "subscriptions": [], "publishers": [ { - "id": "1326090322_2955c0f42c_699127", + "id": "1511140204_2955c0f42c_952960", "name": "Publisher #0", "valid": true, "hooks": { @@ -4971,7 +4991,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 506 + "elapsedTime": 508 }, "tests": [ { @@ -4988,11 +5008,16 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 50513 + "port": 52253 }, - "elapsedTime": 1503 + "elapsedTime": 1508 }, "tests": [ + { + "name": "Back and forth", + "valid": true, + "description": "Expected 'payload' to be equal to 'anyValue'. Received 'anyValue'" + }, { "name": "Back and forth", "valid": true, @@ -5003,7 +5028,7 @@ } }, "type": "tcp", - "publishTime": "2020-02-02T16:26:09.907Z" + "publishTime": "2020-02-07T18:11:14.777Z" } ], "iteration": 0, @@ -5020,14 +5045,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 506 + "elapsedTime": 507 } } }, "time": { - "startTime": "2020-02-02T16:26:09.401Z", - "endTime": "2020-02-02T16:26:09.907Z", - "totalTime": 506, + "startTime": "2020-02-07T18:11:14.270Z", + "endTime": "2020-02-07T18:11:14.778Z", + "totalTime": 508, "timeout": 3000 }, "requisitions": [] @@ -5035,11 +5060,11 @@ { "valid": true, "name": "examples/parallel-test-subscription.yml", - "id": "1326090322_eb9c2c8618_151013", + "id": "1511140204_eb9c2c8618_888743", "level": 1, "subscriptions": [ { - "id": "1326090322_b419ff22d8_333721", + "id": "1511140204_b419ff22d8_446522", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -5060,7 +5085,7 @@ } ], "arguments": { - "elapsedTime": 503 + "elapsedTime": 506 } }, "onMessageReceived": { @@ -5079,12 +5104,12 @@ "family": "IPv6", "port": 23081 }, - "elapsedTime": 503 + "elapsedTime": 506 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.359Z" } ], "publishers": [], @@ -5102,14 +5127,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 503 + "elapsedTime": 506 } } }, "time": { - "startTime": "2020-02-02T16:26:09.402Z", - "endTime": "2020-02-02T16:26:09.905Z", - "totalTime": 503, + "startTime": "2020-02-07T18:11:14.270Z", + "endTime": "2020-02-07T18:11:14.776Z", + "totalTime": 506, "timeout": 3000 }, "requisitions": [] @@ -5117,7 +5142,7 @@ { "valid": true, "name": "examples/parent.yml", - "id": "1326090322_b79240b3fa_825174", + "id": "1511140204_b79240b3fa_319382", "level": 1, "subscriptions": [], "publishers": [], @@ -5135,21 +5160,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 164 + "elapsedTime": 165 } } }, "time": { - "startTime": "2020-02-02T16:26:09.403Z", - "endTime": "2020-02-02T16:26:09.567Z", - "totalTime": 164, + "startTime": "2020-02-07T18:11:14.271Z", + "endTime": "2020-02-07T18:11:14.436Z", + "totalTime": 165, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090322_c28c57bc75_755810", + "id": "1511140204_c28c57bc75_369558", "level": 2, "subscriptions": [], "publishers": [], @@ -5167,14 +5192,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 34 + "elapsedTime": 32 } } }, "time": { - "startTime": "2020-02-02T16:26:09.425Z", - "endTime": "2020-02-02T16:26:09.459Z", - "totalTime": 34, + "startTime": "2020-02-07T18:11:14.292Z", + "endTime": "2020-02-07T18:11:14.324Z", + "totalTime": 32, "timeout": 5000 }, "requisitions": [] @@ -5182,11 +5207,11 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090322_52aeba2265_236850", + "id": "1511140204_52aeba2265_781445", "level": 2, "subscriptions": [ { - "id": "1326090322_f3eb57f16a_612986", + "id": "1511140204_f3eb57f16a_497703", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -5213,12 +5238,12 @@ } ], "arguments": { - "elapsedTime": 104 + "elapsedTime": 108 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.360Z" } ], "publishers": [], @@ -5236,14 +5261,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 104 + "elapsedTime": 108 } } }, "time": { - "startTime": "2020-02-02T16:26:09.463Z", - "endTime": "2020-02-02T16:26:09.567Z", - "totalTime": 104, + "startTime": "2020-02-07T18:11:14.328Z", + "endTime": "2020-02-07T18:11:14.436Z", + "totalTime": 108, "timeout": 5000 }, "requisitions": [] @@ -5253,12 +5278,12 @@ { "valid": true, "name": "examples/readme-enqueuer-repo-hit.yml", - "id": "1326090322_5edd709fc3_970332", + "id": "1511140204_5edd709fc3_388379", "level": 1, "subscriptions": [], "publishers": [ { - "id": "1326090323_cf5343e68d_616904", + "id": "1511140204_cf5343e68d_274671", "name": "Publisher #0", "valid": true, "hooks": { @@ -5271,7 +5296,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 990 + "elapsedTime": 1446 }, "tests": [ { @@ -5285,22 +5310,21 @@ "onResponseReceived": { "arguments": { "statusCode": 200, - "body": "\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n\n\n\n \n \n \n \n \n \n \n\n\n \n \n GitHub - enqueuer-land/enqueuer: Multi protocol microservice testing tool\n \n \n \n \n\n \n \n\n \n \n \n\n \n\n\n\n \n\n \n\n \n \n \n\n \n\n\n\n\n \n\n\n\n\n\n\n \n\n \n \n\n \n\n\n \n\n \n \n\n \n\n \n\n \n\n\n \n\n\n \n\n \n\n \n \n\n\n\n\n \n\n \n\n \n \n\n
\n Skip to content\n \n \n \n\n \n \n \n\n\n
\n
\n
\n \n \n \n
\n\n
\n
\n \n
\n\n \n\n \n
\n
\n
\n\n
\n\n
\n\n\n
\n\n
\n\n\n\n
\n
\n
\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n
\n\n
\n\n
\n

\n \n \n enqueuer-land\n \n /\n \n enqueuer\n \n \n

\n\n\n
\n\n \n\n
\n \n\n\n\n
\n
\n
\n\n \n \n \n\n\n
\n \n Multi protocol microservice testing tool\n \n https://enqueuer.com\n
\n
\n\n \n\n\n\n \n\n
\n \n
\n TypeScript\n HTML\n JavaScript\n Shell\n
\n
\n \n
\n\n\n\n\n\n\n
\n \n
\n \n Branch:\n master\n \n \n\n \n
\n \n \n \n
\n
\n
\n\n\n \n\n
\n \n
\n\n
\n\n Find file\n
\n\n \n\n\n \n\n
\n \n Clone or download\n \n
\n
\n\n
\n
\n\n

\n Clone with HTTPS\n \n \n \n

\n

\n Use Git or checkout with SVN using the web URL.\n

\n\n
\n \n
\n \n
\n
\n\n
\n\n
\n \nDownload ZIP\n\n
\n
\n\n \n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching Xcode

\n

If nothing happens, download Xcode and try again.

\n

\n
\n\n
\n

Launching Visual Studio

\n

If nothing happens, download the GitHub extension for Visual Studio and try again.

\n

\n
\n\n
\n
\n
\n\n\n
\n\n\n \n\n\n
\n \"\"\n Fetching latest commit…\n
\n
\n Cannot retrieve the latest commit at this time.\n
\n
\n\n\n
\n Permalink\n\n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TypeNameLatest commit messageCommit time
Failed to load latest commit information.
\n \n \"\"\n \n .github/ISSUE_TEMPLATE\n \n \n Update bug_report.md\n \n \n Mar 4, 2019\n
\n \n \"\"\n \n conf\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n docs\n \n \n docs(index.html): Remove unused docs img\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n examples\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n https-cert\n \n \n Adding support to https\n \n \n Aug 9, 2018\n
\n \n \"\"\n \n misc\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n output\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n src\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n temp\n \n \n #19 adding attempting to create a topic at kafka\n \n \n Oct 3, 2018\n
\n \n \"\"\n \n .codeclimate.yml\n \n \n Updating .codeclimate\n \n \n Sep 24, 2018\n
\n \n \"\"\n \n .gitignore\n \n \n docs(README): Improve docs\n \n \n Mar 23, 2019\n
\n \n \"\"\n \n .npmignore\n \n \n Removing SummaryTestOutput dependency with Configuration and start te…\n \n \n Mar 10, 2019\n
\n \n \"\"\n \n .travis.yml\n \n \n feat(dynamic-modules-manager): Look for a ~/.nqr folder to load plugi…\n \n \n Mar 22, 2019\n
\n \n \"\"\n \n CNAME\n \n \n Create CNAME\n \n \n May 10, 2019\n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n chore(Automatic Release): Add automatic release with semantic-release.\n \n \n Mar 21, 2019\n
\n \n \"\"\n \n License\n \n \n Creating License\n \n \n Mar 10, 2018\n
\n \n \"\"\n \n README.md\n \n \n docs(LandingPage): Create landing page\n \n \n Jun 30, 2019\n
\n \n \"\"\n \n package-lock.json\n \n \n chore(deps): bump handlebars from 4.1.2 to 4.5.3\n \n \n Dec 27, 2019\n
\n \n \"\"\n \n package.json\n \n \n chore(Dependencies): Update dependencies\n \n \n Jul 5, 2019\n
\n \n \"\"\n \n tsconfig.json\n \n \n feat(NotificationEmitter): Create the concept of Notification and Not…\n \n \n May 24, 2019\n
\n \n \"\"\n \n tslint.json\n \n \n Subscription refactoring\n \n \n Mar 12, 2019\n
\n\n
\n\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n
\n
\n
\n
\n
\n\n
\n

\"npm\"\n\"Build\n\"Greenkeeper\n\"Known\n\"License:

\n

\"enqueuerlogo\"

\n

Welcome

\n

Be our guest and have fun.

\n

install it

\n

First things first, let's get the enqueuer installed on your machine.

\n
$ npm install --global enqueuer\n
\n

Alright, it's time to create a requisition file.\nSomething like:

\n
#enqueuer-repo-hit.yml\npublishers:\n-   type: http\n    url: https://github.com/enqueuer-land/enqueuer\n    onResponseReceived:\n        assertions:\n        -   expect: statusCode\n            toBeEqualTo: 200\n
\n

Pretty simple, hum? Small and concise, how it should be!\nRun it:

\n
$ enqueuer enqueuer-repo-hit.yml\n
\n

What if I want to mock a http server, you may ask. Not a big deal for enqueuer lovers:

\n
timeout: -1\nsubscriptions:\n-   type: http\n    timeout: -1\n    name: mock endpoint\n    endpoint: /readme-example\n    port: 9085\n    method: POST\n    response:\n        status: 200\n        payload: mock response\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: `enqueuer`\n
\n

Now go ahead and try hitting it using the browser.\nTip: remove timeout values and check what happens.\nI told you it was simple.\nNow, let's say you want to mix different protocols to test a bit more complex flow.\nHow about publishing an amqp message and making sure that, once a service consumes that message an endpoint of your is hit?\nIn order to achieve that, we have to make use of a plugin, given that amqp support is provided by a plugin.\nIn this scenario, we're talking about the amqp plugin.\nOnce we get this plugin installed we are able to create and run files like this:

\n
publishers:\n-   type: amqp\n    payload: 123456\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.readme.routing.key\nsubscriptions:\n-   type: http\n    endpoint: /polyglot-flow\n    port: 8080\n    method: GET\n    response:\n        status: 200\n        payload: polyglot message\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: 123456\n
\n

Now go nuts!\nIt's all yours. Have fun.\nIf you want more examples about http, consider looking at this test.\nCheck this out, you'll find countless examples.\nCertainly one is what you need.

\n

if you need more

\n
$ nqr -h\nUsage: nqr [options] <test-file> [other-test-files...]\n\nTake a look at the full documentation: https://enqueuer.com\n\nOptions:\n  -v, --version                             output the version number\n  -b, --verbosity <level>                   set verbosity (default: \"warn\")\n  -c, --config-file <path>                  set configurationFile\n  -e, --parsers-list [parser]               list available object parsers\n  -f, --formatters-description [formatter]  describe report formatters\n  -o, --stdout-requisition-output           add stdout as requisition output\n  -m, --max-report-level-print <level>      set max report level print\n  -p, --protocols-description [protocol]    describe protocols\n  -t, --tests-list [expectedField]          list available tests assertions\n  -u, --loaded-modules-list                 list loaded modules\n  -i, --show-passing-tests                  show passing tests\n  -s, --store [store]                       add variables values to this session (default: [])\n  -l, --add-plugin [plugin]                 add plugin (default: [])\n  -a, --add-file <file>                     add file to be tested (default: [])\n  -A, --add-file-and-ignore-others <file>   add file to be tested and ignore others (default: [])\n  -h, --help                                output usage information\n\nExamples:\n  $ nqr --config-file config-file.yml --verbosity error --store key=value\n  $ enqueuer -c config-file.yml test-file.yml --add-file another-test-file.yml -b info\n  $ enqueuer test-file.yml --store someKey=true --store someOtherKey=false\n  $ nqr --protocols-description -s key=value\n  $ nqr -t expect\n  $ nqr -l my-enqueuer-plugin-name -p plugin-protocol\n  $ nqr -p http\n  $ nqr --formatters-description json\n
\n
\n

Components

\n

In order to accomplish more than just hitting enqueuer's repo or doing a quick self http hit, there are a few things that you'll probably need to know.\nDon't worry, it's not too much and, as mentioned earlier, there is a lot of examples here, just in case.\nThere are only three important component concepts: requisitions, publishers and subscriptions.\nThey work along with each other and are responsible for the full behavior of enqueuer.

\n

requisition

\n

Test scenario description. It tells what, when, and how test your applications and services.\nPicture it as if it was a collection of publishers, subscriptions and other requisitions.\nIt helps because this is exactly what it is.\nAs the others components, it has some attributes. All of them are optionals. And it supports multi-level test scenarios out of the box. Yeap, go as recursive as you want.\nEvery test file is a requisition.\nYou don't know some of these attributes values yet? Don't worry, just put a variable there and let enqueuer replace it with the value you set later.\nVariable replacements are available through the entire requisition.

\n
requisition attributes
\n

These are the requisition attributes:

\n

name
\nDescribes what the requisition is suppose to do.\nDefaults to requisition index.

\n
name: requisition action\n
\n

timeout
\nDefaults to 5000.\nSets in milliseconds how long the requisition waits to expire.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

delay
\nDefaults to 0. Sets in milliseconds how long the test waits before starting. Check this to get the full idea.

\n
delay: 0\n
\n

iterations
\nDefaults to 1. Sets how many times this test will be executed. Check this and this to get the full idea.

\n
iterations: 3\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this requisitions should be skipped. Check this to see it working.

\n
ignore: true\n
\n

parallel
\nDefaults to false. Immediate children requisitions should be executed in parallel mode.\nTake a look at this to see it working.

\n
parallel: true\n
\n

import
\nAllows requisition to be dynamically defined, be it by loading an external file or creating dynamically by other requisitions. Want to reuse the same requisition multiple times? This is you you need.\nTake a look at this to behold this feature.

\n
import: path/to/another/requisition/file\n
\n

publishers
\nList of publishers. They're executed simultaneously, therefore, the order is irrelevant.

\n
publishers:\n- name: some publisher name\n  type: http\n- type: tcp\n
\n

subscriptions
\nList of subscriptions. They're executed simultaneously, therefore, the order is irrelevant.

\n
subscriptions:\n- name: some subscription name\n  type: udp\n- name: another subscription name\n  type: file\n
\n

requisitions
\nA list of child scenarios. List of requisitions.\nBy default, they're executed sequentially, therefore, the order is relevant.\nUnless the parallel attribute is set to true, what makes them get executed simultaneously,\nCheck this example, it may help.

\n
requisitions:\n- name: some requisition name\n  iterations: 2\n- name: another requisition name\n  delay: 200\n
\n
events
\n

Available events are described here. A this object is available to access and change requisition attributes.

\n
name: my name\nonInit:\n  script: this.delay = 3000;\n  assertions:\n  - expectToBeDefined: this.name\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.name\n
\n

publisher

\n

A publisher action is triggered by enqueuer itself. It acts whereas a subscription reacts.\nIt publishes something, it writes, it enqueues, hits and endpoint... These kinds of actions.\nIt's worth noting that it always creates a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if the message got published.

\n
publisher attributes
\n

Every publisher has its own properties, depending on its protocol and implementation.\nThe built-in http publisher implementation, for instance, demands a url, a method, and a payload, if the method is not a GET.\nOn the other hand, the built-in tcp publisher implementation requires a serverAddress and a port.\nThese are the publisher attributes:

\n

name
\nDefaults to publisher index.\nDescribes what the publisher is supposed to do.

\n
name: publisher action\n
\n

type
\nMandatory. Key tag to identify which publisher will be instantiated

\n
type: http\n
\n

payload
\nSince a publisher usually publishes something, it's very likely you have to set a value here.\nThe message itself that will be send through this protocol. Be it a string, a number, a boolean value or even whole objects.

\n
payload: value\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this publisher should be skipped. Check this to see it working.

\n
ignore: true\n
\n
events
\n

Available events are described here. A this object is available to access and change publisher attributes.\nDepending on the protocol and its implementation, such as http and tcp, there may exist special events, such as onMessageReceived event and a special object given message.\nOn the other hand, an asynchronous protocol, like: udp and amqp, usually do not provide it.

\n
onInit:\n  script: this.ignore = false\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived: #Provided in synchronous protocols  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n

subscription

\n

A subscription is an \"under demand\" event. It reacts whereas a publisher acts.\nIt consumes something, it reads, it dequeues, gets hit... These kinds of actions.\nThis means that it is not triggered by enqueuer itself.\nRather than that, enqueuer waits on an external event to be triggered and then it asserts against the message that was passed to the subscription.\nIt's worth noting that it always receives a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if a message got received.

\n
subscription attributes
\n

Every subscription has its own properties, depending on its protocol and implementation.\nThe built-in http subscription implementation, for instance, demands an endpoint, a method, and a port, if the method is not a GET.\nOn the other hand, the built-in tcp subscription implementation requires only a port.

\n

These are the subscription attributes:

\n

name
\nDefaults to subscription index.\nDescribes what the subscription is supposed to do.

\n
name: subscription action\n
\n

type
\nMandatory. Key tag to identify which subscription will be instantiated

\n
type: http\n
\n

avoid
\nIdentifies whether or not this subscription should not receive any message. Defaults to false.\nIf set and a message is received a failing test will be generated.\nTake a look at this to see it working.\nOn the other hand, when it's false and no message is received in a given timeout. The subscription is valid.

\n
avoid: false\n
\n

timeout
\nSets in milliseconds how long the subscription waits to expire. Defaults to 3000.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this subscription should be skipped. Check this to see it working.

\n
ignore: true    \n
\n
events
\n

Available events are described here. A this object is available to access and change subscription attributes.

\n
onInit:\n  script: this.avoid = false;\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived:  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n
\n

Event

\n

Events are hook methods executed by enqueuer when an action occurs on publishers, subscriptions or requisitions.\nThis is where you'll write your tests. In its assertions field.\nThere will be a variable called this and, depending on the event's owner, it has an alias publisher, subscription or requisition.\nYou're free to explore them however you want, even doing things like this:

\n
publisher.parent.subscriptions[0].timeout = 1000;\n
\n

hooks

\n

By default, there are three hook events available:

\n

onInit
\nAvailable in requisitions, publishers and subscriptions. It gets executed as soon as the component is initialized.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

onFinish
\nAvailable in requisitions, publishers and subscriptions. It gets executed when the component is about to finish.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

custom\nDepending on the protocol implementation/library/author's mood, the publisher/subscription may have additional hooks.\nSuch as onError, onResponseReceived, onFileNotFound and onRedirect...\nHttp-proxy subscription test file is an excellent example, check it out.

\n

fields

\n

Every hook object has 3 properties:

\n

script
\nJavascript code snippet executed when the event is triggered.\nYeah, I mean it. See it it by yourself.\nBut be careful, with great power comes great responsibility.

\n

store
\nData to be persisted across requisitions.

\n

assertions
\nArray of assertions.\nRun $ nqr -t to see available ones.\nConsider looking at this test example.\nOf course, just like almost everything else in enqueuer world, you can extend this available list using some plugin.\nYou can check them out or even write your own.

\n
onInit:\n  script: variableIdentifier = 'string value'\n\n  assertions:\n  - expect: variableIdentifier\n    toBeEqualTo: `string value`\n\nonMessageReceived:\n  script: |-\n    message += 3;\n    console.log(`Message received plus 3 is: ${message}`);\n\n  store:\n    key: message\n\n  assertions:\n  - name: anyValue #optional\n    expect: message\n    toBeEqualTo: store.key\n  - expect: message + 3\n    toBeGreaterThan: 3\n
\n

event example

\n

Check this test file to see it in practice.

\n
\n

Requisition Flow

\n

Now that you know what are requisitions, publishers, subscriptions and events. How about seeing how they interact with each other in a fancier way?

\n

\"enqueuerInstanceFlow\"

\n
\n

Configuration File

\n

To save yourself some time, a configuration file may be used.\nConfiguration files tell enqueuer which tests will be executed, log-level, and which output test report files should be generated.\nThis file tells how enqueuer should be executed.\nTo run enqueuer with the configuration:

\n
$ nqr -c path/to/configuration/file.yml\n
\n

or

\n
$ nqr --config-file path/to/configuration/file.yml\n
\n

attributes

\n

These are the configuration file attributes:

\n

files
\nRequisition file names or glob. Enqueuer runs every file that matches an element value.

\n
files:\n- 1.yml\n- 2.yml\n- *.json\n
\n

parallel
\nDefaults to false. Requisition files should be executed in parallel mode. The requisition file itself is still sequential, but the files are executes in parallel.

\n
parallel: true\n
\n

log-level
\nDefaults to warning. Defines how information are logged in the console. Accepted values are: trace; debug; info; warning (default); error; and fatal.

\n
log-level: trace\n
\n

max-report-level-print
\nDefaults to 1. The deepest level of report to be printed to the console.

\n
max-report-level-print: 2\n
\n

plugins
\nList of in plugins used by the test scenarios. You can check them out or write your own.

\n
plugins:\n- enqueuer-plugin-amqp \n- enqueuer-plugin-ws \n- enqueuer-plugin-mqtt\n- enqueuer-plugin-html-report\n
\n

outputs
\nOnce enqueuer runs every execution, it compiles a summary and sends it to every publisher listed in output.\nAn important thing to note is that every available report publisher is available here.\nYes, it means that you are able to send this report through http, tcp, etc. or through a plugin one or a custom one.\nYou can run $ nqr -p to check available report publishers installed.\nAnother important thing to note is the format value. By default a json summary is generated, but you can change it to whatever format you would like, such as: Xunit, html\nYou can run $ nqr -f to check available installed formats or even write your own

\n
outputs:\n- type: file\n  format: json (default)\n  filename: output/examples.json\n- type: file\n  format: yml\n  filename: output/examples.yml\n- type: standard-output (default)\n  format: console\n
\n

store
\nValues defined here use the 'key: value' pattern and are available to every test scenario throughout the entire execution

\n
store:\n  variableKey: \"my value\" # Defines 'variableKey' key and its value 'my value'. \n  \n  'separated key': 6\n  \n  object: # You can even define whole objects here:\n    first: first value\n    second:\n      nested: thing\n
\n

example

\n

Here's a complete example of a configuration file.

\n
\n

Variables

\n

Providing power and flexibility, enqueuer allows you to use variables placeholder replacement.\nThat's why there is a store field and you'll see a lot of << and {{ being used in the examples files.\nIt works as simple as this:

\n
name: my name is <<variableKey>>\n
\n

Every time enqueuer sees these kind of notations, it searches in its store for a key/value pair like:

\n
variableKey: `enqueuer`\n
\n

Then, when enqueuer parses the original map, it gets translated to this:

\n
name: my name is enqueuer\n
\n

By default, every ENV_VAR set is loaded automatically to the store. Check this example.

\n

set a variable

\n

There are a few ways to set a value in the store.

\n
configuration file
\n

Configuration file store object. Set it as you wish, as you can see here

\n
command line
\n

A command line argument using the key=value format. This way:

\n
$ nqr --store key=value -s anotherVariable=true\n
\n
event
\n

Dynamically set it through any event.\nBe it in its script field or straight through its store field.\nBoth ways work:

\n
onInit:\n    script: store.key = 123;\n    store:\n        anotherKey: `another Value` \n
\n

use a variable

\n

There are two ways two use a variable:

\n
non js code snippet
\n

The easiest one is to type <<variableKey>> or {{variableKey}} where you want it to be replaced in a test file, as you can see here

\n
js code snippet
\n

Using the store object. It's attributes are the keys and their values are their respective values.\nTherefore, you're free to use store.variableKey, console.log(store.variableKey); or console.log(2 * store['separated key']); and get them.\nLike this one.

\n

variables example

\n

Check out this test example test to see it working.

\n
\n

Content File Injection

\n

You are able to inject file content into a requisition/publisher/subscription field.

\n
file: <<file://path/to/file.txt>>\n
\n

Other than that, enqueuer can read it and parse its content as an object using this familiar syntax: <<tag://path/to/file?query=value&other=true>>.

\n
requisition:\n    json: <<json://path/to/file.json>>\n    yml: <<yml://path/to/file.yml>>\n    csv: <<csv://path/to/file.csv?header=true&delimiter=;>>\n    file: <<file://path/to/file.txt>>\n
\n

Once the object is parsed, your free to use it as a regular object in any event

\n
onInit:\n    script: console.log(requisition.yml.deep.field);\nonFinish:\n    assertions:\n    -   expect: json.key\n        toBeEqualTo: csv[0].key\n
\n

It get's event better.\nDue its fantastic plugin architecture design, you can extend its default modules and use any of these plugins or event write your own to parse however you want.\nThe built-in modules for object parsers are: json, yml, csv and file.\nRun $ nqr -e to see available ones.

\n

example

\n

Check out this test example test to get a full picture of it.

\n
\n

Plugins

\n

You're probably aware by now but it doesn't hurt do emphasize it: enqueuer provides an amazingly powerful plugin extensible architecture.\nIt has several plugins available, but if none of them pleases you, you're free to create your own.\nAlbeit you don't have to share the one you created, we encourage you to do so. Then go ahead and publish yours to npm and add it to our plugins list.

\n

plugin types

\n

So far, you're able to extend enqueuer default behavior in four ways. Using a protocol plugin, an object parser plugin, an asserter plugin and using a report formatter plugin.

\n
protocol
\n

A protocol plugin enables you to use a different publisher/subscription types.\nRun $ nqr -p [protocol-name] to get the full available list:

\n
publishers: \n-   name:                  custom\n-   name:                  file\n-   name:                  http\n    messageReceivedParams: statusCode, statusMessage, body\n-   name:                  stdout\n-   name:                  tcp\n-   ...\nsubscriptions: \n-   name:                  custom\n-   name:                  file\n    messageReceivedParams: content, name, size, modified, created\n-   name:                  http\n    messageReceivedParams: headers, params, query, body\n-   name:                  stdin\n-   name:                  tcp\n    messageReceivedParams: payload, stream\n-   ...\n
\n

Each one listed above has a respective example in the examples folder.\nThis one, for instance, provides support for amqp protocol, so you can create this publisher and subscription:

\n
publishers:\n-   type: amqp\n    payload: enqueuermaniac\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.key\nsubscriptions:\n-   type: amqp\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.#\n    onMessageReceived:\n        assertions:\n        -   expect: payload\n            toBeEqualTo: `enqueuermaniac`\n
\n
object parser
\n

An object parser plugin enables you to read and parse files as you wish.\nThis test example demonstrates how to use it,\nRun $ nqr -e [object-parser-name] to check available ones:

\n
parsers: \n- yml, yaml\n- json\n- file\n- csv\n
\n

This one, for example, provides the ability to read xml files and inject their values like this:

\n
xmlContent: <<xml://path/to/xml/file.xml>>\n
\n
asserter
\n

An asserter plugin provides you a nicely way to use different assertions than these built-in ones.

\n
asserters: \n-   expect: \n        required:    true\n        type:        string, array\n        description: actual value\n    not: \n        required:    false\n        type:        null\n        description: negates\n    toContain: \n        required:    true\n        type:        string, any\n        description: element\n
\n

Looking at the asserter above, we can create assertions like these:

\n
assertions:\n-   expect: [`a`, 1, true]\n    not:\n    toContain: `b`\n-   expect: [`a`, 1, true]\n    toContain: 1\n
\n

Run $ nqr -t to get the full available list.\nConsider looking at this test example.

\n
report formatter
\n

A report formatter plugin gives you the ability to export enqueuer reports the way you want.\nRun $ nqr -f [formatter-name] to list available report formatters:

\n
formatters: \n- console, stdout\n- json\n- yml, yaml\n
\n

Consider looking at the example of configuration file to see it in use.\nThis one, for instance, generates xUnit like reports from enqueuer's output.

\n

plugin installation

\n

In order to enqueuer get awareness that you want to use a plugin, you have to tell it, right?\nYou can tell enqueuer to use a plugin in three different ways: using it as a command line argument, through the configuration file or letting enqueuer finding it in a default location.

\n
command line
\n

Tell enqueuer to use your plugin through command line this way $ nqr -l <plugin-folder> -l <another-plugin-folder>.\nWhere plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
configuration file
\n

Tell enqueuer to use your plugin through configuration file this way:

\n
plugins: \n-   plugin-folder\n-   another-plugin-folder\n
\n

Where plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
implicitly
\n

When enqueuer runs, it looks for modules in its same installation directory or in .nqr folder in the home directory, a.k.a. ~/ folder in linux distributions.\nTherefore, if you run:

\n
$ npm install --global enqueuer\n$ mkdir ~/.nqr\n$ cd ~/.nqr\n$ npm install enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

Or

\n
$ npm install --global enqueuer enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

You'll see that the enqueuer-plugin-amqp plugin will be loaded.\nEvery enqueuer compatible module gets implicitly loaded.\nIn order to be enqueuer compatible, a module has to have an entryPoint exported function in its main file and, in its package.json file, it has to have either 'enqueuer' or 'nqr' as keywords.

\n

Stacker

\n

Looking for a really really good looking an human error proof solution way of writing these requisition files?
\nConsider taking a look at stacker: open source, cross-platform, multi protocol client testing tool.\nThe official enqueuer's best friend forever. Do amazing things and change the world with enqueuer’s GUI!\nWith them, you create, manage and run requisitions and and see their results in a really nice way.\nSee this amazing beauty with your own eyes to get an idea of how it works:

\n

\"screenshot-passing\"

\n
\n

Open source

\n

We (by 'we' we mean enqueuer's maintainers not the human race, unfortunately) are very opened to any kind of contributions in general.\nAs long as they make sense and add value to the product, you're free to go.\nWe mean it, do it. Even if it's a typo fix in this README file. Go ahead.\nIf you like it but don't want to waste time creating a pull request, no problem either.\nCreate an issue, or, even easier, give it a github star. It's cheap and it doesn't hurt anyone.\nYou know what? Just head up to enqueuer's github repo and keep staring at its repo.\nIt may help somehow.

\n

contributors

\n

Thank you. It sounds cliché, but this project wouldn't be the same without the massive contribution from everyone.

\n

code it

\n

In order to contribute with some code, you have to follow a few steps.\nFirst of all, get the code:

\n
$ git clone git@github.com:enqueuer-land/enqueuer.git\n$ cd enqueuer\n
\n

Get its dependencies installed:

\n
$ npm install\n
\n

Build it:

\n
$ npm run build\n
\n

Go for it. Make the changes you want.\nAfter everything is done:

\n
$ npm run all\n
\n

Commit it:

\n
$ npm run commit\n
\n

Push it:

\n
$ git push\n
\n

feedback

\n

We'd love to get your feedback!\nIf you have any comments, suggestions, etc. you can reach us here.

\n

\"NPM\"

\n
\n
\n
\n\n\n\n
\n
\n\n
\n
\n \n\n
\n\n \n
\n
\n \n\n \n \n\n \n
\n
\n \n
\n
\n\n\n\n
\n \n \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n \n \n
\n \n\n
\n
\n
\n
\n\n \n \n\n
\n\n \n\n\n", + "body": "\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n\n\n\n \n \n \n \n \n \n \n\n\n \n \n GitHub - enqueuer-land/enqueuer: Multi protocol microservice testing tool\n \n \n \n \n\n \n \n\n \n \n \n\n \n\n\n\n \n\n \n\n \n\n \n \n \n\n \n\n\n\n\n \n\n\n\n\n\n\n \n\n \n \n\n \n\n\n \n\n \n \n\n \n\n \n\n \n\n\n \n\n\n \n\n \n\n \n \n\n\n\n\n \n\n \n\n \n \n\n
\n Skip to content\n \n \n \n\n \n \n\n\n\n
\n
\n
\n \n \n \n
\n\n
\n
\n \n
\n\n \n\n \n
\n
\n
\n\n
\n\n
\n\n\n
\n\n
\n\n\n\n\n
\n
\n
\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n
\n\n
\n\n
\n

\n \n \n enqueuer-land\n \n /\n \n enqueuer\n \n \n

\n\n\n
\n\n \n\n
\n \n\n\n\n
\n
\n
\n\n \n \n \n\n\n
\n \n Multi protocol microservice testing tool\n \n https://enqueuer.com\n
\n
\n\n \n\n\n\n \n\n
\n \n
\n TypeScript\n HTML\n JavaScript\n Shell\n
\n
\n \n
\n\n\n\n\n\n\n
\n \n
\n \n Branch:\n master\n \n \n\n \n
\n \n \n \n
\n
\n
\n\n\n \n\n
\n \n
\n\n
\n\n Find file\n
\n\n \n\n\n \n\n
\n \n Clone or download\n \n
\n
\n\n
\n
\n\n

\n Clone with HTTPS\n \n \n \n

\n

\n Use Git or checkout with SVN using the web URL.\n

\n\n
\n \n
\n \n
\n
\n\n
\n\n \n
\n\n \n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching Xcode

\n

If nothing happens, download Xcode and try again.

\n

\n
\n\n
\n

Launching Visual Studio

\n

If nothing happens, download the GitHub extension for Visual Studio and try again.

\n

\n
\n\n
\n
\n
\n\n\n
\n\n\n\n\n\n
\n \n
\n
\n \n \"@virgs\"\n
\n
\n\n \n
\n \n \n \n Latest commit\n \n df5799a\n \n Feb 2, 2020\n
\n
\n\n\n\n
\n Permalink\n\n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TypeNameLatest commit messageCommit time
Failed to load latest commit information.
\n \n \"\"\n \n .github/ISSUE_TEMPLATE\n \n \n Update bug_report.md\n \n \n Mar 4, 2019\n
\n \n \"\"\n \n conf\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n docs\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n examples\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n https-cert\n \n \n Adding support to https\n \n \n Aug 9, 2018\n
\n \n \"\"\n \n misc\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n output\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n src\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n temp\n \n \n #19 adding attempting to create a topic at kafka\n \n \n Oct 3, 2018\n
\n \n \"\"\n \n .codeclimate.yml\n \n \n Updating .codeclimate\n \n \n Sep 24, 2018\n
\n \n \"\"\n \n .gitignore\n \n \n docs(README): Improve docs\n \n \n Mar 23, 2019\n
\n \n \"\"\n \n .npmignore\n \n \n Removing SummaryTestOutput dependency with Configuration and start te…\n \n \n Mar 10, 2019\n
\n \n \"\"\n \n .travis.yml\n \n \n feat(dynamic-modules-manager): Look for a ~/.nqr folder to load plugi…\n \n \n Mar 22, 2019\n
\n \n \"\"\n \n CNAME\n \n \n Create CNAME\n \n \n May 10, 2019\n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n chore(Automatic Release): Add automatic release with semantic-release.\n \n \n Mar 21, 2019\n
\n \n \"\"\n \n License\n \n \n Creating License\n \n \n Mar 10, 2018\n
\n \n \"\"\n \n README.md\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n package-lock.json\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n package.json\n \n \n chore(Dependencies): Update dependencies\n \n \n Jul 5, 2019\n
\n \n \"\"\n \n tsconfig.json\n \n \n feat(NotificationEmitter): Create the concept of Notification and Not…\n \n \n May 24, 2019\n
\n \n \"\"\n \n tslint.json\n \n \n Subscription refactoring\n \n \n Mar 12, 2019\n
\n\n
\n\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n
\n
\n
\n
\n
\n\n
\n

\"npm\"\n\"Build\n\"Greenkeeper\n\"Known\n\"License:

\n

\"enqueuerlogo\"

\n

Welcome

\n

Be our guest and have fun.

\n

install it

\n

First things first, let's get the enqueuer installed on your machine.

\n
$ npm install --global enqueuer\n
\n

Alright, it's time to create a requisition file.\nSomething like:

\n
#enqueuer-repo-hit.yml\npublishers:\n-   type: http\n    url: https://github.com/enqueuer-land/enqueuer\n    onResponseReceived:\n        assertions:\n        -   expect: statusCode\n            toBeEqualTo: 200\n
\n

Pretty simple, hum? Small and concise, how it should be!\nRun it:

\n
$ enqueuer enqueuer-repo-hit.yml\n
\n

What if I want to mock a http server, you may ask. Not a big deal for enqueuer lovers:

\n
timeout: -1\nsubscriptions:\n-   type: http\n    timeout: -1\n    name: mock endpoint\n    endpoint: /readme-example\n    port: 9085\n    method: POST\n    response:\n        status: 200\n        payload: mock response\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: `enqueuer`\n
\n

Now go ahead and try hitting it using the browser.\nTip: remove timeout values and check what happens.\nI told you it was simple.\nNow, let's say you want to mix different protocols to test a bit more complex flow.\nHow about publishing an amqp message and making sure that, once a service consumes that message an endpoint of your is hit?\nIn order to achieve that, we have to make use of a plugin, given that amqp support is provided by a plugin.\nIn this scenario, we're talking about the amqp plugin.\nOnce we get this plugin installed we are able to create and run files like this:

\n
publishers:\n-   type: amqp\n    payload: 123456\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.readme.routing.key\nsubscriptions:\n-   type: http\n    endpoint: /polyglot-flow\n    port: 8080\n    method: GET\n    response:\n        status: 200\n        payload: polyglot message\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: 123456\n
\n

Now go nuts!\nIt's all yours. Have fun.\nIf you want more examples about http, consider looking at this test.\nCheck this out, you'll find countless examples.\nCertainly one is what you need.

\n

if you need more

\n
$ nqr -h\nUsage: nqr [options] <test-file> [other-test-files...]\n\nTake a look at the full documentation: https://enqueuer.com\n\nOptions:\n  -v, --version                             output the version number\n  -b, --verbosity <level>                   set verbosity (default: \"warn\")\n  -c, --config-file <path>                  set configurationFile\n  -e, --parsers-list [parser]               list available object parsers\n  -f, --formatters-description [formatter]  describe report formatters\n  -o, --stdout-requisition-output           add stdout as requisition output\n  -m, --max-report-level-print <level>      set max report level print\n  -p, --protocols-description [protocol]    describe protocols\n  -t, --tests-list [expectedField]          list available tests assertions\n  -u, --loaded-modules-list                 list loaded modules\n  -i, --show-passing-tests                  show passing tests\n  -s, --store [store]                       add variables values to this session (default: [])\n  -l, --add-plugin [plugin]                 add plugin (default: [])\n  -a, --add-file <file>                     add file to be tested (default: [])\n  -A, --add-file-and-ignore-others <file>   add file to be tested and ignore others (default: [])\n  -h, --help                                output usage information\n\nExamples:\n  $ nqr --config-file config-file.yml --verbosity error --store key=value\n  $ enqueuer -c config-file.yml test-file.yml --add-file another-test-file.yml -b info\n  $ enqueuer test-file.yml --store someKey=true --store someOtherKey=false\n  $ nqr --protocols-description -s key=value\n  $ nqr -t expect\n  $ nqr -l my-enqueuer-plugin-name -p plugin-protocol\n  $ nqr -p http\n  $ nqr --formatters-description json\n  \nContributing:\n  https://github.com/enqueuer-land/enqueuer\n
\n
\n

Components

\n

In order to accomplish more than just hitting enqueuer's repo or doing a quick self http hit, there are a few things that you'll probably need to know.\nDon't worry, it's not too much and, as mentioned earlier, there is a lot of examples here, just in case.\nThere are only three important component concepts: requisitions, publishers and subscriptions.\nThey work along with each other and are responsible for the full behavior of enqueuer.

\n

requisition

\n

Test scenario description. It tells what, when, and how test your applications and services.\nPicture it as if it was a collection of publishers, subscriptions and other requisitions.\nIt helps because this is exactly what it is.\nAs the others components, it has some attributes. All of them are optionals. And it supports multi-level test scenarios out of the box. Yeap, go as recursive as you want.\nEvery test file is a requisition.\nYou don't know some of these attributes values yet? Don't worry, just put a variable there and let enqueuer replace it with the value you set later.\nVariable replacements are available through the entire requisition.

\n
requisition attributes
\n

These are the requisition attributes:

\n

name
\nDescribes what the requisition is suppose to do.\nDefaults to requisition index.

\n
name: requisition action\n
\n

timeout
\nDefaults to 5000.\nSets in milliseconds how long the requisition waits to expire.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

delay
\nDefaults to 0. Sets in milliseconds how long the test waits before starting. Check this to get the full idea.

\n
delay: 0\n
\n

iterations
\nDefaults to 1. Sets how many times this test will be executed. Check this and this to get the full idea.

\n
iterations: 3\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this requisitions should be skipped. Check this to see it working.

\n
ignore: true\n
\n

parallel
\nDefaults to false. Immediate children requisitions should be executed in parallel mode.\nTake a look at this to see it working.

\n
parallel: true\n
\n

import
\nAllows requisition to be dynamically defined, be it by loading an external file or creating dynamically by other requisitions. Want to reuse the same requisition multiple times? This is you you need.\nTake a look at this to behold this feature.

\n
import: path/to/another/requisition/file\n
\n

publishers
\nList of publishers. They're executed simultaneously, therefore, the order is irrelevant.

\n
publishers:\n- name: some publisher name\n  type: http\n- type: tcp\n
\n

subscriptions
\nList of subscriptions. They're executed simultaneously, therefore, the order is irrelevant.

\n
subscriptions:\n- name: some subscription name\n  type: udp\n- name: another subscription name\n  type: file\n
\n

requisitions
\nA list of child scenarios. List of requisitions.\nBy default, they're executed sequentially, therefore, the order is relevant.\nUnless the parallel attribute is set to true, what makes them get executed simultaneously,\nCheck this example, it may help.

\n
requisitions:\n- name: some requisition name\n  iterations: 2\n- name: another requisition name\n  delay: 200\n
\n
events
\n

Available events are described here. A this object is available to access and change requisition attributes.

\n
name: my name\nonInit:\n  script: this.delay = 3000;\n  assertions:\n  - expectToBeDefined: this.name\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.name\n
\n

publisher

\n

A publisher action is triggered by enqueuer itself. It acts whereas a subscription reacts.\nIt publishes something, it writes, it enqueues, hits and endpoint... These kinds of actions.\nIt's worth noting that it always creates a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if the message got published.

\n
publisher attributes
\n

Every publisher has its own properties, depending on its protocol and implementation.\nThe built-in http publisher implementation, for instance, demands a url, a method, and a payload, if the method is not a GET.\nOn the other hand, the built-in tcp publisher implementation requires a serverAddress and a port.\nThese are the publisher attributes:

\n

name
\nDefaults to publisher index.\nDescribes what the publisher is supposed to do.

\n
name: publisher action\n
\n

type
\nMandatory. Key tag to identify which publisher will be instantiated

\n
type: http\n
\n

payload
\nSince a publisher usually publishes something, it's very likely you have to set a value here.\nThe message itself that will be send through this protocol. Be it a string, a number, a boolean value or even whole objects.

\n
payload: value\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this publisher should be skipped. Check this to see it working.

\n
ignore: true\n
\n
events
\n

Available events are described here. A this object is available to access and change publisher attributes.\nDepending on the protocol and its implementation, such as http and tcp, there may exist special events, such as onMessageReceived event and a special object given message.\nOn the other hand, an asynchronous protocol, like: udp and amqp, usually do not provide it.

\n
onInit:\n  script: this.ignore = false\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived: #Provided in synchronous protocols  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n

subscription

\n

A subscription is an \"under demand\" event. It reacts whereas a publisher acts.\nIt consumes something, it reads, it dequeues, gets hit... These kinds of actions.\nThis means that it is not triggered by enqueuer itself.\nRather than that, enqueuer waits on an external event to be triggered and then it asserts against the message that was passed to the subscription.\nIt's worth noting that it always receives a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if a message got received.

\n
subscription attributes
\n

Every subscription has its own properties, depending on its protocol and implementation.\nThe built-in http subscription implementation, for instance, demands an endpoint, a method, and a port, if the method is not a GET.\nOn the other hand, the built-in tcp subscription implementation requires only a port.

\n

These are the subscription attributes:

\n

name
\nDefaults to subscription index.\nDescribes what the subscription is supposed to do.

\n
name: subscription action\n
\n

type
\nMandatory. Key tag to identify which subscription will be instantiated

\n
type: http\n
\n

avoid
\nIdentifies whether or not this subscription should not receive any message. Defaults to false.\nIf set and a message is received a failing test will be generated.\nTake a look at this to see it working.\nOn the other hand, when it's false and no message is received in a given timeout. The subscription is valid.

\n
avoid: false\n
\n

timeout
\nSets in milliseconds how long the subscription waits to expire. Defaults to 3000.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this subscription should be skipped. Check this to see it working.

\n
ignore: true    \n
\n
events
\n

Available events are described here. A this object is available to access and change subscription attributes.

\n
onInit:\n  script: this.avoid = false;\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived:  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n
\n

Event

\n

Events are hook methods executed by enqueuer when an action occurs on publishers, subscriptions or requisitions.\nThis is where you'll write your tests. In its assertions field.\nThere will be a variable called this and, depending on the event's owner, it has an alias publisher, subscription or requisition.\nYou're free to explore them however you want, even doing things like this:

\n
publisher.parent.subscriptions[0].timeout = 1000;\n
\n

hooks

\n

By default, there are three hook events available:

\n

onInit
\nAvailable in requisitions, publishers and subscriptions. It gets executed as soon as the component is initialized.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

onFinish
\nAvailable in requisitions, publishers and subscriptions. It gets executed when the component is about to finish.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

custom\nDepending on the protocol implementation/library/author's mood, the publisher/subscription may have additional hooks.\nSuch as onError, onResponseReceived, onFileNotFound and onRedirect...\nHttp-proxy subscription test file is an excellent example, check it out.

\n

fields

\n

Every hook object has 3 properties:

\n

script
\nJavascript code snippet executed when the event is triggered.\nYeah, I mean it. See it it by yourself.\nBut be careful, with great power comes great responsibility.

\n

store
\nData to be persisted across requisitions.

\n

assertions
\nArray of assertions.\nRun $ nqr -t to see available ones.\nConsider looking at this test example.\nOf course, just like almost everything else in enqueuer world, you can extend this available list using some plugin.\nYou can check them out or even write your own.

\n
onInit:\n  script: variableIdentifier = 'string value'\n\n  assertions:\n  - expect: variableIdentifier\n    toBeEqualTo: `string value`\n\nonMessageReceived:\n  script: |-\n    message += 3;\n    console.log(`Message received plus 3 is: ${message}`);\n\n  store:\n    key: message\n\n  assertions:\n  - name: anyValue #optional\n    expect: message\n    toBeEqualTo: store.key\n  - expect: message + 3\n    toBeGreaterThan: 3\n
\n

event example

\n

Check this test file to see it in practice.

\n
\n

Requisition Flow

\n

Now that you know what are requisitions, publishers, subscriptions and events. How about seeing how they interact with each other in a fancier way?

\n

\"enqueuerInstanceFlow\"

\n
\n

Configuration File

\n

To save yourself some time, a configuration file may be used.\nConfiguration files tell enqueuer which tests will be executed, log-level, and which output test report files should be generated.\nThis file tells how enqueuer should be executed.\nTo run enqueuer with the configuration:

\n
$ nqr -c path/to/configuration/file.yml\n
\n

or

\n
$ nqr --config-file path/to/configuration/file.yml\n
\n

attributes

\n

These are the configuration file attributes:

\n

files
\nRequisition file names or glob. Enqueuer runs every file that matches an element value.

\n
files:\n- 1.yml\n- 2.yml\n- *.json\n
\n

parallel
\nDefaults to false. Requisition files should be executed in parallel mode. The requisition file itself is still sequential, but the files are executes in parallel.

\n
parallel: true\n
\n

log-level
\nDefaults to warning. Defines how information are logged in the console. Accepted values are: trace; debug; info; warning (default); error; and fatal.

\n
log-level: trace\n
\n

max-report-level-print
\nDefaults to 1. The deepest level of report to be printed to the console.

\n
max-report-level-print: 2\n
\n

plugins
\nList of in plugins used by the test scenarios. You can check them out or write your own.

\n
plugins:\n- enqueuer-plugin-amqp \n- enqueuer-plugin-ws \n- enqueuer-plugin-mqtt\n- enqueuer-plugin-html-report\n
\n

outputs
\nOnce enqueuer runs every execution, it compiles a summary and sends it to every publisher listed in output.\nAn important thing to note is that every available report publisher is available here.\nYes, it means that you are able to send this report through http, tcp, etc. or through a plugin one or a custom one.\nYou can run $ nqr -p to check available report publishers installed.\nAnother important thing to note is the format value. By default a json summary is generated, but you can change it to whatever format you would like, such as: Xunit, html\nYou can run $ nqr -f to check available installed formats or even write your own

\n
outputs:\n- type: file\n  format: json (default)\n  filename: output/examples.json\n- type: file\n  format: yml\n  filename: output/examples.yml\n- type: standard-output (default)\n  format: console\n
\n

store
\nValues defined here use the 'key: value' pattern and are available to every test scenario throughout the entire execution

\n
store:\n  variableKey: \"my value\" # Defines 'variableKey' key and its value 'my value'. \n  \n  'separated key': 6\n  \n  object: # You can even define whole objects here:\n    first: first value\n    second:\n      nested: thing\n
\n

example

\n

Here's a complete example of a configuration file.

\n
\n

Variables

\n

Providing power and flexibility, enqueuer allows you to use variables placeholder replacement.\nThat's why there is a store field and you'll see a lot of << and {{ being used in the examples files.\nIt works as simple as this:

\n
name: my name is <<variableKey>>\n
\n

Every time enqueuer sees these kind of notations, it searches in its store for a key/value pair like:

\n
variableKey: `enqueuer`\n
\n

Then, when enqueuer parses the original map, it gets translated to this:

\n
name: my name is enqueuer\n
\n

By default, every ENV_VAR set is loaded automatically to the store. Check this example.

\n

set a variable

\n

There are a few ways to set a value in the store.

\n
configuration file
\n

Configuration file store object. Set it as you wish, as you can see here

\n
command line
\n

A command line argument using the key=value format. This way:

\n
$ nqr --store key=value -s anotherVariable=true\n
\n
event
\n

Dynamically set it through any event.\nBe it in its script field or straight through its store field.\nBoth ways work:

\n
onInit:\n    script: store.key = 123;\n    store:\n        anotherKey: `another Value` \n
\n

use a variable

\n

There are two ways two use a variable:

\n
non js code snippet
\n

The easiest one is to type <<variableKey>> or {{variableKey}} where you want it to be replaced in a test file, as you can see here

\n
js code snippet
\n

Using the store object. It's attributes are the keys and their values are their respective values.\nTherefore, you're free to use store.variableKey, console.log(store.variableKey); or console.log(2 * store['separated key']); and get them.\nLike this one.

\n

variables example

\n

Check out this test example test to see it working.

\n
\n

Content File Injection

\n

You are able to inject file content into a requisition/publisher/subscription field.

\n
file: <<file://path/to/file.txt>>\n
\n

Other than that, enqueuer can read it and parse its content as an object using this familiar syntax: <<tag://path/to/file?query=value&other=true>>.

\n
requisition:\n    json: <<json://path/to/file.json>>\n    yml: <<yml://path/to/file.yml>>\n    csv: <<csv://path/to/file.csv?header=true&delimiter=;>>\n    file: <<file://path/to/file.txt>>\n
\n

Once the object is parsed, your free to use it as a regular object in any event

\n
onInit:\n    script: console.log(requisition.yml.deep.field);\nonFinish:\n    assertions:\n    -   expect: json.key\n        toBeEqualTo: csv[0].key\n
\n

It get's event better.\nDue its fantastic plugin architecture design, you can extend its default modules and use any of these plugins or event write your own to parse however you want.\nThe built-in modules for object parsers are: json, yml, csv and file.\nRun $ nqr -e to see available ones.

\n

example

\n

Check out this test example test to get a full picture of it.

\n
\n

Plugins

\n

You're probably aware by now but it doesn't hurt do emphasize it: enqueuer provides an amazingly powerful plugin extensible architecture.\nIt has several plugins available, but if none of them pleases you, you're free to create your own.\nAlbeit you don't have to share the one you created, we encourage you to do so. Then go ahead and publish yours to npm and add it to our plugins list.

\n

plugin types

\n

So far, you're able to extend enqueuer default behavior in four ways. Using a protocol plugin, an object parser plugin, an asserter plugin and using a report formatter plugin.

\n
protocol
\n

A protocol plugin enables you to use a different publisher/subscription types.\nRun $ nqr -p [protocol-name] to get the full available list:

\n
publishers: \n-   name:                  custom\n-   name:                  file\n-   name:                  http\n    messageReceivedParams: statusCode, statusMessage, body\n-   name:                  stdout\n-   name:                  tcp\n-   ...\nsubscriptions: \n-   name:                  custom\n-   name:                  file\n    messageReceivedParams: content, name, size, modified, created\n-   name:                  http\n    messageReceivedParams: headers, params, query, body\n-   name:                  stdin\n-   name:                  tcp\n    messageReceivedParams: payload, stream\n-   ...\n
\n

Each one listed above has a respective example in the examples folder.\nThis one, for instance, provides support for amqp protocol, so you can create this publisher and subscription:

\n
publishers:\n-   type: amqp\n    payload: enqueuermaniac\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.key\nsubscriptions:\n-   type: amqp\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.#\n    onMessageReceived:\n        assertions:\n        -   expect: payload\n            toBeEqualTo: `enqueuermaniac`\n
\n
object parser
\n

An object parser plugin enables you to read and parse files as you wish.\nThis test example demonstrates how to use it,\nRun $ nqr -e [object-parser-name] to check available ones:

\n
parsers: \n- yml, yaml\n- json\n- file\n- csv\n
\n

This one, for example, provides the ability to read xml files and inject their values like this:

\n
xmlContent: <<xml://path/to/xml/file.xml>>\n
\n
asserter
\n

An asserter plugin provides you a nicely way to use different assertions than these built-in ones.

\n
asserters: \n-   expect: \n        required:    true\n        type:        string, array\n        description: actual value\n    not: \n        required:    false\n        type:        null\n        description: negates\n    toContain: \n        required:    true\n        type:        string, any\n        description: element\n
\n

Looking at the asserter above, we can create assertions like these:

\n
assertions:\n-   expect: [`a`, 1, true]\n    not:\n    toContain: `b`\n-   expect: [`a`, 1, true]\n    toContain: 1\n
\n

Run $ nqr -t to get the full available list.\nConsider looking at this test example.

\n
report formatter
\n

A report formatter plugin gives you the ability to export enqueuer reports the way you want.\nRun $ nqr -f [formatter-name] to list available report formatters:

\n
formatters: \n- console, stdout\n- json\n- yml, yaml\n
\n

Consider looking at the example of configuration file to see it in use.\nThis one, for instance, generates xUnit like reports from enqueuer's output.

\n

plugin installation

\n

In order to enqueuer get awareness that you want to use a plugin, you have to tell it, right?\nYou can tell enqueuer to use a plugin in three different ways: using it as a command line argument, through the configuration file or letting enqueuer finding it in a default location.

\n
command line
\n

Tell enqueuer to use your plugin through command line this way $ nqr -l <plugin-folder> -l <another-plugin-folder>.\nWhere plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
configuration file
\n

Tell enqueuer to use your plugin through configuration file this way:

\n
plugins: \n-   plugin-folder\n-   another-plugin-folder\n
\n

Where plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
implicitly
\n

When enqueuer runs, it looks for modules in its same installation directory or in .nqr folder in the home directory, a.k.a. ~/ folder in linux distributions.\nTherefore, if you run:

\n
$ npm install --global enqueuer\n$ mkdir ~/.nqr\n$ cd ~/.nqr\n$ npm install enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

Or

\n
$ npm install --global enqueuer enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

You'll see that the enqueuer-plugin-amqp plugin will be loaded.\nEvery enqueuer compatible module gets implicitly loaded.\nIn order to be enqueuer compatible, a module has to have an entryPoint exported function in its main file and, in its package.json file, it has to have either 'enqueuer' or 'nqr' as keywords.

\n

Stacker

\n

Looking for a really really good looking an human error proof solution way of writing these requisition files?
\nConsider taking a look at stacker: open source, cross-platform, multi protocol client testing tool.\nThe official enqueuer's best friend forever. Do amazing things and change the world with enqueuer’s GUI!\nWith them, you create, manage and run requisitions and and see their results in a really nice way.\nSee this amazing beauty with your own eyes to get an idea of how it works:

\n

\"screenshot-passing\"

\n
\n

Open source

\n

We (by 'we' we mean enqueuer's maintainers not the human race, unfortunately) are very opened to any kind of contributions in general.\nAs long as they make sense and add value to the product, you're free to go.\nWe mean it, do it. Even if it's a typo fix in this README file. Go ahead.\nIf you like it but don't want to waste time creating a pull request, no problem either.\nCreate an issue, or, even easier, give it a github star. It's cheap and it doesn't hurt anyone.\nYou know what? Just head up to enqueuer's github repo and keep staring at its repo.\nIt may help somehow.

\n

contributors

\n

Thank you. It sounds cliché, but this project wouldn't be the same without the massive contribution from everyone.

\n

code it

\n

In order to contribute with some code, you have to follow a few steps.\nFirst of all, get the code:

\n
$ git clone git@github.com:enqueuer-land/enqueuer.git\n$ cd enqueuer\n
\n

Get its dependencies installed:

\n
$ npm install\n
\n

Build it:

\n
$ npm run build\n
\n

Go for it. Make the changes you want.\nAfter everything is done:

\n
$ npm run all\n
\n

Commit it:

\n
$ npm run commit\n
\n

Push it:

\n
$ git push\n
\n

feedback

\n

We'd love to get your feedback!\nIf you have any comments, suggestions, etc. you can reach us here.

\n

\"NPM\"

\n
\n
\n
\n\n\n\n\n
\n
\n\n
\n
\n \n\n
\n\n \n
\n
\n \n\n \n \n\n \n
\n
\n \n
\n
\n\n\n\n
\n \n \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n \n \n
\n \n\n
\n
\n
\n
\n\n \n \n\n
\n\n \n\n\n", "headers": { - "date": "Sun, 02 Feb 2020 16:26:10 GMT", + "date": "Fri, 07 Feb 2020 18:11:15 GMT", "content-type": "text/html; charset=utf-8", "transfer-encoding": "chunked", "connection": "close", "server": "GitHub.com", "status": "200 OK", "vary": "X-PJAX, Accept-Encoding", - "etag": "W/\"77cca0288c88302b3b1d550457de96ac\"", + "etag": "W/\"e1412e136159ccfd75d7677e8910d8c0\"", "cache-control": "max-age=0, private, must-revalidate", "set-cookie": [ - "has_recent_activity=1; path=/; expires=Sun, 02 Feb 2020 17:26:09 -0000", - "_octo=GH1.1.506107453.1580660769; domain=.github.com; path=/; expires=Tue, 02 Feb 2021 16:26:09 -0000", - "logged_in=no; domain=.github.com; path=/; expires=Tue, 02 Feb 2021 16:26:10 -0000; secure; HttpOnly", - "_gh_sess=N2ladHJ3cWVmMzhtbEMvenJNMUZpL3NUUklyY3ZubGtGOUNJYWpOajZaTmRsUnVnV3UwNlZqWnRudkdQRUNzMWNVOGxtaDRpdXA2eGVFYXhqU3RraE15OXlUODVvQzY5czNBcGJoZkZuSjRmcjg4dm4yNGNPSmVscUI0RWM0ZExiMnZmQklGMEZ6bUJrNHFFZ0Q2NXp1OG1DbGhMdERrZ2NkbStGQkZhandqdnZGVkg4US8wdFJyelk1RUVjSDhzMGJJc3R2QThLQW1oK0tYWWNBS2RnOVBtb05wNzhFQllERnJiZDZJdFU0dz0tLVNGVzdEdm5tbVkxWU5yZUh0eng3amc9PQ%3D%3D--9c25bbc5296648c26501c2cc7734a15e76b18c37; path=/; secure; HttpOnly" + "_octo=GH1.1.1893030294.1581099075; domain=.github.com; path=/; expires=Sun, 07 Feb 2021 18:11:15 -0000", + "logged_in=no; domain=.github.com; path=/; expires=Sun, 07 Feb 2021 18:11:15 -0000; secure; HttpOnly", + "_gh_sess=RzUzdTUwSW1WaDE0czJUUndOdXQrcHhyYURqVEhlMEIwdmEvRFRCMDlRMXVKMGVmcnVKNUMya1RNd0MyMFpxMjI3My9lMzY1ZmVFVEJjaHQ2bzJxVVB3Um5SSmpMdzk3cVFtZ3JmNE80bk0ra2FzenpqakFsNWVtcjUrVlA4b3dFNXhEMDRqVDhncER3M2N0aVRoVFJTUVFTV1V1VXVEcTg2M2hEcWxVbHR2NG05WFd1eHRQSmhaVm9sdERSQ3hJdmx2VGJtdEVhbU8zSFA5dk9LQ2R4bm1QSC82TkRhcHZ2UmVaYjY4NXRyZz0tLUVzRXdyS3JjUUlBcFlHcElPaVpVVHc9PQ%3D%3D--ef74ccf4768e9eddea233bbcbd01261874ce5574; path=/; secure; HttpOnly" ], "strict-transport-security": "max-age=31536000; includeSubdomains; preload", "x-frame-options": "deny", @@ -5308,7 +5332,7 @@ "x-xss-protection": "1; mode=block", "expect-ct": "max-age=2592000, report-uri=\"https://api.github.com/_private/browser/errors\"", "content-security-policy": "default-src 'none'; base-uri 'self'; block-all-mixed-content; connect-src 'self' uploads.github.com www.githubstatus.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com; frame-ancestors 'none'; frame-src render.githubusercontent.com; img-src 'self' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com; manifest-src 'self'; media-src 'none'; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com", - "x-github-request-id": "C54B:3612:3DA02F:56BFF8:5E36F821" + "x-github-request-id": "CC0D:4DF2:22A3BF:301B8A:5E3DA842" }, "request": { "uri": { @@ -5343,22 +5367,21 @@ "onMessageReceived": { "arguments": { "statusCode": 200, - "body": "\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n\n\n\n \n \n \n \n \n \n \n\n\n \n \n GitHub - enqueuer-land/enqueuer: Multi protocol microservice testing tool\n \n \n \n \n\n \n \n\n \n \n \n\n \n\n\n\n \n\n \n\n \n \n \n\n \n\n\n\n\n \n\n\n\n\n\n\n \n\n \n \n\n \n\n\n \n\n \n \n\n \n\n \n\n \n\n\n \n\n\n \n\n \n\n \n \n\n\n\n\n \n\n \n\n \n \n\n
\n Skip to content\n \n \n \n\n \n \n \n\n\n
\n
\n
\n \n \n \n
\n\n
\n
\n \n
\n\n \n\n \n
\n
\n
\n\n
\n\n
\n\n\n
\n\n
\n\n\n\n
\n
\n
\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n
\n\n
\n\n
\n

\n \n \n enqueuer-land\n \n /\n \n enqueuer\n \n \n

\n\n\n
\n\n \n\n
\n \n\n\n\n
\n
\n
\n\n \n \n \n\n\n
\n \n Multi protocol microservice testing tool\n \n https://enqueuer.com\n
\n
\n\n \n\n\n\n \n\n
\n \n
\n TypeScript\n HTML\n JavaScript\n Shell\n
\n
\n \n
\n\n\n\n\n\n\n
\n \n
\n \n Branch:\n master\n \n \n\n \n
\n \n \n \n
\n
\n
\n\n\n \n\n
\n \n
\n\n
\n\n Find file\n
\n\n \n\n\n \n\n
\n \n Clone or download\n \n
\n
\n\n
\n
\n\n

\n Clone with HTTPS\n \n \n \n

\n

\n Use Git or checkout with SVN using the web URL.\n

\n\n
\n \n
\n \n
\n
\n\n
\n\n
\n \nDownload ZIP\n\n
\n
\n\n \n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching Xcode

\n

If nothing happens, download Xcode and try again.

\n

\n
\n\n
\n

Launching Visual Studio

\n

If nothing happens, download the GitHub extension for Visual Studio and try again.

\n

\n
\n\n
\n
\n
\n\n\n
\n\n\n \n\n\n
\n \"\"\n Fetching latest commit…\n
\n
\n Cannot retrieve the latest commit at this time.\n
\n
\n\n\n
\n Permalink\n\n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TypeNameLatest commit messageCommit time
Failed to load latest commit information.
\n \n \"\"\n \n .github/ISSUE_TEMPLATE\n \n \n Update bug_report.md\n \n \n Mar 4, 2019\n
\n \n \"\"\n \n conf\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n docs\n \n \n docs(index.html): Remove unused docs img\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n examples\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n https-cert\n \n \n Adding support to https\n \n \n Aug 9, 2018\n
\n \n \"\"\n \n misc\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n output\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n src\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n temp\n \n \n #19 adding attempting to create a topic at kafka\n \n \n Oct 3, 2018\n
\n \n \"\"\n \n .codeclimate.yml\n \n \n Updating .codeclimate\n \n \n Sep 24, 2018\n
\n \n \"\"\n \n .gitignore\n \n \n docs(README): Improve docs\n \n \n Mar 23, 2019\n
\n \n \"\"\n \n .npmignore\n \n \n Removing SummaryTestOutput dependency with Configuration and start te…\n \n \n Mar 10, 2019\n
\n \n \"\"\n \n .travis.yml\n \n \n feat(dynamic-modules-manager): Look for a ~/.nqr folder to load plugi…\n \n \n Mar 22, 2019\n
\n \n \"\"\n \n CNAME\n \n \n Create CNAME\n \n \n May 10, 2019\n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n chore(Automatic Release): Add automatic release with semantic-release.\n \n \n Mar 21, 2019\n
\n \n \"\"\n \n License\n \n \n Creating License\n \n \n Mar 10, 2018\n
\n \n \"\"\n \n README.md\n \n \n docs(LandingPage): Create landing page\n \n \n Jun 30, 2019\n
\n \n \"\"\n \n package-lock.json\n \n \n chore(deps): bump handlebars from 4.1.2 to 4.5.3\n \n \n Dec 27, 2019\n
\n \n \"\"\n \n package.json\n \n \n chore(Dependencies): Update dependencies\n \n \n Jul 5, 2019\n
\n \n \"\"\n \n tsconfig.json\n \n \n feat(NotificationEmitter): Create the concept of Notification and Not…\n \n \n May 24, 2019\n
\n \n \"\"\n \n tslint.json\n \n \n Subscription refactoring\n \n \n Mar 12, 2019\n
\n\n
\n\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n
\n
\n
\n
\n
\n\n
\n

\"npm\"\n\"Build\n\"Greenkeeper\n\"Known\n\"License:

\n

\"enqueuerlogo\"

\n

Welcome

\n

Be our guest and have fun.

\n

install it

\n

First things first, let's get the enqueuer installed on your machine.

\n
$ npm install --global enqueuer\n
\n

Alright, it's time to create a requisition file.\nSomething like:

\n
#enqueuer-repo-hit.yml\npublishers:\n-   type: http\n    url: https://github.com/enqueuer-land/enqueuer\n    onResponseReceived:\n        assertions:\n        -   expect: statusCode\n            toBeEqualTo: 200\n
\n

Pretty simple, hum? Small and concise, how it should be!\nRun it:

\n
$ enqueuer enqueuer-repo-hit.yml\n
\n

What if I want to mock a http server, you may ask. Not a big deal for enqueuer lovers:

\n
timeout: -1\nsubscriptions:\n-   type: http\n    timeout: -1\n    name: mock endpoint\n    endpoint: /readme-example\n    port: 9085\n    method: POST\n    response:\n        status: 200\n        payload: mock response\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: `enqueuer`\n
\n

Now go ahead and try hitting it using the browser.\nTip: remove timeout values and check what happens.\nI told you it was simple.\nNow, let's say you want to mix different protocols to test a bit more complex flow.\nHow about publishing an amqp message and making sure that, once a service consumes that message an endpoint of your is hit?\nIn order to achieve that, we have to make use of a plugin, given that amqp support is provided by a plugin.\nIn this scenario, we're talking about the amqp plugin.\nOnce we get this plugin installed we are able to create and run files like this:

\n
publishers:\n-   type: amqp\n    payload: 123456\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.readme.routing.key\nsubscriptions:\n-   type: http\n    endpoint: /polyglot-flow\n    port: 8080\n    method: GET\n    response:\n        status: 200\n        payload: polyglot message\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: 123456\n
\n

Now go nuts!\nIt's all yours. Have fun.\nIf you want more examples about http, consider looking at this test.\nCheck this out, you'll find countless examples.\nCertainly one is what you need.

\n

if you need more

\n
$ nqr -h\nUsage: nqr [options] <test-file> [other-test-files...]\n\nTake a look at the full documentation: https://enqueuer.com\n\nOptions:\n  -v, --version                             output the version number\n  -b, --verbosity <level>                   set verbosity (default: \"warn\")\n  -c, --config-file <path>                  set configurationFile\n  -e, --parsers-list [parser]               list available object parsers\n  -f, --formatters-description [formatter]  describe report formatters\n  -o, --stdout-requisition-output           add stdout as requisition output\n  -m, --max-report-level-print <level>      set max report level print\n  -p, --protocols-description [protocol]    describe protocols\n  -t, --tests-list [expectedField]          list available tests assertions\n  -u, --loaded-modules-list                 list loaded modules\n  -i, --show-passing-tests                  show passing tests\n  -s, --store [store]                       add variables values to this session (default: [])\n  -l, --add-plugin [plugin]                 add plugin (default: [])\n  -a, --add-file <file>                     add file to be tested (default: [])\n  -A, --add-file-and-ignore-others <file>   add file to be tested and ignore others (default: [])\n  -h, --help                                output usage information\n\nExamples:\n  $ nqr --config-file config-file.yml --verbosity error --store key=value\n  $ enqueuer -c config-file.yml test-file.yml --add-file another-test-file.yml -b info\n  $ enqueuer test-file.yml --store someKey=true --store someOtherKey=false\n  $ nqr --protocols-description -s key=value\n  $ nqr -t expect\n  $ nqr -l my-enqueuer-plugin-name -p plugin-protocol\n  $ nqr -p http\n  $ nqr --formatters-description json\n
\n
\n

Components

\n

In order to accomplish more than just hitting enqueuer's repo or doing a quick self http hit, there are a few things that you'll probably need to know.\nDon't worry, it's not too much and, as mentioned earlier, there is a lot of examples here, just in case.\nThere are only three important component concepts: requisitions, publishers and subscriptions.\nThey work along with each other and are responsible for the full behavior of enqueuer.

\n

requisition

\n

Test scenario description. It tells what, when, and how test your applications and services.\nPicture it as if it was a collection of publishers, subscriptions and other requisitions.\nIt helps because this is exactly what it is.\nAs the others components, it has some attributes. All of them are optionals. And it supports multi-level test scenarios out of the box. Yeap, go as recursive as you want.\nEvery test file is a requisition.\nYou don't know some of these attributes values yet? Don't worry, just put a variable there and let enqueuer replace it with the value you set later.\nVariable replacements are available through the entire requisition.

\n
requisition attributes
\n

These are the requisition attributes:

\n

name
\nDescribes what the requisition is suppose to do.\nDefaults to requisition index.

\n
name: requisition action\n
\n

timeout
\nDefaults to 5000.\nSets in milliseconds how long the requisition waits to expire.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

delay
\nDefaults to 0. Sets in milliseconds how long the test waits before starting. Check this to get the full idea.

\n
delay: 0\n
\n

iterations
\nDefaults to 1. Sets how many times this test will be executed. Check this and this to get the full idea.

\n
iterations: 3\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this requisitions should be skipped. Check this to see it working.

\n
ignore: true\n
\n

parallel
\nDefaults to false. Immediate children requisitions should be executed in parallel mode.\nTake a look at this to see it working.

\n
parallel: true\n
\n

import
\nAllows requisition to be dynamically defined, be it by loading an external file or creating dynamically by other requisitions. Want to reuse the same requisition multiple times? This is you you need.\nTake a look at this to behold this feature.

\n
import: path/to/another/requisition/file\n
\n

publishers
\nList of publishers. They're executed simultaneously, therefore, the order is irrelevant.

\n
publishers:\n- name: some publisher name\n  type: http\n- type: tcp\n
\n

subscriptions
\nList of subscriptions. They're executed simultaneously, therefore, the order is irrelevant.

\n
subscriptions:\n- name: some subscription name\n  type: udp\n- name: another subscription name\n  type: file\n
\n

requisitions
\nA list of child scenarios. List of requisitions.\nBy default, they're executed sequentially, therefore, the order is relevant.\nUnless the parallel attribute is set to true, what makes them get executed simultaneously,\nCheck this example, it may help.

\n
requisitions:\n- name: some requisition name\n  iterations: 2\n- name: another requisition name\n  delay: 200\n
\n
events
\n

Available events are described here. A this object is available to access and change requisition attributes.

\n
name: my name\nonInit:\n  script: this.delay = 3000;\n  assertions:\n  - expectToBeDefined: this.name\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.name\n
\n

publisher

\n

A publisher action is triggered by enqueuer itself. It acts whereas a subscription reacts.\nIt publishes something, it writes, it enqueues, hits and endpoint... These kinds of actions.\nIt's worth noting that it always creates a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if the message got published.

\n
publisher attributes
\n

Every publisher has its own properties, depending on its protocol and implementation.\nThe built-in http publisher implementation, for instance, demands a url, a method, and a payload, if the method is not a GET.\nOn the other hand, the built-in tcp publisher implementation requires a serverAddress and a port.\nThese are the publisher attributes:

\n

name
\nDefaults to publisher index.\nDescribes what the publisher is supposed to do.

\n
name: publisher action\n
\n

type
\nMandatory. Key tag to identify which publisher will be instantiated

\n
type: http\n
\n

payload
\nSince a publisher usually publishes something, it's very likely you have to set a value here.\nThe message itself that will be send through this protocol. Be it a string, a number, a boolean value or even whole objects.

\n
payload: value\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this publisher should be skipped. Check this to see it working.

\n
ignore: true\n
\n
events
\n

Available events are described here. A this object is available to access and change publisher attributes.\nDepending on the protocol and its implementation, such as http and tcp, there may exist special events, such as onMessageReceived event and a special object given message.\nOn the other hand, an asynchronous protocol, like: udp and amqp, usually do not provide it.

\n
onInit:\n  script: this.ignore = false\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived: #Provided in synchronous protocols  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n

subscription

\n

A subscription is an \"under demand\" event. It reacts whereas a publisher acts.\nIt consumes something, it reads, it dequeues, gets hit... These kinds of actions.\nThis means that it is not triggered by enqueuer itself.\nRather than that, enqueuer waits on an external event to be triggered and then it asserts against the message that was passed to the subscription.\nIt's worth noting that it always receives a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if a message got received.

\n
subscription attributes
\n

Every subscription has its own properties, depending on its protocol and implementation.\nThe built-in http subscription implementation, for instance, demands an endpoint, a method, and a port, if the method is not a GET.\nOn the other hand, the built-in tcp subscription implementation requires only a port.

\n

These are the subscription attributes:

\n

name
\nDefaults to subscription index.\nDescribes what the subscription is supposed to do.

\n
name: subscription action\n
\n

type
\nMandatory. Key tag to identify which subscription will be instantiated

\n
type: http\n
\n

avoid
\nIdentifies whether or not this subscription should not receive any message. Defaults to false.\nIf set and a message is received a failing test will be generated.\nTake a look at this to see it working.\nOn the other hand, when it's false and no message is received in a given timeout. The subscription is valid.

\n
avoid: false\n
\n

timeout
\nSets in milliseconds how long the subscription waits to expire. Defaults to 3000.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this subscription should be skipped. Check this to see it working.

\n
ignore: true    \n
\n
events
\n

Available events are described here. A this object is available to access and change subscription attributes.

\n
onInit:\n  script: this.avoid = false;\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived:  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n
\n

Event

\n

Events are hook methods executed by enqueuer when an action occurs on publishers, subscriptions or requisitions.\nThis is where you'll write your tests. In its assertions field.\nThere will be a variable called this and, depending on the event's owner, it has an alias publisher, subscription or requisition.\nYou're free to explore them however you want, even doing things like this:

\n
publisher.parent.subscriptions[0].timeout = 1000;\n
\n

hooks

\n

By default, there are three hook events available:

\n

onInit
\nAvailable in requisitions, publishers and subscriptions. It gets executed as soon as the component is initialized.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

onFinish
\nAvailable in requisitions, publishers and subscriptions. It gets executed when the component is about to finish.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

custom\nDepending on the protocol implementation/library/author's mood, the publisher/subscription may have additional hooks.\nSuch as onError, onResponseReceived, onFileNotFound and onRedirect...\nHttp-proxy subscription test file is an excellent example, check it out.

\n

fields

\n

Every hook object has 3 properties:

\n

script
\nJavascript code snippet executed when the event is triggered.\nYeah, I mean it. See it it by yourself.\nBut be careful, with great power comes great responsibility.

\n

store
\nData to be persisted across requisitions.

\n

assertions
\nArray of assertions.\nRun $ nqr -t to see available ones.\nConsider looking at this test example.\nOf course, just like almost everything else in enqueuer world, you can extend this available list using some plugin.\nYou can check them out or even write your own.

\n
onInit:\n  script: variableIdentifier = 'string value'\n\n  assertions:\n  - expect: variableIdentifier\n    toBeEqualTo: `string value`\n\nonMessageReceived:\n  script: |-\n    message += 3;\n    console.log(`Message received plus 3 is: ${message}`);\n\n  store:\n    key: message\n\n  assertions:\n  - name: anyValue #optional\n    expect: message\n    toBeEqualTo: store.key\n  - expect: message + 3\n    toBeGreaterThan: 3\n
\n

event example

\n

Check this test file to see it in practice.

\n
\n

Requisition Flow

\n

Now that you know what are requisitions, publishers, subscriptions and events. How about seeing how they interact with each other in a fancier way?

\n

\"enqueuerInstanceFlow\"

\n
\n

Configuration File

\n

To save yourself some time, a configuration file may be used.\nConfiguration files tell enqueuer which tests will be executed, log-level, and which output test report files should be generated.\nThis file tells how enqueuer should be executed.\nTo run enqueuer with the configuration:

\n
$ nqr -c path/to/configuration/file.yml\n
\n

or

\n
$ nqr --config-file path/to/configuration/file.yml\n
\n

attributes

\n

These are the configuration file attributes:

\n

files
\nRequisition file names or glob. Enqueuer runs every file that matches an element value.

\n
files:\n- 1.yml\n- 2.yml\n- *.json\n
\n

parallel
\nDefaults to false. Requisition files should be executed in parallel mode. The requisition file itself is still sequential, but the files are executes in parallel.

\n
parallel: true\n
\n

log-level
\nDefaults to warning. Defines how information are logged in the console. Accepted values are: trace; debug; info; warning (default); error; and fatal.

\n
log-level: trace\n
\n

max-report-level-print
\nDefaults to 1. The deepest level of report to be printed to the console.

\n
max-report-level-print: 2\n
\n

plugins
\nList of in plugins used by the test scenarios. You can check them out or write your own.

\n
plugins:\n- enqueuer-plugin-amqp \n- enqueuer-plugin-ws \n- enqueuer-plugin-mqtt\n- enqueuer-plugin-html-report\n
\n

outputs
\nOnce enqueuer runs every execution, it compiles a summary and sends it to every publisher listed in output.\nAn important thing to note is that every available report publisher is available here.\nYes, it means that you are able to send this report through http, tcp, etc. or through a plugin one or a custom one.\nYou can run $ nqr -p to check available report publishers installed.\nAnother important thing to note is the format value. By default a json summary is generated, but you can change it to whatever format you would like, such as: Xunit, html\nYou can run $ nqr -f to check available installed formats or even write your own

\n
outputs:\n- type: file\n  format: json (default)\n  filename: output/examples.json\n- type: file\n  format: yml\n  filename: output/examples.yml\n- type: standard-output (default)\n  format: console\n
\n

store
\nValues defined here use the 'key: value' pattern and are available to every test scenario throughout the entire execution

\n
store:\n  variableKey: \"my value\" # Defines 'variableKey' key and its value 'my value'. \n  \n  'separated key': 6\n  \n  object: # You can even define whole objects here:\n    first: first value\n    second:\n      nested: thing\n
\n

example

\n

Here's a complete example of a configuration file.

\n
\n

Variables

\n

Providing power and flexibility, enqueuer allows you to use variables placeholder replacement.\nThat's why there is a store field and you'll see a lot of << and {{ being used in the examples files.\nIt works as simple as this:

\n
name: my name is <<variableKey>>\n
\n

Every time enqueuer sees these kind of notations, it searches in its store for a key/value pair like:

\n
variableKey: `enqueuer`\n
\n

Then, when enqueuer parses the original map, it gets translated to this:

\n
name: my name is enqueuer\n
\n

By default, every ENV_VAR set is loaded automatically to the store. Check this example.

\n

set a variable

\n

There are a few ways to set a value in the store.

\n
configuration file
\n

Configuration file store object. Set it as you wish, as you can see here

\n
command line
\n

A command line argument using the key=value format. This way:

\n
$ nqr --store key=value -s anotherVariable=true\n
\n
event
\n

Dynamically set it through any event.\nBe it in its script field or straight through its store field.\nBoth ways work:

\n
onInit:\n    script: store.key = 123;\n    store:\n        anotherKey: `another Value` \n
\n

use a variable

\n

There are two ways two use a variable:

\n
non js code snippet
\n

The easiest one is to type <<variableKey>> or {{variableKey}} where you want it to be replaced in a test file, as you can see here

\n
js code snippet
\n

Using the store object. It's attributes are the keys and their values are their respective values.\nTherefore, you're free to use store.variableKey, console.log(store.variableKey); or console.log(2 * store['separated key']); and get them.\nLike this one.

\n

variables example

\n

Check out this test example test to see it working.

\n
\n

Content File Injection

\n

You are able to inject file content into a requisition/publisher/subscription field.

\n
file: <<file://path/to/file.txt>>\n
\n

Other than that, enqueuer can read it and parse its content as an object using this familiar syntax: <<tag://path/to/file?query=value&other=true>>.

\n
requisition:\n    json: <<json://path/to/file.json>>\n    yml: <<yml://path/to/file.yml>>\n    csv: <<csv://path/to/file.csv?header=true&delimiter=;>>\n    file: <<file://path/to/file.txt>>\n
\n

Once the object is parsed, your free to use it as a regular object in any event

\n
onInit:\n    script: console.log(requisition.yml.deep.field);\nonFinish:\n    assertions:\n    -   expect: json.key\n        toBeEqualTo: csv[0].key\n
\n

It get's event better.\nDue its fantastic plugin architecture design, you can extend its default modules and use any of these plugins or event write your own to parse however you want.\nThe built-in modules for object parsers are: json, yml, csv and file.\nRun $ nqr -e to see available ones.

\n

example

\n

Check out this test example test to get a full picture of it.

\n
\n

Plugins

\n

You're probably aware by now but it doesn't hurt do emphasize it: enqueuer provides an amazingly powerful plugin extensible architecture.\nIt has several plugins available, but if none of them pleases you, you're free to create your own.\nAlbeit you don't have to share the one you created, we encourage you to do so. Then go ahead and publish yours to npm and add it to our plugins list.

\n

plugin types

\n

So far, you're able to extend enqueuer default behavior in four ways. Using a protocol plugin, an object parser plugin, an asserter plugin and using a report formatter plugin.

\n
protocol
\n

A protocol plugin enables you to use a different publisher/subscription types.\nRun $ nqr -p [protocol-name] to get the full available list:

\n
publishers: \n-   name:                  custom\n-   name:                  file\n-   name:                  http\n    messageReceivedParams: statusCode, statusMessage, body\n-   name:                  stdout\n-   name:                  tcp\n-   ...\nsubscriptions: \n-   name:                  custom\n-   name:                  file\n    messageReceivedParams: content, name, size, modified, created\n-   name:                  http\n    messageReceivedParams: headers, params, query, body\n-   name:                  stdin\n-   name:                  tcp\n    messageReceivedParams: payload, stream\n-   ...\n
\n

Each one listed above has a respective example in the examples folder.\nThis one, for instance, provides support for amqp protocol, so you can create this publisher and subscription:

\n
publishers:\n-   type: amqp\n    payload: enqueuermaniac\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.key\nsubscriptions:\n-   type: amqp\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.#\n    onMessageReceived:\n        assertions:\n        -   expect: payload\n            toBeEqualTo: `enqueuermaniac`\n
\n
object parser
\n

An object parser plugin enables you to read and parse files as you wish.\nThis test example demonstrates how to use it,\nRun $ nqr -e [object-parser-name] to check available ones:

\n
parsers: \n- yml, yaml\n- json\n- file\n- csv\n
\n

This one, for example, provides the ability to read xml files and inject their values like this:

\n
xmlContent: <<xml://path/to/xml/file.xml>>\n
\n
asserter
\n

An asserter plugin provides you a nicely way to use different assertions than these built-in ones.

\n
asserters: \n-   expect: \n        required:    true\n        type:        string, array\n        description: actual value\n    not: \n        required:    false\n        type:        null\n        description: negates\n    toContain: \n        required:    true\n        type:        string, any\n        description: element\n
\n

Looking at the asserter above, we can create assertions like these:

\n
assertions:\n-   expect: [`a`, 1, true]\n    not:\n    toContain: `b`\n-   expect: [`a`, 1, true]\n    toContain: 1\n
\n

Run $ nqr -t to get the full available list.\nConsider looking at this test example.

\n
report formatter
\n

A report formatter plugin gives you the ability to export enqueuer reports the way you want.\nRun $ nqr -f [formatter-name] to list available report formatters:

\n
formatters: \n- console, stdout\n- json\n- yml, yaml\n
\n

Consider looking at the example of configuration file to see it in use.\nThis one, for instance, generates xUnit like reports from enqueuer's output.

\n

plugin installation

\n

In order to enqueuer get awareness that you want to use a plugin, you have to tell it, right?\nYou can tell enqueuer to use a plugin in three different ways: using it as a command line argument, through the configuration file or letting enqueuer finding it in a default location.

\n
command line
\n

Tell enqueuer to use your plugin through command line this way $ nqr -l <plugin-folder> -l <another-plugin-folder>.\nWhere plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
configuration file
\n

Tell enqueuer to use your plugin through configuration file this way:

\n
plugins: \n-   plugin-folder\n-   another-plugin-folder\n
\n

Where plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
implicitly
\n

When enqueuer runs, it looks for modules in its same installation directory or in .nqr folder in the home directory, a.k.a. ~/ folder in linux distributions.\nTherefore, if you run:

\n
$ npm install --global enqueuer\n$ mkdir ~/.nqr\n$ cd ~/.nqr\n$ npm install enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

Or

\n
$ npm install --global enqueuer enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

You'll see that the enqueuer-plugin-amqp plugin will be loaded.\nEvery enqueuer compatible module gets implicitly loaded.\nIn order to be enqueuer compatible, a module has to have an entryPoint exported function in its main file and, in its package.json file, it has to have either 'enqueuer' or 'nqr' as keywords.

\n

Stacker

\n

Looking for a really really good looking an human error proof solution way of writing these requisition files?
\nConsider taking a look at stacker: open source, cross-platform, multi protocol client testing tool.\nThe official enqueuer's best friend forever. Do amazing things and change the world with enqueuer’s GUI!\nWith them, you create, manage and run requisitions and and see their results in a really nice way.\nSee this amazing beauty with your own eyes to get an idea of how it works:

\n

\"screenshot-passing\"

\n
\n

Open source

\n

We (by 'we' we mean enqueuer's maintainers not the human race, unfortunately) are very opened to any kind of contributions in general.\nAs long as they make sense and add value to the product, you're free to go.\nWe mean it, do it. Even if it's a typo fix in this README file. Go ahead.\nIf you like it but don't want to waste time creating a pull request, no problem either.\nCreate an issue, or, even easier, give it a github star. It's cheap and it doesn't hurt anyone.\nYou know what? Just head up to enqueuer's github repo and keep staring at its repo.\nIt may help somehow.

\n

contributors

\n

Thank you. It sounds cliché, but this project wouldn't be the same without the massive contribution from everyone.

\n

code it

\n

In order to contribute with some code, you have to follow a few steps.\nFirst of all, get the code:

\n
$ git clone git@github.com:enqueuer-land/enqueuer.git\n$ cd enqueuer\n
\n

Get its dependencies installed:

\n
$ npm install\n
\n

Build it:

\n
$ npm run build\n
\n

Go for it. Make the changes you want.\nAfter everything is done:

\n
$ npm run all\n
\n

Commit it:

\n
$ npm run commit\n
\n

Push it:

\n
$ git push\n
\n

feedback

\n

We'd love to get your feedback!\nIf you have any comments, suggestions, etc. you can reach us here.

\n

\"NPM\"

\n
\n
\n
\n\n\n\n
\n
\n\n
\n
\n \n\n
\n\n \n
\n
\n \n\n \n \n\n \n
\n
\n \n
\n
\n\n\n\n
\n \n \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n \n \n
\n \n\n
\n
\n
\n
\n\n \n \n\n
\n\n \n\n\n", + "body": "\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n\n\n\n \n \n \n \n \n \n \n\n\n \n \n GitHub - enqueuer-land/enqueuer: Multi protocol microservice testing tool\n \n \n \n \n\n \n \n\n \n \n \n\n \n\n\n\n \n\n \n\n \n\n \n \n \n\n \n\n\n\n\n \n\n\n\n\n\n\n \n\n \n \n\n \n\n\n \n\n \n \n\n \n\n \n\n \n\n\n \n\n\n \n\n \n\n \n \n\n\n\n\n \n\n \n\n \n \n\n
\n Skip to content\n \n \n \n\n \n \n\n\n\n
\n
\n
\n \n \n \n
\n\n
\n
\n \n
\n\n \n\n \n
\n
\n
\n\n
\n\n
\n\n\n
\n\n
\n\n\n\n\n
\n
\n
\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n
\n\n
\n\n
\n

\n \n \n enqueuer-land\n \n /\n \n enqueuer\n \n \n

\n\n\n
\n\n \n\n
\n \n\n\n\n
\n
\n
\n\n \n \n \n\n\n
\n \n Multi protocol microservice testing tool\n \n https://enqueuer.com\n
\n
\n\n \n\n\n\n \n\n
\n \n
\n TypeScript\n HTML\n JavaScript\n Shell\n
\n
\n \n
\n\n\n\n\n\n\n
\n \n
\n \n Branch:\n master\n \n \n\n \n
\n \n \n \n
\n
\n
\n\n\n \n\n
\n \n
\n\n
\n\n Find file\n
\n\n \n\n\n \n\n
\n \n Clone or download\n \n
\n
\n\n
\n
\n\n

\n Clone with HTTPS\n \n \n \n

\n

\n Use Git or checkout with SVN using the web URL.\n

\n\n
\n \n
\n \n
\n
\n\n
\n\n \n
\n\n \n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching Xcode

\n

If nothing happens, download Xcode and try again.

\n

\n
\n\n
\n

Launching Visual Studio

\n

If nothing happens, download the GitHub extension for Visual Studio and try again.

\n

\n
\n\n
\n
\n
\n\n\n
\n\n\n\n\n\n
\n \n
\n
\n \n \"@virgs\"\n
\n
\n\n \n
\n \n \n \n Latest commit\n \n df5799a\n \n Feb 2, 2020\n
\n
\n\n\n\n
\n Permalink\n\n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TypeNameLatest commit messageCommit time
Failed to load latest commit information.
\n \n \"\"\n \n .github/ISSUE_TEMPLATE\n \n \n Update bug_report.md\n \n \n Mar 4, 2019\n
\n \n \"\"\n \n conf\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n docs\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n examples\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n https-cert\n \n \n Adding support to https\n \n \n Aug 9, 2018\n
\n \n \"\"\n \n misc\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n output\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n src\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n temp\n \n \n #19 adding attempting to create a topic at kafka\n \n \n Oct 3, 2018\n
\n \n \"\"\n \n .codeclimate.yml\n \n \n Updating .codeclimate\n \n \n Sep 24, 2018\n
\n \n \"\"\n \n .gitignore\n \n \n docs(README): Improve docs\n \n \n Mar 23, 2019\n
\n \n \"\"\n \n .npmignore\n \n \n Removing SummaryTestOutput dependency with Configuration and start te…\n \n \n Mar 10, 2019\n
\n \n \"\"\n \n .travis.yml\n \n \n feat(dynamic-modules-manager): Look for a ~/.nqr folder to load plugi…\n \n \n Mar 22, 2019\n
\n \n \"\"\n \n CNAME\n \n \n Create CNAME\n \n \n May 10, 2019\n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n chore(Automatic Release): Add automatic release with semantic-release.\n \n \n Mar 21, 2019\n
\n \n \"\"\n \n License\n \n \n Creating License\n \n \n Mar 10, 2018\n
\n \n \"\"\n \n README.md\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n package-lock.json\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n package.json\n \n \n chore(Dependencies): Update dependencies\n \n \n Jul 5, 2019\n
\n \n \"\"\n \n tsconfig.json\n \n \n feat(NotificationEmitter): Create the concept of Notification and Not…\n \n \n May 24, 2019\n
\n \n \"\"\n \n tslint.json\n \n \n Subscription refactoring\n \n \n Mar 12, 2019\n
\n\n
\n\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n
\n
\n
\n
\n
\n\n
\n

\"npm\"\n\"Build\n\"Greenkeeper\n\"Known\n\"License:

\n

\"enqueuerlogo\"

\n

Welcome

\n

Be our guest and have fun.

\n

install it

\n

First things first, let's get the enqueuer installed on your machine.

\n
$ npm install --global enqueuer\n
\n

Alright, it's time to create a requisition file.\nSomething like:

\n
#enqueuer-repo-hit.yml\npublishers:\n-   type: http\n    url: https://github.com/enqueuer-land/enqueuer\n    onResponseReceived:\n        assertions:\n        -   expect: statusCode\n            toBeEqualTo: 200\n
\n

Pretty simple, hum? Small and concise, how it should be!\nRun it:

\n
$ enqueuer enqueuer-repo-hit.yml\n
\n

What if I want to mock a http server, you may ask. Not a big deal for enqueuer lovers:

\n
timeout: -1\nsubscriptions:\n-   type: http\n    timeout: -1\n    name: mock endpoint\n    endpoint: /readme-example\n    port: 9085\n    method: POST\n    response:\n        status: 200\n        payload: mock response\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: `enqueuer`\n
\n

Now go ahead and try hitting it using the browser.\nTip: remove timeout values and check what happens.\nI told you it was simple.\nNow, let's say you want to mix different protocols to test a bit more complex flow.\nHow about publishing an amqp message and making sure that, once a service consumes that message an endpoint of your is hit?\nIn order to achieve that, we have to make use of a plugin, given that amqp support is provided by a plugin.\nIn this scenario, we're talking about the amqp plugin.\nOnce we get this plugin installed we are able to create and run files like this:

\n
publishers:\n-   type: amqp\n    payload: 123456\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.readme.routing.key\nsubscriptions:\n-   type: http\n    endpoint: /polyglot-flow\n    port: 8080\n    method: GET\n    response:\n        status: 200\n        payload: polyglot message\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: 123456\n
\n

Now go nuts!\nIt's all yours. Have fun.\nIf you want more examples about http, consider looking at this test.\nCheck this out, you'll find countless examples.\nCertainly one is what you need.

\n

if you need more

\n
$ nqr -h\nUsage: nqr [options] <test-file> [other-test-files...]\n\nTake a look at the full documentation: https://enqueuer.com\n\nOptions:\n  -v, --version                             output the version number\n  -b, --verbosity <level>                   set verbosity (default: \"warn\")\n  -c, --config-file <path>                  set configurationFile\n  -e, --parsers-list [parser]               list available object parsers\n  -f, --formatters-description [formatter]  describe report formatters\n  -o, --stdout-requisition-output           add stdout as requisition output\n  -m, --max-report-level-print <level>      set max report level print\n  -p, --protocols-description [protocol]    describe protocols\n  -t, --tests-list [expectedField]          list available tests assertions\n  -u, --loaded-modules-list                 list loaded modules\n  -i, --show-passing-tests                  show passing tests\n  -s, --store [store]                       add variables values to this session (default: [])\n  -l, --add-plugin [plugin]                 add plugin (default: [])\n  -a, --add-file <file>                     add file to be tested (default: [])\n  -A, --add-file-and-ignore-others <file>   add file to be tested and ignore others (default: [])\n  -h, --help                                output usage information\n\nExamples:\n  $ nqr --config-file config-file.yml --verbosity error --store key=value\n  $ enqueuer -c config-file.yml test-file.yml --add-file another-test-file.yml -b info\n  $ enqueuer test-file.yml --store someKey=true --store someOtherKey=false\n  $ nqr --protocols-description -s key=value\n  $ nqr -t expect\n  $ nqr -l my-enqueuer-plugin-name -p plugin-protocol\n  $ nqr -p http\n  $ nqr --formatters-description json\n  \nContributing:\n  https://github.com/enqueuer-land/enqueuer\n
\n
\n

Components

\n

In order to accomplish more than just hitting enqueuer's repo or doing a quick self http hit, there are a few things that you'll probably need to know.\nDon't worry, it's not too much and, as mentioned earlier, there is a lot of examples here, just in case.\nThere are only three important component concepts: requisitions, publishers and subscriptions.\nThey work along with each other and are responsible for the full behavior of enqueuer.

\n

requisition

\n

Test scenario description. It tells what, when, and how test your applications and services.\nPicture it as if it was a collection of publishers, subscriptions and other requisitions.\nIt helps because this is exactly what it is.\nAs the others components, it has some attributes. All of them are optionals. And it supports multi-level test scenarios out of the box. Yeap, go as recursive as you want.\nEvery test file is a requisition.\nYou don't know some of these attributes values yet? Don't worry, just put a variable there and let enqueuer replace it with the value you set later.\nVariable replacements are available through the entire requisition.

\n
requisition attributes
\n

These are the requisition attributes:

\n

name
\nDescribes what the requisition is suppose to do.\nDefaults to requisition index.

\n
name: requisition action\n
\n

timeout
\nDefaults to 5000.\nSets in milliseconds how long the requisition waits to expire.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

delay
\nDefaults to 0. Sets in milliseconds how long the test waits before starting. Check this to get the full idea.

\n
delay: 0\n
\n

iterations
\nDefaults to 1. Sets how many times this test will be executed. Check this and this to get the full idea.

\n
iterations: 3\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this requisitions should be skipped. Check this to see it working.

\n
ignore: true\n
\n

parallel
\nDefaults to false. Immediate children requisitions should be executed in parallel mode.\nTake a look at this to see it working.

\n
parallel: true\n
\n

import
\nAllows requisition to be dynamically defined, be it by loading an external file or creating dynamically by other requisitions. Want to reuse the same requisition multiple times? This is you you need.\nTake a look at this to behold this feature.

\n
import: path/to/another/requisition/file\n
\n

publishers
\nList of publishers. They're executed simultaneously, therefore, the order is irrelevant.

\n
publishers:\n- name: some publisher name\n  type: http\n- type: tcp\n
\n

subscriptions
\nList of subscriptions. They're executed simultaneously, therefore, the order is irrelevant.

\n
subscriptions:\n- name: some subscription name\n  type: udp\n- name: another subscription name\n  type: file\n
\n

requisitions
\nA list of child scenarios. List of requisitions.\nBy default, they're executed sequentially, therefore, the order is relevant.\nUnless the parallel attribute is set to true, what makes them get executed simultaneously,\nCheck this example, it may help.

\n
requisitions:\n- name: some requisition name\n  iterations: 2\n- name: another requisition name\n  delay: 200\n
\n
events
\n

Available events are described here. A this object is available to access and change requisition attributes.

\n
name: my name\nonInit:\n  script: this.delay = 3000;\n  assertions:\n  - expectToBeDefined: this.name\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.name\n
\n

publisher

\n

A publisher action is triggered by enqueuer itself. It acts whereas a subscription reacts.\nIt publishes something, it writes, it enqueues, hits and endpoint... These kinds of actions.\nIt's worth noting that it always creates a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if the message got published.

\n
publisher attributes
\n

Every publisher has its own properties, depending on its protocol and implementation.\nThe built-in http publisher implementation, for instance, demands a url, a method, and a payload, if the method is not a GET.\nOn the other hand, the built-in tcp publisher implementation requires a serverAddress and a port.\nThese are the publisher attributes:

\n

name
\nDefaults to publisher index.\nDescribes what the publisher is supposed to do.

\n
name: publisher action\n
\n

type
\nMandatory. Key tag to identify which publisher will be instantiated

\n
type: http\n
\n

payload
\nSince a publisher usually publishes something, it's very likely you have to set a value here.\nThe message itself that will be send through this protocol. Be it a string, a number, a boolean value or even whole objects.

\n
payload: value\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this publisher should be skipped. Check this to see it working.

\n
ignore: true\n
\n
events
\n

Available events are described here. A this object is available to access and change publisher attributes.\nDepending on the protocol and its implementation, such as http and tcp, there may exist special events, such as onMessageReceived event and a special object given message.\nOn the other hand, an asynchronous protocol, like: udp and amqp, usually do not provide it.

\n
onInit:\n  script: this.ignore = false\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived: #Provided in synchronous protocols  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n

subscription

\n

A subscription is an \"under demand\" event. It reacts whereas a publisher acts.\nIt consumes something, it reads, it dequeues, gets hit... These kinds of actions.\nThis means that it is not triggered by enqueuer itself.\nRather than that, enqueuer waits on an external event to be triggered and then it asserts against the message that was passed to the subscription.\nIt's worth noting that it always receives a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if a message got received.

\n
subscription attributes
\n

Every subscription has its own properties, depending on its protocol and implementation.\nThe built-in http subscription implementation, for instance, demands an endpoint, a method, and a port, if the method is not a GET.\nOn the other hand, the built-in tcp subscription implementation requires only a port.

\n

These are the subscription attributes:

\n

name
\nDefaults to subscription index.\nDescribes what the subscription is supposed to do.

\n
name: subscription action\n
\n

type
\nMandatory. Key tag to identify which subscription will be instantiated

\n
type: http\n
\n

avoid
\nIdentifies whether or not this subscription should not receive any message. Defaults to false.\nIf set and a message is received a failing test will be generated.\nTake a look at this to see it working.\nOn the other hand, when it's false and no message is received in a given timeout. The subscription is valid.

\n
avoid: false\n
\n

timeout
\nSets in milliseconds how long the subscription waits to expire. Defaults to 3000.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this subscription should be skipped. Check this to see it working.

\n
ignore: true    \n
\n
events
\n

Available events are described here. A this object is available to access and change subscription attributes.

\n
onInit:\n  script: this.avoid = false;\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived:  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n
\n

Event

\n

Events are hook methods executed by enqueuer when an action occurs on publishers, subscriptions or requisitions.\nThis is where you'll write your tests. In its assertions field.\nThere will be a variable called this and, depending on the event's owner, it has an alias publisher, subscription or requisition.\nYou're free to explore them however you want, even doing things like this:

\n
publisher.parent.subscriptions[0].timeout = 1000;\n
\n

hooks

\n

By default, there are three hook events available:

\n

onInit
\nAvailable in requisitions, publishers and subscriptions. It gets executed as soon as the component is initialized.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

onFinish
\nAvailable in requisitions, publishers and subscriptions. It gets executed when the component is about to finish.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

custom\nDepending on the protocol implementation/library/author's mood, the publisher/subscription may have additional hooks.\nSuch as onError, onResponseReceived, onFileNotFound and onRedirect...\nHttp-proxy subscription test file is an excellent example, check it out.

\n

fields

\n

Every hook object has 3 properties:

\n

script
\nJavascript code snippet executed when the event is triggered.\nYeah, I mean it. See it it by yourself.\nBut be careful, with great power comes great responsibility.

\n

store
\nData to be persisted across requisitions.

\n

assertions
\nArray of assertions.\nRun $ nqr -t to see available ones.\nConsider looking at this test example.\nOf course, just like almost everything else in enqueuer world, you can extend this available list using some plugin.\nYou can check them out or even write your own.

\n
onInit:\n  script: variableIdentifier = 'string value'\n\n  assertions:\n  - expect: variableIdentifier\n    toBeEqualTo: `string value`\n\nonMessageReceived:\n  script: |-\n    message += 3;\n    console.log(`Message received plus 3 is: ${message}`);\n\n  store:\n    key: message\n\n  assertions:\n  - name: anyValue #optional\n    expect: message\n    toBeEqualTo: store.key\n  - expect: message + 3\n    toBeGreaterThan: 3\n
\n

event example

\n

Check this test file to see it in practice.

\n
\n

Requisition Flow

\n

Now that you know what are requisitions, publishers, subscriptions and events. How about seeing how they interact with each other in a fancier way?

\n

\"enqueuerInstanceFlow\"

\n
\n

Configuration File

\n

To save yourself some time, a configuration file may be used.\nConfiguration files tell enqueuer which tests will be executed, log-level, and which output test report files should be generated.\nThis file tells how enqueuer should be executed.\nTo run enqueuer with the configuration:

\n
$ nqr -c path/to/configuration/file.yml\n
\n

or

\n
$ nqr --config-file path/to/configuration/file.yml\n
\n

attributes

\n

These are the configuration file attributes:

\n

files
\nRequisition file names or glob. Enqueuer runs every file that matches an element value.

\n
files:\n- 1.yml\n- 2.yml\n- *.json\n
\n

parallel
\nDefaults to false. Requisition files should be executed in parallel mode. The requisition file itself is still sequential, but the files are executes in parallel.

\n
parallel: true\n
\n

log-level
\nDefaults to warning. Defines how information are logged in the console. Accepted values are: trace; debug; info; warning (default); error; and fatal.

\n
log-level: trace\n
\n

max-report-level-print
\nDefaults to 1. The deepest level of report to be printed to the console.

\n
max-report-level-print: 2\n
\n

plugins
\nList of in plugins used by the test scenarios. You can check them out or write your own.

\n
plugins:\n- enqueuer-plugin-amqp \n- enqueuer-plugin-ws \n- enqueuer-plugin-mqtt\n- enqueuer-plugin-html-report\n
\n

outputs
\nOnce enqueuer runs every execution, it compiles a summary and sends it to every publisher listed in output.\nAn important thing to note is that every available report publisher is available here.\nYes, it means that you are able to send this report through http, tcp, etc. or through a plugin one or a custom one.\nYou can run $ nqr -p to check available report publishers installed.\nAnother important thing to note is the format value. By default a json summary is generated, but you can change it to whatever format you would like, such as: Xunit, html\nYou can run $ nqr -f to check available installed formats or even write your own

\n
outputs:\n- type: file\n  format: json (default)\n  filename: output/examples.json\n- type: file\n  format: yml\n  filename: output/examples.yml\n- type: standard-output (default)\n  format: console\n
\n

store
\nValues defined here use the 'key: value' pattern and are available to every test scenario throughout the entire execution

\n
store:\n  variableKey: \"my value\" # Defines 'variableKey' key and its value 'my value'. \n  \n  'separated key': 6\n  \n  object: # You can even define whole objects here:\n    first: first value\n    second:\n      nested: thing\n
\n

example

\n

Here's a complete example of a configuration file.

\n
\n

Variables

\n

Providing power and flexibility, enqueuer allows you to use variables placeholder replacement.\nThat's why there is a store field and you'll see a lot of << and {{ being used in the examples files.\nIt works as simple as this:

\n
name: my name is <<variableKey>>\n
\n

Every time enqueuer sees these kind of notations, it searches in its store for a key/value pair like:

\n
variableKey: `enqueuer`\n
\n

Then, when enqueuer parses the original map, it gets translated to this:

\n
name: my name is enqueuer\n
\n

By default, every ENV_VAR set is loaded automatically to the store. Check this example.

\n

set a variable

\n

There are a few ways to set a value in the store.

\n
configuration file
\n

Configuration file store object. Set it as you wish, as you can see here

\n
command line
\n

A command line argument using the key=value format. This way:

\n
$ nqr --store key=value -s anotherVariable=true\n
\n
event
\n

Dynamically set it through any event.\nBe it in its script field or straight through its store field.\nBoth ways work:

\n
onInit:\n    script: store.key = 123;\n    store:\n        anotherKey: `another Value` \n
\n

use a variable

\n

There are two ways two use a variable:

\n
non js code snippet
\n

The easiest one is to type <<variableKey>> or {{variableKey}} where you want it to be replaced in a test file, as you can see here

\n
js code snippet
\n

Using the store object. It's attributes are the keys and their values are their respective values.\nTherefore, you're free to use store.variableKey, console.log(store.variableKey); or console.log(2 * store['separated key']); and get them.\nLike this one.

\n

variables example

\n

Check out this test example test to see it working.

\n
\n

Content File Injection

\n

You are able to inject file content into a requisition/publisher/subscription field.

\n
file: <<file://path/to/file.txt>>\n
\n

Other than that, enqueuer can read it and parse its content as an object using this familiar syntax: <<tag://path/to/file?query=value&other=true>>.

\n
requisition:\n    json: <<json://path/to/file.json>>\n    yml: <<yml://path/to/file.yml>>\n    csv: <<csv://path/to/file.csv?header=true&delimiter=;>>\n    file: <<file://path/to/file.txt>>\n
\n

Once the object is parsed, your free to use it as a regular object in any event

\n
onInit:\n    script: console.log(requisition.yml.deep.field);\nonFinish:\n    assertions:\n    -   expect: json.key\n        toBeEqualTo: csv[0].key\n
\n

It get's event better.\nDue its fantastic plugin architecture design, you can extend its default modules and use any of these plugins or event write your own to parse however you want.\nThe built-in modules for object parsers are: json, yml, csv and file.\nRun $ nqr -e to see available ones.

\n

example

\n

Check out this test example test to get a full picture of it.

\n
\n

Plugins

\n

You're probably aware by now but it doesn't hurt do emphasize it: enqueuer provides an amazingly powerful plugin extensible architecture.\nIt has several plugins available, but if none of them pleases you, you're free to create your own.\nAlbeit you don't have to share the one you created, we encourage you to do so. Then go ahead and publish yours to npm and add it to our plugins list.

\n

plugin types

\n

So far, you're able to extend enqueuer default behavior in four ways. Using a protocol plugin, an object parser plugin, an asserter plugin and using a report formatter plugin.

\n
protocol
\n

A protocol plugin enables you to use a different publisher/subscription types.\nRun $ nqr -p [protocol-name] to get the full available list:

\n
publishers: \n-   name:                  custom\n-   name:                  file\n-   name:                  http\n    messageReceivedParams: statusCode, statusMessage, body\n-   name:                  stdout\n-   name:                  tcp\n-   ...\nsubscriptions: \n-   name:                  custom\n-   name:                  file\n    messageReceivedParams: content, name, size, modified, created\n-   name:                  http\n    messageReceivedParams: headers, params, query, body\n-   name:                  stdin\n-   name:                  tcp\n    messageReceivedParams: payload, stream\n-   ...\n
\n

Each one listed above has a respective example in the examples folder.\nThis one, for instance, provides support for amqp protocol, so you can create this publisher and subscription:

\n
publishers:\n-   type: amqp\n    payload: enqueuermaniac\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.key\nsubscriptions:\n-   type: amqp\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.#\n    onMessageReceived:\n        assertions:\n        -   expect: payload\n            toBeEqualTo: `enqueuermaniac`\n
\n
object parser
\n

An object parser plugin enables you to read and parse files as you wish.\nThis test example demonstrates how to use it,\nRun $ nqr -e [object-parser-name] to check available ones:

\n
parsers: \n- yml, yaml\n- json\n- file\n- csv\n
\n

This one, for example, provides the ability to read xml files and inject their values like this:

\n
xmlContent: <<xml://path/to/xml/file.xml>>\n
\n
asserter
\n

An asserter plugin provides you a nicely way to use different assertions than these built-in ones.

\n
asserters: \n-   expect: \n        required:    true\n        type:        string, array\n        description: actual value\n    not: \n        required:    false\n        type:        null\n        description: negates\n    toContain: \n        required:    true\n        type:        string, any\n        description: element\n
\n

Looking at the asserter above, we can create assertions like these:

\n
assertions:\n-   expect: [`a`, 1, true]\n    not:\n    toContain: `b`\n-   expect: [`a`, 1, true]\n    toContain: 1\n
\n

Run $ nqr -t to get the full available list.\nConsider looking at this test example.

\n
report formatter
\n

A report formatter plugin gives you the ability to export enqueuer reports the way you want.\nRun $ nqr -f [formatter-name] to list available report formatters:

\n
formatters: \n- console, stdout\n- json\n- yml, yaml\n
\n

Consider looking at the example of configuration file to see it in use.\nThis one, for instance, generates xUnit like reports from enqueuer's output.

\n

plugin installation

\n

In order to enqueuer get awareness that you want to use a plugin, you have to tell it, right?\nYou can tell enqueuer to use a plugin in three different ways: using it as a command line argument, through the configuration file or letting enqueuer finding it in a default location.

\n
command line
\n

Tell enqueuer to use your plugin through command line this way $ nqr -l <plugin-folder> -l <another-plugin-folder>.\nWhere plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
configuration file
\n

Tell enqueuer to use your plugin through configuration file this way:

\n
plugins: \n-   plugin-folder\n-   another-plugin-folder\n
\n

Where plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
implicitly
\n

When enqueuer runs, it looks for modules in its same installation directory or in .nqr folder in the home directory, a.k.a. ~/ folder in linux distributions.\nTherefore, if you run:

\n
$ npm install --global enqueuer\n$ mkdir ~/.nqr\n$ cd ~/.nqr\n$ npm install enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

Or

\n
$ npm install --global enqueuer enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

You'll see that the enqueuer-plugin-amqp plugin will be loaded.\nEvery enqueuer compatible module gets implicitly loaded.\nIn order to be enqueuer compatible, a module has to have an entryPoint exported function in its main file and, in its package.json file, it has to have either 'enqueuer' or 'nqr' as keywords.

\n

Stacker

\n

Looking for a really really good looking an human error proof solution way of writing these requisition files?
\nConsider taking a look at stacker: open source, cross-platform, multi protocol client testing tool.\nThe official enqueuer's best friend forever. Do amazing things and change the world with enqueuer’s GUI!\nWith them, you create, manage and run requisitions and and see their results in a really nice way.\nSee this amazing beauty with your own eyes to get an idea of how it works:

\n

\"screenshot-passing\"

\n
\n

Open source

\n

We (by 'we' we mean enqueuer's maintainers not the human race, unfortunately) are very opened to any kind of contributions in general.\nAs long as they make sense and add value to the product, you're free to go.\nWe mean it, do it. Even if it's a typo fix in this README file. Go ahead.\nIf you like it but don't want to waste time creating a pull request, no problem either.\nCreate an issue, or, even easier, give it a github star. It's cheap and it doesn't hurt anyone.\nYou know what? Just head up to enqueuer's github repo and keep staring at its repo.\nIt may help somehow.

\n

contributors

\n

Thank you. It sounds cliché, but this project wouldn't be the same without the massive contribution from everyone.

\n

code it

\n

In order to contribute with some code, you have to follow a few steps.\nFirst of all, get the code:

\n
$ git clone git@github.com:enqueuer-land/enqueuer.git\n$ cd enqueuer\n
\n

Get its dependencies installed:

\n
$ npm install\n
\n

Build it:

\n
$ npm run build\n
\n

Go for it. Make the changes you want.\nAfter everything is done:

\n
$ npm run all\n
\n

Commit it:

\n
$ npm run commit\n
\n

Push it:

\n
$ git push\n
\n

feedback

\n

We'd love to get your feedback!\nIf you have any comments, suggestions, etc. you can reach us here.

\n

\"NPM\"

\n
\n
\n
\n\n\n\n\n
\n
\n\n
\n
\n \n\n
\n\n \n
\n
\n \n\n \n \n\n \n
\n
\n \n
\n
\n\n\n\n
\n \n \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n \n \n
\n \n\n
\n
\n
\n
\n\n \n \n\n
\n\n \n\n\n", "headers": { - "date": "Sun, 02 Feb 2020 16:26:10 GMT", + "date": "Fri, 07 Feb 2020 18:11:15 GMT", "content-type": "text/html; charset=utf-8", "transfer-encoding": "chunked", "connection": "close", "server": "GitHub.com", "status": "200 OK", "vary": "X-PJAX, Accept-Encoding", - "etag": "W/\"77cca0288c88302b3b1d550457de96ac\"", + "etag": "W/\"e1412e136159ccfd75d7677e8910d8c0\"", "cache-control": "max-age=0, private, must-revalidate", "set-cookie": [ - "has_recent_activity=1; path=/; expires=Sun, 02 Feb 2020 17:26:09 -0000", - "_octo=GH1.1.506107453.1580660769; domain=.github.com; path=/; expires=Tue, 02 Feb 2021 16:26:09 -0000", - "logged_in=no; domain=.github.com; path=/; expires=Tue, 02 Feb 2021 16:26:10 -0000; secure; HttpOnly", - "_gh_sess=N2ladHJ3cWVmMzhtbEMvenJNMUZpL3NUUklyY3ZubGtGOUNJYWpOajZaTmRsUnVnV3UwNlZqWnRudkdQRUNzMWNVOGxtaDRpdXA2eGVFYXhqU3RraE15OXlUODVvQzY5czNBcGJoZkZuSjRmcjg4dm4yNGNPSmVscUI0RWM0ZExiMnZmQklGMEZ6bUJrNHFFZ0Q2NXp1OG1DbGhMdERrZ2NkbStGQkZhandqdnZGVkg4US8wdFJyelk1RUVjSDhzMGJJc3R2QThLQW1oK0tYWWNBS2RnOVBtb05wNzhFQllERnJiZDZJdFU0dz0tLVNGVzdEdm5tbVkxWU5yZUh0eng3amc9PQ%3D%3D--9c25bbc5296648c26501c2cc7734a15e76b18c37; path=/; secure; HttpOnly" + "_octo=GH1.1.1893030294.1581099075; domain=.github.com; path=/; expires=Sun, 07 Feb 2021 18:11:15 -0000", + "logged_in=no; domain=.github.com; path=/; expires=Sun, 07 Feb 2021 18:11:15 -0000; secure; HttpOnly", + "_gh_sess=RzUzdTUwSW1WaDE0czJUUndOdXQrcHhyYURqVEhlMEIwdmEvRFRCMDlRMXVKMGVmcnVKNUMya1RNd0MyMFpxMjI3My9lMzY1ZmVFVEJjaHQ2bzJxVVB3Um5SSmpMdzk3cVFtZ3JmNE80bk0ra2FzenpqakFsNWVtcjUrVlA4b3dFNXhEMDRqVDhncER3M2N0aVRoVFJTUVFTV1V1VXVEcTg2M2hEcWxVbHR2NG05WFd1eHRQSmhaVm9sdERSQ3hJdmx2VGJtdEVhbU8zSFA5dk9LQ2R4bm1QSC82TkRhcHZ2UmVaYjY4NXRyZz0tLUVzRXdyS3JjUUlBcFlHcElPaVpVVHc9PQ%3D%3D--ef74ccf4768e9eddea233bbcbd01261874ce5574; path=/; secure; HttpOnly" ], "strict-transport-security": "max-age=31536000; includeSubdomains; preload", "x-frame-options": "deny", @@ -5366,7 +5389,7 @@ "x-xss-protection": "1; mode=block", "expect-ct": "max-age=2592000, report-uri=\"https://api.github.com/_private/browser/errors\"", "content-security-policy": "default-src 'none'; base-uri 'self'; block-all-mixed-content; connect-src 'self' uploads.github.com www.githubstatus.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com; frame-ancestors 'none'; frame-src render.githubusercontent.com; img-src 'self' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com; manifest-src 'self'; media-src 'none'; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com", - "x-github-request-id": "C54B:3612:3DA02F:56BFF8:5E36F821" + "x-github-request-id": "CC0D:4DF2:22A3BF:301B8A:5E3DA842" }, "request": { "uri": { @@ -5394,7 +5417,7 @@ } }, "type": "http", - "publishTime": "2020-02-02T16:26:10.392Z" + "publishTime": "2020-02-07T18:11:15.717Z" } ], "iteration": 0, @@ -5411,14 +5434,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 990 + "elapsedTime": 1446 } } }, "time": { - "startTime": "2020-02-02T16:26:09.403Z", - "endTime": "2020-02-02T16:26:10.393Z", - "totalTime": 990, + "startTime": "2020-02-07T18:11:14.271Z", + "endTime": "2020-02-07T18:11:15.717Z", + "totalTime": 1446, "timeout": 5000 }, "requisitions": [] @@ -5426,7 +5449,7 @@ { "valid": true, "name": "examples/recursion.yml", - "id": "1326090323_00da84a874_367502", + "id": "1511140204_00da84a874_499922", "level": 1, "subscriptions": [], "publishers": [], @@ -5444,21 +5467,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 89 + "elapsedTime": 83 } } }, "time": { - "startTime": "2020-02-02T16:26:09.404Z", - "endTime": "2020-02-02T16:26:09.493Z", - "totalTime": 89, + "startTime": "2020-02-07T18:11:14.272Z", + "endTime": "2020-02-07T18:11:14.355Z", + "totalTime": 83, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090323_75977bc4c1_616230", + "id": "1511140204_75977bc4c1_997650", "level": 2, "subscriptions": [], "publishers": [], @@ -5476,14 +5499,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 33 + "elapsedTime": 32 } } }, "time": { - "startTime": "2020-02-02T16:26:09.426Z", - "endTime": "2020-02-02T16:26:09.459Z", - "totalTime": 33, + "startTime": "2020-02-07T18:11:14.292Z", + "endTime": "2020-02-07T18:11:14.324Z", + "totalTime": 32, "timeout": 5000 }, "requisitions": [] @@ -5491,7 +5514,7 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090323_e87d17a22e_281435", + "id": "1511140204_e87d17a22e_372406", "level": 2, "subscriptions": [], "publishers": [], @@ -5509,21 +5532,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 19 + "elapsedTime": 16 } } }, "time": { - "startTime": "2020-02-02T16:26:09.464Z", - "endTime": "2020-02-02T16:26:09.483Z", - "totalTime": 19, + "startTime": "2020-02-07T18:11:14.329Z", + "endTime": "2020-02-07T18:11:14.345Z", + "totalTime": 16, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090323_55233c1965_624990", + "id": "1511140204_55233c1965_22787", "level": 3, "subscriptions": [], "publishers": [], @@ -5541,21 +5564,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 10 + "elapsedTime": 8 } } }, "time": { - "startTime": "2020-02-02T16:26:09.466Z", - "endTime": "2020-02-02T16:26:09.477Z", - "totalTime": 11, + "startTime": "2020-02-07T18:11:14.331Z", + "endTime": "2020-02-07T18:11:14.339Z", + "totalTime": 8, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -5578,9 +5601,9 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.466Z", - "endTime": "2020-02-02T16:26:09.467Z", - "totalTime": 1, + "startTime": "2020-02-07T18:11:14.331Z", + "endTime": "2020-02-07T18:11:14.333Z", + "totalTime": 2, "timeout": 5000 }, "requisitions": [] @@ -5588,7 +5611,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -5611,9 +5634,9 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.470Z", - "endTime": "2020-02-02T16:26:09.473Z", - "totalTime": 3, + "startTime": "2020-02-07T18:11:14.334Z", + "endTime": "2020-02-07T18:11:14.336Z", + "totalTime": 2, "timeout": 5000 }, "requisitions": [] @@ -5621,7 +5644,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -5644,9 +5667,9 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.474Z", - "endTime": "2020-02-02T16:26:09.476Z", - "totalTime": 2, + "startTime": "2020-02-07T18:11:14.337Z", + "endTime": "2020-02-07T18:11:14.338Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [] @@ -5656,7 +5679,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_55233c1965_624990", + "id": "1511140204_55233c1965_22787", "level": 3, "subscriptions": [], "publishers": [], @@ -5679,8 +5702,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.477Z", - "endTime": "2020-02-02T16:26:09.481Z", + "startTime": "2020-02-07T18:11:14.339Z", + "endTime": "2020-02-07T18:11:14.343Z", "totalTime": 4, "timeout": 5000 }, @@ -5688,7 +5711,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -5711,8 +5734,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.477Z", - "endTime": "2020-02-02T16:26:09.478Z", + "startTime": "2020-02-07T18:11:14.339Z", + "endTime": "2020-02-07T18:11:14.340Z", "totalTime": 1, "timeout": 5000 }, @@ -5721,7 +5744,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -5744,8 +5767,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.478Z", - "endTime": "2020-02-02T16:26:09.479Z", + "startTime": "2020-02-07T18:11:14.340Z", + "endTime": "2020-02-07T18:11:14.341Z", "totalTime": 1, "timeout": 5000 }, @@ -5754,7 +5777,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -5777,8 +5800,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.479Z", - "endTime": "2020-02-02T16:26:09.480Z", + "startTime": "2020-02-07T18:11:14.341Z", + "endTime": "2020-02-07T18:11:14.342Z", "totalTime": 1, "timeout": 5000 }, @@ -5789,7 +5812,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_55233c1965_624990", + "id": "1511140204_55233c1965_22787", "level": 3, "subscriptions": [], "publishers": [], @@ -5812,8 +5835,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.481Z", - "endTime": "2020-02-02T16:26:09.483Z", + "startTime": "2020-02-07T18:11:14.343Z", + "endTime": "2020-02-07T18:11:14.345Z", "totalTime": 2, "timeout": 5000 }, @@ -5821,7 +5844,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -5844,8 +5867,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.481Z", - "endTime": "2020-02-02T16:26:09.482Z", + "startTime": "2020-02-07T18:11:14.343Z", + "endTime": "2020-02-07T18:11:14.344Z", "totalTime": 1, "timeout": 5000 }, @@ -5854,7 +5877,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -5872,14 +5895,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2020-02-02T16:26:09.482Z", - "endTime": "2020-02-02T16:26:09.483Z", - "totalTime": 1, + "startTime": "2020-02-07T18:11:14.344Z", + "endTime": "2020-02-07T18:11:14.344Z", + "totalTime": 0, "timeout": 5000 }, "requisitions": [] @@ -5887,7 +5910,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -5910,8 +5933,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.483Z", - "endTime": "2020-02-02T16:26:09.483Z", + "startTime": "2020-02-07T18:11:14.345Z", + "endTime": "2020-02-07T18:11:14.345Z", "totalTime": 0, "timeout": 5000 }, @@ -5924,7 +5947,7 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090323_e87d17a22e_281435", + "id": "1511140204_e87d17a22e_372406", "level": 2, "subscriptions": [], "publishers": [], @@ -5947,8 +5970,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.483Z", - "endTime": "2020-02-02T16:26:09.487Z", + "startTime": "2020-02-07T18:11:14.345Z", + "endTime": "2020-02-07T18:11:14.349Z", "totalTime": 4, "timeout": 5000 }, @@ -5956,7 +5979,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_55233c1965_624990", + "id": "1511140204_55233c1965_22787", "level": 3, "subscriptions": [], "publishers": [], @@ -5979,8 +6002,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.484Z", - "endTime": "2020-02-02T16:26:09.485Z", + "startTime": "2020-02-07T18:11:14.345Z", + "endTime": "2020-02-07T18:11:14.346Z", "totalTime": 1, "timeout": 5000 }, @@ -5988,7 +6011,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6011,8 +6034,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.484Z", - "endTime": "2020-02-02T16:26:09.484Z", + "startTime": "2020-02-07T18:11:14.346Z", + "endTime": "2020-02-07T18:11:14.346Z", "totalTime": 0, "timeout": 5000 }, @@ -6021,7 +6044,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6044,8 +6067,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.484Z", - "endTime": "2020-02-02T16:26:09.484Z", + "startTime": "2020-02-07T18:11:14.346Z", + "endTime": "2020-02-07T18:11:14.346Z", "totalTime": 0, "timeout": 5000 }, @@ -6054,7 +6077,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6077,8 +6100,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.485Z", - "endTime": "2020-02-02T16:26:09.485Z", + "startTime": "2020-02-07T18:11:14.346Z", + "endTime": "2020-02-07T18:11:14.346Z", "totalTime": 0, "timeout": 5000 }, @@ -6089,7 +6112,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_55233c1965_624990", + "id": "1511140204_55233c1965_22787", "level": 3, "subscriptions": [], "publishers": [], @@ -6107,21 +6130,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2020-02-02T16:26:09.485Z", - "endTime": "2020-02-02T16:26:09.486Z", - "totalTime": 1, + "startTime": "2020-02-07T18:11:14.347Z", + "endTime": "2020-02-07T18:11:14.347Z", + "totalTime": 0, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6144,8 +6167,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.485Z", - "endTime": "2020-02-02T16:26:09.485Z", + "startTime": "2020-02-07T18:11:14.347Z", + "endTime": "2020-02-07T18:11:14.347Z", "totalTime": 0, "timeout": 5000 }, @@ -6154,7 +6177,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6172,14 +6195,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2020-02-02T16:26:09.485Z", - "endTime": "2020-02-02T16:26:09.486Z", - "totalTime": 1, + "startTime": "2020-02-07T18:11:14.347Z", + "endTime": "2020-02-07T18:11:14.347Z", + "totalTime": 0, "timeout": 5000 }, "requisitions": [] @@ -6187,7 +6210,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6210,8 +6233,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.486Z", - "endTime": "2020-02-02T16:26:09.486Z", + "startTime": "2020-02-07T18:11:14.347Z", + "endTime": "2020-02-07T18:11:14.347Z", "totalTime": 0, "timeout": 5000 }, @@ -6222,7 +6245,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_55233c1965_624990", + "id": "1511140204_55233c1965_22787", "level": 3, "subscriptions": [], "publishers": [], @@ -6245,8 +6268,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.486Z", - "endTime": "2020-02-02T16:26:09.487Z", + "startTime": "2020-02-07T18:11:14.348Z", + "endTime": "2020-02-07T18:11:14.349Z", "totalTime": 1, "timeout": 5000 }, @@ -6254,7 +6277,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6277,8 +6300,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.486Z", - "endTime": "2020-02-02T16:26:09.486Z", + "startTime": "2020-02-07T18:11:14.348Z", + "endTime": "2020-02-07T18:11:14.348Z", "totalTime": 0, "timeout": 5000 }, @@ -6287,7 +6310,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6310,8 +6333,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.487Z", - "endTime": "2020-02-02T16:26:09.487Z", + "startTime": "2020-02-07T18:11:14.348Z", + "endTime": "2020-02-07T18:11:14.348Z", "totalTime": 0, "timeout": 5000 }, @@ -6320,7 +6343,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6343,8 +6366,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.487Z", - "endTime": "2020-02-02T16:26:09.487Z", + "startTime": "2020-02-07T18:11:14.348Z", + "endTime": "2020-02-07T18:11:14.348Z", "totalTime": 0, "timeout": 5000 }, @@ -6357,7 +6380,7 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090323_e87d17a22e_281435", + "id": "1511140204_e87d17a22e_372406", "level": 2, "subscriptions": [], "publishers": [], @@ -6375,21 +6398,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 4 + "elapsedTime": 5 } } }, "time": { - "startTime": "2020-02-02T16:26:09.488Z", - "endTime": "2020-02-02T16:26:09.492Z", - "totalTime": 4, + "startTime": "2020-02-07T18:11:14.349Z", + "endTime": "2020-02-07T18:11:14.354Z", + "totalTime": 5, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090323_55233c1965_624990", + "id": "1511140204_55233c1965_22787", "level": 3, "subscriptions": [], "publishers": [], @@ -6407,21 +6430,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 2 } } }, "time": { - "startTime": "2020-02-02T16:26:09.488Z", - "endTime": "2020-02-02T16:26:09.489Z", - "totalTime": 1, + "startTime": "2020-02-07T18:11:14.349Z", + "endTime": "2020-02-07T18:11:14.351Z", + "totalTime": 2, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6439,14 +6462,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 2 } } }, "time": { - "startTime": "2020-02-02T16:26:09.488Z", - "endTime": "2020-02-02T16:26:09.488Z", - "totalTime": 0, + "startTime": "2020-02-07T18:11:14.349Z", + "endTime": "2020-02-07T18:11:14.351Z", + "totalTime": 2, "timeout": 5000 }, "requisitions": [] @@ -6454,7 +6477,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6477,8 +6500,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.488Z", - "endTime": "2020-02-02T16:26:09.488Z", + "startTime": "2020-02-07T18:11:14.351Z", + "endTime": "2020-02-07T18:11:14.351Z", "totalTime": 0, "timeout": 5000 }, @@ -6487,7 +6510,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6510,8 +6533,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.489Z", - "endTime": "2020-02-02T16:26:09.489Z", + "startTime": "2020-02-07T18:11:14.351Z", + "endTime": "2020-02-07T18:11:14.351Z", "totalTime": 0, "timeout": 5000 }, @@ -6522,7 +6545,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_55233c1965_624990", + "id": "1511140204_55233c1965_22787", "level": 3, "subscriptions": [], "publishers": [], @@ -6540,21 +6563,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2 + "elapsedTime": 0 } } }, "time": { - "startTime": "2020-02-02T16:26:09.489Z", - "endTime": "2020-02-02T16:26:09.491Z", - "totalTime": 2, + "startTime": "2020-02-07T18:11:14.352Z", + "endTime": "2020-02-07T18:11:14.352Z", + "totalTime": 0, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6577,8 +6600,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.489Z", - "endTime": "2020-02-02T16:26:09.489Z", + "startTime": "2020-02-07T18:11:14.352Z", + "endTime": "2020-02-07T18:11:14.352Z", "totalTime": 0, "timeout": 5000 }, @@ -6587,7 +6610,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6610,8 +6633,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.491Z", - "endTime": "2020-02-02T16:26:09.491Z", + "startTime": "2020-02-07T18:11:14.352Z", + "endTime": "2020-02-07T18:11:14.352Z", "totalTime": 0, "timeout": 5000 }, @@ -6620,7 +6643,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6643,8 +6666,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.491Z", - "endTime": "2020-02-02T16:26:09.491Z", + "startTime": "2020-02-07T18:11:14.352Z", + "endTime": "2020-02-07T18:11:14.352Z", "totalTime": 0, "timeout": 5000 }, @@ -6655,7 +6678,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_55233c1965_624990", + "id": "1511140204_55233c1965_22787", "level": 3, "subscriptions": [], "publishers": [], @@ -6673,21 +6696,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2020-02-02T16:26:09.492Z", - "endTime": "2020-02-02T16:26:09.492Z", - "totalTime": 0, + "startTime": "2020-02-07T18:11:14.353Z", + "endTime": "2020-02-07T18:11:14.354Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6710,8 +6733,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.492Z", - "endTime": "2020-02-02T16:26:09.492Z", + "startTime": "2020-02-07T18:11:14.353Z", + "endTime": "2020-02-07T18:11:14.353Z", "totalTime": 0, "timeout": 5000 }, @@ -6720,7 +6743,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6743,8 +6766,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.492Z", - "endTime": "2020-02-02T16:26:09.492Z", + "startTime": "2020-02-07T18:11:14.353Z", + "endTime": "2020-02-07T18:11:14.353Z", "totalTime": 0, "timeout": 5000 }, @@ -6753,7 +6776,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_5e02f9345e_704577", + "id": "1511140204_5e02f9345e_672978", "level": 4, "subscriptions": [], "publishers": [], @@ -6776,8 +6799,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.492Z", - "endTime": "2020-02-02T16:26:09.492Z", + "startTime": "2020-02-07T18:11:14.353Z", + "endTime": "2020-02-07T18:11:14.353Z", "totalTime": 0, "timeout": 5000 }, @@ -6790,7 +6813,7 @@ { "valid": true, "name": "Requisition #2", - "id": "1326090323_aef615856f_611970", + "id": "1511140204_aef615856f_12569", "level": 2, "subscriptions": [], "publishers": [], @@ -6814,14 +6837,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2020-02-02T16:26:09.493Z", - "endTime": "2020-02-02T16:26:09.493Z", - "totalTime": 0, + "startTime": "2020-02-07T18:11:14.354Z", + "endTime": "2020-02-07T18:11:14.355Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [] @@ -6831,7 +6854,7 @@ { "valid": true, "name": "examples/requisition-delay-iterations.yml", - "id": "1326090323_8e102bb4f5_211808", + "id": "1511140204_8e102bb4f5_900494", "level": 1, "subscriptions": [], "publishers": [], @@ -6849,21 +6872,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 3081 + "elapsedTime": 3072 } } }, "time": { - "startTime": "2020-02-02T16:26:09.405Z", - "endTime": "2020-02-02T16:26:12.486Z", - "totalTime": 3081, + "startTime": "2020-02-07T18:11:14.273Z", + "endTime": "2020-02-07T18:11:17.345Z", + "totalTime": 3072, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "iterations", - "id": "1326090323_b4f515b70d_641013", + "id": "1511140204_b4f515b70d_904922", "level": 2, "subscriptions": [], "publishers": [], @@ -6881,14 +6904,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 33 + "elapsedTime": 32 } } }, "time": { - "startTime": "2020-02-02T16:26:09.426Z", - "endTime": "2020-02-02T16:26:09.459Z", - "totalTime": 33, + "startTime": "2020-02-07T18:11:14.292Z", + "endTime": "2020-02-07T18:11:14.324Z", + "totalTime": 32, "timeout": 5000 }, "requisitions": [] @@ -6896,7 +6919,7 @@ { "valid": true, "name": "iterations", - "id": "1326090323_b4f515b70d_641013", + "id": "1511140204_b4f515b70d_904922", "level": 2, "subscriptions": [], "publishers": [], @@ -6919,8 +6942,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.461Z", - "endTime": "2020-02-02T16:26:09.466Z", + "startTime": "2020-02-07T18:11:14.327Z", + "endTime": "2020-02-07T18:11:14.332Z", "totalTime": 5, "timeout": 5000 }, @@ -6929,7 +6952,7 @@ { "valid": true, "name": "iterations", - "id": "1326090323_b4f515b70d_641013", + "id": "1511140204_b4f515b70d_904922", "level": 2, "subscriptions": [], "publishers": [], @@ -6952,9 +6975,9 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.467Z", - "endTime": "2020-02-02T16:26:09.471Z", - "totalTime": 4, + "startTime": "2020-02-07T18:11:14.332Z", + "endTime": "2020-02-07T18:11:14.335Z", + "totalTime": 3, "timeout": 5000 }, "requisitions": [] @@ -6962,7 +6985,7 @@ { "valid": true, "name": "iterations", - "id": "1326090323_b4f515b70d_641013", + "id": "1511140204_b4f515b70d_904922", "level": 2, "subscriptions": [], "publishers": [], @@ -6980,14 +7003,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 3 + "elapsedTime": 1 } } }, "time": { - "startTime": "2020-02-02T16:26:09.472Z", - "endTime": "2020-02-02T16:26:09.475Z", - "totalTime": 3, + "startTime": "2020-02-07T18:11:14.336Z", + "endTime": "2020-02-07T18:11:14.337Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [] @@ -6995,7 +7018,7 @@ { "valid": true, "name": "iterations", - "id": "1326090323_b4f515b70d_641013", + "id": "1511140204_b4f515b70d_904922", "level": 2, "subscriptions": [], "publishers": [], @@ -7013,14 +7036,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2020-02-02T16:26:09.475Z", - "endTime": "2020-02-02T16:26:09.476Z", - "totalTime": 1, + "startTime": "2020-02-07T18:11:14.338Z", + "endTime": "2020-02-07T18:11:14.338Z", + "totalTime": 0, "timeout": 5000 }, "requisitions": [] @@ -7028,7 +7051,7 @@ { "valid": true, "name": "iterations", - "id": "1326090323_b4f515b70d_641013", + "id": "1511140204_b4f515b70d_904922", "level": 2, "subscriptions": [], "publishers": [], @@ -7046,14 +7069,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2 + "elapsedTime": 1 } } }, "time": { - "startTime": "2020-02-02T16:26:09.476Z", - "endTime": "2020-02-02T16:26:09.478Z", - "totalTime": 2, + "startTime": "2020-02-07T18:11:14.338Z", + "endTime": "2020-02-07T18:11:14.339Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [] @@ -7061,7 +7084,7 @@ { "valid": true, "name": "iterations", - "id": "1326090323_b4f515b70d_641013", + "id": "1511140204_b4f515b70d_904922", "level": 2, "subscriptions": [], "publishers": [], @@ -7084,9 +7107,9 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.478Z", - "endTime": "2020-02-02T16:26:09.479Z", - "totalTime": 1, + "startTime": "2020-02-07T18:11:14.340Z", + "endTime": "2020-02-07T18:11:14.340Z", + "totalTime": 0, "timeout": 5000 }, "requisitions": [] @@ -7094,7 +7117,7 @@ { "valid": true, "name": "iterations", - "id": "1326090323_b4f515b70d_641013", + "id": "1511140204_b4f515b70d_904922", "level": 2, "subscriptions": [], "publishers": [], @@ -7117,9 +7140,9 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.479Z", - "endTime": "2020-02-02T16:26:09.480Z", - "totalTime": 1, + "startTime": "2020-02-07T18:11:14.341Z", + "endTime": "2020-02-07T18:11:14.341Z", + "totalTime": 0, "timeout": 5000 }, "requisitions": [] @@ -7127,7 +7150,7 @@ { "valid": true, "name": "iterations", - "id": "1326090323_b4f515b70d_641013", + "id": "1511140204_b4f515b70d_904922", "level": 2, "subscriptions": [], "publishers": [], @@ -7145,14 +7168,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2020-02-02T16:26:09.480Z", - "endTime": "2020-02-02T16:26:09.480Z", - "totalTime": 0, + "startTime": "2020-02-07T18:11:14.341Z", + "endTime": "2020-02-07T18:11:14.342Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [] @@ -7160,7 +7183,7 @@ { "valid": true, "name": "iterations", - "id": "1326090323_b4f515b70d_641013", + "id": "1511140204_b4f515b70d_904922", "level": 2, "subscriptions": [], "publishers": [], @@ -7178,14 +7201,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2020-02-02T16:26:09.481Z", - "endTime": "2020-02-02T16:26:09.481Z", - "totalTime": 0, + "startTime": "2020-02-07T18:11:14.342Z", + "endTime": "2020-02-07T18:11:14.343Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [] @@ -7193,7 +7216,7 @@ { "valid": true, "name": "delayed", - "id": "1326090323_ce1438bac6_140084", + "id": "1511140204_ce1438bac6_340971", "level": 2, "subscriptions": [], "publishers": [], @@ -7218,23 +7241,23 @@ { "name": "Elapsed time", "valid": true, - "description": "Expected 'elapsedTime' to be greater than or equal to '2950'. Received '3003'" + "description": "Expected 'elapsedTime' to be greater than or equal to '2950'. Received '3000'" }, { "name": "Assertion #2", "valid": true, - "description": "Expected 'new Date().getTime() - requisition.startTime.getTime()' to be greater than or equal to '2950'. Received '3003'" + "description": "Expected 'new Date().getTime() - requisition.startTime.getTime()' to be greater than or equal to '2950'. Received '3001'" } ], "arguments": { - "elapsedTime": 3003 + "elapsedTime": 3000 } } }, "time": { - "startTime": "2020-02-02T16:26:09.482Z", - "endTime": "2020-02-02T16:26:12.485Z", - "totalTime": 3003, + "startTime": "2020-02-07T18:11:14.344Z", + "endTime": "2020-02-07T18:11:17.345Z", + "totalTime": 3001, "timeout": 5000 }, "requisitions": [] @@ -7244,7 +7267,7 @@ { "valid": true, "name": "examples/skipped.yml", - "id": "1326090323_bb333e1dde_940400", + "id": "1511140204_bb333e1dde_523161", "level": 1, "subscriptions": [], "publishers": [], @@ -7262,21 +7285,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 76 + "elapsedTime": 70 } } }, "time": { - "startTime": "2020-02-02T16:26:09.406Z", - "endTime": "2020-02-02T16:26:09.482Z", - "totalTime": 76, + "startTime": "2020-02-07T18:11:14.274Z", + "endTime": "2020-02-07T18:11:14.344Z", + "totalTime": 70, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090323_fc4b0751bf_440992", + "id": "1511140204_fc4b0751bf_937586", "level": 2, "subscriptions": [], "publishers": [], @@ -7294,13 +7317,13 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 33 + "elapsedTime": 32 } } }, "time": { - "startTime": "2020-02-02T16:26:09.426Z", - "endTime": "2020-02-02T16:26:09.459Z", + "startTime": "2020-02-07T18:11:14.292Z", + "endTime": "2020-02-07T18:11:14.325Z", "totalTime": 33, "timeout": 5000 }, @@ -7309,7 +7332,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_fc4b0751bf_440992", + "id": "1511140204_fc4b0751bf_937586", "level": 2, "subscriptions": [], "publishers": [], @@ -7327,14 +7350,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 4 + "elapsedTime": 5 } } }, "time": { - "startTime": "2020-02-02T16:26:09.462Z", - "endTime": "2020-02-02T16:26:09.466Z", - "totalTime": 4, + "startTime": "2020-02-07T18:11:14.327Z", + "endTime": "2020-02-07T18:11:14.332Z", + "totalTime": 5, "timeout": 5000 }, "requisitions": [] @@ -7342,7 +7365,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_fc4b0751bf_440992", + "id": "1511140204_fc4b0751bf_937586", "level": 2, "subscriptions": [], "publishers": [], @@ -7365,9 +7388,9 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.467Z", - "endTime": "2020-02-02T16:26:09.471Z", - "totalTime": 4, + "startTime": "2020-02-07T18:11:14.332Z", + "endTime": "2020-02-07T18:11:14.335Z", + "totalTime": 3, "timeout": 5000 }, "requisitions": [] @@ -7375,7 +7398,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_fc4b0751bf_440992", + "id": "1511140204_fc4b0751bf_937586", "level": 2, "subscriptions": [], "publishers": [], @@ -7393,14 +7416,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2 + "elapsedTime": 1 } } }, "time": { - "startTime": "2020-02-02T16:26:09.473Z", - "endTime": "2020-02-02T16:26:09.475Z", - "totalTime": 2, + "startTime": "2020-02-07T18:11:14.336Z", + "endTime": "2020-02-07T18:11:14.337Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [] @@ -7408,7 +7431,7 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090323_fc4b0751bf_440992", + "id": "1511140204_fc4b0751bf_937586", "level": 2, "subscriptions": [], "publishers": [], @@ -7431,8 +7454,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.476Z", - "endTime": "2020-02-02T16:26:09.476Z", + "startTime": "2020-02-07T18:11:14.338Z", + "endTime": "2020-02-07T18:11:14.338Z", "totalTime": 0, "timeout": 5000 }, @@ -7441,7 +7464,7 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090323_0813922659_121521", + "id": "1511140204_0813922659_940953", "level": 2, "subscriptions": [], "publishers": [], @@ -7465,13 +7488,13 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2020-02-02T16:26:09.477Z", - "endTime": "2020-02-02T16:26:09.478Z", + "startTime": "2020-02-07T18:11:14.339Z", + "endTime": "2020-02-07T18:11:14.340Z", "totalTime": 1, "timeout": 5000 }, @@ -7480,7 +7503,7 @@ { "valid": true, "name": "Requisition #2", - "id": "1326090323_38e558917b_36270", + "id": "1511140204_38e558917b_266492", "level": 2, "subscriptions": [], "publishers": [], @@ -7503,8 +7526,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.478Z", - "endTime": "2020-02-02T16:26:09.478Z", + "startTime": "2020-02-07T18:11:14.340Z", + "endTime": "2020-02-07T18:11:14.340Z", "totalTime": 0 }, "requisitions": [] @@ -7512,7 +7535,7 @@ { "valid": true, "name": "Requisition #3", - "id": "1326090323_4aa5c78448_113015", + "id": "1511140204_4aa5c78448_256349", "level": 2, "subscriptions": [], "publishers": [], @@ -7535,8 +7558,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.478Z", - "endTime": "2020-02-02T16:26:09.478Z", + "startTime": "2020-02-07T18:11:14.340Z", + "endTime": "2020-02-07T18:11:14.340Z", "totalTime": 0 }, "requisitions": [] @@ -7544,7 +7567,7 @@ { "valid": true, "name": "Requisition #4", - "id": "1326090323_6ac450666c_362401", + "id": "1511140204_6ac450666c_727454", "level": 2, "subscriptions": [], "publishers": [], @@ -7567,8 +7590,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.479Z", - "endTime": "2020-02-02T16:26:09.479Z", + "startTime": "2020-02-07T18:11:14.340Z", + "endTime": "2020-02-07T18:11:14.340Z", "totalTime": 0 }, "requisitions": [] @@ -7576,7 +7599,7 @@ { "valid": true, "name": "Requisition #5", - "id": "1326090323_23f493719b_538634", + "id": "1511140204_23f493719b_872052", "level": 2, "subscriptions": [], "publishers": [], @@ -7605,8 +7628,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.479Z", - "endTime": "2020-02-02T16:26:09.479Z", + "startTime": "2020-02-07T18:11:14.341Z", + "endTime": "2020-02-07T18:11:14.341Z", "totalTime": 0, "timeout": 5000 }, @@ -7615,7 +7638,7 @@ { "valid": true, "name": "Requisition #6", - "id": "1326090323_f9b72d5147_565453", + "id": "1511140204_f9b72d5147_857211", "level": 2, "subscriptions": [], "publishers": [], @@ -7638,8 +7661,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.480Z", - "endTime": "2020-02-02T16:26:09.480Z", + "startTime": "2020-02-07T18:11:14.342Z", + "endTime": "2020-02-07T18:11:14.342Z", "totalTime": 0, "timeout": 5000 }, @@ -7648,7 +7671,7 @@ { "valid": true, "name": "Requisition #7", - "id": "1326090323_b41f5d915d_720871", + "id": "1511140204_b41f5d915d_349670", "level": 2, "subscriptions": [], "publishers": [], @@ -7672,13 +7695,13 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2020-02-02T16:26:09.481Z", - "endTime": "2020-02-02T16:26:09.482Z", + "startTime": "2020-02-07T18:11:14.342Z", + "endTime": "2020-02-07T18:11:14.343Z", "totalTime": 1, "timeout": 5000 }, @@ -7689,7 +7712,7 @@ { "valid": true, "name": "examples/ssl.yml", - "id": "1326090323_fbc833de59_678174", + "id": "1511140204_fbc833de59_769119", "level": 1, "subscriptions": [], "publishers": [], @@ -7707,25 +7730,25 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 4144 + "elapsedTime": 4170 } } }, "time": { - "startTime": "2020-02-02T16:26:09.408Z", - "endTime": "2020-02-02T16:26:13.552Z", - "totalTime": 4144, + "startTime": "2020-02-07T18:11:14.276Z", + "endTime": "2020-02-07T18:11:18.446Z", + "totalTime": 4170, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090324_ec6b6289cc_556041", + "id": "1511140204_ec6b6289cc_925598", "level": 2, "subscriptions": [ { - "id": "1326090324_d5884fd0ec_790714", + "id": "1511140205_d5884fd0ec_219033", "name": "Subscription #0", "type": "ssl", "hooks": { @@ -7746,7 +7769,7 @@ } ], "arguments": { - "elapsedTime": 2118 + "elapsedTime": 2146 } }, "onMessageReceived": { @@ -7765,17 +7788,17 @@ "family": "IPv6", "port": 23082 }, - "elapsedTime": 127 + "elapsedTime": 144 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.359Z" } ], "publishers": [ { - "id": "1326090324_e063362e26_870487", + "id": "1511140204_e063362e26_676526", "name": "Publisher #0", "valid": true, "hooks": { @@ -7788,7 +7811,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 2117 + "elapsedTime": 2146 }, "tests": [ { @@ -7805,11 +7828,16 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 50496 + "port": 52235 }, - "elapsedTime": 4125 + "elapsedTime": 4154 }, "tests": [ + { + "name": "Assertion #0", + "valid": true, + "description": "Expected 'payload' to be equal to 'hisecureResponse'. Received 'hisecureResponse'" + }, { "name": "Assertion #0", "valid": true, @@ -7820,7 +7848,7 @@ } }, "type": "ssl", - "publishTime": "2020-02-02T16:26:11.545Z" + "publishTime": "2020-02-07T18:11:16.439Z" } ], "iteration": 0, @@ -7837,14 +7865,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2118 + "elapsedTime": 2146 } } }, "time": { - "startTime": "2020-02-02T16:26:09.427Z", - "endTime": "2020-02-02T16:26:11.545Z", - "totalTime": 2118, + "startTime": "2020-02-07T18:11:14.293Z", + "endTime": "2020-02-07T18:11:16.439Z", + "totalTime": 2146, "timeout": 5000 }, "requisitions": [] @@ -7852,11 +7880,11 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090324_c8e796a6f7_194315", + "id": "1511140205_c8e796a6f7_99889", "level": 2, "subscriptions": [ { - "id": "1326090324_464eaccac3_802736", + "id": "1511140205_464eaccac3_224127", "name": "Subscription #0", "type": "ssl", "hooks": { @@ -7896,17 +7924,17 @@ "family": "IPv6", "port": 23082 }, - "elapsedTime": 1 + "elapsedTime": 0 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:11.547Z" + "subscriptionTime": "2020-02-07T18:11:16.440Z" } ], "publishers": [ { - "id": "1326090324_26f6887fe6_662428", + "id": "1511140205_26f6887fe6_917422", "name": "Publisher #0", "valid": true, "hooks": { @@ -7919,7 +7947,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 2004 + "elapsedTime": 2005 }, "tests": [ { @@ -7936,11 +7964,16 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 50496 + "port": 52235 }, - "elapsedTime": 2006 + "elapsedTime": 2007 }, "tests": [ + { + "name": "Assertion #0", + "valid": true, + "description": "Expected 'payload' to be equal to 'reusingSecureResponse'. Received 'reusingSecureResponse'" + }, { "name": "Assertion #0", "valid": true, @@ -7951,7 +7984,7 @@ } }, "type": "ssl", - "publishTime": "2020-02-02T16:26:13.551Z" + "publishTime": "2020-02-07T18:11:18.445Z" } ], "iteration": 0, @@ -7973,9 +8006,9 @@ } }, "time": { - "startTime": "2020-02-02T16:26:11.546Z", - "endTime": "2020-02-02T16:26:13.551Z", - "totalTime": 2005, + "startTime": "2020-02-07T18:11:16.440Z", + "endTime": "2020-02-07T18:11:18.446Z", + "totalTime": 2006, "timeout": 5000 }, "requisitions": [] @@ -7985,7 +8018,7 @@ { "valid": true, "name": "examples/stdin.yml", - "id": "1326090324_ae6c8a1714_12288", + "id": "1511140205_ae6c8a1714_382167", "level": 1, "subscriptions": [ { @@ -8010,7 +8043,7 @@ } ], "arguments": { - "elapsedTime": 110 + "elapsedTime": 119 } }, "onMessageReceived": { @@ -8024,12 +8057,12 @@ ], "arguments": { "message": "enqueuer standard-input payload", - "elapsedTime": 110 + "elapsedTime": 119 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.451Z" + "subscriptionTime": "2020-02-07T18:11:14.317Z" } ], "publishers": [], @@ -8047,14 +8080,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 110 + "elapsedTime": 119 } } }, "time": { - "startTime": "2020-02-02T16:26:09.408Z", - "endTime": "2020-02-02T16:26:09.518Z", - "totalTime": 110, + "startTime": "2020-02-07T18:11:14.276Z", + "endTime": "2020-02-07T18:11:14.395Z", + "totalTime": 119, "timeout": 5000 }, "requisitions": [] @@ -8062,7 +8095,7 @@ { "valid": true, "name": "examples/store.yml", - "id": "1326090324_7b9aa96592_677876", + "id": "1511140205_7b9aa96592_705009", "level": 1, "subscriptions": [], "publishers": [], @@ -8080,21 +8113,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 67 + "elapsedTime": 61 } } }, "time": { - "startTime": "2020-02-02T16:26:09.409Z", - "endTime": "2020-02-02T16:26:09.476Z", - "totalTime": 67, + "startTime": "2020-02-07T18:11:14.277Z", + "endTime": "2020-02-07T18:11:14.338Z", + "totalTime": 61, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090324_478dfcaed5_80651", + "id": "1511140205_478dfcaed5_320025", "level": 2, "subscriptions": [], "publishers": [], @@ -8112,13 +8145,13 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 31 + "elapsedTime": 30 } } }, "time": { - "startTime": "2020-02-02T16:26:09.428Z", - "endTime": "2020-02-02T16:26:09.459Z", + "startTime": "2020-02-07T18:11:14.294Z", + "endTime": "2020-02-07T18:11:14.325Z", "totalTime": 31, "timeout": 5000 }, @@ -8127,7 +8160,7 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090324_c96621cca9_250540", + "id": "1511140205_c96621cca9_769605", "level": 2, "subscriptions": [], "publishers": [], @@ -8161,8 +8194,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.464Z", - "endTime": "2020-02-02T16:26:09.467Z", + "startTime": "2020-02-07T18:11:14.329Z", + "endTime": "2020-02-07T18:11:14.332Z", "totalTime": 3, "timeout": 5000 }, @@ -8171,7 +8204,7 @@ { "valid": true, "name": "Requisition #2", - "id": "1326090324_05a830b0a8_675306", + "id": "1511140205_05a830b0a8_472992", "level": 2, "subscriptions": [], "publishers": [], @@ -8195,14 +8228,14 @@ } ], "arguments": { - "elapsedTime": 3 + "elapsedTime": 1 } } }, "time": { - "startTime": "2020-02-02T16:26:09.470Z", - "endTime": "2020-02-02T16:26:09.473Z", - "totalTime": 3, + "startTime": "2020-02-07T18:11:14.335Z", + "endTime": "2020-02-07T18:11:14.336Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [] @@ -8212,7 +8245,7 @@ { "valid": true, "name": "examples/tcp.yml", - "id": "1326090324_bf35f3e127_650247", + "id": "1511140205_bf35f3e127_300482", "level": 1, "subscriptions": [], "publishers": [], @@ -8230,25 +8263,25 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2927 + "elapsedTime": 2942 } } }, "time": { - "startTime": "2020-02-02T16:26:09.412Z", - "endTime": "2020-02-02T16:26:12.340Z", - "totalTime": 2928, + "startTime": "2020-02-07T18:11:14.279Z", + "endTime": "2020-02-07T18:11:17.221Z", + "totalTime": 2942, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090324_595f6dfba1_78810", + "id": "1511140205_595f6dfba1_682550", "level": 2, "subscriptions": [ { - "id": "1326090324_4e5617f719_775574", + "id": "1511140205_4e5617f719_610250", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -8269,7 +8302,7 @@ } ], "arguments": { - "elapsedTime": 1099 + "elapsedTime": 1112 } }, "onMessageReceived": { @@ -8293,17 +8326,17 @@ "family": "IPv6", "port": 23069 }, - "elapsedTime": 99 + "elapsedTime": 112 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.359Z" } ], "publishers": [ { - "id": "1326090324_3b7a9e3645_958173", + "id": "1511140205_3b7a9e3645_89594", "name": "Publisher #0", "valid": true, "hooks": { @@ -8316,7 +8349,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 1099 + "elapsedTime": 1112 }, "tests": [ { @@ -8333,11 +8366,16 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 50495 + "port": 52236 }, - "elapsedTime": 1101 + "elapsedTime": 1115 }, "tests": [ + { + "name": "Assertion #0", + "valid": true, + "description": "Expected 'payload' to be equal to 'Do not make it bad'. Received 'Do not make it bad'" + }, { "name": "Assertion #0", "valid": true, @@ -8348,7 +8386,7 @@ } }, "type": "tcp", - "publishTime": "2020-02-02T16:26:10.528Z" + "publishTime": "2020-02-07T18:11:15.406Z" } ], "iteration": 0, @@ -8365,14 +8403,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1099 + "elapsedTime": 1112 } } }, "time": { - "startTime": "2020-02-02T16:26:09.429Z", - "endTime": "2020-02-02T16:26:10.528Z", - "totalTime": 1099, + "startTime": "2020-02-07T18:11:14.294Z", + "endTime": "2020-02-07T18:11:15.406Z", + "totalTime": 1112, "timeout": 3000 }, "requisitions": [] @@ -8380,11 +8418,11 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090324_3f1b829a68_104658", + "id": "1511140205_3f1b829a68_550132", "level": 2, "subscriptions": [ { - "id": "1326090324_944c1488d1_180845", + "id": "1511140205_944c1488d1_685762", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -8405,7 +8443,7 @@ } ], "arguments": { - "elapsedTime": 806 + "elapsedTime": 804 } }, "onMessageReceived": { @@ -8429,12 +8467,12 @@ } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:10.530Z" + "subscriptionTime": "2020-02-07T18:11:15.408Z" } ], "publishers": [ { - "id": "1326090324_369e07d49e_578315", + "id": "1511140205_369e07d49e_584422", "name": "Publisher #0", "valid": true, "hooks": { @@ -8447,7 +8485,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 806 + "elapsedTime": 804 }, "tests": [ { @@ -8464,11 +8502,16 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 50514 + "port": 52254 }, - "elapsedTime": 1811 + "elapsedTime": 1814 }, "tests": [ + { + "name": "Assertion #0", + "valid": true, + "description": "Expected 'payload' to be equal to 'EnqueuerRocks'. Received 'EnqueuerRocks'" + }, { "name": "Assertion #0", "valid": true, @@ -8479,7 +8522,7 @@ } }, "type": "tcp", - "publishTime": "2020-02-02T16:26:11.335Z" + "publishTime": "2020-02-07T18:11:16.212Z" } ], "iteration": 0, @@ -8496,14 +8539,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 806 + "elapsedTime": 804 } } }, "time": { - "startTime": "2020-02-02T16:26:10.529Z", - "endTime": "2020-02-02T16:26:11.335Z", - "totalTime": 806, + "startTime": "2020-02-07T18:11:15.408Z", + "endTime": "2020-02-07T18:11:16.212Z", + "totalTime": 804, "timeout": 3000 }, "requisitions": [] @@ -8511,11 +8554,11 @@ { "valid": true, "name": "Requisition #2", - "id": "1326090326_7b3d80f664_373689", + "id": "1511140205_7b3d80f664_28088", "level": 2, "subscriptions": [ { - "id": "1326090326_a5c6b9dc6a_608763", + "id": "1511140205_a5c6b9dc6a_803502", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -8536,7 +8579,7 @@ } ], "arguments": { - "elapsedTime": 1002 + "elapsedTime": 1006 } }, "onMessageReceived": { @@ -8560,12 +8603,12 @@ } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:11.338Z" + "subscriptionTime": "2020-02-07T18:11:16.215Z" } ], "publishers": [ { - "id": "1326090326_c04ec1e8aa_673583", + "id": "1511140205_c04ec1e8aa_196334", "name": "Publisher #0", "valid": true, "hooks": { @@ -8578,7 +8621,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 1002 + "elapsedTime": 1006 }, "tests": [ { @@ -8595,11 +8638,16 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 50514 + "port": 52254 }, - "elapsedTime": 1003 + "elapsedTime": 1008 }, "tests": [ + { + "name": "Assertion #0", + "valid": true, + "description": "Expected 'payload' to be equal to 'enqueuer Rocks'. Received 'enqueuer Rocks'" + }, { "name": "Assertion #0", "valid": true, @@ -8610,7 +8658,7 @@ } }, "type": "tcp", - "publishTime": "2020-02-02T16:26:12.339Z" + "publishTime": "2020-02-07T18:11:17.220Z" } ], "iteration": 0, @@ -8627,14 +8675,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1002 + "elapsedTime": 1006 } } }, "time": { - "startTime": "2020-02-02T16:26:11.337Z", - "endTime": "2020-02-02T16:26:12.339Z", - "totalTime": 1002, + "startTime": "2020-02-07T18:11:16.214Z", + "endTime": "2020-02-07T18:11:17.221Z", + "totalTime": 1007, "timeout": 3000 }, "requisitions": [] @@ -8644,7 +8692,7 @@ { "valid": true, "name": "examples/udp.yml", - "id": "1326090326_f69fa0cdb2_80632", + "id": "1511140205_f69fa0cdb2_32374", "level": 1, "subscriptions": [], "publishers": [], @@ -8662,25 +8710,25 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 108 + "elapsedTime": 119 } } }, "time": { - "startTime": "2020-02-02T16:26:09.413Z", - "endTime": "2020-02-02T16:26:09.521Z", - "totalTime": 108, + "startTime": "2020-02-07T18:11:14.280Z", + "endTime": "2020-02-07T18:11:14.399Z", + "totalTime": 119, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090327_ac96cfadf9_874092", + "id": "1511140205_ac96cfadf9_213463", "level": 2, "subscriptions": [ { - "id": "1326090327_6e62597dc8_189723", + "id": "1511140205_6e62597dc8_110847", "name": "subscription description", "type": "udp", "hooks": { @@ -8701,7 +8749,7 @@ } ], "arguments": { - "elapsedTime": 91 + "elapsedTime": 103 } }, "onMessageReceived": { @@ -8729,20 +8777,20 @@ "remoteInfo": { "address": "127.0.0.1", "family": "IPv4", - "port": 55658, + "port": 60067, "size": 2 }, - "elapsedTime": 90 + "elapsedTime": 103 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.454Z" + "subscriptionTime": "2020-02-07T18:11:14.321Z" } ], "publishers": [ { - "id": "1326090327_f1c5db9ba9_776282", + "id": "1511140205_f1c5db9ba9_345091", "name": "publisher description", "valid": true, "hooks": { @@ -8755,7 +8803,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 91 + "elapsedTime": 103 }, "tests": [ { @@ -8768,7 +8816,7 @@ } }, "type": "udp", - "publishTime": "2020-02-02T16:26:09.504Z" + "publishTime": "2020-02-07T18:11:14.369Z" } ], "iteration": 0, @@ -8785,14 +8833,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 91 + "elapsedTime": 103 } } }, "time": { - "startTime": "2020-02-02T16:26:09.430Z", - "endTime": "2020-02-02T16:26:09.521Z", - "totalTime": 91, + "startTime": "2020-02-07T18:11:14.295Z", + "endTime": "2020-02-07T18:11:14.399Z", + "totalTime": 104, "timeout": 5000 }, "requisitions": [] @@ -8802,7 +8850,7 @@ { "valid": true, "name": "examples/uds.yml", - "id": "1326090327_c449648554_373667", + "id": "1511140205_c449648554_755489", "level": 1, "subscriptions": [], "publishers": [], @@ -8825,8 +8873,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.416Z", - "endTime": "2020-02-02T16:26:14.522Z", + "startTime": "2020-02-07T18:11:14.283Z", + "endTime": "2020-02-07T18:11:19.389Z", "totalTime": 5106, "timeout": 7000 }, @@ -8834,11 +8882,11 @@ { "valid": true, "name": "Requisition #0", - "id": "1326090327_7acc07c435_347242", + "id": "1511140205_7acc07c435_570747", "level": 2, "subscriptions": [ { - "id": "1326090327_5e03c0017a_408943", + "id": "1511140205_5e03c0017a_297054", "name": "Subscription #0", "type": "uds", "hooks": { @@ -8859,7 +8907,7 @@ } ], "arguments": { - "elapsedTime": 2081 + "elapsedTime": 2078 } }, "onMessageReceived": { @@ -8880,17 +8928,17 @@ "payload": "enqueuer", "stream": {}, "path": "/tmp/unix.sock", - "elapsedTime": 93 + "elapsedTime": 104 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:09.496Z" + "subscriptionTime": "2020-02-07T18:11:14.359Z" } ], "publishers": [ { - "id": "1326090327_b14ca3892b_434159", + "id": "1511140205_b14ca3892b_883472", "name": "Publisher #0", "valid": true, "hooks": { @@ -8903,7 +8951,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 2081 + "elapsedTime": 2079 }, "tests": [ { @@ -8918,9 +8966,14 @@ "arguments": { "payload": "responsePayload", "stream": {}, - "elapsedTime": 2083 + "elapsedTime": 2082 }, "tests": [ + { + "name": "Assertion #0", + "valid": true, + "description": "Expected 'payload' to be equal to 'responsePayload'. Received 'responsePayload'" + }, { "name": "Assertion #0", "valid": true, @@ -8931,7 +8984,7 @@ } }, "type": "uds", - "publishTime": "2020-02-02T16:26:11.511Z" + "publishTime": "2020-02-07T18:11:16.374Z" } ], "iteration": 0, @@ -8948,14 +9001,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2081 + "elapsedTime": 2078 } } }, "time": { - "startTime": "2020-02-02T16:26:09.431Z", - "endTime": "2020-02-02T16:26:11.512Z", - "totalTime": 2081, + "startTime": "2020-02-07T18:11:14.296Z", + "endTime": "2020-02-07T18:11:16.375Z", + "totalTime": 2079, "timeout": 5000 }, "requisitions": [] @@ -8963,11 +9016,11 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090327_591e70c91e_349720", + "id": "1511140205_591e70c91e_418553", "level": 2, "subscriptions": [ { - "id": "1326090327_81ccf3e7f8_711096", + "id": "1511140206_81ccf3e7f8_131664", "name": "Subscription #0", "type": "uds", "hooks": { @@ -8988,7 +9041,7 @@ } ], "arguments": { - "elapsedTime": 1004 + "elapsedTime": 1006 } }, "onMessageReceived": { @@ -9004,17 +9057,17 @@ "payload": "enqueuer", "stream": {}, "path": "/tmp/unix2.sock", - "elapsedTime": 1 + "elapsedTime": 2 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:11.514Z" + "subscriptionTime": "2020-02-07T18:11:16.377Z" } ], "publishers": [ { - "id": "1326090327_297aae1eb3_951454", + "id": "1511140205_297aae1eb3_671699", "name": "Publisher #0", "valid": true, "hooks": { @@ -9033,7 +9086,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 1004 + "elapsedTime": 1006 }, "tests": [ { @@ -9046,7 +9099,7 @@ } }, "type": "uds", - "publishTime": "2020-02-02T16:26:12.516Z" + "publishTime": "2020-02-07T18:11:17.382Z" } ], "iteration": 0, @@ -9063,14 +9116,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1004 + "elapsedTime": 1006 } } }, "time": { - "startTime": "2020-02-02T16:26:11.513Z", - "endTime": "2020-02-02T16:26:12.517Z", - "totalTime": 1004, + "startTime": "2020-02-07T18:11:16.376Z", + "endTime": "2020-02-07T18:11:17.383Z", + "totalTime": 1007, "timeout": 5000 }, "requisitions": [] @@ -9078,11 +9131,11 @@ { "valid": true, "name": "Requisition #2", - "id": "1326090327_3321951a43_523542", + "id": "1511140206_3321951a43_413848", "level": 2, "subscriptions": [ { - "id": "1326090327_d308bbf817_740573", + "id": "1511140206_d308bbf817_172021", "name": "Subscription #0", "type": "uds", "hooks": { @@ -9103,7 +9156,7 @@ } ], "arguments": { - "elapsedTime": 2004 + "elapsedTime": 2005 } }, "onMessageReceived": { @@ -9118,17 +9171,17 @@ "arguments": { "payload": "I am still opened", "stream": {}, - "elapsedTime": 1 + "elapsedTime": 0 } } }, "valid": true, - "subscriptionTime": "2020-02-02T16:26:12.519Z" + "subscriptionTime": "2020-02-07T18:11:17.384Z" } ], "publishers": [ { - "id": "1326090327_b6920facd0_307945", + "id": "1511140206_b6920facd0_335780", "name": "Publisher #0", "valid": true, "hooks": { @@ -9141,7 +9194,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 2004 + "elapsedTime": 2005 }, "tests": [ { @@ -9156,7 +9209,7 @@ "arguments": { "payload": "I am still bidirectional", "stream": {}, - "elapsedTime": 2002 + "elapsedTime": 2003 }, "tests": [ { @@ -9169,7 +9222,7 @@ } }, "type": "uds", - "publishTime": "2020-02-02T16:26:14.520Z" + "publishTime": "2020-02-07T18:11:19.387Z" } ], "iteration": 0, @@ -9186,14 +9239,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2004 + "elapsedTime": 2005 } } }, "time": { - "startTime": "2020-02-02T16:26:12.518Z", - "endTime": "2020-02-02T16:26:14.522Z", - "totalTime": 2004, + "startTime": "2020-02-07T18:11:17.384Z", + "endTime": "2020-02-07T18:11:19.389Z", + "totalTime": 2005, "timeout": 5000 }, "requisitions": [] @@ -9203,7 +9256,7 @@ { "valid": true, "name": "examples/variables.yml", - "id": "1326090327_3a6eb18d6d_614435", + "id": "1511140206_3a6eb18d6d_42583", "level": 1, "subscriptions": [], "publishers": [], @@ -9221,21 +9274,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 55 + "elapsedTime": 51 } } }, "time": { - "startTime": "2020-02-02T16:26:09.417Z", - "endTime": "2020-02-02T16:26:09.472Z", - "totalTime": 55, + "startTime": "2020-02-07T18:11:14.284Z", + "endTime": "2020-02-07T18:11:14.336Z", + "totalTime": 52, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "1326090327_bdf0ac0681_948090", + "id": "1511140206_bdf0ac0681_927032", "level": 2, "subscriptions": [], "publishers": [], @@ -9264,13 +9317,13 @@ } ], "arguments": { - "elapsedTime": 28 + "elapsedTime": 27 } } }, "time": { - "startTime": "2020-02-02T16:26:09.431Z", - "endTime": "2020-02-02T16:26:09.459Z", + "startTime": "2020-02-07T18:11:14.297Z", + "endTime": "2020-02-07T18:11:14.325Z", "totalTime": 28, "timeout": 5000 }, @@ -9279,7 +9332,7 @@ { "valid": true, "name": "Requisition #1", - "id": "1326090327_5153bc0c75_663320", + "id": "1511140206_5153bc0c75_289410", "level": 2, "subscriptions": [], "publishers": [], @@ -9313,14 +9366,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 3 + "elapsedTime": 2 } } }, "time": { - "startTime": "2020-02-02T16:26:09.464Z", - "endTime": "2020-02-02T16:26:09.467Z", - "totalTime": 3, + "startTime": "2020-02-07T18:11:14.330Z", + "endTime": "2020-02-07T18:11:14.332Z", + "totalTime": 2, "timeout": 5000 }, "requisitions": [] @@ -9330,7 +9383,7 @@ { "valid": true, "name": "examples/number.json", - "id": "1326090327_1925b227c5_451322", + "id": "1511140206_1925b227c5_217578", "level": 1, "subscriptions": [], "publishers": [], @@ -9359,14 +9412,14 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 41 + "elapsedTime": 40 } } }, "time": { - "startTime": "2020-02-02T16:26:09.417Z", - "endTime": "2020-02-02T16:26:09.459Z", - "totalTime": 42, + "startTime": "2020-02-07T18:11:14.284Z", + "endTime": "2020-02-07T18:11:14.324Z", + "totalTime": 40, "timeout": 5000 }, "requisitions": [] @@ -9374,7 +9427,7 @@ { "valid": true, "name": "examples/requisition-navigation.yaml", - "id": "1326090327_e848774ac1_270044", + "id": "1511140206_e848774ac1_498495", "level": 1, "subscriptions": [], "publishers": [], @@ -9392,21 +9445,21 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 54 + "elapsedTime": 50 } } }, "time": { - "startTime": "2020-02-02T16:26:09.418Z", - "endTime": "2020-02-02T16:26:09.472Z", - "totalTime": 54, + "startTime": "2020-02-07T18:11:14.285Z", + "endTime": "2020-02-07T18:11:14.336Z", + "totalTime": 51, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "first", - "id": "1326090327_542da8f206_38299", + "id": "1511140206_542da8f206_725926", "level": 2, "subscriptions": [], "publishers": [], @@ -9435,9 +9488,9 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.432Z", - "endTime": "2020-02-02T16:26:09.459Z", - "totalTime": 27, + "startTime": "2020-02-07T18:11:14.297Z", + "endTime": "2020-02-07T18:11:14.325Z", + "totalTime": 28, "timeout": 5000 }, "requisitions": [] @@ -9445,7 +9498,7 @@ { "valid": true, "name": "second", - "id": "1326090327_d7c80e2b4e_623870", + "id": "1511140206_d7c80e2b4e_726115", "level": 2, "subscriptions": [], "publishers": [], @@ -9474,8 +9527,8 @@ } }, "time": { - "startTime": "2020-02-02T16:26:09.465Z", - "endTime": "2020-02-02T16:26:09.467Z", + "startTime": "2020-02-07T18:11:14.330Z", + "endTime": "2020-02-07T18:11:14.332Z", "totalTime": 2, "timeout": 5000 }, diff --git a/output/examples.yml b/output/examples.yml index 7b93c84d..82c4ffd3 100644 --- a/output/examples.yml +++ b/output/examples.yml @@ -1,6 +1,6 @@ valid: true name: enqueuer -id: 1326090316_44deaa57a3_508005 +id: 1511140200_44deaa57a3_808603 level: 0 subscriptions: [] publishers: [] @@ -11,24 +11,24 @@ hooks: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 onFinish: valid: true tests: [] arguments: - elapsedTime: 5162 + elapsedTime: 5156 onParsed: valid: true tests: [] time: - startTime: '2020-02-02T16:26:09.361Z' - endTime: '2020-02-02T16:26:14.523Z' - totalTime: 5162 + startTime: '2020-02-07T18:11:14.234Z' + endTime: '2020-02-07T18:11:19.390Z' + totalTime: 5156 requisitions: - valid: true name: examples/assertions.yml - id: 1326090317_2ca609e341_839850 + id: 1511140200_2ca609e341_31474 level: 1 subscriptions: [] publishers: [] @@ -120,21 +120,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 94 + elapsedTime: 87 time: - startTime: '2020-02-02T16:26:09.364Z' - endTime: '2020-02-02T16:26:09.459Z' - totalTime: 95 + startTime: '2020-02-07T18:11:14.236Z' + endTime: '2020-02-07T18:11:14.324Z' + totalTime: 88 timeout: 5000 requisitions: [] - valid: true name: examples/avoid.yml - id: 1326090317_852d538668_231533 + id: 1511140200_852d538668_115134 level: 1 subscriptions: - - id: 1326090317_2e0cc1fd7c_790611 + id: 1511140200_2e0cc1fd7c_988098 name: 'Subscription #0' type: tcp hooks: @@ -151,11 +151,11 @@ requisitions: name: 'Subscription avoided' description: 'Avoidable subscription has not received any message' arguments: - elapsedTime: 3067 + elapsedTime: 3060 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.358Z' - - id: 1326090317_8444956d6a_697018 + id: 1511140200_8444956d6a_524639 name: 'Subscription #1' type: HTTP hooks: @@ -172,9 +172,9 @@ requisitions: name: 'Subscription avoided' description: 'Avoidable subscription has not received any message' arguments: - elapsedTime: 3066 + elapsedTime: 3060 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: [] iteration: 0 totalIterations: 1 @@ -188,17 +188,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 3067 + elapsedTime: 3060 time: - startTime: '2020-02-02T16:26:09.367Z' - endTime: '2020-02-02T16:26:12.434Z' - totalTime: 3067 + startTime: '2020-02-07T18:11:14.239Z' + endTime: '2020-02-07T18:11:17.299Z' + totalTime: 3060 timeout: 5000 requisitions: [] - valid: true name: examples/crypto-require.yml - id: 1326090317_1d33e31a27_241634 + id: 1511140200_1d33e31a27_1000169 level: 1 subscriptions: [] publishers: [] @@ -218,21 +218,21 @@ requisitions: valid: true description: 'Expected ''requisition.toEncrypt'' to be equal to ''7aad9a1a6a91e0f18c417cb3aa0e0217b283778e636c580509e494eeec1472e0''. Received ''7aad9a1a6a91e0f18c417cb3aa0e0217b283778e636c580509e494eeec1472e0''' arguments: - elapsedTime: 90 + elapsedTime: 83 time: - startTime: '2020-02-02T16:26:09.368Z' - endTime: '2020-02-02T16:26:09.459Z' - totalTime: 91 + startTime: '2020-02-07T18:11:14.240Z' + endTime: '2020-02-07T18:11:14.324Z' + totalTime: 84 timeout: 5000 requisitions: [] - valid: true name: examples/custom.yml - id: 1326090317_6da5232086_169407 + id: 1511140201_6da5232086_498716 level: 1 subscriptions: - - id: 1326090317_f6315a7fbc_588889 + id: 1511140201_f6315a7fbc_709568 name: 'subscription description' type: custom hooks: @@ -249,7 +249,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 153 + elapsedTime: 156 onMessageReceived: valid: true tests: @@ -270,14 +270,14 @@ requisitions: remoteInfo: address: 127.0.0.1 family: IPv4 - port: 53319 + port: 60675 size: 2 - elapsedTime: 153 + elapsedTime: 155 valid: true - subscriptionTime: '2020-02-02T16:26:09.452Z' + subscriptionTime: '2020-02-07T18:11:14.318Z' publishers: - - id: 1326090317_816cec1424_16152 + id: 1511140201_816cec1424_3624 name: 'publisher description' valid: true hooks: @@ -288,7 +288,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 152 + elapsedTime: 156 tests: - name: Published @@ -296,7 +296,7 @@ requisitions: description: 'Published successfully' valid: true type: custom - publishTime: '2020-02-02T16:26:09.504Z' + publishTime: '2020-02-07T18:11:14.369Z' iteration: 0 totalIterations: 1 hooks: @@ -309,17 +309,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 153 + elapsedTime: 157 time: - startTime: '2020-02-02T16:26:09.369Z' - endTime: '2020-02-02T16:26:09.522Z' - totalTime: 153 + startTime: '2020-02-07T18:11:14.241Z' + endTime: '2020-02-07T18:11:14.398Z' + totalTime: 157 timeout: 5000 requisitions: [] - valid: true name: examples/file-placeholder.yml - id: 1326090317_a5f62352f4_408120 + id: 1511140201_a5f62352f4_130626 level: 1 subscriptions: [] publishers: [] @@ -335,17 +335,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 99 + elapsedTime: 92 time: - startTime: '2020-02-02T16:26:09.372Z' - endTime: '2020-02-02T16:26:09.472Z' - totalTime: 100 + startTime: '2020-02-07T18:11:14.243Z' + endTime: '2020-02-07T18:11:14.336Z' + totalTime: 93 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090317_374c18eaf8_136516 + id: 1511140201_374c18eaf8_484646 level: 2 subscriptions: [] publishers: [] @@ -377,17 +377,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 40 + elapsedTime: 39 time: - startTime: '2020-02-02T16:26:09.419Z' - endTime: '2020-02-02T16:26:09.459Z' - totalTime: 40 + startTime: '2020-02-07T18:11:14.285Z' + endTime: '2020-02-07T18:11:14.324Z' + totalTime: 39 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090317_8067e3ed86_482921 + id: 1511140201_8067e3ed86_814949 level: 2 subscriptions: [] publishers: [] @@ -409,19 +409,19 @@ requisitions: arguments: elapsedTime: 5 time: - startTime: '2020-02-02T16:26:09.462Z' - endTime: '2020-02-02T16:26:09.467Z' + startTime: '2020-02-07T18:11:14.327Z' + endTime: '2020-02-07T18:11:14.332Z' totalTime: 5 timeout: 5000 requisitions: [] - valid: true name: examples/file.yml - id: 1326090317_d7a8d31f32_965694 + id: 1511140201_d7a8d31f32_590115 level: 1 subscriptions: - - id: 1326090318_3dd85e61fc_704384 + id: 1511140201_3dd85e61fc_199645 name: 'subscription description' type: file-system-watcher hooks: @@ -438,18 +438,18 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 144 + elapsedTime: 150 onMessageReceived: valid: true tests: - name: 'Some time has passed' valid: true - description: 'Expected ''now'' to be greater than or equal to ''1580660769373''. Received ''1580660769516''' + description: 'Expected ''now'' to be greater than or equal to ''1581099006822''. Received ''1581099074392''' - name: Filename valid: true - description: 'Expecting ''temp/fileTest1326090455_1f3e20bfac_364027.file'' (name) to contain ''temp/''' + description: 'Expecting ''temp/fileTest1510060896_615fe60a48_840107.file'' (name) to contain ''temp/''' - name: Content valid: true @@ -467,17 +467,17 @@ requisitions: valid: true description: 'Expected ''size'' not to be greater than ''0''. Received ''13''' arguments: - content: '1580660769373' - name: temp/fileTest1326090455_1f3e20bfac_364027.file + content: '1581099006822' + name: temp/fileTest1510060896_615fe60a48_840107.file size: 13 - modified: '2020-02-02T16:26:09.456Z' - created: '2020-02-02T16:26:09.456Z' - elapsedTime: 143 + modified: '2020-02-07T18:10:06.897Z' + created: '2020-02-07T18:10:06.897Z' + elapsedTime: 148 valid: true - subscriptionTime: '2020-02-02T16:26:09.450Z' + subscriptionTime: '2020-02-07T18:11:14.316Z' publishers: - - id: 1326090318_4b5a457015_35923 + id: 1511140201_4b5a457015_419508 name: 'publisher description' valid: true hooks: @@ -488,7 +488,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 144 + elapsedTime: 150 tests: - name: Published @@ -496,7 +496,7 @@ requisitions: description: 'Published successfully' valid: true type: file - publishTime: '2020-02-02T16:26:09.458Z' + publishTime: '2020-02-07T18:11:14.324Z' iteration: 0 totalIterations: 1 hooks: @@ -509,21 +509,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 144 + elapsedTime: 150 time: - startTime: '2020-02-02T16:26:09.373Z' - endTime: '2020-02-02T16:26:09.517Z' - totalTime: 144 + startTime: '2020-02-07T18:11:14.244Z' + endTime: '2020-02-07T18:11:14.394Z' + totalTime: 150 timeout: 3000 requisitions: [] - valid: true name: examples/hooks.yml - id: 1326090318_75b8872357_781943 + id: 1511140201_75b8872357_374739 level: 1 subscriptions: - - id: 1326090318_fbe2d8d804_817690 + id: 1511140201_fbe2d8d804_922984 name: 'Subscription #0' type: tcp hooks: @@ -552,7 +552,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 2150 + elapsedTime: 2160 onMessageReceived: valid: true tests: @@ -574,12 +574,12 @@ requisitions: address: '::ffff:127.0.0.1' family: IPv6 port: 23080 - elapsedTime: 151 + elapsedTime: 157 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.358Z' publishers: - - id: 1326090318_ca0fe1e8c5_636544 + id: 1511140201_ca0fe1e8c5_89497 name: 'Publisher #0' valid: true hooks: @@ -610,7 +610,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 2149 + elapsedTime: 2160 tests: - name: Published @@ -623,9 +623,25 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 50494 - elapsedTime: 2150 + port: 52234 + elapsedTime: 2161 tests: + - + name: 'Publisher exists onMessageReceived' + valid: true + description: 'Expecting ''publisher'' to be defined' + - + name: 'Requisition onInit' + valid: true + description: 'Expecting ''requisition::onInit-> subscription::onInit-> publisher::onInit-> publisher::onMessageReceived'' (store.sequence) to contain ''requisition::onInit''' + - + name: 'Publisher name changed' + valid: true + description: 'Expected ''publisher.name'' to be equal to ''changed''. Received ''changed''' + - + name: 'Publisher onInit executed' + valid: true + description: 'Expecting ''requisition::onInit-> subscription::onInit-> publisher::onInit-> publisher::onMessageReceived'' (store.sequence) to contain ''publisher::onInit''' - name: 'Publisher exists onMessageReceived' valid: true @@ -644,7 +660,7 @@ requisitions: description: 'Expecting ''requisition::onInit-> subscription::onInit-> publisher::onInit-> publisher::onMessageReceived-> publisher::onMessageReceived'' (store.sequence) to contain ''publisher::onInit''' valid: true type: tcp - publishTime: '2020-02-02T16:26:11.526Z' + publishTime: '2020-02-07T18:11:16.407Z' iteration: 0 totalIterations: 1 hooks: @@ -665,21 +681,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2150 + elapsedTime: 2160 time: - startTime: '2020-02-02T16:26:09.376Z' - endTime: '2020-02-02T16:26:11.526Z' - totalTime: 2150 + startTime: '2020-02-07T18:11:14.247Z' + endTime: '2020-02-07T18:11:16.407Z' + totalTime: 2160 timeout: 3000 requisitions: [] - valid: true name: examples/http-auth-basic.yml - id: 1326090318_6420f75659_433640 + id: 1511140201_6420f75659_876027 level: 1 subscriptions: - - id: 1326090318_94e20b540b_452567 + id: 1511140201_94e20b540b_749887 name: 'Subscription #0' type: http hooks: @@ -696,7 +712,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 168 + elapsedTime: 191 onMessageReceived: valid: true tests: @@ -715,12 +731,12 @@ requisitions: query: {} url: /basic body: 'basic auth' - elapsedTime: 153 + elapsedTime: 162 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: - - id: 1326090318_f4551bd7af_491704 + id: 1511140201_f4551bd7af_663759 name: 'Publisher #0' valid: true hooks: @@ -731,7 +747,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 168 + elapsedTime: 191 tests: - name: Published @@ -749,7 +765,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '19' etag: 'W/"13-nGN7LEwCUKXpQoLxNqKZXSglYNc"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -783,7 +799,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '19' etag: 'W/"13-nGN7LEwCUKXpQoLxNqKZXSglYNc"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -811,7 +827,7 @@ requisitions: description: 'Expected ''body'' to be equal to ''basic auth response''. Received ''basic auth response''' valid: true type: http - publishTime: '2020-02-02T16:26:09.547Z' + publishTime: '2020-02-07T18:11:14.440Z' iteration: 0 totalIterations: 1 hooks: @@ -824,21 +840,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 169 + elapsedTime: 191 time: - startTime: '2020-02-02T16:26:09.378Z' - endTime: '2020-02-02T16:26:09.547Z' - totalTime: 169 + startTime: '2020-02-07T18:11:14.249Z' + endTime: '2020-02-07T18:11:14.440Z' + totalTime: 191 timeout: 3000 requisitions: [] - valid: true name: examples/http-auth-bearer.yml - id: 1326090318_5e821857a3_880154 + id: 1511140201_5e821857a3_426607 level: 1 subscriptions: - - id: 1326090318_dab3c9a05e_653545 + id: 1511140201_dab3c9a05e_636929 name: 'Subscription #0' type: http hooks: @@ -855,7 +871,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 168 + elapsedTime: 192 onMessageReceived: valid: true tests: @@ -874,12 +890,12 @@ requisitions: query: {} url: /bearer body: Rech - elapsedTime: 155 + elapsedTime: 170 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: - - id: 1326090318_388c1593e3_386189 + id: 1511140201_388c1593e3_123886 name: 'Publisher #0' valid: true hooks: @@ -890,7 +906,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 169 + elapsedTime: 193 tests: - name: Published @@ -908,7 +924,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '15' etag: 'W/"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -942,7 +958,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '15' etag: 'W/"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -970,7 +986,7 @@ requisitions: description: 'Expected ''body'' to be equal to ''responsePayload''. Received ''responsePayload''' valid: true type: http - publishTime: '2020-02-02T16:26:09.548Z' + publishTime: '2020-02-07T18:11:14.442Z' iteration: 0 totalIterations: 1 hooks: @@ -983,21 +999,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 168 + elapsedTime: 193 time: - startTime: '2020-02-02T16:26:09.380Z' - endTime: '2020-02-02T16:26:09.549Z' - totalTime: 169 + startTime: '2020-02-07T18:11:14.250Z' + endTime: '2020-02-07T18:11:14.443Z' + totalTime: 193 timeout: 3000 requisitions: [] - valid: true name: examples/http-auth-digest.yml - id: 1326090319_784968c016_601958 + id: 1511140201_784968c016_176616 level: 1 subscriptions: - - id: 1326090319_b8f024a270_119399 + id: 1511140202_b8f024a270_687770 name: 'Subscription #0' type: http hooks: @@ -1014,7 +1030,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 167 + elapsedTime: 189 onMessageReceived: valid: true tests: @@ -1033,12 +1049,12 @@ requisitions: query: {} url: /digest body: Rech - elapsedTime: 154 + elapsedTime: 166 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: - - id: 1326090319_b553ccdd3b_753448 + id: 1511140201_b553ccdd3b_773032 name: 'Publisher #0' valid: true hooks: @@ -1049,7 +1065,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 167 + elapsedTime: 190 tests: - name: Published @@ -1067,7 +1083,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '15' etag: 'W/"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -1101,7 +1117,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '15' etag: 'W/"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -1129,7 +1145,7 @@ requisitions: description: 'Expected ''body'' to be equal to ''responsePayload''. Received ''responsePayload''' valid: true type: http - publishTime: '2020-02-02T16:26:09.549Z' + publishTime: '2020-02-07T18:11:14.441Z' iteration: 0 totalIterations: 1 hooks: @@ -1142,17 +1158,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 167 + elapsedTime: 190 time: - startTime: '2020-02-02T16:26:09.382Z' - endTime: '2020-02-02T16:26:09.549Z' - totalTime: 167 + startTime: '2020-02-07T18:11:14.252Z' + endTime: '2020-02-07T18:11:14.442Z' + totalTime: 190 timeout: 3000 requisitions: [] - valid: true name: examples/http-more-examples.yml - id: 1326090319_a064465f3e_659685 + id: 1511140202_a064465f3e_455669 level: 1 subscriptions: [] publishers: [] @@ -1168,21 +1184,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2393 + elapsedTime: 2379 time: - startTime: '2020-02-02T16:26:09.388Z' - endTime: '2020-02-02T16:26:11.781Z' - totalTime: 2393 + startTime: '2020-02-07T18:11:14.258Z' + endTime: '2020-02-07T18:11:16.637Z' + totalTime: 2379 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090319_f13fd961e3_727879 + id: 1511140202_f13fd961e3_94808 level: 2 subscriptions: - - id: 1326090319_e916596275_350239 + id: 1511140202_e916596275_512431 name: 'Subscription #0' type: http hooks: @@ -1199,7 +1215,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 335 + elapsedTime: 334 onMessageReceived: valid: true tests: @@ -1232,11 +1248,11 @@ requisitions: query: '2345' url: '/enqueuer/idStuff?query=2345' body: '{"enqueuer":"virgs"}' - elapsedTime: 119 + elapsedTime: 141 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' - - id: 1326090319_ba5a509689_251012 + id: 1511140202_ba5a509689_413033 name: 'same port' type: http hooks: @@ -1266,11 +1282,11 @@ requisitions: query: {} url: /samePort body: virgs - elapsedTime: 119 + elapsedTime: 143 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' - - id: 1326090319_42d8fc1293_581038 + id: 1511140202_42d8fc1293_453458 name: 'yet another, but avoidable' type: http hooks: @@ -1289,10 +1305,10 @@ requisitions: arguments: elapsedTime: 334 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: - - id: 1326090319_acd0fb7e94_331041 + id: 1511140202_acd0fb7e94_772145 name: 'Publisher #0' valid: true hooks: @@ -1322,7 +1338,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '27' etag: 'W/"1b-e5esTWfu+XftewZ5g2Tclr7ClTo"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -1369,7 +1385,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '27' etag: 'W/"1b-e5esTWfu+XftewZ5g2Tclr7ClTo"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -1393,9 +1409,9 @@ requisitions: tests: [] valid: true type: http - publishTime: '2020-02-02T16:26:09.551Z' + publishTime: '2020-02-07T18:11:14.444Z' - - id: 1326090319_72ad57ec09_657940 + id: 1511140202_72ad57ec09_850261 name: 'Publisher #1' valid: true hooks: @@ -1424,7 +1440,7 @@ requisitions: content-type: 'application/json; charset=utf-8' content-length: '17' etag: 'W/"11-nJYBwrCE3yNNre0RUpA2SJDxlIY"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -1464,7 +1480,7 @@ requisitions: content-type: 'application/json; charset=utf-8' content-length: '17' etag: 'W/"11-nJYBwrCE3yNNre0RUpA2SJDxlIY"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -1486,7 +1502,7 @@ requisitions: tests: [] valid: true type: http - publishTime: '2020-02-02T16:26:09.551Z' + publishTime: '2020-02-07T18:11:14.445Z' iteration: 0 totalIterations: 1 hooks: @@ -1499,21 +1515,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 335 + elapsedTime: 334 time: - startTime: '2020-02-02T16:26:09.421Z' - endTime: '2020-02-02T16:26:09.756Z' + startTime: '2020-02-07T18:11:14.288Z' + endTime: '2020-02-07T18:11:14.623Z' totalTime: 335 timeout: 3000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090319_16e7db54dd_567488 + id: 1511140202_16e7db54dd_527937 level: 2 subscriptions: - - id: 1326090319_34a6878700_409948 + id: 1511140202_34a6878700_25225 name: 'Subscription #0' type: http hooks: @@ -1552,10 +1568,10 @@ requisitions: body: '{"duplicated":true}' elapsedTime: 3 valid: true - subscriptionTime: '2020-02-02T16:26:09.759Z' + subscriptionTime: '2020-02-07T18:11:14.625Z' publishers: - - id: 1326090319_45f272e419_966998 + id: 1511140202_45f272e419_801119 name: 'publisher description' valid: true hooks: @@ -1584,7 +1600,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '25' etag: 'W/"19-yZRAgggcER0sMyRTVBBpErTPT/A"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -1625,7 +1641,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '25' etag: 'W/"19-yZRAgggcER0sMyRTVBBpErTPT/A"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -1648,7 +1664,7 @@ requisitions: tests: [] valid: true type: http - publishTime: '2020-02-02T16:26:09.762Z' + publishTime: '2020-02-07T18:11:14.628Z' iteration: 0 totalIterations: 1 hooks: @@ -1663,19 +1679,19 @@ requisitions: arguments: elapsedTime: 4 time: - startTime: '2020-02-02T16:26:09.758Z' - endTime: '2020-02-02T16:26:09.763Z' - totalTime: 5 + startTime: '2020-02-07T18:11:14.624Z' + endTime: '2020-02-07T18:11:14.628Z' + totalTime: 4 timeout: 5000 requisitions: [] - valid: true name: 'requisition 2 (port 23076)' - id: 1326090319_eff03cbee0_266401 + id: 1511140202_eff03cbee0_49250 level: 2 subscriptions: - - id: 1326090319_e5e0d9ff8c_632462 + id: 1511140202_e5e0d9ff8c_519336 name: 'subscription description' type: http hooks: @@ -1692,9 +1708,9 @@ requisitions: name: 'Subscription avoided' description: 'Avoidable subscription has not received any message' arguments: - elapsedTime: 1005 + elapsedTime: 1000 valid: true - subscriptionTime: '2020-02-02T16:26:09.764Z' + subscriptionTime: '2020-02-07T18:11:14.629Z' publishers: [] iteration: 0 totalIterations: 1 @@ -1703,26 +1719,26 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 onFinish: valid: true tests: [] arguments: - elapsedTime: 1005 + elapsedTime: 1001 time: - startTime: '2020-02-02T16:26:09.763Z' - endTime: '2020-02-02T16:26:10.768Z' - totalTime: 1005 + startTime: '2020-02-07T18:11:14.628Z' + endTime: '2020-02-07T18:11:15.629Z' + totalTime: 1001 timeout: 5000 requisitions: [] - valid: true name: 'check port releasing (23076)' - id: 1326090319_33f3725983_86305 + id: 1511140202_33f3725983_932621 level: 2 subscriptions: - - id: 1326090319_eb12b4faec_226996 + id: 1511140202_eb12b4faec_243186 name: 'Subscription #0' type: tcp hooks: @@ -1739,9 +1755,9 @@ requisitions: name: 'Subscription avoided' description: 'Avoidable subscription has not received any message' arguments: - elapsedTime: 1006 + elapsedTime: 1001 valid: true - subscriptionTime: '2020-02-02T16:26:10.770Z' + subscriptionTime: '2020-02-07T18:11:15.630Z' publishers: [] iteration: 0 totalIterations: 1 @@ -1755,21 +1771,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1006 + elapsedTime: 1001 time: - startTime: '2020-02-02T16:26:10.769Z' - endTime: '2020-02-02T16:26:11.775Z' - totalTime: 1006 + startTime: '2020-02-07T18:11:15.630Z' + endTime: '2020-02-07T18:11:16.631Z' + totalTime: 1001 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #4' - id: 1326090320_33d13bbd7c_919489 + id: 1511140202_33d13bbd7c_154108 level: 2 subscriptions: - - id: 1326090320_017ca7e673_366424 + id: 1511140202_017ca7e673_125320 name: 'numbered payload' type: http hooks: @@ -1786,7 +1802,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 4 + elapsedTime: 5 onMessageReceived: valid: true tests: [] @@ -1799,12 +1815,12 @@ requisitions: query: {} url: /number-payload body: virgs - elapsedTime: 3 + elapsedTime: 4 valid: true - subscriptionTime: '2020-02-02T16:26:11.777Z' + subscriptionTime: '2020-02-07T18:11:16.633Z' publishers: - - id: 1326090320_25240a3992_208834 + id: 1511140202_25240a3992_286157 name: 'Publisher #0' valid: true hooks: @@ -1815,7 +1831,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 4 + elapsedTime: 5 tests: - name: Published @@ -1833,7 +1849,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-HLLQjeteIwK7Xuhlj4t8Bu7p124"' - date: 'Sun, 02 Feb 2020 16:26:11 GMT' + date: 'Fri, 07 Feb 2020 18:11:16 GMT' connection: close request: uri: @@ -1865,7 +1881,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-HLLQjeteIwK7Xuhlj4t8Bu7p124"' - date: 'Sun, 02 Feb 2020 16:26:11 GMT' + date: 'Fri, 07 Feb 2020 18:11:16 GMT' connection: close request: uri: @@ -1887,7 +1903,7 @@ requisitions: tests: [] valid: true type: http - publishTime: '2020-02-02T16:26:11.781Z' + publishTime: '2020-02-07T18:11:16.636Z' iteration: 0 totalIterations: 1 hooks: @@ -1902,15 +1918,15 @@ requisitions: arguments: elapsedTime: 5 time: - startTime: '2020-02-02T16:26:11.776Z' - endTime: '2020-02-02T16:26:11.781Z' + startTime: '2020-02-07T18:11:16.632Z' + endTime: '2020-02-07T18:11:16.637Z' totalTime: 5 timeout: 5000 requisitions: [] - valid: true name: examples/http-parallel.yml - id: 1326090320_ffaed7f194_909243 + id: 1511140202_ffaed7f194_647259 level: 1 subscriptions: [] publishers: [] @@ -1926,21 +1942,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 454 + elapsedTime: 456 time: - startTime: '2020-02-02T16:26:09.390Z' - endTime: '2020-02-02T16:26:09.844Z' - totalTime: 454 + startTime: '2020-02-07T18:11:14.259Z' + endTime: '2020-02-07T18:11:14.715Z' + totalTime: 456 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090320_f46fd5fb16_212127 + id: 1511140202_f46fd5fb16_802771 level: 2 subscriptions: - - id: 1326090320_e4de1090c9_768078 + id: 1511140202_e4de1090c9_914939 name: 'Subscription #0' type: http hooks: @@ -1972,7 +1988,7 @@ requisitions: body: "" elapsedTime: 419 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: [] iteration: 0 totalIterations: 2 @@ -1988,19 +2004,19 @@ requisitions: arguments: elapsedTime: 211 time: - startTime: '2020-02-02T16:26:09.422Z' - endTime: '2020-02-02T16:26:09.633Z' + startTime: '2020-02-07T18:11:14.289Z' + endTime: '2020-02-07T18:11:14.500Z' totalTime: 211 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090320_f46fd5fb16_212127 + id: 1511140202_f46fd5fb16_802771 level: 2 subscriptions: - - id: 1326090320_e4de1090c9_768078 + id: 1511140202_e4de1090c9_914939 name: 'Subscription #0' type: http hooks: @@ -2017,7 +2033,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 208 + elapsedTime: 207 onMessageReceived: valid: true tests: [] @@ -2030,9 +2046,9 @@ requisitions: query: {} url: /first body: "" - elapsedTime: 208 + elapsedTime: 207 valid: true - subscriptionTime: '2020-02-02T16:26:09.633Z' + subscriptionTime: '2020-02-07T18:11:14.501Z' publishers: [] iteration: 1 totalIterations: 2 @@ -2046,21 +2062,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 209 + elapsedTime: 208 time: - startTime: '2020-02-02T16:26:09.633Z' - endTime: '2020-02-02T16:26:09.842Z' - totalTime: 209 + startTime: '2020-02-07T18:11:14.501Z' + endTime: '2020-02-07T18:11:14.709Z' + totalTime: 208 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090320_4788339776_54726 + id: 1511140202_4788339776_624546 level: 2 subscriptions: - - id: 1326090320_16f5b5fa56_587835 + id: 1511140202_16f5b5fa56_217492 name: 'Subscription #0' type: http hooks: @@ -2077,7 +2093,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 208 + elapsedTime: 216 onMessageReceived: valid: true tests: [] @@ -2090,9 +2106,9 @@ requisitions: query: {} url: /second body: "" - elapsedTime: 419 + elapsedTime: 425 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: [] iteration: 0 totalIterations: 2 @@ -2106,21 +2122,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 208 + elapsedTime: 217 time: - startTime: '2020-02-02T16:26:09.423Z' - endTime: '2020-02-02T16:26:09.631Z' - totalTime: 208 + startTime: '2020-02-07T18:11:14.289Z' + endTime: '2020-02-07T18:11:14.506Z' + totalTime: 217 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090320_4788339776_54726 + id: 1511140202_4788339776_624546 level: 2 subscriptions: - - id: 1326090320_16f5b5fa56_587835 + id: 1511140202_16f5b5fa56_217492 name: 'Subscription #0' type: http hooks: @@ -2137,7 +2153,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 211 + elapsedTime: 208 onMessageReceived: valid: true tests: [] @@ -2150,9 +2166,9 @@ requisitions: query: {} url: /second body: "" - elapsedTime: 210 + elapsedTime: 207 valid: true - subscriptionTime: '2020-02-02T16:26:09.632Z' + subscriptionTime: '2020-02-07T18:11:14.509Z' publishers: [] iteration: 1 totalIterations: 2 @@ -2166,22 +2182,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 211 + elapsedTime: 208 time: - startTime: '2020-02-02T16:26:09.632Z' - endTime: '2020-02-02T16:26:09.843Z' - totalTime: 211 + startTime: '2020-02-07T18:11:14.507Z' + endTime: '2020-02-07T18:11:14.715Z' + totalTime: 208 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #2' - id: 1326090320_26a61bc62a_223623 + id: 1511140202_26a61bc62a_132703 level: 2 subscriptions: [] publishers: - - id: 1326090320_fb73e2d9b8_78874 + id: 1511140202_fb73e2d9b8_909643 name: 'Publisher #0' valid: true hooks: @@ -2192,7 +2208,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 212 + elapsedTime: 214 tests: - name: Published @@ -2210,7 +2226,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '5' etag: 'W/"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2246,7 +2262,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '5' etag: 'W/"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2268,7 +2284,7 @@ requisitions: tests: [] valid: true type: http - publishTime: '2020-02-02T16:26:09.635Z' + publishTime: '2020-02-07T18:11:14.503Z' iteration: 0 totalIterations: 2 hooks: @@ -2281,22 +2297,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 212 + elapsedTime: 214 time: - startTime: '2020-02-02T16:26:09.423Z' - endTime: '2020-02-02T16:26:09.635Z' - totalTime: 212 + startTime: '2020-02-07T18:11:14.289Z' + endTime: '2020-02-07T18:11:14.503Z' + totalTime: 214 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #2' - id: 1326090320_26a61bc62a_223623 + id: 1511140202_26a61bc62a_132703 level: 2 subscriptions: [] publishers: - - id: 1326090320_fb73e2d9b8_78874 + id: 1511140202_fb73e2d9b8_909643 name: 'Publisher #0' valid: true hooks: @@ -2325,7 +2341,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '5' etag: 'W/"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2361,7 +2377,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '5' etag: 'W/"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2383,7 +2399,7 @@ requisitions: tests: [] valid: true type: http - publishTime: '2020-02-02T16:26:09.844Z' + publishTime: '2020-02-07T18:11:14.712Z' iteration: 1 totalIterations: 2 hooks: @@ -2398,20 +2414,20 @@ requisitions: arguments: elapsedTime: 209 time: - startTime: '2020-02-02T16:26:09.635Z' - endTime: '2020-02-02T16:26:09.844Z' + startTime: '2020-02-07T18:11:14.503Z' + endTime: '2020-02-07T18:11:14.712Z' totalTime: 209 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #3' - id: 1326090320_6099fb1229_509225 + id: 1511140202_6099fb1229_581197 level: 2 subscriptions: [] publishers: - - id: 1326090320_7d016346aa_194481 + id: 1511140202_7d016346aa_261298 name: 'Publisher #0' valid: true hooks: @@ -2422,7 +2438,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 210 + elapsedTime: 221 tests: - name: Published @@ -2440,7 +2456,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '6' etag: 'W/"6-NS94KaI4SwAcwSsMJhPHVkVKH2o"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2476,7 +2492,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '6' etag: 'W/"6-NS94KaI4SwAcwSsMJhPHVkVKH2o"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2498,7 +2514,7 @@ requisitions: tests: [] valid: true type: http - publishTime: '2020-02-02T16:26:09.634Z' + publishTime: '2020-02-07T18:11:14.511Z' iteration: 0 totalIterations: 2 hooks: @@ -2511,22 +2527,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 210 + elapsedTime: 221 time: - startTime: '2020-02-02T16:26:09.424Z' - endTime: '2020-02-02T16:26:09.634Z' - totalTime: 210 + startTime: '2020-02-07T18:11:14.290Z' + endTime: '2020-02-07T18:11:14.511Z' + totalTime: 221 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #3' - id: 1326090320_6099fb1229_509225 + id: 1511140202_6099fb1229_581197 level: 2 subscriptions: [] publishers: - - id: 1326090320_7d016346aa_194481 + id: 1511140202_7d016346aa_261298 name: 'Publisher #0' valid: true hooks: @@ -2537,7 +2553,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 210 + elapsedTime: 203 tests: - name: Published @@ -2555,7 +2571,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '6' etag: 'W/"6-NS94KaI4SwAcwSsMJhPHVkVKH2o"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2591,7 +2607,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '6' etag: 'W/"6-NS94KaI4SwAcwSsMJhPHVkVKH2o"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2613,7 +2629,7 @@ requisitions: tests: [] valid: true type: http - publishTime: '2020-02-02T16:26:09.844Z' + publishTime: '2020-02-07T18:11:14.715Z' iteration: 1 totalIterations: 2 hooks: @@ -2626,21 +2642,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 210 + elapsedTime: 203 time: - startTime: '2020-02-02T16:26:09.634Z' - endTime: '2020-02-02T16:26:09.844Z' - totalTime: 210 + startTime: '2020-02-07T18:11:14.512Z' + endTime: '2020-02-07T18:11:14.715Z' + totalTime: 203 timeout: 5000 requisitions: [] - valid: true name: examples/http-proxy.yml - id: 1326090320_aba5464e08_187492 + id: 1511140202_aba5464e08_809011 level: 1 subscriptions: - - id: 1326090320_be017cf7e2_842625 + id: 1511140203_be017cf7e2_112367 name: 'proxy subscription' type: http-proxy hooks: @@ -2657,7 +2673,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 172 + elapsedTime: 203 onOriginalMessageReceived: valid: true tests: @@ -2676,7 +2692,7 @@ requisitions: query: proxied url: '/proxy/enqueuer/123456?query=proxied' body: original - elapsedTime: 146 + elapsedTime: 161 onMessageReceived: valid: true tests: @@ -2698,7 +2714,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '25' etag: 'W/"19-t4VpDbTMvQQ876rQU32330fLSVI"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2721,9 +2737,9 @@ requisitions: connection: close Content-Length: 17 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' - - id: 1326090320_9421bcf470_203004 + id: 1511140203_9421bcf470_904077 name: real type: http hooks: @@ -2740,7 +2756,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 172 + elapsedTime: 203 onMessageReceived: valid: true tests: @@ -2767,12 +2783,12 @@ requisitions: query: proxied url: '/real/enqueuer/123456?query=proxied' body: 'original -> proxy' - elapsedTime: 169 + elapsedTime: 191 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: - - id: 1326090320_8e53ccc444_41068 + id: 1511140203_8e53ccc444_700959 name: 'publisher proxy' valid: true hooks: @@ -2783,7 +2799,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 172 + elapsedTime: 203 tests: - name: Published @@ -2801,7 +2817,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '42' etag: 'W/"19-t4VpDbTMvQQ876rQU32330fLSVI"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2833,7 +2849,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '42' etag: 'W/"19-t4VpDbTMvQQ876rQU32330fLSVI"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2863,7 +2879,7 @@ requisitions: description: 'Expected ''body'' to be equal to ''original -> proxy -> real -> proxied again''. Received ''original -> proxy -> real -> proxied again''' valid: true type: http - publishTime: '2020-02-02T16:26:09.563Z' + publishTime: '2020-02-07T18:11:14.462Z' iteration: 0 totalIterations: 1 hooks: @@ -2876,21 +2892,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 172 + elapsedTime: 203 time: - startTime: '2020-02-02T16:26:09.392Z' - endTime: '2020-02-02T16:26:09.564Z' - totalTime: 172 + startTime: '2020-02-07T18:11:14.261Z' + endTime: '2020-02-07T18:11:14.464Z' + totalTime: 203 timeout: 5000 requisitions: [] - valid: true name: examples/http.yml - id: 1326090320_07461360b5_734473 + id: 1511140203_07461360b5_286032 level: 1 subscriptions: - - id: 1326090320_a0523c01e7_25676 + id: 1511140203_a0523c01e7_151835 name: 'Subscription #0' type: http hooks: @@ -2907,7 +2923,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 157 + elapsedTime: 181 onMessageReceived: valid: true tests: @@ -2924,12 +2940,12 @@ requisitions: query: {} url: /resource body: enqueuer - elapsedTime: 146 + elapsedTime: 165 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: - - id: 1326090320_7b553c9aff_703118 + id: 1511140203_7b553c9aff_605740 name: 'Publisher #0' valid: true hooks: @@ -2940,7 +2956,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 157 + elapsedTime: 182 tests: - name: Published @@ -2958,7 +2974,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-W/H9kn37hnlJai5s8Ay+UMHIcUU"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -2998,7 +3014,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-W/H9kn37hnlJai5s8Ay+UMHIcUU"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -3020,7 +3036,7 @@ requisitions: tests: [] valid: true type: http - publishTime: '2020-02-02T16:26:09.550Z' + publishTime: '2020-02-07T18:11:14.443Z' iteration: 0 totalIterations: 1 hooks: @@ -3033,21 +3049,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 157 + elapsedTime: 182 time: - startTime: '2020-02-02T16:26:09.393Z' - endTime: '2020-02-02T16:26:09.550Z' - totalTime: 157 + startTime: '2020-02-07T18:11:14.262Z' + endTime: '2020-02-07T18:11:14.444Z' + totalTime: 182 timeout: 5000 requisitions: [] - valid: true name: examples/https.yml - id: 1326090321_d6075fad05_832376 + id: 1511140203_d6075fad05_911967 level: 1 subscriptions: - - id: 1326090321_81e3a69582_402937 + id: 1511140203_81e3a69582_116454 name: 'Subscription #0' type: https hooks: @@ -3064,7 +3080,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 166 + elapsedTime: 187 onMessageReceived: valid: true tests: @@ -3082,12 +3098,12 @@ requisitions: query: {} url: /enqueuer body: '{"https":"works!"}' - elapsedTime: 163 + elapsedTime: 185 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: - - id: 1326090321_5cd9b40d14_601302 + id: 1511140203_5cd9b40d14_7542 name: 'Publisher #0' valid: true hooks: @@ -3098,7 +3114,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 165 + elapsedTime: 187 tests: - name: Published @@ -3116,7 +3132,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '5' etag: 'W/"5-w0N9vHwSVdOiHURNhuvy6SNMIr0"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -3149,7 +3165,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '5' etag: 'W/"5-w0N9vHwSVdOiHURNhuvy6SNMIr0"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -3180,7 +3196,7 @@ requisitions: description: 'Expected ''body'' to be equal to ''https''. Received ''https''' valid: true type: HTTPS - publishTime: '2020-02-02T16:26:09.559Z' + publishTime: '2020-02-07T18:11:14.451Z' iteration: 0 totalIterations: 1 hooks: @@ -3193,17 +3209,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 166 + elapsedTime: 187 time: - startTime: '2020-02-02T16:26:09.394Z' - endTime: '2020-02-02T16:26:09.560Z' - totalTime: 166 + startTime: '2020-02-07T18:11:14.264Z' + endTime: '2020-02-07T18:11:14.451Z' + totalTime: 187 timeout: 3000 requisitions: [] - valid: true name: examples/ignore.yml - id: 1326090321_8ea767da7b_346541 + id: 1511140203_8ea767da7b_456430 level: 1 subscriptions: [] publishers: [] @@ -3219,22 +3235,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 78 + elapsedTime: 72 time: - startTime: '2020-02-02T16:26:09.396Z' - endTime: '2020-02-02T16:26:09.475Z' - totalTime: 79 + startTime: '2020-02-07T18:11:14.265Z' + endTime: '2020-02-07T18:11:14.337Z' + totalTime: 72 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090321_cbabde97ea_95474 + id: 1511140203_cbabde97ea_911200 level: 2 subscriptions: [] publishers: - - id: 1326090321_c325787526_586630 + id: 1511140203_c325787526_140802 name: 'Publisher #0' ignored: true valid: true @@ -3258,21 +3274,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 35 + elapsedTime: 34 time: - startTime: '2020-02-02T16:26:09.424Z' - endTime: '2020-02-02T16:26:09.459Z' + startTime: '2020-02-07T18:11:14.290Z' + endTime: '2020-02-07T18:11:14.325Z' totalTime: 35 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090321_24ec47c05e_170447 + id: 1511140203_24ec47c05e_638744 level: 2 subscriptions: - - id: 1326090321_41bbcab029_167199 + id: 1511140203_41bbcab029_897668 name: 'Subscription #0' ignored: true type: file @@ -3299,15 +3315,15 @@ requisitions: arguments: elapsedTime: 3 time: - startTime: '2020-02-02T16:26:09.465Z' - endTime: '2020-02-02T16:26:09.468Z' + startTime: '2020-02-07T18:11:14.330Z' + endTime: '2020-02-07T18:11:14.333Z' totalTime: 3 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #2' - id: 1326090321_73301c2bc1_413442 + id: 1511140203_73301c2bc1_237262 ignored: true level: 2 subscriptions: [] @@ -3322,14 +3338,14 @@ requisitions: valid: true tests: [] time: - startTime: '2020-02-02T16:26:09.471Z' - endTime: '2020-02-02T16:26:09.471Z' + startTime: '2020-02-07T18:11:14.335Z' + endTime: '2020-02-07T18:11:14.335Z' totalTime: 0 requisitions: [] - valid: true name: examples/import.yml - id: 1326090321_11d1ffbd36_772185 + id: 1511140203_11d1ffbd36_485899 level: 1 subscriptions: [] publishers: [] @@ -3345,17 +3361,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 154 + elapsedTime: 178 time: - startTime: '2020-02-02T16:26:09.398Z' - endTime: '2020-02-02T16:26:09.552Z' - totalTime: 154 + startTime: '2020-02-07T18:11:14.268Z' + endTime: '2020-02-07T18:11:14.446Z' + totalTime: 178 timeout: 5000 requisitions: - valid: true name: 'static importRequisition' - id: 1326090321_0c14282f98_32518 + id: 1511140203_0c14282f98_951202 level: 2 subscriptions: [] publishers: [] @@ -3375,17 +3391,17 @@ requisitions: valid: true description: 'Expecting ''requisition.imported'' to be true. Received: true' arguments: - elapsedTime: 35 + elapsedTime: 33 time: - startTime: '2020-02-02T16:26:09.424Z' - endTime: '2020-02-02T16:26:09.459Z' - totalTime: 35 + startTime: '2020-02-07T18:11:14.291Z' + endTime: '2020-02-07T18:11:14.324Z' + totalTime: 33 timeout: 5000 requisitions: [] - valid: true name: 'dynamic importRequisition' - id: 1326090321_6857a59a1d_797112 + id: 1511140203_6857a59a1d_794429 level: 2 subscriptions: [] publishers: [] @@ -3409,21 +3425,21 @@ requisitions: valid: true description: 'Expected ''requisition.priority'' to be equal to ''higher''. Received ''higher''' arguments: - elapsedTime: 5 + elapsedTime: 4 time: - startTime: '2020-02-02T16:26:09.462Z' - endTime: '2020-02-02T16:26:09.467Z' - totalTime: 5 + startTime: '2020-02-07T18:11:14.328Z' + endTime: '2020-02-07T18:11:14.332Z' + totalTime: 4 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #2' - id: 1326090322_28f1b301b5_255517 + id: 1511140203_28f1b301b5_371530 level: 2 subscriptions: - - id: 1326090322_a7a23228b4_719138 + id: 1511140203_a7a23228b4_722571 name: 'Subscription #0' type: http hooks: @@ -3448,7 +3464,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 83 + elapsedTime: 112 onMessageReceived: valid: true tests: [] @@ -3461,12 +3477,12 @@ requisitions: query: {} url: /subscription-reuse body: virgs - elapsedTime: 72 + elapsedTime: 98 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: - - id: 1326090322_5163661566_411752 + id: 1511140203_5163661566_646046 name: 'Publisher #0' valid: true hooks: @@ -3477,8 +3493,12 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 83 + elapsedTime: 112 tests: + - + name: Published + valid: true + description: 'Published successfully' - name: 'Assertion #0' valid: true @@ -3487,10 +3507,6 @@ requisitions: name: 'Assertion #1' valid: true description: 'Expected ''publisher.method'' to be equal to ''POST''. Received ''POST''' - - - name: Published - valid: true - description: 'Published successfully' valid: true onResponseReceived: arguments: @@ -3503,7 +3519,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-W/H9kn37hnlJai5s8Ay+UMHIcUU"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -3535,7 +3551,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-W/H9kn37hnlJai5s8Ay+UMHIcUU"' - date: 'Sun, 02 Feb 2020 16:26:09 GMT' + date: 'Fri, 07 Feb 2020 18:11:14 GMT' connection: close request: uri: @@ -3561,7 +3577,7 @@ requisitions: description: 'Expected ''statusCode'' to be equal to ''444''. Received ''444''' valid: true type: http - publishTime: '2020-02-02T16:26:09.552Z' + publishTime: '2020-02-07T18:11:14.445Z' iteration: 0 totalIterations: 1 hooks: @@ -3574,17 +3590,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 83 + elapsedTime: 112 time: - startTime: '2020-02-02T16:26:09.469Z' - endTime: '2020-02-02T16:26:09.552Z' - totalTime: 83 + startTime: '2020-02-07T18:11:14.334Z' + endTime: '2020-02-07T18:11:14.446Z' + totalTime: 112 timeout: 5000 requisitions: [] - valid: true name: examples/no-tests.yml - id: 1326090322_92334e1554_246985 + id: 1511140203_92334e1554_191311 level: 1 subscriptions: [] publishers: [] @@ -3600,17 +3616,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 208 + elapsedTime: 201 time: - startTime: '2020-02-02T16:26:09.398Z' - endTime: '2020-02-02T16:26:09.606Z' - totalTime: 208 + startTime: '2020-02-07T18:11:14.268Z' + endTime: '2020-02-07T18:11:14.469Z' + totalTime: 201 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090322_35cb1b4ae8_243851 + id: 1511140203_35cb1b4ae8_74363 level: 2 subscriptions: [] publishers: [] @@ -3626,17 +3642,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 103 + elapsedTime: 101 time: - startTime: '2020-02-02T16:26:09.503Z' - endTime: '2020-02-02T16:26:09.606Z' - totalTime: 103 + startTime: '2020-02-07T18:11:14.368Z' + endTime: '2020-02-07T18:11:14.469Z' + totalTime: 101 timeout: 5000 requisitions: [] - valid: true name: examples/parallel-requisition.yml - id: 1326090322_e05b5acab1_736607 + id: 1511140203_e05b5acab1_305073 level: 1 subscriptions: [] publishers: [] @@ -3652,17 +3668,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 867 + elapsedTime: 860 time: - startTime: '2020-02-02T16:26:09.400Z' - endTime: '2020-02-02T16:26:10.267Z' - totalTime: 867 + startTime: '2020-02-07T18:11:14.269Z' + endTime: '2020-02-07T18:11:15.129Z' + totalTime: 860 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090322_e2f0694b46_827544 + id: 1511140203_e2f0694b46_165482 level: 2 subscriptions: [] publishers: [] @@ -3680,23 +3696,23 @@ requisitions: - name: 'started at the same time' valid: true - description: 'Expected ''Math.abs(requisition.requisitions[1].startTime.getTime() - requisition.requisitions[0].startTime.getTime())'' not to be less than or equal to ''100''. Received ''0''' + description: 'Expected ''Math.abs(requisition.requisitions[1].startTime.getTime() - requisition.requisitions[0].startTime.getTime())'' not to be less than or equal to ''100''. Received ''1''' - name: 'Assertion #1' valid: true - description: 'Expected ''elapsedTime'' not to be less than or equal to ''400''. Received ''328''' + description: 'Expected ''elapsedTime'' not to be less than or equal to ''400''. Received ''329''' arguments: - elapsedTime: 328 + elapsedTime: 329 time: - startTime: '2020-02-02T16:26:09.425Z' - endTime: '2020-02-02T16:26:09.753Z' - totalTime: 328 + startTime: '2020-02-07T18:11:14.291Z' + endTime: '2020-02-07T18:11:14.620Z' + totalTime: 329 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090322_913ffe0794_136423 + id: 1511140204_913ffe0794_415154 level: 3 subscriptions: [] publishers: [] @@ -3712,17 +3728,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 202 + elapsedTime: 201 time: - startTime: '2020-02-02T16:26:09.448Z' - endTime: '2020-02-02T16:26:09.650Z' - totalTime: 202 + startTime: '2020-02-07T18:11:14.314Z' + endTime: '2020-02-07T18:11:14.515Z' + totalTime: 201 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090322_fdabeaad92_143120 + id: 1511140204_fdabeaad92_20710 level: 3 subscriptions: [] publishers: [] @@ -3738,17 +3754,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 303 + elapsedTime: 305 time: - startTime: '2020-02-02T16:26:09.449Z' - endTime: '2020-02-02T16:26:09.753Z' - totalTime: 304 + startTime: '2020-02-07T18:11:14.315Z' + endTime: '2020-02-07T18:11:14.620Z' + totalTime: 305 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090322_30bc9c1ac3_79610 + id: 1511140204_30bc9c1ac3_25092 level: 2 subscriptions: [] publishers: [] @@ -3766,23 +3782,23 @@ requisitions: - name: 'started after the other' valid: true - description: 'Expected ''requisition.requisitions[1].startTime.getTime() - requisition.requisitions[0].startTime.getTime()'' to be greater than or equal to ''200''. Received ''205''' + description: 'Expected ''requisition.requisitions[1].startTime.getTime() - requisition.requisitions[0].startTime.getTime()'' to be greater than or equal to ''200''. Received ''202''' - name: 'Assertion #1' valid: true - description: 'Expected ''elapsedTime'' not to be less than or equal to ''600''. Received ''511''' + description: 'Expected ''elapsedTime'' not to be less than or equal to ''600''. Received ''507''' arguments: - elapsedTime: 511 + elapsedTime: 507 time: - startTime: '2020-02-02T16:26:09.755Z' - endTime: '2020-02-02T16:26:10.267Z' - totalTime: 512 + startTime: '2020-02-07T18:11:14.622Z' + endTime: '2020-02-07T18:11:15.129Z' + totalTime: 507 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090322_913ffe0794_744929 + id: 1511140204_913ffe0794_53669 level: 3 subscriptions: [] publishers: [] @@ -3798,17 +3814,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 204 + elapsedTime: 201 time: - startTime: '2020-02-02T16:26:09.755Z' - endTime: '2020-02-02T16:26:09.960Z' - totalTime: 205 + startTime: '2020-02-07T18:11:14.622Z' + endTime: '2020-02-07T18:11:14.823Z' + totalTime: 201 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090322_463f29d694_740706 + id: 1511140204_463f29d694_778799 level: 3 subscriptions: [] publishers: [] @@ -3824,22 +3840,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 306 + elapsedTime: 304 time: - startTime: '2020-02-02T16:26:09.960Z' - endTime: '2020-02-02T16:26:10.266Z' - totalTime: 306 + startTime: '2020-02-07T18:11:14.824Z' + endTime: '2020-02-07T18:11:15.128Z' + totalTime: 304 timeout: 5000 requisitions: [] - valid: true name: examples/parallel-test-publisher.yml - id: 1326090322_98a37b717a_945444 + id: 1511140204_98a37b717a_5258 level: 1 subscriptions: [] publishers: - - id: 1326090322_2955c0f42c_699127 + id: 1511140204_2955c0f42c_952960 name: 'Publisher #0' valid: true hooks: @@ -3850,7 +3866,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 506 + elapsedTime: 508 tests: - name: Published @@ -3863,16 +3879,20 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 50513 - elapsedTime: 1503 + port: 52253 + elapsedTime: 1508 tests: - name: 'Back and forth' valid: true description: 'Expected ''payload'' to be equal to ''anyValue''. Received ''anyValue''' + - + name: 'Back and forth' + valid: true + description: 'Expected ''payload'' to be equal to ''anyValue''. Received ''anyValue''' valid: true type: tcp - publishTime: '2020-02-02T16:26:09.907Z' + publishTime: '2020-02-07T18:11:14.777Z' iteration: 0 totalIterations: 1 hooks: @@ -3885,21 +3905,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 506 + elapsedTime: 507 time: - startTime: '2020-02-02T16:26:09.401Z' - endTime: '2020-02-02T16:26:09.907Z' - totalTime: 506 + startTime: '2020-02-07T18:11:14.270Z' + endTime: '2020-02-07T18:11:14.778Z' + totalTime: 508 timeout: 3000 requisitions: [] - valid: true name: examples/parallel-test-subscription.yml - id: 1326090322_eb9c2c8618_151013 + id: 1511140204_eb9c2c8618_888743 level: 1 subscriptions: - - id: 1326090322_b419ff22d8_333721 + id: 1511140204_b419ff22d8_446522 name: 'Subscription #0' type: tcp hooks: @@ -3916,7 +3936,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 503 + elapsedTime: 506 onMessageReceived: valid: true tests: @@ -3930,9 +3950,9 @@ requisitions: address: '::ffff:127.0.0.1' family: IPv6 port: 23081 - elapsedTime: 503 + elapsedTime: 506 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.359Z' publishers: [] iteration: 0 totalIterations: 1 @@ -3946,17 +3966,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 503 + elapsedTime: 506 time: - startTime: '2020-02-02T16:26:09.402Z' - endTime: '2020-02-02T16:26:09.905Z' - totalTime: 503 + startTime: '2020-02-07T18:11:14.270Z' + endTime: '2020-02-07T18:11:14.776Z' + totalTime: 506 timeout: 3000 requisitions: [] - valid: true name: examples/parent.yml - id: 1326090322_b79240b3fa_825174 + id: 1511140204_b79240b3fa_319382 level: 1 subscriptions: [] publishers: [] @@ -3972,17 +3992,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 164 + elapsedTime: 165 time: - startTime: '2020-02-02T16:26:09.403Z' - endTime: '2020-02-02T16:26:09.567Z' - totalTime: 164 + startTime: '2020-02-07T18:11:14.271Z' + endTime: '2020-02-07T18:11:14.436Z' + totalTime: 165 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090322_c28c57bc75_755810 + id: 1511140204_c28c57bc75_369558 level: 2 subscriptions: [] publishers: [] @@ -3998,21 +4018,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 34 + elapsedTime: 32 time: - startTime: '2020-02-02T16:26:09.425Z' - endTime: '2020-02-02T16:26:09.459Z' - totalTime: 34 + startTime: '2020-02-07T18:11:14.292Z' + endTime: '2020-02-07T18:11:14.324Z' + totalTime: 32 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090322_52aeba2265_236850 + id: 1511140204_52aeba2265_781445 level: 2 subscriptions: - - id: 1326090322_f3eb57f16a_612986 + id: 1511140204_f3eb57f16a_497703 name: 'Subscription #0' type: tcp hooks: @@ -4033,9 +4053,9 @@ requisitions: name: 'Subscription avoided' description: 'Avoidable subscription has not received any message' arguments: - elapsedTime: 104 + elapsedTime: 108 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.360Z' publishers: [] iteration: 0 totalIterations: 1 @@ -4049,22 +4069,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 104 + elapsedTime: 108 time: - startTime: '2020-02-02T16:26:09.463Z' - endTime: '2020-02-02T16:26:09.567Z' - totalTime: 104 + startTime: '2020-02-07T18:11:14.328Z' + endTime: '2020-02-07T18:11:14.436Z' + totalTime: 108 timeout: 5000 requisitions: [] - valid: true name: examples/readme-enqueuer-repo-hit.yml - id: 1326090322_5edd709fc3_970332 + id: 1511140204_5edd709fc3_388379 level: 1 subscriptions: [] publishers: - - id: 1326090323_cf5343e68d_616904 + id: 1511140204_cf5343e68d_274671 name: 'Publisher #0' valid: true hooks: @@ -4075,7 +4095,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 990 + elapsedTime: 1446 tests: - name: Published @@ -4085,29 +4105,28 @@ requisitions: onResponseReceived: arguments: statusCode: 200 - body: "\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n\n\n\n \n \n \n \n \n \n \n\n\n \n \n GitHub - enqueuer-land/enqueuer: Multi protocol microservice testing tool\n \n \n \n \n\n \n \n\n \n \n \n\n \n\n\n\n \n\n \n\n \n \n \n\n \n\n\n\n\n \n\n\n\n\n\n\n \n\n \n \n\n \n\n\n \n\n \n \n\n \n\n \n\n \n\n\n \n\n\n \n\n \n\n \n \n\n\n\n\n \n\n \n\n \n \n\n
\n Skip to content\n \n \n \n\n \n \n \n\n\n
\n
\n
\n \n \n \n
\n\n
\n
\n \n
\n\n \n\n \n
\n
\n
\n\n
\n\n
\n\n\n
\n\n
\n\n\n\n
\n
\n
\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n
\n\n
\n\n
\n

\n \n \n enqueuer-land\n \n /\n \n enqueuer\n \n \n

\n\n\n
\n\n \n\n
\n \n\n\n\n
\n
\n
\n\n \n \n \n\n\n
\n \n Multi protocol microservice testing tool\n \n https://enqueuer.com\n
\n
\n\n \n\n\n\n \n\n
\n \n
\n TypeScript\n HTML\n JavaScript\n Shell\n
\n
\n \n
\n\n\n\n\n\n\n
\n \n
\n \n Branch:\n master\n \n \n\n \n
\n \n \n \n
\n
\n
\n\n\n \n\n
\n \n
\n\n
\n\n Find file\n
\n\n \n\n\n \n\n
\n \n Clone or download\n \n
\n
\n\n
\n
\n\n

\n Clone with HTTPS\n \n \n \n

\n

\n Use Git or checkout with SVN using the web URL.\n

\n\n
\n \n
\n \n
\n
\n\n
\n\n
\n \nDownload ZIP\n\n
\n
\n\n \n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching Xcode

\n

If nothing happens, download Xcode and try again.

\n

\n
\n\n
\n

Launching Visual Studio

\n

If nothing happens, download the GitHub extension for Visual Studio and try again.

\n

\n
\n\n
\n
\n
\n\n\n
\n\n\n \n\n\n
\n \"\"\n Fetching latest commit…\n
\n
\n Cannot retrieve the latest commit at this time.\n
\n
\n\n\n
\n Permalink\n\n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TypeNameLatest commit messageCommit time
Failed to load latest commit information.
\n \n \"\"\n \n .github/ISSUE_TEMPLATE\n \n \n Update bug_report.md\n \n \n Mar 4, 2019\n
\n \n \"\"\n \n conf\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n docs\n \n \n docs(index.html): Remove unused docs img\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n examples\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n https-cert\n \n \n Adding support to https\n \n \n Aug 9, 2018\n
\n \n \"\"\n \n misc\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n output\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n src\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n temp\n \n \n #19 adding attempting to create a topic at kafka\n \n \n Oct 3, 2018\n
\n \n \"\"\n \n .codeclimate.yml\n \n \n Updating .codeclimate\n \n \n Sep 24, 2018\n
\n \n \"\"\n \n .gitignore\n \n \n docs(README): Improve docs\n \n \n Mar 23, 2019\n
\n \n \"\"\n \n .npmignore\n \n \n Removing SummaryTestOutput dependency with Configuration and start te…\n \n \n Mar 10, 2019\n
\n \n \"\"\n \n .travis.yml\n \n \n feat(dynamic-modules-manager): Look for a ~/.nqr folder to load plugi…\n \n \n Mar 22, 2019\n
\n \n \"\"\n \n CNAME\n \n \n Create CNAME\n \n \n May 10, 2019\n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n chore(Automatic Release): Add automatic release with semantic-release.\n \n \n Mar 21, 2019\n
\n \n \"\"\n \n License\n \n \n Creating License\n \n \n Mar 10, 2018\n
\n \n \"\"\n \n README.md\n \n \n docs(LandingPage): Create landing page\n \n \n Jun 30, 2019\n
\n \n \"\"\n \n package-lock.json\n \n \n chore(deps): bump handlebars from 4.1.2 to 4.5.3\n \n \n Dec 27, 2019\n
\n \n \"\"\n \n package.json\n \n \n chore(Dependencies): Update dependencies\n \n \n Jul 5, 2019\n
\n \n \"\"\n \n tsconfig.json\n \n \n feat(NotificationEmitter): Create the concept of Notification and Not…\n \n \n May 24, 2019\n
\n \n \"\"\n \n tslint.json\n \n \n Subscription refactoring\n \n \n Mar 12, 2019\n
\n\n
\n\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n
\n
\n
\n
\n
\n\n
\n

\"npm\"\n\"Build\n\"Greenkeeper\n\"Known\n\"License:

\n

\"enqueuerlogo\"

\n

Welcome

\n

Be our guest and have fun.

\n

install it

\n

First things first, let's get the enqueuer installed on your machine.

\n
$ npm install --global enqueuer\n
\n

Alright, it's time to create a requisition file.\nSomething like:

\n
#enqueuer-repo-hit.yml\npublishers:\n-   type: http\n    url: https://github.com/enqueuer-land/enqueuer\n    onResponseReceived:\n        assertions:\n        -   expect: statusCode\n            toBeEqualTo: 200\n
\n

Pretty simple, hum? Small and concise, how it should be!\nRun it:

\n
$ enqueuer enqueuer-repo-hit.yml\n
\n

What if I want to mock a http server, you may ask. Not a big deal for enqueuer lovers:

\n
timeout: -1\nsubscriptions:\n-   type: http\n    timeout: -1\n    name: mock endpoint\n    endpoint: /readme-example\n    port: 9085\n    method: POST\n    response:\n        status: 200\n        payload: mock response\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: `enqueuer`\n
\n

Now go ahead and try hitting it using the browser.\nTip: remove timeout values and check what happens.\nI told you it was simple.\nNow, let's say you want to mix different protocols to test a bit more complex flow.\nHow about publishing an amqp message and making sure that, once a service consumes that message an endpoint of your is hit?\nIn order to achieve that, we have to make use of a plugin, given that amqp support is provided by a plugin.\nIn this scenario, we're talking about the amqp plugin.\nOnce we get this plugin installed we are able to create and run files like this:

\n
publishers:\n-   type: amqp\n    payload: 123456\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.readme.routing.key\nsubscriptions:\n-   type: http\n    endpoint: /polyglot-flow\n    port: 8080\n    method: GET\n    response:\n        status: 200\n        payload: polyglot message\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: 123456\n
\n

Now go nuts!\nIt's all yours. Have fun.\nIf you want more examples about http, consider looking at this test.\nCheck this out, you'll find countless examples.\nCertainly one is what you need.

\n

if you need more

\n
$ nqr -h\nUsage: nqr [options] <test-file> [other-test-files...]\n\nTake a look at the full documentation: https://enqueuer.com\n\nOptions:\n  -v, --version                             output the version number\n  -b, --verbosity <level>                   set verbosity (default: \"warn\")\n  -c, --config-file <path>                  set configurationFile\n  -e, --parsers-list [parser]               list available object parsers\n  -f, --formatters-description [formatter]  describe report formatters\n  -o, --stdout-requisition-output           add stdout as requisition output\n  -m, --max-report-level-print <level>      set max report level print\n  -p, --protocols-description [protocol]    describe protocols\n  -t, --tests-list [expectedField]          list available tests assertions\n  -u, --loaded-modules-list                 list loaded modules\n  -i, --show-passing-tests                  show passing tests\n  -s, --store [store]                       add variables values to this session (default: [])\n  -l, --add-plugin [plugin]                 add plugin (default: [])\n  -a, --add-file <file>                     add file to be tested (default: [])\n  -A, --add-file-and-ignore-others <file>   add file to be tested and ignore others (default: [])\n  -h, --help                                output usage information\n\nExamples:\n  $ nqr --config-file config-file.yml --verbosity error --store key=value\n  $ enqueuer -c config-file.yml test-file.yml --add-file another-test-file.yml -b info\n  $ enqueuer test-file.yml --store someKey=true --store someOtherKey=false\n  $ nqr --protocols-description -s key=value\n  $ nqr -t expect\n  $ nqr -l my-enqueuer-plugin-name -p plugin-protocol\n  $ nqr -p http\n  $ nqr --formatters-description json\n
\n
\n

Components

\n

In order to accomplish more than just hitting enqueuer's repo or doing a quick self http hit, there are a few things that you'll probably need to know.\nDon't worry, it's not too much and, as mentioned earlier, there is a lot of examples here, just in case.\nThere are only three important component concepts: requisitions, publishers and subscriptions.\nThey work along with each other and are responsible for the full behavior of enqueuer.

\n

requisition

\n

Test scenario description. It tells what, when, and how test your applications and services.\nPicture it as if it was a collection of publishers, subscriptions and other requisitions.\nIt helps because this is exactly what it is.\nAs the others components, it has some attributes. All of them are optionals. And it supports multi-level test scenarios out of the box. Yeap, go as recursive as you want.\nEvery test file is a requisition.\nYou don't know some of these attributes values yet? Don't worry, just put a variable there and let enqueuer replace it with the value you set later.\nVariable replacements are available through the entire requisition.

\n
requisition attributes
\n

These are the requisition attributes:

\n

name
\nDescribes what the requisition is suppose to do.\nDefaults to requisition index.

\n
name: requisition action\n
\n

timeout
\nDefaults to 5000.\nSets in milliseconds how long the requisition waits to expire.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

delay
\nDefaults to 0. Sets in milliseconds how long the test waits before starting. Check this to get the full idea.

\n
delay: 0\n
\n

iterations
\nDefaults to 1. Sets how many times this test will be executed. Check this and this to get the full idea.

\n
iterations: 3\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this requisitions should be skipped. Check this to see it working.

\n
ignore: true\n
\n

parallel
\nDefaults to false. Immediate children requisitions should be executed in parallel mode.\nTake a look at this to see it working.

\n
parallel: true\n
\n

import
\nAllows requisition to be dynamically defined, be it by loading an external file or creating dynamically by other requisitions. Want to reuse the same requisition multiple times? This is you you need.\nTake a look at this to behold this feature.

\n
import: path/to/another/requisition/file\n
\n

publishers
\nList of publishers. They're executed simultaneously, therefore, the order is irrelevant.

\n
publishers:\n- name: some publisher name\n  type: http\n- type: tcp\n
\n

subscriptions
\nList of subscriptions. They're executed simultaneously, therefore, the order is irrelevant.

\n
subscriptions:\n- name: some subscription name\n  type: udp\n- name: another subscription name\n  type: file\n
\n

requisitions
\nA list of child scenarios. List of requisitions.\nBy default, they're executed sequentially, therefore, the order is relevant.\nUnless the parallel attribute is set to true, what makes them get executed simultaneously,\nCheck this example, it may help.

\n
requisitions:\n- name: some requisition name\n  iterations: 2\n- name: another requisition name\n  delay: 200\n
\n
events
\n

Available events are described here. A this object is available to access and change requisition attributes.

\n
name: my name\nonInit:\n  script: this.delay = 3000;\n  assertions:\n  - expectToBeDefined: this.name\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.name\n
\n

publisher

\n

A publisher action is triggered by enqueuer itself. It acts whereas a subscription reacts.\nIt publishes something, it writes, it enqueues, hits and endpoint... These kinds of actions.\nIt's worth noting that it always creates a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if the message got published.

\n
publisher attributes
\n

Every publisher has its own properties, depending on its protocol and implementation.\nThe built-in http publisher implementation, for instance, demands a url, a method, and a payload, if the method is not a GET.\nOn the other hand, the built-in tcp publisher implementation requires a serverAddress and a port.\nThese are the publisher attributes:

\n

name
\nDefaults to publisher index.\nDescribes what the publisher is supposed to do.

\n
name: publisher action\n
\n

type
\nMandatory. Key tag to identify which publisher will be instantiated

\n
type: http\n
\n

payload
\nSince a publisher usually publishes something, it's very likely you have to set a value here.\nThe message itself that will be send through this protocol. Be it a string, a number, a boolean value or even whole objects.

\n
payload: value\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this publisher should be skipped. Check this to see it working.

\n
ignore: true\n
\n
events
\n

Available events are described here. A this object is available to access and change publisher attributes.\nDepending on the protocol and its implementation, such as http and tcp, there may exist special events, such as onMessageReceived event and a special object given message.\nOn the other hand, an asynchronous protocol, like: udp and amqp, usually do not provide it.

\n
onInit:\n  script: this.ignore = false\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived: #Provided in synchronous protocols  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n

subscription

\n

A subscription is an \"under demand\" event. It reacts whereas a publisher acts.\nIt consumes something, it reads, it dequeues, gets hit... These kinds of actions.\nThis means that it is not triggered by enqueuer itself.\nRather than that, enqueuer waits on an external event to be triggered and then it asserts against the message that was passed to the subscription.\nIt's worth noting that it always receives a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if a message got received.

\n
subscription attributes
\n

Every subscription has its own properties, depending on its protocol and implementation.\nThe built-in http subscription implementation, for instance, demands an endpoint, a method, and a port, if the method is not a GET.\nOn the other hand, the built-in tcp subscription implementation requires only a port.

\n

These are the subscription attributes:

\n

name
\nDefaults to subscription index.\nDescribes what the subscription is supposed to do.

\n
name: subscription action\n
\n

type
\nMandatory. Key tag to identify which subscription will be instantiated

\n
type: http\n
\n

avoid
\nIdentifies whether or not this subscription should not receive any message. Defaults to false.\nIf set and a message is received a failing test will be generated.\nTake a look at this to see it working.\nOn the other hand, when it's false and no message is received in a given timeout. The subscription is valid.

\n
avoid: false\n
\n

timeout
\nSets in milliseconds how long the subscription waits to expire. Defaults to 3000.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this subscription should be skipped. Check this to see it working.

\n
ignore: true    \n
\n
events
\n

Available events are described here. A this object is available to access and change subscription attributes.

\n
onInit:\n  script: this.avoid = false;\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived:  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n
\n

Event

\n

Events are hook methods executed by enqueuer when an action occurs on publishers, subscriptions or requisitions.\nThis is where you'll write your tests. In its assertions field.\nThere will be a variable called this and, depending on the event's owner, it has an alias publisher, subscription or requisition.\nYou're free to explore them however you want, even doing things like this:

\n
publisher.parent.subscriptions[0].timeout = 1000;\n
\n

hooks

\n

By default, there are three hook events available:

\n

onInit
\nAvailable in requisitions, publishers and subscriptions. It gets executed as soon as the component is initialized.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

onFinish
\nAvailable in requisitions, publishers and subscriptions. It gets executed when the component is about to finish.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

custom\nDepending on the protocol implementation/library/author's mood, the publisher/subscription may have additional hooks.\nSuch as onError, onResponseReceived, onFileNotFound and onRedirect...\nHttp-proxy subscription test file is an excellent example, check it out.

\n

fields

\n

Every hook object has 3 properties:

\n

script
\nJavascript code snippet executed when the event is triggered.\nYeah, I mean it. See it it by yourself.\nBut be careful, with great power comes great responsibility.

\n

store
\nData to be persisted across requisitions.

\n

assertions
\nArray of assertions.\nRun $ nqr -t to see available ones.\nConsider looking at this test example.\nOf course, just like almost everything else in enqueuer world, you can extend this available list using some plugin.\nYou can check them out or even write your own.

\n
onInit:\n  script: variableIdentifier = 'string value'\n\n  assertions:\n  - expect: variableIdentifier\n    toBeEqualTo: `string value`\n\nonMessageReceived:\n  script: |-\n    message += 3;\n    console.log(`Message received plus 3 is: ${message}`);\n\n  store:\n    key: message\n\n  assertions:\n  - name: anyValue #optional\n    expect: message\n    toBeEqualTo: store.key\n  - expect: message + 3\n    toBeGreaterThan: 3\n
\n

event example

\n

Check this test file to see it in practice.

\n
\n

Requisition Flow

\n

Now that you know what are requisitions, publishers, subscriptions and events. How about seeing how they interact with each other in a fancier way?

\n

\"enqueuerInstanceFlow\"

\n
\n

Configuration File

\n

To save yourself some time, a configuration file may be used.\nConfiguration files tell enqueuer which tests will be executed, log-level, and which output test report files should be generated.\nThis file tells how enqueuer should be executed.\nTo run enqueuer with the configuration:

\n
$ nqr -c path/to/configuration/file.yml\n
\n

or

\n
$ nqr --config-file path/to/configuration/file.yml\n
\n

attributes

\n

These are the configuration file attributes:

\n

files
\nRequisition file names or glob. Enqueuer runs every file that matches an element value.

\n
files:\n- 1.yml\n- 2.yml\n- *.json\n
\n

parallel
\nDefaults to false. Requisition files should be executed in parallel mode. The requisition file itself is still sequential, but the files are executes in parallel.

\n
parallel: true\n
\n

log-level
\nDefaults to warning. Defines how information are logged in the console. Accepted values are: trace; debug; info; warning (default); error; and fatal.

\n
log-level: trace\n
\n

max-report-level-print
\nDefaults to 1. The deepest level of report to be printed to the console.

\n
max-report-level-print: 2\n
\n

plugins
\nList of in plugins used by the test scenarios. You can check them out or write your own.

\n
plugins:\n- enqueuer-plugin-amqp \n- enqueuer-plugin-ws \n- enqueuer-plugin-mqtt\n- enqueuer-plugin-html-report\n
\n

outputs
\nOnce enqueuer runs every execution, it compiles a summary and sends it to every publisher listed in output.\nAn important thing to note is that every available report publisher is available here.\nYes, it means that you are able to send this report through http, tcp, etc. or through a plugin one or a custom one.\nYou can run $ nqr -p to check available report publishers installed.\nAnother important thing to note is the format value. By default a json summary is generated, but you can change it to whatever format you would like, such as: Xunit, html\nYou can run $ nqr -f to check available installed formats or even write your own

\n
outputs:\n- type: file\n  format: json (default)\n  filename: output/examples.json\n- type: file\n  format: yml\n  filename: output/examples.yml\n- type: standard-output (default)\n  format: console\n
\n

store
\nValues defined here use the 'key: value' pattern and are available to every test scenario throughout the entire execution

\n
store:\n  variableKey: \"my value\" # Defines 'variableKey' key and its value 'my value'. \n  \n  'separated key': 6\n  \n  object: # You can even define whole objects here:\n    first: first value\n    second:\n      nested: thing\n
\n

example

\n

Here's a complete example of a configuration file.

\n
\n

Variables

\n

Providing power and flexibility, enqueuer allows you to use variables placeholder replacement.\nThat's why there is a store field and you'll see a lot of << and {{ being used in the examples files.\nIt works as simple as this:

\n
name: my name is <<variableKey>>\n
\n

Every time enqueuer sees these kind of notations, it searches in its store for a key/value pair like:

\n
variableKey: `enqueuer`\n
\n

Then, when enqueuer parses the original map, it gets translated to this:

\n
name: my name is enqueuer\n
\n

By default, every ENV_VAR set is loaded automatically to the store. Check this example.

\n

set a variable

\n

There are a few ways to set a value in the store.

\n
configuration file
\n

Configuration file store object. Set it as you wish, as you can see here

\n
command line
\n

A command line argument using the key=value format. This way:

\n
$ nqr --store key=value -s anotherVariable=true\n
\n
event
\n

Dynamically set it through any event.\nBe it in its script field or straight through its store field.\nBoth ways work:

\n
onInit:\n    script: store.key = 123;\n    store:\n        anotherKey: `another Value` \n
\n

use a variable

\n

There are two ways two use a variable:

\n
non js code snippet
\n

The easiest one is to type <<variableKey>> or {{variableKey}} where you want it to be replaced in a test file, as you can see here

\n
js code snippet
\n

Using the store object. It's attributes are the keys and their values are their respective values.\nTherefore, you're free to use store.variableKey, console.log(store.variableKey); or console.log(2 * store['separated key']); and get them.\nLike this one.

\n

variables example

\n

Check out this test example test to see it working.

\n
\n

Content File Injection

\n

You are able to inject file content into a requisition/publisher/subscription field.

\n
file: <<file://path/to/file.txt>>\n
\n

Other than that, enqueuer can read it and parse its content as an object using this familiar syntax: <<tag://path/to/file?query=value&other=true>>.

\n
requisition:\n    json: <<json://path/to/file.json>>\n    yml: <<yml://path/to/file.yml>>\n    csv: <<csv://path/to/file.csv?header=true&delimiter=;>>\n    file: <<file://path/to/file.txt>>\n
\n

Once the object is parsed, your free to use it as a regular object in any event

\n
onInit:\n    script: console.log(requisition.yml.deep.field);\nonFinish:\n    assertions:\n    -   expect: json.key\n        toBeEqualTo: csv[0].key\n
\n

It get's event better.\nDue its fantastic plugin architecture design, you can extend its default modules and use any of these plugins or event write your own to parse however you want.\nThe built-in modules for object parsers are: json, yml, csv and file.\nRun $ nqr -e to see available ones.

\n

example

\n

Check out this test example test to get a full picture of it.

\n
\n

Plugins

\n

You're probably aware by now but it doesn't hurt do emphasize it: enqueuer provides an amazingly powerful plugin extensible architecture.\nIt has several plugins available, but if none of them pleases you, you're free to create your own.\nAlbeit you don't have to share the one you created, we encourage you to do so. Then go ahead and publish yours to npm and add it to our plugins list.

\n

plugin types

\n

So far, you're able to extend enqueuer default behavior in four ways. Using a protocol plugin, an object parser plugin, an asserter plugin and using a report formatter plugin.

\n
protocol
\n

A protocol plugin enables you to use a different publisher/subscription types.\nRun $ nqr -p [protocol-name] to get the full available list:

\n
publishers: \n-   name:                  custom\n-   name:                  file\n-   name:                  http\n    messageReceivedParams: statusCode, statusMessage, body\n-   name:                  stdout\n-   name:                  tcp\n-   ...\nsubscriptions: \n-   name:                  custom\n-   name:                  file\n    messageReceivedParams: content, name, size, modified, created\n-   name:                  http\n    messageReceivedParams: headers, params, query, body\n-   name:                  stdin\n-   name:                  tcp\n    messageReceivedParams: payload, stream\n-   ...\n
\n

Each one listed above has a respective example in the examples folder.\nThis one, for instance, provides support for amqp protocol, so you can create this publisher and subscription:

\n
publishers:\n-   type: amqp\n    payload: enqueuermaniac\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.key\nsubscriptions:\n-   type: amqp\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.#\n    onMessageReceived:\n        assertions:\n        -   expect: payload\n            toBeEqualTo: `enqueuermaniac`\n
\n
object parser
\n

An object parser plugin enables you to read and parse files as you wish.\nThis test example demonstrates how to use it,\nRun $ nqr -e [object-parser-name] to check available ones:

\n
parsers: \n- yml, yaml\n- json\n- file\n- csv\n
\n

This one, for example, provides the ability to read xml files and inject their values like this:

\n
xmlContent: <<xml://path/to/xml/file.xml>>\n
\n
asserter
\n

An asserter plugin provides you a nicely way to use different assertions than these built-in ones.

\n
asserters: \n-   expect: \n        required:    true\n        type:        string, array\n        description: actual value\n    not: \n        required:    false\n        type:        null\n        description: negates\n    toContain: \n        required:    true\n        type:        string, any\n        description: element\n
\n

Looking at the asserter above, we can create assertions like these:

\n
assertions:\n-   expect: [`a`, 1, true]\n    not:\n    toContain: `b`\n-   expect: [`a`, 1, true]\n    toContain: 1\n
\n

Run $ nqr -t to get the full available list.\nConsider looking at this test example.

\n
report formatter
\n

A report formatter plugin gives you the ability to export enqueuer reports the way you want.\nRun $ nqr -f [formatter-name] to list available report formatters:

\n
formatters: \n- console, stdout\n- json\n- yml, yaml\n
\n

Consider looking at the example of configuration file to see it in use.\nThis one, for instance, generates xUnit like reports from enqueuer's output.

\n

plugin installation

\n

In order to enqueuer get awareness that you want to use a plugin, you have to tell it, right?\nYou can tell enqueuer to use a plugin in three different ways: using it as a command line argument, through the configuration file or letting enqueuer finding it in a default location.

\n
command line
\n

Tell enqueuer to use your plugin through command line this way $ nqr -l <plugin-folder> -l <another-plugin-folder>.\nWhere plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
configuration file
\n

Tell enqueuer to use your plugin through configuration file this way:

\n
plugins: \n-   plugin-folder\n-   another-plugin-folder\n
\n

Where plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
implicitly
\n

When enqueuer runs, it looks for modules in its same installation directory or in .nqr folder in the home directory, a.k.a. ~/ folder in linux distributions.\nTherefore, if you run:

\n
$ npm install --global enqueuer\n$ mkdir ~/.nqr\n$ cd ~/.nqr\n$ npm install enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

Or

\n
$ npm install --global enqueuer enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

You'll see that the enqueuer-plugin-amqp plugin will be loaded.\nEvery enqueuer compatible module gets implicitly loaded.\nIn order to be enqueuer compatible, a module has to have an entryPoint exported function in its main file and, in its package.json file, it has to have either 'enqueuer' or 'nqr' as keywords.

\n

Stacker

\n

Looking for a really really good looking an human error proof solution way of writing these requisition files?
\nConsider taking a look at stacker: open source, cross-platform, multi protocol client testing tool.\nThe official enqueuer's best friend forever. Do amazing things and change the world with enqueuer’s GUI!\nWith them, you create, manage and run requisitions and and see their results in a really nice way.\nSee this amazing beauty with your own eyes to get an idea of how it works:

\n

\"screenshot-passing\"

\n
\n

Open source

\n

We (by 'we' we mean enqueuer's maintainers not the human race, unfortunately) are very opened to any kind of contributions in general.\nAs long as they make sense and add value to the product, you're free to go.\nWe mean it, do it. Even if it's a typo fix in this README file. Go ahead.\nIf you like it but don't want to waste time creating a pull request, no problem either.\nCreate an issue, or, even easier, give it a github star. It's cheap and it doesn't hurt anyone.\nYou know what? Just head up to enqueuer's github repo and keep staring at its repo.\nIt may help somehow.

\n

contributors

\n

Thank you. It sounds cliché, but this project wouldn't be the same without the massive contribution from everyone.

\n

code it

\n

In order to contribute with some code, you have to follow a few steps.\nFirst of all, get the code:

\n
$ git clone git@github.com:enqueuer-land/enqueuer.git\n$ cd enqueuer\n
\n

Get its dependencies installed:

\n
$ npm install\n
\n

Build it:

\n
$ npm run build\n
\n

Go for it. Make the changes you want.\nAfter everything is done:

\n
$ npm run all\n
\n

Commit it:

\n
$ npm run commit\n
\n

Push it:

\n
$ git push\n
\n

feedback

\n

We'd love to get your feedback!\nIf you have any comments, suggestions, etc. you can reach us here.

\n

\"NPM\"

\n
\n
\n
\n\n\n\n
\n
\n\n
\n
\n \n\n
\n\n \n
\n
\n \n\n \n \n\n \n
\n
\n \n
\n
\n\n\n\n
\n \n \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n \n \n
\n \n\n
\n
\n
\n
\n\n \n \n\n
\n\n \n\n\n" + body: "\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n\n\n\n \n \n \n \n \n \n \n\n\n \n \n GitHub - enqueuer-land/enqueuer: Multi protocol microservice testing tool\n \n \n \n \n\n \n \n\n \n \n \n\n \n\n\n\n \n\n \n\n \n\n \n \n \n\n \n\n\n\n\n \n\n\n\n\n\n\n \n\n \n \n\n \n\n\n \n\n \n \n\n \n\n \n\n \n\n\n \n\n\n \n\n \n\n \n \n\n\n\n\n \n\n \n\n \n \n\n
\n Skip to content\n \n \n \n\n \n \n\n\n\n
\n
\n
\n \n \n \n
\n\n
\n
\n \n
\n\n \n\n \n
\n
\n
\n\n
\n\n
\n\n\n
\n\n
\n\n\n\n\n
\n
\n
\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n
\n\n
\n\n
\n

\n \n \n enqueuer-land\n \n /\n \n enqueuer\n \n \n

\n\n\n
\n\n \n\n
\n \n\n\n\n
\n
\n
\n\n \n \n \n\n\n
\n \n Multi protocol microservice testing tool\n \n https://enqueuer.com\n
\n
\n\n \n\n\n\n \n\n
\n \n
\n TypeScript\n HTML\n JavaScript\n Shell\n
\n
\n \n
\n\n\n\n\n\n\n
\n \n
\n \n Branch:\n master\n \n \n\n \n
\n \n \n \n
\n
\n
\n\n\n \n\n
\n \n
\n\n
\n\n Find file\n
\n\n \n\n\n \n\n
\n \n Clone or download\n \n
\n
\n\n
\n
\n\n

\n Clone with HTTPS\n \n \n \n

\n

\n Use Git or checkout with SVN using the web URL.\n

\n\n
\n \n
\n \n
\n
\n\n
\n\n \n
\n\n \n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching Xcode

\n

If nothing happens, download Xcode and try again.

\n

\n
\n\n
\n

Launching Visual Studio

\n

If nothing happens, download the GitHub extension for Visual Studio and try again.

\n

\n
\n\n
\n
\n
\n\n\n
\n\n\n\n\n\n
\n \n
\n
\n \n \"@virgs\"\n
\n
\n\n \n
\n \n \n \n Latest commit\n \n df5799a\n \n Feb 2, 2020\n
\n
\n\n\n\n
\n Permalink\n\n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TypeNameLatest commit messageCommit time
Failed to load latest commit information.
\n \n \"\"\n \n .github/ISSUE_TEMPLATE\n \n \n Update bug_report.md\n \n \n Mar 4, 2019\n
\n \n \"\"\n \n conf\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n docs\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n examples\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n https-cert\n \n \n Adding support to https\n \n \n Aug 9, 2018\n
\n \n \"\"\n \n misc\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n output\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n src\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n temp\n \n \n #19 adding attempting to create a topic at kafka\n \n \n Oct 3, 2018\n
\n \n \"\"\n \n .codeclimate.yml\n \n \n Updating .codeclimate\n \n \n Sep 24, 2018\n
\n \n \"\"\n \n .gitignore\n \n \n docs(README): Improve docs\n \n \n Mar 23, 2019\n
\n \n \"\"\n \n .npmignore\n \n \n Removing SummaryTestOutput dependency with Configuration and start te…\n \n \n Mar 10, 2019\n
\n \n \"\"\n \n .travis.yml\n \n \n feat(dynamic-modules-manager): Look for a ~/.nqr folder to load plugi…\n \n \n Mar 22, 2019\n
\n \n \"\"\n \n CNAME\n \n \n Create CNAME\n \n \n May 10, 2019\n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n chore(Automatic Release): Add automatic release with semantic-release.\n \n \n Mar 21, 2019\n
\n \n \"\"\n \n License\n \n \n Creating License\n \n \n Mar 10, 2018\n
\n \n \"\"\n \n README.md\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n package-lock.json\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n package.json\n \n \n chore(Dependencies): Update dependencies\n \n \n Jul 5, 2019\n
\n \n \"\"\n \n tsconfig.json\n \n \n feat(NotificationEmitter): Create the concept of Notification and Not…\n \n \n May 24, 2019\n
\n \n \"\"\n \n tslint.json\n \n \n Subscription refactoring\n \n \n Mar 12, 2019\n
\n\n
\n\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n
\n
\n
\n
\n
\n\n
\n

\"npm\"\n\"Build\n\"Greenkeeper\n\"Known\n\"License:

\n

\"enqueuerlogo\"

\n

Welcome

\n

Be our guest and have fun.

\n

install it

\n

First things first, let's get the enqueuer installed on your machine.

\n
$ npm install --global enqueuer\n
\n

Alright, it's time to create a requisition file.\nSomething like:

\n
#enqueuer-repo-hit.yml\npublishers:\n-   type: http\n    url: https://github.com/enqueuer-land/enqueuer\n    onResponseReceived:\n        assertions:\n        -   expect: statusCode\n            toBeEqualTo: 200\n
\n

Pretty simple, hum? Small and concise, how it should be!\nRun it:

\n
$ enqueuer enqueuer-repo-hit.yml\n
\n

What if I want to mock a http server, you may ask. Not a big deal for enqueuer lovers:

\n
timeout: -1\nsubscriptions:\n-   type: http\n    timeout: -1\n    name: mock endpoint\n    endpoint: /readme-example\n    port: 9085\n    method: POST\n    response:\n        status: 200\n        payload: mock response\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: `enqueuer`\n
\n

Now go ahead and try hitting it using the browser.\nTip: remove timeout values and check what happens.\nI told you it was simple.\nNow, let's say you want to mix different protocols to test a bit more complex flow.\nHow about publishing an amqp message and making sure that, once a service consumes that message an endpoint of your is hit?\nIn order to achieve that, we have to make use of a plugin, given that amqp support is provided by a plugin.\nIn this scenario, we're talking about the amqp plugin.\nOnce we get this plugin installed we are able to create and run files like this:

\n
publishers:\n-   type: amqp\n    payload: 123456\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.readme.routing.key\nsubscriptions:\n-   type: http\n    endpoint: /polyglot-flow\n    port: 8080\n    method: GET\n    response:\n        status: 200\n        payload: polyglot message\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: 123456\n
\n

Now go nuts!\nIt's all yours. Have fun.\nIf you want more examples about http, consider looking at this test.\nCheck this out, you'll find countless examples.\nCertainly one is what you need.

\n

if you need more

\n
$ nqr -h\nUsage: nqr [options] <test-file> [other-test-files...]\n\nTake a look at the full documentation: https://enqueuer.com\n\nOptions:\n  -v, --version                             output the version number\n  -b, --verbosity <level>                   set verbosity (default: \"warn\")\n  -c, --config-file <path>                  set configurationFile\n  -e, --parsers-list [parser]               list available object parsers\n  -f, --formatters-description [formatter]  describe report formatters\n  -o, --stdout-requisition-output           add stdout as requisition output\n  -m, --max-report-level-print <level>      set max report level print\n  -p, --protocols-description [protocol]    describe protocols\n  -t, --tests-list [expectedField]          list available tests assertions\n  -u, --loaded-modules-list                 list loaded modules\n  -i, --show-passing-tests                  show passing tests\n  -s, --store [store]                       add variables values to this session (default: [])\n  -l, --add-plugin [plugin]                 add plugin (default: [])\n  -a, --add-file <file>                     add file to be tested (default: [])\n  -A, --add-file-and-ignore-others <file>   add file to be tested and ignore others (default: [])\n  -h, --help                                output usage information\n\nExamples:\n  $ nqr --config-file config-file.yml --verbosity error --store key=value\n  $ enqueuer -c config-file.yml test-file.yml --add-file another-test-file.yml -b info\n  $ enqueuer test-file.yml --store someKey=true --store someOtherKey=false\n  $ nqr --protocols-description -s key=value\n  $ nqr -t expect\n  $ nqr -l my-enqueuer-plugin-name -p plugin-protocol\n  $ nqr -p http\n  $ nqr --formatters-description json\n  \nContributing:\n  https://github.com/enqueuer-land/enqueuer\n
\n
\n

Components

\n

In order to accomplish more than just hitting enqueuer's repo or doing a quick self http hit, there are a few things that you'll probably need to know.\nDon't worry, it's not too much and, as mentioned earlier, there is a lot of examples here, just in case.\nThere are only three important component concepts: requisitions, publishers and subscriptions.\nThey work along with each other and are responsible for the full behavior of enqueuer.

\n

requisition

\n

Test scenario description. It tells what, when, and how test your applications and services.\nPicture it as if it was a collection of publishers, subscriptions and other requisitions.\nIt helps because this is exactly what it is.\nAs the others components, it has some attributes. All of them are optionals. And it supports multi-level test scenarios out of the box. Yeap, go as recursive as you want.\nEvery test file is a requisition.\nYou don't know some of these attributes values yet? Don't worry, just put a variable there and let enqueuer replace it with the value you set later.\nVariable replacements are available through the entire requisition.

\n
requisition attributes
\n

These are the requisition attributes:

\n

name
\nDescribes what the requisition is suppose to do.\nDefaults to requisition index.

\n
name: requisition action\n
\n

timeout
\nDefaults to 5000.\nSets in milliseconds how long the requisition waits to expire.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

delay
\nDefaults to 0. Sets in milliseconds how long the test waits before starting. Check this to get the full idea.

\n
delay: 0\n
\n

iterations
\nDefaults to 1. Sets how many times this test will be executed. Check this and this to get the full idea.

\n
iterations: 3\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this requisitions should be skipped. Check this to see it working.

\n
ignore: true\n
\n

parallel
\nDefaults to false. Immediate children requisitions should be executed in parallel mode.\nTake a look at this to see it working.

\n
parallel: true\n
\n

import
\nAllows requisition to be dynamically defined, be it by loading an external file or creating dynamically by other requisitions. Want to reuse the same requisition multiple times? This is you you need.\nTake a look at this to behold this feature.

\n
import: path/to/another/requisition/file\n
\n

publishers
\nList of publishers. They're executed simultaneously, therefore, the order is irrelevant.

\n
publishers:\n- name: some publisher name\n  type: http\n- type: tcp\n
\n

subscriptions
\nList of subscriptions. They're executed simultaneously, therefore, the order is irrelevant.

\n
subscriptions:\n- name: some subscription name\n  type: udp\n- name: another subscription name\n  type: file\n
\n

requisitions
\nA list of child scenarios. List of requisitions.\nBy default, they're executed sequentially, therefore, the order is relevant.\nUnless the parallel attribute is set to true, what makes them get executed simultaneously,\nCheck this example, it may help.

\n
requisitions:\n- name: some requisition name\n  iterations: 2\n- name: another requisition name\n  delay: 200\n
\n
events
\n

Available events are described here. A this object is available to access and change requisition attributes.

\n
name: my name\nonInit:\n  script: this.delay = 3000;\n  assertions:\n  - expectToBeDefined: this.name\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.name\n
\n

publisher

\n

A publisher action is triggered by enqueuer itself. It acts whereas a subscription reacts.\nIt publishes something, it writes, it enqueues, hits and endpoint... These kinds of actions.\nIt's worth noting that it always creates a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if the message got published.

\n
publisher attributes
\n

Every publisher has its own properties, depending on its protocol and implementation.\nThe built-in http publisher implementation, for instance, demands a url, a method, and a payload, if the method is not a GET.\nOn the other hand, the built-in tcp publisher implementation requires a serverAddress and a port.\nThese are the publisher attributes:

\n

name
\nDefaults to publisher index.\nDescribes what the publisher is supposed to do.

\n
name: publisher action\n
\n

type
\nMandatory. Key tag to identify which publisher will be instantiated

\n
type: http\n
\n

payload
\nSince a publisher usually publishes something, it's very likely you have to set a value here.\nThe message itself that will be send through this protocol. Be it a string, a number, a boolean value or even whole objects.

\n
payload: value\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this publisher should be skipped. Check this to see it working.

\n
ignore: true\n
\n
events
\n

Available events are described here. A this object is available to access and change publisher attributes.\nDepending on the protocol and its implementation, such as http and tcp, there may exist special events, such as onMessageReceived event and a special object given message.\nOn the other hand, an asynchronous protocol, like: udp and amqp, usually do not provide it.

\n
onInit:\n  script: this.ignore = false\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived: #Provided in synchronous protocols  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n

subscription

\n

A subscription is an \"under demand\" event. It reacts whereas a publisher acts.\nIt consumes something, it reads, it dequeues, gets hit... These kinds of actions.\nThis means that it is not triggered by enqueuer itself.\nRather than that, enqueuer waits on an external event to be triggered and then it asserts against the message that was passed to the subscription.\nIt's worth noting that it always receives a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if a message got received.

\n
subscription attributes
\n

Every subscription has its own properties, depending on its protocol and implementation.\nThe built-in http subscription implementation, for instance, demands an endpoint, a method, and a port, if the method is not a GET.\nOn the other hand, the built-in tcp subscription implementation requires only a port.

\n

These are the subscription attributes:

\n

name
\nDefaults to subscription index.\nDescribes what the subscription is supposed to do.

\n
name: subscription action\n
\n

type
\nMandatory. Key tag to identify which subscription will be instantiated

\n
type: http\n
\n

avoid
\nIdentifies whether or not this subscription should not receive any message. Defaults to false.\nIf set and a message is received a failing test will be generated.\nTake a look at this to see it working.\nOn the other hand, when it's false and no message is received in a given timeout. The subscription is valid.

\n
avoid: false\n
\n

timeout
\nSets in milliseconds how long the subscription waits to expire. Defaults to 3000.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this subscription should be skipped. Check this to see it working.

\n
ignore: true    \n
\n
events
\n

Available events are described here. A this object is available to access and change subscription attributes.

\n
onInit:\n  script: this.avoid = false;\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived:  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n
\n

Event

\n

Events are hook methods executed by enqueuer when an action occurs on publishers, subscriptions or requisitions.\nThis is where you'll write your tests. In its assertions field.\nThere will be a variable called this and, depending on the event's owner, it has an alias publisher, subscription or requisition.\nYou're free to explore them however you want, even doing things like this:

\n
publisher.parent.subscriptions[0].timeout = 1000;\n
\n

hooks

\n

By default, there are three hook events available:

\n

onInit
\nAvailable in requisitions, publishers and subscriptions. It gets executed as soon as the component is initialized.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

onFinish
\nAvailable in requisitions, publishers and subscriptions. It gets executed when the component is about to finish.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

custom\nDepending on the protocol implementation/library/author's mood, the publisher/subscription may have additional hooks.\nSuch as onError, onResponseReceived, onFileNotFound and onRedirect...\nHttp-proxy subscription test file is an excellent example, check it out.

\n

fields

\n

Every hook object has 3 properties:

\n

script
\nJavascript code snippet executed when the event is triggered.\nYeah, I mean it. See it it by yourself.\nBut be careful, with great power comes great responsibility.

\n

store
\nData to be persisted across requisitions.

\n

assertions
\nArray of assertions.\nRun $ nqr -t to see available ones.\nConsider looking at this test example.\nOf course, just like almost everything else in enqueuer world, you can extend this available list using some plugin.\nYou can check them out or even write your own.

\n
onInit:\n  script: variableIdentifier = 'string value'\n\n  assertions:\n  - expect: variableIdentifier\n    toBeEqualTo: `string value`\n\nonMessageReceived:\n  script: |-\n    message += 3;\n    console.log(`Message received plus 3 is: ${message}`);\n\n  store:\n    key: message\n\n  assertions:\n  - name: anyValue #optional\n    expect: message\n    toBeEqualTo: store.key\n  - expect: message + 3\n    toBeGreaterThan: 3\n
\n

event example

\n

Check this test file to see it in practice.

\n
\n

Requisition Flow

\n

Now that you know what are requisitions, publishers, subscriptions and events. How about seeing how they interact with each other in a fancier way?

\n

\"enqueuerInstanceFlow\"

\n
\n

Configuration File

\n

To save yourself some time, a configuration file may be used.\nConfiguration files tell enqueuer which tests will be executed, log-level, and which output test report files should be generated.\nThis file tells how enqueuer should be executed.\nTo run enqueuer with the configuration:

\n
$ nqr -c path/to/configuration/file.yml\n
\n

or

\n
$ nqr --config-file path/to/configuration/file.yml\n
\n

attributes

\n

These are the configuration file attributes:

\n

files
\nRequisition file names or glob. Enqueuer runs every file that matches an element value.

\n
files:\n- 1.yml\n- 2.yml\n- *.json\n
\n

parallel
\nDefaults to false. Requisition files should be executed in parallel mode. The requisition file itself is still sequential, but the files are executes in parallel.

\n
parallel: true\n
\n

log-level
\nDefaults to warning. Defines how information are logged in the console. Accepted values are: trace; debug; info; warning (default); error; and fatal.

\n
log-level: trace\n
\n

max-report-level-print
\nDefaults to 1. The deepest level of report to be printed to the console.

\n
max-report-level-print: 2\n
\n

plugins
\nList of in plugins used by the test scenarios. You can check them out or write your own.

\n
plugins:\n- enqueuer-plugin-amqp \n- enqueuer-plugin-ws \n- enqueuer-plugin-mqtt\n- enqueuer-plugin-html-report\n
\n

outputs
\nOnce enqueuer runs every execution, it compiles a summary and sends it to every publisher listed in output.\nAn important thing to note is that every available report publisher is available here.\nYes, it means that you are able to send this report through http, tcp, etc. or through a plugin one or a custom one.\nYou can run $ nqr -p to check available report publishers installed.\nAnother important thing to note is the format value. By default a json summary is generated, but you can change it to whatever format you would like, such as: Xunit, html\nYou can run $ nqr -f to check available installed formats or even write your own

\n
outputs:\n- type: file\n  format: json (default)\n  filename: output/examples.json\n- type: file\n  format: yml\n  filename: output/examples.yml\n- type: standard-output (default)\n  format: console\n
\n

store
\nValues defined here use the 'key: value' pattern and are available to every test scenario throughout the entire execution

\n
store:\n  variableKey: \"my value\" # Defines 'variableKey' key and its value 'my value'. \n  \n  'separated key': 6\n  \n  object: # You can even define whole objects here:\n    first: first value\n    second:\n      nested: thing\n
\n

example

\n

Here's a complete example of a configuration file.

\n
\n

Variables

\n

Providing power and flexibility, enqueuer allows you to use variables placeholder replacement.\nThat's why there is a store field and you'll see a lot of << and {{ being used in the examples files.\nIt works as simple as this:

\n
name: my name is <<variableKey>>\n
\n

Every time enqueuer sees these kind of notations, it searches in its store for a key/value pair like:

\n
variableKey: `enqueuer`\n
\n

Then, when enqueuer parses the original map, it gets translated to this:

\n
name: my name is enqueuer\n
\n

By default, every ENV_VAR set is loaded automatically to the store. Check this example.

\n

set a variable

\n

There are a few ways to set a value in the store.

\n
configuration file
\n

Configuration file store object. Set it as you wish, as you can see here

\n
command line
\n

A command line argument using the key=value format. This way:

\n
$ nqr --store key=value -s anotherVariable=true\n
\n
event
\n

Dynamically set it through any event.\nBe it in its script field or straight through its store field.\nBoth ways work:

\n
onInit:\n    script: store.key = 123;\n    store:\n        anotherKey: `another Value` \n
\n

use a variable

\n

There are two ways two use a variable:

\n
non js code snippet
\n

The easiest one is to type <<variableKey>> or {{variableKey}} where you want it to be replaced in a test file, as you can see here

\n
js code snippet
\n

Using the store object. It's attributes are the keys and their values are their respective values.\nTherefore, you're free to use store.variableKey, console.log(store.variableKey); or console.log(2 * store['separated key']); and get them.\nLike this one.

\n

variables example

\n

Check out this test example test to see it working.

\n
\n

Content File Injection

\n

You are able to inject file content into a requisition/publisher/subscription field.

\n
file: <<file://path/to/file.txt>>\n
\n

Other than that, enqueuer can read it and parse its content as an object using this familiar syntax: <<tag://path/to/file?query=value&other=true>>.

\n
requisition:\n    json: <<json://path/to/file.json>>\n    yml: <<yml://path/to/file.yml>>\n    csv: <<csv://path/to/file.csv?header=true&delimiter=;>>\n    file: <<file://path/to/file.txt>>\n
\n

Once the object is parsed, your free to use it as a regular object in any event

\n
onInit:\n    script: console.log(requisition.yml.deep.field);\nonFinish:\n    assertions:\n    -   expect: json.key\n        toBeEqualTo: csv[0].key\n
\n

It get's event better.\nDue its fantastic plugin architecture design, you can extend its default modules and use any of these plugins or event write your own to parse however you want.\nThe built-in modules for object parsers are: json, yml, csv and file.\nRun $ nqr -e to see available ones.

\n

example

\n

Check out this test example test to get a full picture of it.

\n
\n

Plugins

\n

You're probably aware by now but it doesn't hurt do emphasize it: enqueuer provides an amazingly powerful plugin extensible architecture.\nIt has several plugins available, but if none of them pleases you, you're free to create your own.\nAlbeit you don't have to share the one you created, we encourage you to do so. Then go ahead and publish yours to npm and add it to our plugins list.

\n

plugin types

\n

So far, you're able to extend enqueuer default behavior in four ways. Using a protocol plugin, an object parser plugin, an asserter plugin and using a report formatter plugin.

\n
protocol
\n

A protocol plugin enables you to use a different publisher/subscription types.\nRun $ nqr -p [protocol-name] to get the full available list:

\n
publishers: \n-   name:                  custom\n-   name:                  file\n-   name:                  http\n    messageReceivedParams: statusCode, statusMessage, body\n-   name:                  stdout\n-   name:                  tcp\n-   ...\nsubscriptions: \n-   name:                  custom\n-   name:                  file\n    messageReceivedParams: content, name, size, modified, created\n-   name:                  http\n    messageReceivedParams: headers, params, query, body\n-   name:                  stdin\n-   name:                  tcp\n    messageReceivedParams: payload, stream\n-   ...\n
\n

Each one listed above has a respective example in the examples folder.\nThis one, for instance, provides support for amqp protocol, so you can create this publisher and subscription:

\n
publishers:\n-   type: amqp\n    payload: enqueuermaniac\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.key\nsubscriptions:\n-   type: amqp\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.#\n    onMessageReceived:\n        assertions:\n        -   expect: payload\n            toBeEqualTo: `enqueuermaniac`\n
\n
object parser
\n

An object parser plugin enables you to read and parse files as you wish.\nThis test example demonstrates how to use it,\nRun $ nqr -e [object-parser-name] to check available ones:

\n
parsers: \n- yml, yaml\n- json\n- file\n- csv\n
\n

This one, for example, provides the ability to read xml files and inject their values like this:

\n
xmlContent: <<xml://path/to/xml/file.xml>>\n
\n
asserter
\n

An asserter plugin provides you a nicely way to use different assertions than these built-in ones.

\n
asserters: \n-   expect: \n        required:    true\n        type:        string, array\n        description: actual value\n    not: \n        required:    false\n        type:        null\n        description: negates\n    toContain: \n        required:    true\n        type:        string, any\n        description: element\n
\n

Looking at the asserter above, we can create assertions like these:

\n
assertions:\n-   expect: [`a`, 1, true]\n    not:\n    toContain: `b`\n-   expect: [`a`, 1, true]\n    toContain: 1\n
\n

Run $ nqr -t to get the full available list.\nConsider looking at this test example.

\n
report formatter
\n

A report formatter plugin gives you the ability to export enqueuer reports the way you want.\nRun $ nqr -f [formatter-name] to list available report formatters:

\n
formatters: \n- console, stdout\n- json\n- yml, yaml\n
\n

Consider looking at the example of configuration file to see it in use.\nThis one, for instance, generates xUnit like reports from enqueuer's output.

\n

plugin installation

\n

In order to enqueuer get awareness that you want to use a plugin, you have to tell it, right?\nYou can tell enqueuer to use a plugin in three different ways: using it as a command line argument, through the configuration file or letting enqueuer finding it in a default location.

\n
command line
\n

Tell enqueuer to use your plugin through command line this way $ nqr -l <plugin-folder> -l <another-plugin-folder>.\nWhere plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
configuration file
\n

Tell enqueuer to use your plugin through configuration file this way:

\n
plugins: \n-   plugin-folder\n-   another-plugin-folder\n
\n

Where plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
implicitly
\n

When enqueuer runs, it looks for modules in its same installation directory or in .nqr folder in the home directory, a.k.a. ~/ folder in linux distributions.\nTherefore, if you run:

\n
$ npm install --global enqueuer\n$ mkdir ~/.nqr\n$ cd ~/.nqr\n$ npm install enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

Or

\n
$ npm install --global enqueuer enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

You'll see that the enqueuer-plugin-amqp plugin will be loaded.\nEvery enqueuer compatible module gets implicitly loaded.\nIn order to be enqueuer compatible, a module has to have an entryPoint exported function in its main file and, in its package.json file, it has to have either 'enqueuer' or 'nqr' as keywords.

\n

Stacker

\n

Looking for a really really good looking an human error proof solution way of writing these requisition files?
\nConsider taking a look at stacker: open source, cross-platform, multi protocol client testing tool.\nThe official enqueuer's best friend forever. Do amazing things and change the world with enqueuer’s GUI!\nWith them, you create, manage and run requisitions and and see their results in a really nice way.\nSee this amazing beauty with your own eyes to get an idea of how it works:

\n

\"screenshot-passing\"

\n
\n

Open source

\n

We (by 'we' we mean enqueuer's maintainers not the human race, unfortunately) are very opened to any kind of contributions in general.\nAs long as they make sense and add value to the product, you're free to go.\nWe mean it, do it. Even if it's a typo fix in this README file. Go ahead.\nIf you like it but don't want to waste time creating a pull request, no problem either.\nCreate an issue, or, even easier, give it a github star. It's cheap and it doesn't hurt anyone.\nYou know what? Just head up to enqueuer's github repo and keep staring at its repo.\nIt may help somehow.

\n

contributors

\n

Thank you. It sounds cliché, but this project wouldn't be the same without the massive contribution from everyone.

\n

code it

\n

In order to contribute with some code, you have to follow a few steps.\nFirst of all, get the code:

\n
$ git clone git@github.com:enqueuer-land/enqueuer.git\n$ cd enqueuer\n
\n

Get its dependencies installed:

\n
$ npm install\n
\n

Build it:

\n
$ npm run build\n
\n

Go for it. Make the changes you want.\nAfter everything is done:

\n
$ npm run all\n
\n

Commit it:

\n
$ npm run commit\n
\n

Push it:

\n
$ git push\n
\n

feedback

\n

We'd love to get your feedback!\nIf you have any comments, suggestions, etc. you can reach us here.

\n

\"NPM\"

\n
\n
\n
\n\n\n\n\n
\n
\n\n
\n
\n \n\n
\n\n \n
\n
\n \n\n \n \n\n \n
\n
\n \n
\n
\n\n\n\n
\n \n \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n \n \n
\n \n\n
\n
\n
\n
\n\n \n \n\n
\n\n \n\n\n" headers: - date: 'Sun, 02 Feb 2020 16:26:10 GMT' + date: 'Fri, 07 Feb 2020 18:11:15 GMT' content-type: 'text/html; charset=utf-8' transfer-encoding: chunked connection: close server: GitHub.com status: '200 OK' vary: 'X-PJAX, Accept-Encoding' - etag: 'W/"77cca0288c88302b3b1d550457de96ac"' + etag: 'W/"e1412e136159ccfd75d7677e8910d8c0"' cache-control: 'max-age=0, private, must-revalidate' set-cookie: - - 'has_recent_activity=1; path=/; expires=Sun, 02 Feb 2020 17:26:09 -0000' - - '_octo=GH1.1.506107453.1580660769; domain=.github.com; path=/; expires=Tue, 02 Feb 2021 16:26:09 -0000' - - 'logged_in=no; domain=.github.com; path=/; expires=Tue, 02 Feb 2021 16:26:10 -0000; secure; HttpOnly' - - '_gh_sess=N2ladHJ3cWVmMzhtbEMvenJNMUZpL3NUUklyY3ZubGtGOUNJYWpOajZaTmRsUnVnV3UwNlZqWnRudkdQRUNzMWNVOGxtaDRpdXA2eGVFYXhqU3RraE15OXlUODVvQzY5czNBcGJoZkZuSjRmcjg4dm4yNGNPSmVscUI0RWM0ZExiMnZmQklGMEZ6bUJrNHFFZ0Q2NXp1OG1DbGhMdERrZ2NkbStGQkZhandqdnZGVkg4US8wdFJyelk1RUVjSDhzMGJJc3R2QThLQW1oK0tYWWNBS2RnOVBtb05wNzhFQllERnJiZDZJdFU0dz0tLVNGVzdEdm5tbVkxWU5yZUh0eng3amc9PQ%3D%3D--9c25bbc5296648c26501c2cc7734a15e76b18c37; path=/; secure; HttpOnly' + - '_octo=GH1.1.1893030294.1581099075; domain=.github.com; path=/; expires=Sun, 07 Feb 2021 18:11:15 -0000' + - 'logged_in=no; domain=.github.com; path=/; expires=Sun, 07 Feb 2021 18:11:15 -0000; secure; HttpOnly' + - '_gh_sess=RzUzdTUwSW1WaDE0czJUUndOdXQrcHhyYURqVEhlMEIwdmEvRFRCMDlRMXVKMGVmcnVKNUMya1RNd0MyMFpxMjI3My9lMzY1ZmVFVEJjaHQ2bzJxVVB3Um5SSmpMdzk3cVFtZ3JmNE80bk0ra2FzenpqakFsNWVtcjUrVlA4b3dFNXhEMDRqVDhncER3M2N0aVRoVFJTUVFTV1V1VXVEcTg2M2hEcWxVbHR2NG05WFd1eHRQSmhaVm9sdERSQ3hJdmx2VGJtdEVhbU8zSFA5dk9LQ2R4bm1QSC82TkRhcHZ2UmVaYjY4NXRyZz0tLUVzRXdyS3JjUUlBcFlHcElPaVpVVHc9PQ%3D%3D--ef74ccf4768e9eddea233bbcbd01261874ce5574; path=/; secure; HttpOnly' strict-transport-security: 'max-age=31536000; includeSubdomains; preload' x-frame-options: deny x-content-type-options: nosniff x-xss-protection: '1; mode=block' expect-ct: 'max-age=2592000, report-uri="https://api.github.com/_private/browser/errors"' content-security-policy: 'default-src ''none''; base-uri ''self''; block-all-mixed-content; connect-src ''self'' uploads.github.com www.githubstatus.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src github.githubassets.com; form-action ''self'' github.com gist.github.com; frame-ancestors ''none''; frame-src render.githubusercontent.com; img-src ''self'' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com; manifest-src ''self''; media-src ''none''; script-src github.githubassets.com; style-src ''unsafe-inline'' github.githubassets.com' - x-github-request-id: 'C54B:3612:3DA02F:56BFF8:5E36F821' + x-github-request-id: 'CC0D:4DF2:22A3BF:301B8A:5E3DA842' request: uri: protocol: 'https:' @@ -4134,29 +4153,28 @@ requisitions: onMessageReceived: arguments: statusCode: 200 - body: "\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n\n\n\n \n \n \n \n \n \n \n\n\n \n \n GitHub - enqueuer-land/enqueuer: Multi protocol microservice testing tool\n \n \n \n \n\n \n \n\n \n \n \n\n \n\n\n\n \n\n \n\n \n \n \n\n \n\n\n\n\n \n\n\n\n\n\n\n \n\n \n \n\n \n\n\n \n\n \n \n\n \n\n \n\n \n\n\n \n\n\n \n\n \n\n \n \n\n\n\n\n \n\n \n\n \n \n\n
\n Skip to content\n \n \n \n\n \n \n \n\n\n
\n
\n
\n \n \n \n
\n\n
\n
\n \n
\n\n \n\n \n
\n
\n
\n\n
\n\n
\n\n\n
\n\n
\n\n\n\n
\n
\n
\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n
\n\n
\n\n
\n

\n \n \n enqueuer-land\n \n /\n \n enqueuer\n \n \n

\n\n\n
\n\n \n\n
\n \n\n\n\n
\n
\n
\n\n \n \n \n\n\n
\n \n Multi protocol microservice testing tool\n \n https://enqueuer.com\n
\n
\n\n \n\n\n\n \n\n
\n \n
\n TypeScript\n HTML\n JavaScript\n Shell\n
\n
\n \n
\n\n\n\n\n\n\n
\n \n
\n \n Branch:\n master\n \n \n\n \n
\n \n \n \n
\n
\n
\n\n\n \n\n
\n \n
\n\n
\n\n Find file\n
\n\n \n\n\n \n\n
\n \n Clone or download\n \n
\n
\n\n
\n
\n\n

\n Clone with HTTPS\n \n \n \n

\n

\n Use Git or checkout with SVN using the web URL.\n

\n\n
\n \n
\n \n
\n
\n\n
\n\n
\n \nDownload ZIP\n\n
\n
\n\n \n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching Xcode

\n

If nothing happens, download Xcode and try again.

\n

\n
\n\n
\n

Launching Visual Studio

\n

If nothing happens, download the GitHub extension for Visual Studio and try again.

\n

\n
\n\n
\n
\n
\n\n\n
\n\n\n \n\n\n
\n \"\"\n Fetching latest commit…\n
\n
\n Cannot retrieve the latest commit at this time.\n
\n
\n\n\n
\n Permalink\n\n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TypeNameLatest commit messageCommit time
Failed to load latest commit information.
\n \n \"\"\n \n .github/ISSUE_TEMPLATE\n \n \n Update bug_report.md\n \n \n Mar 4, 2019\n
\n \n \"\"\n \n conf\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n docs\n \n \n docs(index.html): Remove unused docs img\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n examples\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n https-cert\n \n \n Adding support to https\n \n \n Aug 9, 2018\n
\n \n \"\"\n \n misc\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n output\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n src\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n temp\n \n \n #19 adding attempting to create a topic at kafka\n \n \n Oct 3, 2018\n
\n \n \"\"\n \n .codeclimate.yml\n \n \n Updating .codeclimate\n \n \n Sep 24, 2018\n
\n \n \"\"\n \n .gitignore\n \n \n docs(README): Improve docs\n \n \n Mar 23, 2019\n
\n \n \"\"\n \n .npmignore\n \n \n Removing SummaryTestOutput dependency with Configuration and start te…\n \n \n Mar 10, 2019\n
\n \n \"\"\n \n .travis.yml\n \n \n feat(dynamic-modules-manager): Look for a ~/.nqr folder to load plugi…\n \n \n Mar 22, 2019\n
\n \n \"\"\n \n CNAME\n \n \n Create CNAME\n \n \n May 10, 2019\n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n chore(Automatic Release): Add automatic release with semantic-release.\n \n \n Mar 21, 2019\n
\n \n \"\"\n \n License\n \n \n Creating License\n \n \n Mar 10, 2018\n
\n \n \"\"\n \n README.md\n \n \n docs(LandingPage): Create landing page\n \n \n Jun 30, 2019\n
\n \n \"\"\n \n package-lock.json\n \n \n chore(deps): bump handlebars from 4.1.2 to 4.5.3\n \n \n Dec 27, 2019\n
\n \n \"\"\n \n package.json\n \n \n chore(Dependencies): Update dependencies\n \n \n Jul 5, 2019\n
\n \n \"\"\n \n tsconfig.json\n \n \n feat(NotificationEmitter): Create the concept of Notification and Not…\n \n \n May 24, 2019\n
\n \n \"\"\n \n tslint.json\n \n \n Subscription refactoring\n \n \n Mar 12, 2019\n
\n\n
\n\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n
\n
\n
\n
\n
\n\n
\n

\"npm\"\n\"Build\n\"Greenkeeper\n\"Known\n\"License:

\n

\"enqueuerlogo\"

\n

Welcome

\n

Be our guest and have fun.

\n

install it

\n

First things first, let's get the enqueuer installed on your machine.

\n
$ npm install --global enqueuer\n
\n

Alright, it's time to create a requisition file.\nSomething like:

\n
#enqueuer-repo-hit.yml\npublishers:\n-   type: http\n    url: https://github.com/enqueuer-land/enqueuer\n    onResponseReceived:\n        assertions:\n        -   expect: statusCode\n            toBeEqualTo: 200\n
\n

Pretty simple, hum? Small and concise, how it should be!\nRun it:

\n
$ enqueuer enqueuer-repo-hit.yml\n
\n

What if I want to mock a http server, you may ask. Not a big deal for enqueuer lovers:

\n
timeout: -1\nsubscriptions:\n-   type: http\n    timeout: -1\n    name: mock endpoint\n    endpoint: /readme-example\n    port: 9085\n    method: POST\n    response:\n        status: 200\n        payload: mock response\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: `enqueuer`\n
\n

Now go ahead and try hitting it using the browser.\nTip: remove timeout values and check what happens.\nI told you it was simple.\nNow, let's say you want to mix different protocols to test a bit more complex flow.\nHow about publishing an amqp message and making sure that, once a service consumes that message an endpoint of your is hit?\nIn order to achieve that, we have to make use of a plugin, given that amqp support is provided by a plugin.\nIn this scenario, we're talking about the amqp plugin.\nOnce we get this plugin installed we are able to create and run files like this:

\n
publishers:\n-   type: amqp\n    payload: 123456\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.readme.routing.key\nsubscriptions:\n-   type: http\n    endpoint: /polyglot-flow\n    port: 8080\n    method: GET\n    response:\n        status: 200\n        payload: polyglot message\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: 123456\n
\n

Now go nuts!\nIt's all yours. Have fun.\nIf you want more examples about http, consider looking at this test.\nCheck this out, you'll find countless examples.\nCertainly one is what you need.

\n

if you need more

\n
$ nqr -h\nUsage: nqr [options] <test-file> [other-test-files...]\n\nTake a look at the full documentation: https://enqueuer.com\n\nOptions:\n  -v, --version                             output the version number\n  -b, --verbosity <level>                   set verbosity (default: \"warn\")\n  -c, --config-file <path>                  set configurationFile\n  -e, --parsers-list [parser]               list available object parsers\n  -f, --formatters-description [formatter]  describe report formatters\n  -o, --stdout-requisition-output           add stdout as requisition output\n  -m, --max-report-level-print <level>      set max report level print\n  -p, --protocols-description [protocol]    describe protocols\n  -t, --tests-list [expectedField]          list available tests assertions\n  -u, --loaded-modules-list                 list loaded modules\n  -i, --show-passing-tests                  show passing tests\n  -s, --store [store]                       add variables values to this session (default: [])\n  -l, --add-plugin [plugin]                 add plugin (default: [])\n  -a, --add-file <file>                     add file to be tested (default: [])\n  -A, --add-file-and-ignore-others <file>   add file to be tested and ignore others (default: [])\n  -h, --help                                output usage information\n\nExamples:\n  $ nqr --config-file config-file.yml --verbosity error --store key=value\n  $ enqueuer -c config-file.yml test-file.yml --add-file another-test-file.yml -b info\n  $ enqueuer test-file.yml --store someKey=true --store someOtherKey=false\n  $ nqr --protocols-description -s key=value\n  $ nqr -t expect\n  $ nqr -l my-enqueuer-plugin-name -p plugin-protocol\n  $ nqr -p http\n  $ nqr --formatters-description json\n
\n
\n

Components

\n

In order to accomplish more than just hitting enqueuer's repo or doing a quick self http hit, there are a few things that you'll probably need to know.\nDon't worry, it's not too much and, as mentioned earlier, there is a lot of examples here, just in case.\nThere are only three important component concepts: requisitions, publishers and subscriptions.\nThey work along with each other and are responsible for the full behavior of enqueuer.

\n

requisition

\n

Test scenario description. It tells what, when, and how test your applications and services.\nPicture it as if it was a collection of publishers, subscriptions and other requisitions.\nIt helps because this is exactly what it is.\nAs the others components, it has some attributes. All of them are optionals. And it supports multi-level test scenarios out of the box. Yeap, go as recursive as you want.\nEvery test file is a requisition.\nYou don't know some of these attributes values yet? Don't worry, just put a variable there and let enqueuer replace it with the value you set later.\nVariable replacements are available through the entire requisition.

\n
requisition attributes
\n

These are the requisition attributes:

\n

name
\nDescribes what the requisition is suppose to do.\nDefaults to requisition index.

\n
name: requisition action\n
\n

timeout
\nDefaults to 5000.\nSets in milliseconds how long the requisition waits to expire.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

delay
\nDefaults to 0. Sets in milliseconds how long the test waits before starting. Check this to get the full idea.

\n
delay: 0\n
\n

iterations
\nDefaults to 1. Sets how many times this test will be executed. Check this and this to get the full idea.

\n
iterations: 3\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this requisitions should be skipped. Check this to see it working.

\n
ignore: true\n
\n

parallel
\nDefaults to false. Immediate children requisitions should be executed in parallel mode.\nTake a look at this to see it working.

\n
parallel: true\n
\n

import
\nAllows requisition to be dynamically defined, be it by loading an external file or creating dynamically by other requisitions. Want to reuse the same requisition multiple times? This is you you need.\nTake a look at this to behold this feature.

\n
import: path/to/another/requisition/file\n
\n

publishers
\nList of publishers. They're executed simultaneously, therefore, the order is irrelevant.

\n
publishers:\n- name: some publisher name\n  type: http\n- type: tcp\n
\n

subscriptions
\nList of subscriptions. They're executed simultaneously, therefore, the order is irrelevant.

\n
subscriptions:\n- name: some subscription name\n  type: udp\n- name: another subscription name\n  type: file\n
\n

requisitions
\nA list of child scenarios. List of requisitions.\nBy default, they're executed sequentially, therefore, the order is relevant.\nUnless the parallel attribute is set to true, what makes them get executed simultaneously,\nCheck this example, it may help.

\n
requisitions:\n- name: some requisition name\n  iterations: 2\n- name: another requisition name\n  delay: 200\n
\n
events
\n

Available events are described here. A this object is available to access and change requisition attributes.

\n
name: my name\nonInit:\n  script: this.delay = 3000;\n  assertions:\n  - expectToBeDefined: this.name\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.name\n
\n

publisher

\n

A publisher action is triggered by enqueuer itself. It acts whereas a subscription reacts.\nIt publishes something, it writes, it enqueues, hits and endpoint... These kinds of actions.\nIt's worth noting that it always creates a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if the message got published.

\n
publisher attributes
\n

Every publisher has its own properties, depending on its protocol and implementation.\nThe built-in http publisher implementation, for instance, demands a url, a method, and a payload, if the method is not a GET.\nOn the other hand, the built-in tcp publisher implementation requires a serverAddress and a port.\nThese are the publisher attributes:

\n

name
\nDefaults to publisher index.\nDescribes what the publisher is supposed to do.

\n
name: publisher action\n
\n

type
\nMandatory. Key tag to identify which publisher will be instantiated

\n
type: http\n
\n

payload
\nSince a publisher usually publishes something, it's very likely you have to set a value here.\nThe message itself that will be send through this protocol. Be it a string, a number, a boolean value or even whole objects.

\n
payload: value\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this publisher should be skipped. Check this to see it working.

\n
ignore: true\n
\n
events
\n

Available events are described here. A this object is available to access and change publisher attributes.\nDepending on the protocol and its implementation, such as http and tcp, there may exist special events, such as onMessageReceived event and a special object given message.\nOn the other hand, an asynchronous protocol, like: udp and amqp, usually do not provide it.

\n
onInit:\n  script: this.ignore = false\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived: #Provided in synchronous protocols  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n

subscription

\n

A subscription is an \"under demand\" event. It reacts whereas a publisher acts.\nIt consumes something, it reads, it dequeues, gets hit... These kinds of actions.\nThis means that it is not triggered by enqueuer itself.\nRather than that, enqueuer waits on an external event to be triggered and then it asserts against the message that was passed to the subscription.\nIt's worth noting that it always receives a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if a message got received.

\n
subscription attributes
\n

Every subscription has its own properties, depending on its protocol and implementation.\nThe built-in http subscription implementation, for instance, demands an endpoint, a method, and a port, if the method is not a GET.\nOn the other hand, the built-in tcp subscription implementation requires only a port.

\n

These are the subscription attributes:

\n

name
\nDefaults to subscription index.\nDescribes what the subscription is supposed to do.

\n
name: subscription action\n
\n

type
\nMandatory. Key tag to identify which subscription will be instantiated

\n
type: http\n
\n

avoid
\nIdentifies whether or not this subscription should not receive any message. Defaults to false.\nIf set and a message is received a failing test will be generated.\nTake a look at this to see it working.\nOn the other hand, when it's false and no message is received in a given timeout. The subscription is valid.

\n
avoid: false\n
\n

timeout
\nSets in milliseconds how long the subscription waits to expire. Defaults to 3000.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this subscription should be skipped. Check this to see it working.

\n
ignore: true    \n
\n
events
\n

Available events are described here. A this object is available to access and change subscription attributes.

\n
onInit:\n  script: this.avoid = false;\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived:  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n
\n

Event

\n

Events are hook methods executed by enqueuer when an action occurs on publishers, subscriptions or requisitions.\nThis is where you'll write your tests. In its assertions field.\nThere will be a variable called this and, depending on the event's owner, it has an alias publisher, subscription or requisition.\nYou're free to explore them however you want, even doing things like this:

\n
publisher.parent.subscriptions[0].timeout = 1000;\n
\n

hooks

\n

By default, there are three hook events available:

\n

onInit
\nAvailable in requisitions, publishers and subscriptions. It gets executed as soon as the component is initialized.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

onFinish
\nAvailable in requisitions, publishers and subscriptions. It gets executed when the component is about to finish.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

custom\nDepending on the protocol implementation/library/author's mood, the publisher/subscription may have additional hooks.\nSuch as onError, onResponseReceived, onFileNotFound and onRedirect...\nHttp-proxy subscription test file is an excellent example, check it out.

\n

fields

\n

Every hook object has 3 properties:

\n

script
\nJavascript code snippet executed when the event is triggered.\nYeah, I mean it. See it it by yourself.\nBut be careful, with great power comes great responsibility.

\n

store
\nData to be persisted across requisitions.

\n

assertions
\nArray of assertions.\nRun $ nqr -t to see available ones.\nConsider looking at this test example.\nOf course, just like almost everything else in enqueuer world, you can extend this available list using some plugin.\nYou can check them out or even write your own.

\n
onInit:\n  script: variableIdentifier = 'string value'\n\n  assertions:\n  - expect: variableIdentifier\n    toBeEqualTo: `string value`\n\nonMessageReceived:\n  script: |-\n    message += 3;\n    console.log(`Message received plus 3 is: ${message}`);\n\n  store:\n    key: message\n\n  assertions:\n  - name: anyValue #optional\n    expect: message\n    toBeEqualTo: store.key\n  - expect: message + 3\n    toBeGreaterThan: 3\n
\n

event example

\n

Check this test file to see it in practice.

\n
\n

Requisition Flow

\n

Now that you know what are requisitions, publishers, subscriptions and events. How about seeing how they interact with each other in a fancier way?

\n

\"enqueuerInstanceFlow\"

\n
\n

Configuration File

\n

To save yourself some time, a configuration file may be used.\nConfiguration files tell enqueuer which tests will be executed, log-level, and which output test report files should be generated.\nThis file tells how enqueuer should be executed.\nTo run enqueuer with the configuration:

\n
$ nqr -c path/to/configuration/file.yml\n
\n

or

\n
$ nqr --config-file path/to/configuration/file.yml\n
\n

attributes

\n

These are the configuration file attributes:

\n

files
\nRequisition file names or glob. Enqueuer runs every file that matches an element value.

\n
files:\n- 1.yml\n- 2.yml\n- *.json\n
\n

parallel
\nDefaults to false. Requisition files should be executed in parallel mode. The requisition file itself is still sequential, but the files are executes in parallel.

\n
parallel: true\n
\n

log-level
\nDefaults to warning. Defines how information are logged in the console. Accepted values are: trace; debug; info; warning (default); error; and fatal.

\n
log-level: trace\n
\n

max-report-level-print
\nDefaults to 1. The deepest level of report to be printed to the console.

\n
max-report-level-print: 2\n
\n

plugins
\nList of in plugins used by the test scenarios. You can check them out or write your own.

\n
plugins:\n- enqueuer-plugin-amqp \n- enqueuer-plugin-ws \n- enqueuer-plugin-mqtt\n- enqueuer-plugin-html-report\n
\n

outputs
\nOnce enqueuer runs every execution, it compiles a summary and sends it to every publisher listed in output.\nAn important thing to note is that every available report publisher is available here.\nYes, it means that you are able to send this report through http, tcp, etc. or through a plugin one or a custom one.\nYou can run $ nqr -p to check available report publishers installed.\nAnother important thing to note is the format value. By default a json summary is generated, but you can change it to whatever format you would like, such as: Xunit, html\nYou can run $ nqr -f to check available installed formats or even write your own

\n
outputs:\n- type: file\n  format: json (default)\n  filename: output/examples.json\n- type: file\n  format: yml\n  filename: output/examples.yml\n- type: standard-output (default)\n  format: console\n
\n

store
\nValues defined here use the 'key: value' pattern and are available to every test scenario throughout the entire execution

\n
store:\n  variableKey: \"my value\" # Defines 'variableKey' key and its value 'my value'. \n  \n  'separated key': 6\n  \n  object: # You can even define whole objects here:\n    first: first value\n    second:\n      nested: thing\n
\n

example

\n

Here's a complete example of a configuration file.

\n
\n

Variables

\n

Providing power and flexibility, enqueuer allows you to use variables placeholder replacement.\nThat's why there is a store field and you'll see a lot of << and {{ being used in the examples files.\nIt works as simple as this:

\n
name: my name is <<variableKey>>\n
\n

Every time enqueuer sees these kind of notations, it searches in its store for a key/value pair like:

\n
variableKey: `enqueuer`\n
\n

Then, when enqueuer parses the original map, it gets translated to this:

\n
name: my name is enqueuer\n
\n

By default, every ENV_VAR set is loaded automatically to the store. Check this example.

\n

set a variable

\n

There are a few ways to set a value in the store.

\n
configuration file
\n

Configuration file store object. Set it as you wish, as you can see here

\n
command line
\n

A command line argument using the key=value format. This way:

\n
$ nqr --store key=value -s anotherVariable=true\n
\n
event
\n

Dynamically set it through any event.\nBe it in its script field or straight through its store field.\nBoth ways work:

\n
onInit:\n    script: store.key = 123;\n    store:\n        anotherKey: `another Value` \n
\n

use a variable

\n

There are two ways two use a variable:

\n
non js code snippet
\n

The easiest one is to type <<variableKey>> or {{variableKey}} where you want it to be replaced in a test file, as you can see here

\n
js code snippet
\n

Using the store object. It's attributes are the keys and their values are their respective values.\nTherefore, you're free to use store.variableKey, console.log(store.variableKey); or console.log(2 * store['separated key']); and get them.\nLike this one.

\n

variables example

\n

Check out this test example test to see it working.

\n
\n

Content File Injection

\n

You are able to inject file content into a requisition/publisher/subscription field.

\n
file: <<file://path/to/file.txt>>\n
\n

Other than that, enqueuer can read it and parse its content as an object using this familiar syntax: <<tag://path/to/file?query=value&other=true>>.

\n
requisition:\n    json: <<json://path/to/file.json>>\n    yml: <<yml://path/to/file.yml>>\n    csv: <<csv://path/to/file.csv?header=true&delimiter=;>>\n    file: <<file://path/to/file.txt>>\n
\n

Once the object is parsed, your free to use it as a regular object in any event

\n
onInit:\n    script: console.log(requisition.yml.deep.field);\nonFinish:\n    assertions:\n    -   expect: json.key\n        toBeEqualTo: csv[0].key\n
\n

It get's event better.\nDue its fantastic plugin architecture design, you can extend its default modules and use any of these plugins or event write your own to parse however you want.\nThe built-in modules for object parsers are: json, yml, csv and file.\nRun $ nqr -e to see available ones.

\n

example

\n

Check out this test example test to get a full picture of it.

\n
\n

Plugins

\n

You're probably aware by now but it doesn't hurt do emphasize it: enqueuer provides an amazingly powerful plugin extensible architecture.\nIt has several plugins available, but if none of them pleases you, you're free to create your own.\nAlbeit you don't have to share the one you created, we encourage you to do so. Then go ahead and publish yours to npm and add it to our plugins list.

\n

plugin types

\n

So far, you're able to extend enqueuer default behavior in four ways. Using a protocol plugin, an object parser plugin, an asserter plugin and using a report formatter plugin.

\n
protocol
\n

A protocol plugin enables you to use a different publisher/subscription types.\nRun $ nqr -p [protocol-name] to get the full available list:

\n
publishers: \n-   name:                  custom\n-   name:                  file\n-   name:                  http\n    messageReceivedParams: statusCode, statusMessage, body\n-   name:                  stdout\n-   name:                  tcp\n-   ...\nsubscriptions: \n-   name:                  custom\n-   name:                  file\n    messageReceivedParams: content, name, size, modified, created\n-   name:                  http\n    messageReceivedParams: headers, params, query, body\n-   name:                  stdin\n-   name:                  tcp\n    messageReceivedParams: payload, stream\n-   ...\n
\n

Each one listed above has a respective example in the examples folder.\nThis one, for instance, provides support for amqp protocol, so you can create this publisher and subscription:

\n
publishers:\n-   type: amqp\n    payload: enqueuermaniac\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.key\nsubscriptions:\n-   type: amqp\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.#\n    onMessageReceived:\n        assertions:\n        -   expect: payload\n            toBeEqualTo: `enqueuermaniac`\n
\n
object parser
\n

An object parser plugin enables you to read and parse files as you wish.\nThis test example demonstrates how to use it,\nRun $ nqr -e [object-parser-name] to check available ones:

\n
parsers: \n- yml, yaml\n- json\n- file\n- csv\n
\n

This one, for example, provides the ability to read xml files and inject their values like this:

\n
xmlContent: <<xml://path/to/xml/file.xml>>\n
\n
asserter
\n

An asserter plugin provides you a nicely way to use different assertions than these built-in ones.

\n
asserters: \n-   expect: \n        required:    true\n        type:        string, array\n        description: actual value\n    not: \n        required:    false\n        type:        null\n        description: negates\n    toContain: \n        required:    true\n        type:        string, any\n        description: element\n
\n

Looking at the asserter above, we can create assertions like these:

\n
assertions:\n-   expect: [`a`, 1, true]\n    not:\n    toContain: `b`\n-   expect: [`a`, 1, true]\n    toContain: 1\n
\n

Run $ nqr -t to get the full available list.\nConsider looking at this test example.

\n
report formatter
\n

A report formatter plugin gives you the ability to export enqueuer reports the way you want.\nRun $ nqr -f [formatter-name] to list available report formatters:

\n
formatters: \n- console, stdout\n- json\n- yml, yaml\n
\n

Consider looking at the example of configuration file to see it in use.\nThis one, for instance, generates xUnit like reports from enqueuer's output.

\n

plugin installation

\n

In order to enqueuer get awareness that you want to use a plugin, you have to tell it, right?\nYou can tell enqueuer to use a plugin in three different ways: using it as a command line argument, through the configuration file or letting enqueuer finding it in a default location.

\n
command line
\n

Tell enqueuer to use your plugin through command line this way $ nqr -l <plugin-folder> -l <another-plugin-folder>.\nWhere plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
configuration file
\n

Tell enqueuer to use your plugin through configuration file this way:

\n
plugins: \n-   plugin-folder\n-   another-plugin-folder\n
\n

Where plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
implicitly
\n

When enqueuer runs, it looks for modules in its same installation directory or in .nqr folder in the home directory, a.k.a. ~/ folder in linux distributions.\nTherefore, if you run:

\n
$ npm install --global enqueuer\n$ mkdir ~/.nqr\n$ cd ~/.nqr\n$ npm install enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

Or

\n
$ npm install --global enqueuer enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

You'll see that the enqueuer-plugin-amqp plugin will be loaded.\nEvery enqueuer compatible module gets implicitly loaded.\nIn order to be enqueuer compatible, a module has to have an entryPoint exported function in its main file and, in its package.json file, it has to have either 'enqueuer' or 'nqr' as keywords.

\n

Stacker

\n

Looking for a really really good looking an human error proof solution way of writing these requisition files?
\nConsider taking a look at stacker: open source, cross-platform, multi protocol client testing tool.\nThe official enqueuer's best friend forever. Do amazing things and change the world with enqueuer’s GUI!\nWith them, you create, manage and run requisitions and and see their results in a really nice way.\nSee this amazing beauty with your own eyes to get an idea of how it works:

\n

\"screenshot-passing\"

\n
\n

Open source

\n

We (by 'we' we mean enqueuer's maintainers not the human race, unfortunately) are very opened to any kind of contributions in general.\nAs long as they make sense and add value to the product, you're free to go.\nWe mean it, do it. Even if it's a typo fix in this README file. Go ahead.\nIf you like it but don't want to waste time creating a pull request, no problem either.\nCreate an issue, or, even easier, give it a github star. It's cheap and it doesn't hurt anyone.\nYou know what? Just head up to enqueuer's github repo and keep staring at its repo.\nIt may help somehow.

\n

contributors

\n

Thank you. It sounds cliché, but this project wouldn't be the same without the massive contribution from everyone.

\n

code it

\n

In order to contribute with some code, you have to follow a few steps.\nFirst of all, get the code:

\n
$ git clone git@github.com:enqueuer-land/enqueuer.git\n$ cd enqueuer\n
\n

Get its dependencies installed:

\n
$ npm install\n
\n

Build it:

\n
$ npm run build\n
\n

Go for it. Make the changes you want.\nAfter everything is done:

\n
$ npm run all\n
\n

Commit it:

\n
$ npm run commit\n
\n

Push it:

\n
$ git push\n
\n

feedback

\n

We'd love to get your feedback!\nIf you have any comments, suggestions, etc. you can reach us here.

\n

\"NPM\"

\n
\n
\n
\n\n\n\n
\n
\n\n
\n
\n \n\n
\n\n \n
\n
\n \n\n \n \n\n \n
\n
\n \n
\n
\n\n\n\n
\n \n \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n \n \n
\n \n\n
\n
\n
\n
\n\n \n \n\n
\n\n \n\n\n" + body: "\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n\n\n\n \n \n \n \n \n \n \n\n\n \n \n GitHub - enqueuer-land/enqueuer: Multi protocol microservice testing tool\n \n \n \n \n\n \n \n\n \n \n \n\n \n\n\n\n \n\n \n\n \n\n \n \n \n\n \n\n\n\n\n \n\n\n\n\n\n\n \n\n \n \n\n \n\n\n \n\n \n \n\n \n\n \n\n \n\n\n \n\n\n \n\n \n\n \n \n\n\n\n\n \n\n \n\n \n \n\n
\n Skip to content\n \n \n \n\n \n \n\n\n\n
\n
\n
\n \n \n \n
\n\n
\n
\n \n
\n\n \n\n \n
\n
\n
\n\n
\n\n
\n\n\n
\n\n
\n\n\n\n\n
\n
\n
\n \n \n\n\n\n \n\n\n\n\n\n\n\n\n\n
\n\n
\n\n
\n

\n \n \n enqueuer-land\n \n /\n \n enqueuer\n \n \n

\n\n\n
\n\n \n\n
\n \n\n\n\n
\n
\n
\n\n \n \n \n\n\n
\n \n Multi protocol microservice testing tool\n \n https://enqueuer.com\n
\n
\n\n \n\n\n\n \n\n
\n \n
\n TypeScript\n HTML\n JavaScript\n Shell\n
\n
\n \n
\n\n\n\n\n\n\n
\n \n
\n \n Branch:\n master\n \n \n\n \n
\n \n \n \n
\n
\n
\n\n\n \n\n
\n \n
\n\n
\n\n Find file\n
\n\n \n\n\n \n\n
\n \n Clone or download\n \n
\n
\n\n
\n
\n\n

\n Clone with HTTPS\n \n \n \n

\n

\n Use Git or checkout with SVN using the web URL.\n

\n\n
\n \n
\n \n
\n
\n\n
\n\n \n
\n\n \n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching GitHub Desktop

\n

If nothing happens, download GitHub Desktop and try again.

\n

\n
\n\n
\n

Launching Xcode

\n

If nothing happens, download Xcode and try again.

\n

\n
\n\n
\n

Launching Visual Studio

\n

If nothing happens, download the GitHub extension for Visual Studio and try again.

\n

\n
\n\n
\n
\n
\n\n\n
\n\n\n\n\n\n
\n \n
\n
\n \n \"@virgs\"\n
\n
\n\n \n
\n \n \n \n Latest commit\n \n df5799a\n \n Feb 2, 2020\n
\n
\n\n\n\n
\n Permalink\n\n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TypeNameLatest commit messageCommit time
Failed to load latest commit information.
\n \n \"\"\n \n .github/ISSUE_TEMPLATE\n \n \n Update bug_report.md\n \n \n Mar 4, 2019\n
\n \n \"\"\n \n conf\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n docs\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n examples\n \n \n fix(HttpSubscription): Cast the http response payload to string if, a…\n \n \n Aug 21, 2019\n
\n \n \"\"\n \n https-cert\n \n \n Adding support to https\n \n \n Aug 9, 2018\n
\n \n \"\"\n \n misc\n \n \n docs(index.html): Fix index.html dimension\n \n \n Jan 3, 2020\n
\n \n \"\"\n \n output\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n src\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n temp\n \n \n #19 adding attempting to create a topic at kafka\n \n \n Oct 3, 2018\n
\n \n \"\"\n \n .codeclimate.yml\n \n \n Updating .codeclimate\n \n \n Sep 24, 2018\n
\n \n \"\"\n \n .gitignore\n \n \n docs(README): Improve docs\n \n \n Mar 23, 2019\n
\n \n \"\"\n \n .npmignore\n \n \n Removing SummaryTestOutput dependency with Configuration and start te…\n \n \n Mar 10, 2019\n
\n \n \"\"\n \n .travis.yml\n \n \n feat(dynamic-modules-manager): Look for a ~/.nqr folder to load plugi…\n \n \n Mar 22, 2019\n
\n \n \"\"\n \n CNAME\n \n \n Create CNAME\n \n \n May 10, 2019\n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n chore(Automatic Release): Add automatic release with semantic-release.\n \n \n Mar 21, 2019\n
\n \n \"\"\n \n License\n \n \n Creating License\n \n \n Mar 10, 2018\n
\n \n \"\"\n \n README.md\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n package-lock.json\n \n \n docs(README): Add github repo to the documentation\n \n \n Feb 2, 2020\n
\n \n \"\"\n \n package.json\n \n \n chore(Dependencies): Update dependencies\n \n \n Jul 5, 2019\n
\n \n \"\"\n \n tsconfig.json\n \n \n feat(NotificationEmitter): Create the concept of Notification and Not…\n \n \n May 24, 2019\n
\n \n \"\"\n \n tslint.json\n \n \n Subscription refactoring\n \n \n Mar 12, 2019\n
\n\n
\n\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n
\n
\n
\n
\n
\n\n
\n

\"npm\"\n\"Build\n\"Greenkeeper\n\"Known\n\"License:

\n

\"enqueuerlogo\"

\n

Welcome

\n

Be our guest and have fun.

\n

install it

\n

First things first, let's get the enqueuer installed on your machine.

\n
$ npm install --global enqueuer\n
\n

Alright, it's time to create a requisition file.\nSomething like:

\n
#enqueuer-repo-hit.yml\npublishers:\n-   type: http\n    url: https://github.com/enqueuer-land/enqueuer\n    onResponseReceived:\n        assertions:\n        -   expect: statusCode\n            toBeEqualTo: 200\n
\n

Pretty simple, hum? Small and concise, how it should be!\nRun it:

\n
$ enqueuer enqueuer-repo-hit.yml\n
\n

What if I want to mock a http server, you may ask. Not a big deal for enqueuer lovers:

\n
timeout: -1\nsubscriptions:\n-   type: http\n    timeout: -1\n    name: mock endpoint\n    endpoint: /readme-example\n    port: 9085\n    method: POST\n    response:\n        status: 200\n        payload: mock response\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: `enqueuer`\n
\n

Now go ahead and try hitting it using the browser.\nTip: remove timeout values and check what happens.\nI told you it was simple.\nNow, let's say you want to mix different protocols to test a bit more complex flow.\nHow about publishing an amqp message and making sure that, once a service consumes that message an endpoint of your is hit?\nIn order to achieve that, we have to make use of a plugin, given that amqp support is provided by a plugin.\nIn this scenario, we're talking about the amqp plugin.\nOnce we get this plugin installed we are able to create and run files like this:

\n
publishers:\n-   type: amqp\n    payload: 123456\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.readme.routing.key\nsubscriptions:\n-   type: http\n    endpoint: /polyglot-flow\n    port: 8080\n    method: GET\n    response:\n        status: 200\n        payload: polyglot message\n    onMessageReceived:\n        assertions:\n        -   expect: body\n            toContain: 123456\n
\n

Now go nuts!\nIt's all yours. Have fun.\nIf you want more examples about http, consider looking at this test.\nCheck this out, you'll find countless examples.\nCertainly one is what you need.

\n

if you need more

\n
$ nqr -h\nUsage: nqr [options] <test-file> [other-test-files...]\n\nTake a look at the full documentation: https://enqueuer.com\n\nOptions:\n  -v, --version                             output the version number\n  -b, --verbosity <level>                   set verbosity (default: \"warn\")\n  -c, --config-file <path>                  set configurationFile\n  -e, --parsers-list [parser]               list available object parsers\n  -f, --formatters-description [formatter]  describe report formatters\n  -o, --stdout-requisition-output           add stdout as requisition output\n  -m, --max-report-level-print <level>      set max report level print\n  -p, --protocols-description [protocol]    describe protocols\n  -t, --tests-list [expectedField]          list available tests assertions\n  -u, --loaded-modules-list                 list loaded modules\n  -i, --show-passing-tests                  show passing tests\n  -s, --store [store]                       add variables values to this session (default: [])\n  -l, --add-plugin [plugin]                 add plugin (default: [])\n  -a, --add-file <file>                     add file to be tested (default: [])\n  -A, --add-file-and-ignore-others <file>   add file to be tested and ignore others (default: [])\n  -h, --help                                output usage information\n\nExamples:\n  $ nqr --config-file config-file.yml --verbosity error --store key=value\n  $ enqueuer -c config-file.yml test-file.yml --add-file another-test-file.yml -b info\n  $ enqueuer test-file.yml --store someKey=true --store someOtherKey=false\n  $ nqr --protocols-description -s key=value\n  $ nqr -t expect\n  $ nqr -l my-enqueuer-plugin-name -p plugin-protocol\n  $ nqr -p http\n  $ nqr --formatters-description json\n  \nContributing:\n  https://github.com/enqueuer-land/enqueuer\n
\n
\n

Components

\n

In order to accomplish more than just hitting enqueuer's repo or doing a quick self http hit, there are a few things that you'll probably need to know.\nDon't worry, it's not too much and, as mentioned earlier, there is a lot of examples here, just in case.\nThere are only three important component concepts: requisitions, publishers and subscriptions.\nThey work along with each other and are responsible for the full behavior of enqueuer.

\n

requisition

\n

Test scenario description. It tells what, when, and how test your applications and services.\nPicture it as if it was a collection of publishers, subscriptions and other requisitions.\nIt helps because this is exactly what it is.\nAs the others components, it has some attributes. All of them are optionals. And it supports multi-level test scenarios out of the box. Yeap, go as recursive as you want.\nEvery test file is a requisition.\nYou don't know some of these attributes values yet? Don't worry, just put a variable there and let enqueuer replace it with the value you set later.\nVariable replacements are available through the entire requisition.

\n
requisition attributes
\n

These are the requisition attributes:

\n

name
\nDescribes what the requisition is suppose to do.\nDefaults to requisition index.

\n
name: requisition action\n
\n

timeout
\nDefaults to 5000.\nSets in milliseconds how long the requisition waits to expire.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

delay
\nDefaults to 0. Sets in milliseconds how long the test waits before starting. Check this to get the full idea.

\n
delay: 0\n
\n

iterations
\nDefaults to 1. Sets how many times this test will be executed. Check this and this to get the full idea.

\n
iterations: 3\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this requisitions should be skipped. Check this to see it working.

\n
ignore: true\n
\n

parallel
\nDefaults to false. Immediate children requisitions should be executed in parallel mode.\nTake a look at this to see it working.

\n
parallel: true\n
\n

import
\nAllows requisition to be dynamically defined, be it by loading an external file or creating dynamically by other requisitions. Want to reuse the same requisition multiple times? This is you you need.\nTake a look at this to behold this feature.

\n
import: path/to/another/requisition/file\n
\n

publishers
\nList of publishers. They're executed simultaneously, therefore, the order is irrelevant.

\n
publishers:\n- name: some publisher name\n  type: http\n- type: tcp\n
\n

subscriptions
\nList of subscriptions. They're executed simultaneously, therefore, the order is irrelevant.

\n
subscriptions:\n- name: some subscription name\n  type: udp\n- name: another subscription name\n  type: file\n
\n

requisitions
\nA list of child scenarios. List of requisitions.\nBy default, they're executed sequentially, therefore, the order is relevant.\nUnless the parallel attribute is set to true, what makes them get executed simultaneously,\nCheck this example, it may help.

\n
requisitions:\n- name: some requisition name\n  iterations: 2\n- name: another requisition name\n  delay: 200\n
\n
events
\n

Available events are described here. A this object is available to access and change requisition attributes.

\n
name: my name\nonInit:\n  script: this.delay = 3000;\n  assertions:\n  - expectToBeDefined: this.name\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.name\n
\n

publisher

\n

A publisher action is triggered by enqueuer itself. It acts whereas a subscription reacts.\nIt publishes something, it writes, it enqueues, hits and endpoint... These kinds of actions.\nIt's worth noting that it always creates a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if the message got published.

\n
publisher attributes
\n

Every publisher has its own properties, depending on its protocol and implementation.\nThe built-in http publisher implementation, for instance, demands a url, a method, and a payload, if the method is not a GET.\nOn the other hand, the built-in tcp publisher implementation requires a serverAddress and a port.\nThese are the publisher attributes:

\n

name
\nDefaults to publisher index.\nDescribes what the publisher is supposed to do.

\n
name: publisher action\n
\n

type
\nMandatory. Key tag to identify which publisher will be instantiated

\n
type: http\n
\n

payload
\nSince a publisher usually publishes something, it's very likely you have to set a value here.\nThe message itself that will be send through this protocol. Be it a string, a number, a boolean value or even whole objects.

\n
payload: value\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this publisher should be skipped. Check this to see it working.

\n
ignore: true\n
\n
events
\n

Available events are described here. A this object is available to access and change publisher attributes.\nDepending on the protocol and its implementation, such as http and tcp, there may exist special events, such as onMessageReceived event and a special object given message.\nOn the other hand, an asynchronous protocol, like: udp and amqp, usually do not provide it.

\n
onInit:\n  script: this.ignore = false\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived: #Provided in synchronous protocols  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n

subscription

\n

A subscription is an \"under demand\" event. It reacts whereas a publisher acts.\nIt consumes something, it reads, it dequeues, gets hit... These kinds of actions.\nThis means that it is not triggered by enqueuer itself.\nRather than that, enqueuer waits on an external event to be triggered and then it asserts against the message that was passed to the subscription.\nIt's worth noting that it always receives a message.\nThat's the reason why there's an implicitly created test in onFinish hook verifying if a message got received.

\n
subscription attributes
\n

Every subscription has its own properties, depending on its protocol and implementation.\nThe built-in http subscription implementation, for instance, demands an endpoint, a method, and a port, if the method is not a GET.\nOn the other hand, the built-in tcp subscription implementation requires only a port.

\n

These are the subscription attributes:

\n

name
\nDefaults to subscription index.\nDescribes what the subscription is supposed to do.

\n
name: subscription action\n
\n

type
\nMandatory. Key tag to identify which subscription will be instantiated

\n
type: http\n
\n

avoid
\nIdentifies whether or not this subscription should not receive any message. Defaults to false.\nIf set and a message is received a failing test will be generated.\nTake a look at this to see it working.\nOn the other hand, when it's false and no message is received in a given timeout. The subscription is valid.

\n
avoid: false\n
\n

timeout
\nSets in milliseconds how long the subscription waits to expire. Defaults to 3000.\nSet to zero or less than zero to run it endlessly.

\n
timeout: 3000\n
\n

ignore
\nDefaults to false. Tells to enqueuer that this subscription should be skipped. Check this to see it working.

\n
ignore: true    \n
\n
events
\n

Available events are described here. A this object is available to access and change subscription attributes.

\n
onInit:\n  script: this.avoid = false;\n  assertions:\n  - expectToBeDefined: this.type\nonMessageReceived:  \n  assertions:\n  - expectToBeDefined: message\nonFinish:  \n  assertions:\n  - expectToBeDefined: this.type\n
\n
\n

Event

\n

Events are hook methods executed by enqueuer when an action occurs on publishers, subscriptions or requisitions.\nThis is where you'll write your tests. In its assertions field.\nThere will be a variable called this and, depending on the event's owner, it has an alias publisher, subscription or requisition.\nYou're free to explore them however you want, even doing things like this:

\n
publisher.parent.subscriptions[0].timeout = 1000;\n
\n

hooks

\n

By default, there are three hook events available:

\n

onInit
\nAvailable in requisitions, publishers and subscriptions. It gets executed as soon as the component is initialized.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

onFinish
\nAvailable in requisitions, publishers and subscriptions. It gets executed when the component is about to finish.\nAs available parameter, an elapsedTime variable is given, counting every milliseconds since the instantiation of this component.

\n

custom\nDepending on the protocol implementation/library/author's mood, the publisher/subscription may have additional hooks.\nSuch as onError, onResponseReceived, onFileNotFound and onRedirect...\nHttp-proxy subscription test file is an excellent example, check it out.

\n

fields

\n

Every hook object has 3 properties:

\n

script
\nJavascript code snippet executed when the event is triggered.\nYeah, I mean it. See it it by yourself.\nBut be careful, with great power comes great responsibility.

\n

store
\nData to be persisted across requisitions.

\n

assertions
\nArray of assertions.\nRun $ nqr -t to see available ones.\nConsider looking at this test example.\nOf course, just like almost everything else in enqueuer world, you can extend this available list using some plugin.\nYou can check them out or even write your own.

\n
onInit:\n  script: variableIdentifier = 'string value'\n\n  assertions:\n  - expect: variableIdentifier\n    toBeEqualTo: `string value`\n\nonMessageReceived:\n  script: |-\n    message += 3;\n    console.log(`Message received plus 3 is: ${message}`);\n\n  store:\n    key: message\n\n  assertions:\n  - name: anyValue #optional\n    expect: message\n    toBeEqualTo: store.key\n  - expect: message + 3\n    toBeGreaterThan: 3\n
\n

event example

\n

Check this test file to see it in practice.

\n
\n

Requisition Flow

\n

Now that you know what are requisitions, publishers, subscriptions and events. How about seeing how they interact with each other in a fancier way?

\n

\"enqueuerInstanceFlow\"

\n
\n

Configuration File

\n

To save yourself some time, a configuration file may be used.\nConfiguration files tell enqueuer which tests will be executed, log-level, and which output test report files should be generated.\nThis file tells how enqueuer should be executed.\nTo run enqueuer with the configuration:

\n
$ nqr -c path/to/configuration/file.yml\n
\n

or

\n
$ nqr --config-file path/to/configuration/file.yml\n
\n

attributes

\n

These are the configuration file attributes:

\n

files
\nRequisition file names or glob. Enqueuer runs every file that matches an element value.

\n
files:\n- 1.yml\n- 2.yml\n- *.json\n
\n

parallel
\nDefaults to false. Requisition files should be executed in parallel mode. The requisition file itself is still sequential, but the files are executes in parallel.

\n
parallel: true\n
\n

log-level
\nDefaults to warning. Defines how information are logged in the console. Accepted values are: trace; debug; info; warning (default); error; and fatal.

\n
log-level: trace\n
\n

max-report-level-print
\nDefaults to 1. The deepest level of report to be printed to the console.

\n
max-report-level-print: 2\n
\n

plugins
\nList of in plugins used by the test scenarios. You can check them out or write your own.

\n
plugins:\n- enqueuer-plugin-amqp \n- enqueuer-plugin-ws \n- enqueuer-plugin-mqtt\n- enqueuer-plugin-html-report\n
\n

outputs
\nOnce enqueuer runs every execution, it compiles a summary and sends it to every publisher listed in output.\nAn important thing to note is that every available report publisher is available here.\nYes, it means that you are able to send this report through http, tcp, etc. or through a plugin one or a custom one.\nYou can run $ nqr -p to check available report publishers installed.\nAnother important thing to note is the format value. By default a json summary is generated, but you can change it to whatever format you would like, such as: Xunit, html\nYou can run $ nqr -f to check available installed formats or even write your own

\n
outputs:\n- type: file\n  format: json (default)\n  filename: output/examples.json\n- type: file\n  format: yml\n  filename: output/examples.yml\n- type: standard-output (default)\n  format: console\n
\n

store
\nValues defined here use the 'key: value' pattern and are available to every test scenario throughout the entire execution

\n
store:\n  variableKey: \"my value\" # Defines 'variableKey' key and its value 'my value'. \n  \n  'separated key': 6\n  \n  object: # You can even define whole objects here:\n    first: first value\n    second:\n      nested: thing\n
\n

example

\n

Here's a complete example of a configuration file.

\n
\n

Variables

\n

Providing power and flexibility, enqueuer allows you to use variables placeholder replacement.\nThat's why there is a store field and you'll see a lot of << and {{ being used in the examples files.\nIt works as simple as this:

\n
name: my name is <<variableKey>>\n
\n

Every time enqueuer sees these kind of notations, it searches in its store for a key/value pair like:

\n
variableKey: `enqueuer`\n
\n

Then, when enqueuer parses the original map, it gets translated to this:

\n
name: my name is enqueuer\n
\n

By default, every ENV_VAR set is loaded automatically to the store. Check this example.

\n

set a variable

\n

There are a few ways to set a value in the store.

\n
configuration file
\n

Configuration file store object. Set it as you wish, as you can see here

\n
command line
\n

A command line argument using the key=value format. This way:

\n
$ nqr --store key=value -s anotherVariable=true\n
\n
event
\n

Dynamically set it through any event.\nBe it in its script field or straight through its store field.\nBoth ways work:

\n
onInit:\n    script: store.key = 123;\n    store:\n        anotherKey: `another Value` \n
\n

use a variable

\n

There are two ways two use a variable:

\n
non js code snippet
\n

The easiest one is to type <<variableKey>> or {{variableKey}} where you want it to be replaced in a test file, as you can see here

\n
js code snippet
\n

Using the store object. It's attributes are the keys and their values are their respective values.\nTherefore, you're free to use store.variableKey, console.log(store.variableKey); or console.log(2 * store['separated key']); and get them.\nLike this one.

\n

variables example

\n

Check out this test example test to see it working.

\n
\n

Content File Injection

\n

You are able to inject file content into a requisition/publisher/subscription field.

\n
file: <<file://path/to/file.txt>>\n
\n

Other than that, enqueuer can read it and parse its content as an object using this familiar syntax: <<tag://path/to/file?query=value&other=true>>.

\n
requisition:\n    json: <<json://path/to/file.json>>\n    yml: <<yml://path/to/file.yml>>\n    csv: <<csv://path/to/file.csv?header=true&delimiter=;>>\n    file: <<file://path/to/file.txt>>\n
\n

Once the object is parsed, your free to use it as a regular object in any event

\n
onInit:\n    script: console.log(requisition.yml.deep.field);\nonFinish:\n    assertions:\n    -   expect: json.key\n        toBeEqualTo: csv[0].key\n
\n

It get's event better.\nDue its fantastic plugin architecture design, you can extend its default modules and use any of these plugins or event write your own to parse however you want.\nThe built-in modules for object parsers are: json, yml, csv and file.\nRun $ nqr -e to see available ones.

\n

example

\n

Check out this test example test to get a full picture of it.

\n
\n

Plugins

\n

You're probably aware by now but it doesn't hurt do emphasize it: enqueuer provides an amazingly powerful plugin extensible architecture.\nIt has several plugins available, but if none of them pleases you, you're free to create your own.\nAlbeit you don't have to share the one you created, we encourage you to do so. Then go ahead and publish yours to npm and add it to our plugins list.

\n

plugin types

\n

So far, you're able to extend enqueuer default behavior in four ways. Using a protocol plugin, an object parser plugin, an asserter plugin and using a report formatter plugin.

\n
protocol
\n

A protocol plugin enables you to use a different publisher/subscription types.\nRun $ nqr -p [protocol-name] to get the full available list:

\n
publishers: \n-   name:                  custom\n-   name:                  file\n-   name:                  http\n    messageReceivedParams: statusCode, statusMessage, body\n-   name:                  stdout\n-   name:                  tcp\n-   ...\nsubscriptions: \n-   name:                  custom\n-   name:                  file\n    messageReceivedParams: content, name, size, modified, created\n-   name:                  http\n    messageReceivedParams: headers, params, query, body\n-   name:                  stdin\n-   name:                  tcp\n    messageReceivedParams: payload, stream\n-   ...\n
\n

Each one listed above has a respective example in the examples folder.\nThis one, for instance, provides support for amqp protocol, so you can create this publisher and subscription:

\n
publishers:\n-   type: amqp\n    payload: enqueuermaniac\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.key\nsubscriptions:\n-   type: amqp\n    exchange: enqueuer.exchange\n    routingKey: enqueuer.integration.test.routing.#\n    onMessageReceived:\n        assertions:\n        -   expect: payload\n            toBeEqualTo: `enqueuermaniac`\n
\n
object parser
\n

An object parser plugin enables you to read and parse files as you wish.\nThis test example demonstrates how to use it,\nRun $ nqr -e [object-parser-name] to check available ones:

\n
parsers: \n- yml, yaml\n- json\n- file\n- csv\n
\n

This one, for example, provides the ability to read xml files and inject their values like this:

\n
xmlContent: <<xml://path/to/xml/file.xml>>\n
\n
asserter
\n

An asserter plugin provides you a nicely way to use different assertions than these built-in ones.

\n
asserters: \n-   expect: \n        required:    true\n        type:        string, array\n        description: actual value\n    not: \n        required:    false\n        type:        null\n        description: negates\n    toContain: \n        required:    true\n        type:        string, any\n        description: element\n
\n

Looking at the asserter above, we can create assertions like these:

\n
assertions:\n-   expect: [`a`, 1, true]\n    not:\n    toContain: `b`\n-   expect: [`a`, 1, true]\n    toContain: 1\n
\n

Run $ nqr -t to get the full available list.\nConsider looking at this test example.

\n
report formatter
\n

A report formatter plugin gives you the ability to export enqueuer reports the way you want.\nRun $ nqr -f [formatter-name] to list available report formatters:

\n
formatters: \n- console, stdout\n- json\n- yml, yaml\n
\n

Consider looking at the example of configuration file to see it in use.\nThis one, for instance, generates xUnit like reports from enqueuer's output.

\n

plugin installation

\n

In order to enqueuer get awareness that you want to use a plugin, you have to tell it, right?\nYou can tell enqueuer to use a plugin in three different ways: using it as a command line argument, through the configuration file or letting enqueuer finding it in a default location.

\n
command line
\n

Tell enqueuer to use your plugin through command line this way $ nqr -l <plugin-folder> -l <another-plugin-folder>.\nWhere plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
configuration file
\n

Tell enqueuer to use your plugin through configuration file this way:

\n
plugins: \n-   plugin-folder\n-   another-plugin-folder\n
\n

Where plugin-folder and another-plugin-folder are the directories where the plugins are installed in.

\n
implicitly
\n

When enqueuer runs, it looks for modules in its same installation directory or in .nqr folder in the home directory, a.k.a. ~/ folder in linux distributions.\nTherefore, if you run:

\n
$ npm install --global enqueuer\n$ mkdir ~/.nqr\n$ cd ~/.nqr\n$ npm install enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

Or

\n
$ npm install --global enqueuer enqueuer-plugin-amqp\n$ nqr -p amqp\n
\n

You'll see that the enqueuer-plugin-amqp plugin will be loaded.\nEvery enqueuer compatible module gets implicitly loaded.\nIn order to be enqueuer compatible, a module has to have an entryPoint exported function in its main file and, in its package.json file, it has to have either 'enqueuer' or 'nqr' as keywords.

\n

Stacker

\n

Looking for a really really good looking an human error proof solution way of writing these requisition files?
\nConsider taking a look at stacker: open source, cross-platform, multi protocol client testing tool.\nThe official enqueuer's best friend forever. Do amazing things and change the world with enqueuer’s GUI!\nWith them, you create, manage and run requisitions and and see their results in a really nice way.\nSee this amazing beauty with your own eyes to get an idea of how it works:

\n

\"screenshot-passing\"

\n
\n

Open source

\n

We (by 'we' we mean enqueuer's maintainers not the human race, unfortunately) are very opened to any kind of contributions in general.\nAs long as they make sense and add value to the product, you're free to go.\nWe mean it, do it. Even if it's a typo fix in this README file. Go ahead.\nIf you like it but don't want to waste time creating a pull request, no problem either.\nCreate an issue, or, even easier, give it a github star. It's cheap and it doesn't hurt anyone.\nYou know what? Just head up to enqueuer's github repo and keep staring at its repo.\nIt may help somehow.

\n

contributors

\n

Thank you. It sounds cliché, but this project wouldn't be the same without the massive contribution from everyone.

\n

code it

\n

In order to contribute with some code, you have to follow a few steps.\nFirst of all, get the code:

\n
$ git clone git@github.com:enqueuer-land/enqueuer.git\n$ cd enqueuer\n
\n

Get its dependencies installed:

\n
$ npm install\n
\n

Build it:

\n
$ npm run build\n
\n

Go for it. Make the changes you want.\nAfter everything is done:

\n
$ npm run all\n
\n

Commit it:

\n
$ npm run commit\n
\n

Push it:

\n
$ git push\n
\n

feedback

\n

We'd love to get your feedback!\nIf you have any comments, suggestions, etc. you can reach us here.

\n

\"NPM\"

\n
\n
\n
\n\n\n\n\n
\n
\n\n
\n
\n \n\n
\n\n \n
\n
\n \n\n \n \n\n \n
\n
\n \n
\n
\n\n\n\n
\n \n \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n \n \n
\n \n\n
\n
\n
\n
\n\n \n \n\n
\n\n \n\n\n" headers: - date: 'Sun, 02 Feb 2020 16:26:10 GMT' + date: 'Fri, 07 Feb 2020 18:11:15 GMT' content-type: 'text/html; charset=utf-8' transfer-encoding: chunked connection: close server: GitHub.com status: '200 OK' vary: 'X-PJAX, Accept-Encoding' - etag: 'W/"77cca0288c88302b3b1d550457de96ac"' + etag: 'W/"e1412e136159ccfd75d7677e8910d8c0"' cache-control: 'max-age=0, private, must-revalidate' set-cookie: - - 'has_recent_activity=1; path=/; expires=Sun, 02 Feb 2020 17:26:09 -0000' - - '_octo=GH1.1.506107453.1580660769; domain=.github.com; path=/; expires=Tue, 02 Feb 2021 16:26:09 -0000' - - 'logged_in=no; domain=.github.com; path=/; expires=Tue, 02 Feb 2021 16:26:10 -0000; secure; HttpOnly' - - '_gh_sess=N2ladHJ3cWVmMzhtbEMvenJNMUZpL3NUUklyY3ZubGtGOUNJYWpOajZaTmRsUnVnV3UwNlZqWnRudkdQRUNzMWNVOGxtaDRpdXA2eGVFYXhqU3RraE15OXlUODVvQzY5czNBcGJoZkZuSjRmcjg4dm4yNGNPSmVscUI0RWM0ZExiMnZmQklGMEZ6bUJrNHFFZ0Q2NXp1OG1DbGhMdERrZ2NkbStGQkZhandqdnZGVkg4US8wdFJyelk1RUVjSDhzMGJJc3R2QThLQW1oK0tYWWNBS2RnOVBtb05wNzhFQllERnJiZDZJdFU0dz0tLVNGVzdEdm5tbVkxWU5yZUh0eng3amc9PQ%3D%3D--9c25bbc5296648c26501c2cc7734a15e76b18c37; path=/; secure; HttpOnly' + - '_octo=GH1.1.1893030294.1581099075; domain=.github.com; path=/; expires=Sun, 07 Feb 2021 18:11:15 -0000' + - 'logged_in=no; domain=.github.com; path=/; expires=Sun, 07 Feb 2021 18:11:15 -0000; secure; HttpOnly' + - '_gh_sess=RzUzdTUwSW1WaDE0czJUUndOdXQrcHhyYURqVEhlMEIwdmEvRFRCMDlRMXVKMGVmcnVKNUMya1RNd0MyMFpxMjI3My9lMzY1ZmVFVEJjaHQ2bzJxVVB3Um5SSmpMdzk3cVFtZ3JmNE80bk0ra2FzenpqakFsNWVtcjUrVlA4b3dFNXhEMDRqVDhncER3M2N0aVRoVFJTUVFTV1V1VXVEcTg2M2hEcWxVbHR2NG05WFd1eHRQSmhaVm9sdERSQ3hJdmx2VGJtdEVhbU8zSFA5dk9LQ2R4bm1QSC82TkRhcHZ2UmVaYjY4NXRyZz0tLUVzRXdyS3JjUUlBcFlHcElPaVpVVHc9PQ%3D%3D--ef74ccf4768e9eddea233bbcbd01261874ce5574; path=/; secure; HttpOnly' strict-transport-security: 'max-age=31536000; includeSubdomains; preload' x-frame-options: deny x-content-type-options: nosniff x-xss-protection: '1; mode=block' expect-ct: 'max-age=2592000, report-uri="https://api.github.com/_private/browser/errors"' content-security-policy: 'default-src ''none''; base-uri ''self''; block-all-mixed-content; connect-src ''self'' uploads.github.com www.githubstatus.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src github.githubassets.com; form-action ''self'' github.com gist.github.com; frame-ancestors ''none''; frame-src render.githubusercontent.com; img-src ''self'' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com; manifest-src ''self''; media-src ''none''; script-src github.githubassets.com; style-src ''unsafe-inline'' github.githubassets.com' - x-github-request-id: 'C54B:3612:3DA02F:56BFF8:5E36F821' + x-github-request-id: 'CC0D:4DF2:22A3BF:301B8A:5E3DA842' request: uri: protocol: 'https:' @@ -4177,7 +4195,7 @@ requisitions: tests: [] valid: true type: http - publishTime: '2020-02-02T16:26:10.392Z' + publishTime: '2020-02-07T18:11:15.717Z' iteration: 0 totalIterations: 1 hooks: @@ -4190,17 +4208,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 990 + elapsedTime: 1446 time: - startTime: '2020-02-02T16:26:09.403Z' - endTime: '2020-02-02T16:26:10.393Z' - totalTime: 990 + startTime: '2020-02-07T18:11:14.271Z' + endTime: '2020-02-07T18:11:15.717Z' + totalTime: 1446 timeout: 5000 requisitions: [] - valid: true name: examples/recursion.yml - id: 1326090323_00da84a874_367502 + id: 1511140204_00da84a874_499922 level: 1 subscriptions: [] publishers: [] @@ -4216,17 +4234,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 89 + elapsedTime: 83 time: - startTime: '2020-02-02T16:26:09.404Z' - endTime: '2020-02-02T16:26:09.493Z' - totalTime: 89 + startTime: '2020-02-07T18:11:14.272Z' + endTime: '2020-02-07T18:11:14.355Z' + totalTime: 83 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_75977bc4c1_616230 + id: 1511140204_75977bc4c1_997650 level: 2 subscriptions: [] publishers: [] @@ -4242,17 +4260,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 33 + elapsedTime: 32 time: - startTime: '2020-02-02T16:26:09.426Z' - endTime: '2020-02-02T16:26:09.459Z' - totalTime: 33 + startTime: '2020-02-07T18:11:14.292Z' + endTime: '2020-02-07T18:11:14.324Z' + totalTime: 32 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090323_e87d17a22e_281435 + id: 1511140204_e87d17a22e_372406 level: 2 subscriptions: [] publishers: [] @@ -4268,17 +4286,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 19 + elapsedTime: 16 time: - startTime: '2020-02-02T16:26:09.464Z' - endTime: '2020-02-02T16:26:09.483Z' - totalTime: 19 + startTime: '2020-02-07T18:11:14.329Z' + endTime: '2020-02-07T18:11:14.345Z' + totalTime: 16 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_55233c1965_624990 + id: 1511140204_55233c1965_22787 level: 3 subscriptions: [] publishers: [] @@ -4294,17 +4312,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 10 + elapsedTime: 8 time: - startTime: '2020-02-02T16:26:09.466Z' - endTime: '2020-02-02T16:26:09.477Z' - totalTime: 11 + startTime: '2020-02-07T18:11:14.331Z' + endTime: '2020-02-07T18:11:14.339Z' + totalTime: 8 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4322,15 +4340,15 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.466Z' - endTime: '2020-02-02T16:26:09.467Z' - totalTime: 1 + startTime: '2020-02-07T18:11:14.331Z' + endTime: '2020-02-07T18:11:14.333Z' + totalTime: 2 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4348,15 +4366,15 @@ requisitions: arguments: elapsedTime: 2 time: - startTime: '2020-02-02T16:26:09.470Z' - endTime: '2020-02-02T16:26:09.473Z' - totalTime: 3 + startTime: '2020-02-07T18:11:14.334Z' + endTime: '2020-02-07T18:11:14.336Z' + totalTime: 2 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4374,15 +4392,15 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.474Z' - endTime: '2020-02-02T16:26:09.476Z' - totalTime: 2 + startTime: '2020-02-07T18:11:14.337Z' + endTime: '2020-02-07T18:11:14.338Z' + totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_55233c1965_624990 + id: 1511140204_55233c1965_22787 level: 3 subscriptions: [] publishers: [] @@ -4400,15 +4418,15 @@ requisitions: arguments: elapsedTime: 4 time: - startTime: '2020-02-02T16:26:09.477Z' - endTime: '2020-02-02T16:26:09.481Z' + startTime: '2020-02-07T18:11:14.339Z' + endTime: '2020-02-07T18:11:14.343Z' totalTime: 4 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4426,15 +4444,15 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.477Z' - endTime: '2020-02-02T16:26:09.478Z' + startTime: '2020-02-07T18:11:14.339Z' + endTime: '2020-02-07T18:11:14.340Z' totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4452,15 +4470,15 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.478Z' - endTime: '2020-02-02T16:26:09.479Z' + startTime: '2020-02-07T18:11:14.340Z' + endTime: '2020-02-07T18:11:14.341Z' totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4478,15 +4496,15 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.479Z' - endTime: '2020-02-02T16:26:09.480Z' + startTime: '2020-02-07T18:11:14.341Z' + endTime: '2020-02-07T18:11:14.342Z' totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_55233c1965_624990 + id: 1511140204_55233c1965_22787 level: 3 subscriptions: [] publishers: [] @@ -4504,15 +4522,15 @@ requisitions: arguments: elapsedTime: 2 time: - startTime: '2020-02-02T16:26:09.481Z' - endTime: '2020-02-02T16:26:09.483Z' + startTime: '2020-02-07T18:11:14.343Z' + endTime: '2020-02-07T18:11:14.345Z' totalTime: 2 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4530,15 +4548,15 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.481Z' - endTime: '2020-02-02T16:26:09.482Z' + startTime: '2020-02-07T18:11:14.343Z' + endTime: '2020-02-07T18:11:14.344Z' totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4554,17 +4572,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.482Z' - endTime: '2020-02-02T16:26:09.483Z' - totalTime: 1 + startTime: '2020-02-07T18:11:14.344Z' + endTime: '2020-02-07T18:11:14.344Z' + totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4582,15 +4600,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.483Z' - endTime: '2020-02-02T16:26:09.483Z' + startTime: '2020-02-07T18:11:14.345Z' + endTime: '2020-02-07T18:11:14.345Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090323_e87d17a22e_281435 + id: 1511140204_e87d17a22e_372406 level: 2 subscriptions: [] publishers: [] @@ -4608,15 +4626,15 @@ requisitions: arguments: elapsedTime: 4 time: - startTime: '2020-02-02T16:26:09.483Z' - endTime: '2020-02-02T16:26:09.487Z' + startTime: '2020-02-07T18:11:14.345Z' + endTime: '2020-02-07T18:11:14.349Z' totalTime: 4 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_55233c1965_624990 + id: 1511140204_55233c1965_22787 level: 3 subscriptions: [] publishers: [] @@ -4634,15 +4652,15 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.484Z' - endTime: '2020-02-02T16:26:09.485Z' + startTime: '2020-02-07T18:11:14.345Z' + endTime: '2020-02-07T18:11:14.346Z' totalTime: 1 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4660,15 +4678,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.484Z' - endTime: '2020-02-02T16:26:09.484Z' + startTime: '2020-02-07T18:11:14.346Z' + endTime: '2020-02-07T18:11:14.346Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4686,15 +4704,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.484Z' - endTime: '2020-02-02T16:26:09.484Z' + startTime: '2020-02-07T18:11:14.346Z' + endTime: '2020-02-07T18:11:14.346Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4712,15 +4730,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.485Z' - endTime: '2020-02-02T16:26:09.485Z' + startTime: '2020-02-07T18:11:14.346Z' + endTime: '2020-02-07T18:11:14.346Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_55233c1965_624990 + id: 1511140204_55233c1965_22787 level: 3 subscriptions: [] publishers: [] @@ -4736,17 +4754,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.485Z' - endTime: '2020-02-02T16:26:09.486Z' - totalTime: 1 + startTime: '2020-02-07T18:11:14.347Z' + endTime: '2020-02-07T18:11:14.347Z' + totalTime: 0 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4764,15 +4782,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.485Z' - endTime: '2020-02-02T16:26:09.485Z' + startTime: '2020-02-07T18:11:14.347Z' + endTime: '2020-02-07T18:11:14.347Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4788,17 +4806,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.485Z' - endTime: '2020-02-02T16:26:09.486Z' - totalTime: 1 + startTime: '2020-02-07T18:11:14.347Z' + endTime: '2020-02-07T18:11:14.347Z' + totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4816,15 +4834,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.486Z' - endTime: '2020-02-02T16:26:09.486Z' + startTime: '2020-02-07T18:11:14.347Z' + endTime: '2020-02-07T18:11:14.347Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_55233c1965_624990 + id: 1511140204_55233c1965_22787 level: 3 subscriptions: [] publishers: [] @@ -4842,15 +4860,15 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.486Z' - endTime: '2020-02-02T16:26:09.487Z' + startTime: '2020-02-07T18:11:14.348Z' + endTime: '2020-02-07T18:11:14.349Z' totalTime: 1 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4868,15 +4886,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.486Z' - endTime: '2020-02-02T16:26:09.486Z' + startTime: '2020-02-07T18:11:14.348Z' + endTime: '2020-02-07T18:11:14.348Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4894,15 +4912,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.487Z' - endTime: '2020-02-02T16:26:09.487Z' + startTime: '2020-02-07T18:11:14.348Z' + endTime: '2020-02-07T18:11:14.348Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4920,15 +4938,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.487Z' - endTime: '2020-02-02T16:26:09.487Z' + startTime: '2020-02-07T18:11:14.348Z' + endTime: '2020-02-07T18:11:14.348Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090323_e87d17a22e_281435 + id: 1511140204_e87d17a22e_372406 level: 2 subscriptions: [] publishers: [] @@ -4944,17 +4962,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 4 + elapsedTime: 5 time: - startTime: '2020-02-02T16:26:09.488Z' - endTime: '2020-02-02T16:26:09.492Z' - totalTime: 4 + startTime: '2020-02-07T18:11:14.349Z' + endTime: '2020-02-07T18:11:14.354Z' + totalTime: 5 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_55233c1965_624990 + id: 1511140204_55233c1965_22787 level: 3 subscriptions: [] publishers: [] @@ -4970,17 +4988,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 2 time: - startTime: '2020-02-02T16:26:09.488Z' - endTime: '2020-02-02T16:26:09.489Z' - totalTime: 1 + startTime: '2020-02-07T18:11:14.349Z' + endTime: '2020-02-07T18:11:14.351Z' + totalTime: 2 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -4996,17 +5014,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 2 time: - startTime: '2020-02-02T16:26:09.488Z' - endTime: '2020-02-02T16:26:09.488Z' - totalTime: 0 + startTime: '2020-02-07T18:11:14.349Z' + endTime: '2020-02-07T18:11:14.351Z' + totalTime: 2 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -5024,15 +5042,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.488Z' - endTime: '2020-02-02T16:26:09.488Z' + startTime: '2020-02-07T18:11:14.351Z' + endTime: '2020-02-07T18:11:14.351Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -5050,15 +5068,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.489Z' - endTime: '2020-02-02T16:26:09.489Z' + startTime: '2020-02-07T18:11:14.351Z' + endTime: '2020-02-07T18:11:14.351Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_55233c1965_624990 + id: 1511140204_55233c1965_22787 level: 3 subscriptions: [] publishers: [] @@ -5074,17 +5092,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2 + elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.489Z' - endTime: '2020-02-02T16:26:09.491Z' - totalTime: 2 + startTime: '2020-02-07T18:11:14.352Z' + endTime: '2020-02-07T18:11:14.352Z' + totalTime: 0 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -5102,15 +5120,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.489Z' - endTime: '2020-02-02T16:26:09.489Z' + startTime: '2020-02-07T18:11:14.352Z' + endTime: '2020-02-07T18:11:14.352Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -5128,15 +5146,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.491Z' - endTime: '2020-02-02T16:26:09.491Z' + startTime: '2020-02-07T18:11:14.352Z' + endTime: '2020-02-07T18:11:14.352Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -5154,15 +5172,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.491Z' - endTime: '2020-02-02T16:26:09.491Z' + startTime: '2020-02-07T18:11:14.352Z' + endTime: '2020-02-07T18:11:14.352Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_55233c1965_624990 + id: 1511140204_55233c1965_22787 level: 3 subscriptions: [] publishers: [] @@ -5178,17 +5196,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.492Z' - endTime: '2020-02-02T16:26:09.492Z' - totalTime: 0 + startTime: '2020-02-07T18:11:14.353Z' + endTime: '2020-02-07T18:11:14.354Z' + totalTime: 1 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -5206,15 +5224,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.492Z' - endTime: '2020-02-02T16:26:09.492Z' + startTime: '2020-02-07T18:11:14.353Z' + endTime: '2020-02-07T18:11:14.353Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -5232,15 +5250,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.492Z' - endTime: '2020-02-02T16:26:09.492Z' + startTime: '2020-02-07T18:11:14.353Z' + endTime: '2020-02-07T18:11:14.353Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_5e02f9345e_704577 + id: 1511140204_5e02f9345e_672978 level: 4 subscriptions: [] publishers: [] @@ -5258,15 +5276,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.492Z' - endTime: '2020-02-02T16:26:09.492Z' + startTime: '2020-02-07T18:11:14.353Z' + endTime: '2020-02-07T18:11:14.353Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #2' - id: 1326090323_aef615856f_611970 + id: 1511140204_aef615856f_12569 level: 2 subscriptions: [] publishers: [] @@ -5286,17 +5304,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.493Z' - endTime: '2020-02-02T16:26:09.493Z' - totalTime: 0 + startTime: '2020-02-07T18:11:14.354Z' + endTime: '2020-02-07T18:11:14.355Z' + totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: examples/requisition-delay-iterations.yml - id: 1326090323_8e102bb4f5_211808 + id: 1511140204_8e102bb4f5_900494 level: 1 subscriptions: [] publishers: [] @@ -5312,17 +5330,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 3081 + elapsedTime: 3072 time: - startTime: '2020-02-02T16:26:09.405Z' - endTime: '2020-02-02T16:26:12.486Z' - totalTime: 3081 + startTime: '2020-02-07T18:11:14.273Z' + endTime: '2020-02-07T18:11:17.345Z' + totalTime: 3072 timeout: 5000 requisitions: - valid: true name: iterations - id: 1326090323_b4f515b70d_641013 + id: 1511140204_b4f515b70d_904922 level: 2 subscriptions: [] publishers: [] @@ -5338,17 +5356,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 33 + elapsedTime: 32 time: - startTime: '2020-02-02T16:26:09.426Z' - endTime: '2020-02-02T16:26:09.459Z' - totalTime: 33 + startTime: '2020-02-07T18:11:14.292Z' + endTime: '2020-02-07T18:11:14.324Z' + totalTime: 32 timeout: 5000 requisitions: [] - valid: true name: iterations - id: 1326090323_b4f515b70d_641013 + id: 1511140204_b4f515b70d_904922 level: 2 subscriptions: [] publishers: [] @@ -5366,15 +5384,15 @@ requisitions: arguments: elapsedTime: 5 time: - startTime: '2020-02-02T16:26:09.461Z' - endTime: '2020-02-02T16:26:09.466Z' + startTime: '2020-02-07T18:11:14.327Z' + endTime: '2020-02-07T18:11:14.332Z' totalTime: 5 timeout: 5000 requisitions: [] - valid: true name: iterations - id: 1326090323_b4f515b70d_641013 + id: 1511140204_b4f515b70d_904922 level: 2 subscriptions: [] publishers: [] @@ -5392,15 +5410,15 @@ requisitions: arguments: elapsedTime: 3 time: - startTime: '2020-02-02T16:26:09.467Z' - endTime: '2020-02-02T16:26:09.471Z' - totalTime: 4 + startTime: '2020-02-07T18:11:14.332Z' + endTime: '2020-02-07T18:11:14.335Z' + totalTime: 3 timeout: 5000 requisitions: [] - valid: true name: iterations - id: 1326090323_b4f515b70d_641013 + id: 1511140204_b4f515b70d_904922 level: 2 subscriptions: [] publishers: [] @@ -5416,17 +5434,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 3 + elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.472Z' - endTime: '2020-02-02T16:26:09.475Z' - totalTime: 3 + startTime: '2020-02-07T18:11:14.336Z' + endTime: '2020-02-07T18:11:14.337Z' + totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: iterations - id: 1326090323_b4f515b70d_641013 + id: 1511140204_b4f515b70d_904922 level: 2 subscriptions: [] publishers: [] @@ -5442,17 +5460,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.475Z' - endTime: '2020-02-02T16:26:09.476Z' - totalTime: 1 + startTime: '2020-02-07T18:11:14.338Z' + endTime: '2020-02-07T18:11:14.338Z' + totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: iterations - id: 1326090323_b4f515b70d_641013 + id: 1511140204_b4f515b70d_904922 level: 2 subscriptions: [] publishers: [] @@ -5468,17 +5486,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2 + elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.476Z' - endTime: '2020-02-02T16:26:09.478Z' - totalTime: 2 + startTime: '2020-02-07T18:11:14.338Z' + endTime: '2020-02-07T18:11:14.339Z' + totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: iterations - id: 1326090323_b4f515b70d_641013 + id: 1511140204_b4f515b70d_904922 level: 2 subscriptions: [] publishers: [] @@ -5496,15 +5514,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.478Z' - endTime: '2020-02-02T16:26:09.479Z' - totalTime: 1 + startTime: '2020-02-07T18:11:14.340Z' + endTime: '2020-02-07T18:11:14.340Z' + totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: iterations - id: 1326090323_b4f515b70d_641013 + id: 1511140204_b4f515b70d_904922 level: 2 subscriptions: [] publishers: [] @@ -5522,15 +5540,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.479Z' - endTime: '2020-02-02T16:26:09.480Z' - totalTime: 1 + startTime: '2020-02-07T18:11:14.341Z' + endTime: '2020-02-07T18:11:14.341Z' + totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: iterations - id: 1326090323_b4f515b70d_641013 + id: 1511140204_b4f515b70d_904922 level: 2 subscriptions: [] publishers: [] @@ -5546,17 +5564,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.480Z' - endTime: '2020-02-02T16:26:09.480Z' - totalTime: 0 + startTime: '2020-02-07T18:11:14.341Z' + endTime: '2020-02-07T18:11:14.342Z' + totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: iterations - id: 1326090323_b4f515b70d_641013 + id: 1511140204_b4f515b70d_904922 level: 2 subscriptions: [] publishers: [] @@ -5572,17 +5590,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.481Z' - endTime: '2020-02-02T16:26:09.481Z' - totalTime: 0 + startTime: '2020-02-07T18:11:14.342Z' + endTime: '2020-02-07T18:11:14.343Z' + totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: delayed - id: 1326090323_ce1438bac6_140084 + id: 1511140204_ce1438bac6_340971 level: 2 subscriptions: [] publishers: [] @@ -5604,23 +5622,23 @@ requisitions: - name: 'Elapsed time' valid: true - description: 'Expected ''elapsedTime'' to be greater than or equal to ''2950''. Received ''3003''' + description: 'Expected ''elapsedTime'' to be greater than or equal to ''2950''. Received ''3000''' - name: 'Assertion #2' valid: true - description: 'Expected ''new Date().getTime() - requisition.startTime.getTime()'' to be greater than or equal to ''2950''. Received ''3003''' + description: 'Expected ''new Date().getTime() - requisition.startTime.getTime()'' to be greater than or equal to ''2950''. Received ''3001''' arguments: - elapsedTime: 3003 + elapsedTime: 3000 time: - startTime: '2020-02-02T16:26:09.482Z' - endTime: '2020-02-02T16:26:12.485Z' - totalTime: 3003 + startTime: '2020-02-07T18:11:14.344Z' + endTime: '2020-02-07T18:11:17.345Z' + totalTime: 3001 timeout: 5000 requisitions: [] - valid: true name: examples/skipped.yml - id: 1326090323_bb333e1dde_940400 + id: 1511140204_bb333e1dde_523161 level: 1 subscriptions: [] publishers: [] @@ -5636,17 +5654,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 76 + elapsedTime: 70 time: - startTime: '2020-02-02T16:26:09.406Z' - endTime: '2020-02-02T16:26:09.482Z' - totalTime: 76 + startTime: '2020-02-07T18:11:14.274Z' + endTime: '2020-02-07T18:11:14.344Z' + totalTime: 70 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090323_fc4b0751bf_440992 + id: 1511140204_fc4b0751bf_937586 level: 2 subscriptions: [] publishers: [] @@ -5662,17 +5680,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 33 + elapsedTime: 32 time: - startTime: '2020-02-02T16:26:09.426Z' - endTime: '2020-02-02T16:26:09.459Z' + startTime: '2020-02-07T18:11:14.292Z' + endTime: '2020-02-07T18:11:14.325Z' totalTime: 33 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_fc4b0751bf_440992 + id: 1511140204_fc4b0751bf_937586 level: 2 subscriptions: [] publishers: [] @@ -5688,17 +5706,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 4 + elapsedTime: 5 time: - startTime: '2020-02-02T16:26:09.462Z' - endTime: '2020-02-02T16:26:09.466Z' - totalTime: 4 + startTime: '2020-02-07T18:11:14.327Z' + endTime: '2020-02-07T18:11:14.332Z' + totalTime: 5 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_fc4b0751bf_440992 + id: 1511140204_fc4b0751bf_937586 level: 2 subscriptions: [] publishers: [] @@ -5716,15 +5734,15 @@ requisitions: arguments: elapsedTime: 3 time: - startTime: '2020-02-02T16:26:09.467Z' - endTime: '2020-02-02T16:26:09.471Z' - totalTime: 4 + startTime: '2020-02-07T18:11:14.332Z' + endTime: '2020-02-07T18:11:14.335Z' + totalTime: 3 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_fc4b0751bf_440992 + id: 1511140204_fc4b0751bf_937586 level: 2 subscriptions: [] publishers: [] @@ -5740,17 +5758,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2 + elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.473Z' - endTime: '2020-02-02T16:26:09.475Z' - totalTime: 2 + startTime: '2020-02-07T18:11:14.336Z' + endTime: '2020-02-07T18:11:14.337Z' + totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #0' - id: 1326090323_fc4b0751bf_440992 + id: 1511140204_fc4b0751bf_937586 level: 2 subscriptions: [] publishers: [] @@ -5768,15 +5786,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.476Z' - endTime: '2020-02-02T16:26:09.476Z' + startTime: '2020-02-07T18:11:14.338Z' + endTime: '2020-02-07T18:11:14.338Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090323_0813922659_121521 + id: 1511140204_0813922659_940953 level: 2 subscriptions: [] publishers: [] @@ -5796,17 +5814,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.477Z' - endTime: '2020-02-02T16:26:09.478Z' + startTime: '2020-02-07T18:11:14.339Z' + endTime: '2020-02-07T18:11:14.340Z' totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #2' - id: 1326090323_38e558917b_36270 + id: 1511140204_38e558917b_266492 level: 2 subscriptions: [] publishers: [] @@ -5824,14 +5842,14 @@ requisitions: name: 'Requisition skipped' description: 'There is no iterations set to this requisition' time: - startTime: '2020-02-02T16:26:09.478Z' - endTime: '2020-02-02T16:26:09.478Z' + startTime: '2020-02-07T18:11:14.340Z' + endTime: '2020-02-07T18:11:14.340Z' totalTime: 0 requisitions: [] - valid: true name: 'Requisition #3' - id: 1326090323_4aa5c78448_113015 + id: 1511140204_4aa5c78448_256349 level: 2 subscriptions: [] publishers: [] @@ -5849,14 +5867,14 @@ requisitions: name: 'Requisition skipped' description: 'There is no iterations set to this requisition' time: - startTime: '2020-02-02T16:26:09.478Z' - endTime: '2020-02-02T16:26:09.478Z' + startTime: '2020-02-07T18:11:14.340Z' + endTime: '2020-02-07T18:11:14.340Z' totalTime: 0 requisitions: [] - valid: true name: 'Requisition #4' - id: 1326090323_6ac450666c_362401 + id: 1511140204_6ac450666c_727454 level: 2 subscriptions: [] publishers: [] @@ -5874,14 +5892,14 @@ requisitions: name: 'Requisition skipped' description: 'There is no iterations set to this requisition' time: - startTime: '2020-02-02T16:26:09.479Z' - endTime: '2020-02-02T16:26:09.479Z' + startTime: '2020-02-07T18:11:14.340Z' + endTime: '2020-02-07T18:11:14.340Z' totalTime: 0 requisitions: [] - valid: true name: 'Requisition #5' - id: 1326090323_23f493719b_538634 + id: 1511140204_23f493719b_872052 level: 2 subscriptions: [] publishers: [] @@ -5903,15 +5921,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.479Z' - endTime: '2020-02-02T16:26:09.479Z' + startTime: '2020-02-07T18:11:14.341Z' + endTime: '2020-02-07T18:11:14.341Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #6' - id: 1326090323_f9b72d5147_565453 + id: 1511140204_f9b72d5147_857211 level: 2 subscriptions: [] publishers: [] @@ -5929,15 +5947,15 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2020-02-02T16:26:09.480Z' - endTime: '2020-02-02T16:26:09.480Z' + startTime: '2020-02-07T18:11:14.342Z' + endTime: '2020-02-07T18:11:14.342Z' totalTime: 0 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #7' - id: 1326090323_b41f5d915d_720871 + id: 1511140204_b41f5d915d_349670 level: 2 subscriptions: [] publishers: [] @@ -5957,17 +5975,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.481Z' - endTime: '2020-02-02T16:26:09.482Z' + startTime: '2020-02-07T18:11:14.342Z' + endTime: '2020-02-07T18:11:14.343Z' totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: examples/ssl.yml - id: 1326090323_fbc833de59_678174 + id: 1511140204_fbc833de59_769119 level: 1 subscriptions: [] publishers: [] @@ -5983,21 +6001,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 4144 + elapsedTime: 4170 time: - startTime: '2020-02-02T16:26:09.408Z' - endTime: '2020-02-02T16:26:13.552Z' - totalTime: 4144 + startTime: '2020-02-07T18:11:14.276Z' + endTime: '2020-02-07T18:11:18.446Z' + totalTime: 4170 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090324_ec6b6289cc_556041 + id: 1511140204_ec6b6289cc_925598 level: 2 subscriptions: - - id: 1326090324_d5884fd0ec_790714 + id: 1511140205_d5884fd0ec_219033 name: 'Subscription #0' type: ssl hooks: @@ -6014,7 +6032,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 2118 + elapsedTime: 2146 onMessageReceived: valid: true tests: @@ -6028,12 +6046,12 @@ requisitions: address: '::ffff:127.0.0.1' family: IPv6 port: 23082 - elapsedTime: 127 + elapsedTime: 144 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.359Z' publishers: - - id: 1326090324_e063362e26_870487 + id: 1511140204_e063362e26_676526 name: 'Publisher #0' valid: true hooks: @@ -6044,7 +6062,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 2117 + elapsedTime: 2146 tests: - name: Published @@ -6057,16 +6075,20 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 50496 - elapsedTime: 4125 + port: 52235 + elapsedTime: 4154 tests: - name: 'Assertion #0' valid: true description: 'Expected ''payload'' to be equal to ''hisecureResponse''. Received ''hisecureResponse''' + - + name: 'Assertion #0' + valid: true + description: 'Expected ''payload'' to be equal to ''hisecureResponse''. Received ''hisecureResponse''' valid: true type: ssl - publishTime: '2020-02-02T16:26:11.545Z' + publishTime: '2020-02-07T18:11:16.439Z' iteration: 0 totalIterations: 1 hooks: @@ -6079,21 +6101,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2118 + elapsedTime: 2146 time: - startTime: '2020-02-02T16:26:09.427Z' - endTime: '2020-02-02T16:26:11.545Z' - totalTime: 2118 + startTime: '2020-02-07T18:11:14.293Z' + endTime: '2020-02-07T18:11:16.439Z' + totalTime: 2146 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090324_c8e796a6f7_194315 + id: 1511140205_c8e796a6f7_99889 level: 2 subscriptions: - - id: 1326090324_464eaccac3_802736 + id: 1511140205_464eaccac3_224127 name: 'Subscription #0' type: ssl hooks: @@ -6124,12 +6146,12 @@ requisitions: address: '::ffff:127.0.0.1' family: IPv6 port: 23082 - elapsedTime: 1 + elapsedTime: 0 valid: true - subscriptionTime: '2020-02-02T16:26:11.547Z' + subscriptionTime: '2020-02-07T18:11:16.440Z' publishers: - - id: 1326090324_26f6887fe6_662428 + id: 1511140205_26f6887fe6_917422 name: 'Publisher #0' valid: true hooks: @@ -6140,7 +6162,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 2004 + elapsedTime: 2005 tests: - name: Published @@ -6153,16 +6175,20 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 50496 - elapsedTime: 2006 + port: 52235 + elapsedTime: 2007 tests: - name: 'Assertion #0' valid: true description: 'Expected ''payload'' to be equal to ''reusingSecureResponse''. Received ''reusingSecureResponse''' + - + name: 'Assertion #0' + valid: true + description: 'Expected ''payload'' to be equal to ''reusingSecureResponse''. Received ''reusingSecureResponse''' valid: true type: ssl - publishTime: '2020-02-02T16:26:13.551Z' + publishTime: '2020-02-07T18:11:18.445Z' iteration: 0 totalIterations: 1 hooks: @@ -6177,15 +6203,15 @@ requisitions: arguments: elapsedTime: 2005 time: - startTime: '2020-02-02T16:26:11.546Z' - endTime: '2020-02-02T16:26:13.551Z' - totalTime: 2005 + startTime: '2020-02-07T18:11:16.440Z' + endTime: '2020-02-07T18:11:18.446Z' + totalTime: 2006 timeout: 5000 requisitions: [] - valid: true name: examples/stdin.yml - id: 1326090324_ae6c8a1714_12288 + id: 1511140205_ae6c8a1714_382167 level: 1 subscriptions: - @@ -6206,7 +6232,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 110 + elapsedTime: 119 onMessageReceived: valid: true tests: @@ -6216,9 +6242,9 @@ requisitions: description: 'Expected ''message'' to be equal to ''enqueuer standard-input payload''. Received ''enqueuer standard-input payload''' arguments: message: 'enqueuer standard-input payload' - elapsedTime: 110 + elapsedTime: 119 valid: true - subscriptionTime: '2020-02-02T16:26:09.451Z' + subscriptionTime: '2020-02-07T18:11:14.317Z' publishers: [] iteration: 0 totalIterations: 1 @@ -6232,17 +6258,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 110 + elapsedTime: 119 time: - startTime: '2020-02-02T16:26:09.408Z' - endTime: '2020-02-02T16:26:09.518Z' - totalTime: 110 + startTime: '2020-02-07T18:11:14.276Z' + endTime: '2020-02-07T18:11:14.395Z' + totalTime: 119 timeout: 5000 requisitions: [] - valid: true name: examples/store.yml - id: 1326090324_7b9aa96592_677876 + id: 1511140205_7b9aa96592_705009 level: 1 subscriptions: [] publishers: [] @@ -6258,17 +6284,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 67 + elapsedTime: 61 time: - startTime: '2020-02-02T16:26:09.409Z' - endTime: '2020-02-02T16:26:09.476Z' - totalTime: 67 + startTime: '2020-02-07T18:11:14.277Z' + endTime: '2020-02-07T18:11:14.338Z' + totalTime: 61 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090324_478dfcaed5_80651 + id: 1511140205_478dfcaed5_320025 level: 2 subscriptions: [] publishers: [] @@ -6284,17 +6310,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 31 + elapsedTime: 30 time: - startTime: '2020-02-02T16:26:09.428Z' - endTime: '2020-02-02T16:26:09.459Z' + startTime: '2020-02-07T18:11:14.294Z' + endTime: '2020-02-07T18:11:14.325Z' totalTime: 31 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090324_c96621cca9_250540 + id: 1511140205_c96621cca9_769605 level: 2 subscriptions: [] publishers: [] @@ -6320,15 +6346,15 @@ requisitions: arguments: elapsedTime: 3 time: - startTime: '2020-02-02T16:26:09.464Z' - endTime: '2020-02-02T16:26:09.467Z' + startTime: '2020-02-07T18:11:14.329Z' + endTime: '2020-02-07T18:11:14.332Z' totalTime: 3 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #2' - id: 1326090324_05a830b0a8_675306 + id: 1511140205_05a830b0a8_472992 level: 2 subscriptions: [] publishers: [] @@ -6348,17 +6374,17 @@ requisitions: valid: true description: 'Expected ''124'' to be equal to ''124''. Received ''124''' arguments: - elapsedTime: 3 + elapsedTime: 1 time: - startTime: '2020-02-02T16:26:09.470Z' - endTime: '2020-02-02T16:26:09.473Z' - totalTime: 3 + startTime: '2020-02-07T18:11:14.335Z' + endTime: '2020-02-07T18:11:14.336Z' + totalTime: 1 timeout: 5000 requisitions: [] - valid: true name: examples/tcp.yml - id: 1326090324_bf35f3e127_650247 + id: 1511140205_bf35f3e127_300482 level: 1 subscriptions: [] publishers: [] @@ -6374,21 +6400,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2927 + elapsedTime: 2942 time: - startTime: '2020-02-02T16:26:09.412Z' - endTime: '2020-02-02T16:26:12.340Z' - totalTime: 2928 + startTime: '2020-02-07T18:11:14.279Z' + endTime: '2020-02-07T18:11:17.221Z' + totalTime: 2942 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090324_595f6dfba1_78810 + id: 1511140205_595f6dfba1_682550 level: 2 subscriptions: - - id: 1326090324_4e5617f719_775574 + id: 1511140205_4e5617f719_610250 name: 'Subscription #0' type: tcp hooks: @@ -6405,7 +6431,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 1099 + elapsedTime: 1112 onMessageReceived: valid: true tests: @@ -6423,12 +6449,12 @@ requisitions: address: '::ffff:127.0.0.1' family: IPv6 port: 23069 - elapsedTime: 99 + elapsedTime: 112 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.359Z' publishers: - - id: 1326090324_3b7a9e3645_958173 + id: 1511140205_3b7a9e3645_89594 name: 'Publisher #0' valid: true hooks: @@ -6439,7 +6465,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 1099 + elapsedTime: 1112 tests: - name: Published @@ -6452,16 +6478,20 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 50495 - elapsedTime: 1101 + port: 52236 + elapsedTime: 1115 tests: - name: 'Assertion #0' valid: true description: 'Expected ''payload'' to be equal to ''Do not make it bad''. Received ''Do not make it bad''' + - + name: 'Assertion #0' + valid: true + description: 'Expected ''payload'' to be equal to ''Do not make it bad''. Received ''Do not make it bad''' valid: true type: tcp - publishTime: '2020-02-02T16:26:10.528Z' + publishTime: '2020-02-07T18:11:15.406Z' iteration: 0 totalIterations: 1 hooks: @@ -6474,21 +6504,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1099 + elapsedTime: 1112 time: - startTime: '2020-02-02T16:26:09.429Z' - endTime: '2020-02-02T16:26:10.528Z' - totalTime: 1099 + startTime: '2020-02-07T18:11:14.294Z' + endTime: '2020-02-07T18:11:15.406Z' + totalTime: 1112 timeout: 3000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090324_3f1b829a68_104658 + id: 1511140205_3f1b829a68_550132 level: 2 subscriptions: - - id: 1326090324_944c1488d1_180845 + id: 1511140205_944c1488d1_685762 name: 'Subscription #0' type: tcp hooks: @@ -6505,7 +6535,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 806 + elapsedTime: 804 onMessageReceived: valid: true tests: @@ -6521,10 +6551,10 @@ requisitions: port: 23070 elapsedTime: 2 valid: true - subscriptionTime: '2020-02-02T16:26:10.530Z' + subscriptionTime: '2020-02-07T18:11:15.408Z' publishers: - - id: 1326090324_369e07d49e_578315 + id: 1511140205_369e07d49e_584422 name: 'Publisher #0' valid: true hooks: @@ -6535,7 +6565,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 806 + elapsedTime: 804 tests: - name: Published @@ -6548,16 +6578,20 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 50514 - elapsedTime: 1811 + port: 52254 + elapsedTime: 1814 tests: - name: 'Assertion #0' valid: true description: 'Expected ''payload'' to be equal to ''EnqueuerRocks''. Received ''EnqueuerRocks''' + - + name: 'Assertion #0' + valid: true + description: 'Expected ''payload'' to be equal to ''EnqueuerRocks''. Received ''EnqueuerRocks''' valid: true type: tcp - publishTime: '2020-02-02T16:26:11.335Z' + publishTime: '2020-02-07T18:11:16.212Z' iteration: 0 totalIterations: 1 hooks: @@ -6570,21 +6604,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 806 + elapsedTime: 804 time: - startTime: '2020-02-02T16:26:10.529Z' - endTime: '2020-02-02T16:26:11.335Z' - totalTime: 806 + startTime: '2020-02-07T18:11:15.408Z' + endTime: '2020-02-07T18:11:16.212Z' + totalTime: 804 timeout: 3000 requisitions: [] - valid: true name: 'Requisition #2' - id: 1326090326_7b3d80f664_373689 + id: 1511140205_7b3d80f664_28088 level: 2 subscriptions: - - id: 1326090326_a5c6b9dc6a_608763 + id: 1511140205_a5c6b9dc6a_803502 name: 'Subscription #0' type: tcp hooks: @@ -6601,7 +6635,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 1002 + elapsedTime: 1006 onMessageReceived: valid: true tests: @@ -6617,10 +6651,10 @@ requisitions: port: 23070 elapsedTime: 1 valid: true - subscriptionTime: '2020-02-02T16:26:11.338Z' + subscriptionTime: '2020-02-07T18:11:16.215Z' publishers: - - id: 1326090326_c04ec1e8aa_673583 + id: 1511140205_c04ec1e8aa_196334 name: 'Publisher #0' valid: true hooks: @@ -6631,7 +6665,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 1002 + elapsedTime: 1006 tests: - name: Published @@ -6644,16 +6678,20 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 50514 - elapsedTime: 1003 + port: 52254 + elapsedTime: 1008 tests: - name: 'Assertion #0' valid: true description: 'Expected ''payload'' to be equal to ''enqueuer Rocks''. Received ''enqueuer Rocks''' + - + name: 'Assertion #0' + valid: true + description: 'Expected ''payload'' to be equal to ''enqueuer Rocks''. Received ''enqueuer Rocks''' valid: true type: tcp - publishTime: '2020-02-02T16:26:12.339Z' + publishTime: '2020-02-07T18:11:17.220Z' iteration: 0 totalIterations: 1 hooks: @@ -6666,17 +6704,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1002 + elapsedTime: 1006 time: - startTime: '2020-02-02T16:26:11.337Z' - endTime: '2020-02-02T16:26:12.339Z' - totalTime: 1002 + startTime: '2020-02-07T18:11:16.214Z' + endTime: '2020-02-07T18:11:17.221Z' + totalTime: 1007 timeout: 3000 requisitions: [] - valid: true name: examples/udp.yml - id: 1326090326_f69fa0cdb2_80632 + id: 1511140205_f69fa0cdb2_32374 level: 1 subscriptions: [] publishers: [] @@ -6692,21 +6730,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 108 + elapsedTime: 119 time: - startTime: '2020-02-02T16:26:09.413Z' - endTime: '2020-02-02T16:26:09.521Z' - totalTime: 108 + startTime: '2020-02-07T18:11:14.280Z' + endTime: '2020-02-07T18:11:14.399Z' + totalTime: 119 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090327_ac96cfadf9_874092 + id: 1511140205_ac96cfadf9_213463 level: 2 subscriptions: - - id: 1326090327_6e62597dc8_189723 + id: 1511140205_6e62597dc8_110847 name: 'subscription description' type: udp hooks: @@ -6723,7 +6761,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 91 + elapsedTime: 103 onMessageReceived: valid: true tests: @@ -6744,14 +6782,14 @@ requisitions: remoteInfo: address: 127.0.0.1 family: IPv4 - port: 55658 + port: 60067 size: 2 - elapsedTime: 90 + elapsedTime: 103 valid: true - subscriptionTime: '2020-02-02T16:26:09.454Z' + subscriptionTime: '2020-02-07T18:11:14.321Z' publishers: - - id: 1326090327_f1c5db9ba9_776282 + id: 1511140205_f1c5db9ba9_345091 name: 'publisher description' valid: true hooks: @@ -6762,7 +6800,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 91 + elapsedTime: 103 tests: - name: Published @@ -6770,7 +6808,7 @@ requisitions: description: 'Published successfully' valid: true type: udp - publishTime: '2020-02-02T16:26:09.504Z' + publishTime: '2020-02-07T18:11:14.369Z' iteration: 0 totalIterations: 1 hooks: @@ -6783,17 +6821,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 91 + elapsedTime: 103 time: - startTime: '2020-02-02T16:26:09.430Z' - endTime: '2020-02-02T16:26:09.521Z' - totalTime: 91 + startTime: '2020-02-07T18:11:14.295Z' + endTime: '2020-02-07T18:11:14.399Z' + totalTime: 104 timeout: 5000 requisitions: [] - valid: true name: examples/uds.yml - id: 1326090327_c449648554_373667 + id: 1511140205_c449648554_755489 level: 1 subscriptions: [] publishers: [] @@ -6811,19 +6849,19 @@ requisitions: arguments: elapsedTime: 5106 time: - startTime: '2020-02-02T16:26:09.416Z' - endTime: '2020-02-02T16:26:14.522Z' + startTime: '2020-02-07T18:11:14.283Z' + endTime: '2020-02-07T18:11:19.389Z' totalTime: 5106 timeout: 7000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090327_7acc07c435_347242 + id: 1511140205_7acc07c435_570747 level: 2 subscriptions: - - id: 1326090327_5e03c0017a_408943 + id: 1511140205_5e03c0017a_297054 name: 'Subscription #0' type: uds hooks: @@ -6840,7 +6878,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 2081 + elapsedTime: 2078 onMessageReceived: valid: true tests: @@ -6856,12 +6894,12 @@ requisitions: payload: enqueuer stream: {} path: /tmp/unix.sock - elapsedTime: 93 + elapsedTime: 104 valid: true - subscriptionTime: '2020-02-02T16:26:09.496Z' + subscriptionTime: '2020-02-07T18:11:14.359Z' publishers: - - id: 1326090327_b14ca3892b_434159 + id: 1511140205_b14ca3892b_883472 name: 'Publisher #0' valid: true hooks: @@ -6872,7 +6910,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 2081 + elapsedTime: 2079 tests: - name: Published @@ -6883,15 +6921,19 @@ requisitions: arguments: payload: responsePayload stream: {} - elapsedTime: 2083 + elapsedTime: 2082 tests: - name: 'Assertion #0' valid: true description: 'Expected ''payload'' to be equal to ''responsePayload''. Received ''responsePayload''' + - + name: 'Assertion #0' + valid: true + description: 'Expected ''payload'' to be equal to ''responsePayload''. Received ''responsePayload''' valid: true type: uds - publishTime: '2020-02-02T16:26:11.511Z' + publishTime: '2020-02-07T18:11:16.374Z' iteration: 0 totalIterations: 1 hooks: @@ -6904,21 +6946,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2081 + elapsedTime: 2078 time: - startTime: '2020-02-02T16:26:09.431Z' - endTime: '2020-02-02T16:26:11.512Z' - totalTime: 2081 + startTime: '2020-02-07T18:11:14.296Z' + endTime: '2020-02-07T18:11:16.375Z' + totalTime: 2079 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090327_591e70c91e_349720 + id: 1511140205_591e70c91e_418553 level: 2 subscriptions: - - id: 1326090327_81ccf3e7f8_711096 + id: 1511140206_81ccf3e7f8_131664 name: 'Subscription #0' type: uds hooks: @@ -6935,7 +6977,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 1004 + elapsedTime: 1006 onMessageReceived: valid: true tests: @@ -6947,12 +6989,12 @@ requisitions: payload: enqueuer stream: {} path: /tmp/unix2.sock - elapsedTime: 1 + elapsedTime: 2 valid: true - subscriptionTime: '2020-02-02T16:26:11.514Z' + subscriptionTime: '2020-02-07T18:11:16.377Z' publishers: - - id: 1326090327_297aae1eb3_951454 + id: 1511140205_297aae1eb3_671699 name: 'Publisher #0' valid: true hooks: @@ -6967,7 +7009,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 1004 + elapsedTime: 1006 tests: - name: Published @@ -6975,7 +7017,7 @@ requisitions: description: 'Published successfully' valid: true type: uds - publishTime: '2020-02-02T16:26:12.516Z' + publishTime: '2020-02-07T18:11:17.382Z' iteration: 0 totalIterations: 1 hooks: @@ -6988,21 +7030,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1004 + elapsedTime: 1006 time: - startTime: '2020-02-02T16:26:11.513Z' - endTime: '2020-02-02T16:26:12.517Z' - totalTime: 1004 + startTime: '2020-02-07T18:11:16.376Z' + endTime: '2020-02-07T18:11:17.383Z' + totalTime: 1007 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #2' - id: 1326090327_3321951a43_523542 + id: 1511140206_3321951a43_413848 level: 2 subscriptions: - - id: 1326090327_d308bbf817_740573 + id: 1511140206_d308bbf817_172021 name: 'Subscription #0' type: uds hooks: @@ -7019,7 +7061,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 2004 + elapsedTime: 2005 onMessageReceived: valid: true tests: @@ -7030,12 +7072,12 @@ requisitions: arguments: payload: 'I am still opened' stream: {} - elapsedTime: 1 + elapsedTime: 0 valid: true - subscriptionTime: '2020-02-02T16:26:12.519Z' + subscriptionTime: '2020-02-07T18:11:17.384Z' publishers: - - id: 1326090327_b6920facd0_307945 + id: 1511140206_b6920facd0_335780 name: 'Publisher #0' valid: true hooks: @@ -7046,7 +7088,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 2004 + elapsedTime: 2005 tests: - name: Published @@ -7057,7 +7099,7 @@ requisitions: arguments: payload: 'I am still bidirectional' stream: {} - elapsedTime: 2002 + elapsedTime: 2003 tests: - name: 'Assertion #0' @@ -7065,7 +7107,7 @@ requisitions: description: 'Expected ''payload'' to be equal to ''I am still bidirectional''. Received ''I am still bidirectional''' valid: true type: uds - publishTime: '2020-02-02T16:26:14.520Z' + publishTime: '2020-02-07T18:11:19.387Z' iteration: 0 totalIterations: 1 hooks: @@ -7078,17 +7120,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2004 + elapsedTime: 2005 time: - startTime: '2020-02-02T16:26:12.518Z' - endTime: '2020-02-02T16:26:14.522Z' - totalTime: 2004 + startTime: '2020-02-07T18:11:17.384Z' + endTime: '2020-02-07T18:11:19.389Z' + totalTime: 2005 timeout: 5000 requisitions: [] - valid: true name: examples/variables.yml - id: 1326090327_3a6eb18d6d_614435 + id: 1511140206_3a6eb18d6d_42583 level: 1 subscriptions: [] publishers: [] @@ -7104,17 +7146,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 55 + elapsedTime: 51 time: - startTime: '2020-02-02T16:26:09.417Z' - endTime: '2020-02-02T16:26:09.472Z' - totalTime: 55 + startTime: '2020-02-07T18:11:14.284Z' + endTime: '2020-02-07T18:11:14.336Z' + totalTime: 52 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 1326090327_bdf0ac0681_948090 + id: 1511140206_bdf0ac0681_927032 level: 2 subscriptions: [] publishers: [] @@ -7138,17 +7180,17 @@ requisitions: valid: true description: 'Expected ''store.otherKey / 2'' to be equal to ''1''. Received ''1''' arguments: - elapsedTime: 28 + elapsedTime: 27 time: - startTime: '2020-02-02T16:26:09.431Z' - endTime: '2020-02-02T16:26:09.459Z' + startTime: '2020-02-07T18:11:14.297Z' + endTime: '2020-02-07T18:11:14.325Z' totalTime: 28 timeout: 5000 requisitions: [] - valid: true name: 'Requisition #1' - id: 1326090327_5153bc0c75_663320 + id: 1511140206_5153bc0c75_289410 level: 2 subscriptions: [] publishers: [] @@ -7176,17 +7218,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 3 + elapsedTime: 2 time: - startTime: '2020-02-02T16:26:09.464Z' - endTime: '2020-02-02T16:26:09.467Z' - totalTime: 3 + startTime: '2020-02-07T18:11:14.330Z' + endTime: '2020-02-07T18:11:14.332Z' + totalTime: 2 timeout: 5000 requisitions: [] - valid: true name: examples/number.json - id: 1326090327_1925b227c5_451322 + id: 1511140206_1925b227c5_217578 level: 1 subscriptions: [] publishers: [] @@ -7210,17 +7252,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 41 + elapsedTime: 40 time: - startTime: '2020-02-02T16:26:09.417Z' - endTime: '2020-02-02T16:26:09.459Z' - totalTime: 42 + startTime: '2020-02-07T18:11:14.284Z' + endTime: '2020-02-07T18:11:14.324Z' + totalTime: 40 timeout: 5000 requisitions: [] - valid: true name: examples/requisition-navigation.yaml - id: 1326090327_e848774ac1_270044 + id: 1511140206_e848774ac1_498495 level: 1 subscriptions: [] publishers: [] @@ -7236,17 +7278,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 54 + elapsedTime: 50 time: - startTime: '2020-02-02T16:26:09.418Z' - endTime: '2020-02-02T16:26:09.472Z' - totalTime: 54 + startTime: '2020-02-07T18:11:14.285Z' + endTime: '2020-02-07T18:11:14.336Z' + totalTime: 51 timeout: 5000 requisitions: - valid: true name: first - id: 1326090327_542da8f206_38299 + id: 1511140206_542da8f206_725926 level: 2 subscriptions: [] publishers: [] @@ -7268,15 +7310,15 @@ requisitions: arguments: elapsedTime: 27 time: - startTime: '2020-02-02T16:26:09.432Z' - endTime: '2020-02-02T16:26:09.459Z' - totalTime: 27 + startTime: '2020-02-07T18:11:14.297Z' + endTime: '2020-02-07T18:11:14.325Z' + totalTime: 28 timeout: 5000 requisitions: [] - valid: true name: second - id: 1326090327_d7c80e2b4e_623870 + id: 1511140206_d7c80e2b4e_726115 level: 2 subscriptions: [] publishers: [] @@ -7298,8 +7340,8 @@ requisitions: arguments: elapsedTime: 2 time: - startTime: '2020-02-02T16:26:09.465Z' - endTime: '2020-02-02T16:26:09.467Z' + startTime: '2020-02-07T18:11:14.330Z' + endTime: '2020-02-07T18:11:14.332Z' totalTime: 2 timeout: 5000 requisitions: [] diff --git a/src/configurations/configuration.ts b/src/configurations/configuration.ts index bc57045a..d0de7ef6 100644 --- a/src/configurations/configuration.ts +++ b/src/configurations/configuration.ts @@ -6,7 +6,7 @@ import {DynamicModulesManager} from '../plugins/dynamic-modules-manager'; import {LogLevel} from '../loggers/log-level'; import {prettifyJson} from '../outputs/prettify-json'; -process.setMaxListeners(30); +// process.setMaxListeners(30); export class Configuration { private static instance: Configuration; diff --git a/src/reporters/publishers/publisher-reporter.ts b/src/reporters/publishers/publisher-reporter.ts index ff67aee5..006c6eb7 100644 --- a/src/reporters/publishers/publisher-reporter.ts +++ b/src/reporters/publishers/publisher-reporter.ts @@ -45,10 +45,16 @@ export class PublisherReporter { Logger.debug(`${this.report.name} published`); this.report.publishTime = new DateController().toString(); this.published = true; + this.report.hooks![DefaultHookEvents.ON_FINISH].tests.push({ + name: 'Published', valid: this.published, description: 'Published successfully' + }); + } } catch (err) { Logger.error(`'${this.report.name}' fail publishing: ${err}`); - this.report.hooks![DefaultHookEvents.ON_FINISH].tests.push({name: 'Published', valid: false, description: err.toString()}); + this.report.hooks![DefaultHookEvents.ON_FINISH].tests.push({ + name: 'Published', valid: false, description: err.toString() + }); this.report.valid = false; throw err; } @@ -62,11 +68,6 @@ export class PublisherReporter { public onFinish(): void { if (!this.publisher.ignore) { this.executeHookEvent(DefaultHookEvents.ON_FINISH); - this.report.hooks![DefaultHookEvents.ON_FINISH].tests.push({ - name: 'Published', - valid: this.published, - description: 'Published successfully' - }); this.report.valid = this.report.valid && this.published; } } @@ -78,7 +79,12 @@ export class PublisherReporter { Object.keys(args).forEach((key: string) => { eventExecutor.addArgument(key, args[key]); }); - const tests = eventExecutor.execute(); + const previousHook = this.report.hooks![eventName]; + let previousTests: TestModel[] = []; + if (previousHook && previousHook.tests) { + previousTests = previousHook.tests || []; + } + const tests = previousTests.concat(eventExecutor.execute()); const valid = tests.every((test: TestModel) => testModelIsPassing(test)); this.report.hooks![eventName] = { arguments: new ObjectDecycler().decycle(args),