@pact-foundation/pact 10.0.0-beta.9 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/CHANGELOG.md +2451 -1
  2. package/CODE_OF_CONDUCT.md +1 -1
  3. package/CONTRIBUTING.md +49 -12
  4. package/MIGRATION.md +77 -0
  5. package/README.md +180 -1274
  6. package/RELEASING.md +63 -59
  7. package/package.json +96 -98
  8. package/src/common/jsonTypes.d.ts +5 -0
  9. package/src/common/jsonTypes.js +3 -0
  10. package/src/common/jsonTypes.js.map +1 -0
  11. package/src/common/logger.d.ts +10 -0
  12. package/src/common/logger.js +32 -0
  13. package/src/common/logger.js.map +1 -0
  14. package/src/common/net.d.ts +9 -0
  15. package/src/common/net.js +82 -0
  16. package/src/common/net.js.map +1 -0
  17. package/{common → src/common}/net.spec.d.ts +0 -0
  18. package/src/common/net.spec.js +69 -0
  19. package/src/common/net.spec.js.map +1 -0
  20. package/src/common/request.d.ts +21 -0
  21. package/src/common/request.js +110 -0
  22. package/src/common/request.js.map +1 -0
  23. package/{common → src/common}/request.spec.d.ts +0 -0
  24. package/src/common/request.spec.js +69 -0
  25. package/src/common/request.spec.js.map +1 -0
  26. package/src/common/spec.d.ts +2 -0
  27. package/src/common/spec.js +22 -0
  28. package/src/common/spec.js.map +1 -0
  29. package/{dsl → src/dsl}/apolloGraphql.d.ts +1 -1
  30. package/{dsl → src/dsl}/apolloGraphql.js +4 -1
  31. package/src/dsl/apolloGraphql.js.map +1 -0
  32. package/{dsl → src/dsl}/apolloGraphql.spec.d.ts +0 -0
  33. package/src/dsl/apolloGraphql.spec.js +74 -0
  34. package/src/dsl/apolloGraphql.spec.js.map +1 -0
  35. package/{dsl → src/dsl}/graphql.d.ts +19 -8
  36. package/{dsl → src/dsl}/graphql.js +59 -31
  37. package/src/dsl/graphql.js.map +1 -0
  38. package/{dsl → src/dsl}/graphql.spec.d.ts +0 -0
  39. package/src/dsl/graphql.spec.js +229 -0
  40. package/src/dsl/graphql.spec.js.map +1 -0
  41. package/{dsl → src/dsl}/interaction.d.ts +22 -20
  42. package/src/dsl/interaction.js +144 -0
  43. package/src/dsl/interaction.js.map +1 -0
  44. package/{dsl → src/dsl}/interaction.spec.d.ts +0 -0
  45. package/src/dsl/interaction.spec.js +214 -0
  46. package/src/dsl/interaction.spec.js.map +1 -0
  47. package/src/dsl/matchers.d.ts +143 -0
  48. package/{dsl → src/dsl}/matchers.js +92 -93
  49. package/src/dsl/matchers.js.map +1 -0
  50. package/{dsl → src/dsl}/matchers.spec.d.ts +0 -0
  51. package/src/dsl/matchers.spec.js +668 -0
  52. package/src/dsl/matchers.spec.js.map +1 -0
  53. package/{dsl → src/dsl}/message.d.ts +32 -12
  54. package/{dsl → src/dsl}/message.js +0 -0
  55. package/{dsl → src/dsl}/message.js.map +1 -1
  56. package/src/dsl/mockService.d.ts +13 -0
  57. package/src/dsl/mockService.js +3 -0
  58. package/src/dsl/mockService.js.map +1 -0
  59. package/{dsl → src/dsl}/options.d.ts +7 -6
  60. package/{dsl → src/dsl}/options.js +0 -0
  61. package/{dsl → src/dsl}/options.js.map +1 -1
  62. package/src/dsl/verifier/index.d.ts +1 -0
  63. package/src/dsl/verifier/index.js +18 -0
  64. package/src/dsl/verifier/index.js.map +1 -0
  65. package/src/dsl/verifier/proxy/hooks.d.ts +4 -0
  66. package/src/dsl/verifier/proxy/hooks.js +109 -0
  67. package/src/dsl/verifier/proxy/hooks.js.map +1 -0
  68. package/src/dsl/verifier/proxy/index.d.ts +1 -0
  69. package/src/dsl/verifier/proxy/index.js +18 -0
  70. package/src/dsl/verifier/proxy/index.js.map +1 -0
  71. package/src/dsl/verifier/proxy/parseBody.d.ts +7 -0
  72. package/src/dsl/verifier/proxy/parseBody.js +22 -0
  73. package/src/dsl/verifier/proxy/parseBody.js.map +1 -0
  74. package/{dsl/mockService.spec.d.ts → src/dsl/verifier/proxy/parseBody.spec.d.ts} +0 -0
  75. package/src/dsl/verifier/proxy/parseBody.spec.js +118 -0
  76. package/src/dsl/verifier/proxy/parseBody.spec.js.map +1 -0
  77. package/src/dsl/verifier/proxy/proxy.d.ts +4 -0
  78. package/src/dsl/verifier/proxy/proxy.js +92 -0
  79. package/src/dsl/verifier/proxy/proxy.js.map +1 -0
  80. package/{dsl/publisher.spec.d.ts → src/dsl/verifier/proxy/proxy.spec.d.ts} +0 -0
  81. package/src/dsl/verifier/proxy/proxy.spec.js +33 -0
  82. package/src/dsl/verifier/proxy/proxy.spec.js.map +1 -0
  83. package/src/dsl/verifier/proxy/stateHandler/index.d.ts +1 -0
  84. package/src/dsl/verifier/proxy/stateHandler/index.js +18 -0
  85. package/src/dsl/verifier/proxy/stateHandler/index.js.map +1 -0
  86. package/src/dsl/verifier/proxy/stateHandler/setupStates.d.ts +3 -0
  87. package/src/dsl/verifier/proxy/stateHandler/setupStates.js +48 -0
  88. package/src/dsl/verifier/proxy/stateHandler/setupStates.js.map +1 -0
  89. package/{dsl/verifier.spec.d.ts → src/dsl/verifier/proxy/stateHandler/setupStates.spec.d.ts} +0 -0
  90. package/src/dsl/verifier/proxy/stateHandler/setupStates.spec.js +191 -0
  91. package/src/dsl/verifier/proxy/stateHandler/setupStates.spec.js.map +1 -0
  92. package/src/dsl/verifier/proxy/stateHandler/stateHandler.d.ts +3 -0
  93. package/src/dsl/verifier/proxy/stateHandler/stateHandler.js +14 -0
  94. package/src/dsl/verifier/proxy/stateHandler/stateHandler.js.map +1 -0
  95. package/{httpPact.spec.d.ts → src/dsl/verifier/proxy/stateHandler/stateHandler.spec.d.ts} +0 -0
  96. package/src/dsl/verifier/proxy/stateHandler/stateHandler.spec.js +130 -0
  97. package/src/dsl/verifier/proxy/stateHandler/stateHandler.spec.js.map +1 -0
  98. package/src/dsl/verifier/proxy/tracer.d.ts +3 -0
  99. package/src/dsl/verifier/proxy/tracer.js +52 -0
  100. package/src/dsl/verifier/proxy/tracer.js.map +1 -0
  101. package/src/dsl/verifier/proxy/types.d.ts +48 -0
  102. package/src/dsl/verifier/proxy/types.js +3 -0
  103. package/src/dsl/verifier/proxy/types.js.map +1 -0
  104. package/src/dsl/verifier/types.d.ts +3 -0
  105. package/src/dsl/verifier/types.js +3 -0
  106. package/src/dsl/verifier/types.js.map +1 -0
  107. package/src/dsl/verifier/verifier.d.ts +16 -0
  108. package/src/dsl/verifier/verifier.js +129 -0
  109. package/src/dsl/verifier/verifier.js.map +1 -0
  110. package/{messageConsumerPact.spec.d.ts → src/dsl/verifier/verifier.spec.d.ts} +0 -0
  111. package/src/dsl/verifier/verifier.spec.js +172 -0
  112. package/src/dsl/verifier/verifier.spec.js.map +1 -0
  113. package/{errors → src/errors}/configurationError.d.ts +0 -0
  114. package/{errors → src/errors}/configurationError.js +3 -1
  115. package/src/errors/configurationError.js.map +1 -0
  116. package/{errors → src/errors}/graphQLQueryError.d.ts +0 -0
  117. package/{errors → src/errors}/graphQLQueryError.js +3 -1
  118. package/src/errors/graphQLQueryError.js.map +1 -0
  119. package/{errors → src/errors}/matcherError.d.ts +0 -0
  120. package/{errors → src/errors}/matcherError.js +3 -1
  121. package/src/errors/matcherError.js.map +1 -0
  122. package/{errors → src/errors}/verificationError.d.ts +0 -0
  123. package/{errors → src/errors}/verificationError.js +3 -1
  124. package/src/errors/verificationError.js.map +1 -0
  125. package/src/httpPact/ffi.d.ts +15 -0
  126. package/src/httpPact/ffi.js +91 -0
  127. package/src/httpPact/ffi.js.map +1 -0
  128. package/{messageProviderPact.spec.d.ts → src/httpPact/ffi.spec.d.ts} +0 -0
  129. package/src/httpPact/ffi.spec.js +81 -0
  130. package/src/httpPact/ffi.spec.js.map +1 -0
  131. package/{httpPact.d.ts → src/httpPact/index.d.ts} +12 -12
  132. package/src/httpPact/index.js +311 -0
  133. package/src/httpPact/index.js.map +1 -0
  134. package/{pact-web.spec.d.ts → src/httpPact/index.spec.d.ts} +0 -0
  135. package/src/httpPact/index.spec.js +238 -0
  136. package/src/httpPact/index.spec.js.map +1 -0
  137. package/src/httpPact/tracing.d.ts +1 -0
  138. package/src/httpPact/tracing.js +53 -0
  139. package/src/httpPact/tracing.js.map +1 -0
  140. package/{pact.d.ts → src/index.d.ts} +22 -21
  141. package/src/index.js +107 -0
  142. package/src/index.js.map +1 -0
  143. package/src/messageConsumerPact.d.ts +86 -0
  144. package/src/messageConsumerPact.js +222 -0
  145. package/src/messageConsumerPact.js.map +1 -0
  146. package/src/messageConsumerPact.spec.d.ts +1 -0
  147. package/src/messageConsumerPact.spec.js +117 -0
  148. package/src/messageConsumerPact.spec.js.map +1 -0
  149. package/{messageProviderPact.d.ts → src/messageProviderPact.d.ts} +7 -4
  150. package/src/messageProviderPact.js +190 -0
  151. package/src/messageProviderPact.js.map +1 -0
  152. package/src/messageProviderPact.spec.d.ts +1 -0
  153. package/src/messageProviderPact.spec.js +183 -0
  154. package/src/messageProviderPact.spec.js.map +1 -0
  155. package/{pact.integration.spec.d.ts → src/pact.integration.spec.d.ts} +0 -0
  156. package/{pact.integration.spec.js → src/pact.integration.spec.js} +0 -0
  157. package/src/pact.integration.spec.js.map +1 -0
  158. package/src/v3/display.d.ts +6 -0
  159. package/src/v3/display.js +83 -0
  160. package/src/v3/display.js.map +1 -0
  161. package/src/v3/index.d.ts +17 -0
  162. package/src/v3/index.js +47 -0
  163. package/src/v3/index.js.map +1 -0
  164. package/src/v3/matchers.d.ts +182 -0
  165. package/src/v3/matchers.js +443 -0
  166. package/src/v3/matchers.js.map +1 -0
  167. package/src/v3/matchers.spec.d.ts +1 -0
  168. package/src/v3/matchers.spec.js +461 -0
  169. package/src/v3/matchers.spec.js.map +1 -0
  170. package/src/v3/pact.d.ts +21 -0
  171. package/src/v3/pact.js +240 -0
  172. package/src/v3/pact.js.map +1 -0
  173. package/src/v3/types.d.ts +81 -0
  174. package/src/v3/types.js +11 -0
  175. package/src/v3/types.js.map +1 -0
  176. package/{v3 → src/v3}/xml/xmlBuilder.d.ts +2 -2
  177. package/{v3 → src/v3}/xml/xmlBuilder.js +2 -1
  178. package/src/v3/xml/xmlBuilder.js.map +1 -0
  179. package/src/v3/xml/xmlElement.d.ts +27 -0
  180. package/{v3 → src/v3}/xml/xmlElement.js +21 -15
  181. package/src/v3/xml/xmlElement.js.map +1 -0
  182. package/src/v3/xml/xmlElement.spec.d.ts +1 -0
  183. package/src/v3/xml/xmlElement.spec.js +102 -0
  184. package/src/v3/xml/xmlElement.spec.js.map +1 -0
  185. package/{v3 → src/v3}/xml/xmlNode.d.ts +0 -0
  186. package/{v3 → src/v3}/xml/xmlNode.js +1 -0
  187. package/src/v3/xml/xmlNode.js.map +1 -0
  188. package/src/v3/xml/xmlText.d.ts +7 -0
  189. package/{v3 → src/v3}/xml/xmlText.js +4 -1
  190. package/src/v3/xml/xmlText.js.map +1 -0
  191. package/test/helper.d.ts +1 -0
  192. package/test/helper.js +37 -0
  193. package/test/helper.js.map +1 -0
  194. package/ROADMAP.md +0 -20
  195. package/common/logger.d.ts +0 -7
  196. package/common/logger.js +0 -56
  197. package/common/logger.js.map +0 -1
  198. package/common/metadata.d.ts +0 -0
  199. package/common/metadata.js +0 -2
  200. package/common/metadata.js.map +0 -1
  201. package/common/net.d.ts +0 -9
  202. package/common/net.js +0 -48
  203. package/common/net.js.map +0 -1
  204. package/common/net.spec.js +0 -67
  205. package/common/net.spec.js.map +0 -1
  206. package/common/request.d.ts +0 -14
  207. package/common/request.js +0 -47
  208. package/common/request.js.map +0 -1
  209. package/common/request.spec.js +0 -71
  210. package/common/request.spec.js.map +0 -1
  211. package/common/utils.d.ts +0 -2
  212. package/common/utils.js +0 -10
  213. package/common/utils.js.map +0 -1
  214. package/dsl/apolloGraphql.js.map +0 -1
  215. package/dsl/apolloGraphql.spec.js +0 -47
  216. package/dsl/apolloGraphql.spec.js.map +0 -1
  217. package/dsl/graphql.js.map +0 -1
  218. package/dsl/graphql.spec.js +0 -150
  219. package/dsl/graphql.spec.js.map +0 -1
  220. package/dsl/interaction.js +0 -112
  221. package/dsl/interaction.js.map +0 -1
  222. package/dsl/interaction.spec.js +0 -217
  223. package/dsl/interaction.spec.js.map +0 -1
  224. package/dsl/matchers.d.ts +0 -269
  225. package/dsl/matchers.js.map +0 -1
  226. package/dsl/matchers.spec.js +0 -563
  227. package/dsl/matchers.spec.js.map +0 -1
  228. package/dsl/mockService.d.ts +0 -58
  229. package/dsl/mockService.js +0 -74
  230. package/dsl/mockService.js.map +0 -1
  231. package/dsl/mockService.spec.js +0 -126
  232. package/dsl/mockService.spec.js.map +0 -1
  233. package/dsl/publisher.d.ts +0 -6
  234. package/dsl/publisher.js +0 -19
  235. package/dsl/publisher.js.map +0 -1
  236. package/dsl/publisher.spec.js +0 -21
  237. package/dsl/publisher.spec.js.map +0 -1
  238. package/dsl/verifier.d.ts +0 -39
  239. package/dsl/verifier.js +0 -173
  240. package/dsl/verifier.js.map +0 -1
  241. package/dsl/verifier.spec.js +0 -299
  242. package/dsl/verifier.spec.js.map +0 -1
  243. package/errors/configurationError.js.map +0 -1
  244. package/errors/graphQLQueryError.js.map +0 -1
  245. package/errors/matcherError.js.map +0 -1
  246. package/errors/verificationError.js.map +0 -1
  247. package/httpPact.js +0 -206
  248. package/httpPact.js.map +0 -1
  249. package/httpPact.spec.js +0 -337
  250. package/httpPact.spec.js.map +0 -1
  251. package/messageConsumerPact.d.ts +0 -67
  252. package/messageConsumerPact.js +0 -161
  253. package/messageConsumerPact.js.map +0 -1
  254. package/messageConsumerPact.spec.js +0 -161
  255. package/messageConsumerPact.spec.js.map +0 -1
  256. package/messageProviderPact.js +0 -139
  257. package/messageProviderPact.js.map +0 -1
  258. package/messageProviderPact.spec.js +0 -143
  259. package/messageProviderPact.spec.js.map +0 -1
  260. package/pact-web.d.ts +0 -100
  261. package/pact-web.js +0 -151
  262. package/pact-web.js.map +0 -1
  263. package/pact-web.spec.js +0 -191
  264. package/pact-web.spec.js.map +0 -1
  265. package/pact.integration.spec.js.map +0 -1
  266. package/pact.js +0 -74
  267. package/pact.js.map +0 -1
  268. package/v3/index.d.ts +0 -23
  269. package/v3/index.js +0 -33
  270. package/v3/index.js.map +0 -1
  271. package/v3/matchers.d.ts +0 -199
  272. package/v3/matchers.js +0 -305
  273. package/v3/matchers.js.map +0 -1
  274. package/v3/pact.d.ts +0 -47
  275. package/v3/pact.js +0 -101
  276. package/v3/pact.js.map +0 -1
  277. package/v3/verifier.d.ts +0 -27
  278. package/v3/verifier.js +0 -46
  279. package/v3/verifier.js.map +0 -1
  280. package/v3/xml/xmlBuilder.js.map +0 -1
  281. package/v3/xml/xmlElement.d.ts +0 -34
  282. package/v3/xml/xmlElement.js.map +0 -1
  283. package/v3/xml/xmlNode.js.map +0 -1
  284. package/v3/xml/xmlText.d.ts +0 -6
  285. package/v3/xml/xmlText.js.map +0 -1
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ /**
3
+ * @module Message
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || function (mod) {
22
+ if (mod && mod.__esModule) return mod;
23
+ var result = {};
24
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
25
+ __setModuleDefault(result, mod);
26
+ return result;
27
+ };
28
+ var __importDefault = (this && this.__importDefault) || function (mod) {
29
+ return (mod && mod.__esModule) ? mod : { "default": mod };
30
+ };
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.asynchronousBodyHandler = exports.synchronousBodyHandler = exports.MessageConsumerPact = void 0;
33
+ var lodash_1 = require("lodash");
34
+ var pact_core_1 = __importStar(require("@pact-foundation/pact-core"));
35
+ var ramda_1 = require("ramda");
36
+ var logger_1 = __importStar(require("./common/logger"));
37
+ var configurationError_1 = __importDefault(require("./errors/configurationError"));
38
+ var package_json_1 = require("../package.json");
39
+ var spec_1 = require("./common/spec");
40
+ var v3_1 = require("./v3");
41
+ var DEFAULT_PACT_DIR = './pacts';
42
+ // eslint-disable-next-line no-shadow
43
+ var ContentType;
44
+ (function (ContentType) {
45
+ ContentType[ContentType["JSON"] = 0] = "JSON";
46
+ ContentType[ContentType["BINARY"] = 1] = "BINARY";
47
+ ContentType[ContentType["STRING"] = 2] = "STRING";
48
+ })(ContentType || (ContentType = {}));
49
+ /**
50
+ * A Message Consumer is analagous to a Provider in the HTTP Interaction model.
51
+ * It is the receiver of an interaction, and needs to be able to handle whatever
52
+ * request was provided.
53
+ */
54
+ var MessageConsumerPact = /** @class */ (function () {
55
+ function MessageConsumerPact(config) {
56
+ this.config = config;
57
+ this.state = {};
58
+ this.pact = (0, pact_core_1.makeConsumerAsyncMessagePact)(config.consumer, config.provider, (0, spec_1.numberToSpec)(config.spec, v3_1.SpecificationVersion.SPECIFICATION_VERSION_V3), config.logLevel);
59
+ this.pact.addMetadata('pact-js', 'version', package_json_1.version);
60
+ this.message = this.pact.newMessage('');
61
+ if (!(0, lodash_1.isEmpty)(config.logLevel)) {
62
+ (0, logger_1.setLogLevel)(config.logLevel);
63
+ pact_core_1.default.logLevel(config.logLevel);
64
+ }
65
+ }
66
+ /**
67
+ * Gives a state the provider should be in for this Message.
68
+ *
69
+ * @param {string} state - The state of the provider.
70
+ * @returns {Message} MessageConsumer
71
+ */
72
+ MessageConsumerPact.prototype.given = function (state) {
73
+ var _this = this;
74
+ if (typeof state === 'string') {
75
+ this.message.given(state);
76
+ }
77
+ else {
78
+ (0, ramda_1.forEachObjIndexed)(function (v, k) {
79
+ _this.message.givenWithParam(state.name, "".concat(k), JSON.stringify(v));
80
+ }, state.params);
81
+ }
82
+ return this;
83
+ };
84
+ /**
85
+ * A free style description of the Message.
86
+ *
87
+ * @param {string} description - A description of the Message to be received
88
+ * @returns {Message} MessageConsumer
89
+ */
90
+ MessageConsumerPact.prototype.expectsToReceive = function (description) {
91
+ if ((0, lodash_1.isEmpty)(description)) {
92
+ throw new configurationError_1.default('You must provide a description for the Message.');
93
+ }
94
+ this.message.expectsToReceive(description);
95
+ return this;
96
+ };
97
+ /**
98
+ * The JSON object to be received by the message consumer.
99
+ *
100
+ * May be a JSON object or JSON primitive. The contents must be able to be properly
101
+ * strigified and parse (i.e. via JSON.stringify and JSON.parse).
102
+ *
103
+ * @param {string} content - A description of the Message to be received
104
+ * @returns {Message} MessageConsumer
105
+ */
106
+ MessageConsumerPact.prototype.withContent = function (content) {
107
+ if ((0, lodash_1.isEmpty)(content)) {
108
+ throw new configurationError_1.default('You must provide a valid JSON document or primitive for the Message.');
109
+ }
110
+ this.message.withContents(JSON.stringify(content), 'application/json');
111
+ this.state.contentType = ContentType.JSON;
112
+ return this;
113
+ };
114
+ /**
115
+ * The text content to be received by the message consumer.
116
+ *
117
+ * May be any text
118
+ *
119
+ * @param {string} content - A description of the Message to be received
120
+ * @returns {Message} MessageConsumer
121
+ */
122
+ MessageConsumerPact.prototype.withTextContent = function (content, contentType) {
123
+ this.message.withContents(content, contentType);
124
+ this.state.contentType = ContentType.STRING;
125
+ return this;
126
+ };
127
+ /**
128
+ * The binary content to be received by the message consumer.
129
+ *
130
+ * Content will be stored in base64 in the resulting pact file.
131
+ *
132
+ * @param {Buffer} content - A buffer containing the binary content
133
+ * @param {String} contenttype - The mime type of the content to expect
134
+ * @returns {Message} MessageConsumer
135
+ */
136
+ MessageConsumerPact.prototype.withBinaryContent = function (content, contentType) {
137
+ this.message.withBinaryContents(content, contentType);
138
+ this.state.contentType = ContentType.BINARY;
139
+ return this;
140
+ };
141
+ /**
142
+ * Message metadata.
143
+ *
144
+ * @param {string} metadata -
145
+ * @returns {Message} MessageConsumer
146
+ */
147
+ MessageConsumerPact.prototype.withMetadata = function (metadata) {
148
+ var _this = this;
149
+ if ((0, lodash_1.isEmpty)(metadata)) {
150
+ throw new configurationError_1.default('You must provide valid metadata for the Message, or none at all');
151
+ }
152
+ (0, ramda_1.forEachObjIndexed)(function (v, k) {
153
+ _this.message.withMetadata("".concat(k), typeof v === 'string' ? v : v.getValue());
154
+ }, metadata);
155
+ return this;
156
+ };
157
+ /**
158
+ * Creates a new Pact _message_ interaction to build a testable interaction.
159
+ *
160
+ * @param handler A message handler, that must be able to consume the given Message
161
+ * @returns {Promise}
162
+ */
163
+ MessageConsumerPact.prototype.verify = function (handler) {
164
+ var _this = this;
165
+ logger_1.default.info('Verifying message');
166
+ return handler(this.reifiedContent())
167
+ .then(function () {
168
+ var _a;
169
+ _this.pact.writePactFile((_a = _this.config.dir) !== null && _a !== void 0 ? _a : DEFAULT_PACT_DIR, _this.config.pactfileWriteMode === 'overwrite');
170
+ })
171
+ .finally(function () {
172
+ _this.message = _this.pact.newMessage('');
173
+ _this.state = {};
174
+ });
175
+ };
176
+ MessageConsumerPact.prototype.reifiedContent = function () {
177
+ var raw = this.message.reifyMessage();
178
+ logger_1.default.debug("reified message raw: raw");
179
+ var reified = JSON.parse(raw);
180
+ if (this.state.contentType === ContentType.BINARY) {
181
+ reified.contents = Buffer.from(reified.contents, 'base64');
182
+ }
183
+ logger_1.default.debug("rehydrated message body into correct type: ".concat(reified.contents));
184
+ return reified;
185
+ };
186
+ /**
187
+ * Returns the Message object created.
188
+ *
189
+ * @returns {Message}
190
+ */
191
+ MessageConsumerPact.prototype.json = function () {
192
+ return this.state;
193
+ };
194
+ return MessageConsumerPact;
195
+ }());
196
+ exports.MessageConsumerPact = MessageConsumerPact;
197
+ // TODO: create more basic adapters for API handlers
198
+ // bodyHandler takes a synchronous function and returns
199
+ // a wrapped function that accepts a Message and returns a Promise
200
+ function synchronousBodyHandler(handler) {
201
+ return function (m) {
202
+ var body = m.contents;
203
+ return new Promise(function (resolve, reject) {
204
+ try {
205
+ var res = handler(body);
206
+ resolve(res);
207
+ }
208
+ catch (e) {
209
+ reject(e);
210
+ }
211
+ });
212
+ };
213
+ }
214
+ exports.synchronousBodyHandler = synchronousBodyHandler;
215
+ // bodyHandler takes an asynchronous (promisified) function and returns
216
+ // a wrapped function that accepts a Message and returns a Promise
217
+ // TODO: move this into its own package and re-export?
218
+ function asynchronousBodyHandler(handler) {
219
+ return function (m) { return handler(m.contents); };
220
+ }
221
+ exports.asynchronousBodyHandler = asynchronousBodyHandler;
222
+ //# sourceMappingURL=messageConsumerPact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageConsumerPact.js","sourceRoot":"","sources":["../../src/messageConsumerPact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ /* tslint:disable:no-unused-expression no-empty */
7
+ var chai_1 = __importDefault(require("chai"));
8
+ var chai_as_promised_1 = __importDefault(require("chai-as-promised"));
9
+ var sinon_chai_1 = __importDefault(require("sinon-chai"));
10
+ var messageConsumerPact_1 = require("./messageConsumerPact");
11
+ chai_1.default.use(sinon_chai_1.default);
12
+ chai_1.default.use(chai_as_promised_1.default);
13
+ var expect = chai_1.default.expect;
14
+ describe('MessageConsumer', function () {
15
+ var consumer;
16
+ beforeEach(function () {
17
+ consumer = new messageConsumerPact_1.MessageConsumerPact({
18
+ consumer: 'myconsumer',
19
+ provider: 'myprovider',
20
+ });
21
+ });
22
+ var testMessage = {
23
+ contents: {
24
+ foo: 'bar',
25
+ },
26
+ };
27
+ describe('#constructor', function () {
28
+ it('creates a Consumer when all mandatory parameters are provided', function () {
29
+ expect(consumer).to.be.a('object');
30
+ expect(consumer).to.respondTo('verify');
31
+ });
32
+ });
33
+ describe('#dsl', function () {
34
+ describe('when an empty description has been given', function () {
35
+ it('it should throw an error', function () {
36
+ expect(function () {
37
+ consumer.expectsToReceive('');
38
+ }).to.throw(Error);
39
+ });
40
+ });
41
+ describe('when an empty content object has been given', function () {
42
+ it('it should throw an error', function () {
43
+ expect(function () {
44
+ consumer.withContent({});
45
+ }).to.throw(Error);
46
+ });
47
+ });
48
+ describe('when an empty metadata object has been given', function () {
49
+ it('it should throw an error', function () {
50
+ expect(function () {
51
+ consumer.withMetadata({});
52
+ }).to.throw(Error);
53
+ });
54
+ });
55
+ });
56
+ describe('#verify', function () {
57
+ describe('when given a valid handler and message', function () {
58
+ it('verifies the consumer message', function () {
59
+ var stubbedConsumer = new messageConsumerPact_1.MessageConsumerPact({
60
+ consumer: 'myconsumer',
61
+ provider: 'myprovider',
62
+ });
63
+ var stub = stubbedConsumer;
64
+ // Stub out service factory
65
+ stub.getServiceFactory = function () { return ({
66
+ createMessage: function () { return Promise.resolve('message created'); },
67
+ }); };
68
+ stubbedConsumer
69
+ .given('some state')
70
+ .expectsToReceive('A message about something')
71
+ .withContent({ foo: 'bar' })
72
+ .withMetadata({ baz: 'bat' });
73
+ return expect(stubbedConsumer.verify(function () { return Promise.resolve('yay!'); })).to
74
+ .eventually.be.fulfilled;
75
+ });
76
+ });
77
+ });
78
+ describe('handler transformers', function () {
79
+ describe('#asynchronousbodyHandler', function () {
80
+ describe('when given a function that succeeds', function () {
81
+ it('returns a Handler object that returns a completed promise', function () {
82
+ var failFn = function () { return Promise.resolve('yay!'); };
83
+ var hFn = (0, messageConsumerPact_1.asynchronousBodyHandler)(failFn);
84
+ return expect(hFn(testMessage)).to.eventually.be.fulfilled;
85
+ });
86
+ });
87
+ describe('when given a function that throws an Exception', function () {
88
+ it('returns a Handler object that returns a rejected promise', function () {
89
+ var failFn = function () { return Promise.reject(new Error('fail')); };
90
+ var hFn = (0, messageConsumerPact_1.asynchronousBodyHandler)(failFn);
91
+ return expect(hFn(testMessage)).to.eventually.be.rejected;
92
+ });
93
+ });
94
+ });
95
+ describe('#synchronousbodyHandler', function () {
96
+ describe('when given a function that succeeds', function () {
97
+ it('returns a Handler object that returns a completed promise', function () {
98
+ var failFn = function () {
99
+ /* do nothing! */
100
+ };
101
+ var hFn = (0, messageConsumerPact_1.synchronousBodyHandler)(failFn);
102
+ return expect(hFn(testMessage)).to.eventually.be.fulfilled;
103
+ });
104
+ });
105
+ describe('when given a function that throws an Exception', function () {
106
+ it('returns a Handler object that returns a rejected promise', function () {
107
+ var failFn = function () {
108
+ throw new Error('fail');
109
+ };
110
+ var hFn = (0, messageConsumerPact_1.synchronousBodyHandler)(failFn);
111
+ return expect(hFn(testMessage)).to.eventually.be.rejected;
112
+ });
113
+ });
114
+ });
115
+ });
116
+ });
117
+ //# sourceMappingURL=messageConsumerPact.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageConsumerPact.spec.js","sourceRoot":"","sources":["../../src/messageConsumerPact.spec.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,12 @@
1
1
  /**
2
2
  * @module Message
3
3
  */
4
- import { PactMessageProviderOptions } from "./dsl/options";
4
+ import * as http from 'http';
5
+ import { MessageProvider } from './dsl/message';
6
+ import { PactMessageProviderOptions } from './dsl/options';
7
+ export declare const waitForServerReady: (server: http.Server) => Promise<http.Server>;
8
+ export declare const setupProxyServer: (app: (request: http.IncomingMessage, response: http.ServerResponse) => void) => http.Server;
9
+ export declare const providerWithMetadata: (provider: MessageProvider, metadata: Record<string, string>) => MessageProvider;
5
10
  /**
6
11
  * A Message Provider is analagous to Consumer in the HTTP Interaction model.
7
12
  *
@@ -14,11 +19,9 @@ export declare class MessageProviderPact {
14
19
  /**
15
20
  * Verify a Message Provider.
16
21
  */
17
- verify(): Promise<any>;
18
- private waitForServerReady;
22
+ verify(): Promise<unknown>;
19
23
  private runProviderVerification;
20
24
  private setupVerificationHandler;
21
- private setupProxyServer;
22
25
  private setupProxyApplication;
23
26
  private setupStates;
24
27
  private findHandler;
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ /**
3
+ * @module Message
4
+ */
5
+ var __assign = (this && this.__assign) || function () {
6
+ __assign = Object.assign || function(t) {
7
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
8
+ s = arguments[i];
9
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
10
+ t[p] = s[p];
11
+ }
12
+ return t;
13
+ };
14
+ return __assign.apply(this, arguments);
15
+ };
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.MessageProviderPact = exports.providerWithMetadata = exports.setupProxyServer = exports.waitForServerReady = void 0;
44
+ var lodash_1 = require("lodash");
45
+ var pact_core_1 = __importDefault(require("@pact-foundation/pact-core"));
46
+ var express_1 = __importDefault(require("express"));
47
+ var http = __importStar(require("http"));
48
+ var body_parser_1 = __importDefault(require("body-parser"));
49
+ var js_base64_1 = require("js-base64");
50
+ var logger_1 = __importStar(require("./common/logger"));
51
+ // Listens for the server start event
52
+ // Converts event Emitter to a Promise
53
+ var waitForServerReady = function (server) {
54
+ return new Promise(function (resolve, reject) {
55
+ server.on('listening', function () { return resolve(server); });
56
+ server.on('error', function () { return reject(); });
57
+ });
58
+ };
59
+ exports.waitForServerReady = waitForServerReady;
60
+ // Get the Proxy we'll pass to the CLI for verification
61
+ var setupProxyServer = function (app) { return http.createServer(app).listen(); };
62
+ exports.setupProxyServer = setupProxyServer;
63
+ var hasMetadata = function (o) {
64
+ return Boolean(o.__pactMessageMetadata);
65
+ };
66
+ var providerWithMetadata = function (provider, metadata) {
67
+ return function (descriptor) {
68
+ return Promise.resolve(provider(descriptor)).then(function (message) {
69
+ return hasMetadata(message)
70
+ ? {
71
+ __pactMessageMetadata: __assign(__assign({}, message.__pactMessageMetadata), metadata),
72
+ message: message,
73
+ }
74
+ : { __pactMessageMetadata: metadata, message: message };
75
+ });
76
+ };
77
+ };
78
+ exports.providerWithMetadata = providerWithMetadata;
79
+ /**
80
+ * A Message Provider is analagous to Consumer in the HTTP Interaction model.
81
+ *
82
+ * It is the initiator of an interaction, and expects something on the other end
83
+ * of the interaction to respond - just in this case, not immediately.
84
+ */
85
+ var MessageProviderPact = /** @class */ (function () {
86
+ function MessageProviderPact(config) {
87
+ this.config = config;
88
+ if (config.logLevel && !(0, lodash_1.isEmpty)(config.logLevel)) {
89
+ pact_core_1.default.logLevel(config.logLevel);
90
+ (0, logger_1.setLogLevel)(config.logLevel);
91
+ }
92
+ else {
93
+ (0, logger_1.setLogLevel)();
94
+ }
95
+ }
96
+ /**
97
+ * Verify a Message Provider.
98
+ */
99
+ MessageProviderPact.prototype.verify = function () {
100
+ logger_1.default.info('Verifying message');
101
+ // Start the verification CLI proxy server
102
+ var app = this.setupProxyApplication();
103
+ var server = (0, exports.setupProxyServer)(app);
104
+ // Run the verification once the proxy server is available
105
+ return (0, exports.waitForServerReady)(server)
106
+ .then(this.runProviderVerification())
107
+ .then(function (result) {
108
+ server.close();
109
+ return result;
110
+ }, function (err) {
111
+ server.close();
112
+ throw err;
113
+ });
114
+ };
115
+ // Run the Verification CLI process
116
+ MessageProviderPact.prototype.runProviderVerification = function () {
117
+ var _this = this;
118
+ return function (server) {
119
+ var opts = __assign(__assign({}, (0, lodash_1.omit)(_this.config, 'handlers')), { providerBaseUrl: "http://localhost:".concat(server.address().port) });
120
+ return pact_core_1.default.verifyPacts(opts);
121
+ };
122
+ };
123
+ // Get the API handler for the verification CLI process to invoke on POST /*
124
+ MessageProviderPact.prototype.setupVerificationHandler = function () {
125
+ var _this = this;
126
+ return function (req, res) {
127
+ var message = req.body;
128
+ // Invoke the handler, and return the JSON response body
129
+ // wrapped in a Message
130
+ _this.setupStates(message)
131
+ .then(function () { return _this.findHandler(message); })
132
+ .then(function (handler) { return handler(message); })
133
+ .then(function (messageFromHandler) {
134
+ if (hasMetadata(messageFromHandler)) {
135
+ var metadata = (0, js_base64_1.encode)(JSON.stringify(messageFromHandler.__pactMessageMetadata));
136
+ res.header('Pact-Message-Metadata', metadata);
137
+ res.header('PACT_MESSAGE_METADATA', metadata);
138
+ return res.json(messageFromHandler.message);
139
+ }
140
+ return res.json(messageFromHandler);
141
+ })
142
+ .catch(function (e) { return res.status(500).send(e); });
143
+ };
144
+ };
145
+ // Get the Express app that will run on the HTTP Proxy
146
+ MessageProviderPact.prototype.setupProxyApplication = function () {
147
+ var app = (0, express_1.default)();
148
+ app.use(body_parser_1.default.json());
149
+ app.use(body_parser_1.default.urlencoded({ extended: true }));
150
+ app.use(function (req, res, next) {
151
+ // TODO: this seems to override the metadata for content-type
152
+ res.header('Content-Type', 'application/json; charset=utf-8');
153
+ next();
154
+ });
155
+ // Proxy server will respond to Verifier process
156
+ app.all('/*', this.setupVerificationHandler());
157
+ return app;
158
+ };
159
+ // Lookup the handler based on the description, or get the default handler
160
+ MessageProviderPact.prototype.setupStates = function (message) {
161
+ var _this = this;
162
+ var promises = [];
163
+ if (message.providerStates) {
164
+ message.providerStates.forEach(function (state) {
165
+ var handler = _this.config.stateHandlers
166
+ ? _this.config.stateHandlers[state.name]
167
+ : null;
168
+ if (handler) {
169
+ promises.push(handler(state.name, state.params));
170
+ }
171
+ else {
172
+ logger_1.default.warn("no state handler found for \"".concat(state.name, "\", ignoring"));
173
+ }
174
+ });
175
+ }
176
+ return Promise.all(promises);
177
+ };
178
+ // Lookup the handler based on the description, or get the default handler
179
+ MessageProviderPact.prototype.findHandler = function (message) {
180
+ var handler = this.config.messageProviders[message.description || ''];
181
+ if (!handler) {
182
+ logger_1.default.error("no handler found for message ".concat(message.description));
183
+ return Promise.reject(new Error("No handler found for message \"".concat(message.description, "\".\n Check your \"handlers\" configuration")));
184
+ }
185
+ return Promise.resolve(handler);
186
+ };
187
+ return MessageProviderPact;
188
+ }());
189
+ exports.MessageProviderPact = MessageProviderPact;
190
+ //# sourceMappingURL=messageProviderPact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageProviderPact.js","sourceRoot":"","sources":["../../src/messageProviderPact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};