promise.all(pacts.map(function (pact) { var server = wrapper.createServer(pact); return server.start().then(function () { log.info('Pact Mock Server running on port: ' + server.options.port); }, function (err) { log.error('Error while trying to run karma-pact: ' + err); }); })).then(function() {
describe('Services', function () { var mockServer = wrapper.createServer({ port: 8585, log: path.resolve(process.cwd(), 'logs', 'mockserver-integration.log'), dir: path.resolve(process.cwd(), 'pacts'), spec: 2 }); var EXPECTED_BODY = '{"status":"ok","service":"first","clientId":"2","limit":"4"}'; beforeEach(function (done) { mockServer.start().then(function () { pact = Pact({consumer: 'second', provider: 'first'}); done(); }) }); afterEach(function (done) { wrapper.removeAllServers(); }); it('return a credit limit', function (done) { function requestProjects() { return request.get('http://localhost:8585/first/creditLimit/2').set({'Accept': 'application/json'}) } // This is how you create an interaction pact .interaction() .given('i have a list of projects') .uponReceiving('a request for projects') .withRequest('get', '/first/creditLimit/2', null, {'Accept': 'application/json'}) .willRespondWith(200, {'Content-Type': 'application/json'}, EXPECTED_BODY) // and this is how the verification process invokes your request // and writes the Pact file if all is well, returning you the data of the request // so you can do your assertions pact.verify(requestProjects) .then(function (data) { expect(JSON.parse(data)).to.eql(EXPECTED_BODY) done() }) .catch(function (err) { done(err) }) }); });
describe('Pact with Interceptor', () => { const MOCK_PORT = Math.floor(Math.random() * 999) + 9000 const PROVIDER_PORT = Math.floor(Math.random() * 999) + 9000 const PROVIDER_URL = `http://localhost:${PROVIDER_PORT}` const mockServer = wrapper.createServer({ port: MOCK_PORT, log: path.resolve(process.cwd(), 'logs', 'mockserver-integration.log'), dir: path.resolve(process.cwd(), 'pacts'), spec: 2 }) const interceptor = new Interceptor(`http://localhost:${MOCK_PORT}`) const EXPECTED_BODY = [{ id: 1, name: 'Project 1', due: '2016-02-11T09:46:56.023Z', tasks: [ {id: 1, name: 'Do the laundry', 'done': true}, {id: 2, name: 'Do the dishes', 'done': false}, {id: 3, name: 'Do the backyard', 'done': false}, {id: 4, name: 'Do nothing', 'done': false} ] }] var provider after(() => { wrapper.removeAllServers() }) before((done) => { mockServer.start().then(() => { provider = Pact({ consumer: 'Consumer Interceptor', provider: 'Provider Interceptor', port: MOCK_PORT }) interceptor.interceptRequestsOn(PROVIDER_URL) done() }) }) after((done) => { provider.finalize() .then(() => mockServer.delete()) .then(() => { interceptor.stopIntercepting() done() }) }) context('with a single request', () => { // add interactions, as many as needed beforeEach((done) => { provider.addInteraction({ state: 'i have a list of projects', uponReceiving: 'a request for projects', withRequest: { method: 'get', path: '/projects', headers: { 'Accept': 'application/json' } }, willRespondWith: { status: 200, headers: { 'Content-Type': 'application/json' }, body: EXPECTED_BODY } }).then(() => done()) }) // execute your assertions it('successfully verifies', (done) => { const verificationPromise = request .get(`${PROVIDER_URL}/projects`) .set({ 'Accept': 'application/json' }) .then(provider.verify) expect(verificationPromise).to.eventually.eql(JSON.stringify(EXPECTED_BODY)).notify(done) }) }) context('with two requests', () => { beforeEach((done) => { let interaction2 = provider.addInteraction({ state: 'i have a list of projects', uponReceiving: 'a request for a project that does not exist', withRequest: { method: 'get', path: '/projects/2', headers: { 'Accept': 'application/json' } }, willRespondWith: { status: 404, headers: { 'Content-Type': 'application/json' } } }).then(() => done()) }) it('successfully verifies', (done) => { let promiseResults = [] const verificationPromise = request.get(`${PROVIDER_URL}/projects`) .set({ 'Accept': 'application/json' }) .then((response) => { promiseResults.push(response) return request.get(`${PROVIDER_URL}/projects/2`).set({ 'Accept': 'application/json' }) }) .then(() => {}, (err) => { promiseResults.push(err.response) }) .then(() => provider.verify(promiseResults)) expect(verificationPromise).to.eventually.eql([JSON.stringify(EXPECTED_BODY), '']).notify(done) }) }) context('with an unexpected interaction', () => { it('fails verification', (done) => { let promiseResults = [] const verificationPromise = request.get(`${PROVIDER_URL}/projects`) .set({ 'Accept': 'application/json' }) .then((response) => { promiseResults.push(response) return request.delete(`${PROVIDER_URL}/projects/2`) }) .then(() => {}, (err) => { promiseResults.push(err.response) }) .then(() => provider.verify(promiseResults)) expect(verificationPromise).to.be.rejectedWith('No interaction found for DELETE /projects/2').notify(done) }) }) })
'use strict' var path = require('path') var wrapper = require('@pact-foundation/pact-node') var mockServer = wrapper.createServer({ port: 1234, log: path.resolve(process.cwd(), 'logs', 'mockserver-ui.log'), dir: path.resolve(process.cwd(), 'pacts'), spec: 2 }) mockServer.start().then(function () { run() process.on('SIGINT', function () { wrapper.removeAllServers() }) })
describe('Pact random mock port', () => { const MOCK_PORT = Math.floor(Math.random() * 999) + 9000 const PROVIDER_URL = `http://localhost:${MOCK_PORT}` const mockServer = wrapper.createServer({ port: MOCK_PORT, log: path.resolve(process.cwd(), 'logs', 'mockserver-integration.log'), dir: path.resolve(process.cwd(), 'pacts'), spec: 2 }) const EXPECTED_BODY = [{ id: 1, name: 'Project 1', due: '2016-02-11T09:46:56.023Z', tasks: [ {id: 1, name: 'Do the laundry', 'done': true}, {id: 2, name: 'Do the dishes', 'done': false}, {id: 3, name: 'Do the backyard', 'done': false}, {id: 4, name: 'Do nothing', 'done': false} ] }] var provider, counter = 1 after(() => { wrapper.removeAllServers() }) beforeEach((done) => { mockServer.start().then(() => { provider = Pact({ consumer: `Consumer ${counter}`, provider: `Provider ${counter}`, port: MOCK_PORT }) done() }) }) afterEach((done) => { mockServer.delete().then(() => { counter++ done() }) }) context('with a single request', () => { // add interactions, as many as needed beforeEach((done) => { provider.addInteraction({ state: 'i have a list of projects', uponReceiving: 'a request for projects', withRequest: { method: 'get', path: '/projects', headers: { 'Accept': 'application/json' } }, willRespondWith: { status: 200, headers: { 'Content-Type': 'application/json' }, body: EXPECTED_BODY } }).then(() => done()) }) // once test is run, write pact and remove interactions afterEach((done) => { provider.finalize().then(() => done()) }) // execute your assertions it('successfully verifies', (done) => { const verificationPromise = request .get(`${PROVIDER_URL}/projects`) .set({ 'Accept': 'application/json' }) .then(provider.verify) expect(verificationPromise).to.eventually.eql(JSON.stringify(EXPECTED_BODY)).notify(done) }) }) context('with a single request and matchers', () => { // add interactions, as many as needed beforeEach((done) => { provider.addInteraction({ state: 'i have a list of projects but I dont know how many', uponReceiving: 'a request for such projects', withRequest: { method: 'get', path: '/projects', headers: { 'Accept': 'application/json' } }, willRespondWith: { status: 200, headers: { 'Content-Type': Matchers.term({ generate: 'application/json', matcher: 'application\/json' }) }, body: [{ id: 1, name: 'Project 1', due: '2016-02-11T09:46:56.023Z', tasks: Matchers.eachLike({ id: Matchers.somethingLike(1), name: Matchers.somethingLike('Do the laundry'), 'done': Matchers.somethingLike(true) }, { min: 4 }) }] } }).then(() => done()) }) // once test is run, write pact and remove interactions afterEach((done) => { provider.finalize().then(() => done()) }) // execute your assertions it('successfully verifies', (done) => { const verificationPromise = request .get(`${PROVIDER_URL}/projects`) .set({ 'Accept': 'application/json' }) .then(provider.verify) verificationPromise.then((data) => { let jsonData = JSON.parse(data)[0] expect(jsonData).to.have.property('tasks') expect(jsonData.tasks).to.have.lengthOf(4) done() }) }) }) context('with two requests', () => { beforeEach((done) => { let interaction1 = provider.addInteraction({ state: 'i have a list of projects', uponReceiving: 'a request for projects', withRequest: { method: 'get', path: '/projects', headers: { 'Accept': 'application/json' } }, willRespondWith: { status: 200, headers: { 'Content-Type': 'application/json' }, body: EXPECTED_BODY } }) let interaction2 = provider.addInteraction({ state: 'i have a list of projects', uponReceiving: 'a request for a project that does not exist', withRequest: { method: 'get', path: '/projects/2', headers: { 'Accept': 'application/json' } }, willRespondWith: { status: 404, headers: { 'Content-Type': 'application/json' } } }) Promise.all([interaction1, interaction2]).then(() => done()) }) // once test is run, write pact and remove interactions afterEach((done) => { provider.finalize().then(() => done()) }) it('successfully verifies', (done) => { let promiseResults = [] const verificationPromise = request.get(`${PROVIDER_URL}/projects`) .set({ 'Accept': 'application/json' }) .then((response) => { promiseResults.push(response) return request.get(`${PROVIDER_URL}/projects/2`).set({ 'Accept': 'application/json' }) }) .then(() => {}, (err) => { promiseResults.push(err.response) }) .then(() => provider.verify(promiseResults)) expect(verificationPromise).to.eventually.eql([JSON.stringify(EXPECTED_BODY), '']).notify(done) }) }) context('with an unexpected interaction', () => { // add interactions, as many as needed beforeEach((done) => { provider.addInteraction({ state: 'i have a list of projects', uponReceiving: 'a request for projects', withRequest: { method: 'get', path: '/projects', headers: { 'Accept': 'application/json' } }, willRespondWith: { status: 200, headers: { 'Content-Type': 'application/json' }, body: EXPECTED_BODY } }).then(() => done()) }) // once test is run, write pact and remove interactions afterEach((done) => { provider.finalize().then(() => done()) }) it('fails verification', (done) => { let promiseResults = [] const verificationPromise = request.get(`${PROVIDER_URL}/projects`) .set({ 'Accept': 'application/json' }) .then((response) => { promiseResults.push(response) return request.delete(`${PROVIDER_URL}/projects/2`) }) .then(() => {}, (err) => { promiseResults.push(err.response) }) .then(() => provider.verify(promiseResults)) expect(verificationPromise).to.be.rejectedWith('No interaction found for DELETE /projects/2').notify(done) }) }) })
describe("Restaurant service", function() { var client, restaurantTypeProvider, server; var somethingLike = Pact.Matcher.somethingLike; var eachLike = Pact.Matcher.eachLike; this.timeout(10000); var pact = Pact({ consumer: 'Restaurant Rating Consumer', provider: 'Restaurant Service' }); var server = wrapper.createServer({ port: 1234, log: path.resolve(process.cwd(), 'log', 'mockserver-integration.log'), dir: path.resolve(process.cwd(), 'pacts'), spec: 2 }); before(function(done) { server.start().then(function() { done(); }); }); after(function() { wrapper.removeAllServers(); }); it("restaurant endpoint", function(done) { pact .interaction() .uponReceiving("a request for information about a restaurant") .withRequest( "get", "/restaurant", {name: "Gondolier"} ) .willRespondWith(200, { "Content-Type": "application/json" }, { "name": somethingLike("Gondolier"), "rating": somethingLike(5) }); pact.verify(function() { return request .get('http://localhost:1234/restaurant?name=Gondolier') .end(function(err, res) {}); }).then(function(res) { expect(JSON.parse(res)).to.deep.equal({ name: "Gondolier", rating: 5 }); done(); }); }); it("top rated endpoint", function(done) { pact .interaction() .uponReceiving("a request for the name of the top rated restaurant") .withRequest( "get", "/topRated" ) .willRespondWith(200, { "Content-Type": "application/json" }, { "name": somethingLike("Gondolier"), "rating": somethingLike(5) }); pact.verify(function() { return request .get('http://localhost:1234/topRated') .end(function(err, res){}); }).then(function(res) { expect(JSON.parse(res)).to.deep.equal({ name: "Gondolier", rating: 5 }); done(); }); }); });