diff --git a/output/examples.json b/output/examples.json index 73b4a38e..ab6209d4 100644 --- a/output/examples.json +++ b/output/examples.json @@ -1,10 +1,12 @@ { "valid": true, "name": "enqueuer", - "id": "2218560594_a68c5a50e8_250826", + "id": "2118090944_9a9ee5eb1e_84745", "level": 0, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -17,7 +19,7 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 5220 + "elapsedTime": 5229 } }, "onParsed": { @@ -26,18 +28,20 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.638Z", - "endTime": "2019-06-28T01:19:01.858Z", - "totalTime": 5220 + "startTime": "2019-06-30T00:18:09.998Z", + "endTime": "2019-06-30T00:18:15.227Z", + "totalTime": 5229 }, "requisitions": [ { "valid": true, "name": "examples/assertions.yml", - "id": "2218560594_2ca609e341_27608", + "id": "2118090944_2ca609e341_289741", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -139,35 +143,33 @@ } ], "arguments": { - "elapsedTime": 0 + "elapsedTime": 5 } }, "onFinish": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 94 + "elapsedTime": 103 } } }, "time": { - "startTime": "2019-06-28T01:18:56.641Z", - "endTime": "2019-06-28T01:18:56.739Z", - "totalTime": 98, + "startTime": "2019-06-30T00:18:10.001Z", + "endTime": "2019-06-30T00:18:10.104Z", + "totalTime": 103, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/avoid.yml", - "id": "2218560595_852d538668_802138", + "id": "2118090944_852d538668_730685", "level": 1, "subscriptions": [ { - "id": "2218560595_2e0cc1fd7c_942506", + "id": "2118090944_2e0cc1fd7c_565800", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -188,15 +190,15 @@ } ], "arguments": { - "elapsedTime": 3058 + "elapsedTime": 3061 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" }, { - "id": "2218560595_8444956d6a_136633", + "id": "2118090944_8444956d6a_335987", "name": "Subscription #1", "type": "HTTP", "hooks": { @@ -217,15 +219,17 @@ } ], "arguments": { - "elapsedTime": 3057 + "elapsedTime": 3060 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -238,27 +242,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 3058 + "elapsedTime": 3061 } } }, "time": { - "startTime": "2019-06-28T01:18:56.644Z", - "endTime": "2019-06-28T01:18:59.702Z", - "totalTime": 3058, + "startTime": "2019-06-30T00:18:10.010Z", + "endTime": "2019-06-30T00:18:13.071Z", + "totalTime": 3061, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/crypto-require.yml", - "id": "2218560595_1d33e31a27_972608", + "id": "2118090945_1d33e31a27_705197", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -277,28 +281,26 @@ } ], "arguments": { - "elapsedTime": 90 + "elapsedTime": 92 } } }, "time": { - "startTime": "2019-06-28T01:18:56.645Z", - "endTime": "2019-06-28T01:18:56.739Z", - "totalTime": 94, + "startTime": "2019-06-30T00:18:10.012Z", + "endTime": "2019-06-30T00:18:10.104Z", + "totalTime": 92, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/custom.yml", - "id": "2218560595_6da5232086_744821", + "id": "2118090945_6da5232086_578625", "level": 1, "subscriptions": [ { - "id": "2218560595_f6315a7fbc_288110", + "id": "2118090945_f6315a7fbc_428816", "name": "subscription description", "type": "custom", "hooks": { @@ -319,7 +321,7 @@ } ], "arguments": { - "elapsedTime": 242 + "elapsedTime": 224 } }, "onMessageReceived": { @@ -347,33 +349,33 @@ "remoteInfo": { "address": "127.0.0.1", "family": "IPv4", - "port": 58940, + "port": 59594, "size": 2 }, - "elapsedTime": 241 + "elapsedTime": 223 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.727Z" + "subscriptionTime": "2019-06-30T00:18:10.097Z" } ], "publishers": [ { - "id": "2218560595_816cec1424_331237", + "id": "2118090945_816cec1424_282450", "name": "publisher description", "valid": true, "hooks": { "onInit": { "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 }, "tests": [], "valid": true }, "onFinish": { "arguments": { - "elapsedTime": 241 + "elapsedTime": 223 }, "tests": [ { @@ -386,9 +388,11 @@ } }, "type": "custom", - "publishTime": "2019-06-28T01:18:56.870Z" + "publishTime": "2019-06-30T00:18:10.229Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -401,27 +405,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 243 + "elapsedTime": 224 } } }, "time": { - "startTime": "2019-06-28T01:18:56.646Z", - "endTime": "2019-06-28T01:18:56.889Z", - "totalTime": 243, + "startTime": "2019-06-30T00:18:10.012Z", + "endTime": "2019-06-30T00:18:10.236Z", + "totalTime": 224, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/file-placeholder.yml", - "id": "2218560595_a5f62352f4_834437", + "id": "2118090945_a5f62352f4_975734", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -434,24 +438,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 115 + "elapsedTime": 110 } } }, "time": { - "startTime": "2019-06-28T01:18:56.649Z", - "endTime": "2019-06-28T01:18:56.765Z", - "totalTime": 116, + "startTime": "2019-06-30T00:18:10.015Z", + "endTime": "2019-06-30T00:18:10.125Z", + "totalTime": 110, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560595_374c18eaf8_228711", + "id": "2118090945_374c18eaf8_519490", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -485,27 +491,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 50 + "elapsedTime": 47 } } }, "time": { - "startTime": "2019-06-28T01:18:56.689Z", - "endTime": "2019-06-28T01:18:56.741Z", - "totalTime": 52, + "startTime": "2019-06-30T00:18:10.057Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 48, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560595_8067e3ed86_680109", + "id": "2118090945_8067e3ed86_440722", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -524,32 +530,28 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 5 + "elapsedTime": 9 } } }, "time": { - "startTime": "2019-06-28T01:18:56.745Z", - "endTime": "2019-06-28T01:18:56.750Z", - "totalTime": 5, + "startTime": "2019-06-30T00:18:10.108Z", + "endTime": "2019-06-30T00:18:10.118Z", + "totalTime": 10, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/file.yml", - "id": "2218560595_d7a8d31f32_397584", + "id": "2118090945_d7a8d31f32_508959", "level": 1, "subscriptions": [ { - "id": "2218560595_3dd85e61fc_809049", + "id": "2118090945_3dd85e61fc_838954", "name": "subscription description", "type": "file-system-watcher", "hooks": { @@ -570,7 +572,7 @@ } ], "arguments": { - "elapsedTime": 184 + "elapsedTime": 179 } }, "onMessageReceived": { @@ -579,12 +581,12 @@ { "name": "Some time has passed", "valid": true, - "description": "Expected 'now' to be greater than or equal to '1561684736651'. Received '1561684736832'" + "description": "Expected 'now' to be greater than or equal to '1561853890016'. Received '1561853890193'" }, { "name": "Filename", "valid": true, - "description": "Expecting 'temp/fileTest2218560733_58da0ca63c_182777.file' (name) to contain 'temp/'" + "description": "Expecting 'temp/fileTest2118100102_4a14c58a8d_61871.file' (name) to contain 'temp/'" }, { "name": "Content", @@ -608,22 +610,22 @@ } ], "arguments": { - "content": "1561684736651", - "name": "temp/fileTest2218560733_58da0ca63c_182777.file", + "content": "1561853890016", + "name": "temp/fileTest2118100102_4a14c58a8d_61871.file", "size": 13, - "modified": "2019-06-28T01:18:56.734Z", - "created": "2019-06-28T01:18:56.734Z", - "elapsedTime": 182 + "modified": "2019-06-30T00:18:10.103Z", + "created": "2019-06-30T00:18:10.103Z", + "elapsedTime": 177 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.725Z" + "subscriptionTime": "2019-06-30T00:18:10.095Z" } ], "publishers": [ { - "id": "2218560595_4b5a457015_442007", + "id": "2118090945_4b5a457015_721303", "name": "publisher description", "valid": true, "hooks": { @@ -636,7 +638,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 183 + "elapsedTime": 180 }, "tests": [ { @@ -649,9 +651,11 @@ } }, "type": "file", - "publishTime": "2019-06-28T01:18:56.739Z" + "publishTime": "2019-06-30T00:18:10.104Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -664,28 +668,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 184 + "elapsedTime": 180 } } }, "time": { - "startTime": "2019-06-28T01:18:56.650Z", - "endTime": "2019-06-28T01:18:56.835Z", - "totalTime": 185, + "startTime": "2019-06-30T00:18:10.016Z", + "endTime": "2019-06-30T00:18:10.196Z", + "totalTime": 180, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/hooks.yml", - "id": "2218560595_75b8872357_277585", + "id": "2118090946_75b8872357_956220", "level": 1, "subscriptions": [ { - "id": "2218560595_fbe2d8d804_165776", + "id": "2118090946_fbe2d8d804_843169", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -722,7 +724,7 @@ } ], "arguments": { - "elapsedTime": 2243 + "elapsedTime": 2228 } }, "onMessageReceived": { @@ -751,17 +753,17 @@ "family": "IPv6", "port": 23080 }, - "elapsedTime": 249 + "elapsedTime": 232 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560595_ca0fe1e8c5_227132", + "id": "2118090946_ca0fe1e8c5_699561", "name": "Publisher #0", "valid": true, "hooks": { @@ -800,7 +802,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 2242 + "elapsedTime": 2228 }, "tests": [ { @@ -817,9 +819,9 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 52603 + "port": 52956 }, - "elapsedTime": 2243 + "elapsedTime": 2228 }, "tests": [ { @@ -847,9 +849,11 @@ } }, "type": "tcp", - "publishTime": "2019-06-28T01:18:58.896Z" + "publishTime": "2019-06-30T00:18:12.247Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -873,28 +877,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2243 + "elapsedTime": 2229 } } }, "time": { - "startTime": "2019-06-28T01:18:56.653Z", - "endTime": "2019-06-28T01:18:58.896Z", - "totalTime": 2243, + "startTime": "2019-06-30T00:18:10.019Z", + "endTime": "2019-06-30T00:18:12.248Z", + "totalTime": 2229, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/http-auth-basic.yml", - "id": "2218560596_6420f75659_120758", + "id": "2118090946_6420f75659_70584", "level": 1, "subscriptions": [ { - "id": "2218560596_94e20b540b_343338", + "id": "2118090946_94e20b540b_774503", "name": "Subscription #0", "type": "http", "hooks": { @@ -915,7 +917,7 @@ } ], "arguments": { - "elapsedTime": 313 + "elapsedTime": 280 } }, "onMessageReceived": { @@ -939,17 +941,17 @@ "query": {}, "url": "/basic", "body": "basic auth", - "elapsedTime": 285 + "elapsedTime": 238 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560596_f4551bd7af_136949", + "id": "2118090946_f4551bd7af_295932", "name": "Publisher #0", "valid": true, "hooks": { @@ -962,7 +964,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 313 + "elapsedTime": 280 }, "tests": [ { @@ -984,7 +986,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "19", "etag": "W/\"13-nGN7LEwCUKXpQoLxNqKZXSglYNc\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -1024,7 +1026,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "19", "etag": "W/\"13-nGN7LEwCUKXpQoLxNqKZXSglYNc\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -1061,9 +1063,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:56.968Z" + "publishTime": "2019-06-30T00:18:10.300Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -1076,28 +1080,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 313 + "elapsedTime": 280 } } }, "time": { - "startTime": "2019-06-28T01:18:56.655Z", - "endTime": "2019-06-28T01:18:56.968Z", - "totalTime": 313, + "startTime": "2019-06-30T00:18:10.021Z", + "endTime": "2019-06-30T00:18:10.301Z", + "totalTime": 280, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/http-auth-bearer.yml", - "id": "2218560596_5e821857a3_463101", + "id": "2118090946_5e821857a3_595126", "level": 1, "subscriptions": [ { - "id": "2218560596_dab3c9a05e_255315", + "id": "2118090946_dab3c9a05e_660899", "name": "Subscription #0", "type": "http", "hooks": { @@ -1118,7 +1120,7 @@ } ], "arguments": { - "elapsedTime": 307 + "elapsedTime": 281 } }, "onMessageReceived": { @@ -1142,17 +1144,17 @@ "query": {}, "url": "/bearer", "body": "Rech", - "elapsedTime": 278 + "elapsedTime": 246 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560596_388c1593e3_74476", + "id": "2118090946_388c1593e3_543360", "name": "Publisher #0", "valid": true, "hooks": { @@ -1165,7 +1167,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 307 + "elapsedTime": 281 }, "tests": [ { @@ -1187,7 +1189,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "15", "etag": "W/\"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -1227,7 +1229,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "15", "etag": "W/\"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -1264,9 +1266,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:56.964Z" + "publishTime": "2019-06-30T00:18:10.303Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -1279,28 +1283,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 307 + "elapsedTime": 281 } } }, "time": { - "startTime": "2019-06-28T01:18:56.657Z", - "endTime": "2019-06-28T01:18:56.964Z", - "totalTime": 307, + "startTime": "2019-06-30T00:18:10.022Z", + "endTime": "2019-06-30T00:18:10.303Z", + "totalTime": 281, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/http-auth-digest.yml", - "id": "2218560596_784968c016_823089", + "id": "2118090946_784968c016_574335", "level": 1, "subscriptions": [ { - "id": "2218560596_b8f024a270_166879", + "id": "2118090946_b8f024a270_105471", "name": "Subscription #0", "type": "http", "hooks": { @@ -1321,7 +1323,7 @@ } ], "arguments": { - "elapsedTime": 304 + "elapsedTime": 280 } }, "onMessageReceived": { @@ -1345,17 +1347,17 @@ "query": {}, "url": "/digest", "body": "Rech", - "elapsedTime": 272 + "elapsedTime": 251 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.732Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560596_b553ccdd3b_766369", + "id": "2118090946_b553ccdd3b_652193", "name": "Publisher #0", "valid": true, "hooks": { @@ -1368,7 +1370,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 304 + "elapsedTime": 280 }, "tests": [ { @@ -1390,7 +1392,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "15", "etag": "W/\"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -1430,7 +1432,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "15", "etag": "W/\"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -1467,9 +1469,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:56.962Z" + "publishTime": "2019-06-30T00:18:10.304Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -1482,27 +1486,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 304 + "elapsedTime": 280 } } }, "time": { - "startTime": "2019-06-28T01:18:56.658Z", - "endTime": "2019-06-28T01:18:56.962Z", - "totalTime": 304, + "startTime": "2019-06-30T00:18:10.024Z", + "endTime": "2019-06-30T00:18:10.304Z", + "totalTime": 280, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/http-more-examples.yml", - "id": "2218560596_90ccf51c7e_160459", + "id": "2118090947_90ccf51c7e_375619", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -1515,25 +1519,25 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2379 + "elapsedTime": 2394 } } }, "time": { - "startTime": "2019-06-28T01:18:56.662Z", - "endTime": "2019-06-28T01:18:59.041Z", - "totalTime": 2379, + "startTime": "2019-06-30T00:18:10.030Z", + "endTime": "2019-06-30T00:18:12.424Z", + "totalTime": 2394, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560597_043834905b_507216", + "id": "2118090947_043834905b_145459", "level": 2, "subscriptions": [ { - "id": "2218560597_e916596275_412733", + "id": "2118090947_e916596275_906590", "name": "Subscription #0", "type": "http", "hooks": { @@ -1554,7 +1558,7 @@ } ], "arguments": { - "elapsedTime": 334 + "elapsedTime": 337 } }, "onMessageReceived": { @@ -1597,15 +1601,15 @@ }, "url": "/enqueuer/idStuff?query=2345", "body": "{\"enqueuer\":\"virgs\"}", - "elapsedTime": 246 + "elapsedTime": 226 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.732Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" }, { - "id": "2218560597_97c8fb993f_548220", + "id": "2118090947_97c8fb993f_498757", "name": "same port", "type": "http", "hooks": { @@ -1626,7 +1630,7 @@ } ], "arguments": { - "elapsedTime": 333 + "elapsedTime": 337 } }, "onMessageReceived": { @@ -1642,15 +1646,15 @@ "query": {}, "url": "/samePort", "body": "virgs", - "elapsedTime": 246 + "elapsedTime": 227 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.732Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" }, { - "id": "2218560597_42d8fc1293_17073", + "id": "2118090947_42d8fc1293_386284", "name": "yet another, but avoidable", "type": "http", "hooks": { @@ -1671,17 +1675,17 @@ } ], "arguments": { - "elapsedTime": 333 + "elapsedTime": 338 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.732Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560597_acd0fb7e94_492226", + "id": "2118090947_acd0fb7e94_423874", "name": "Publisher #0", "valid": true, "hooks": { @@ -1694,7 +1698,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 333 + "elapsedTime": 338 }, "tests": [ { @@ -1717,7 +1721,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "27", "etag": "W/\"1b-e5esTWfu+XftewZ5g2Tclr7ClTo\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -1774,7 +1778,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "27", "etag": "W/\"1b-e5esTWfu+XftewZ5g2Tclr7ClTo\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -1805,10 +1809,10 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:56.965Z" + "publishTime": "2019-06-30T00:18:10.315Z" }, { - "id": "2218560597_7e4a7822a0_370910", + "id": "2118090947_7e4a7822a0_107629", "name": "Publisher #1", "valid": true, "hooks": { @@ -1821,7 +1825,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 333 + "elapsedTime": 338 }, "tests": [ { @@ -1843,7 +1847,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-W/H9kn37hnlJai5s8Ay+UMHIcUU\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -1887,7 +1891,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-W/H9kn37hnlJai5s8Ay+UMHIcUU\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -1916,9 +1920,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:56.965Z" + "publishTime": "2019-06-30T00:18:10.318Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -1931,28 +1937,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 334 + "elapsedTime": 338 } } }, "time": { - "startTime": "2019-06-28T01:18:56.691Z", - "endTime": "2019-06-28T01:18:57.025Z", - "totalTime": 334, + "startTime": "2019-06-30T00:18:10.060Z", + "endTime": "2019-06-30T00:18:10.398Z", + "totalTime": 338, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560597_16e7db54dd_753794", + "id": "2118090947_16e7db54dd_568455", "level": 2, "subscriptions": [ { - "id": "2218560597_34a6878700_123618", + "id": "2118090947_34a6878700_953248", "name": "Subscription #0", "type": "http", "hooks": { @@ -1973,7 +1977,7 @@ } ], "arguments": { - "elapsedTime": 4 + "elapsedTime": 14 } }, "onMessageReceived": { @@ -2000,17 +2004,17 @@ }, "url": "/enqueuer/idStuff?query=111", "body": "{\"duplicated\":true}", - "elapsedTime": 3 + "elapsedTime": 6 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:57.026Z" + "subscriptionTime": "2019-06-30T00:18:10.400Z" } ], "publishers": [ { - "id": "2218560597_45f272e419_404351", + "id": "2118090947_45f272e419_834370", "name": "publisher description", "valid": true, "hooks": { @@ -2023,7 +2027,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 4 + "elapsedTime": 15 }, "tests": [ { @@ -2045,7 +2049,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "25", "etag": "W/\"19-yZRAgggcER0sMyRTVBBpErTPT/A\"", - "date": "Fri, 28 Jun 2019 01:18:57 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -2095,7 +2099,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "25", "etag": "W/\"19-yZRAgggcER0sMyRTVBBpErTPT/A\"", - "date": "Fri, 28 Jun 2019 01:18:57 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -2125,9 +2129,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:57.030Z" + "publishTime": "2019-06-30T00:18:10.412Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -2140,28 +2146,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 4 + "elapsedTime": 14 } } }, "time": { - "startTime": "2019-06-28T01:18:57.026Z", - "endTime": "2019-06-28T01:18:57.030Z", - "totalTime": 4, + "startTime": "2019-06-30T00:18:10.399Z", + "endTime": "2019-06-30T00:18:10.414Z", + "totalTime": 15, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "requisition 2 (port 23076)", - "id": "2218560597_eff03cbee0_444074", + "id": "2118090947_eff03cbee0_315709", "level": 2, "subscriptions": [ { - "id": "2218560597_e5e0d9ff8c_913862", + "id": "2118090947_e5e0d9ff8c_902436", "name": "subscription description", "type": "http", "hooks": { @@ -2182,15 +2186,17 @@ } ], "arguments": { - "elapsedTime": 1001 + "elapsedTime": 1002 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:57.031Z" + "subscriptionTime": "2019-06-30T00:18:10.417Z" } ], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -2203,28 +2209,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1001 + "elapsedTime": 1002 } } }, "time": { - "startTime": "2019-06-28T01:18:57.031Z", - "endTime": "2019-06-28T01:18:58.032Z", - "totalTime": 1001, + "startTime": "2019-06-30T00:18:10.415Z", + "endTime": "2019-06-30T00:18:11.417Z", + "totalTime": 1002, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "check port releasing (23076)", - "id": "2218560597_1d85da2e3e_148431", + "id": "2118090947_1d85da2e3e_369080", "level": 2, "subscriptions": [ { - "id": "2218560597_3861169172_877728", + "id": "2118090947_3861169172_811403", "name": "same port subscription", "type": "tcp", "hooks": { @@ -2250,10 +2254,12 @@ } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:58.033Z" + "subscriptionTime": "2019-06-30T00:18:11.418Z" } ], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -2271,23 +2277,21 @@ } }, "time": { - "startTime": "2019-06-28T01:18:58.033Z", - "endTime": "2019-06-28T01:18:59.034Z", + "startTime": "2019-06-30T00:18:11.417Z", + "endTime": "2019-06-30T00:18:12.418Z", "totalTime": 1001, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #4", - "id": "2218560597_5bffbc4d6d_462147", + "id": "2118090947_5bffbc4d6d_605523", "level": 2, "subscriptions": [ { - "id": "2218560598_c507e101a7_641408", + "id": "2118090947_c507e101a7_227947", "name": "Subscription #0", "type": "http", "hooks": { @@ -2308,7 +2312,7 @@ } ], "arguments": { - "elapsedTime": 5 + "elapsedTime": 4 } }, "onMessageReceived": { @@ -2329,12 +2333,12 @@ } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:59.036Z" + "subscriptionTime": "2019-06-30T00:18:12.421Z" } ], "publishers": [ { - "id": "2218560597_25240a3992_80835", + "id": "2118090947_25240a3992_935637", "name": "Publisher #0", "valid": true, "hooks": { @@ -2347,7 +2351,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 5 + "elapsedTime": 4 }, "tests": [ { @@ -2369,7 +2373,45 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-HLLQjeteIwK7Xuhlj4t8Bu7p124\"", - "date": "Fri, 28 Jun 2019 01:18:59 GMT", + "date": "Sun, 30 Jun 2019 00:18:12 GMT", + "connection": "close" + }, + "request": { + "uri": { + "protocol": "http:", + "slashes": true, + "auth": null, + "host": "localhost:23080", + "port": "23080", + "hostname": "localhost", + "hash": null, + "search": null, + "query": null, + "pathname": "/number-payload", + "path": "/number-payload", + "href": "http://localhost:23080/number-payload" + }, + "method": "post", + "headers": { + "Content-Length": 5 + } + } + }, + "tests": [], + "valid": true + }, + "onMessageReceived": { + "arguments": { + "statusCode": 444, + "body": "4.45", + "headers": { + "x-powered-by": "Express", + "access-control-allow-origin": "*", + "access-control-allow-headers": "Origin, X-Requested-With, Content-Type, Accept", + "content-type": "text/html; charset=utf-8", + "content-length": "4", + "etag": "W/\"4-HLLQjeteIwK7Xuhlj4t8Bu7p124\"", + "date": "Sun, 30 Jun 2019 00:18:12 GMT", "connection": "close" }, "request": { @@ -2387,27 +2429,919 @@ "path": "/number-payload", "href": "http://localhost:23080/number-payload" }, - "method": "post", + "method": "post", + "headers": { + "Content-Length": 5 + } + } + }, + "tests": [], + "valid": true + } + }, + "type": "http", + "publishTime": "2019-06-30T00:18:12.424Z" + } + ], + "iterations": 1, + "totalIterations": 1, + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 4 + } + } + }, + "time": { + "startTime": "2019-06-30T00:18:12.420Z", + "endTime": "2019-06-30T00:18:12.424Z", + "totalTime": 4, + "timeout": 5000 + }, + "requisitions": [] + } + ] + }, + { + "valid": true, + "name": "examples/http-parallel.yml", + "id": "2118090947_ffaed7f194_912051", + "level": 1, + "subscriptions": [], + "publishers": [], + "iterations": 1, + "totalIterations": 1, + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 538 + } + } + }, + "time": { + "startTime": "2019-06-30T00:18:10.031Z", + "endTime": "2019-06-30T00:18:10.569Z", + "totalTime": 538, + "timeout": 5000 + }, + "requisitions": [ + { + "valid": true, + "name": "Requisition #0", + "id": "2118090948_f46fd5fb16_256118", + "level": 2, + "subscriptions": [ + { + "id": "2118090948_e4de1090c9_822139", + "name": "Subscription #0", + "type": "http", + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [ + { + "valid": true, + "name": "Message received", + "description": "Subscription has received its message" + } + ], + "arguments": { + "elapsedTime": 283 + } + }, + "onMessageReceived": { + "valid": true, + "tests": [], + "arguments": { + "headers": { + "host": "localhost:23023", + "content-length": "0", + "connection": "close" + }, + "params": {}, + "query": {}, + "url": "/first", + "body": "", + "elapsedTime": 505 + } + } + }, + "valid": true, + "subscriptionTime": "2019-06-30T00:18:10.160Z" + } + ], + "publishers": [], + "iterations": 2, + "totalIterations": 2, + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 283 + } + } + }, + "time": { + "startTime": "2019-06-30T00:18:10.061Z", + "endTime": "2019-06-30T00:18:10.345Z", + "totalTime": 284, + "timeout": 5000 + }, + "requisitions": [] + }, + { + "valid": true, + "name": "Requisition #0", + "id": "2118090948_f46fd5fb16_256118", + "level": 2, + "subscriptions": [ + { + "id": "2118090948_e4de1090c9_822139", + "name": "Subscription #0", + "type": "http", + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [ + { + "valid": true, + "name": "Message received", + "description": "Subscription has received its message" + } + ], + "arguments": { + "elapsedTime": 220 + } + }, + "onMessageReceived": { + "valid": true, + "tests": [], + "arguments": { + "headers": { + "host": "localhost:23023", + "content-length": "0", + "connection": "close" + }, + "params": {}, + "query": {}, + "url": "/first", + "body": "", + "elapsedTime": 220 + } + } + }, + "valid": true, + "subscriptionTime": "2019-06-30T00:18:10.347Z" + } + ], + "publishers": [], + "iterations": 2, + "totalIterations": 2, + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 220 + } + } + }, + "time": { + "startTime": "2019-06-30T00:18:10.346Z", + "endTime": "2019-06-30T00:18:10.566Z", + "totalTime": 220, + "timeout": 5000 + }, + "requisitions": [] + }, + { + "valid": true, + "name": "Requisition #1", + "id": "2118090948_4788339776_930147", + "level": 2, + "subscriptions": [ + { + "id": "2118090948_16f5b5fa56_613579", + "name": "Subscription #0", + "type": "http", + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [ + { + "valid": true, + "name": "Message received", + "description": "Subscription has received its message" + } + ], + "arguments": { + "elapsedTime": 288 + } + }, + "onMessageReceived": { + "valid": true, + "tests": [], + "arguments": { + "headers": { + "host": "localhost:23023", + "content-length": "0", + "connection": "close" + }, + "params": {}, + "query": {}, + "url": "/second", + "body": "", + "elapsedTime": 506 + } + } + }, + "valid": true, + "subscriptionTime": "2019-06-30T00:18:10.160Z" + } + ], + "publishers": [], + "iterations": 2, + "totalIterations": 2, + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 289 + } + } + }, + "time": { + "startTime": "2019-06-30T00:18:10.061Z", + "endTime": "2019-06-30T00:18:10.350Z", + "totalTime": 289, + "timeout": 5000 + }, + "requisitions": [] + }, + { + "valid": true, + "name": "Requisition #1", + "id": "2118090948_4788339776_930147", + "level": 2, + "subscriptions": [ + { + "id": "2118090948_16f5b5fa56_613579", + "name": "Subscription #0", + "type": "http", + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [ + { + "valid": true, + "name": "Message received", + "description": "Subscription has received its message" + } + ], + "arguments": { + "elapsedTime": 217 + } + }, + "onMessageReceived": { + "valid": true, + "tests": [], + "arguments": { + "headers": { + "host": "localhost:23023", + "content-length": "0", + "connection": "close" + }, + "params": {}, + "query": {}, + "url": "/second", + "body": "", + "elapsedTime": 216 + } + } + }, + "valid": true, + "subscriptionTime": "2019-06-30T00:18:10.352Z" + } + ], + "publishers": [], + "iterations": 2, + "totalIterations": 2, + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 218 + } + } + }, + "time": { + "startTime": "2019-06-30T00:18:10.350Z", + "endTime": "2019-06-30T00:18:10.568Z", + "totalTime": 218, + "timeout": 5000 + }, + "requisitions": [] + }, + { + "valid": true, + "name": "Requisition #2", + "id": "2118090948_26a61bc62a_259172", + "level": 2, + "subscriptions": [], + "publishers": [ + { + "id": "2118090948_fb73e2d9b8_92152", + "name": "Publisher #0", + "valid": true, + "hooks": { + "onInit": { + "arguments": { + "elapsedTime": 0 + }, + "tests": [], + "valid": true + }, + "onFinish": { + "arguments": { + "elapsedTime": 298 + }, + "tests": [ + { + "name": "Published", + "valid": true, + "description": "Published successfully" + } + ], + "valid": true + }, + "onResponseReceived": { + "arguments": { + "statusCode": 200, + "body": "first", + "headers": { + "x-powered-by": "Express", + "access-control-allow-origin": "*", + "access-control-allow-headers": "Origin, X-Requested-With, Content-Type, Accept", + "content-type": "text/html; charset=utf-8", + "content-length": "5", + "etag": "W/\"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE\"", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", + "connection": "close" + }, + "request": { + "uri": { + "protocol": "http:", + "slashes": true, + "auth": null, + "host": "localhost:23023", + "port": "23023", + "hostname": "localhost", + "hash": null, + "search": null, + "query": null, + "pathname": "/first", + "path": "/first", + "href": "http://localhost:23023/first" + }, + "method": "get", + "headers": { + "content-length": 0 + } + } + }, + "tests": [ + { + "name": "Assertion #0", + "valid": true, + "description": "Expected 'statusCode' to be equal to '200'. Received '200'" + } + ], + "valid": true + }, + "onMessageReceived": { + "arguments": { + "statusCode": 200, + "body": "first", + "headers": { + "x-powered-by": "Express", + "access-control-allow-origin": "*", + "access-control-allow-headers": "Origin, X-Requested-With, Content-Type, Accept", + "content-type": "text/html; charset=utf-8", + "content-length": "5", + "etag": "W/\"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE\"", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", + "connection": "close" + }, + "request": { + "uri": { + "protocol": "http:", + "slashes": true, + "auth": null, + "host": "localhost:23023", + "port": "23023", + "hostname": "localhost", + "hash": null, + "search": null, + "query": null, + "pathname": "/first", + "path": "/first", + "href": "http://localhost:23023/first" + }, + "method": "get", + "headers": { + "content-length": 0 + } + } + }, + "tests": [], + "valid": true + } + }, + "type": "http", + "publishTime": "2019-06-30T00:18:10.360Z" + } + ], + "iterations": 2, + "totalIterations": 2, + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 298 + } + } + }, + "time": { + "startTime": "2019-06-30T00:18:10.062Z", + "endTime": "2019-06-30T00:18:10.360Z", + "totalTime": 298, + "timeout": 5000 + }, + "requisitions": [] + }, + { + "valid": true, + "name": "Requisition #2", + "id": "2118090948_26a61bc62a_259172", + "level": 2, + "subscriptions": [], + "publishers": [ + { + "id": "2118090948_fb73e2d9b8_92152", + "name": "Publisher #0", + "valid": true, + "hooks": { + "onInit": { + "arguments": { + "elapsedTime": 0 + }, + "tests": [], + "valid": true + }, + "onFinish": { + "arguments": { + "elapsedTime": 206 + }, + "tests": [ + { + "name": "Published", + "valid": true, + "description": "Published successfully" + } + ], + "valid": true + }, + "onResponseReceived": { + "arguments": { + "statusCode": 200, + "body": "first", + "headers": { + "x-powered-by": "Express", + "access-control-allow-origin": "*", + "access-control-allow-headers": "Origin, X-Requested-With, Content-Type, Accept", + "content-type": "text/html; charset=utf-8", + "content-length": "5", + "etag": "W/\"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE\"", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", + "connection": "close" + }, + "request": { + "uri": { + "protocol": "http:", + "slashes": true, + "auth": null, + "host": "localhost:23023", + "port": "23023", + "hostname": "localhost", + "hash": null, + "search": null, + "query": null, + "pathname": "/first", + "path": "/first", + "href": "http://localhost:23023/first" + }, + "method": "get", + "headers": { + "content-length": 0 + } + } + }, + "tests": [ + { + "name": "Assertion #0", + "valid": true, + "description": "Expected 'statusCode' to be equal to '200'. Received '200'" + } + ], + "valid": true + }, + "onMessageReceived": { + "arguments": { + "statusCode": 200, + "body": "first", + "headers": { + "x-powered-by": "Express", + "access-control-allow-origin": "*", + "access-control-allow-headers": "Origin, X-Requested-With, Content-Type, Accept", + "content-type": "text/html; charset=utf-8", + "content-length": "5", + "etag": "W/\"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE\"", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", + "connection": "close" + }, + "request": { + "uri": { + "protocol": "http:", + "slashes": true, + "auth": null, + "host": "localhost:23023", + "port": "23023", + "hostname": "localhost", + "hash": null, + "search": null, + "query": null, + "pathname": "/first", + "path": "/first", + "href": "http://localhost:23023/first" + }, + "method": "get", + "headers": { + "content-length": 0 + } + } + }, + "tests": [], + "valid": true + } + }, + "type": "http", + "publishTime": "2019-06-30T00:18:10.567Z" + } + ], + "iterations": 2, + "totalIterations": 2, + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 206 + } + } + }, + "time": { + "startTime": "2019-06-30T00:18:10.361Z", + "endTime": "2019-06-30T00:18:10.567Z", + "totalTime": 206, + "timeout": 5000 + }, + "requisitions": [] + }, + { + "valid": true, + "name": "Requisition #3", + "id": "2118090948_6099fb1229_62400", + "level": 2, + "subscriptions": [], + "publishers": [ + { + "id": "2118090948_7d016346aa_745902", + "name": "Publisher #0", + "valid": true, + "hooks": { + "onInit": { + "arguments": { + "elapsedTime": 0 + }, + "tests": [], + "valid": true + }, + "onFinish": { + "arguments": { + "elapsedTime": 299 + }, + "tests": [ + { + "name": "Published", + "valid": true, + "description": "Published successfully" + } + ], + "valid": true + }, + "onResponseReceived": { + "arguments": { + "statusCode": 200, + "body": "second", + "headers": { + "x-powered-by": "Express", + "access-control-allow-origin": "*", + "access-control-allow-headers": "Origin, X-Requested-With, Content-Type, Accept", + "content-type": "text/html; charset=utf-8", + "content-length": "6", + "etag": "W/\"6-NS94KaI4SwAcwSsMJhPHVkVKH2o\"", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", + "connection": "close" + }, + "request": { + "uri": { + "protocol": "http:", + "slashes": true, + "auth": null, + "host": "localhost:23023", + "port": "23023", + "hostname": "localhost", + "hash": null, + "search": null, + "query": null, + "pathname": "/second", + "path": "/second", + "href": "http://localhost:23023/second" + }, + "method": "get", + "headers": { + "content-length": 0 + } + } + }, + "tests": [ + { + "name": "Assertion #0", + "valid": true, + "description": "Expected 'statusCode' to be equal to '200'. Received '200'" + } + ], + "valid": true + }, + "onMessageReceived": { + "arguments": { + "statusCode": 200, + "body": "second", + "headers": { + "x-powered-by": "Express", + "access-control-allow-origin": "*", + "access-control-allow-headers": "Origin, X-Requested-With, Content-Type, Accept", + "content-type": "text/html; charset=utf-8", + "content-length": "6", + "etag": "W/\"6-NS94KaI4SwAcwSsMJhPHVkVKH2o\"", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", + "connection": "close" + }, + "request": { + "uri": { + "protocol": "http:", + "slashes": true, + "auth": null, + "host": "localhost:23023", + "port": "23023", + "hostname": "localhost", + "hash": null, + "search": null, + "query": null, + "pathname": "/second", + "path": "/second", + "href": "http://localhost:23023/second" + }, + "method": "get", + "headers": { + "content-length": 0 + } + } + }, + "tests": [], + "valid": true + } + }, + "type": "http", + "publishTime": "2019-06-30T00:18:10.361Z" + } + ], + "iterations": 2, + "totalIterations": 2, + "hooks": { + "onInit": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 0 + } + }, + "onFinish": { + "valid": true, + "tests": [], + "arguments": { + "elapsedTime": 299 + } + } + }, + "time": { + "startTime": "2019-06-30T00:18:10.062Z", + "endTime": "2019-06-30T00:18:10.361Z", + "totalTime": 299, + "timeout": 5000 + }, + "requisitions": [] + }, + { + "valid": true, + "name": "Requisition #3", + "id": "2118090948_6099fb1229_62400", + "level": 2, + "subscriptions": [], + "publishers": [ + { + "id": "2118090948_7d016346aa_745902", + "name": "Publisher #0", + "valid": true, + "hooks": { + "onInit": { + "arguments": { + "elapsedTime": 0 + }, + "tests": [], + "valid": true + }, + "onFinish": { + "arguments": { + "elapsedTime": 207 + }, + "tests": [ + { + "name": "Published", + "valid": true, + "description": "Published successfully" + } + ], + "valid": true + }, + "onResponseReceived": { + "arguments": { + "statusCode": 200, + "body": "second", + "headers": { + "x-powered-by": "Express", + "access-control-allow-origin": "*", + "access-control-allow-headers": "Origin, X-Requested-With, Content-Type, Accept", + "content-type": "text/html; charset=utf-8", + "content-length": "6", + "etag": "W/\"6-NS94KaI4SwAcwSsMJhPHVkVKH2o\"", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", + "connection": "close" + }, + "request": { + "uri": { + "protocol": "http:", + "slashes": true, + "auth": null, + "host": "localhost:23023", + "port": "23023", + "hostname": "localhost", + "hash": null, + "search": null, + "query": null, + "pathname": "/second", + "path": "/second", + "href": "http://localhost:23023/second" + }, + "method": "get", "headers": { - "Content-Length": 5 + "content-length": 0 } } }, - "tests": [], + "tests": [ + { + "name": "Assertion #0", + "valid": true, + "description": "Expected 'statusCode' to be equal to '200'. Received '200'" + } + ], "valid": true }, "onMessageReceived": { "arguments": { - "statusCode": 444, - "body": "4.45", + "statusCode": 200, + "body": "second", "headers": { "x-powered-by": "Express", "access-control-allow-origin": "*", "access-control-allow-headers": "Origin, X-Requested-With, Content-Type, Accept", "content-type": "text/html; charset=utf-8", - "content-length": "4", - "etag": "W/\"4-HLLQjeteIwK7Xuhlj4t8Bu7p124\"", - "date": "Fri, 28 Jun 2019 01:18:59 GMT", + "content-length": "6", + "etag": "W/\"6-NS94KaI4SwAcwSsMJhPHVkVKH2o\"", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -2415,19 +3349,19 @@ "protocol": "http:", "slashes": true, "auth": null, - "host": "localhost:23080", - "port": "23080", + "host": "localhost:23023", + "port": "23023", "hostname": "localhost", "hash": null, "search": null, "query": null, - "pathname": "/number-payload", - "path": "/number-payload", - "href": "http://localhost:23080/number-payload" + "pathname": "/second", + "path": "/second", + "href": "http://localhost:23023/second" }, - "method": "post", + "method": "get", "headers": { - "Content-Length": 5 + "content-length": 0 } } }, @@ -2436,9 +3370,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:59.040Z" + "publishTime": "2019-06-30T00:18:10.568Z" } ], + "iterations": 2, + "totalIterations": 2, "hooks": { "onInit": { "valid": true, @@ -2451,32 +3387,28 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 6 + "elapsedTime": 207 } } }, "time": { - "startTime": "2019-06-28T01:18:59.035Z", - "endTime": "2019-06-28T01:18:59.041Z", - "totalTime": 6, + "startTime": "2019-06-30T00:18:10.362Z", + "endTime": "2019-06-30T00:18:10.569Z", + "totalTime": 207, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/http-proxy.yml", - "id": "2218560598_aba5464e08_23073", + "id": "2118090948_aba5464e08_973745", "level": 1, "subscriptions": [ { - "id": "2218560598_be017cf7e2_723380", + "id": "2118090948_be017cf7e2_318582", "name": "proxy subscription", "type": "http-proxy", "hooks": { @@ -2497,7 +3429,7 @@ } ], "arguments": { - "elapsedTime": 314 + "elapsedTime": 327 } }, "onOriginalMessageReceived": { @@ -2523,7 +3455,7 @@ }, "url": "/proxy/enqueuer/123456?query=proxied", "body": "original", - "elapsedTime": 278 + "elapsedTime": 252 } }, "onMessageReceived": { @@ -2550,7 +3482,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "25", "etag": "W/\"19-t4VpDbTMvQQ876rQU32330fLSVI\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -2580,10 +3512,10 @@ } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" }, { - "id": "2218560598_9421bcf470_54626", + "id": "2118090948_9421bcf470_200848", "name": "real", "type": "http", "hooks": { @@ -2604,7 +3536,7 @@ } ], "arguments": { - "elapsedTime": 314 + "elapsedTime": 327 } }, "onMessageReceived": { @@ -2640,17 +3572,17 @@ }, "url": "/real/enqueuer/123456?query=proxied", "body": "original -> proxy", - "elapsedTime": 309 + "elapsedTime": 299 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560598_8e53ccc444_93068", + "id": "2118090948_8e53ccc444_484355", "name": "publisher proxy", "valid": true, "hooks": { @@ -2663,7 +3595,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 314 + "elapsedTime": 327 }, "tests": [ { @@ -2685,7 +3617,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "42", "etag": "W/\"19-t4VpDbTMvQQ876rQU32330fLSVI\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -2723,7 +3655,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "42", "etag": "W/\"19-t4VpDbTMvQQ876rQU32330fLSVI\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -2763,9 +3695,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:56.978Z" + "publishTime": "2019-06-30T00:18:10.359Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -2778,28 +3712,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 314 + "elapsedTime": 327 } } }, "time": { - "startTime": "2019-06-28T01:18:56.664Z", - "endTime": "2019-06-28T01:18:56.979Z", - "totalTime": 315, + "startTime": "2019-06-30T00:18:10.032Z", + "endTime": "2019-06-30T00:18:10.359Z", + "totalTime": 327, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/http.yml", - "id": "2218560598_559809288c_544650", + "id": "2118090948_559809288c_862451", "level": 1, "subscriptions": [ { - "id": "2218560598_36baa23c89_197782", + "id": "2118090948_36baa23c89_545872", "name": "Subscription #0", "type": "http", "hooks": { @@ -2820,7 +3752,7 @@ } ], "arguments": { - "elapsedTime": 301 + "elapsedTime": 278 } }, "onMessageReceived": { @@ -2836,17 +3768,17 @@ "query": {}, "url": "/resource", "body": "virgs", - "elapsedTime": 273 + "elapsedTime": 252 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560598_3f90d159b3_298991", + "id": "2118090948_3f90d159b3_825752", "name": "Publisher #0", "valid": true, "hooks": { @@ -2859,7 +3791,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 301 + "elapsedTime": 278 }, "tests": [ { @@ -2881,7 +3813,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-W/H9kn37hnlJai5s8Ay+UMHIcUU\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -2919,7 +3851,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-W/H9kn37hnlJai5s8Ay+UMHIcUU\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -2954,9 +3886,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:56.967Z" + "publishTime": "2019-06-30T00:18:10.310Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -2969,28 +3903,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 301 + "elapsedTime": 278 } } }, "time": { - "startTime": "2019-06-28T01:18:56.666Z", - "endTime": "2019-06-28T01:18:56.967Z", - "totalTime": 301, + "startTime": "2019-06-30T00:18:10.033Z", + "endTime": "2019-06-30T00:18:10.311Z", + "totalTime": 278, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/https.yml", - "id": "2218560598_d6075fad05_315214", + "id": "2118090948_d6075fad05_486306", "level": 1, "subscriptions": [ { - "id": "2218560598_81e3a69582_165074", + "id": "2118090948_81e3a69582_487931", "name": "Subscription #0", "type": "https", "hooks": { @@ -3011,7 +3943,7 @@ } ], "arguments": { - "elapsedTime": 310 + "elapsedTime": 323 } }, "onMessageReceived": { @@ -3034,17 +3966,17 @@ "query": {}, "url": "/enqueuer", "body": "{\"https\":\"works!\"}", - "elapsedTime": 307 + "elapsedTime": 297 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560598_5cd9b40d14_235529", + "id": "2118090948_5cd9b40d14_625821", "name": "Publisher #0", "valid": true, "hooks": { @@ -3057,7 +3989,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 310 + "elapsedTime": 323 }, "tests": [ { @@ -3079,7 +4011,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "5", "etag": "W/\"5-w0N9vHwSVdOiHURNhuvy6SNMIr0\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -3118,7 +4050,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "5", "etag": "W/\"5-w0N9vHwSVdOiHURNhuvy6SNMIr0\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -3159,9 +4091,11 @@ } }, "type": "HTTPS", - "publishTime": "2019-06-28T01:18:56.977Z" + "publishTime": "2019-06-30T00:18:10.357Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3174,27 +4108,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 310 + "elapsedTime": 323 } } }, "time": { - "startTime": "2019-06-28T01:18:56.667Z", - "endTime": "2019-06-28T01:18:56.977Z", - "totalTime": 310, + "startTime": "2019-06-30T00:18:10.035Z", + "endTime": "2019-06-30T00:18:10.358Z", + "totalTime": 323, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/ignore.yml", - "id": "2218560598_8ea767da7b_357307", + "id": "2118090949_8ea767da7b_342280", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3207,26 +4141,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 99 + "elapsedTime": 92 } } }, "time": { - "startTime": "2019-06-28T01:18:56.668Z", - "endTime": "2019-06-28T01:18:56.767Z", - "totalTime": 99, + "startTime": "2019-06-30T00:18:10.036Z", + "endTime": "2019-06-30T00:18:10.128Z", + "totalTime": 92, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560598_cbabde97ea_467817", + "id": "2118090949_cbabde97ea_784363", "level": 2, "subscriptions": [], "publishers": [ { - "id": "2218560599_c325787526_501804", + "id": "2118090949_c325787526_686578", "name": "Publisher #0", "ignored": true, "valid": true, @@ -3243,6 +4177,8 @@ "type": "file" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3255,28 +4191,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 49 + "elapsedTime": 42 } } }, "time": { - "startTime": "2019-06-28T01:18:56.692Z", - "endTime": "2019-06-28T01:18:56.741Z", - "totalTime": 49, + "startTime": "2019-06-30T00:18:10.063Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 42, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560599_24ec47c05e_762631", + "id": "2118090949_24ec47c05e_384659", "level": 2, "subscriptions": [ { - "id": "2218560599_41bbcab029_88391", + "id": "2118090949_41bbcab029_818295", "name": "Subscription #0", "ignored": true, "type": "file", @@ -3294,6 +4228,8 @@ } ], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3306,28 +4242,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 3 + "elapsedTime": 10 } } }, "time": { - "startTime": "2019-06-28T01:18:56.748Z", - "endTime": "2019-06-28T01:18:56.753Z", - "totalTime": 5, + "startTime": "2019-06-30T00:18:10.111Z", + "endTime": "2019-06-30T00:18:10.121Z", + "totalTime": 10, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #2", - "id": "2218560599_73301c2bc1_904916", + "id": "2118090949_73301c2bc1_930704", "ignored": true, "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, "hooks": { "onInit": { "arguments": {}, @@ -3341,23 +4276,23 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.764Z", - "endTime": "2019-06-28T01:18:56.764Z", + "startTime": "2019-06-30T00:18:10.124Z", + "endTime": "2019-06-30T00:18:10.124Z", "totalTime": 0 }, "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/import.yml", - "id": "2218560599_11d1ffbd36_26584", + "id": "2118090949_11d1ffbd36_251529", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3370,24 +4305,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 295 + "elapsedTime": 281 } } }, "time": { - "startTime": "2019-06-28T01:18:56.671Z", - "endTime": "2019-06-28T01:18:56.966Z", - "totalTime": 295, + "startTime": "2019-06-30T00:18:10.038Z", + "endTime": "2019-06-30T00:18:10.319Z", + "totalTime": 281, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "static importRequisition", - "id": "2218560599_0c14282f98_919980", + "id": "2118090949_0c14282f98_50042", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3406,27 +4343,27 @@ } ], "arguments": { - "elapsedTime": 48 + "elapsedTime": 41 } } }, "time": { - "startTime": "2019-06-28T01:18:56.692Z", - "endTime": "2019-06-28T01:18:56.741Z", - "totalTime": 49, + "startTime": "2019-06-30T00:18:10.063Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 42, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "dynamic importRequisition", - "id": "2218560599_6857a59a1d_385150", + "id": "2118090949_6857a59a1d_454598", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3450,28 +4387,26 @@ } ], "arguments": { - "elapsedTime": 5 + "elapsedTime": 8 } } }, "time": { - "startTime": "2019-06-28T01:18:56.745Z", - "endTime": "2019-06-28T01:18:56.750Z", - "totalTime": 5, + "startTime": "2019-06-30T00:18:10.109Z", + "endTime": "2019-06-30T00:18:10.118Z", + "totalTime": 9, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #2", - "id": "2218560599_28f1b301b5_133643", + "id": "2118090949_28f1b301b5_907632", "level": 2, "subscriptions": [ { - "id": "2218560599_a7a23228b4_148304", + "id": "2118090949_a7a23228b4_890491", "name": "Subscription #0", "type": "http", "hooks": { @@ -3502,7 +4437,7 @@ } ], "arguments": { - "elapsedTime": 207 + "elapsedTime": 195 } }, "onMessageReceived": { @@ -3518,17 +4453,17 @@ "query": {}, "url": "/subscription-reuse", "body": "virgs", - "elapsedTime": 180 + "elapsedTime": 165 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.764Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560599_5163661566_5458", + "id": "2118090949_5163661566_130335", "name": "Publisher #0", "valid": true, "hooks": { @@ -3541,7 +4476,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 207 + "elapsedTime": 196 }, "tests": [ { @@ -3573,7 +4508,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-W/H9kn37hnlJai5s8Ay+UMHIcUU\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -3611,7 +4546,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "4", "etag": "W/\"4-W/H9kn37hnlJai5s8Ay+UMHIcUU\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -3646,9 +4581,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:56.966Z" + "publishTime": "2019-06-30T00:18:10.318Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3661,31 +4598,29 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 207 + "elapsedTime": 196 } } }, "time": { - "startTime": "2019-06-28T01:18:56.759Z", - "endTime": "2019-06-28T01:18:56.966Z", - "totalTime": 207, + "startTime": "2019-06-30T00:18:10.123Z", + "endTime": "2019-06-30T00:18:10.319Z", + "totalTime": 196, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/no-tests.yml", - "id": "2218560599_92334e1554_885740", + "id": "2118090949_92334e1554_212973", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3698,24 +4633,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 285 + "elapsedTime": 255 } } }, "time": { - "startTime": "2019-06-28T01:18:56.671Z", - "endTime": "2019-06-28T01:18:56.956Z", - "totalTime": 285, + "startTime": "2019-06-30T00:18:10.038Z", + "endTime": "2019-06-30T00:18:10.293Z", + "totalTime": 255, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560599_35cb1b4ae8_267358", + "id": "2118090949_35cb1b4ae8_965603", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3728,61 +4665,61 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 126 + "elapsedTime": 103 } } }, "time": { - "startTime": "2019-06-28T01:18:56.829Z", - "endTime": "2019-06-28T01:18:56.955Z", - "totalTime": 126, + "startTime": "2019-06-30T00:18:10.190Z", + "endTime": "2019-06-30T00:18:10.293Z", + "totalTime": 103, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/parallel-requisition.yml", - "id": "2218560599_e05b5acab1_127128", + "id": "2118090949_e05b5acab1_795913", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } }, "onFinish": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 865 + "elapsedTime": 861 } } }, "time": { - "startTime": "2019-06-28T01:18:56.672Z", - "endTime": "2019-06-28T01:18:57.537Z", - "totalTime": 865, + "startTime": "2019-06-30T00:18:10.040Z", + "endTime": "2019-06-30T00:18:10.901Z", + "totalTime": 861, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560600_e2f0694b46_315442", + "id": "2118090950_e2f0694b46_72870", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3802,28 +4739,30 @@ { "name": "Assertion #1", "valid": true, - "description": "Expected 'elapsedTime' not to be less than or equal to '400'. Received '330'" + "description": "Expected 'elapsedTime' not to be less than or equal to '400'. Received '331'" } ], "arguments": { - "elapsedTime": 330 + "elapsedTime": 331 } } }, "time": { - "startTime": "2019-06-28T01:18:56.693Z", - "endTime": "2019-06-28T01:18:57.023Z", - "totalTime": 330, + "startTime": "2019-06-30T00:18:10.064Z", + "endTime": "2019-06-30T00:18:10.396Z", + "totalTime": 332, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560600_913ffe0794_961700", + "id": "2118090950_913ffe0794_986887", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3836,27 +4775,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 233 + "elapsedTime": 231 } } }, "time": { - "startTime": "2019-06-28T01:18:56.722Z", - "endTime": "2019-06-28T01:18:56.955Z", - "totalTime": 233, + "startTime": "2019-06-30T00:18:10.093Z", + "endTime": "2019-06-30T00:18:10.324Z", + "totalTime": 231, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560600_fdabeaad92_583177", + "id": "2118090950_fdabeaad92_998848", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3869,31 +4808,29 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 300 + "elapsedTime": 301 } } }, "time": { - "startTime": "2019-06-28T01:18:56.723Z", - "endTime": "2019-06-28T01:18:57.023Z", - "totalTime": 300, + "startTime": "2019-06-30T00:18:10.094Z", + "endTime": "2019-06-30T00:18:10.395Z", + "totalTime": 301, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "Requisition #1", - "id": "2218560600_30bc9c1ac3_634928", + "id": "2118090950_30bc9c1ac3_203837", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3908,33 +4845,35 @@ { "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 '207'" + "description": "Expected 'requisition.requisitions[1].startTime.getTime() - requisition.requisitions[0].startTime.getTime()' to be greater than or equal to '200'. Received '201'" }, { "name": "Assertion #1", "valid": true, - "description": "Expected 'elapsedTime' not to be less than or equal to '600'. Received '512'" + "description": "Expected 'elapsedTime' not to be less than or equal to '600'. Received '503'" } ], "arguments": { - "elapsedTime": 512 + "elapsedTime": 503 } } }, "time": { - "startTime": "2019-06-28T01:18:57.024Z", - "endTime": "2019-06-28T01:18:57.536Z", - "totalTime": 512, + "startTime": "2019-06-30T00:18:10.397Z", + "endTime": "2019-06-30T00:18:10.901Z", + "totalTime": 504, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560600_913ffe0794_155521", + "id": "2118090950_913ffe0794_21695", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3947,27 +4886,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 205 + "elapsedTime": 201 } } }, "time": { - "startTime": "2019-06-28T01:18:57.024Z", - "endTime": "2019-06-28T01:18:57.229Z", - "totalTime": 205, + "startTime": "2019-06-30T00:18:10.397Z", + "endTime": "2019-06-30T00:18:10.598Z", + "totalTime": 201, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560600_463f29d694_660766", + "id": "2118090950_463f29d694_332138", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -3980,37 +4919,31 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 305 + "elapsedTime": 302 } } }, "time": { - "startTime": "2019-06-28T01:18:57.230Z", - "endTime": "2019-06-28T01:18:57.536Z", - "totalTime": 306, + "startTime": "2019-06-30T00:18:10.598Z", + "endTime": "2019-06-30T00:18:10.900Z", + "totalTime": 302, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/parallel-test-publisher.yml", - "id": "2218560600_98a37b717a_887943", + "id": "2118090950_98a37b717a_282843", "level": 1, "subscriptions": [], "publishers": [ { - "id": "2218560600_2955c0f42c_106367", + "id": "2118090950_2955c0f42c_53607", "name": "Publisher #0", "valid": true, "hooks": { @@ -4040,9 +4973,9 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 52619 + "port": 52974 }, - "elapsedTime": 1505 + "elapsedTime": 1504 }, "tests": [ { @@ -4055,9 +4988,11 @@ } }, "type": "tcp", - "publishTime": "2019-06-28T01:18:57.180Z" + "publishTime": "2019-06-30T00:18:10.547Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -4075,23 +5010,21 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.673Z", - "endTime": "2019-06-28T01:18:57.180Z", + "startTime": "2019-06-30T00:18:10.040Z", + "endTime": "2019-06-30T00:18:10.547Z", "totalTime": 507, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/parallel-test-subscription.yml", - "id": "2218560600_eb9c2c8618_686106", + "id": "2118090950_eb9c2c8618_129173", "level": 1, "subscriptions": [ { - "id": "2218560600_b419ff22d8_983303", + "id": "2118090950_b419ff22d8_164943", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -4112,7 +5045,7 @@ } ], "arguments": { - "elapsedTime": 505 + "elapsedTime": 503 } }, "onMessageReceived": { @@ -4131,15 +5064,17 @@ "family": "IPv6", "port": 23081 }, - "elapsedTime": 504 + "elapsedTime": 502 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -4152,27 +5087,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 506 + "elapsedTime": 503 } } }, "time": { - "startTime": "2019-06-28T01:18:56.673Z", - "endTime": "2019-06-28T01:18:57.179Z", - "totalTime": 506, + "startTime": "2019-06-30T00:18:10.041Z", + "endTime": "2019-06-30T00:18:10.544Z", + "totalTime": 503, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/parent.yml", - "id": "2218560600_b79240b3fa_618518", + "id": "2118090950_b79240b3fa_46650", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -4185,24 +5120,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 195 + "elapsedTime": 187 } } }, "time": { - "startTime": "2019-06-28T01:18:56.674Z", - "endTime": "2019-06-28T01:18:56.869Z", - "totalTime": 195, + "startTime": "2019-06-30T00:18:10.041Z", + "endTime": "2019-06-30T00:18:10.228Z", + "totalTime": 187, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560600_c28c57bc75_974050", + "id": "2118090950_c28c57bc75_470540", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -4215,28 +5152,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 47 + "elapsedTime": 40 } } }, "time": { - "startTime": "2019-06-28T01:18:56.693Z", - "endTime": "2019-06-28T01:18:56.741Z", - "totalTime": 48, + "startTime": "2019-06-30T00:18:10.064Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 41, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560600_52aeba2265_702474", + "id": "2118090950_52aeba2265_436158", "level": 2, "subscriptions": [ { - "id": "2218560600_f3eb57f16a_949099", + "id": "2118090950_f3eb57f16a_327283", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -4263,15 +5198,17 @@ } ], "arguments": { - "elapsedTime": 122 + "elapsedTime": 118 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -4284,32 +5221,28 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 123 + "elapsedTime": 119 } } }, "time": { - "startTime": "2019-06-28T01:18:56.746Z", - "endTime": "2019-06-28T01:18:56.869Z", - "totalTime": 123, + "startTime": "2019-06-30T00:18:10.109Z", + "endTime": "2019-06-30T00:18:10.228Z", + "totalTime": 119, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "readme self-test", - "id": "2218560600_46ca06fb8b_125462", + "id": "2118090950_46ca06fb8b_825952", "level": 1, "subscriptions": [ { - "id": "2218560600_2ff3ad431e_910494", + "id": "2118090950_2ff3ad431e_343747", "name": "mock endpoint", "type": "http", "hooks": { @@ -4330,7 +5263,7 @@ } ], "arguments": { - "elapsedTime": 294 + "elapsedTime": 279 } }, "onMessageReceived": { @@ -4358,17 +5291,17 @@ "query": {}, "url": "/readme-example", "body": "does enqueuer rock?", - "elapsedTime": 275 + "elapsedTime": 249 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560600_fd7e0d43ba_212190", + "id": "2118090950_fd7e0d43ba_36450", "name": "Publisher #0", "valid": true, "hooks": { @@ -4381,7 +5314,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 294 + "elapsedTime": 279 }, "tests": [ { @@ -4403,7 +5336,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "13", "etag": "W/\"d-6UKeP76zmvXmSg17xN19aS1KU0w\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -4452,7 +5385,7 @@ "content-type": "text/html; charset=utf-8", "content-length": "13", "etag": "W/\"d-6UKeP76zmvXmSg17xN19aS1KU0w\"", - "date": "Fri, 28 Jun 2019 01:18:56 GMT", + "date": "Sun, 30 Jun 2019 00:18:10 GMT", "connection": "close" }, "request": { @@ -4481,9 +5414,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:56.969Z" + "publishTime": "2019-06-30T00:18:10.321Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -4496,29 +5431,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 294 + "elapsedTime": 279 } } }, "time": { - "startTime": "2019-06-28T01:18:56.675Z", - "endTime": "2019-06-28T01:18:56.970Z", - "totalTime": 295, + "startTime": "2019-06-30T00:18:10.042Z", + "endTime": "2019-06-30T00:18:10.322Z", + "totalTime": 280, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/readme-enqueuer-repo-hit.yml", - "id": "2218560600_5edd709fc3_661311", + "id": "2118090950_5edd709fc3_49555", "level": 1, "subscriptions": [], "publishers": [ { - "id": "2218560600_cf5343e68d_784199", + "id": "2118090950_cf5343e68d_400250", "name": "Publisher #0", "valid": true, "hooks": { @@ -4531,7 +5464,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 1664 + "elapsedTime": 1696 }, "tests": [ { @@ -4545,31 +5478,31 @@ "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 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\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 enqueuer-land/enqueuer\n \n\n

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

Join GitHub today

\n

GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.

\n Sign up\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\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 Find File\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
\n \n \"@lopidio\"\n
\n
\n\n
\n \n lopidio\n\n\n \n\n\n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n \n\n
…sher and subscription
\n
\n
\n Latest commit\n \n f6dcbb9\n \n Jun 25, 2019\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 refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n examples\n \n \n refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 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 feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n output\n \n \n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n src\n \n \n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n Jun 25, 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 refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n package-lock.json\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n package.json\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 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 README.md\n

\n
\n
\n

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

\n

\"enqueuerlogo\"

\n

Want to ensure that a user journey which involves several steps with different protocols is working properly?\nHave you ever struggled with testing multi protocol flows?\nDepending services have become a pain?\nDon't you worry anymore. Enqueuer is what you're looking for.

\n

What it is

\n

It's not just an integration testing tool. It is a platform that provides the following capabilities:

\n
    \n
  • Support for many protocols out of the box
  • \n
  • Chainable message flows
  • \n
  • Easily mock numerous services to alleviate the headaches of functional and integration tests
  • \n
  • Friendly for developers and non developers
  • \n
  • Built in assertion library to verify response data coming from/going to your services
  • \n
  • Easily extensible behavior through third party plugins, including your own custom ones
  • \n
  • CLI is easy to add to your team's existing CI pipelines
  • \n
  • Act and react on your system under test
  • \n
  • Place tests front and center
  • \n
\n

Welcome to the enqueuer world.

\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 and hit it at the same time, you may ask. Not a big deal for enqueuer lovers:

\n
name: readme self-test\npublishers:\n-   type: http\n    url: http://localhost:9085/readme-example\n    method: POST\n    payload: does enqueuer rock?\n    onResponseReceived:\n        script: doubleStatus = statusCode * 2\n        assertions:\n            -   expect: body\n                toBeEqualTo: `mock response`\n            -   expect: doubleStatus\n                toBeGreaterThan: 300\nsubscriptions:\n-   type: http\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        -   name: failing test\n            expectToBeTruthy: false\n
\n

Note that the second subscription assertion is a failing one. By running this example, we get this:

\n
$ nqr http-self-test.yml\n   [FAIL]      readme self-test                                                   6 tests passing of 7 (85.71%) ran in 37ms\n   [FAIL] enqueuer                                                                6 tests passing of 7 (85.71%) ran in 42ms\n               enqueuer › readme self-test › mock endpoint › failing test\n                           Expecting 'false' to be true. Received: false\n
\n

I 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 \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n You signed in with another tab or window. Reload to refresh your session.\n You signed out in another tab or window. Reload to refresh your session.\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 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\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 enqueuer-land/enqueuer\n \n\n

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

Join GitHub today

\n

GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.

\n Sign up\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\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 Find File\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 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 \n \n \n
\n \n \"\"\n \n conf\n \n \n \n \n \n
\n \n \"\"\n \n docs\n \n \n \n \n \n
\n \n \"\"\n \n examples\n \n \n \n \n \n
\n \n \"\"\n \n https-cert\n \n \n \n \n \n
\n \n \"\"\n \n misc\n \n \n \n \n \n
\n \n \"\"\n \n output\n \n \n \n \n \n
\n \n \"\"\n \n src\n \n \n \n \n \n
\n \n \"\"\n \n temp\n \n \n \n \n \n
\n \n \"\"\n \n .codeclimate.yml\n \n \n \n \n \n
\n \n \"\"\n \n .gitignore\n \n \n \n \n \n
\n \n \"\"\n \n .npmignore\n \n \n \n \n \n
\n \n \"\"\n \n .travis.yml\n \n \n \n \n \n
\n \n \"\"\n \n CNAME\n \n \n \n \n \n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n \n \n \n
\n \n \"\"\n \n License\n \n \n \n \n \n
\n \n \"\"\n \n README.md\n \n \n \n \n \n
\n \n \"\"\n \n package-lock.json\n \n \n \n \n \n
\n \n \"\"\n \n package.json\n \n \n \n \n \n
\n \n \"\"\n \n tsconfig.json\n \n \n \n \n \n
\n \n \"\"\n \n tslint.json\n \n \n \n \n \n
\n\n
\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n

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

\n

\"enqueuerlogo\"

\n

Want to ensure that a user journey which involves several steps with different protocols is working properly?\nHave you ever struggled with testing multi protocol flows?\nDepending services have become a pain?\nDon't you worry anymore. Enqueuer is what you're looking for.

\n

What it is

\n

It's not just an integration testing tool. It is a platform that provides the following capabilities:

\n
    \n
  • Support for many protocols out of the box
  • \n
  • Chainable message flows
  • \n
  • Easily mock numerous services to alleviate the headaches of functional and integration tests
  • \n
  • Friendly for developers and non developers
  • \n
  • Built in assertion library to verify response data coming from/going to your services
  • \n
  • Easily extensible behavior through third party plugins, including your own custom ones
  • \n
  • CLI is easy to add to your team's existing CI pipelines
  • \n
  • Act and react on your system under test
  • \n
  • Place tests front and center
  • \n
\n

Welcome to the enqueuer world.

\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 and hit it at the same time, you may ask. Not a big deal for enqueuer lovers:

\n
name: readme self-test\npublishers:\n-   type: http\n    url: http://localhost:9085/readme-example\n    method: POST\n    payload: does enqueuer rock?\n    onResponseReceived:\n        script: doubleStatus = statusCode * 2\n        assertions:\n            -   expect: body\n                toBeEqualTo: `mock response`\n            -   expect: doubleStatus\n                toBeGreaterThan: 300\nsubscriptions:\n-   type: http\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        -   name: failing test\n            expectToBeTruthy: false\n
\n

Note that the second subscription assertion is a failing one. By running this example, we get this:

\n
$ nqr http-self-test.yml\n   [FAIL]      readme self-test                                                   6 tests passing of 7 (85.71%) ran in 37ms\n   [FAIL] enqueuer                                                                6 tests passing of 7 (85.71%) ran in 42ms\n               enqueuer › readme self-test › mock endpoint › failing test\n                           Expecting 'false' to be true. Received: false\n
\n

I 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 \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n You signed in with another tab or window. Reload to refresh your session.\n You signed out in another tab or window. Reload to refresh your session.\n
\n \n\n
\n
\n
\n
\n\n
\n\n \n\n\n", "headers": { "server": "GitHub.com", - "date": "Fri, 28 Jun 2019 01:19:02 GMT", + "date": "Sun, 30 Jun 2019 00:18:16 GMT", "content-type": "text/html; charset=utf-8", "transfer-encoding": "chunked", "connection": "close", "status": "200 OK", "vary": "X-PJAX", - "etag": "W/\"799ef3b5cf218438c8dc7fe6aa05bde6\"", + "etag": "W/\"f0310deaf2418178213bdf4997b0ae71\"", "cache-control": "max-age=0, private, must-revalidate", "set-cookie": [ - "has_recent_activity=1; path=/; expires=Fri, 28 Jun 2019 02:19:02 -0000", - "_octo=GH1.1.1750468231.1561684742; domain=.github.com; path=/; expires=Mon, 28 Jun 2021 01:19:02 -0000", - "logged_in=no; domain=.github.com; path=/; expires=Tue, 28 Jun 2039 01:19:02 -0000; secure; HttpOnly", - "_gh_sess=ZGNYM3RqMWJTV3dNWWM3OTZ5TEUyM3F0di9MaHlFWGJVLzhZeDMyNlA4SlJaa1duS04vdDdIQnpabWMya2RwREYzY1ZSbnZhbTVVUEh0alIwWHNObjM5VFlSeDU3VGV4UjVnRHAveGtTZnppcjIySXNIaDJxSXZJR1c4eWFJSDRkc2s3Y1Yyd1doODY3bEFTc0ZSN3UyanloV3I5dXRiNmEyczNtcDhld0hrVDQyZ3BuNC9JU0ZhSWxiK2xweFc3eFRtSStyM0xMbnZ3RUxBVStiUDlXcGdMRTZtYm1aRVpqck52UGY0ZnozVmdmQjFtVllFQzJZRmdORHFOLzFOYnQvZ0ZoTmloOXBVSENFeEk0QmRPV2RuN1lhTXpGWkhwUDgwRG5jVTN0OU09LS1IL0hyZlpXWVN2UkNYaVRTQlk3VjVRPT0%3D--6c6c808d2801896f8af51a7abd7c027dc1f20ef6; path=/; secure; HttpOnly" + "has_recent_activity=1; path=/; expires=Sun, 30 Jun 2019 01:18:16 -0000", + "_octo=GH1.1.428263756.1561853896; domain=.github.com; path=/; expires=Wed, 30 Jun 2021 00:18:16 -0000", + "logged_in=no; domain=.github.com; path=/; expires=Thu, 30 Jun 2039 00:18:16 -0000; secure; HttpOnly", + "_gh_sess=U0VFTHgycENCaS82V1hPQWV1OXUvU0lIc1UyUFYrVnNRamYzRWJLY3ZCNnRVcW1sWmh0eVhyajhOVDFOMDJ6UGJUYmp0VGlURGhVQ0g2aFkvcUNTYkxSSDVjUUcxZVlYcGNZdGNmWHBuS2ZZL1pwdEMxUHhQdHJEMzFoYVRxMHdIU2hFaVVYRnBQRjJjNFhtWXM3TUR6WW84bDFvczJNeGFmUjc1Yi9DQldvQ21HUXlEUFUvQ0lpejZuMjZhL0NEVkhXU2J4VWpMaUlPeUVhYVhKb3VsRi81bTFRQnVtY1Vwb1hJRFNYOW8rWUdFSWdrb2lPZ1Zva1VjZnVzR3VPWDAwWXp4ZWg1NWxva1Y5a0VGWDBacDJUZktPV2lsdzBBTjhRc0pZdVhnVzg9LS1FbEk4RkphZlo0RHdSOGhDNmVORWdnPT0%3D--d5f3adc7ed0f812a5a08a7320547289a7a11e957; path=/; secure; HttpOnly" ], - "x-request-id": "93028cd0-d289-4106-aad0-7c685aa09310", + "x-request-id": "4f8f58e5-d42a-4025-9e4d-ba7376d6a438", "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": "2583:7538:1DF64B:3644B1:5D156B05" + "x-github-request-id": "24FF:617A:10588DB:1BE0580:5D17FFC7" }, "request": { "uri": { @@ -4604,31 +5537,31 @@ "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 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\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 enqueuer-land/enqueuer\n \n\n

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

Join GitHub today

\n

GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.

\n Sign up\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\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 Find File\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
\n \n \"@lopidio\"\n
\n
\n\n
\n \n lopidio\n\n\n \n\n\n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n \n\n
…sher and subscription
\n
\n
\n Latest commit\n \n f6dcbb9\n \n Jun 25, 2019\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 refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n examples\n \n \n refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 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 feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n output\n \n \n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n src\n \n \n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n Jun 25, 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 refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n package-lock.json\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n package.json\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 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 README.md\n

\n
\n
\n

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

\n

\"enqueuerlogo\"

\n

Want to ensure that a user journey which involves several steps with different protocols is working properly?\nHave you ever struggled with testing multi protocol flows?\nDepending services have become a pain?\nDon't you worry anymore. Enqueuer is what you're looking for.

\n

What it is

\n

It's not just an integration testing tool. It is a platform that provides the following capabilities:

\n
    \n
  • Support for many protocols out of the box
  • \n
  • Chainable message flows
  • \n
  • Easily mock numerous services to alleviate the headaches of functional and integration tests
  • \n
  • Friendly for developers and non developers
  • \n
  • Built in assertion library to verify response data coming from/going to your services
  • \n
  • Easily extensible behavior through third party plugins, including your own custom ones
  • \n
  • CLI is easy to add to your team's existing CI pipelines
  • \n
  • Act and react on your system under test
  • \n
  • Place tests front and center
  • \n
\n

Welcome to the enqueuer world.

\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 and hit it at the same time, you may ask. Not a big deal for enqueuer lovers:

\n
name: readme self-test\npublishers:\n-   type: http\n    url: http://localhost:9085/readme-example\n    method: POST\n    payload: does enqueuer rock?\n    onResponseReceived:\n        script: doubleStatus = statusCode * 2\n        assertions:\n            -   expect: body\n                toBeEqualTo: `mock response`\n            -   expect: doubleStatus\n                toBeGreaterThan: 300\nsubscriptions:\n-   type: http\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        -   name: failing test\n            expectToBeTruthy: false\n
\n

Note that the second subscription assertion is a failing one. By running this example, we get this:

\n
$ nqr http-self-test.yml\n   [FAIL]      readme self-test                                                   6 tests passing of 7 (85.71%) ran in 37ms\n   [FAIL] enqueuer                                                                6 tests passing of 7 (85.71%) ran in 42ms\n               enqueuer › readme self-test › mock endpoint › failing test\n                           Expecting 'false' to be true. Received: false\n
\n

I 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 \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n You signed in with another tab or window. Reload to refresh your session.\n You signed out in another tab or window. Reload to refresh your session.\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 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\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 enqueuer-land/enqueuer\n \n\n

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

Join GitHub today

\n

GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.

\n Sign up\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\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 Find File\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 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 \n \n \n
\n \n \"\"\n \n conf\n \n \n \n \n \n
\n \n \"\"\n \n docs\n \n \n \n \n \n
\n \n \"\"\n \n examples\n \n \n \n \n \n
\n \n \"\"\n \n https-cert\n \n \n \n \n \n
\n \n \"\"\n \n misc\n \n \n \n \n \n
\n \n \"\"\n \n output\n \n \n \n \n \n
\n \n \"\"\n \n src\n \n \n \n \n \n
\n \n \"\"\n \n temp\n \n \n \n \n \n
\n \n \"\"\n \n .codeclimate.yml\n \n \n \n \n \n
\n \n \"\"\n \n .gitignore\n \n \n \n \n \n
\n \n \"\"\n \n .npmignore\n \n \n \n \n \n
\n \n \"\"\n \n .travis.yml\n \n \n \n \n \n
\n \n \"\"\n \n CNAME\n \n \n \n \n \n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n \n \n \n
\n \n \"\"\n \n License\n \n \n \n \n \n
\n \n \"\"\n \n README.md\n \n \n \n \n \n
\n \n \"\"\n \n package-lock.json\n \n \n \n \n \n
\n \n \"\"\n \n package.json\n \n \n \n \n \n
\n \n \"\"\n \n tsconfig.json\n \n \n \n \n \n
\n \n \"\"\n \n tslint.json\n \n \n \n \n \n
\n\n
\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n

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

\n

\"enqueuerlogo\"

\n

Want to ensure that a user journey which involves several steps with different protocols is working properly?\nHave you ever struggled with testing multi protocol flows?\nDepending services have become a pain?\nDon't you worry anymore. Enqueuer is what you're looking for.

\n

What it is

\n

It's not just an integration testing tool. It is a platform that provides the following capabilities:

\n
    \n
  • Support for many protocols out of the box
  • \n
  • Chainable message flows
  • \n
  • Easily mock numerous services to alleviate the headaches of functional and integration tests
  • \n
  • Friendly for developers and non developers
  • \n
  • Built in assertion library to verify response data coming from/going to your services
  • \n
  • Easily extensible behavior through third party plugins, including your own custom ones
  • \n
  • CLI is easy to add to your team's existing CI pipelines
  • \n
  • Act and react on your system under test
  • \n
  • Place tests front and center
  • \n
\n

Welcome to the enqueuer world.

\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 and hit it at the same time, you may ask. Not a big deal for enqueuer lovers:

\n
name: readme self-test\npublishers:\n-   type: http\n    url: http://localhost:9085/readme-example\n    method: POST\n    payload: does enqueuer rock?\n    onResponseReceived:\n        script: doubleStatus = statusCode * 2\n        assertions:\n            -   expect: body\n                toBeEqualTo: `mock response`\n            -   expect: doubleStatus\n                toBeGreaterThan: 300\nsubscriptions:\n-   type: http\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        -   name: failing test\n            expectToBeTruthy: false\n
\n

Note that the second subscription assertion is a failing one. By running this example, we get this:

\n
$ nqr http-self-test.yml\n   [FAIL]      readme self-test                                                   6 tests passing of 7 (85.71%) ran in 37ms\n   [FAIL] enqueuer                                                                6 tests passing of 7 (85.71%) ran in 42ms\n               enqueuer › readme self-test › mock endpoint › failing test\n                           Expecting 'false' to be true. Received: false\n
\n

I 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 \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n You signed in with another tab or window. Reload to refresh your session.\n You signed out in another tab or window. Reload to refresh your session.\n
\n \n\n
\n
\n
\n
\n\n
\n\n \n\n\n", "headers": { "server": "GitHub.com", - "date": "Fri, 28 Jun 2019 01:19:02 GMT", + "date": "Sun, 30 Jun 2019 00:18:16 GMT", "content-type": "text/html; charset=utf-8", "transfer-encoding": "chunked", "connection": "close", "status": "200 OK", "vary": "X-PJAX", - "etag": "W/\"799ef3b5cf218438c8dc7fe6aa05bde6\"", + "etag": "W/\"f0310deaf2418178213bdf4997b0ae71\"", "cache-control": "max-age=0, private, must-revalidate", "set-cookie": [ - "has_recent_activity=1; path=/; expires=Fri, 28 Jun 2019 02:19:02 -0000", - "_octo=GH1.1.1750468231.1561684742; domain=.github.com; path=/; expires=Mon, 28 Jun 2021 01:19:02 -0000", - "logged_in=no; domain=.github.com; path=/; expires=Tue, 28 Jun 2039 01:19:02 -0000; secure; HttpOnly", - "_gh_sess=ZGNYM3RqMWJTV3dNWWM3OTZ5TEUyM3F0di9MaHlFWGJVLzhZeDMyNlA4SlJaa1duS04vdDdIQnpabWMya2RwREYzY1ZSbnZhbTVVUEh0alIwWHNObjM5VFlSeDU3VGV4UjVnRHAveGtTZnppcjIySXNIaDJxSXZJR1c4eWFJSDRkc2s3Y1Yyd1doODY3bEFTc0ZSN3UyanloV3I5dXRiNmEyczNtcDhld0hrVDQyZ3BuNC9JU0ZhSWxiK2xweFc3eFRtSStyM0xMbnZ3RUxBVStiUDlXcGdMRTZtYm1aRVpqck52UGY0ZnozVmdmQjFtVllFQzJZRmdORHFOLzFOYnQvZ0ZoTmloOXBVSENFeEk0QmRPV2RuN1lhTXpGWkhwUDgwRG5jVTN0OU09LS1IL0hyZlpXWVN2UkNYaVRTQlk3VjVRPT0%3D--6c6c808d2801896f8af51a7abd7c027dc1f20ef6; path=/; secure; HttpOnly" + "has_recent_activity=1; path=/; expires=Sun, 30 Jun 2019 01:18:16 -0000", + "_octo=GH1.1.428263756.1561853896; domain=.github.com; path=/; expires=Wed, 30 Jun 2021 00:18:16 -0000", + "logged_in=no; domain=.github.com; path=/; expires=Thu, 30 Jun 2039 00:18:16 -0000; secure; HttpOnly", + "_gh_sess=U0VFTHgycENCaS82V1hPQWV1OXUvU0lIc1UyUFYrVnNRamYzRWJLY3ZCNnRVcW1sWmh0eVhyajhOVDFOMDJ6UGJUYmp0VGlURGhVQ0g2aFkvcUNTYkxSSDVjUUcxZVlYcGNZdGNmWHBuS2ZZL1pwdEMxUHhQdHJEMzFoYVRxMHdIU2hFaVVYRnBQRjJjNFhtWXM3TUR6WW84bDFvczJNeGFmUjc1Yi9DQldvQ21HUXlEUFUvQ0lpejZuMjZhL0NEVkhXU2J4VWpMaUlPeUVhYVhKb3VsRi81bTFRQnVtY1Vwb1hJRFNYOW8rWUdFSWdrb2lPZ1Zva1VjZnVzR3VPWDAwWXp4ZWg1NWxva1Y5a0VGWDBacDJUZktPV2lsdzBBTjhRc0pZdVhnVzg9LS1FbEk4RkphZlo0RHdSOGhDNmVORWdnPT0%3D--d5f3adc7ed0f812a5a08a7320547289a7a11e957; path=/; secure; HttpOnly" ], - "x-request-id": "93028cd0-d289-4106-aad0-7c685aa09310", + "x-request-id": "4f8f58e5-d42a-4025-9e4d-ba7376d6a438", "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": "2583:7538:1DF64B:3644B1:5D156B05" + "x-github-request-id": "24FF:617A:10588DB:1BE0580:5D17FFC7" }, "request": { "uri": { @@ -4656,9 +5589,11 @@ } }, "type": "http", - "publishTime": "2019-06-28T01:18:58.340Z" + "publishTime": "2019-06-30T00:18:11.739Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -4671,27 +5606,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1664 + "elapsedTime": 1696 } } }, "time": { - "startTime": "2019-06-28T01:18:56.676Z", - "endTime": "2019-06-28T01:18:58.340Z", - "totalTime": 1664, + "startTime": "2019-06-30T00:18:10.043Z", + "endTime": "2019-06-30T00:18:11.739Z", + "totalTime": 1696, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/recursion.yml", - "id": "2218560600_00da84a874_506195", + "id": "2118090950_00da84a874_504375", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -4704,24 +5639,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 127 + "elapsedTime": 110 } } }, "time": { - "startTime": "2019-06-28T01:18:56.676Z", - "endTime": "2019-06-28T01:18:56.803Z", - "totalTime": 127, + "startTime": "2019-06-30T00:18:10.044Z", + "endTime": "2019-06-30T00:18:10.154Z", + "totalTime": 110, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560600_75977bc4c1_92542", + "id": "2118090950_75977bc4c1_77647", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -4734,27 +5671,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 46 + "elapsedTime": 40 } } }, "time": { - "startTime": "2019-06-28T01:18:56.694Z", - "endTime": "2019-06-28T01:18:56.741Z", - "totalTime": 47, + "startTime": "2019-06-30T00:18:10.064Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 41, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560601_e87d17a22e_991433", + "id": "2118090951_e87d17a22e_292753", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -4767,24 +5704,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 29 + "elapsedTime": 26 } } }, "time": { - "startTime": "2019-06-28T01:18:56.747Z", - "endTime": "2019-06-28T01:18:56.776Z", - "totalTime": 29, + "startTime": "2019-06-30T00:18:10.110Z", + "endTime": "2019-06-30T00:18:10.136Z", + "totalTime": 26, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_55233c1965_85585", + "id": "2118090951_55233c1965_627366", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -4797,24 +5736,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 20 + "elapsedTime": 17 } } }, "time": { - "startTime": "2019-06-28T01:18:56.749Z", - "endTime": "2019-06-28T01:18:56.769Z", - "totalTime": 20, + "startTime": "2019-06-30T00:18:10.113Z", + "endTime": "2019-06-30T00:18:10.130Z", + "totalTime": 17, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -4827,27 +5768,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 3 } } }, "time": { - "startTime": "2019-06-28T01:18:56.749Z", - "endTime": "2019-06-28T01:18:56.751Z", - "totalTime": 2, + "startTime": "2019-06-30T00:18:10.117Z", + "endTime": "2019-06-30T00:18:10.120Z", + "totalTime": 3, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -4860,27 +5801,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 5 + "elapsedTime": 2 } } }, "time": { - "startTime": "2019-06-28T01:18:56.760Z", - "endTime": "2019-06-28T01:18:56.766Z", - "totalTime": 6, + "startTime": "2019-06-30T00:18:10.123Z", + "endTime": "2019-06-30T00:18:10.126Z", + "totalTime": 3, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -4893,31 +5834,29 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2019-06-28T01:18:56.767Z", - "endTime": "2019-06-28T01:18:56.768Z", + "startTime": "2019-06-30T00:18:10.128Z", + "endTime": "2019-06-30T00:18:10.129Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 3 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 3 + ] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_55233c1965_85585", + "id": "2118090951_55233c1965_627366", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -4935,8 +5874,8 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.769Z", - "endTime": "2019-06-28T01:18:56.773Z", + "startTime": "2019-06-30T00:18:10.130Z", + "endTime": "2019-06-30T00:18:10.134Z", "totalTime": 4, "timeout": 5000 }, @@ -4944,10 +5883,12 @@ { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -4960,27 +5901,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2019-06-28T01:18:56.769Z", - "endTime": "2019-06-28T01:18:56.770Z", - "totalTime": 1, + "startTime": "2019-06-30T00:18:10.131Z", + "endTime": "2019-06-30T00:18:10.131Z", + "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -4993,27 +5934,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2019-06-28T01:18:56.770Z", - "endTime": "2019-06-28T01:18:56.771Z", - "totalTime": 1, + "startTime": "2019-06-30T00:18:10.132Z", + "endTime": "2019-06-30T00:18:10.132Z", + "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5031,26 +5972,24 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.772Z", - "endTime": "2019-06-28T01:18:56.772Z", + "startTime": "2019-06-30T00:18:10.133Z", + "endTime": "2019-06-30T00:18:10.133Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 3 + "requisitions": [] } - ], - "iteration": 1, - "totalIterations": 3 + ] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_55233c1965_85585", + "id": "2118090951_55233c1965_627366", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5068,8 +6007,8 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.774Z", - "endTime": "2019-06-28T01:18:56.776Z", + "startTime": "2019-06-30T00:18:10.134Z", + "endTime": "2019-06-30T00:18:10.136Z", "totalTime": 2, "timeout": 5000 }, @@ -5077,10 +6016,12 @@ { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5093,27 +6034,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2019-06-28T01:18:56.774Z", - "endTime": "2019-06-28T01:18:56.774Z", - "totalTime": 0, + "startTime": "2019-06-30T00:18:10.134Z", + "endTime": "2019-06-30T00:18:10.135Z", + "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5126,27 +6067,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2019-06-28T01:18:56.775Z", - "endTime": "2019-06-28T01:18:56.775Z", - "totalTime": 0, + "startTime": "2019-06-30T00:18:10.135Z", + "endTime": "2019-06-30T00:18:10.136Z", + "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5164,30 +6105,26 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.775Z", - "endTime": "2019-06-28T01:18:56.775Z", + "startTime": "2019-06-30T00:18:10.136Z", + "endTime": "2019-06-30T00:18:10.136Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 3 + "requisitions": [] } - ], - "iteration": 2, - "totalIterations": 3 + ] } - ], - "iteration": 0, - "totalIterations": 3 + ] }, { "valid": true, "name": "Requisition #1", - "id": "2218560601_e87d17a22e_991433", + "id": "2118090951_e87d17a22e_292753", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5200,24 +6137,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 19 + "elapsedTime": 11 } } }, "time": { - "startTime": "2019-06-28T01:18:56.776Z", - "endTime": "2019-06-28T01:18:56.795Z", - "totalTime": 19, + "startTime": "2019-06-30T00:18:10.136Z", + "endTime": "2019-06-30T00:18:10.147Z", + "totalTime": 11, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_55233c1965_85585", + "id": "2118090951_55233c1965_627366", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5230,24 +6169,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 3 + "elapsedTime": 1 } } }, "time": { - "startTime": "2019-06-28T01:18:56.776Z", - "endTime": "2019-06-28T01:18:56.779Z", - "totalTime": 3, + "startTime": "2019-06-30T00:18:10.137Z", + "endTime": "2019-06-30T00:18:10.138Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5260,27 +6201,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2019-06-28T01:18:56.776Z", - "endTime": "2019-06-28T01:18:56.777Z", - "totalTime": 1, + "startTime": "2019-06-30T00:18:10.137Z", + "endTime": "2019-06-30T00:18:10.137Z", + "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5298,22 +6239,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.777Z", - "endTime": "2019-06-28T01:18:56.777Z", + "startTime": "2019-06-30T00:18:10.137Z", + "endTime": "2019-06-30T00:18:10.137Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5326,31 +6267,29 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2019-06-28T01:18:56.777Z", - "endTime": "2019-06-28T01:18:56.778Z", - "totalTime": 1, + "startTime": "2019-06-30T00:18:10.138Z", + "endTime": "2019-06-30T00:18:10.138Z", + "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 3 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 3 + ] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_55233c1965_85585", + "id": "2118090951_55233c1965_627366", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5363,24 +6302,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 9 + "elapsedTime": 6 } } }, "time": { - "startTime": "2019-06-28T01:18:56.780Z", - "endTime": "2019-06-28T01:18:56.789Z", - "totalTime": 9, + "startTime": "2019-06-30T00:18:10.139Z", + "endTime": "2019-06-30T00:18:10.145Z", + "totalTime": 6, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5398,28 +6339,28 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.783Z", - "endTime": "2019-06-28T01:18:56.784Z", + "startTime": "2019-06-30T00:18:10.140Z", + "endTime": "2019-06-30T00:18:10.141Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } }, "onFinish": { @@ -5431,22 +6372,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.786Z", - "endTime": "2019-06-28T01:18:56.788Z", - "totalTime": 2, + "startTime": "2019-06-30T00:18:10.142Z", + "endTime": "2019-06-30T00:18:10.143Z", + "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5464,26 +6405,24 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.788Z", - "endTime": "2019-06-28T01:18:56.789Z", + "startTime": "2019-06-30T00:18:10.144Z", + "endTime": "2019-06-30T00:18:10.145Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 3 + "requisitions": [] } - ], - "iteration": 1, - "totalIterations": 3 + ] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_55233c1965_85585", + "id": "2118090951_55233c1965_627366", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5496,24 +6435,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 5 + "elapsedTime": 1 } } }, "time": { - "startTime": "2019-06-28T01:18:56.790Z", - "endTime": "2019-06-28T01:18:56.795Z", - "totalTime": 5, + "startTime": "2019-06-30T00:18:10.146Z", + "endTime": "2019-06-30T00:18:10.147Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5531,22 +6472,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.791Z", - "endTime": "2019-06-28T01:18:56.791Z", + "startTime": "2019-06-30T00:18:10.146Z", + "endTime": "2019-06-30T00:18:10.146Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5564,22 +6505,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.792Z", - "endTime": "2019-06-28T01:18:56.792Z", + "startTime": "2019-06-30T00:18:10.146Z", + "endTime": "2019-06-30T00:18:10.146Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5597,30 +6538,26 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.794Z", - "endTime": "2019-06-28T01:18:56.795Z", - "totalTime": 1, + "startTime": "2019-06-30T00:18:10.147Z", + "endTime": "2019-06-30T00:18:10.147Z", + "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 3 + "requisitions": [] } - ], - "iteration": 2, - "totalIterations": 3 + ] } - ], - "iteration": 1, - "totalIterations": 3 + ] }, { "valid": true, "name": "Requisition #1", - "id": "2218560601_e87d17a22e_991433", + "id": "2118090951_e87d17a22e_292753", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5633,24 +6570,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 7 + "elapsedTime": 5 } } }, "time": { - "startTime": "2019-06-28T01:18:56.795Z", - "endTime": "2019-06-28T01:18:56.802Z", - "totalTime": 7, + "startTime": "2019-06-30T00:18:10.148Z", + "endTime": "2019-06-30T00:18:10.153Z", + "totalTime": 5, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_55233c1965_85585", + "id": "2118090951_55233c1965_627366", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5663,24 +6602,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2 + "elapsedTime": 1 } } }, "time": { - "startTime": "2019-06-28T01:18:56.796Z", - "endTime": "2019-06-28T01:18:56.798Z", - "totalTime": 2, + "startTime": "2019-06-30T00:18:10.148Z", + "endTime": "2019-06-30T00:18:10.149Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5698,22 +6639,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.796Z", - "endTime": "2019-06-28T01:18:56.797Z", + "startTime": "2019-06-30T00:18:10.148Z", + "endTime": "2019-06-30T00:18:10.149Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5731,22 +6672,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.797Z", - "endTime": "2019-06-28T01:18:56.797Z", + "startTime": "2019-06-30T00:18:10.149Z", + "endTime": "2019-06-30T00:18:10.149Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5764,26 +6705,24 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.797Z", - "endTime": "2019-06-28T01:18:56.797Z", + "startTime": "2019-06-30T00:18:10.149Z", + "endTime": "2019-06-30T00:18:10.149Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 3 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 3 + ] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_55233c1965_85585", + "id": "2118090951_55233c1965_627366", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5801,19 +6740,21 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.798Z", - "endTime": "2019-06-28T01:18:56.800Z", - "totalTime": 2, + "startTime": "2019-06-30T00:18:10.150Z", + "endTime": "2019-06-30T00:18:10.151Z", + "totalTime": 1, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5831,22 +6772,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.798Z", - "endTime": "2019-06-28T01:18:56.798Z", + "startTime": "2019-06-30T00:18:10.150Z", + "endTime": "2019-06-30T00:18:10.150Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5864,22 +6805,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.799Z", - "endTime": "2019-06-28T01:18:56.799Z", + "startTime": "2019-06-30T00:18:10.150Z", + "endTime": "2019-06-30T00:18:10.150Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5897,26 +6838,24 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.799Z", - "endTime": "2019-06-28T01:18:56.799Z", + "startTime": "2019-06-30T00:18:10.151Z", + "endTime": "2019-06-30T00:18:10.151Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 3 + "requisitions": [] } - ], - "iteration": 1, - "totalIterations": 3 + ] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_55233c1965_85585", + "id": "2118090951_55233c1965_627366", "level": 3, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5934,8 +6873,8 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.800Z", - "endTime": "2019-06-28T01:18:56.802Z", + "startTime": "2019-06-30T00:18:10.151Z", + "endTime": "2019-06-30T00:18:10.153Z", "totalTime": 2, "timeout": 5000 }, @@ -5943,10 +6882,12 @@ { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5964,22 +6905,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.800Z", - "endTime": "2019-06-28T01:18:56.801Z", + "startTime": "2019-06-30T00:18:10.151Z", + "endTime": "2019-06-30T00:18:10.152Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -5997,22 +6938,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.801Z", - "endTime": "2019-06-28T01:18:56.801Z", + "startTime": "2019-06-30T00:18:10.152Z", + "endTime": "2019-06-30T00:18:10.152Z", "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 3 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_5e02f9345e_385629", + "id": "2118090951_5e02f9345e_386464", "level": 4, "subscriptions": [], "publishers": [], + "iterations": 3, + "totalIterations": 3, "hooks": { "onInit": { "valid": true, @@ -6025,35 +6966,31 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2019-06-28T01:18:56.801Z", - "endTime": "2019-06-28T01:18:56.802Z", - "totalTime": 1, + "startTime": "2019-06-30T00:18:10.153Z", + "endTime": "2019-06-30T00:18:10.153Z", + "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 3 + "requisitions": [] } - ], - "iteration": 2, - "totalIterations": 3 + ] } - ], - "iteration": 2, - "totalIterations": 3 + ] }, { "valid": true, "name": "Requisition #2", - "id": "2218560601_aef615856f_715834", + "id": "2118090951_aef615856f_935764", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -6072,31 +7009,29 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2019-06-28T01:18:56.802Z", - "endTime": "2019-06-28T01:18:56.803Z", - "totalTime": 1, + "startTime": "2019-06-30T00:18:10.154Z", + "endTime": "2019-06-30T00:18:10.154Z", + "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/requisition-delay-iterations.yml", - "id": "2218560601_8e102bb4f5_708138", + "id": "2118090951_8e102bb4f5_480365", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -6109,24 +7044,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 3100 + "elapsedTime": 3095 } } }, "time": { - "startTime": "2019-06-28T01:18:56.677Z", - "endTime": "2019-06-28T01:18:59.777Z", - "totalTime": 3100, + "startTime": "2019-06-30T00:18:10.044Z", + "endTime": "2019-06-30T00:18:13.139Z", + "totalTime": 3095, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "iterations", - "id": "2218560601_b4f515b70d_748144", + "id": "2118090951_b4f515b70d_514808", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 10, + "totalIterations": 10, "hooks": { "onInit": { "valid": true, @@ -6139,27 +7076,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 46 + "elapsedTime": 40 } } }, "time": { - "startTime": "2019-06-28T01:18:56.694Z", - "endTime": "2019-06-28T01:18:56.741Z", - "totalTime": 47, + "startTime": "2019-06-30T00:18:10.064Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 41, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 10 + "requisitions": [] }, { "valid": true, "name": "iterations", - "id": "2218560601_b4f515b70d_748144", + "id": "2118090951_b4f515b70d_514808", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 10, + "totalIterations": 10, "hooks": { "onInit": { "valid": true, @@ -6172,60 +7109,60 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 5 + "elapsedTime": 9 } } }, "time": { - "startTime": "2019-06-28T01:18:56.744Z", - "endTime": "2019-06-28T01:18:56.750Z", - "totalTime": 6, + "startTime": "2019-06-30T00:18:10.108Z", + "endTime": "2019-06-30T00:18:10.117Z", + "totalTime": 9, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 10 + "requisitions": [] }, { "valid": true, "name": "iterations", - "id": "2218560601_b4f515b70d_748144", + "id": "2118090951_b4f515b70d_514808", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 10, + "totalIterations": 10, "hooks": { "onInit": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } }, "onFinish": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 12 + "elapsedTime": 4 } } }, "time": { - "startTime": "2019-06-28T01:18:56.750Z", - "endTime": "2019-06-28T01:18:56.764Z", - "totalTime": 14, + "startTime": "2019-06-30T00:18:10.120Z", + "endTime": "2019-06-30T00:18:10.124Z", + "totalTime": 4, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 10 + "requisitions": [] }, { "valid": true, "name": "iterations", - "id": "2218560601_b4f515b70d_748144", + "id": "2118090951_b4f515b70d_514808", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 10, + "totalIterations": 10, "hooks": { "onInit": { "valid": true, @@ -6238,27 +7175,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2 + "elapsedTime": 3 } } }, "time": { - "startTime": "2019-06-28T01:18:56.765Z", - "endTime": "2019-06-28T01:18:56.767Z", - "totalTime": 2, + "startTime": "2019-06-30T00:18:10.125Z", + "endTime": "2019-06-30T00:18:10.129Z", + "totalTime": 4, "timeout": 5000 }, - "requisitions": [], - "iteration": 3, - "totalIterations": 10 + "requisitions": [] }, { "valid": true, "name": "iterations", - "id": "2218560601_b4f515b70d_748144", + "id": "2118090951_b4f515b70d_514808", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 10, + "totalIterations": 10, "hooks": { "onInit": { "valid": true, @@ -6271,60 +7208,60 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2019-06-28T01:18:56.768Z", - "endTime": "2019-06-28T01:18:56.768Z", - "totalTime": 0, + "startTime": "2019-06-30T00:18:10.129Z", + "endTime": "2019-06-30T00:18:10.130Z", + "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 4, - "totalIterations": 10 + "requisitions": [] }, { "valid": true, "name": "iterations", - "id": "2218560601_b4f515b70d_748144", + "id": "2118090951_b4f515b70d_514808", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 10, + "totalIterations": 10, "hooks": { "onInit": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } }, "onFinish": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 2 + "elapsedTime": 1 } } }, "time": { - "startTime": "2019-06-28T01:18:56.768Z", - "endTime": "2019-06-28T01:18:56.770Z", - "totalTime": 2, + "startTime": "2019-06-30T00:18:10.130Z", + "endTime": "2019-06-30T00:18:10.131Z", + "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 5, - "totalIterations": 10 + "requisitions": [] }, { "valid": true, "name": "iterations", - "id": "2218560601_b4f515b70d_748144", + "id": "2118090951_b4f515b70d_514808", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 10, + "totalIterations": 10, "hooks": { "onInit": { "valid": true, @@ -6337,27 +7274,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2019-06-28T01:18:56.770Z", - "endTime": "2019-06-28T01:18:56.771Z", + "startTime": "2019-06-30T00:18:10.131Z", + "endTime": "2019-06-30T00:18:10.132Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 6, - "totalIterations": 10 + "requisitions": [] }, { "valid": true, "name": "iterations", - "id": "2218560601_b4f515b70d_748144", + "id": "2118090951_b4f515b70d_514808", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 10, + "totalIterations": 10, "hooks": { "onInit": { "valid": true, @@ -6375,22 +7312,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.771Z", - "endTime": "2019-06-28T01:18:56.772Z", + "startTime": "2019-06-30T00:18:10.132Z", + "endTime": "2019-06-30T00:18:10.133Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 7, - "totalIterations": 10 + "requisitions": [] }, { "valid": true, "name": "iterations", - "id": "2218560601_b4f515b70d_748144", + "id": "2118090951_b4f515b70d_514808", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 10, + "totalIterations": 10, "hooks": { "onInit": { "valid": true, @@ -6403,27 +7340,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2019-06-28T01:18:56.772Z", - "endTime": "2019-06-28T01:18:56.773Z", - "totalTime": 1, + "startTime": "2019-06-30T00:18:10.133Z", + "endTime": "2019-06-30T00:18:10.133Z", + "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 8, - "totalIterations": 10 + "requisitions": [] }, { "valid": true, "name": "iterations", - "id": "2218560601_b4f515b70d_748144", + "id": "2118090951_b4f515b70d_514808", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 10, + "totalIterations": 10, "hooks": { "onInit": { "valid": true, @@ -6436,27 +7373,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2019-06-28T01:18:56.773Z", - "endTime": "2019-06-28T01:18:56.774Z", + "startTime": "2019-06-30T00:18:10.134Z", + "endTime": "2019-06-30T00:18:10.135Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 9, - "totalIterations": 10 + "requisitions": [] }, { "valid": true, "name": "delayed", - "id": "2218560601_ce1438bac6_340099", + "id": "2118090951_ce1438bac6_563430", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -6481,7 +7418,7 @@ { "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 '3004'" } ], "arguments": { @@ -6490,26 +7427,24 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.774Z", - "endTime": "2019-06-28T01:18:59.777Z", - "totalTime": 3003, + "startTime": "2019-06-30T00:18:10.135Z", + "endTime": "2019-06-30T00:18:13.139Z", + "totalTime": 3004, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/skipped.yml", - "id": "2218560601_bb333e1dde_196190", + "id": "2118090951_bb333e1dde_310345", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -6522,24 +7457,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 97 + "elapsedTime": 89 } } }, "time": { - "startTime": "2019-06-28T01:18:56.678Z", - "endTime": "2019-06-28T01:18:56.775Z", - "totalTime": 97, + "startTime": "2019-06-30T00:18:10.046Z", + "endTime": "2019-06-30T00:18:10.135Z", + "totalTime": 89, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_fc4b0751bf_989115", + "id": "2118090951_fc4b0751bf_478387", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 5, + "totalIterations": 5, "hooks": { "onInit": { "valid": true, @@ -6552,27 +7489,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 46 + "elapsedTime": 39 } } }, "time": { - "startTime": "2019-06-28T01:18:56.694Z", - "endTime": "2019-06-28T01:18:56.741Z", - "totalTime": 47, + "startTime": "2019-06-30T00:18:10.065Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 40, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 5 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_fc4b0751bf_989115", + "id": "2118090951_fc4b0751bf_478387", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 5, + "totalIterations": 5, "hooks": { "onInit": { "valid": true, @@ -6585,27 +7522,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 6 + "elapsedTime": 9 } } }, "time": { - "startTime": "2019-06-28T01:18:56.744Z", - "endTime": "2019-06-28T01:18:56.750Z", - "totalTime": 6, + "startTime": "2019-06-30T00:18:10.108Z", + "endTime": "2019-06-30T00:18:10.117Z", + "totalTime": 9, "timeout": 5000 }, - "requisitions": [], - "iteration": 1, - "totalIterations": 5 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_fc4b0751bf_989115", + "id": "2118090951_fc4b0751bf_478387", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 5, + "totalIterations": 5, "hooks": { "onInit": { "valid": true, @@ -6618,27 +7555,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 11 + "elapsedTime": 4 } } }, "time": { - "startTime": "2019-06-28T01:18:56.751Z", - "endTime": "2019-06-28T01:18:56.764Z", - "totalTime": 13, + "startTime": "2019-06-30T00:18:10.120Z", + "endTime": "2019-06-30T00:18:10.124Z", + "totalTime": 4, "timeout": 5000 }, - "requisitions": [], - "iteration": 2, - "totalIterations": 5 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_fc4b0751bf_989115", + "id": "2118090951_fc4b0751bf_478387", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 5, + "totalIterations": 5, "hooks": { "onInit": { "valid": true, @@ -6651,27 +7588,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 2 } } }, "time": { - "startTime": "2019-06-28T01:18:56.766Z", - "endTime": "2019-06-28T01:18:56.767Z", - "totalTime": 1, + "startTime": "2019-06-30T00:18:10.126Z", + "endTime": "2019-06-30T00:18:10.129Z", + "totalTime": 3, "timeout": 5000 }, - "requisitions": [], - "iteration": 3, - "totalIterations": 5 + "requisitions": [] }, { "valid": true, "name": "Requisition #0", - "id": "2218560601_fc4b0751bf_989115", + "id": "2118090951_fc4b0751bf_478387", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 5, + "totalIterations": 5, "hooks": { "onInit": { "valid": true, @@ -6684,27 +7621,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } } }, "time": { - "startTime": "2019-06-28T01:18:56.768Z", - "endTime": "2019-06-28T01:18:56.768Z", - "totalTime": 0, + "startTime": "2019-06-30T00:18:10.129Z", + "endTime": "2019-06-30T00:18:10.130Z", + "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 4, - "totalIterations": 5 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560601_0813922659_288494", + "id": "2118090951_0813922659_146681", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -6728,22 +7665,21 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.769Z", - "endTime": "2019-06-28T01:18:56.770Z", + "startTime": "2019-06-30T00:18:10.130Z", + "endTime": "2019-06-30T00:18:10.131Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #2", - "id": "2218560601_38e558917b_330775", + "id": "2118090951_38e558917b_866823", "level": 2, "subscriptions": [], "publishers": [], + "iterations": "1 === 0", "hooks": { "onInit": { "arguments": {}, @@ -6763,8 +7699,8 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.770Z", - "endTime": "2019-06-28T01:18:56.770Z", + "startTime": "2019-06-30T00:18:10.131Z", + "endTime": "2019-06-30T00:18:10.131Z", "totalTime": 0 }, "requisitions": [] @@ -6772,10 +7708,11 @@ { "valid": true, "name": "Requisition #3", - "id": "2218560601_4aa5c78448_656851", + "id": "2118090951_4aa5c78448_832936", "level": 2, "subscriptions": [], "publishers": [], + "iterations": -1, "hooks": { "onInit": { "arguments": {}, @@ -6795,8 +7732,8 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.770Z", - "endTime": "2019-06-28T01:18:56.770Z", + "startTime": "2019-06-30T00:18:10.132Z", + "endTime": "2019-06-30T00:18:10.132Z", "totalTime": 0 }, "requisitions": [] @@ -6804,10 +7741,11 @@ { "valid": true, "name": "Requisition #4", - "id": "2218560601_6ac450666c_575300", + "id": "2118090951_6ac450666c_22847", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 0, "hooks": { "onInit": { "arguments": {}, @@ -6827,8 +7765,8 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.771Z", - "endTime": "2019-06-28T01:18:56.771Z", + "startTime": "2019-06-30T00:18:10.132Z", + "endTime": "2019-06-30T00:18:10.132Z", "totalTime": 0 }, "requisitions": [] @@ -6836,10 +7774,12 @@ { "valid": true, "name": "Requisition #5", - "id": "2218560601_23f493719b_269781", + "id": "2118090951_23f493719b_365359", "level": 2, "subscriptions": [], "publishers": [], + "iterations": "`1`", + "totalIterations": "1", "hooks": { "onInit": { "valid": true, @@ -6863,22 +7803,22 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.771Z", - "endTime": "2019-06-28T01:18:56.772Z", + "startTime": "2019-06-30T00:18:10.132Z", + "endTime": "2019-06-30T00:18:10.133Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": "1" + "requisitions": [] }, { "valid": true, "name": "Requisition #6", - "id": "2218560601_f9b72d5147_114317", + "id": "2118090951_f9b72d5147_49850", "level": 2, "subscriptions": [], "publishers": [], + "iterations": "1 === 1", + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -6891,27 +7831,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1 + "elapsedTime": 0 } } }, "time": { - "startTime": "2019-06-28T01:18:56.772Z", - "endTime": "2019-06-28T01:18:56.773Z", - "totalTime": 1, + "startTime": "2019-06-30T00:18:10.133Z", + "endTime": "2019-06-30T00:18:10.133Z", + "totalTime": 0, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #7", - "id": "2218560601_b41f5d915d_351575", + "id": "2118090951_b41f5d915d_813749", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -6935,26 +7875,24 @@ } }, "time": { - "startTime": "2019-06-28T01:18:56.773Z", - "endTime": "2019-06-28T01:18:56.774Z", + "startTime": "2019-06-30T00:18:10.134Z", + "endTime": "2019-06-30T00:18:10.135Z", "totalTime": 1, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/ssl.yml", - "id": "2218560601_fbc833de59_633819", + "id": "2118090951_fbc833de59_406380", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -6967,25 +7905,25 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 4307 + "elapsedTime": 4286 } } }, "time": { - "startTime": "2019-06-28T01:18:56.680Z", - "endTime": "2019-06-28T01:19:00.987Z", - "totalTime": 4307, + "startTime": "2019-06-30T00:18:10.048Z", + "endTime": "2019-06-30T00:18:14.334Z", + "totalTime": 4286, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560601_ec6b6289cc_929074", + "id": "2118090951_ec6b6289cc_191475", "level": 2, "subscriptions": [ { - "id": "2218560602_d5884fd0ec_364329", + "id": "2118090952_d5884fd0ec_85068", "name": "Subscription #0", "type": "ssl", "hooks": { @@ -7006,7 +7944,7 @@ } ], "arguments": { - "elapsedTime": 2282 + "elapsedTime": 2264 } }, "onMessageReceived": { @@ -7025,17 +7963,17 @@ "family": "IPv6", "port": 23082 }, - "elapsedTime": 277 + "elapsedTime": 261 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560602_e063362e26_491205", + "id": "2118090951_e063362e26_430574", "name": "Publisher #0", "valid": true, "hooks": { @@ -7048,7 +7986,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 2283 + "elapsedTime": 2264 }, "tests": [ { @@ -7065,9 +8003,9 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 52605 + "port": 52957 }, - "elapsedTime": 4293 + "elapsedTime": 4269 }, "tests": [ { @@ -7080,9 +8018,11 @@ } }, "type": "ssl", - "publishTime": "2019-06-28T01:18:58.977Z" + "publishTime": "2019-06-30T00:18:12.330Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7095,28 +8035,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2282 + "elapsedTime": 2264 } } }, "time": { - "startTime": "2019-06-28T01:18:56.695Z", - "endTime": "2019-06-28T01:18:58.978Z", - "totalTime": 2283, + "startTime": "2019-06-30T00:18:10.066Z", + "endTime": "2019-06-30T00:18:12.330Z", + "totalTime": 2264, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560602_c8e796a6f7_784560", + "id": "2118090952_c8e796a6f7_3941", "level": 2, "subscriptions": [ { - "id": "2218560602_464eaccac3_791648", + "id": "2118090952_464eaccac3_530146", "name": "Subscription #0", "type": "ssl", "hooks": { @@ -7137,7 +8075,7 @@ } ], "arguments": { - "elapsedTime": 2007 + "elapsedTime": 2003 } }, "onMessageReceived": { @@ -7161,12 +8099,12 @@ } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:58.980Z" + "subscriptionTime": "2019-06-30T00:18:12.331Z" } ], "publishers": [ { - "id": "2218560602_26f6887fe6_238931", + "id": "2118090952_26f6887fe6_184899", "name": "Publisher #0", "valid": true, "hooks": { @@ -7179,7 +8117,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 2007 + "elapsedTime": 2003 }, "tests": [ { @@ -7196,9 +8134,9 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 52605 + "port": 52957 }, - "elapsedTime": 2009 + "elapsedTime": 2004 }, "tests": [ { @@ -7211,9 +8149,11 @@ } }, "type": "ssl", - "publishTime": "2019-06-28T01:19:00.986Z" + "publishTime": "2019-06-30T00:18:14.333Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7226,28 +8166,24 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2007 + "elapsedTime": 2003 } } }, "time": { - "startTime": "2019-06-28T01:18:58.979Z", - "endTime": "2019-06-28T01:19:00.986Z", - "totalTime": 2007, + "startTime": "2019-06-30T00:18:12.331Z", + "endTime": "2019-06-30T00:18:14.334Z", + "totalTime": 2003, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/stdin.yml", - "id": "2218560602_ae6c8a1714_699312", + "id": "2118090952_ae6c8a1714_245163", "level": 1, "subscriptions": [ { @@ -7272,7 +8208,7 @@ } ], "arguments": { - "elapsedTime": 191 + "elapsedTime": 182 } }, "onMessageReceived": { @@ -7286,15 +8222,17 @@ ], "arguments": { "message": "enqueuer standard-input payload", - "elapsedTime": 190 + "elapsedTime": 181 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.726Z" + "subscriptionTime": "2019-06-30T00:18:10.096Z" } ], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7307,27 +8245,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 191 + "elapsedTime": 182 } } }, "time": { - "startTime": "2019-06-28T01:18:56.680Z", - "endTime": "2019-06-28T01:18:56.871Z", - "totalTime": 191, + "startTime": "2019-06-30T00:18:10.048Z", + "endTime": "2019-06-30T00:18:10.231Z", + "totalTime": 183, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/store.yml", - "id": "2218560602_7b9aa96592_490144", + "id": "2118090952_7b9aa96592_971877", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7340,24 +8278,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 87 + "elapsedTime": 80 } } }, "time": { - "startTime": "2019-06-28T01:18:56.681Z", - "endTime": "2019-06-28T01:18:56.768Z", - "totalTime": 87, + "startTime": "2019-06-30T00:18:10.049Z", + "endTime": "2019-06-30T00:18:10.129Z", + "totalTime": 80, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560602_478dfcaed5_781437", + "id": "2118090952_478dfcaed5_53909", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7370,27 +8310,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 45 + "elapsedTime": 38 } } }, "time": { - "startTime": "2019-06-28T01:18:56.695Z", - "endTime": "2019-06-28T01:18:56.741Z", - "totalTime": 46, + "startTime": "2019-06-30T00:18:10.066Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 39, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560602_c96621cca9_562924", + "id": "2118090952_c96621cca9_303154", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7414,27 +8354,27 @@ } ], "arguments": { - "elapsedTime": 3 + "elapsedTime": 8 } } }, "time": { - "startTime": "2019-06-28T01:18:56.747Z", - "endTime": "2019-06-28T01:18:56.750Z", - "totalTime": 3, + "startTime": "2019-06-30T00:18:10.110Z", + "endTime": "2019-06-30T00:18:10.118Z", + "totalTime": 8, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #2", - "id": "2218560602_05a830b0a8_869052", + "id": "2118090952_05a830b0a8_369443", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7453,62 +8393,60 @@ } ], "arguments": { - "elapsedTime": 5 + "elapsedTime": 2 } } }, "time": { - "startTime": "2019-06-28T01:18:56.761Z", - "endTime": "2019-06-28T01:18:56.766Z", - "totalTime": 5, + "startTime": "2019-06-30T00:18:10.124Z", + "endTime": "2019-06-30T00:18:10.126Z", + "totalTime": 2, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/tcp.yml", - "id": "2218560602_bf35f3e127_866487", + "id": "2118090952_bf35f3e127_624919", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 0 + "elapsedTime": 1 } }, "onFinish": { "valid": true, "tests": [], "arguments": { - "elapsedTime": 3023 + "elapsedTime": 3009 } } }, "time": { - "startTime": "2019-06-28T01:18:56.683Z", - "endTime": "2019-06-28T01:18:59.707Z", - "totalTime": 3024, + "startTime": "2019-06-30T00:18:10.051Z", + "endTime": "2019-06-30T00:18:13.060Z", + "totalTime": 3009, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560602_595f6dfba1_872721", + "id": "2118090952_595f6dfba1_368325", "level": 2, "subscriptions": [ { - "id": "2218560602_4e5617f719_237236", + "id": "2118090952_4e5617f719_686180", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -7529,7 +8467,7 @@ } ], "arguments": { - "elapsedTime": 1198 + "elapsedTime": 1180 } }, "onMessageReceived": { @@ -7553,17 +8491,17 @@ "family": "IPv6", "port": 23069 }, - "elapsedTime": 207 + "elapsedTime": 186 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560602_3b7a9e3645_509624", + "id": "2118090952_3b7a9e3645_687519", "name": "Publisher #0", "valid": true, "hooks": { @@ -7576,7 +8514,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 1198 + "elapsedTime": 1181 }, "tests": [ { @@ -7593,9 +8531,9 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 52604 + "port": 52958 }, - "elapsedTime": 1201 + "elapsedTime": 1183 }, "tests": [ { @@ -7608,9 +8546,11 @@ } }, "type": "tcp", - "publishTime": "2019-06-28T01:18:57.894Z" + "publishTime": "2019-06-30T00:18:11.247Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7623,28 +8563,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1198 + "elapsedTime": 1181 } } }, "time": { - "startTime": "2019-06-28T01:18:56.696Z", - "endTime": "2019-06-28T01:18:57.894Z", - "totalTime": 1198, + "startTime": "2019-06-30T00:18:10.067Z", + "endTime": "2019-06-30T00:18:11.248Z", + "totalTime": 1181, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560602_3f1b829a68_65867", + "id": "2118090952_3f1b829a68_790991", "level": 2, "subscriptions": [ { - "id": "2218560602_944c1488d1_237756", + "id": "2118090952_944c1488d1_757849", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -7689,12 +8627,12 @@ } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:57.896Z" + "subscriptionTime": "2019-06-30T00:18:11.249Z" } ], "publishers": [ { - "id": "2218560602_369e07d49e_231923", + "id": "2118090952_369e07d49e_434709", "name": "Publisher #0", "valid": true, "hooks": { @@ -7724,9 +8662,9 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 52620 + "port": 52977 }, - "elapsedTime": 1811 + "elapsedTime": 1812 }, "tests": [ { @@ -7739,9 +8677,11 @@ } }, "type": "tcp", - "publishTime": "2019-06-28T01:18:58.701Z" + "publishTime": "2019-06-30T00:18:12.054Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7754,28 +8694,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 807 + "elapsedTime": 806 } } }, "time": { - "startTime": "2019-06-28T01:18:57.895Z", - "endTime": "2019-06-28T01:18:58.702Z", - "totalTime": 807, + "startTime": "2019-06-30T00:18:11.249Z", + "endTime": "2019-06-30T00:18:12.055Z", + "totalTime": 806, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #2", - "id": "2218560602_7b3d80f664_648800", + "id": "2118090952_7b3d80f664_311060", "level": 2, "subscriptions": [ { - "id": "2218560603_a5c6b9dc6a_27977", + "id": "2118090952_a5c6b9dc6a_920520", "name": "Subscription #0", "type": "tcp", "hooks": { @@ -7796,7 +8734,7 @@ } ], "arguments": { - "elapsedTime": 1002 + "elapsedTime": 1004 } }, "onMessageReceived": { @@ -7820,12 +8758,12 @@ } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:58.704Z" + "subscriptionTime": "2019-06-30T00:18:12.057Z" } ], "publishers": [ { - "id": "2218560602_c04ec1e8aa_149025", + "id": "2118090952_c04ec1e8aa_803719", "name": "Publisher #0", "valid": true, "hooks": { @@ -7838,7 +8776,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 1002 + "elapsedTime": 1004 }, "tests": [ { @@ -7855,9 +8793,9 @@ "stream": { "address": "127.0.0.1", "family": "IPv4", - "port": 52620 + "port": 52977 }, - "elapsedTime": 1004 + "elapsedTime": 1005 }, "tests": [ { @@ -7870,9 +8808,11 @@ } }, "type": "tcp", - "publishTime": "2019-06-28T01:18:59.706Z" + "publishTime": "2019-06-30T00:18:13.060Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7885,31 +8825,29 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 1002 + "elapsedTime": 1004 } } }, "time": { - "startTime": "2019-06-28T01:18:58.704Z", - "endTime": "2019-06-28T01:18:59.706Z", - "totalTime": 1002, + "startTime": "2019-06-30T00:18:12.056Z", + "endTime": "2019-06-30T00:18:13.060Z", + "totalTime": 1004, "timeout": 3000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/udp.yml", - "id": "2218560603_f69fa0cdb2_777371", + "id": "2118090953_f69fa0cdb2_634225", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -7922,25 +8860,25 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 203 + "elapsedTime": 188 } } }, "time": { - "startTime": "2019-06-28T01:18:56.684Z", - "endTime": "2019-06-28T01:18:56.887Z", - "totalTime": 203, + "startTime": "2019-06-30T00:18:10.052Z", + "endTime": "2019-06-30T00:18:10.240Z", + "totalTime": 188, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560603_ac96cfadf9_330494", + "id": "2118090953_ac96cfadf9_568473", "level": 2, "subscriptions": [ { - "id": "2218560603_6e62597dc8_930413", + "id": "2118090953_6e62597dc8_386536", "name": "subscription description", "type": "udp", "hooks": { @@ -7961,7 +8899,7 @@ } ], "arguments": { - "elapsedTime": 187 + "elapsedTime": 170 } }, "onMessageReceived": { @@ -7989,20 +8927,20 @@ "remoteInfo": { "address": "127.0.0.1", "family": "IPv4", - "port": 55618, + "port": 49578, "size": 2 }, - "elapsedTime": 181 + "elapsedTime": 169 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.732Z" + "subscriptionTime": "2019-06-30T00:18:10.101Z" } ], "publishers": [ { - "id": "2218560603_f1c5db9ba9_889997", + "id": "2118090953_f1c5db9ba9_378345", "name": "publisher description", "valid": true, "hooks": { @@ -8015,7 +8953,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 188 + "elapsedTime": 170 }, "tests": [ { @@ -8028,9 +8966,11 @@ } }, "type": "udp", - "publishTime": "2019-06-28T01:18:56.870Z" + "publishTime": "2019-06-30T00:18:10.229Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8043,31 +8983,29 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 188 + "elapsedTime": 171 } } }, "time": { - "startTime": "2019-06-28T01:18:56.697Z", - "endTime": "2019-06-28T01:18:56.887Z", - "totalTime": 190, + "startTime": "2019-06-30T00:18:10.067Z", + "endTime": "2019-06-30T00:18:10.239Z", + "totalTime": 172, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/uds.yml", - "id": "2218560603_c449648554_961747", + "id": "2118090953_c449648554_263813", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8080,25 +9018,25 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 5170 + "elapsedTime": 5171 } } }, "time": { - "startTime": "2019-06-28T01:18:56.687Z", - "endTime": "2019-06-28T01:19:01.857Z", - "totalTime": 5170, + "startTime": "2019-06-30T00:18:10.055Z", + "endTime": "2019-06-30T00:18:15.226Z", + "totalTime": 5171, "timeout": 7000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560603_7acc07c435_539840", + "id": "2118090953_7acc07c435_337016", "level": 2, "subscriptions": [ { - "id": "2218560603_5e03c0017a_779748", + "id": "2118090953_5e03c0017a_196317", "name": "Subscription #0", "type": "uds", "hooks": { @@ -8119,7 +9057,7 @@ } ], "arguments": { - "elapsedTime": 2144 + "elapsedTime": 2139 } }, "onMessageReceived": { @@ -8140,17 +9078,17 @@ "payload": "enqueuer", "stream": {}, "path": "/tmp/unix.sock", - "elapsedTime": 195 + "elapsedTime": 177 } } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:56.807Z" + "subscriptionTime": "2019-06-30T00:18:10.160Z" } ], "publishers": [ { - "id": "2218560603_b14ca3892b_931839", + "id": "2118090953_b14ca3892b_478598", "name": "Publisher #0", "valid": true, "hooks": { @@ -8163,7 +9101,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 2144 + "elapsedTime": 2139 }, "tests": [ { @@ -8178,7 +9116,7 @@ "arguments": { "payload": "responsePayload", "stream": {}, - "elapsedTime": 2147 + "elapsedTime": 2142 }, "tests": [ { @@ -8191,9 +9129,11 @@ } }, "type": "uds", - "publishTime": "2019-06-28T01:18:58.841Z" + "publishTime": "2019-06-30T00:18:12.207Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8206,28 +9146,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2144 + "elapsedTime": 2139 } } }, "time": { - "startTime": "2019-06-28T01:18:56.698Z", - "endTime": "2019-06-28T01:18:58.842Z", - "totalTime": 2144, + "startTime": "2019-06-30T00:18:10.069Z", + "endTime": "2019-06-30T00:18:12.208Z", + "totalTime": 2139, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560603_591e70c91e_276079", + "id": "2118090953_591e70c91e_787935", "level": 2, "subscriptions": [ { - "id": "2218560603_81ccf3e7f8_726299", + "id": "2118090953_81ccf3e7f8_842185", "name": "Subscription #0", "type": "uds", "hooks": { @@ -8248,7 +9186,7 @@ } ], "arguments": { - "elapsedTime": 1008 + "elapsedTime": 1007 } }, "onMessageReceived": { @@ -8269,12 +9207,12 @@ } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:58.844Z" + "subscriptionTime": "2019-06-30T00:18:12.210Z" } ], "publishers": [ { - "id": "2218560603_297aae1eb3_907935", + "id": "2118090953_297aae1eb3_301595", "name": "Publisher #0", "valid": true, "hooks": { @@ -8293,7 +9231,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 1008 + "elapsedTime": 1007 }, "tests": [ { @@ -8306,9 +9244,11 @@ } }, "type": "uds", - "publishTime": "2019-06-28T01:18:59.850Z" + "publishTime": "2019-06-30T00:18:13.215Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8326,23 +9266,21 @@ } }, "time": { - "startTime": "2019-06-28T01:18:58.843Z", - "endTime": "2019-06-28T01:18:59.851Z", + "startTime": "2019-06-30T00:18:12.209Z", + "endTime": "2019-06-30T00:18:13.217Z", "totalTime": 1008, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #2", - "id": "2218560603_3321951a43_201069", + "id": "2118090953_3321951a43_166779", "level": 2, "subscriptions": [ { - "id": "2218560603_d308bbf817_453126", + "id": "2118090953_d308bbf817_224642", "name": "Subscription #0", "type": "uds", "hooks": { @@ -8363,7 +9301,7 @@ } ], "arguments": { - "elapsedTime": 2004 + "elapsedTime": 2008 } }, "onMessageReceived": { @@ -8383,12 +9321,12 @@ } }, "valid": true, - "subscriptionTime": "2019-06-28T01:18:59.853Z" + "subscriptionTime": "2019-06-30T00:18:13.219Z" } ], "publishers": [ { - "id": "2218560603_b6920facd0_4230", + "id": "2118090953_b6920facd0_666984", "name": "Publisher #0", "valid": true, "hooks": { @@ -8401,7 +9339,7 @@ }, "onFinish": { "arguments": { - "elapsedTime": 2004 + "elapsedTime": 2008 }, "tests": [ { @@ -8416,7 +9354,7 @@ "arguments": { "payload": "I am still bidirectional", "stream": {}, - "elapsedTime": 2002 + "elapsedTime": 2006 }, "tests": [ { @@ -8429,9 +9367,11 @@ } }, "type": "uds", - "publishTime": "2019-06-28T01:19:01.856Z" + "publishTime": "2019-06-30T00:18:15.225Z" } ], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8444,31 +9384,29 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2004 + "elapsedTime": 2008 } } }, "time": { - "startTime": "2019-06-28T01:18:59.853Z", - "endTime": "2019-06-28T01:19:01.857Z", - "totalTime": 2004, + "startTime": "2019-06-30T00:18:13.218Z", + "endTime": "2019-06-30T00:18:15.226Z", + "totalTime": 2008, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/variables.yml", - "id": "2218560603_3a6eb18d6d_688797", + "id": "2118090953_3a6eb18d6d_668868", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8481,24 +9419,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 77 + "elapsedTime": 70 } } }, "time": { - "startTime": "2019-06-28T01:18:56.687Z", - "endTime": "2019-06-28T01:18:56.765Z", - "totalTime": 78, + "startTime": "2019-06-30T00:18:10.055Z", + "endTime": "2019-06-30T00:18:10.125Z", + "totalTime": 70, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "Requisition #0", - "id": "2218560603_bdf0ac0681_414673", + "id": "2118090953_bdf0ac0681_9674", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8522,27 +9462,27 @@ } ], "arguments": { - "elapsedTime": 42 + "elapsedTime": 35 } } }, "time": { - "startTime": "2019-06-28T01:18:56.698Z", - "endTime": "2019-06-28T01:18:56.741Z", - "totalTime": 43, + "startTime": "2019-06-30T00:18:10.069Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 36, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "Requisition #1", - "id": "2218560603_5153bc0c75_432747", + "id": "2118090953_5153bc0c75_148712", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8571,31 +9511,29 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 3 + "elapsedTime": 7 } } }, "time": { - "startTime": "2019-06-28T01:18:56.747Z", - "endTime": "2019-06-28T01:18:56.750Z", - "totalTime": 3, + "startTime": "2019-06-30T00:18:10.111Z", + "endTime": "2019-06-30T00:18:10.118Z", + "totalTime": 7, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] }, { "valid": true, "name": "examples/number.json", - "id": "2218560603_1925b227c5_23139", + "id": "2118090954_1925b227c5_327567", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8619,27 +9557,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 50 + "elapsedTime": 48 } } }, "time": { - "startTime": "2019-06-28T01:18:56.688Z", - "endTime": "2019-06-28T01:18:56.740Z", - "totalTime": 52, + "startTime": "2019-06-30T00:18:10.056Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 49, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "examples/requisition-navigation.yaml", - "id": "2218560603_e848774ac1_85434", + "id": "2118090954_e848774ac1_857475", "level": 1, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8652,24 +9590,26 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 76 + "elapsedTime": 69 } } }, "time": { - "startTime": "2019-06-28T01:18:56.688Z", - "endTime": "2019-06-28T01:18:56.765Z", - "totalTime": 77, + "startTime": "2019-06-30T00:18:10.056Z", + "endTime": "2019-06-30T00:18:10.125Z", + "totalTime": 69, "timeout": 5000 }, "requisitions": [ { "valid": true, "name": "first", - "id": "2218560604_542da8f206_4318", + "id": "2118090954_542da8f206_50157", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8688,27 +9628,27 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 41 + "elapsedTime": 35 } } }, "time": { - "startTime": "2019-06-28T01:18:56.699Z", - "endTime": "2019-06-28T01:18:56.741Z", - "totalTime": 42, + "startTime": "2019-06-30T00:18:10.070Z", + "endTime": "2019-06-30T00:18:10.105Z", + "totalTime": 35, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] }, { "valid": true, "name": "second", - "id": "2218560604_d7c80e2b4e_172222", + "id": "2118090954_d7c80e2b4e_591580", "level": 2, "subscriptions": [], "publishers": [], + "iterations": 1, + "totalIterations": 1, "hooks": { "onInit": { "valid": true, @@ -8727,25 +9667,19 @@ "valid": true, "tests": [], "arguments": { - "elapsedTime": 2 + "elapsedTime": 7 } } }, "time": { - "startTime": "2019-06-28T01:18:56.748Z", - "endTime": "2019-06-28T01:18:56.750Z", - "totalTime": 2, + "startTime": "2019-06-30T00:18:10.111Z", + "endTime": "2019-06-30T00:18:10.118Z", + "totalTime": 7, "timeout": 5000 }, - "requisitions": [], - "iteration": 0, - "totalIterations": 1 + "requisitions": [] } - ], - "iteration": 0, - "totalIterations": 1 + ] } - ], - "iteration": 0, - "totalIterations": 1 + ] } \ No newline at end of file diff --git a/output/examples.yml b/output/examples.yml index 6ecdc291..8d827614 100644 --- a/output/examples.yml +++ b/output/examples.yml @@ -1,9 +1,11 @@ valid: true name: enqueuer -id: 2218560594_a68c5a50e8_250826 +id: 2118090944_9a9ee5eb1e_84745 level: 0 subscriptions: [] publishers: [] +iterations: 1 +totalIterations: 1 hooks: onInit: valid: true @@ -14,22 +16,24 @@ hooks: valid: true tests: [] arguments: - elapsedTime: 5220 + elapsedTime: 5229 onParsed: valid: true tests: [] time: - startTime: '2019-06-28T01:18:56.638Z' - endTime: '2019-06-28T01:19:01.858Z' - totalTime: 5220 + startTime: '2019-06-30T00:18:09.998Z' + endTime: '2019-06-30T00:18:15.227Z' + totalTime: 5229 requisitions: - valid: true name: examples/assertions.yml - id: 2218560594_2ca609e341_27608 + id: 2118090944_2ca609e341_289741 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -111,28 +115,26 @@ requisitions: valid: true description: 'Expected ''1'' not to be equal to ''0''. Received ''1''' arguments: - elapsedTime: 0 + elapsedTime: 5 onFinish: valid: true tests: [] arguments: - elapsedTime: 94 + elapsedTime: 103 time: - startTime: '2019-06-28T01:18:56.641Z' - endTime: '2019-06-28T01:18:56.739Z' - totalTime: 98 + startTime: '2019-06-30T00:18:10.001Z' + endTime: '2019-06-30T00:18:10.104Z' + totalTime: 103 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/avoid.yml - id: 2218560595_852d538668_802138 + id: 2118090944_852d538668_730685 level: 1 subscriptions: - - id: 2218560595_2e0cc1fd7c_942506 + id: 2118090944_2e0cc1fd7c_565800 name: 'Subscription #0' type: tcp hooks: @@ -149,11 +151,11 @@ requisitions: name: 'Subscription avoided' description: 'Avoidable subscription has not received any message' arguments: - elapsedTime: 3058 + elapsedTime: 3061 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' - - id: 2218560595_8444956d6a_136633 + id: 2118090944_8444956d6a_335987 name: 'Subscription #1' type: HTTP hooks: @@ -170,10 +172,12 @@ requisitions: name: 'Subscription avoided' description: 'Avoidable subscription has not received any message' arguments: - elapsedTime: 3057 + elapsedTime: 3060 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -184,22 +188,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 3058 + elapsedTime: 3061 time: - startTime: '2019-06-28T01:18:56.644Z' - endTime: '2019-06-28T01:18:59.702Z' - totalTime: 3058 + startTime: '2019-06-30T00:18:10.010Z' + endTime: '2019-06-30T00:18:13.071Z' + totalTime: 3061 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/crypto-require.yml - id: 2218560595_1d33e31a27_972608 + id: 2118090945_1d33e31a27_705197 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -214,23 +218,21 @@ requisitions: valid: true description: 'Expected ''requisition.toEncrypt'' to be equal to ''7aad9a1a6a91e0f18c417cb3aa0e0217b283778e636c580509e494eeec1472e0''. Received ''7aad9a1a6a91e0f18c417cb3aa0e0217b283778e636c580509e494eeec1472e0''' arguments: - elapsedTime: 90 + elapsedTime: 92 time: - startTime: '2019-06-28T01:18:56.645Z' - endTime: '2019-06-28T01:18:56.739Z' - totalTime: 94 + startTime: '2019-06-30T00:18:10.012Z' + endTime: '2019-06-30T00:18:10.104Z' + totalTime: 92 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/custom.yml - id: 2218560595_6da5232086_744821 + id: 2118090945_6da5232086_578625 level: 1 subscriptions: - - id: 2218560595_f6315a7fbc_288110 + id: 2118090945_f6315a7fbc_428816 name: 'subscription description' type: custom hooks: @@ -247,7 +249,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 242 + elapsedTime: 224 onMessageReceived: valid: true tests: @@ -268,25 +270,25 @@ requisitions: remoteInfo: address: 127.0.0.1 family: IPv4 - port: 58940 + port: 59594 size: 2 - elapsedTime: 241 + elapsedTime: 223 valid: true - subscriptionTime: '2019-06-28T01:18:56.727Z' + subscriptionTime: '2019-06-30T00:18:10.097Z' publishers: - - id: 2218560595_816cec1424_331237 + id: 2118090945_816cec1424_282450 name: 'publisher description' valid: true hooks: onInit: arguments: - elapsedTime: 0 + elapsedTime: 1 tests: [] valid: true onFinish: arguments: - elapsedTime: 241 + elapsedTime: 223 tests: - name: Published @@ -294,7 +296,9 @@ requisitions: description: 'Published successfully' valid: true type: custom - publishTime: '2019-06-28T01:18:56.870Z' + publishTime: '2019-06-30T00:18:10.229Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -305,22 +309,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 243 + elapsedTime: 224 time: - startTime: '2019-06-28T01:18:56.646Z' - endTime: '2019-06-28T01:18:56.889Z' - totalTime: 243 + startTime: '2019-06-30T00:18:10.012Z' + endTime: '2019-06-30T00:18:10.236Z' + totalTime: 224 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/file-placeholder.yml - id: 2218560595_a5f62352f4_834437 + id: 2118090945_a5f62352f4_975734 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -331,20 +335,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 115 + elapsedTime: 110 time: - startTime: '2019-06-28T01:18:56.649Z' - endTime: '2019-06-28T01:18:56.765Z' - totalTime: 116 + startTime: '2019-06-30T00:18:10.015Z' + endTime: '2019-06-30T00:18:10.125Z' + totalTime: 110 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560595_374c18eaf8_228711 + id: 2118090945_374c18eaf8_519490 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -371,22 +377,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 50 + elapsedTime: 47 time: - startTime: '2019-06-28T01:18:56.689Z' - endTime: '2019-06-28T01:18:56.741Z' - totalTime: 52 + startTime: '2019-06-30T00:18:10.057Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 48 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560595_8067e3ed86_680109 + id: 2118090945_8067e3ed86_440722 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -401,25 +407,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 5 + elapsedTime: 9 time: - startTime: '2019-06-28T01:18:56.745Z' - endTime: '2019-06-28T01:18:56.750Z' - totalTime: 5 + startTime: '2019-06-30T00:18:10.108Z' + endTime: '2019-06-30T00:18:10.118Z' + totalTime: 10 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/file.yml - id: 2218560595_d7a8d31f32_397584 + id: 2118090945_d7a8d31f32_508959 level: 1 subscriptions: - - id: 2218560595_3dd85e61fc_809049 + id: 2118090945_3dd85e61fc_838954 name: 'subscription description' type: file-system-watcher hooks: @@ -436,18 +438,18 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 184 + elapsedTime: 179 onMessageReceived: valid: true tests: - name: 'Some time has passed' valid: true - description: 'Expected ''now'' to be greater than or equal to ''1561684736651''. Received ''1561684736832''' + description: 'Expected ''now'' to be greater than or equal to ''1561853890016''. Received ''1561853890193''' - name: Filename valid: true - description: 'Expecting ''temp/fileTest2218560733_58da0ca63c_182777.file'' (name) to contain ''temp/''' + description: 'Expecting ''temp/fileTest2118100102_4a14c58a8d_61871.file'' (name) to contain ''temp/''' - name: Content valid: true @@ -465,17 +467,17 @@ requisitions: valid: true description: 'Expected ''size'' not to be greater than ''0''. Received ''13''' arguments: - content: '1561684736651' - name: temp/fileTest2218560733_58da0ca63c_182777.file + content: '1561853890016' + name: temp/fileTest2118100102_4a14c58a8d_61871.file size: 13 - modified: '2019-06-28T01:18:56.734Z' - created: '2019-06-28T01:18:56.734Z' - elapsedTime: 182 + modified: '2019-06-30T00:18:10.103Z' + created: '2019-06-30T00:18:10.103Z' + elapsedTime: 177 valid: true - subscriptionTime: '2019-06-28T01:18:56.725Z' + subscriptionTime: '2019-06-30T00:18:10.095Z' publishers: - - id: 2218560595_4b5a457015_442007 + id: 2118090945_4b5a457015_721303 name: 'publisher description' valid: true hooks: @@ -486,7 +488,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 183 + elapsedTime: 180 tests: - name: Published @@ -494,7 +496,9 @@ requisitions: description: 'Published successfully' valid: true type: file - publishTime: '2019-06-28T01:18:56.739Z' + publishTime: '2019-06-30T00:18:10.104Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -505,23 +509,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 184 + elapsedTime: 180 time: - startTime: '2019-06-28T01:18:56.650Z' - endTime: '2019-06-28T01:18:56.835Z' - totalTime: 185 + startTime: '2019-06-30T00:18:10.016Z' + endTime: '2019-06-30T00:18:10.196Z' + totalTime: 180 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/hooks.yml - id: 2218560595_75b8872357_277585 + id: 2118090946_75b8872357_956220 level: 1 subscriptions: - - id: 2218560595_fbe2d8d804_165776 + id: 2118090946_fbe2d8d804_843169 name: 'Subscription #0' type: tcp hooks: @@ -550,7 +552,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 2243 + elapsedTime: 2228 onMessageReceived: valid: true tests: @@ -572,12 +574,12 @@ requisitions: address: '::ffff:127.0.0.1' family: IPv6 port: 23080 - elapsedTime: 249 + elapsedTime: 232 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560595_ca0fe1e8c5_227132 + id: 2118090946_ca0fe1e8c5_699561 name: 'Publisher #0' valid: true hooks: @@ -608,7 +610,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 2242 + elapsedTime: 2228 tests: - name: Published @@ -621,8 +623,8 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 52603 - elapsedTime: 2243 + port: 52956 + elapsedTime: 2228 tests: - name: 'Publisher exists onMessageReceived' @@ -642,7 +644,9 @@ requisitions: description: 'Expecting ''requisition::onInit-> subscription::onInit-> publisher::onInit-> publisher::onMessageReceived-> publisher::onMessageReceived'' (store.sequence) to contain ''publisher::onInit''' valid: true type: tcp - publishTime: '2019-06-28T01:18:58.896Z' + publishTime: '2019-06-30T00:18:12.247Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -661,23 +665,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2243 + elapsedTime: 2229 time: - startTime: '2019-06-28T01:18:56.653Z' - endTime: '2019-06-28T01:18:58.896Z' - totalTime: 2243 + startTime: '2019-06-30T00:18:10.019Z' + endTime: '2019-06-30T00:18:12.248Z' + totalTime: 2229 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/http-auth-basic.yml - id: 2218560596_6420f75659_120758 + id: 2118090946_6420f75659_70584 level: 1 subscriptions: - - id: 2218560596_94e20b540b_343338 + id: 2118090946_94e20b540b_774503 name: 'Subscription #0' type: http hooks: @@ -694,7 +696,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 313 + elapsedTime: 280 onMessageReceived: valid: true tests: @@ -713,12 +715,12 @@ requisitions: query: {} url: /basic body: 'basic auth' - elapsedTime: 285 + elapsedTime: 238 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560596_f4551bd7af_136949 + id: 2118090946_f4551bd7af_295932 name: 'Publisher #0' valid: true hooks: @@ -729,7 +731,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 313 + elapsedTime: 280 tests: - name: Published @@ -747,7 +749,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '19' etag: 'W/"13-nGN7LEwCUKXpQoLxNqKZXSglYNc"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -781,7 +783,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '19' etag: 'W/"13-nGN7LEwCUKXpQoLxNqKZXSglYNc"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -809,7 +811,9 @@ requisitions: description: 'Expected ''body'' to be equal to ''basic auth response''. Received ''basic auth response''' valid: true type: http - publishTime: '2019-06-28T01:18:56.968Z' + publishTime: '2019-06-30T00:18:10.300Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -820,23 +824,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 313 + elapsedTime: 280 time: - startTime: '2019-06-28T01:18:56.655Z' - endTime: '2019-06-28T01:18:56.968Z' - totalTime: 313 + startTime: '2019-06-30T00:18:10.021Z' + endTime: '2019-06-30T00:18:10.301Z' + totalTime: 280 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/http-auth-bearer.yml - id: 2218560596_5e821857a3_463101 + id: 2118090946_5e821857a3_595126 level: 1 subscriptions: - - id: 2218560596_dab3c9a05e_255315 + id: 2118090946_dab3c9a05e_660899 name: 'Subscription #0' type: http hooks: @@ -853,7 +855,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 307 + elapsedTime: 281 onMessageReceived: valid: true tests: @@ -872,12 +874,12 @@ requisitions: query: {} url: /bearer body: Rech - elapsedTime: 278 + elapsedTime: 246 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560596_388c1593e3_74476 + id: 2118090946_388c1593e3_543360 name: 'Publisher #0' valid: true hooks: @@ -888,7 +890,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 307 + elapsedTime: 281 tests: - name: Published @@ -906,7 +908,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '15' etag: 'W/"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -940,7 +942,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '15' etag: 'W/"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -968,7 +970,9 @@ requisitions: description: 'Expected ''body'' to be equal to ''responsePayload''. Received ''responsePayload''' valid: true type: http - publishTime: '2019-06-28T01:18:56.964Z' + publishTime: '2019-06-30T00:18:10.303Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -979,23 +983,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 307 + elapsedTime: 281 time: - startTime: '2019-06-28T01:18:56.657Z' - endTime: '2019-06-28T01:18:56.964Z' - totalTime: 307 + startTime: '2019-06-30T00:18:10.022Z' + endTime: '2019-06-30T00:18:10.303Z' + totalTime: 281 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/http-auth-digest.yml - id: 2218560596_784968c016_823089 + id: 2118090946_784968c016_574335 level: 1 subscriptions: - - id: 2218560596_b8f024a270_166879 + id: 2118090946_b8f024a270_105471 name: 'Subscription #0' type: http hooks: @@ -1012,7 +1014,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 304 + elapsedTime: 280 onMessageReceived: valid: true tests: @@ -1031,12 +1033,12 @@ requisitions: query: {} url: /digest body: Rech - elapsedTime: 272 + elapsedTime: 251 valid: true - subscriptionTime: '2019-06-28T01:18:56.732Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560596_b553ccdd3b_766369 + id: 2118090946_b553ccdd3b_652193 name: 'Publisher #0' valid: true hooks: @@ -1047,7 +1049,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 304 + elapsedTime: 280 tests: - name: Published @@ -1065,7 +1067,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '15' etag: 'W/"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -1099,7 +1101,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '15' etag: 'W/"f-V9sBEzo+y6k6sqGXsr1Ql2B0tAk"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -1127,7 +1129,9 @@ requisitions: description: 'Expected ''body'' to be equal to ''responsePayload''. Received ''responsePayload''' valid: true type: http - publishTime: '2019-06-28T01:18:56.962Z' + publishTime: '2019-06-30T00:18:10.304Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -1138,22 +1142,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 304 + elapsedTime: 280 time: - startTime: '2019-06-28T01:18:56.658Z' - endTime: '2019-06-28T01:18:56.962Z' - totalTime: 304 + startTime: '2019-06-30T00:18:10.024Z' + endTime: '2019-06-30T00:18:10.304Z' + totalTime: 280 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/http-more-examples.yml - id: 2218560596_90ccf51c7e_160459 + id: 2118090947_90ccf51c7e_375619 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -1164,21 +1168,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2379 + elapsedTime: 2394 time: - startTime: '2019-06-28T01:18:56.662Z' - endTime: '2019-06-28T01:18:59.041Z' - totalTime: 2379 + startTime: '2019-06-30T00:18:10.030Z' + endTime: '2019-06-30T00:18:12.424Z' + totalTime: 2394 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560597_043834905b_507216 + id: 2118090947_043834905b_145459 level: 2 subscriptions: - - id: 2218560597_e916596275_412733 + id: 2118090947_e916596275_906590 name: 'Subscription #0' type: http hooks: @@ -1195,7 +1199,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 334 + elapsedTime: 337 onMessageReceived: valid: true tests: @@ -1228,11 +1232,11 @@ requisitions: query: '2345' url: '/enqueuer/idStuff?query=2345' body: '{"enqueuer":"virgs"}' - elapsedTime: 246 + elapsedTime: 226 valid: true - subscriptionTime: '2019-06-28T01:18:56.732Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' - - id: 2218560597_97c8fb993f_548220 + id: 2118090947_97c8fb993f_498757 name: 'same port' type: http hooks: @@ -1249,7 +1253,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 333 + elapsedTime: 337 onMessageReceived: valid: true tests: [] @@ -1262,11 +1266,11 @@ requisitions: query: {} url: /samePort body: virgs - elapsedTime: 246 + elapsedTime: 227 valid: true - subscriptionTime: '2019-06-28T01:18:56.732Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' - - id: 2218560597_42d8fc1293_17073 + id: 2118090947_42d8fc1293_386284 name: 'yet another, but avoidable' type: http hooks: @@ -1283,12 +1287,12 @@ requisitions: name: 'Subscription avoided' description: 'Avoidable subscription has not received any message' arguments: - elapsedTime: 333 + elapsedTime: 338 valid: true - subscriptionTime: '2019-06-28T01:18:56.732Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560597_acd0fb7e94_492226 + id: 2118090947_acd0fb7e94_423874 name: 'Publisher #0' valid: true hooks: @@ -1299,7 +1303,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 333 + elapsedTime: 338 tests: - name: Published @@ -1318,7 +1322,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '27' etag: 'W/"1b-e5esTWfu+XftewZ5g2Tclr7ClTo"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -1365,7 +1369,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '27' etag: 'W/"1b-e5esTWfu+XftewZ5g2Tclr7ClTo"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -1389,9 +1393,9 @@ requisitions: tests: [] valid: true type: http - publishTime: '2019-06-28T01:18:56.965Z' + publishTime: '2019-06-30T00:18:10.315Z' - - id: 2218560597_7e4a7822a0_370910 + id: 2118090947_7e4a7822a0_107629 name: 'Publisher #1' valid: true hooks: @@ -1402,7 +1406,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 333 + elapsedTime: 338 tests: - name: Published @@ -1420,7 +1424,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-W/H9kn37hnlJai5s8Ay+UMHIcUU"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -1456,7 +1460,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-W/H9kn37hnlJai5s8Ay+UMHIcUU"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -1478,7 +1482,9 @@ requisitions: tests: [] valid: true type: http - publishTime: '2019-06-28T01:18:56.965Z' + publishTime: '2019-06-30T00:18:10.318Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -1489,23 +1495,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 334 + elapsedTime: 338 time: - startTime: '2019-06-28T01:18:56.691Z' - endTime: '2019-06-28T01:18:57.025Z' - totalTime: 334 + startTime: '2019-06-30T00:18:10.060Z' + endTime: '2019-06-30T00:18:10.398Z' + totalTime: 338 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560597_16e7db54dd_753794 + id: 2118090947_16e7db54dd_568455 level: 2 subscriptions: - - id: 2218560597_34a6878700_123618 + id: 2118090947_34a6878700_953248 name: 'Subscription #0' type: http hooks: @@ -1522,7 +1526,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 4 + elapsedTime: 14 onMessageReceived: valid: true tests: @@ -1542,12 +1546,12 @@ requisitions: query: '111' url: '/enqueuer/idStuff?query=111' body: '{"duplicated":true}' - elapsedTime: 3 + elapsedTime: 6 valid: true - subscriptionTime: '2019-06-28T01:18:57.026Z' + subscriptionTime: '2019-06-30T00:18:10.400Z' publishers: - - id: 2218560597_45f272e419_404351 + id: 2118090947_45f272e419_834370 name: 'publisher description' valid: true hooks: @@ -1558,7 +1562,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 4 + elapsedTime: 15 tests: - name: Published @@ -1576,7 +1580,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '25' etag: 'W/"19-yZRAgggcER0sMyRTVBBpErTPT/A"' - date: 'Fri, 28 Jun 2019 01:18:57 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -1617,7 +1621,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '25' etag: 'W/"19-yZRAgggcER0sMyRTVBBpErTPT/A"' - date: 'Fri, 28 Jun 2019 01:18:57 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -1640,7 +1644,9 @@ requisitions: tests: [] valid: true type: http - publishTime: '2019-06-28T01:18:57.030Z' + publishTime: '2019-06-30T00:18:10.412Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -1651,25 +1657,70 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 4 + elapsedTime: 14 time: - startTime: '2019-06-28T01:18:57.026Z' - endTime: '2019-06-28T01:18:57.030Z' - totalTime: 4 + startTime: '2019-06-30T00:18:10.399Z' + endTime: '2019-06-30T00:18:10.414Z' + totalTime: 15 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'requisition 2 (port 23076)' - id: 2218560597_eff03cbee0_444074 + id: 2118090947_eff03cbee0_315709 level: 2 subscriptions: - - id: 2218560597_e5e0d9ff8c_913862 + id: 2118090947_e5e0d9ff8c_902436 name: 'subscription description' type: http + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: + - + valid: true + name: 'Subscription avoided' + description: 'Avoidable subscription has not received any message' + arguments: + elapsedTime: 1002 + valid: true + subscriptionTime: '2019-06-30T00:18:10.417Z' + publishers: [] + iterations: 1 + totalIterations: 1 + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: [] + arguments: + elapsedTime: 1002 + time: + startTime: '2019-06-30T00:18:10.415Z' + endTime: '2019-06-30T00:18:11.417Z' + totalTime: 1002 + timeout: 5000 + requisitions: [] + - + valid: true + name: 'check port releasing (23076)' + id: 2118090947_1d85da2e3e_369080 + level: 2 + subscriptions: + - + id: 2118090947_3861169172_811403 + name: 'same port subscription' + type: tcp hooks: onInit: valid: true @@ -1686,8 +1737,10 @@ requisitions: arguments: elapsedTime: 1001 valid: true - subscriptionTime: '2019-06-28T01:18:57.031Z' + subscriptionTime: '2019-06-30T00:18:11.418Z' publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -1700,41 +1753,635 @@ requisitions: arguments: elapsedTime: 1001 time: - startTime: '2019-06-28T01:18:57.031Z' - endTime: '2019-06-28T01:18:58.032Z' + startTime: '2019-06-30T00:18:11.417Z' + endTime: '2019-06-30T00:18:12.418Z' totalTime: 1001 timeout: 5000 requisitions: [] - iteration: 0 + - + valid: true + name: 'Requisition #4' + id: 2118090947_5bffbc4d6d_605523 + level: 2 + subscriptions: + - + id: 2118090947_c507e101a7_227947 + name: 'Subscription #0' + type: http + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: + - + valid: true + name: 'Message received' + description: 'Subscription has received its message' + arguments: + elapsedTime: 4 + onMessageReceived: + valid: true + tests: [] + arguments: + headers: + content-length: '5' + host: 'localhost:23080' + connection: close + params: {} + query: {} + url: /number-payload + body: virgs + elapsedTime: 3 + valid: true + subscriptionTime: '2019-06-30T00:18:12.421Z' + publishers: + - + id: 2118090947_25240a3992_935637 + name: 'Publisher #0' + valid: true + hooks: + onInit: + arguments: + elapsedTime: 0 + tests: [] + valid: true + onFinish: + arguments: + elapsedTime: 4 + tests: + - + name: Published + valid: true + description: 'Published successfully' + valid: true + onResponseReceived: + arguments: + statusCode: 444 + body: '4.45' + headers: + x-powered-by: Express + access-control-allow-origin: '*' + access-control-allow-headers: 'Origin, X-Requested-With, Content-Type, Accept' + content-type: 'text/html; charset=utf-8' + content-length: '4' + etag: 'W/"4-HLLQjeteIwK7Xuhlj4t8Bu7p124"' + date: 'Sun, 30 Jun 2019 00:18:12 GMT' + connection: close + request: + uri: + protocol: 'http:' + slashes: true + auth: null + host: 'localhost:23080' + port: '23080' + hostname: localhost + hash: null + search: null + query: null + pathname: /number-payload + path: /number-payload + href: 'http://localhost:23080/number-payload' + method: post + headers: + Content-Length: 5 + tests: [] + valid: true + onMessageReceived: + arguments: + statusCode: 444 + body: '4.45' + headers: + x-powered-by: Express + access-control-allow-origin: '*' + access-control-allow-headers: 'Origin, X-Requested-With, Content-Type, Accept' + content-type: 'text/html; charset=utf-8' + content-length: '4' + etag: 'W/"4-HLLQjeteIwK7Xuhlj4t8Bu7p124"' + date: 'Sun, 30 Jun 2019 00:18:12 GMT' + connection: close + request: + uri: + protocol: 'http:' + slashes: true + auth: null + host: 'localhost:23080' + port: '23080' + hostname: localhost + hash: null + search: null + query: null + pathname: /number-payload + path: /number-payload + href: 'http://localhost:23080/number-payload' + method: post + headers: + Content-Length: 5 + tests: [] + valid: true + type: http + publishTime: '2019-06-30T00:18:12.424Z' + iterations: 1 totalIterations: 1 + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: [] + arguments: + elapsedTime: 4 + time: + startTime: '2019-06-30T00:18:12.420Z' + endTime: '2019-06-30T00:18:12.424Z' + totalTime: 4 + timeout: 5000 + requisitions: [] + - + valid: true + name: examples/http-parallel.yml + id: 2118090947_ffaed7f194_912051 + level: 1 + subscriptions: [] + publishers: [] + iterations: 1 + totalIterations: 1 + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: [] + arguments: + elapsedTime: 538 + time: + startTime: '2019-06-30T00:18:10.031Z' + endTime: '2019-06-30T00:18:10.569Z' + totalTime: 538 + timeout: 5000 + requisitions: - valid: true - name: 'check port releasing (23076)' - id: 2218560597_1d85da2e3e_148431 + name: 'Requisition #0' + id: 2118090948_f46fd5fb16_256118 level: 2 subscriptions: - - id: 2218560597_3861169172_877728 - name: 'same port subscription' - type: tcp + id: 2118090948_e4de1090c9_822139 + name: 'Subscription #0' + type: http hooks: onInit: valid: true tests: [] - arguments: - elapsedTime: 0 - onFinish: + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: + - + valid: true + name: 'Message received' + description: 'Subscription has received its message' + arguments: + elapsedTime: 283 + onMessageReceived: + valid: true + tests: [] + arguments: + headers: + host: 'localhost:23023' + content-length: '0' + connection: close + params: {} + query: {} + url: /first + body: "" + elapsedTime: 505 + valid: true + subscriptionTime: '2019-06-30T00:18:10.160Z' + publishers: [] + iterations: 2 + totalIterations: 2 + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: [] + arguments: + elapsedTime: 283 + time: + startTime: '2019-06-30T00:18:10.061Z' + endTime: '2019-06-30T00:18:10.345Z' + totalTime: 284 + timeout: 5000 + requisitions: [] + - + valid: true + name: 'Requisition #0' + id: 2118090948_f46fd5fb16_256118 + level: 2 + subscriptions: + - + id: 2118090948_e4de1090c9_822139 + name: 'Subscription #0' + type: http + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: + - + valid: true + name: 'Message received' + description: 'Subscription has received its message' + arguments: + elapsedTime: 220 + onMessageReceived: + valid: true + tests: [] + arguments: + headers: + host: 'localhost:23023' + content-length: '0' + connection: close + params: {} + query: {} + url: /first + body: "" + elapsedTime: 220 + valid: true + subscriptionTime: '2019-06-30T00:18:10.347Z' + publishers: [] + iterations: 2 + totalIterations: 2 + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: [] + arguments: + elapsedTime: 220 + time: + startTime: '2019-06-30T00:18:10.346Z' + endTime: '2019-06-30T00:18:10.566Z' + totalTime: 220 + timeout: 5000 + requisitions: [] + - + valid: true + name: 'Requisition #1' + id: 2118090948_4788339776_930147 + level: 2 + subscriptions: + - + id: 2118090948_16f5b5fa56_613579 + name: 'Subscription #0' + type: http + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: + - + valid: true + name: 'Message received' + description: 'Subscription has received its message' + arguments: + elapsedTime: 288 + onMessageReceived: + valid: true + tests: [] + arguments: + headers: + host: 'localhost:23023' + content-length: '0' + connection: close + params: {} + query: {} + url: /second + body: "" + elapsedTime: 506 + valid: true + subscriptionTime: '2019-06-30T00:18:10.160Z' + publishers: [] + iterations: 2 + totalIterations: 2 + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: [] + arguments: + elapsedTime: 289 + time: + startTime: '2019-06-30T00:18:10.061Z' + endTime: '2019-06-30T00:18:10.350Z' + totalTime: 289 + timeout: 5000 + requisitions: [] + - + valid: true + name: 'Requisition #1' + id: 2118090948_4788339776_930147 + level: 2 + subscriptions: + - + id: 2118090948_16f5b5fa56_613579 + name: 'Subscription #0' + type: http + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: + - + valid: true + name: 'Message received' + description: 'Subscription has received its message' + arguments: + elapsedTime: 217 + onMessageReceived: + valid: true + tests: [] + arguments: + headers: + host: 'localhost:23023' + content-length: '0' + connection: close + params: {} + query: {} + url: /second + body: "" + elapsedTime: 216 + valid: true + subscriptionTime: '2019-06-30T00:18:10.352Z' + publishers: [] + iterations: 2 + totalIterations: 2 + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: [] + arguments: + elapsedTime: 218 + time: + startTime: '2019-06-30T00:18:10.350Z' + endTime: '2019-06-30T00:18:10.568Z' + totalTime: 218 + timeout: 5000 + requisitions: [] + - + valid: true + name: 'Requisition #2' + id: 2118090948_26a61bc62a_259172 + level: 2 + subscriptions: [] + publishers: + - + id: 2118090948_fb73e2d9b8_92152 + name: 'Publisher #0' + valid: true + hooks: + onInit: + arguments: + elapsedTime: 0 + tests: [] + valid: true + onFinish: + arguments: + elapsedTime: 298 + tests: + - + name: Published + valid: true + description: 'Published successfully' + valid: true + onResponseReceived: + arguments: + statusCode: 200 + body: first + headers: + x-powered-by: Express + access-control-allow-origin: '*' + access-control-allow-headers: 'Origin, X-Requested-With, Content-Type, Accept' + content-type: 'text/html; charset=utf-8' + content-length: '5' + etag: 'W/"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE"' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' + connection: close + request: + uri: + protocol: 'http:' + slashes: true + auth: null + host: 'localhost:23023' + port: '23023' + hostname: localhost + hash: null + search: null + query: null + pathname: /first + path: /first + href: 'http://localhost:23023/first' + method: get + headers: + content-length: 0 + tests: + - + name: 'Assertion #0' + valid: true + description: 'Expected ''statusCode'' to be equal to ''200''. Received ''200''' + valid: true + onMessageReceived: + arguments: + statusCode: 200 + body: first + headers: + x-powered-by: Express + access-control-allow-origin: '*' + access-control-allow-headers: 'Origin, X-Requested-With, Content-Type, Accept' + content-type: 'text/html; charset=utf-8' + content-length: '5' + etag: 'W/"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE"' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' + connection: close + request: + uri: + protocol: 'http:' + slashes: true + auth: null + host: 'localhost:23023' + port: '23023' + hostname: localhost + hash: null + search: null + query: null + pathname: /first + path: /first + href: 'http://localhost:23023/first' + method: get + headers: + content-length: 0 + tests: [] + valid: true + type: http + publishTime: '2019-06-30T00:18:10.360Z' + iterations: 2 + totalIterations: 2 + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: + valid: true + tests: [] + arguments: + elapsedTime: 298 + time: + startTime: '2019-06-30T00:18:10.062Z' + endTime: '2019-06-30T00:18:10.360Z' + totalTime: 298 + timeout: 5000 + requisitions: [] + - + valid: true + name: 'Requisition #2' + id: 2118090948_26a61bc62a_259172 + level: 2 + subscriptions: [] + publishers: + - + id: 2118090948_fb73e2d9b8_92152 + name: 'Publisher #0' + valid: true + hooks: + onInit: + arguments: + elapsedTime: 0 + tests: [] + valid: true + onFinish: + arguments: + elapsedTime: 206 + tests: + - + name: Published + valid: true + description: 'Published successfully' + valid: true + onResponseReceived: + arguments: + statusCode: 200 + body: first + headers: + x-powered-by: Express + access-control-allow-origin: '*' + access-control-allow-headers: 'Origin, X-Requested-With, Content-Type, Accept' + content-type: 'text/html; charset=utf-8' + content-length: '5' + etag: 'W/"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE"' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' + connection: close + request: + uri: + protocol: 'http:' + slashes: true + auth: null + host: 'localhost:23023' + port: '23023' + hostname: localhost + hash: null + search: null + query: null + pathname: /first + path: /first + href: 'http://localhost:23023/first' + method: get + headers: + content-length: 0 + tests: + - + name: 'Assertion #0' + valid: true + description: 'Expected ''statusCode'' to be equal to ''200''. Received ''200''' + valid: true + onMessageReceived: + arguments: + statusCode: 200 + body: first + headers: + x-powered-by: Express + access-control-allow-origin: '*' + access-control-allow-headers: 'Origin, X-Requested-With, Content-Type, Accept' + content-type: 'text/html; charset=utf-8' + content-length: '5' + etag: 'W/"5-4JlqN8E9RMOwYHSTnUP6N1m9MsE"' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' + connection: close + request: + uri: + protocol: 'http:' + slashes: true + auth: null + host: 'localhost:23023' + port: '23023' + hostname: localhost + hash: null + search: null + query: null + pathname: /first + path: /first + href: 'http://localhost:23023/first' + method: get + headers: + content-length: 0 + tests: [] valid: true - tests: - - - valid: true - name: 'Subscription avoided' - description: 'Avoidable subscription has not received any message' - arguments: - elapsedTime: 1001 - valid: true - subscriptionTime: '2019-06-28T01:18:58.033Z' - publishers: [] + type: http + publishTime: '2019-06-30T00:18:10.567Z' + iterations: 2 + totalIterations: 2 hooks: onInit: valid: true @@ -1745,58 +2392,137 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1001 + elapsedTime: 206 time: - startTime: '2019-06-28T01:18:58.033Z' - endTime: '2019-06-28T01:18:59.034Z' - totalTime: 1001 + startTime: '2019-06-30T00:18:10.361Z' + endTime: '2019-06-30T00:18:10.567Z' + totalTime: 206 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true - name: 'Requisition #4' - id: 2218560597_5bffbc4d6d_462147 + name: 'Requisition #3' + id: 2118090948_6099fb1229_62400 level: 2 - subscriptions: + subscriptions: [] + publishers: - - id: 2218560598_c507e101a7_641408 - name: 'Subscription #0' - type: http + id: 2118090948_7d016346aa_745902 + name: 'Publisher #0' + valid: true hooks: onInit: - valid: true - tests: [] arguments: elapsedTime: 0 - onFinish: + tests: [] valid: true + onFinish: + arguments: + elapsedTime: 299 tests: - + name: Published valid: true - name: 'Message received' - description: 'Subscription has received its message' + description: 'Published successfully' + valid: true + onResponseReceived: arguments: - elapsedTime: 5 - onMessageReceived: + statusCode: 200 + body: second + headers: + x-powered-by: Express + access-control-allow-origin: '*' + access-control-allow-headers: 'Origin, X-Requested-With, Content-Type, Accept' + content-type: 'text/html; charset=utf-8' + content-length: '6' + etag: 'W/"6-NS94KaI4SwAcwSsMJhPHVkVKH2o"' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' + connection: close + request: + uri: + protocol: 'http:' + slashes: true + auth: null + host: 'localhost:23023' + port: '23023' + hostname: localhost + hash: null + search: null + query: null + pathname: /second + path: /second + href: 'http://localhost:23023/second' + method: get + headers: + content-length: 0 + tests: + - + name: 'Assertion #0' + valid: true + description: 'Expected ''statusCode'' to be equal to ''200''. Received ''200''' valid: true - tests: [] + onMessageReceived: arguments: + statusCode: 200 + body: second headers: - content-length: '5' - host: 'localhost:23080' + x-powered-by: Express + access-control-allow-origin: '*' + access-control-allow-headers: 'Origin, X-Requested-With, Content-Type, Accept' + content-type: 'text/html; charset=utf-8' + content-length: '6' + etag: 'W/"6-NS94KaI4SwAcwSsMJhPHVkVKH2o"' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close - params: {} - query: {} - url: /number-payload - body: virgs - elapsedTime: 3 + request: + uri: + protocol: 'http:' + slashes: true + auth: null + host: 'localhost:23023' + port: '23023' + hostname: localhost + hash: null + search: null + query: null + pathname: /second + path: /second + href: 'http://localhost:23023/second' + method: get + headers: + content-length: 0 + tests: [] + valid: true + type: http + publishTime: '2019-06-30T00:18:10.361Z' + iterations: 2 + totalIterations: 2 + hooks: + onInit: + valid: true + tests: [] + arguments: + elapsedTime: 0 + onFinish: valid: true - subscriptionTime: '2019-06-28T01:18:59.036Z' + tests: [] + arguments: + elapsedTime: 299 + time: + startTime: '2019-06-30T00:18:10.062Z' + endTime: '2019-06-30T00:18:10.361Z' + totalTime: 299 + timeout: 5000 + requisitions: [] + - + valid: true + name: 'Requisition #3' + id: 2118090948_6099fb1229_62400 + level: 2 + subscriptions: [] publishers: - - id: 2218560597_25240a3992_80835 + id: 2118090948_7d016346aa_745902 name: 'Publisher #0' valid: true hooks: @@ -1807,7 +2533,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 5 + elapsedTime: 207 tests: - name: Published @@ -1816,70 +2542,76 @@ requisitions: valid: true onResponseReceived: arguments: - statusCode: 444 - body: '4.45' + statusCode: 200 + body: second headers: x-powered-by: Express access-control-allow-origin: '*' access-control-allow-headers: 'Origin, X-Requested-With, Content-Type, Accept' content-type: 'text/html; charset=utf-8' - content-length: '4' - etag: 'W/"4-HLLQjeteIwK7Xuhlj4t8Bu7p124"' - date: 'Fri, 28 Jun 2019 01:18:59 GMT' + content-length: '6' + etag: 'W/"6-NS94KaI4SwAcwSsMJhPHVkVKH2o"' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: protocol: 'http:' slashes: true auth: null - host: 'localhost:23080' - port: '23080' + host: 'localhost:23023' + port: '23023' hostname: localhost hash: null search: null query: null - pathname: /number-payload - path: /number-payload - href: 'http://localhost:23080/number-payload' - method: post + pathname: /second + path: /second + href: 'http://localhost:23023/second' + method: get headers: - Content-Length: 5 - tests: [] + content-length: 0 + tests: + - + name: 'Assertion #0' + valid: true + description: 'Expected ''statusCode'' to be equal to ''200''. Received ''200''' valid: true onMessageReceived: arguments: - statusCode: 444 - body: '4.45' + statusCode: 200 + body: second headers: x-powered-by: Express access-control-allow-origin: '*' access-control-allow-headers: 'Origin, X-Requested-With, Content-Type, Accept' content-type: 'text/html; charset=utf-8' - content-length: '4' - etag: 'W/"4-HLLQjeteIwK7Xuhlj4t8Bu7p124"' - date: 'Fri, 28 Jun 2019 01:18:59 GMT' + content-length: '6' + etag: 'W/"6-NS94KaI4SwAcwSsMJhPHVkVKH2o"' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: protocol: 'http:' slashes: true auth: null - host: 'localhost:23080' - port: '23080' + host: 'localhost:23023' + port: '23023' hostname: localhost hash: null search: null query: null - pathname: /number-payload - path: /number-payload - href: 'http://localhost:23080/number-payload' - method: post + pathname: /second + path: /second + href: 'http://localhost:23023/second' + method: get headers: - Content-Length: 5 + content-length: 0 tests: [] valid: true type: http - publishTime: '2019-06-28T01:18:59.040Z' + publishTime: '2019-06-30T00:18:10.568Z' + iterations: 2 + totalIterations: 2 hooks: onInit: valid: true @@ -1890,25 +2622,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 6 + elapsedTime: 207 time: - startTime: '2019-06-28T01:18:59.035Z' - endTime: '2019-06-28T01:18:59.041Z' - totalTime: 6 + startTime: '2019-06-30T00:18:10.362Z' + endTime: '2019-06-30T00:18:10.569Z' + totalTime: 207 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/http-proxy.yml - id: 2218560598_aba5464e08_23073 + id: 2118090948_aba5464e08_973745 level: 1 subscriptions: - - id: 2218560598_be017cf7e2_723380 + id: 2118090948_be017cf7e2_318582 name: 'proxy subscription' type: http-proxy hooks: @@ -1925,7 +2653,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 314 + elapsedTime: 327 onOriginalMessageReceived: valid: true tests: @@ -1944,7 +2672,7 @@ requisitions: query: proxied url: '/proxy/enqueuer/123456?query=proxied' body: original - elapsedTime: 278 + elapsedTime: 252 onMessageReceived: valid: true tests: @@ -1966,7 +2694,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '25' etag: 'W/"19-t4VpDbTMvQQ876rQU32330fLSVI"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -1989,9 +2717,9 @@ requisitions: connection: close Content-Length: 17 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' - - id: 2218560598_9421bcf470_54626 + id: 2118090948_9421bcf470_200848 name: real type: http hooks: @@ -2008,7 +2736,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 314 + elapsedTime: 327 onMessageReceived: valid: true tests: @@ -2035,12 +2763,12 @@ requisitions: query: proxied url: '/real/enqueuer/123456?query=proxied' body: 'original -> proxy' - elapsedTime: 309 + elapsedTime: 299 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560598_8e53ccc444_93068 + id: 2118090948_8e53ccc444_484355 name: 'publisher proxy' valid: true hooks: @@ -2051,7 +2779,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 314 + elapsedTime: 327 tests: - name: Published @@ -2069,7 +2797,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '42' etag: 'W/"19-t4VpDbTMvQQ876rQU32330fLSVI"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -2101,7 +2829,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '42' etag: 'W/"19-t4VpDbTMvQQ876rQU32330fLSVI"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -2131,7 +2859,9 @@ requisitions: description: 'Expected ''body'' to be equal to ''original -> proxy -> real -> proxied again''. Received ''original -> proxy -> real -> proxied again''' valid: true type: http - publishTime: '2019-06-28T01:18:56.978Z' + publishTime: '2019-06-30T00:18:10.359Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2142,23 +2872,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 314 + elapsedTime: 327 time: - startTime: '2019-06-28T01:18:56.664Z' - endTime: '2019-06-28T01:18:56.979Z' - totalTime: 315 + startTime: '2019-06-30T00:18:10.032Z' + endTime: '2019-06-30T00:18:10.359Z' + totalTime: 327 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/http.yml - id: 2218560598_559809288c_544650 + id: 2118090948_559809288c_862451 level: 1 subscriptions: - - id: 2218560598_36baa23c89_197782 + id: 2118090948_36baa23c89_545872 name: 'Subscription #0' type: http hooks: @@ -2175,7 +2903,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 301 + elapsedTime: 278 onMessageReceived: valid: true tests: [] @@ -2188,12 +2916,12 @@ requisitions: query: {} url: /resource body: virgs - elapsedTime: 273 + elapsedTime: 252 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560598_3f90d159b3_298991 + id: 2118090948_3f90d159b3_825752 name: 'Publisher #0' valid: true hooks: @@ -2204,7 +2932,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 301 + elapsedTime: 278 tests: - name: Published @@ -2222,7 +2950,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-W/H9kn37hnlJai5s8Ay+UMHIcUU"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -2254,7 +2982,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-W/H9kn37hnlJai5s8Ay+UMHIcUU"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -2280,7 +3008,9 @@ requisitions: description: 'Expected ''statusCode'' to be equal to ''444''. Received ''444''' valid: true type: http - publishTime: '2019-06-28T01:18:56.967Z' + publishTime: '2019-06-30T00:18:10.310Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2291,23 +3021,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 301 + elapsedTime: 278 time: - startTime: '2019-06-28T01:18:56.666Z' - endTime: '2019-06-28T01:18:56.967Z' - totalTime: 301 + startTime: '2019-06-30T00:18:10.033Z' + endTime: '2019-06-30T00:18:10.311Z' + totalTime: 278 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/https.yml - id: 2218560598_d6075fad05_315214 + id: 2118090948_d6075fad05_486306 level: 1 subscriptions: - - id: 2218560598_81e3a69582_165074 + id: 2118090948_81e3a69582_487931 name: 'Subscription #0' type: https hooks: @@ -2324,7 +3052,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 310 + elapsedTime: 323 onMessageReceived: valid: true tests: @@ -2342,12 +3070,12 @@ requisitions: query: {} url: /enqueuer body: '{"https":"works!"}' - elapsedTime: 307 + elapsedTime: 297 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560598_5cd9b40d14_235529 + id: 2118090948_5cd9b40d14_625821 name: 'Publisher #0' valid: true hooks: @@ -2358,7 +3086,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 310 + elapsedTime: 323 tests: - name: Published @@ -2376,7 +3104,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '5' etag: 'W/"5-w0N9vHwSVdOiHURNhuvy6SNMIr0"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -2409,7 +3137,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '5' etag: 'W/"5-w0N9vHwSVdOiHURNhuvy6SNMIr0"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -2440,7 +3168,9 @@ requisitions: description: 'Expected ''body'' to be equal to ''https''. Received ''https''' valid: true type: HTTPS - publishTime: '2019-06-28T01:18:56.977Z' + publishTime: '2019-06-30T00:18:10.357Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2451,22 +3181,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 310 + elapsedTime: 323 time: - startTime: '2019-06-28T01:18:56.667Z' - endTime: '2019-06-28T01:18:56.977Z' - totalTime: 310 + startTime: '2019-06-30T00:18:10.035Z' + endTime: '2019-06-30T00:18:10.358Z' + totalTime: 323 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/ignore.yml - id: 2218560598_8ea767da7b_357307 + id: 2118090949_8ea767da7b_342280 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2477,22 +3207,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 99 + elapsedTime: 92 time: - startTime: '2019-06-28T01:18:56.668Z' - endTime: '2019-06-28T01:18:56.767Z' - totalTime: 99 + startTime: '2019-06-30T00:18:10.036Z' + endTime: '2019-06-30T00:18:10.128Z' + totalTime: 92 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560598_cbabde97ea_467817 + id: 2118090949_cbabde97ea_784363 level: 2 subscriptions: [] publishers: - - id: 2218560599_c325787526_501804 + id: 2118090949_c325787526_686578 name: 'Publisher #0' ignored: true valid: true @@ -2504,6 +3234,8 @@ requisitions: valid: true tests: [] type: file + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2514,23 +3246,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 49 + elapsedTime: 42 time: - startTime: '2019-06-28T01:18:56.692Z' - endTime: '2019-06-28T01:18:56.741Z' - totalTime: 49 + startTime: '2019-06-30T00:18:10.063Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 42 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560599_24ec47c05e_762631 + id: 2118090949_24ec47c05e_384659 level: 2 subscriptions: - - id: 2218560599_41bbcab029_88391 + id: 2118090949_41bbcab029_818295 name: 'Subscription #0' ignored: true type: file @@ -2543,6 +3273,8 @@ requisitions: tests: [] valid: true publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2553,23 +3285,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 3 + elapsedTime: 10 time: - startTime: '2019-06-28T01:18:56.748Z' - endTime: '2019-06-28T01:18:56.753Z' - totalTime: 5 + startTime: '2019-06-30T00:18:10.111Z' + endTime: '2019-06-30T00:18:10.121Z' + totalTime: 10 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #2' - id: 2218560599_73301c2bc1_904916 + id: 2118090949_73301c2bc1_930704 ignored: true level: 2 subscriptions: [] publishers: [] + iterations: 1 hooks: onInit: arguments: {} @@ -2580,19 +3311,19 @@ requisitions: valid: true tests: [] time: - startTime: '2019-06-28T01:18:56.764Z' - endTime: '2019-06-28T01:18:56.764Z' + startTime: '2019-06-30T00:18:10.124Z' + endTime: '2019-06-30T00:18:10.124Z' totalTime: 0 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/import.yml - id: 2218560599_11d1ffbd36_26584 + id: 2118090949_11d1ffbd36_251529 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2603,20 +3334,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 295 + elapsedTime: 281 time: - startTime: '2019-06-28T01:18:56.671Z' - endTime: '2019-06-28T01:18:56.966Z' - totalTime: 295 + startTime: '2019-06-30T00:18:10.038Z' + endTime: '2019-06-30T00:18:10.319Z' + totalTime: 281 timeout: 5000 requisitions: - valid: true name: 'static importRequisition' - id: 2218560599_0c14282f98_919980 + id: 2118090949_0c14282f98_50042 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2631,22 +3364,22 @@ requisitions: valid: true description: 'Expecting ''requisition.imported'' to be true. Received: true' arguments: - elapsedTime: 48 + elapsedTime: 41 time: - startTime: '2019-06-28T01:18:56.692Z' - endTime: '2019-06-28T01:18:56.741Z' - totalTime: 49 + startTime: '2019-06-30T00:18:10.063Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 42 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'dynamic importRequisition' - id: 2218560599_6857a59a1d_385150 + id: 2118090949_6857a59a1d_454598 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2665,23 +3398,21 @@ requisitions: valid: true description: 'Expected ''requisition.priority'' to be equal to ''higher''. Received ''higher''' arguments: - elapsedTime: 5 + elapsedTime: 8 time: - startTime: '2019-06-28T01:18:56.745Z' - endTime: '2019-06-28T01:18:56.750Z' - totalTime: 5 + startTime: '2019-06-30T00:18:10.109Z' + endTime: '2019-06-30T00:18:10.118Z' + totalTime: 9 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #2' - id: 2218560599_28f1b301b5_133643 + id: 2118090949_28f1b301b5_907632 level: 2 subscriptions: - - id: 2218560599_a7a23228b4_148304 + id: 2118090949_a7a23228b4_890491 name: 'Subscription #0' type: http hooks: @@ -2706,7 +3437,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 207 + elapsedTime: 195 onMessageReceived: valid: true tests: [] @@ -2719,12 +3450,12 @@ requisitions: query: {} url: /subscription-reuse body: virgs - elapsedTime: 180 + elapsedTime: 165 valid: true - subscriptionTime: '2019-06-28T01:18:56.764Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560599_5163661566_5458 + id: 2118090949_5163661566_130335 name: 'Publisher #0' valid: true hooks: @@ -2735,7 +3466,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 207 + elapsedTime: 196 tests: - name: 'Assertion #0' @@ -2761,7 +3492,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-W/H9kn37hnlJai5s8Ay+UMHIcUU"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -2793,7 +3524,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '4' etag: 'W/"4-W/H9kn37hnlJai5s8Ay+UMHIcUU"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -2819,7 +3550,9 @@ requisitions: description: 'Expected ''statusCode'' to be equal to ''444''. Received ''444''' valid: true type: http - publishTime: '2019-06-28T01:18:56.966Z' + publishTime: '2019-06-30T00:18:10.318Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2830,24 +3563,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 207 + elapsedTime: 196 time: - startTime: '2019-06-28T01:18:56.759Z' - endTime: '2019-06-28T01:18:56.966Z' - totalTime: 207 + startTime: '2019-06-30T00:18:10.123Z' + endTime: '2019-06-30T00:18:10.319Z' + totalTime: 196 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/no-tests.yml - id: 2218560599_92334e1554_885740 + id: 2118090949_92334e1554_212973 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2858,20 +3589,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 285 + elapsedTime: 255 time: - startTime: '2019-06-28T01:18:56.671Z' - endTime: '2019-06-28T01:18:56.956Z' - totalTime: 285 + startTime: '2019-06-30T00:18:10.038Z' + endTime: '2019-06-30T00:18:10.293Z' + totalTime: 255 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560599_35cb1b4ae8_267358 + id: 2118090949_35cb1b4ae8_965603 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2882,48 +3615,48 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 126 + elapsedTime: 103 time: - startTime: '2019-06-28T01:18:56.829Z' - endTime: '2019-06-28T01:18:56.955Z' - totalTime: 126 + startTime: '2019-06-30T00:18:10.190Z' + endTime: '2019-06-30T00:18:10.293Z' + totalTime: 103 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/parallel-requisition.yml - id: 2218560599_e05b5acab1_127128 + id: 2118090949_e05b5acab1_795913 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 onFinish: valid: true tests: [] arguments: - elapsedTime: 865 + elapsedTime: 861 time: - startTime: '2019-06-28T01:18:56.672Z' - endTime: '2019-06-28T01:18:57.537Z' - totalTime: 865 + startTime: '2019-06-30T00:18:10.040Z' + endTime: '2019-06-30T00:18:10.901Z' + totalTime: 861 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560600_e2f0694b46_315442 + id: 2118090950_e2f0694b46_72870 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2940,22 +3673,24 @@ requisitions: - name: 'Assertion #1' valid: true - description: 'Expected ''elapsedTime'' not to be less than or equal to ''400''. Received ''330''' + description: 'Expected ''elapsedTime'' not to be less than or equal to ''400''. Received ''331''' arguments: - elapsedTime: 330 + elapsedTime: 331 time: - startTime: '2019-06-28T01:18:56.693Z' - endTime: '2019-06-28T01:18:57.023Z' - totalTime: 330 + startTime: '2019-06-30T00:18:10.064Z' + endTime: '2019-06-30T00:18:10.396Z' + totalTime: 332 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560600_913ffe0794_961700 + id: 2118090950_913ffe0794_986887 level: 3 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2966,22 +3701,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 233 + elapsedTime: 231 time: - startTime: '2019-06-28T01:18:56.722Z' - endTime: '2019-06-28T01:18:56.955Z' - totalTime: 233 + startTime: '2019-06-30T00:18:10.093Z' + endTime: '2019-06-30T00:18:10.324Z' + totalTime: 231 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560600_fdabeaad92_583177 + id: 2118090950_fdabeaad92_998848 level: 3 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -2992,24 +3727,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 300 + elapsedTime: 301 time: - startTime: '2019-06-28T01:18:56.723Z' - endTime: '2019-06-28T01:18:57.023Z' - totalTime: 300 + startTime: '2019-06-30T00:18:10.094Z' + endTime: '2019-06-30T00:18:10.395Z' + totalTime: 301 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560600_30bc9c1ac3_634928 + id: 2118090950_30bc9c1ac3_203837 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3022,26 +3755,28 @@ 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 ''207''' + description: 'Expected ''requisition.requisitions[1].startTime.getTime() - requisition.requisitions[0].startTime.getTime()'' to be greater than or equal to ''200''. Received ''201''' - name: 'Assertion #1' valid: true - description: 'Expected ''elapsedTime'' not to be less than or equal to ''600''. Received ''512''' + description: 'Expected ''elapsedTime'' not to be less than or equal to ''600''. Received ''503''' arguments: - elapsedTime: 512 + elapsedTime: 503 time: - startTime: '2019-06-28T01:18:57.024Z' - endTime: '2019-06-28T01:18:57.536Z' - totalTime: 512 + startTime: '2019-06-30T00:18:10.397Z' + endTime: '2019-06-30T00:18:10.901Z' + totalTime: 504 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560600_913ffe0794_155521 + id: 2118090950_913ffe0794_21695 level: 3 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3052,22 +3787,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 205 + elapsedTime: 201 time: - startTime: '2019-06-28T01:18:57.024Z' - endTime: '2019-06-28T01:18:57.229Z' - totalTime: 205 + startTime: '2019-06-30T00:18:10.397Z' + endTime: '2019-06-30T00:18:10.598Z' + totalTime: 201 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560600_463f29d694_660766 + id: 2118090950_463f29d694_332138 level: 3 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3078,28 +3813,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 305 + elapsedTime: 302 time: - startTime: '2019-06-28T01:18:57.230Z' - endTime: '2019-06-28T01:18:57.536Z' - totalTime: 306 + startTime: '2019-06-30T00:18:10.598Z' + endTime: '2019-06-30T00:18:10.900Z' + totalTime: 302 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/parallel-test-publisher.yml - id: 2218560600_98a37b717a_887943 + id: 2118090950_98a37b717a_282843 level: 1 subscriptions: [] publishers: - - id: 2218560600_2955c0f42c_106367 + id: 2118090950_2955c0f42c_53607 name: 'Publisher #0' valid: true hooks: @@ -3123,8 +3852,8 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 52619 - elapsedTime: 1505 + port: 52974 + elapsedTime: 1504 tests: - name: 'Back and forth' @@ -3132,7 +3861,9 @@ requisitions: description: 'Expected ''payload'' to be equal to ''anyValue''. Received ''anyValue''' valid: true type: tcp - publishTime: '2019-06-28T01:18:57.180Z' + publishTime: '2019-06-30T00:18:10.547Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3145,21 +3876,19 @@ requisitions: arguments: elapsedTime: 507 time: - startTime: '2019-06-28T01:18:56.673Z' - endTime: '2019-06-28T01:18:57.180Z' + startTime: '2019-06-30T00:18:10.040Z' + endTime: '2019-06-30T00:18:10.547Z' totalTime: 507 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/parallel-test-subscription.yml - id: 2218560600_eb9c2c8618_686106 + id: 2118090950_eb9c2c8618_129173 level: 1 subscriptions: - - id: 2218560600_b419ff22d8_983303 + id: 2118090950_b419ff22d8_164943 name: 'Subscription #0' type: tcp hooks: @@ -3176,7 +3905,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 505 + elapsedTime: 503 onMessageReceived: valid: true tests: @@ -3190,10 +3919,12 @@ requisitions: address: '::ffff:127.0.0.1' family: IPv6 port: 23081 - elapsedTime: 504 + elapsedTime: 502 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3204,22 +3935,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 506 + elapsedTime: 503 time: - startTime: '2019-06-28T01:18:56.673Z' - endTime: '2019-06-28T01:18:57.179Z' - totalTime: 506 + startTime: '2019-06-30T00:18:10.041Z' + endTime: '2019-06-30T00:18:10.544Z' + totalTime: 503 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/parent.yml - id: 2218560600_b79240b3fa_618518 + id: 2118090950_b79240b3fa_46650 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3230,20 +3961,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 195 + elapsedTime: 187 time: - startTime: '2019-06-28T01:18:56.674Z' - endTime: '2019-06-28T01:18:56.869Z' - totalTime: 195 + startTime: '2019-06-30T00:18:10.041Z' + endTime: '2019-06-30T00:18:10.228Z' + totalTime: 187 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560600_c28c57bc75_974050 + id: 2118090950_c28c57bc75_470540 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3254,23 +3987,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 47 + elapsedTime: 40 time: - startTime: '2019-06-28T01:18:56.693Z' - endTime: '2019-06-28T01:18:56.741Z' - totalTime: 48 + startTime: '2019-06-30T00:18:10.064Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 41 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560600_52aeba2265_702474 + id: 2118090950_52aeba2265_436158 level: 2 subscriptions: - - id: 2218560600_f3eb57f16a_949099 + id: 2118090950_f3eb57f16a_327283 name: 'Subscription #0' type: tcp hooks: @@ -3291,10 +4022,12 @@ requisitions: name: 'Subscription avoided' description: 'Avoidable subscription has not received any message' arguments: - elapsedTime: 122 + elapsedTime: 118 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3305,25 +4038,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 123 + elapsedTime: 119 time: - startTime: '2019-06-28T01:18:56.746Z' - endTime: '2019-06-28T01:18:56.869Z' - totalTime: 123 + startTime: '2019-06-30T00:18:10.109Z' + endTime: '2019-06-30T00:18:10.228Z' + totalTime: 119 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: 'readme self-test' - id: 2218560600_46ca06fb8b_125462 + id: 2118090950_46ca06fb8b_825952 level: 1 subscriptions: - - id: 2218560600_2ff3ad431e_910494 + id: 2118090950_2ff3ad431e_343747 name: 'mock endpoint' type: http hooks: @@ -3340,7 +4069,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 294 + elapsedTime: 279 onMessageReceived: valid: true tests: @@ -3362,12 +4091,12 @@ requisitions: query: {} url: /readme-example body: 'does enqueuer rock?' - elapsedTime: 275 + elapsedTime: 249 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560600_fd7e0d43ba_212190 + id: 2118090950_fd7e0d43ba_36450 name: 'Publisher #0' valid: true hooks: @@ -3378,7 +4107,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 294 + elapsedTime: 279 tests: - name: Published @@ -3396,7 +4125,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '13' etag: 'W/"d-6UKeP76zmvXmSg17xN19aS1KU0w"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -3436,7 +4165,7 @@ requisitions: content-type: 'text/html; charset=utf-8' content-length: '13' etag: 'W/"d-6UKeP76zmvXmSg17xN19aS1KU0w"' - date: 'Fri, 28 Jun 2019 01:18:56 GMT' + date: 'Sun, 30 Jun 2019 00:18:10 GMT' connection: close request: uri: @@ -3458,7 +4187,9 @@ requisitions: tests: [] valid: true type: http - publishTime: '2019-06-28T01:18:56.969Z' + publishTime: '2019-06-30T00:18:10.321Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3469,24 +4200,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 294 + elapsedTime: 279 time: - startTime: '2019-06-28T01:18:56.675Z' - endTime: '2019-06-28T01:18:56.970Z' - totalTime: 295 + startTime: '2019-06-30T00:18:10.042Z' + endTime: '2019-06-30T00:18:10.322Z' + totalTime: 280 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/readme-enqueuer-repo-hit.yml - id: 2218560600_5edd709fc3_661311 + id: 2118090950_5edd709fc3_49555 level: 1 subscriptions: [] publishers: - - id: 2218560600_cf5343e68d_784199 + id: 2118090950_cf5343e68d_400250 name: 'Publisher #0' valid: true hooks: @@ -3497,7 +4226,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 1664 + elapsedTime: 1696 tests: - name: Published @@ -3507,30 +4236,30 @@ 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 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\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 enqueuer-land/enqueuer\n \n\n

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

Join GitHub today

\n

GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.

\n Sign up\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\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 Find File\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
\n \n \"@lopidio\"\n
\n
\n\n
\n \n lopidio\n\n\n \n\n\n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n \n\n
…sher and subscription
\n
\n
\n Latest commit\n \n f6dcbb9\n \n Jun 25, 2019\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 refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n examples\n \n \n refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 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 feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n output\n \n \n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n src\n \n \n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n Jun 25, 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 refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n package-lock.json\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n package.json\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 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 README.md\n

\n
\n
\n

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

\n

\"enqueuerlogo\"

\n

Want to ensure that a user journey which involves several steps with different protocols is working properly?\nHave you ever struggled with testing multi protocol flows?\nDepending services have become a pain?\nDon't you worry anymore. Enqueuer is what you're looking for.

\n

What it is

\n

It's not just an integration testing tool. It is a platform that provides the following capabilities:

\n
    \n
  • Support for many protocols out of the box
  • \n
  • Chainable message flows
  • \n
  • Easily mock numerous services to alleviate the headaches of functional and integration tests
  • \n
  • Friendly for developers and non developers
  • \n
  • Built in assertion library to verify response data coming from/going to your services
  • \n
  • Easily extensible behavior through third party plugins, including your own custom ones
  • \n
  • CLI is easy to add to your team's existing CI pipelines
  • \n
  • Act and react on your system under test
  • \n
  • Place tests front and center
  • \n
\n

Welcome to the enqueuer world.

\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 and hit it at the same time, you may ask. Not a big deal for enqueuer lovers:

\n
name: readme self-test\npublishers:\n-   type: http\n    url: http://localhost:9085/readme-example\n    method: POST\n    payload: does enqueuer rock?\n    onResponseReceived:\n        script: doubleStatus = statusCode * 2\n        assertions:\n            -   expect: body\n                toBeEqualTo: `mock response`\n            -   expect: doubleStatus\n                toBeGreaterThan: 300\nsubscriptions:\n-   type: http\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        -   name: failing test\n            expectToBeTruthy: false\n
\n

Note that the second subscription assertion is a failing one. By running this example, we get this:

\n
$ nqr http-self-test.yml\n   [FAIL]      readme self-test                                                   6 tests passing of 7 (85.71%) ran in 37ms\n   [FAIL] enqueuer                                                                6 tests passing of 7 (85.71%) ran in 42ms\n               enqueuer › readme self-test › mock endpoint › failing test\n                           Expecting 'false' to be true. Received: false\n
\n

I 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 \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n You signed in with another tab or window. Reload to refresh your session.\n You signed out in another tab or window. Reload to refresh your session.\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 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\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 enqueuer-land/enqueuer\n \n\n

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

Join GitHub today

\n

GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.

\n Sign up\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\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 Find File\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 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 \n \n \n
\n \n \"\"\n \n conf\n \n \n \n \n \n
\n \n \"\"\n \n docs\n \n \n \n \n \n
\n \n \"\"\n \n examples\n \n \n \n \n \n
\n \n \"\"\n \n https-cert\n \n \n \n \n \n
\n \n \"\"\n \n misc\n \n \n \n \n \n
\n \n \"\"\n \n output\n \n \n \n \n \n
\n \n \"\"\n \n src\n \n \n \n \n \n
\n \n \"\"\n \n temp\n \n \n \n \n \n
\n \n \"\"\n \n .codeclimate.yml\n \n \n \n \n \n
\n \n \"\"\n \n .gitignore\n \n \n \n \n \n
\n \n \"\"\n \n .npmignore\n \n \n \n \n \n
\n \n \"\"\n \n .travis.yml\n \n \n \n \n \n
\n \n \"\"\n \n CNAME\n \n \n \n \n \n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n \n \n \n
\n \n \"\"\n \n License\n \n \n \n \n \n
\n \n \"\"\n \n README.md\n \n \n \n \n \n
\n \n \"\"\n \n package-lock.json\n \n \n \n \n \n
\n \n \"\"\n \n package.json\n \n \n \n \n \n
\n \n \"\"\n \n tsconfig.json\n \n \n \n \n \n
\n \n \"\"\n \n tslint.json\n \n \n \n \n \n
\n\n
\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n

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

\n

\"enqueuerlogo\"

\n

Want to ensure that a user journey which involves several steps with different protocols is working properly?\nHave you ever struggled with testing multi protocol flows?\nDepending services have become a pain?\nDon't you worry anymore. Enqueuer is what you're looking for.

\n

What it is

\n

It's not just an integration testing tool. It is a platform that provides the following capabilities:

\n
    \n
  • Support for many protocols out of the box
  • \n
  • Chainable message flows
  • \n
  • Easily mock numerous services to alleviate the headaches of functional and integration tests
  • \n
  • Friendly for developers and non developers
  • \n
  • Built in assertion library to verify response data coming from/going to your services
  • \n
  • Easily extensible behavior through third party plugins, including your own custom ones
  • \n
  • CLI is easy to add to your team's existing CI pipelines
  • \n
  • Act and react on your system under test
  • \n
  • Place tests front and center
  • \n
\n

Welcome to the enqueuer world.

\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 and hit it at the same time, you may ask. Not a big deal for enqueuer lovers:

\n
name: readme self-test\npublishers:\n-   type: http\n    url: http://localhost:9085/readme-example\n    method: POST\n    payload: does enqueuer rock?\n    onResponseReceived:\n        script: doubleStatus = statusCode * 2\n        assertions:\n            -   expect: body\n                toBeEqualTo: `mock response`\n            -   expect: doubleStatus\n                toBeGreaterThan: 300\nsubscriptions:\n-   type: http\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        -   name: failing test\n            expectToBeTruthy: false\n
\n

Note that the second subscription assertion is a failing one. By running this example, we get this:

\n
$ nqr http-self-test.yml\n   [FAIL]      readme self-test                                                   6 tests passing of 7 (85.71%) ran in 37ms\n   [FAIL] enqueuer                                                                6 tests passing of 7 (85.71%) ran in 42ms\n               enqueuer › readme self-test › mock endpoint › failing test\n                           Expecting 'false' to be true. Received: false\n
\n

I 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 \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n You signed in with another tab or window. Reload to refresh your session.\n You signed out in another tab or window. Reload to refresh your session.\n
\n \n\n
\n
\n
\n
\n\n
\n\n \n\n\n" headers: server: GitHub.com - date: 'Fri, 28 Jun 2019 01:19:02 GMT' + date: 'Sun, 30 Jun 2019 00:18:16 GMT' content-type: 'text/html; charset=utf-8' transfer-encoding: chunked connection: close status: '200 OK' vary: X-PJAX - etag: 'W/"799ef3b5cf218438c8dc7fe6aa05bde6"' + etag: 'W/"f0310deaf2418178213bdf4997b0ae71"' cache-control: 'max-age=0, private, must-revalidate' set-cookie: - - 'has_recent_activity=1; path=/; expires=Fri, 28 Jun 2019 02:19:02 -0000' - - '_octo=GH1.1.1750468231.1561684742; domain=.github.com; path=/; expires=Mon, 28 Jun 2021 01:19:02 -0000' - - 'logged_in=no; domain=.github.com; path=/; expires=Tue, 28 Jun 2039 01:19:02 -0000; secure; HttpOnly' - - '_gh_sess=ZGNYM3RqMWJTV3dNWWM3OTZ5TEUyM3F0di9MaHlFWGJVLzhZeDMyNlA4SlJaa1duS04vdDdIQnpabWMya2RwREYzY1ZSbnZhbTVVUEh0alIwWHNObjM5VFlSeDU3VGV4UjVnRHAveGtTZnppcjIySXNIaDJxSXZJR1c4eWFJSDRkc2s3Y1Yyd1doODY3bEFTc0ZSN3UyanloV3I5dXRiNmEyczNtcDhld0hrVDQyZ3BuNC9JU0ZhSWxiK2xweFc3eFRtSStyM0xMbnZ3RUxBVStiUDlXcGdMRTZtYm1aRVpqck52UGY0ZnozVmdmQjFtVllFQzJZRmdORHFOLzFOYnQvZ0ZoTmloOXBVSENFeEk0QmRPV2RuN1lhTXpGWkhwUDgwRG5jVTN0OU09LS1IL0hyZlpXWVN2UkNYaVRTQlk3VjVRPT0%3D--6c6c808d2801896f8af51a7abd7c027dc1f20ef6; path=/; secure; HttpOnly' - x-request-id: 93028cd0-d289-4106-aad0-7c685aa09310 + - 'has_recent_activity=1; path=/; expires=Sun, 30 Jun 2019 01:18:16 -0000' + - '_octo=GH1.1.428263756.1561853896; domain=.github.com; path=/; expires=Wed, 30 Jun 2021 00:18:16 -0000' + - 'logged_in=no; domain=.github.com; path=/; expires=Thu, 30 Jun 2039 00:18:16 -0000; secure; HttpOnly' + - '_gh_sess=U0VFTHgycENCaS82V1hPQWV1OXUvU0lIc1UyUFYrVnNRamYzRWJLY3ZCNnRVcW1sWmh0eVhyajhOVDFOMDJ6UGJUYmp0VGlURGhVQ0g2aFkvcUNTYkxSSDVjUUcxZVlYcGNZdGNmWHBuS2ZZL1pwdEMxUHhQdHJEMzFoYVRxMHdIU2hFaVVYRnBQRjJjNFhtWXM3TUR6WW84bDFvczJNeGFmUjc1Yi9DQldvQ21HUXlEUFUvQ0lpejZuMjZhL0NEVkhXU2J4VWpMaUlPeUVhYVhKb3VsRi81bTFRQnVtY1Vwb1hJRFNYOW8rWUdFSWdrb2lPZ1Zva1VjZnVzR3VPWDAwWXp4ZWg1NWxva1Y5a0VGWDBacDJUZktPV2lsdzBBTjhRc0pZdVhnVzg9LS1FbEk4RkphZlo0RHdSOGhDNmVORWdnPT0%3D--d5f3adc7ed0f812a5a08a7320547289a7a11e957; path=/; secure; HttpOnly' + x-request-id: 4f8f58e5-d42a-4025-9e4d-ba7376d6a438 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: '2583:7538:1DF64B:3644B1:5D156B05' + x-github-request-id: '24FF:617A:10588DB:1BE0580:5D17FFC7' request: uri: protocol: 'https:' @@ -3557,30 +4286,30 @@ 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 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\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 enqueuer-land/enqueuer\n \n\n

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

Join GitHub today

\n

GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.

\n Sign up\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\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 Find File\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
\n \n \"@lopidio\"\n
\n
\n\n
\n \n lopidio\n\n\n \n\n\n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n \n\n
…sher and subscription
\n
\n
\n Latest commit\n \n f6dcbb9\n \n Jun 25, 2019\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 refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n examples\n \n \n refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 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 feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n output\n \n \n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n src\n \n \n refactor(ProtocolDocumentation): Add type as attribute of every publi…\n \n \n Jun 25, 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 refactor(TestModel): Replace manual tests validation with testModelIs…\n \n \n Jun 25, 2019\n
\n \n \"\"\n \n package-lock.json\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 2019\n
\n \n \"\"\n \n package.json\n \n \n feat(Enqueuer): Generic hooks and protocols documentation\n \n \n Jun 24, 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 README.md\n

\n
\n
\n

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

\n

\"enqueuerlogo\"

\n

Want to ensure that a user journey which involves several steps with different protocols is working properly?\nHave you ever struggled with testing multi protocol flows?\nDepending services have become a pain?\nDon't you worry anymore. Enqueuer is what you're looking for.

\n

What it is

\n

It's not just an integration testing tool. It is a platform that provides the following capabilities:

\n
    \n
  • Support for many protocols out of the box
  • \n
  • Chainable message flows
  • \n
  • Easily mock numerous services to alleviate the headaches of functional and integration tests
  • \n
  • Friendly for developers and non developers
  • \n
  • Built in assertion library to verify response data coming from/going to your services
  • \n
  • Easily extensible behavior through third party plugins, including your own custom ones
  • \n
  • CLI is easy to add to your team's existing CI pipelines
  • \n
  • Act and react on your system under test
  • \n
  • Place tests front and center
  • \n
\n

Welcome to the enqueuer world.

\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 and hit it at the same time, you may ask. Not a big deal for enqueuer lovers:

\n
name: readme self-test\npublishers:\n-   type: http\n    url: http://localhost:9085/readme-example\n    method: POST\n    payload: does enqueuer rock?\n    onResponseReceived:\n        script: doubleStatus = statusCode * 2\n        assertions:\n            -   expect: body\n                toBeEqualTo: `mock response`\n            -   expect: doubleStatus\n                toBeGreaterThan: 300\nsubscriptions:\n-   type: http\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        -   name: failing test\n            expectToBeTruthy: false\n
\n

Note that the second subscription assertion is a failing one. By running this example, we get this:

\n
$ nqr http-self-test.yml\n   [FAIL]      readme self-test                                                   6 tests passing of 7 (85.71%) ran in 37ms\n   [FAIL] enqueuer                                                                6 tests passing of 7 (85.71%) ran in 42ms\n               enqueuer › readme self-test › mock endpoint › failing test\n                           Expecting 'false' to be true. Received: false\n
\n

I 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 \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n You signed in with another tab or window. Reload to refresh your session.\n You signed out in another tab or window. Reload to refresh your session.\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 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\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 enqueuer-land/enqueuer\n \n\n

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

Join GitHub today

\n

GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.

\n Sign up\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\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 Find File\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 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 \n \n \n
\n \n \"\"\n \n conf\n \n \n \n \n \n
\n \n \"\"\n \n docs\n \n \n \n \n \n
\n \n \"\"\n \n examples\n \n \n \n \n \n
\n \n \"\"\n \n https-cert\n \n \n \n \n \n
\n \n \"\"\n \n misc\n \n \n \n \n \n
\n \n \"\"\n \n output\n \n \n \n \n \n
\n \n \"\"\n \n src\n \n \n \n \n \n
\n \n \"\"\n \n temp\n \n \n \n \n \n
\n \n \"\"\n \n .codeclimate.yml\n \n \n \n \n \n
\n \n \"\"\n \n .gitignore\n \n \n \n \n \n
\n \n \"\"\n \n .npmignore\n \n \n \n \n \n
\n \n \"\"\n \n .travis.yml\n \n \n \n \n \n
\n \n \"\"\n \n CNAME\n \n \n \n \n \n
\n \n \"\"\n \n CONTRIBUTING.md\n \n \n \n \n \n
\n \n \"\"\n \n License\n \n \n \n \n \n
\n \n \"\"\n \n README.md\n \n \n \n \n \n
\n \n \"\"\n \n package-lock.json\n \n \n \n \n \n
\n \n \"\"\n \n package.json\n \n \n \n \n \n
\n \n \"\"\n \n tsconfig.json\n \n \n \n \n \n
\n \n \"\"\n \n tslint.json\n \n \n \n \n \n
\n\n
\n\n\n\n
\n
\n

\n \n README.md\n

\n
\n
\n

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

\n

\"enqueuerlogo\"

\n

Want to ensure that a user journey which involves several steps with different protocols is working properly?\nHave you ever struggled with testing multi protocol flows?\nDepending services have become a pain?\nDon't you worry anymore. Enqueuer is what you're looking for.

\n

What it is

\n

It's not just an integration testing tool. It is a platform that provides the following capabilities:

\n
    \n
  • Support for many protocols out of the box
  • \n
  • Chainable message flows
  • \n
  • Easily mock numerous services to alleviate the headaches of functional and integration tests
  • \n
  • Friendly for developers and non developers
  • \n
  • Built in assertion library to verify response data coming from/going to your services
  • \n
  • Easily extensible behavior through third party plugins, including your own custom ones
  • \n
  • CLI is easy to add to your team's existing CI pipelines
  • \n
  • Act and react on your system under test
  • \n
  • Place tests front and center
  • \n
\n

Welcome to the enqueuer world.

\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 and hit it at the same time, you may ask. Not a big deal for enqueuer lovers:

\n
name: readme self-test\npublishers:\n-   type: http\n    url: http://localhost:9085/readme-example\n    method: POST\n    payload: does enqueuer rock?\n    onResponseReceived:\n        script: doubleStatus = statusCode * 2\n        assertions:\n            -   expect: body\n                toBeEqualTo: `mock response`\n            -   expect: doubleStatus\n                toBeGreaterThan: 300\nsubscriptions:\n-   type: http\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        -   name: failing test\n            expectToBeTruthy: false\n
\n

Note that the second subscription assertion is a failing one. By running this example, we get this:

\n
$ nqr http-self-test.yml\n   [FAIL]      readme self-test                                                   6 tests passing of 7 (85.71%) ran in 37ms\n   [FAIL] enqueuer                                                                6 tests passing of 7 (85.71%) ran in 42ms\n               enqueuer › readme self-test › mock endpoint › failing test\n                           Expecting 'false' to be true. Received: false\n
\n

I 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 \n You can’t perform that action at this time.\n
\n\n\n \n \n \n \n \n \n \n
\n \n You signed in with another tab or window. Reload to refresh your session.\n You signed out in another tab or window. Reload to refresh your session.\n
\n \n\n
\n
\n
\n
\n\n
\n\n \n\n\n" headers: server: GitHub.com - date: 'Fri, 28 Jun 2019 01:19:02 GMT' + date: 'Sun, 30 Jun 2019 00:18:16 GMT' content-type: 'text/html; charset=utf-8' transfer-encoding: chunked connection: close status: '200 OK' vary: X-PJAX - etag: 'W/"799ef3b5cf218438c8dc7fe6aa05bde6"' + etag: 'W/"f0310deaf2418178213bdf4997b0ae71"' cache-control: 'max-age=0, private, must-revalidate' set-cookie: - - 'has_recent_activity=1; path=/; expires=Fri, 28 Jun 2019 02:19:02 -0000' - - '_octo=GH1.1.1750468231.1561684742; domain=.github.com; path=/; expires=Mon, 28 Jun 2021 01:19:02 -0000' - - 'logged_in=no; domain=.github.com; path=/; expires=Tue, 28 Jun 2039 01:19:02 -0000; secure; HttpOnly' - - '_gh_sess=ZGNYM3RqMWJTV3dNWWM3OTZ5TEUyM3F0di9MaHlFWGJVLzhZeDMyNlA4SlJaa1duS04vdDdIQnpabWMya2RwREYzY1ZSbnZhbTVVUEh0alIwWHNObjM5VFlSeDU3VGV4UjVnRHAveGtTZnppcjIySXNIaDJxSXZJR1c4eWFJSDRkc2s3Y1Yyd1doODY3bEFTc0ZSN3UyanloV3I5dXRiNmEyczNtcDhld0hrVDQyZ3BuNC9JU0ZhSWxiK2xweFc3eFRtSStyM0xMbnZ3RUxBVStiUDlXcGdMRTZtYm1aRVpqck52UGY0ZnozVmdmQjFtVllFQzJZRmdORHFOLzFOYnQvZ0ZoTmloOXBVSENFeEk0QmRPV2RuN1lhTXpGWkhwUDgwRG5jVTN0OU09LS1IL0hyZlpXWVN2UkNYaVRTQlk3VjVRPT0%3D--6c6c808d2801896f8af51a7abd7c027dc1f20ef6; path=/; secure; HttpOnly' - x-request-id: 93028cd0-d289-4106-aad0-7c685aa09310 + - 'has_recent_activity=1; path=/; expires=Sun, 30 Jun 2019 01:18:16 -0000' + - '_octo=GH1.1.428263756.1561853896; domain=.github.com; path=/; expires=Wed, 30 Jun 2021 00:18:16 -0000' + - 'logged_in=no; domain=.github.com; path=/; expires=Thu, 30 Jun 2039 00:18:16 -0000; secure; HttpOnly' + - '_gh_sess=U0VFTHgycENCaS82V1hPQWV1OXUvU0lIc1UyUFYrVnNRamYzRWJLY3ZCNnRVcW1sWmh0eVhyajhOVDFOMDJ6UGJUYmp0VGlURGhVQ0g2aFkvcUNTYkxSSDVjUUcxZVlYcGNZdGNmWHBuS2ZZL1pwdEMxUHhQdHJEMzFoYVRxMHdIU2hFaVVYRnBQRjJjNFhtWXM3TUR6WW84bDFvczJNeGFmUjc1Yi9DQldvQ21HUXlEUFUvQ0lpejZuMjZhL0NEVkhXU2J4VWpMaUlPeUVhYVhKb3VsRi81bTFRQnVtY1Vwb1hJRFNYOW8rWUdFSWdrb2lPZ1Zva1VjZnVzR3VPWDAwWXp4ZWg1NWxva1Y5a0VGWDBacDJUZktPV2lsdzBBTjhRc0pZdVhnVzg9LS1FbEk4RkphZlo0RHdSOGhDNmVORWdnPT0%3D--d5f3adc7ed0f812a5a08a7320547289a7a11e957; path=/; secure; HttpOnly' + x-request-id: 4f8f58e5-d42a-4025-9e4d-ba7376d6a438 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: '2583:7538:1DF64B:3644B1:5D156B05' + x-github-request-id: '24FF:617A:10588DB:1BE0580:5D17FFC7' request: uri: protocol: 'https:' @@ -3601,7 +4330,9 @@ requisitions: tests: [] valid: true type: http - publishTime: '2019-06-28T01:18:58.340Z' + publishTime: '2019-06-30T00:18:11.739Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3612,22 +4343,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1664 + elapsedTime: 1696 time: - startTime: '2019-06-28T01:18:56.676Z' - endTime: '2019-06-28T01:18:58.340Z' - totalTime: 1664 + startTime: '2019-06-30T00:18:10.043Z' + endTime: '2019-06-30T00:18:11.739Z' + totalTime: 1696 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/recursion.yml - id: 2218560600_00da84a874_506195 + id: 2118090950_00da84a874_504375 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3638,20 +4369,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 127 + elapsedTime: 110 time: - startTime: '2019-06-28T01:18:56.676Z' - endTime: '2019-06-28T01:18:56.803Z' - totalTime: 127 + startTime: '2019-06-30T00:18:10.044Z' + endTime: '2019-06-30T00:18:10.154Z' + totalTime: 110 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560600_75977bc4c1_92542 + id: 2118090950_75977bc4c1_77647 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -3662,22 +4395,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 46 + elapsedTime: 40 time: - startTime: '2019-06-28T01:18:56.694Z' - endTime: '2019-06-28T01:18:56.741Z' - totalTime: 47 + startTime: '2019-06-30T00:18:10.064Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 41 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560601_e87d17a22e_991433 + id: 2118090951_e87d17a22e_292753 level: 2 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3688,20 +4421,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 29 + elapsedTime: 26 time: - startTime: '2019-06-28T01:18:56.747Z' - endTime: '2019-06-28T01:18:56.776Z' - totalTime: 29 + startTime: '2019-06-30T00:18:10.110Z' + endTime: '2019-06-30T00:18:10.136Z' + totalTime: 26 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_55233c1965_85585 + id: 2118090951_55233c1965_627366 level: 3 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3712,20 +4447,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 20 + elapsedTime: 17 time: - startTime: '2019-06-28T01:18:56.749Z' - endTime: '2019-06-28T01:18:56.769Z' - totalTime: 20 + startTime: '2019-06-30T00:18:10.113Z' + endTime: '2019-06-30T00:18:10.130Z' + totalTime: 17 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3736,22 +4473,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 3 time: - startTime: '2019-06-28T01:18:56.749Z' - endTime: '2019-06-28T01:18:56.751Z' - totalTime: 2 + startTime: '2019-06-30T00:18:10.117Z' + endTime: '2019-06-30T00:18:10.120Z' + totalTime: 3 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3762,22 +4499,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 5 + elapsedTime: 2 time: - startTime: '2019-06-28T01:18:56.760Z' - endTime: '2019-06-28T01:18:56.766Z' - totalTime: 6 + startTime: '2019-06-30T00:18:10.123Z' + endTime: '2019-06-30T00:18:10.126Z' + totalTime: 3 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3788,24 +4525,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.767Z' - endTime: '2019-06-28T01:18:56.768Z' + startTime: '2019-06-30T00:18:10.128Z' + endTime: '2019-06-30T00:18:10.129Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 3 - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_55233c1965_85585 + id: 2118090951_55233c1965_627366 level: 3 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3818,18 +4553,20 @@ requisitions: arguments: elapsedTime: 4 time: - startTime: '2019-06-28T01:18:56.769Z' - endTime: '2019-06-28T01:18:56.773Z' + startTime: '2019-06-30T00:18:10.130Z' + endTime: '2019-06-30T00:18:10.134Z' totalTime: 4 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3840,22 +4577,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.769Z' - endTime: '2019-06-28T01:18:56.770Z' - totalTime: 1 + startTime: '2019-06-30T00:18:10.131Z' + endTime: '2019-06-30T00:18:10.131Z' + totalTime: 0 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3866,22 +4603,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.770Z' - endTime: '2019-06-28T01:18:56.771Z' - totalTime: 1 + startTime: '2019-06-30T00:18:10.132Z' + endTime: '2019-06-30T00:18:10.132Z' + totalTime: 0 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3894,22 +4631,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.772Z' - endTime: '2019-06-28T01:18:56.772Z' + startTime: '2019-06-30T00:18:10.133Z' + endTime: '2019-06-30T00:18:10.133Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 3 - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_55233c1965_85585 + id: 2118090951_55233c1965_627366 level: 3 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3922,18 +4657,20 @@ requisitions: arguments: elapsedTime: 2 time: - startTime: '2019-06-28T01:18:56.774Z' - endTime: '2019-06-28T01:18:56.776Z' + startTime: '2019-06-30T00:18:10.134Z' + endTime: '2019-06-30T00:18:10.136Z' totalTime: 2 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3944,22 +4681,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.774Z' - endTime: '2019-06-28T01:18:56.774Z' - totalTime: 0 + startTime: '2019-06-30T00:18:10.134Z' + endTime: '2019-06-30T00:18:10.135Z' + totalTime: 1 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3970,22 +4707,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.775Z' - endTime: '2019-06-28T01:18:56.775Z' - totalTime: 0 + startTime: '2019-06-30T00:18:10.135Z' + endTime: '2019-06-30T00:18:10.136Z' + totalTime: 1 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -3998,24 +4735,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.775Z' - endTime: '2019-06-28T01:18:56.775Z' + startTime: '2019-06-30T00:18:10.136Z' + endTime: '2019-06-30T00:18:10.136Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 3 - iteration: 2 - totalIterations: 3 - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #1' - id: 2218560601_e87d17a22e_991433 + id: 2118090951_e87d17a22e_292753 level: 2 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4026,20 +4759,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 19 + elapsedTime: 11 time: - startTime: '2019-06-28T01:18:56.776Z' - endTime: '2019-06-28T01:18:56.795Z' - totalTime: 19 + startTime: '2019-06-30T00:18:10.136Z' + endTime: '2019-06-30T00:18:10.147Z' + totalTime: 11 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_55233c1965_85585 + id: 2118090951_55233c1965_627366 level: 3 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4050,20 +4785,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 3 + elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.776Z' - endTime: '2019-06-28T01:18:56.779Z' - totalTime: 3 + startTime: '2019-06-30T00:18:10.137Z' + endTime: '2019-06-30T00:18:10.138Z' + totalTime: 1 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4074,22 +4811,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.776Z' - endTime: '2019-06-28T01:18:56.777Z' - totalTime: 1 + startTime: '2019-06-30T00:18:10.137Z' + endTime: '2019-06-30T00:18:10.137Z' + totalTime: 0 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4102,20 +4839,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.777Z' - endTime: '2019-06-28T01:18:56.777Z' + startTime: '2019-06-30T00:18:10.137Z' + endTime: '2019-06-30T00:18:10.137Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4126,24 +4863,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.777Z' - endTime: '2019-06-28T01:18:56.778Z' - totalTime: 1 + startTime: '2019-06-30T00:18:10.138Z' + endTime: '2019-06-30T00:18:10.138Z' + totalTime: 0 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 3 - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_55233c1965_85585 + id: 2118090951_55233c1965_627366 level: 3 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4154,20 +4889,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 9 + elapsedTime: 6 time: - startTime: '2019-06-28T01:18:56.780Z' - endTime: '2019-06-28T01:18:56.789Z' - totalTime: 9 + startTime: '2019-06-30T00:18:10.139Z' + endTime: '2019-06-30T00:18:10.145Z' + totalTime: 6 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4180,46 +4917,46 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.783Z' - endTime: '2019-06-28T01:18:56.784Z' + startTime: '2019-06-30T00:18:10.140Z' + endTime: '2019-06-30T00:18:10.141Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 onFinish: valid: true tests: [] arguments: elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.786Z' - endTime: '2019-06-28T01:18:56.788Z' - totalTime: 2 + startTime: '2019-06-30T00:18:10.142Z' + endTime: '2019-06-30T00:18:10.143Z' + totalTime: 1 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4232,22 +4969,20 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.788Z' - endTime: '2019-06-28T01:18:56.789Z' + startTime: '2019-06-30T00:18:10.144Z' + endTime: '2019-06-30T00:18:10.145Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 3 - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_55233c1965_85585 + id: 2118090951_55233c1965_627366 level: 3 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4258,20 +4993,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 5 + elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.790Z' - endTime: '2019-06-28T01:18:56.795Z' - totalTime: 5 + startTime: '2019-06-30T00:18:10.146Z' + endTime: '2019-06-30T00:18:10.147Z' + totalTime: 1 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4284,20 +5021,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.791Z' - endTime: '2019-06-28T01:18:56.791Z' + startTime: '2019-06-30T00:18:10.146Z' + endTime: '2019-06-30T00:18:10.146Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4310,20 +5047,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.792Z' - endTime: '2019-06-28T01:18:56.792Z' + startTime: '2019-06-30T00:18:10.146Z' + endTime: '2019-06-30T00:18:10.146Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4336,24 +5073,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.794Z' - endTime: '2019-06-28T01:18:56.795Z' - totalTime: 1 + startTime: '2019-06-30T00:18:10.147Z' + endTime: '2019-06-30T00:18:10.147Z' + totalTime: 0 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 3 - iteration: 2 - totalIterations: 3 - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #1' - id: 2218560601_e87d17a22e_991433 + id: 2118090951_e87d17a22e_292753 level: 2 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4364,20 +5097,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 7 + elapsedTime: 5 time: - startTime: '2019-06-28T01:18:56.795Z' - endTime: '2019-06-28T01:18:56.802Z' - totalTime: 7 + startTime: '2019-06-30T00:18:10.148Z' + endTime: '2019-06-30T00:18:10.153Z' + totalTime: 5 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_55233c1965_85585 + id: 2118090951_55233c1965_627366 level: 3 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4388,20 +5123,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2 + elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.796Z' - endTime: '2019-06-28T01:18:56.798Z' - totalTime: 2 + startTime: '2019-06-30T00:18:10.148Z' + endTime: '2019-06-30T00:18:10.149Z' + totalTime: 1 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4414,20 +5151,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.796Z' - endTime: '2019-06-28T01:18:56.797Z' + startTime: '2019-06-30T00:18:10.148Z' + endTime: '2019-06-30T00:18:10.149Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4440,20 +5177,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.797Z' - endTime: '2019-06-28T01:18:56.797Z' + startTime: '2019-06-30T00:18:10.149Z' + endTime: '2019-06-30T00:18:10.149Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4466,22 +5203,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.797Z' - endTime: '2019-06-28T01:18:56.797Z' + startTime: '2019-06-30T00:18:10.149Z' + endTime: '2019-06-30T00:18:10.149Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 3 - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_55233c1965_85585 + id: 2118090951_55233c1965_627366 level: 3 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4494,18 +5229,20 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.798Z' - endTime: '2019-06-28T01:18:56.800Z' - totalTime: 2 + startTime: '2019-06-30T00:18:10.150Z' + endTime: '2019-06-30T00:18:10.151Z' + totalTime: 1 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4518,20 +5255,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.798Z' - endTime: '2019-06-28T01:18:56.798Z' + startTime: '2019-06-30T00:18:10.150Z' + endTime: '2019-06-30T00:18:10.150Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4544,20 +5281,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.799Z' - endTime: '2019-06-28T01:18:56.799Z' + startTime: '2019-06-30T00:18:10.150Z' + endTime: '2019-06-30T00:18:10.150Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4570,22 +5307,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.799Z' - endTime: '2019-06-28T01:18:56.799Z' + startTime: '2019-06-30T00:18:10.151Z' + endTime: '2019-06-30T00:18:10.151Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 3 - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_55233c1965_85585 + id: 2118090951_55233c1965_627366 level: 3 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4598,18 +5333,20 @@ requisitions: arguments: elapsedTime: 2 time: - startTime: '2019-06-28T01:18:56.800Z' - endTime: '2019-06-28T01:18:56.802Z' + startTime: '2019-06-30T00:18:10.151Z' + endTime: '2019-06-30T00:18:10.153Z' totalTime: 2 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4622,20 +5359,20 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.800Z' - endTime: '2019-06-28T01:18:56.801Z' + startTime: '2019-06-30T00:18:10.151Z' + endTime: '2019-06-30T00:18:10.152Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4648,20 +5385,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.801Z' - endTime: '2019-06-28T01:18:56.801Z' + startTime: '2019-06-30T00:18:10.152Z' + endTime: '2019-06-30T00:18:10.152Z' totalTime: 0 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 3 - valid: true name: 'Requisition #0' - id: 2218560601_5e02f9345e_385629 + id: 2118090951_5e02f9345e_386464 level: 4 subscriptions: [] publishers: [] + iterations: 3 + totalIterations: 3 hooks: onInit: valid: true @@ -4672,26 +5409,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.801Z' - endTime: '2019-06-28T01:18:56.802Z' - totalTime: 1 + startTime: '2019-06-30T00:18:10.153Z' + endTime: '2019-06-30T00:18:10.153Z' + totalTime: 0 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 3 - iteration: 2 - totalIterations: 3 - iteration: 2 - totalIterations: 3 - valid: true name: 'Requisition #2' - id: 2218560601_aef615856f_715834 + id: 2118090951_aef615856f_935764 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -4706,24 +5439,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.802Z' - endTime: '2019-06-28T01:18:56.803Z' - totalTime: 1 + startTime: '2019-06-30T00:18:10.154Z' + endTime: '2019-06-30T00:18:10.154Z' + totalTime: 0 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/requisition-delay-iterations.yml - id: 2218560601_8e102bb4f5_708138 + id: 2118090951_8e102bb4f5_480365 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -4734,20 +5465,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 3100 + elapsedTime: 3095 time: - startTime: '2019-06-28T01:18:56.677Z' - endTime: '2019-06-28T01:18:59.777Z' - totalTime: 3100 + startTime: '2019-06-30T00:18:10.044Z' + endTime: '2019-06-30T00:18:13.139Z' + totalTime: 3095 timeout: 5000 requisitions: - valid: true name: iterations - id: 2218560601_b4f515b70d_748144 + id: 2118090951_b4f515b70d_514808 level: 2 subscriptions: [] publishers: [] + iterations: 10 + totalIterations: 10 hooks: onInit: valid: true @@ -4758,22 +5491,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 46 + elapsedTime: 40 time: - startTime: '2019-06-28T01:18:56.694Z' - endTime: '2019-06-28T01:18:56.741Z' - totalTime: 47 + startTime: '2019-06-30T00:18:10.064Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 41 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 10 - valid: true name: iterations - id: 2218560601_b4f515b70d_748144 + id: 2118090951_b4f515b70d_514808 level: 2 subscriptions: [] publishers: [] + iterations: 10 + totalIterations: 10 hooks: onInit: valid: true @@ -4784,48 +5517,48 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 5 + elapsedTime: 9 time: - startTime: '2019-06-28T01:18:56.744Z' - endTime: '2019-06-28T01:18:56.750Z' - totalTime: 6 + startTime: '2019-06-30T00:18:10.108Z' + endTime: '2019-06-30T00:18:10.117Z' + totalTime: 9 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 10 - valid: true name: iterations - id: 2218560601_b4f515b70d_748144 + id: 2118090951_b4f515b70d_514808 level: 2 subscriptions: [] publishers: [] + iterations: 10 + totalIterations: 10 hooks: onInit: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 onFinish: valid: true tests: [] arguments: - elapsedTime: 12 + elapsedTime: 4 time: - startTime: '2019-06-28T01:18:56.750Z' - endTime: '2019-06-28T01:18:56.764Z' - totalTime: 14 + startTime: '2019-06-30T00:18:10.120Z' + endTime: '2019-06-30T00:18:10.124Z' + totalTime: 4 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 10 - valid: true name: iterations - id: 2218560601_b4f515b70d_748144 + id: 2118090951_b4f515b70d_514808 level: 2 subscriptions: [] publishers: [] + iterations: 10 + totalIterations: 10 hooks: onInit: valid: true @@ -4836,22 +5569,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2 + elapsedTime: 3 time: - startTime: '2019-06-28T01:18:56.765Z' - endTime: '2019-06-28T01:18:56.767Z' - totalTime: 2 + startTime: '2019-06-30T00:18:10.125Z' + endTime: '2019-06-30T00:18:10.129Z' + totalTime: 4 timeout: 5000 requisitions: [] - iteration: 3 - totalIterations: 10 - valid: true name: iterations - id: 2218560601_b4f515b70d_748144 + id: 2118090951_b4f515b70d_514808 level: 2 subscriptions: [] publishers: [] + iterations: 10 + totalIterations: 10 hooks: onInit: valid: true @@ -4862,48 +5595,48 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.768Z' - endTime: '2019-06-28T01:18:56.768Z' - totalTime: 0 + startTime: '2019-06-30T00:18:10.129Z' + endTime: '2019-06-30T00:18:10.130Z' + totalTime: 1 timeout: 5000 requisitions: [] - iteration: 4 - totalIterations: 10 - valid: true name: iterations - id: 2218560601_b4f515b70d_748144 + id: 2118090951_b4f515b70d_514808 level: 2 subscriptions: [] publishers: [] + iterations: 10 + totalIterations: 10 hooks: onInit: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 onFinish: valid: true tests: [] arguments: - elapsedTime: 2 + elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.768Z' - endTime: '2019-06-28T01:18:56.770Z' - totalTime: 2 + startTime: '2019-06-30T00:18:10.130Z' + endTime: '2019-06-30T00:18:10.131Z' + totalTime: 1 timeout: 5000 requisitions: [] - iteration: 5 - totalIterations: 10 - valid: true name: iterations - id: 2218560601_b4f515b70d_748144 + id: 2118090951_b4f515b70d_514808 level: 2 subscriptions: [] publishers: [] + iterations: 10 + totalIterations: 10 hooks: onInit: valid: true @@ -4914,22 +5647,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.770Z' - endTime: '2019-06-28T01:18:56.771Z' + startTime: '2019-06-30T00:18:10.131Z' + endTime: '2019-06-30T00:18:10.132Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 6 - totalIterations: 10 - valid: true name: iterations - id: 2218560601_b4f515b70d_748144 + id: 2118090951_b4f515b70d_514808 level: 2 subscriptions: [] publishers: [] + iterations: 10 + totalIterations: 10 hooks: onInit: valid: true @@ -4942,20 +5675,20 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.771Z' - endTime: '2019-06-28T01:18:56.772Z' + startTime: '2019-06-30T00:18:10.132Z' + endTime: '2019-06-30T00:18:10.133Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 7 - totalIterations: 10 - valid: true name: iterations - id: 2218560601_b4f515b70d_748144 + id: 2118090951_b4f515b70d_514808 level: 2 subscriptions: [] publishers: [] + iterations: 10 + totalIterations: 10 hooks: onInit: valid: true @@ -4966,22 +5699,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.772Z' - endTime: '2019-06-28T01:18:56.773Z' - totalTime: 1 + startTime: '2019-06-30T00:18:10.133Z' + endTime: '2019-06-30T00:18:10.133Z' + totalTime: 0 timeout: 5000 requisitions: [] - iteration: 8 - totalIterations: 10 - valid: true name: iterations - id: 2218560601_b4f515b70d_748144 + id: 2118090951_b4f515b70d_514808 level: 2 subscriptions: [] publishers: [] + iterations: 10 + totalIterations: 10 hooks: onInit: valid: true @@ -4992,22 +5725,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.773Z' - endTime: '2019-06-28T01:18:56.774Z' + startTime: '2019-06-30T00:18:10.134Z' + endTime: '2019-06-30T00:18:10.135Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 9 - totalIterations: 10 - valid: true name: delayed - id: 2218560601_ce1438bac6_340099 + id: 2118090951_ce1438bac6_563430 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5028,26 +5761,24 @@ requisitions: - 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 ''3004''' arguments: elapsedTime: 3003 time: - startTime: '2019-06-28T01:18:56.774Z' - endTime: '2019-06-28T01:18:59.777Z' - totalTime: 3003 + startTime: '2019-06-30T00:18:10.135Z' + endTime: '2019-06-30T00:18:13.139Z' + totalTime: 3004 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/skipped.yml - id: 2218560601_bb333e1dde_196190 + id: 2118090951_bb333e1dde_310345 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5058,20 +5789,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 97 + elapsedTime: 89 time: - startTime: '2019-06-28T01:18:56.678Z' - endTime: '2019-06-28T01:18:56.775Z' - totalTime: 97 + startTime: '2019-06-30T00:18:10.046Z' + endTime: '2019-06-30T00:18:10.135Z' + totalTime: 89 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_fc4b0751bf_989115 + id: 2118090951_fc4b0751bf_478387 level: 2 subscriptions: [] publishers: [] + iterations: 5 + totalIterations: 5 hooks: onInit: valid: true @@ -5082,22 +5815,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 46 + elapsedTime: 39 time: - startTime: '2019-06-28T01:18:56.694Z' - endTime: '2019-06-28T01:18:56.741Z' - totalTime: 47 + startTime: '2019-06-30T00:18:10.065Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 40 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 5 - valid: true name: 'Requisition #0' - id: 2218560601_fc4b0751bf_989115 + id: 2118090951_fc4b0751bf_478387 level: 2 subscriptions: [] publishers: [] + iterations: 5 + totalIterations: 5 hooks: onInit: valid: true @@ -5108,22 +5841,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 6 + elapsedTime: 9 time: - startTime: '2019-06-28T01:18:56.744Z' - endTime: '2019-06-28T01:18:56.750Z' - totalTime: 6 + startTime: '2019-06-30T00:18:10.108Z' + endTime: '2019-06-30T00:18:10.117Z' + totalTime: 9 timeout: 5000 requisitions: [] - iteration: 1 - totalIterations: 5 - valid: true name: 'Requisition #0' - id: 2218560601_fc4b0751bf_989115 + id: 2118090951_fc4b0751bf_478387 level: 2 subscriptions: [] publishers: [] + iterations: 5 + totalIterations: 5 hooks: onInit: valid: true @@ -5134,22 +5867,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 11 + elapsedTime: 4 time: - startTime: '2019-06-28T01:18:56.751Z' - endTime: '2019-06-28T01:18:56.764Z' - totalTime: 13 + startTime: '2019-06-30T00:18:10.120Z' + endTime: '2019-06-30T00:18:10.124Z' + totalTime: 4 timeout: 5000 requisitions: [] - iteration: 2 - totalIterations: 5 - valid: true name: 'Requisition #0' - id: 2218560601_fc4b0751bf_989115 + id: 2118090951_fc4b0751bf_478387 level: 2 subscriptions: [] publishers: [] + iterations: 5 + totalIterations: 5 hooks: onInit: valid: true @@ -5160,22 +5893,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 2 time: - startTime: '2019-06-28T01:18:56.766Z' - endTime: '2019-06-28T01:18:56.767Z' - totalTime: 1 + startTime: '2019-06-30T00:18:10.126Z' + endTime: '2019-06-30T00:18:10.129Z' + totalTime: 3 timeout: 5000 requisitions: [] - iteration: 3 - totalIterations: 5 - valid: true name: 'Requisition #0' - id: 2218560601_fc4b0751bf_989115 + id: 2118090951_fc4b0751bf_478387 level: 2 subscriptions: [] publishers: [] + iterations: 5 + totalIterations: 5 hooks: onInit: valid: true @@ -5186,22 +5919,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.768Z' - endTime: '2019-06-28T01:18:56.768Z' - totalTime: 0 + startTime: '2019-06-30T00:18:10.129Z' + endTime: '2019-06-30T00:18:10.130Z' + totalTime: 1 timeout: 5000 requisitions: [] - iteration: 4 - totalIterations: 5 - valid: true name: 'Requisition #1' - id: 2218560601_0813922659_288494 + id: 2118090951_0813922659_146681 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5218,20 +5951,19 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.769Z' - endTime: '2019-06-28T01:18:56.770Z' + startTime: '2019-06-30T00:18:10.130Z' + endTime: '2019-06-30T00:18:10.131Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #2' - id: 2218560601_38e558917b_330775 + id: 2118090951_38e558917b_866823 level: 2 subscriptions: [] publishers: [] + iterations: '1 === 0' hooks: onInit: arguments: {} @@ -5246,17 +5978,18 @@ requisitions: name: 'Requisition skipped' description: 'There is no iterations set to this requisition' time: - startTime: '2019-06-28T01:18:56.770Z' - endTime: '2019-06-28T01:18:56.770Z' + startTime: '2019-06-30T00:18:10.131Z' + endTime: '2019-06-30T00:18:10.131Z' totalTime: 0 requisitions: [] - valid: true name: 'Requisition #3' - id: 2218560601_4aa5c78448_656851 + id: 2118090951_4aa5c78448_832936 level: 2 subscriptions: [] publishers: [] + iterations: -1 hooks: onInit: arguments: {} @@ -5271,17 +6004,18 @@ requisitions: name: 'Requisition skipped' description: 'There is no iterations set to this requisition' time: - startTime: '2019-06-28T01:18:56.770Z' - endTime: '2019-06-28T01:18:56.770Z' + startTime: '2019-06-30T00:18:10.132Z' + endTime: '2019-06-30T00:18:10.132Z' totalTime: 0 requisitions: [] - valid: true name: 'Requisition #4' - id: 2218560601_6ac450666c_575300 + id: 2118090951_6ac450666c_22847 level: 2 subscriptions: [] publishers: [] + iterations: 0 hooks: onInit: arguments: {} @@ -5296,17 +6030,19 @@ requisitions: name: 'Requisition skipped' description: 'There is no iterations set to this requisition' time: - startTime: '2019-06-28T01:18:56.771Z' - endTime: '2019-06-28T01:18:56.771Z' + startTime: '2019-06-30T00:18:10.132Z' + endTime: '2019-06-30T00:18:10.132Z' totalTime: 0 requisitions: [] - valid: true name: 'Requisition #5' - id: 2218560601_23f493719b_269781 + id: 2118090951_23f493719b_365359 level: 2 subscriptions: [] publishers: [] + iterations: '`1`' + totalIterations: '1' hooks: onInit: valid: true @@ -5323,20 +6059,20 @@ requisitions: arguments: elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.771Z' - endTime: '2019-06-28T01:18:56.772Z' + startTime: '2019-06-30T00:18:10.132Z' + endTime: '2019-06-30T00:18:10.133Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: '1' - valid: true name: 'Requisition #6' - id: 2218560601_f9b72d5147_114317 + id: 2118090951_f9b72d5147_49850 level: 2 subscriptions: [] publishers: [] + iterations: '1 === 1' + totalIterations: 1 hooks: onInit: valid: true @@ -5347,22 +6083,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1 + elapsedTime: 0 time: - startTime: '2019-06-28T01:18:56.772Z' - endTime: '2019-06-28T01:18:56.773Z' - totalTime: 1 + startTime: '2019-06-30T00:18:10.133Z' + endTime: '2019-06-30T00:18:10.133Z' + totalTime: 0 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #7' - id: 2218560601_b41f5d915d_351575 + id: 2118090951_b41f5d915d_813749 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5379,22 +6115,20 @@ requisitions: arguments: elapsedTime: 1 time: - startTime: '2019-06-28T01:18:56.773Z' - endTime: '2019-06-28T01:18:56.774Z' + startTime: '2019-06-30T00:18:10.134Z' + endTime: '2019-06-30T00:18:10.135Z' totalTime: 1 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/ssl.yml - id: 2218560601_fbc833de59_633819 + id: 2118090951_fbc833de59_406380 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5405,21 +6139,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 4307 + elapsedTime: 4286 time: - startTime: '2019-06-28T01:18:56.680Z' - endTime: '2019-06-28T01:19:00.987Z' - totalTime: 4307 + startTime: '2019-06-30T00:18:10.048Z' + endTime: '2019-06-30T00:18:14.334Z' + totalTime: 4286 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560601_ec6b6289cc_929074 + id: 2118090951_ec6b6289cc_191475 level: 2 subscriptions: - - id: 2218560602_d5884fd0ec_364329 + id: 2118090952_d5884fd0ec_85068 name: 'Subscription #0' type: ssl hooks: @@ -5436,7 +6170,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 2282 + elapsedTime: 2264 onMessageReceived: valid: true tests: @@ -5450,12 +6184,12 @@ requisitions: address: '::ffff:127.0.0.1' family: IPv6 port: 23082 - elapsedTime: 277 + elapsedTime: 261 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560602_e063362e26_491205 + id: 2118090951_e063362e26_430574 name: 'Publisher #0' valid: true hooks: @@ -5466,7 +6200,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 2283 + elapsedTime: 2264 tests: - name: Published @@ -5479,8 +6213,8 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 52605 - elapsedTime: 4293 + port: 52957 + elapsedTime: 4269 tests: - name: 'Assertion #0' @@ -5488,7 +6222,9 @@ requisitions: description: 'Expected ''payload'' to be equal to ''hisecureResponse''. Received ''hisecureResponse''' valid: true type: ssl - publishTime: '2019-06-28T01:18:58.977Z' + publishTime: '2019-06-30T00:18:12.330Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5499,23 +6235,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2282 + elapsedTime: 2264 time: - startTime: '2019-06-28T01:18:56.695Z' - endTime: '2019-06-28T01:18:58.978Z' - totalTime: 2283 + startTime: '2019-06-30T00:18:10.066Z' + endTime: '2019-06-30T00:18:12.330Z' + totalTime: 2264 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560602_c8e796a6f7_784560 + id: 2118090952_c8e796a6f7_3941 level: 2 subscriptions: - - id: 2218560602_464eaccac3_791648 + id: 2118090952_464eaccac3_530146 name: 'Subscription #0' type: ssl hooks: @@ -5532,7 +6266,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 2007 + elapsedTime: 2003 onMessageReceived: valid: true tests: @@ -5548,10 +6282,10 @@ requisitions: port: 23082 elapsedTime: 1 valid: true - subscriptionTime: '2019-06-28T01:18:58.980Z' + subscriptionTime: '2019-06-30T00:18:12.331Z' publishers: - - id: 2218560602_26f6887fe6_238931 + id: 2118090952_26f6887fe6_184899 name: 'Publisher #0' valid: true hooks: @@ -5562,7 +6296,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 2007 + elapsedTime: 2003 tests: - name: Published @@ -5575,8 +6309,8 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 52605 - elapsedTime: 2009 + port: 52957 + elapsedTime: 2004 tests: - name: 'Assertion #0' @@ -5584,7 +6318,9 @@ requisitions: description: 'Expected ''payload'' to be equal to ''reusingSecureResponse''. Received ''reusingSecureResponse''' valid: true type: ssl - publishTime: '2019-06-28T01:19:00.986Z' + publishTime: '2019-06-30T00:18:14.333Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5595,21 +6331,17 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2007 + elapsedTime: 2003 time: - startTime: '2019-06-28T01:18:58.979Z' - endTime: '2019-06-28T01:19:00.986Z' - totalTime: 2007 + startTime: '2019-06-30T00:18:12.331Z' + endTime: '2019-06-30T00:18:14.334Z' + totalTime: 2003 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/stdin.yml - id: 2218560602_ae6c8a1714_699312 + id: 2118090952_ae6c8a1714_245163 level: 1 subscriptions: - @@ -5630,7 +6362,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 191 + elapsedTime: 182 onMessageReceived: valid: true tests: @@ -5640,10 +6372,12 @@ requisitions: description: 'Expected ''message'' to be equal to ''enqueuer standard-input payload''. Received ''enqueuer standard-input payload''' arguments: message: 'enqueuer standard-input payload' - elapsedTime: 190 + elapsedTime: 181 valid: true - subscriptionTime: '2019-06-28T01:18:56.726Z' + subscriptionTime: '2019-06-30T00:18:10.096Z' publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5654,22 +6388,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 191 + elapsedTime: 182 time: - startTime: '2019-06-28T01:18:56.680Z' - endTime: '2019-06-28T01:18:56.871Z' - totalTime: 191 + startTime: '2019-06-30T00:18:10.048Z' + endTime: '2019-06-30T00:18:10.231Z' + totalTime: 183 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/store.yml - id: 2218560602_7b9aa96592_490144 + id: 2118090952_7b9aa96592_971877 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5680,20 +6414,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 87 + elapsedTime: 80 time: - startTime: '2019-06-28T01:18:56.681Z' - endTime: '2019-06-28T01:18:56.768Z' - totalTime: 87 + startTime: '2019-06-30T00:18:10.049Z' + endTime: '2019-06-30T00:18:10.129Z' + totalTime: 80 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560602_478dfcaed5_781437 + id: 2118090952_478dfcaed5_53909 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5704,22 +6440,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 45 + elapsedTime: 38 time: - startTime: '2019-06-28T01:18:56.695Z' - endTime: '2019-06-28T01:18:56.741Z' - totalTime: 46 + startTime: '2019-06-30T00:18:10.066Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 39 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560602_c96621cca9_562924 + id: 2118090952_c96621cca9_303154 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5738,22 +6474,22 @@ requisitions: valid: true description: 'Expecting ''store.PATH'' to be defined' arguments: - elapsedTime: 3 + elapsedTime: 8 time: - startTime: '2019-06-28T01:18:56.747Z' - endTime: '2019-06-28T01:18:56.750Z' - totalTime: 3 + startTime: '2019-06-30T00:18:10.110Z' + endTime: '2019-06-30T00:18:10.118Z' + totalTime: 8 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #2' - id: 2218560602_05a830b0a8_869052 + id: 2118090952_05a830b0a8_369443 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5768,49 +6504,47 @@ requisitions: valid: true description: 'Expected ''124'' to be equal to ''124''. Received ''124''' arguments: - elapsedTime: 5 + elapsedTime: 2 time: - startTime: '2019-06-28T01:18:56.761Z' - endTime: '2019-06-28T01:18:56.766Z' - totalTime: 5 + startTime: '2019-06-30T00:18:10.124Z' + endTime: '2019-06-30T00:18:10.126Z' + totalTime: 2 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/tcp.yml - id: 2218560602_bf35f3e127_866487 + id: 2118090952_bf35f3e127_624919 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true tests: [] arguments: - elapsedTime: 0 + elapsedTime: 1 onFinish: valid: true tests: [] arguments: - elapsedTime: 3023 + elapsedTime: 3009 time: - startTime: '2019-06-28T01:18:56.683Z' - endTime: '2019-06-28T01:18:59.707Z' - totalTime: 3024 + startTime: '2019-06-30T00:18:10.051Z' + endTime: '2019-06-30T00:18:13.060Z' + totalTime: 3009 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560602_595f6dfba1_872721 + id: 2118090952_595f6dfba1_368325 level: 2 subscriptions: - - id: 2218560602_4e5617f719_237236 + id: 2118090952_4e5617f719_686180 name: 'Subscription #0' type: tcp hooks: @@ -5827,7 +6561,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 1198 + elapsedTime: 1180 onMessageReceived: valid: true tests: @@ -5845,12 +6579,12 @@ requisitions: address: '::ffff:127.0.0.1' family: IPv6 port: 23069 - elapsedTime: 207 + elapsedTime: 186 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560602_3b7a9e3645_509624 + id: 2118090952_3b7a9e3645_687519 name: 'Publisher #0' valid: true hooks: @@ -5861,7 +6595,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 1198 + elapsedTime: 1181 tests: - name: Published @@ -5874,8 +6608,8 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 52604 - elapsedTime: 1201 + port: 52958 + elapsedTime: 1183 tests: - name: 'Assertion #0' @@ -5883,7 +6617,9 @@ requisitions: description: 'Expected ''payload'' to be equal to ''Do not make it bad''. Received ''Do not make it bad''' valid: true type: tcp - publishTime: '2019-06-28T01:18:57.894Z' + publishTime: '2019-06-30T00:18:11.247Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5894,23 +6630,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1198 + elapsedTime: 1181 time: - startTime: '2019-06-28T01:18:56.696Z' - endTime: '2019-06-28T01:18:57.894Z' - totalTime: 1198 + startTime: '2019-06-30T00:18:10.067Z' + endTime: '2019-06-30T00:18:11.248Z' + totalTime: 1181 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560602_3f1b829a68_65867 + id: 2118090952_3f1b829a68_790991 level: 2 subscriptions: - - id: 2218560602_944c1488d1_237756 + id: 2118090952_944c1488d1_757849 name: 'Subscription #0' type: tcp hooks: @@ -5943,10 +6677,10 @@ requisitions: port: 23070 elapsedTime: 2 valid: true - subscriptionTime: '2019-06-28T01:18:57.896Z' + subscriptionTime: '2019-06-30T00:18:11.249Z' publishers: - - id: 2218560602_369e07d49e_231923 + id: 2118090952_369e07d49e_434709 name: 'Publisher #0' valid: true hooks: @@ -5970,8 +6704,8 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 52620 - elapsedTime: 1811 + port: 52977 + elapsedTime: 1812 tests: - name: 'Assertion #0' @@ -5979,7 +6713,9 @@ requisitions: description: 'Expected ''payload'' to be equal to ''EnqueuerRocks''. Received ''EnqueuerRocks''' valid: true type: tcp - publishTime: '2019-06-28T01:18:58.701Z' + publishTime: '2019-06-30T00:18:12.054Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -5990,23 +6726,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 807 + elapsedTime: 806 time: - startTime: '2019-06-28T01:18:57.895Z' - endTime: '2019-06-28T01:18:58.702Z' - totalTime: 807 + startTime: '2019-06-30T00:18:11.249Z' + endTime: '2019-06-30T00:18:12.055Z' + totalTime: 806 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #2' - id: 2218560602_7b3d80f664_648800 + id: 2118090952_7b3d80f664_311060 level: 2 subscriptions: - - id: 2218560603_a5c6b9dc6a_27977 + id: 2118090952_a5c6b9dc6a_920520 name: 'Subscription #0' type: tcp hooks: @@ -6023,7 +6757,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 1002 + elapsedTime: 1004 onMessageReceived: valid: true tests: @@ -6039,10 +6773,10 @@ requisitions: port: 23070 elapsedTime: 1 valid: true - subscriptionTime: '2019-06-28T01:18:58.704Z' + subscriptionTime: '2019-06-30T00:18:12.057Z' publishers: - - id: 2218560602_c04ec1e8aa_149025 + id: 2118090952_c04ec1e8aa_803719 name: 'Publisher #0' valid: true hooks: @@ -6053,7 +6787,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 1002 + elapsedTime: 1004 tests: - name: Published @@ -6066,8 +6800,8 @@ requisitions: stream: address: 127.0.0.1 family: IPv4 - port: 52620 - elapsedTime: 1004 + port: 52977 + elapsedTime: 1005 tests: - name: 'Assertion #0' @@ -6075,7 +6809,9 @@ requisitions: description: 'Expected ''payload'' to be equal to ''enqueuer Rocks''. Received ''enqueuer Rocks''' valid: true type: tcp - publishTime: '2019-06-28T01:18:59.706Z' + publishTime: '2019-06-30T00:18:13.060Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6086,24 +6822,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 1002 + elapsedTime: 1004 time: - startTime: '2019-06-28T01:18:58.704Z' - endTime: '2019-06-28T01:18:59.706Z' - totalTime: 1002 + startTime: '2019-06-30T00:18:12.056Z' + endTime: '2019-06-30T00:18:13.060Z' + totalTime: 1004 timeout: 3000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/udp.yml - id: 2218560603_f69fa0cdb2_777371 + id: 2118090953_f69fa0cdb2_634225 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6114,21 +6848,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 203 + elapsedTime: 188 time: - startTime: '2019-06-28T01:18:56.684Z' - endTime: '2019-06-28T01:18:56.887Z' - totalTime: 203 + startTime: '2019-06-30T00:18:10.052Z' + endTime: '2019-06-30T00:18:10.240Z' + totalTime: 188 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560603_ac96cfadf9_330494 + id: 2118090953_ac96cfadf9_568473 level: 2 subscriptions: - - id: 2218560603_6e62597dc8_930413 + id: 2118090953_6e62597dc8_386536 name: 'subscription description' type: udp hooks: @@ -6145,7 +6879,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 187 + elapsedTime: 170 onMessageReceived: valid: true tests: @@ -6166,14 +6900,14 @@ requisitions: remoteInfo: address: 127.0.0.1 family: IPv4 - port: 55618 + port: 49578 size: 2 - elapsedTime: 181 + elapsedTime: 169 valid: true - subscriptionTime: '2019-06-28T01:18:56.732Z' + subscriptionTime: '2019-06-30T00:18:10.101Z' publishers: - - id: 2218560603_f1c5db9ba9_889997 + id: 2118090953_f1c5db9ba9_378345 name: 'publisher description' valid: true hooks: @@ -6184,7 +6918,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 188 + elapsedTime: 170 tests: - name: Published @@ -6192,7 +6926,9 @@ requisitions: description: 'Published successfully' valid: true type: udp - publishTime: '2019-06-28T01:18:56.870Z' + publishTime: '2019-06-30T00:18:10.229Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6203,24 +6939,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 188 + elapsedTime: 171 time: - startTime: '2019-06-28T01:18:56.697Z' - endTime: '2019-06-28T01:18:56.887Z' - totalTime: 190 + startTime: '2019-06-30T00:18:10.067Z' + endTime: '2019-06-30T00:18:10.239Z' + totalTime: 172 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/uds.yml - id: 2218560603_c449648554_961747 + id: 2118090953_c449648554_263813 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6231,21 +6965,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 5170 + elapsedTime: 5171 time: - startTime: '2019-06-28T01:18:56.687Z' - endTime: '2019-06-28T01:19:01.857Z' - totalTime: 5170 + startTime: '2019-06-30T00:18:10.055Z' + endTime: '2019-06-30T00:18:15.226Z' + totalTime: 5171 timeout: 7000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560603_7acc07c435_539840 + id: 2118090953_7acc07c435_337016 level: 2 subscriptions: - - id: 2218560603_5e03c0017a_779748 + id: 2118090953_5e03c0017a_196317 name: 'Subscription #0' type: uds hooks: @@ -6262,7 +6996,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 2144 + elapsedTime: 2139 onMessageReceived: valid: true tests: @@ -6278,12 +7012,12 @@ requisitions: payload: enqueuer stream: {} path: /tmp/unix.sock - elapsedTime: 195 + elapsedTime: 177 valid: true - subscriptionTime: '2019-06-28T01:18:56.807Z' + subscriptionTime: '2019-06-30T00:18:10.160Z' publishers: - - id: 2218560603_b14ca3892b_931839 + id: 2118090953_b14ca3892b_478598 name: 'Publisher #0' valid: true hooks: @@ -6294,7 +7028,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 2144 + elapsedTime: 2139 tests: - name: Published @@ -6305,7 +7039,7 @@ requisitions: arguments: payload: responsePayload stream: {} - elapsedTime: 2147 + elapsedTime: 2142 tests: - name: 'Assertion #0' @@ -6313,7 +7047,9 @@ requisitions: description: 'Expected ''payload'' to be equal to ''responsePayload''. Received ''responsePayload''' valid: true type: uds - publishTime: '2019-06-28T01:18:58.841Z' + publishTime: '2019-06-30T00:18:12.207Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6324,23 +7060,21 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2144 + elapsedTime: 2139 time: - startTime: '2019-06-28T01:18:56.698Z' - endTime: '2019-06-28T01:18:58.842Z' - totalTime: 2144 + startTime: '2019-06-30T00:18:10.069Z' + endTime: '2019-06-30T00:18:12.208Z' + totalTime: 2139 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560603_591e70c91e_276079 + id: 2118090953_591e70c91e_787935 level: 2 subscriptions: - - id: 2218560603_81ccf3e7f8_726299 + id: 2118090953_81ccf3e7f8_842185 name: 'Subscription #0' type: uds hooks: @@ -6357,7 +7091,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 1008 + elapsedTime: 1007 onMessageReceived: valid: true tests: @@ -6371,10 +7105,10 @@ requisitions: path: /tmp/unix2.sock elapsedTime: 2 valid: true - subscriptionTime: '2019-06-28T01:18:58.844Z' + subscriptionTime: '2019-06-30T00:18:12.210Z' publishers: - - id: 2218560603_297aae1eb3_907935 + id: 2118090953_297aae1eb3_301595 name: 'Publisher #0' valid: true hooks: @@ -6389,7 +7123,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 1008 + elapsedTime: 1007 tests: - name: Published @@ -6397,7 +7131,9 @@ requisitions: description: 'Published successfully' valid: true type: uds - publishTime: '2019-06-28T01:18:59.850Z' + publishTime: '2019-06-30T00:18:13.215Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6410,21 +7146,19 @@ requisitions: arguments: elapsedTime: 1008 time: - startTime: '2019-06-28T01:18:58.843Z' - endTime: '2019-06-28T01:18:59.851Z' + startTime: '2019-06-30T00:18:12.209Z' + endTime: '2019-06-30T00:18:13.217Z' totalTime: 1008 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #2' - id: 2218560603_3321951a43_201069 + id: 2118090953_3321951a43_166779 level: 2 subscriptions: - - id: 2218560603_d308bbf817_453126 + id: 2118090953_d308bbf817_224642 name: 'Subscription #0' type: uds hooks: @@ -6441,7 +7175,7 @@ requisitions: name: 'Message received' description: 'Subscription has received its message' arguments: - elapsedTime: 2004 + elapsedTime: 2008 onMessageReceived: valid: true tests: @@ -6454,10 +7188,10 @@ requisitions: stream: {} elapsedTime: 1 valid: true - subscriptionTime: '2019-06-28T01:18:59.853Z' + subscriptionTime: '2019-06-30T00:18:13.219Z' publishers: - - id: 2218560603_b6920facd0_4230 + id: 2118090953_b6920facd0_666984 name: 'Publisher #0' valid: true hooks: @@ -6468,7 +7202,7 @@ requisitions: valid: true onFinish: arguments: - elapsedTime: 2004 + elapsedTime: 2008 tests: - name: Published @@ -6479,7 +7213,7 @@ requisitions: arguments: payload: 'I am still bidirectional' stream: {} - elapsedTime: 2002 + elapsedTime: 2006 tests: - name: 'Assertion #0' @@ -6487,7 +7221,9 @@ requisitions: description: 'Expected ''payload'' to be equal to ''I am still bidirectional''. Received ''I am still bidirectional''' valid: true type: uds - publishTime: '2019-06-28T01:19:01.856Z' + publishTime: '2019-06-30T00:18:15.225Z' + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6498,24 +7234,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2004 + elapsedTime: 2008 time: - startTime: '2019-06-28T01:18:59.853Z' - endTime: '2019-06-28T01:19:01.857Z' - totalTime: 2004 + startTime: '2019-06-30T00:18:13.218Z' + endTime: '2019-06-30T00:18:15.226Z' + totalTime: 2008 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/variables.yml - id: 2218560603_3a6eb18d6d_688797 + id: 2118090953_3a6eb18d6d_668868 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6526,20 +7260,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 77 + elapsedTime: 70 time: - startTime: '2019-06-28T01:18:56.687Z' - endTime: '2019-06-28T01:18:56.765Z' - totalTime: 78 + startTime: '2019-06-30T00:18:10.055Z' + endTime: '2019-06-30T00:18:10.125Z' + totalTime: 70 timeout: 5000 requisitions: - valid: true name: 'Requisition #0' - id: 2218560603_bdf0ac0681_414673 + id: 2118090953_bdf0ac0681_9674 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6558,22 +7294,22 @@ requisitions: valid: true description: 'Expected ''store.otherKey / 2'' to be equal to ''1''. Received ''1''' arguments: - elapsedTime: 42 + elapsedTime: 35 time: - startTime: '2019-06-28T01:18:56.698Z' - endTime: '2019-06-28T01:18:56.741Z' - totalTime: 43 + startTime: '2019-06-30T00:18:10.069Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 36 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: 'Requisition #1' - id: 2218560603_5153bc0c75_432747 + id: 2118090953_5153bc0c75_148712 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6596,24 +7332,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 3 + elapsedTime: 7 time: - startTime: '2019-06-28T01:18:56.747Z' - endTime: '2019-06-28T01:18:56.750Z' - totalTime: 3 + startTime: '2019-06-30T00:18:10.111Z' + endTime: '2019-06-30T00:18:10.118Z' + totalTime: 7 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 - valid: true name: examples/number.json - id: 2218560603_1925b227c5_23139 + id: 2118090954_1925b227c5_327567 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6632,22 +7366,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 50 + elapsedTime: 48 time: - startTime: '2019-06-28T01:18:56.688Z' - endTime: '2019-06-28T01:18:56.740Z' - totalTime: 52 + startTime: '2019-06-30T00:18:10.056Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 49 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: examples/requisition-navigation.yaml - id: 2218560603_e848774ac1_85434 + id: 2118090954_e848774ac1_857475 level: 1 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6658,20 +7392,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 76 + elapsedTime: 69 time: - startTime: '2019-06-28T01:18:56.688Z' - endTime: '2019-06-28T01:18:56.765Z' - totalTime: 77 + startTime: '2019-06-30T00:18:10.056Z' + endTime: '2019-06-30T00:18:10.125Z' + totalTime: 69 timeout: 5000 requisitions: - valid: true name: first - id: 2218560604_542da8f206_4318 + id: 2118090954_542da8f206_50157 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6686,22 +7422,22 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 41 + elapsedTime: 35 time: - startTime: '2019-06-28T01:18:56.699Z' - endTime: '2019-06-28T01:18:56.741Z' - totalTime: 42 + startTime: '2019-06-30T00:18:10.070Z' + endTime: '2019-06-30T00:18:10.105Z' + totalTime: 35 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - valid: true name: second - id: 2218560604_d7c80e2b4e_172222 + id: 2118090954_d7c80e2b4e_591580 level: 2 subscriptions: [] publishers: [] + iterations: 1 + totalIterations: 1 hooks: onInit: valid: true @@ -6716,16 +7452,10 @@ requisitions: valid: true tests: [] arguments: - elapsedTime: 2 + elapsedTime: 7 time: - startTime: '2019-06-28T01:18:56.748Z' - endTime: '2019-06-28T01:18:56.750Z' - totalTime: 2 + startTime: '2019-06-30T00:18:10.111Z' + endTime: '2019-06-30T00:18:10.118Z' + totalTime: 7 timeout: 5000 requisitions: [] - iteration: 0 - totalIterations: 1 - iteration: 0 - totalIterations: 1 -iteration: 0 -totalIterations: 1 diff --git a/package-lock.json b/package-lock.json index 1a7c6487..c3e9d7b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "enqueuer", - "version": "4.3.1", + "version": "5.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 85e38b00..0e583bad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "enqueuer", - "version": "4.3.1", + "version": "5.0.0", "description": "Polyglot flow testing tool", "main": "./js/enqueuer.js", "typings": "./js/enqueuer.d.ts", diff --git a/src/configurations/configuration.ts b/src/configurations/configuration.ts index 1cc24262..0dacf44f 100644 --- a/src/configurations/configuration.ts +++ b/src/configurations/configuration.ts @@ -33,6 +33,7 @@ export class Configuration { if (Configuration.loaded === false) { Configuration.loaded = true; Configuration.instance = new Configuration(); + Logger.setLoggerLevel(Configuration.instance.getLogLevel()); Configuration.instance.commandLineConfiguration.verifyPrematureActions(); if (Configuration.instance.logLevel === 'trace') { this.printConfiguration(); diff --git a/src/enqueuer-runner.ts b/src/enqueuer-runner.ts index 040e2958..708baafd 100644 --- a/src/enqueuer-runner.ts +++ b/src/enqueuer-runner.ts @@ -9,6 +9,8 @@ import {Configuration} from './configurations/configuration'; import {RequisitionAdopter} from './components/requisition-adopter'; import {NotificationEmitter, Notifications} from './notifications/notification-emitter'; import {SummaryTestOutput} from './outputs/summary-test-output'; +import {PublisherModel} from './models/inputs/publisher-model'; +import {TestModel} from './models/outputs/test-model'; export class EnqueuerRunner { private static reportName: string = 'enqueuer'; @@ -36,10 +38,15 @@ export class EnqueuerRunner { parallel: configuration.isParallel() }).getRequisition(); const parsingErrors = requisitionFileParser.getFilesErrors(); - const valid = parsingErrors.length === 0; const finalReports = await new RequisitionRunner(this.enqueuerRequisition).run(); + await this.publishReports(configuration.getOutputs(), finalReports, parsingErrors); + return finalReports; + } + + private async publishReports(configurationOutputs: PublisherModel[], finalReports: output.RequisitionModel[], parsingErrors: TestModel[]) { Logger.info('Publishing reports'); - const outputs = new MultiTestsOutput(configuration.getOutputs()); + const valid = parsingErrors.length === 0; + const outputs = new MultiTestsOutput(configurationOutputs); await finalReports.map(async report => { report.hooks!.onParsed = { valid: valid, diff --git a/src/enqueuer-starter.ts b/src/enqueuer-starter.ts index 3a2f8876..9df90b1b 100644 --- a/src/enqueuer-starter.ts +++ b/src/enqueuer-starter.ts @@ -18,8 +18,9 @@ export class EnqueuerStarter { Logger.fatal(`Execution error: ${error}`); statusCode = -1; } - Logger.info(`Hope you had a great time`); Logger.info('Enqueuer execution is over (' + (statusCode === 0) + ')'); + Logger.setLoggerLevel('info'); + Logger.info(`Hope you had a great time`); return statusCode; } diff --git a/src/models-defaults/outputs/requisition-default-reports.ts b/src/models-defaults/outputs/requisition-default-reports.ts index cd8a2431..9d164ebd 100644 --- a/src/models-defaults/outputs/requisition-default-reports.ts +++ b/src/models-defaults/outputs/requisition-default-reports.ts @@ -15,10 +15,16 @@ export class RequisitionDefaultReports { }, onFinishTests: TestModel[] = []): output.RequisitionModel { const valid = onFinishTests.every((test) => test.valid); - return Object.assign({}, base, { + return { valid: valid, + name: base.name, + id: base.id, + ignored: base.ignored, + level: base.level, subscriptions: [], publishers: [], + iterations: base.iterations, + totalIterations: base.totalIterations, hooks: { [DefaultHookEvents.ON_INIT]: { arguments: {}, @@ -37,7 +43,7 @@ export class RequisitionDefaultReports { totalTime: 0 }, requisitions: [] - }); + }; } public static createRunningError(base: { name: string, id: string }, err: any): output.RequisitionModel { diff --git a/src/outputs/formatters/json-formatter.test.ts b/src/outputs/formatters/json-formatter.test.ts index 9950adf0..0243f9e0 100644 --- a/src/outputs/formatters/json-formatter.test.ts +++ b/src/outputs/formatters/json-formatter.test.ts @@ -16,6 +16,16 @@ describe('JsonReportFormatter', () => { expect(format).toBe(new JsonObjectParser().stringify(test)); }); + it('Should throw', () => { + const test: RequisitionModel = { + name: 'name', + valid: true, + tests: [] + }; + test.cycle = test; + expect(() => new JsonReportFormatter().format(test)).toThrow(); + }); + it('Should export an entry point', done => { const mainInstance: any = { reportFormatterManager: { diff --git a/src/outputs/formatters/json-formatter.ts b/src/outputs/formatters/json-formatter.ts index 78075042..a622ad00 100644 --- a/src/outputs/formatters/json-formatter.ts +++ b/src/outputs/formatters/json-formatter.ts @@ -1,10 +1,16 @@ import {ReportFormatter} from './report-formatter'; import {RequisitionModel} from '../../models/outputs/requisition-model'; import {MainInstance} from '../../plugins/main-instance'; +import {Logger} from '../../loggers/logger'; export class JsonReportFormatter implements ReportFormatter { public format(report: RequisitionModel): string { - return JSON.stringify(report, null, 2); + try { + return JSON.stringify(report, null, 2); + } catch (e) { + Logger.warning(e); + throw e; + } } } diff --git a/src/outputs/multi-tests-output.ts b/src/outputs/multi-tests-output.ts index e56e837c..dc0b21bf 100644 --- a/src/outputs/multi-tests-output.ts +++ b/src/outputs/multi-tests-output.ts @@ -23,10 +23,14 @@ export class MultiTestsOutput { public async publishReport(report: RequisitionModel) { await Promise.all(this.outputs .map(publisher => { - const formatter = publisher.formatter as ReportFormatter; - Logger.trace(`Formatting as ${publisher.format}`); - publisher.payload = formatter.format(report); - return publisher.publish(); + try { + const formatter = publisher.formatter as ReportFormatter; + Logger.trace(`Formatting as ${publisher.format}`); + publisher.payload = formatter.format(report); + return publisher.publish(); + } catch (err) { + Logger.warning(`Error publishing report: ${JSON.stringify(report)}: ${err}`); + } })); } } diff --git a/src/plugins/dynamic-modules-manager.test.ts b/src/plugins/dynamic-modules-manager.test.ts index e9a26f14..49fd3406 100644 --- a/src/plugins/dynamic-modules-manager.test.ts +++ b/src/plugins/dynamic-modules-manager.test.ts @@ -78,4 +78,15 @@ describe('DynamicModulesManager', () => { DynamicModulesManager.getInstance().describeLoadedModules(); }); + + it('should check enqueuer version of plugins', () => { + // @ts-ignore + expect(DynamicModulesManager.versionMatches({dependencies: {enqueuer: '^5.0.0'}})).toBeTruthy(); + // @ts-ignore + expect(DynamicModulesManager.versionMatches({devDependencies: {enqueuer: '5.0.0'}})).toBeTruthy(); + // @ts-ignore + expect(DynamicModulesManager.versionMatches({peerDependencies: {enqueuer: '5.0.0'}})).toBeTruthy(); + // @ts-ignore + expect(DynamicModulesManager.versionMatches({})).toBeFalsy(); + }); }); diff --git a/src/plugins/dynamic-modules-manager.ts b/src/plugins/dynamic-modules-manager.ts index 8820e482..b4ce861b 100644 --- a/src/plugins/dynamic-modules-manager.ts +++ b/src/plugins/dynamic-modules-manager.ts @@ -98,15 +98,20 @@ export class DynamicModulesManager { .map(module => module.replace(/\.js/, '')) .filter(module => { try { - const packageJson = JSON.parse(fs.readFileSync(module + '/package.json').toString()); - const hasKeyWords = packageJson.keywords - .filter((keyword: string) => keyword.toLowerCase() === 'enqueuer' || - keyword.toLowerCase() === 'nqr').length > 0; - const versionMatches = DynamicModulesManager.versionMatches(packageJson); - if (hasKeyWords && versionMatches) { - return require(module).entryPoint !== undefined; + const packageJsonPath = module + '/package.json'; + if (fs.existsSync(packageJsonPath)) { + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()); + const keyWordsMatch = (packageJson.keywords || []) + .find((keyword: string) => keyword.toLowerCase() === 'enqueuer' || keyword.toLowerCase() === 'nqr'); + if (keyWordsMatch) { + const versionMatches = DynamicModulesManager.versionMatches(packageJson); + if (versionMatches) { + return require(module).entryPoint !== undefined; + } + } } } catch (err) { + Logger.trace(err); } return false; }); @@ -116,15 +121,20 @@ export class DynamicModulesManager { return []; } - //TODO test it - private static versionMatches(packageJson: { dependencies: any, devDependencies: any, peerDependencies: any }): boolean { - const regexp = /[ ^d]*(\d+)/; + private static versionMatches(packageJson: { name: string, dependencies: any, devDependencies: any, peerDependencies: any }): boolean { + const regexp = /[^\d]*(\d+)/; const currentMajorVersion = (process.env.npm_package_version || enqueuerPackageJson.version).match(regexp)[0]; - const pluginMajorEnqueuerVersion = (packageJson.dependencies.enqueuer || - packageJson.devDependencies.enqueuer || - packageJson.peerDependencies.enqueuer) - .version.match(regexp)[0]; - return currentMajorVersion <= pluginMajorEnqueuerVersion; + const enqueuerVersion = (packageJson.dependencies || {}).enqueuer || + (packageJson.devDependencies || {}).enqueuer || + (packageJson.peerDependencies || {}).enqueuer || + '0.0.0'; + const pluginMajorEnqueuerVersion = enqueuerVersion.match(regexp)[1]; + + Logger.trace(`name: ${packageJson.name} => currentMajorVersion (${ + +currentMajorVersion}) <= pluginMajorEnqueuerVersion (${ + +pluginMajorEnqueuerVersion}): ${ + +currentMajorVersion <= +pluginMajorEnqueuerVersion}`); + return +currentMajorVersion <= +pluginMajorEnqueuerVersion; } private loadModule(module: string): boolean { diff --git a/src/requisition-runners/requisition-runner.ts b/src/requisition-runners/requisition-runner.ts index a2b2e7e3..095a500e 100644 --- a/src/requisition-runners/requisition-runner.ts +++ b/src/requisition-runners/requisition-runner.ts @@ -149,7 +149,7 @@ export class RequisitionRunner { } } - private async executeChild(child: input.RequisitionModel, index: number) { + private async executeChild(child: input.RequisitionModel, index: number): Promise { child.parent = this.requisition; const childRunner = new RequisitionRunner(child); this.childrenRequisitionRunner.push(childRunner);