pact-js-mock
v0.5.0
Published
A Library to build Pact interactions by leveraging existing mocks
Downloads
783
Readme
pact-js-mock
pact-js-mock
is a Node.js library that allows you to build Pact contracts by leveraging your existings mocks. It could be used with your existing mocks defined with msw or Cypress. This library provides an easy way to generate contracts that can be used for testing and verifying API interactions between consumer and provider.
Install
yarn add -D pact-js-mock
Getting started with MSW and Jest
Here is an example of how to use pact-js-mock with MSW using Jest:
import { setupServer, rest } from 'msw/node'
import { Pact } from 'pact-js-mock/lib/msw'
import { reloadPact, deletePact, writePact } from 'pact-js-mock/lib/utils'
import { writeFile } from 'fs'
const server = setupServer()
const pact = new Pact(
{
consumer: { name: 'test-consumer' },
provider: { name: 'rest-provider' },
metadata: { pactSpecification: { version: '2.0.0' } },
},
{
outputDir: 'pacts', // the pact is written by default to pacts folder
},
)
before(() => {
server.listen()
deletePact(pact)
})
beforeEach(function () {
// set the current test name as the source of the pact
pact.setCurrentSource(this.currentTest.title)
reloadPact(pact)
})
afterEach(() => {
server.resetHandlers()
writePact(pact)
})
after(() => {
server.close()
})
it('get all movies', async () => {
const mockMovies = rest.get(
'*/movies',
pact.toResolver({
description: 'a request to list all movies',
response: [
{
id: 1,
name: 'Movie 1',
year: 2008,
},
{
id: 2,
name: 'Movie 2',
year: 2008,
},
],
}),
)
server.use(mockMovies)
const movies = await fetchMovies()
expect(movies).toEqual([
{
id: 1,
name: 'Movie 1',
year: 2008,
},
{
id: 2,
name: 'Movie 2',
year: 2008,
},
])
})
You can find more example to mock
Getting started with MSW and Mocha
Here is an example of how to use pact-js-mock with MSW using Jest:
import { setupServer, rest } from 'msw/node'
import { Pact } from 'pact-js-mock/lib/msw'
import { reloadPact, deletePact, writePact } from 'pact-js-mock/lib/utils'
import { writeFile } from 'fs'
const server = setupServer()
const pact = new Pact(
{
consumer: { name: 'test-consumer' },
provider: { name: 'rest-provider' },
metadata: { pactSpecification: { version: '2.0.0' } },
},
{
outputDir: 'pacts', // the pact is written by default to pacts folder
},
)
before(() => {
server.listen()
deletePact(pact)
})
beforeEach(function () {
// set the current test name as the source of the pact
pact.setCurrentSource(this.currentTest.title)
reloadPact(pact)
})
afterEach(() => {
server.resetHandlers()
writePact(pact)
})
after(() => {
server.close()
})
it('get all movies', async () => {
const mockMovies = rest.get(
'*/movies',
pact.toResolver({
description: 'a request to list all movies',
response: [
{
id: 1,
name: 'Movie 1',
year: 2008,
},
{
id: 2,
name: 'Movie 2',
year: 2008,
},
],
}),
)
server.use(mockMovies)
const movies = await fetchMovies()
expect(movies).toEqual([
{
id: 1,
name: 'Movie 1',
year: 2008,
},
{
id: 2,
name: 'Movie 2',
year: 2008,
},
])
})
Getting started with Cypress
Here is an example of how to use pact-js-mock with Cypress:
Setup Pact
Write a file named pact.js
for example
import { Pact } from 'pact-js-mock/lib/cypress'
export const pact = new Pact(
{
consumer: { name: 'test-consumer' },
provider: { name: 'rest-provider' },
metadata: { pactSpecification: { version: '2.0.0' } },
},
{
outputDir: 'pacts', // the pact is written by default to pacts folder
},
)
Setup Cypress commands
Two Cypress functions are available with this module cy.reloadPact()
and cy.writePact()
, import the module pact-js-mock/lib/cypress/commands
in the file cypress/support/commands.(js|ts)
// cypress/support/commands.js
import 'pact-js-mock/lib/cypress/commands'
before(() => {
// To persist recorded interaction between each tests, add this
cy.reloadPact(pact)
})
beforeEach(() => {
// set the current test name as the source of the pact
pact.setCurrentSource(Cypress.currentTest.title)
})
after(() => {
// Write the pact file after each Cypress test
cy.writePact(pact)
})
Setup Cypress plugin
Import this in the cypress/plugins/index.js
// cypress/plugins/index.js
import pactPlugin from 'pact-js-mock/lib/cypress/plugin'
module.exports = (on, config) => {
config = pactPlugin(on, config)
return config
}
Write a sample test
it('get all movies', async () => {
// intercept and mock the movies response while record the interaction
cy.intercept(
'GET',
`/*/movies`,
pact.toHandler({
description: 'a request to list all movies',
response: [
{
id: 1,
name: 'Movie 1',
year: 2008,
},
{
id: 2,
name: 'Movie 2',
year: 2008,
},
],
}),
).as('multipleMovies')
// open the page to test
cy.visit('/')
// add your assertions
cy.wait('@multipleMovies')
.its('response')
.its('statusCode')
.should('be.equal', 200)
})
You can find more example to mock
Author
👤 Ludovic Dorival
- Github: @ludorival
Show your support
Give a ⭐️ if this project helped you!
📝 License
Copyright © 2021 Ludovic Dorival. This project is BSD--3--Clause licensed.
This README was generated with ❤️ by readme-md-generator