added example for a node message provider

This commit is contained in:
Tom Hombergs
2018-11-12 23:00:33 +01:00
parent 38d9b4ee72
commit 375b46309b
9 changed files with 125 additions and 59 deletions

View File

@@ -260,12 +260,6 @@
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
},
"assertion-error": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
"dev": true
},
"async": {
"version": "1.0.0",
"resolved": "http://registry.npmjs.org/async/-/async-1.0.0.tgz",
@@ -487,20 +481,6 @@
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
"chai": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
"integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
"dev": true,
"requires": {
"assertion-error": "1.1.0",
"check-error": "1.0.2",
"deep-eql": "3.0.1",
"get-func-name": "2.0.0",
"pathval": "1.1.0",
"type-detect": "4.0.8"
}
},
"chalk": {
"version": "2.3.1",
"resolved": "http://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz",
@@ -523,12 +503,6 @@
}
}
},
"check-error": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
"integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
"dev": true
},
"check-types": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/check-types/-/check-types-7.3.0.tgz",
@@ -797,15 +771,6 @@
}
}
},
"deep-eql": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
"integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
"dev": true,
"requires": {
"type-detect": "4.0.8"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -1189,12 +1154,6 @@
"lodash.padstart": "4.6.1"
}
},
"get-func-name": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
"integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
"dev": true
},
"get-stream": {
"version": "2.3.1",
"resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
@@ -1920,12 +1879,6 @@
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
"dev": true
},
"pathval": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
"integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
"dev": true
},
"pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -2448,12 +2401,6 @@
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
},
"type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true
},
"type-is": {
"version": "1.6.16",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",

View File

@@ -4,13 +4,14 @@
"description": "",
"main": "index.js",
"scripts": {
"test:consumer": "mocha consumer/*.spec.js"
"test:consumer": "mocha src/consumer/*.spec.js",
"test:provider": "mocha src/provider/*.spec.js",
"publish:pact": "node pact/publish.js"
},
"author": "Tom Hombergs",
"license": "MIT",
"devDependencies": {
"@pact-foundation/pact": "^7.0.3",
"chai": "^4.2.0",
"mocha": "^5.2.0"
}
}

View File

@@ -0,0 +1,13 @@
let publisher = require('@pact-foundation/pact-node');
let path = require('path');
let opts = {
providerBaseUrl: 'http://localhost:8080',
pactFilesOrDirs: [path.resolve(process.cwd(), 'pacts')],
pactBroker: 'https://adesso.pact.dius.com.au/',
pactBrokerUsername: process.env.PACT_USERNAME,
pactBrokerPassword: process.env.PACT_PASSWORD,
consumerVersion: '2.0.0'
};
publisher.publishPacts(opts).then(() => console.log("Pacts successfully published"));

View File

@@ -0,0 +1,63 @@
{
"consumer": {
"name": "node-message-consumer"
},
"provider": {
"name": "node-message-provider"
},
"messages": [
{
"description": "a hero created message",
"providerStates": [
],
"contents": {
"id": 42,
"name": "Superman",
"superpower": "flying",
"universe": "DC"
},
"matchingRules": {
"body": {
"$.id": {
"matchers": [
{
"match": "type"
}
]
},
"$.name": {
"matchers": [
{
"match": "type"
}
]
},
"$.superpower": {
"matchers": [
{
"match": "type"
}
]
},
"$.universe": {
"matchers": [
{
"match": "regex",
"regex": "^(DC|Marvel)$"
}
]
}
}
},
"metaData": {
"content-type": "application/json"
}
}
],
"metadata": {
"pactSpecification": {
"version": "3.0.0"
}
}
}

View File

@@ -14,9 +14,9 @@ describe("message consumer", () => {
describe("'hero created' message Handler", () => {
it("should accept a valid 'hero created' message", (done) => {
return messagePact
.expectsToReceive("a 'hero created' message")
it("should accept a valid hero created message", (done) => {
messagePact
.expectsToReceive("a hero created message")
.withContent({
id: Matchers.like(42),
name: Matchers.like("Superman"),
@@ -27,7 +27,7 @@ describe("message consumer", () => {
"content-type": "application/json",
})
.verify(synchronousBodyHandler(handleHeroCreatedEvent))
.then(done());
.then(done, (error) => done(error));
});
});

View File

@@ -0,0 +1,9 @@
const HeroCreatedMessage = require('../common/hero-created-message');
function produceHeroCreatedEvent(id) {
return new Promise((resolve, reject) => {
resolve({foo: "this is an invalid message that does not match the contract!"});
});
}
module.exports = produceHeroCreatedEvent;

View File

@@ -0,0 +1,33 @@
const {MessageProviderPact} = require('@pact-foundation/pact');
const produceHeroCreatedEvent = require('./hero-event-producer');
const path = require('path');
describe("message producer", () => {
const messagePact = new MessageProviderPact({
messageProviders: {
"a hero created message": () => produceHeroCreatedEvent(42),
},
log: path.resolve(process.cwd(), "logs"),
logLevel: "debug",
provider: "node-message-provider",
pactBrokerUrl: "https://adesso.pact.dius.com.au",
pactBrokerUsername: process.env.PACT_USERNAME,
pactBrokerPassword: process.env.PACT_PASSWORD,
publishVerificationResult: true,
providerVersion: '1.0.0',
tags: ['latest']
});
describe("'hero created' message producer", () => {
it("should create a valid hero created message", (done) => {
messagePact
.verify()
.then(done, (error) => done(error));
}).timeout(5000);
});
});