Example #1
0
	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();
    });
  });
});