Contract Testing Pack
Available in: Business, Enterprise tiers
Consumer/provider contract tests and JSON definitions to verify API compatibility using Pact.js.
Why Use Contract Testing
Problem: API changes break integrations:
- Backend changes break frontend without warning
- No way to verify API contracts are maintained
- Integration tests require full backend setup
Solution: Generate Pact.js consumer/provider tests from your schema to catch breaking changes early.
Benefits
- Catch Breaking Changes: Before deployment
- Independent Development: Frontend/backend teams work in parallel
- Contract as Documentation: Living API contracts
Prerequisites
# Install Pact.js & Jest helpers
pnpm add -D @pact-foundation/pact jest jest-pact @prisma/client
# PZG Pro license required
Generate
Add to your schema.prisma:
generator pzgPro {
provider = "node ./node_modules/prisma-zod-generator/lib/cli/pzg-pro.js"
output = "./generated/pro"
enableContracts = true
}
Then run:
prisma generate
Generated Files
generated/
pro/
contracts/
consumer/ # Consumer tests
provider/ # Provider tests
definitions/ # JSON contract definitions
Run Tests
Add these scripts to your package.json:
{
"scripts": {
"test:contract:consumer": "jest generated/pro/contracts/consumer",
"test:contract:provider": "jest generated/pro/contracts/provider"
}
}
Then run:
# Run consumer tests
pnpm run test:contract:consumer
# Run provider tests
pnpm run test:contract:provider
Note: The generator creates test files but you need to manually add the npm scripts above to your package.json.
Consumer Example
// Consumer test expects specific API response format
import { pactWith } from 'jest-pact'
pactWith({ consumer: 'WebApp', provider: 'UserAPI' }, (interaction) => {
describe('GET /users/:id', () => {
beforeEach(() => {
interaction
.given('user 123 exists')
.uponReceiving('a request for user 123')
.withRequest({ method: 'GET', path: '/users/123' })
.willRespondWith({
status: 200,
body: {
id: '123',
email: 'user@example.com',
name: 'John Doe'
}
})
})
it('returns user data', async () => {
const response = await fetch('http://localhost:8989/users/123')
const user = await response.json()
expect(user.id).toBe('123')
})
})
})
See Also
- SDK Publisher - Generate typed SDK
- API Docs Pack - OpenAPI specifications