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.
yarn add -D pact-js-mock
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
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,
},
])
})
Here is an example of how to use pact-js-mock with Cypress:
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
},
)
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)
})
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
}
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
👤 Ludovic Dorival
- Github: @ludorival
Give a ⭐️ if this project helped you!
Copyright © 2021 Ludovic Dorival.
This project is BSD--3--Clause licensed.
This README was generated with ❤️ by readme-md-generator