Consumer Driven Contracts (CDC)
npm install cdcCDC provides a way to define mock provider for consumer and verify contracts against provider.
It is written in JavaScript, however can be run in any setup using docker.
yaml
version: '2'
services:
api:
build:
context: .
depends_on:
- dependency
command: npm start
dependency:
image: uldissturms/cdc
volumes:
- ./contracts/dependency:/usr/app/src/contracts
command: mock
ports:
- "3000:3000"
`Where ./contracts/dependency contains index.js that describes contract.
`
./contracts
└── dependency
└── index.js
`$3
`
docker run -p 3000:3000 -v ${PWD}/contracts:/usr/app/src/contracts uldissturms/cdc mock ./contracts/simple
`$3
`bash
npm i cdc
./node_modules/.bin/cdc mock ./contracts/simple
./node_modules/.bin/cdc verify ./contracts/simple --baseUrl http://localhost:3000
`Contracts
#### Simple contract with schema validation
`javascript
const joi = require('joi')module.exports = {
name: 'simple request/response schema',
request: {
path: '/api/simple-schema',
method: 'POST',
headers: {
'content-type': 'application/json'
},
body: {
hello: 'world'
},
bodySchema: joi.object().keys({
hello: joi.string()
})
},
response: {
body: {
id: 12345
},
bodySchema: joi.object().keys({
id: joi.number().integer()
})
}
}
`
#### Response
`
curl localhost:3000/api/simple-schema -H 'content-type: application/json' -d '{"hello": "world"}'
`
` json
{"id": 12345}
`Usage


| | request | response |
| ---------|---------------| --------------|
| consumer | verify schema | mock |
| provider | request | verify schema |
-
mock - mocks responses for consumer
- verify - verifies contracts agains provider$3
- mock
- --port, -p - port for running mock server, defaults to 3000 (optional)
- --no-cors, -C - disable CORS support (optional)
- --watch, -w - to watch current directory for contract changes (optional)
- --tls, -t - enable TLS with a self signed certificate ( setting NODE_TLS_REJECT_UNAUTHORIZED=0 when consuming from node might be required )
- verify
- --baseUrl, -b - base url to run verifications against (required)$3
For more examples take a look at contracts in
./contracts` used for tests.MIT