• Stars
    star
    146
  • Rank 252,769 (Top 5 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created about 9 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Core binaries for pact-js, a Contract Testing Framework. NOTE: If you are looking to do Pact contract testing in node, you almost certainly want pact-js, not pact-node.

โ„น๏ธ Usage notice
This is a core library, designed for use in the bowels of another package. Unless you are wanting to develop tools for the pact ecosystem, you almost certainly want to install @pact-foundation/pact instead

Build and test Known Vulnerabilities npm license dependencies slack

Pact-JS Core

A wrapper for the Pact CLI Tools.

Installation

npm install @pact-foundation/pact-core --save-dev

Do Not Track

In order to get better statistics as to who is using Pact, we have an anonymous tracking event that triggers when Pact installs for the first time. To respect your privacy, anyone can turn it off by simply adding a 'do not track' flag within their package.json file:

{
 "name": "some-project",
 ...
 "config": {
  "pact_do_not_track": true
 },
 ...
}

Which Library/Package should I use?

TL;DR - you almost always want Pact JS.

Purpose Library Comments
Synchronous / HTTP APIs Pact JS
Asynchronous APIs Pact JS
Node.js Pact JS
Browser testing Pact Web You probably still want Pact JS. See Using Pact in non-Node environments *
Isomorphic testing Pact Web You probably still want Pact JS. See Using Pact in non-Node environments *
Publishing to Pact Broker Pact Node Included in Pact JS distribution

* The "I need to run it in the browser" question comes up occasionally. The question is this - for your JS code to be able to make a call to another API, is this dependent on browser-specific code? In most cases, people use tools like React/Angular which have libraries that work on the server and client side, in which case, these tests don't need to run in a browser and could instead be executed in a Node.js environment.

Usage

Simply require the library and call the create function to start the mock service

var pact = require("@pact-foundation/pact-core");
var server = pact.createServer({ port: 9999 });
server.start().then(function() {
 // Do your testing/development here
});

Or if you're using Typescript instead of plain old Javascript

import pact from "@pact-foundation/pact-core";
const server = pact.createServer({ port: 9999 });
server.start().then(() => {
 // Do your testing/development here
});

Or you can also use the CLI

$# pact mock --port 9999

To see the list commands possible with the CLI, simply ask for help $# pact --help

Documentation

Set Log Level

var pact = require("@pact-foundation/pact-core");
pact.logLevel("debug");

Mock Servers

Mock servers are used by Pact to record interactions and create pact contracts.

Create Mock Server

var pact = require('@pact-foundation/pact-core');
var server = pact.createServer({
 ...
});

Options:

Parameter Required? Type Description
port false number Port number that the server runs on, defaults to random available port
host false string Host on which to bind the server on, defaults to 'localhost'. Supports '0.0.0.0' to bind on all IPv4 addresses on the local machine.
log false string File to log output on relative to current working directory, defaults to none
logLevel false LogLevel (string) Log level to pass to the pact core. One of "DEBUG", "ERROR", "WARN", "INFO"
ssl false boolean Create a self-signed SSL cert to run the server over HTTPS , defaults to false
sslcert false string Path to a custom self-signed SSL cert file, 'ssl' option must be set to true to use this option, defaults to none
sslkey false string Path a custom key and self-signed SSL cert key file, 'ssl' option must be set to true to use this, defaults to none
cors false boolean Allow CORS OPTION requests to be accepted, defaults to 'false'
dir false string Directory to write the pact contracts relative to the current working directory, defaults to none
spec false number The pact specification version to use when writing pact contracts, defaults to '1'
consumer false string The name of the consumer to be written to the pact contracts, defaults to none
provider false string The name of the provider to be written to the pact contracts, defaults to none
pactFileWriteMode false overwrite OR update OR merge Control how the pact file is created. Defaults to "overwrite"
format false json OR xml Format to write the results as, either in JSON or XML, defaults to JSON
out false string Write output to a file instead of returning it in the promise, defaults to none
timeout false number How long to wait for the mock server to start up (in milliseconds). Defaults to 30000 (30 seconds)

List Mock Servers

If you ever need to see which servers are currently created.

var pact = require("@pact-foundation/pact-core");
var servers = pact.listServers();
console.log(JSON.stringify(servers));

Remove All Mock Servers

Remove all servers once you're done with them in one fell swoop.

var pact = require("@pact-foundation/pact-core");
pact.removeAllServers();

Start a Mock Server

Start the current server.

var pact = require("@pact-foundation/pact-core");
pact.createServer()
 .start()
 .then(function() {
  // Do something after it started
 });

Stop a Mock server

Stop the current server.

var pact = require("@pact-foundation/pact-core");
pact.createServer()
 .stop()
 .then(function() {
  // Do something after it stopped
 });

Delete a Mock server

Stop the current server and deletes it from the list.

var pact = require("@pact-foundation/pact-core");
pact.createServer()
 .delete()
 .then(function() {
  // Do something after it was killed
 });

Check if a Mock server is running

var pact = require("@pact-foundation/pact-core");
pact.createServer().running;

Mock Server Events

There's 3 different events available, 'start', 'stop' and 'delete'. They can be listened to the same way as an EventEmitter.

var pact = require("@pact-foundation/pact-core");
var server = pact.createServer();
server.on("start", function() {
 console.log("started");
});
server.on("stop", function() {
 console.log("stopped");
});
server.on("delete", function() {
 console.log("deleted");
});

Provider Verification

Read more about Verify Pacts.

var pact = require('@pact-foundation/pact-core');

pact.verifyPacts({
 ...
});

Options:

Parameter Required? Type Description
providerBaseUrl true string Running API provider host endpoint.
pactBrokerUrl false string Base URL of the Pact Broker from which to retrieve the pacts. Required if pactUrls not given.
provider false string Name of the provider if fetching from a Broker
consumerVersionSelectors false ConsumerVersionSelector|array Use Selectors to is a way we specify which pacticipants and versions we want to use when configuring verifications.
consumerVersionTags false string|array Retrieve the latest pacts with given tag(s)
providerVersionTags false string|array Tag(s) to apply to the provider application
includeWipPactsSince false string Includes pact marked as WIP since this date. String in the format %Y-%m-%d or %Y-%m-%dT%H:%M:%S.000%:z
pactUrls false array Array of local pact file paths or HTTP-based URLs. Required if not using a Pact Broker.
providerStatesSetupUrl false string URL to send PUT requests to setup a given provider state
pactBrokerUsername false string Username for Pact Broker basic authentication
pactBrokerPassword false string Password for Pact Broker basic authentication
pactBrokerToken false string Bearer token for Pact Broker authentication
publishVerificationResult false boolean Publish verification result to Broker (NOTE: you should only enable this during CI builds)
providerVersion false string Provider version, required to publish verification result to Broker. Optional otherwise.
enablePending false boolean Enable the pending pacts feature.
timeout false number The duration in ms we should wait to confirm verification process was successful. Defaults to 30000.
logLevel false LogLevel (string) Log level. One of "TRACE", "DEBUG", "ERROR", "WARN", "INFO"

The consumer version selector looks like this:

ConsumerVersionSelector {
  tag?: string;
  latest?: boolean;
  consumer?: string;
  deployedOrReleased?: boolean;
  deployed?: boolean; 
  released?: boolean; 
  environment?: string;
  fallbackTag?: string;
  branch?: string;
  mainBranch?: boolean;
  matchingBranch?: boolean;
}

See the Pact Broker documentation on selectors for more information.

Pact Broker Publishing

var pact = require('@pact-foundation/pact-core');
var opts = {
 ...
};

pact.publishPacts(opts).then(function () {
 // do something
});

Options:

Parameter Required? Type Description
pactFilesOrDirs true array Array of local Pact files or directories containing them. Required.
pactBroker true string URL of the Pact Broker to publish pacts to. Required.
consumerVersion true string A string containing a semver-style version e.g. 1.0.0. Required.
pactBrokerUsername false string Username for Pact Broker basic authentication. Optional
pactBrokerPassword false string Password for Pact Broker basic authentication. Optional
pactBrokerToken false string Bearer token for Pact Broker authentication. Optional
tags false array An array of Strings to tag the Pacts being published. Optional
branch false string The branch to associate with the published pacts. Optional but recommended
autoDetectVersionProperties false boolean Automatically detect the repository branch from known CI environment variables or git CLI. Supports Buildkite, Circle CI, Travis CI, GitHub Actions, Jenkins, Hudson, AppVeyor, GitLab, CodeShip, Bitbucket and Azure DevOps. Optional
buildUrl false string The build URL that created the pact. Optional
verbose false boolean Enables verbose output for underlying pact binary.

Pact Broker Deployment Check

var pact = require('@pact-foundation/pact-core');
var opts = {
 ...
};

pact.canDeploy(opts)
 .then(function (result) {
  // You can deploy this
    // If output is not specified or is json, result describes the result of the check.
    // If outout is 'table', it is the human readable string returned by the check
 })
 .catch(function(error) {
  // You can't deploy this
    // if output is not specified, or is json, error will be an object describing
    // the result of the check (if the check failed),
    // if output is 'table', then the error will be a string describing the output from the binary,

    // In both cases, `error` will be an Error object if something went wrong during the check.
 });

Options:

Parameter Required? Type Description
pacticipants true []objects An array of version selectors in the form `{ name: String, latest?: string
specify a tag, use the tagname with latest. Specify one of these per pacticipant
that you want to deploy
pactBroker true string URL of the Pact Broker to query about deployment. Required.
pactBrokerUsername false string Username for Pact Broker basic authentication. Optional
pactBrokerPassword false string Password for Pact Broker basic authentication. Optional
pactBrokerToken false string Bearer token for Pact Broker authentication. Optional
output false json,table Specify output to show, json or table. Optional, Defaults to json.
verbose false boolean Enables verbose output for underlying pact binary.
retryWhileUnknown false number The number of times to retry while there is an unknown verification result. Optional
retryInterval false number The time between retries in seconds, use with retryWhileUnknown. Optional
to false string The tag that you want to deploy to (eg, 'prod')

Stub Servers

Stub servers create runnable APIs from existing pact files.

The interface is comparable to the Mock Server API.

Create Stub Server

var pact = require('@pact-foundation/pact-core');
var server = pact.createStub({
 ...
});

Options:

Parameter Required? Type Description
pactUrls true array List of local Pact files to create the stub service from
port false number Port number that the server runs on, defaults to random available port
host false string Host on which to bind the server on, defaults to 'localhost'. Supports '0.0.0.0' to bind on all IPv4 addresses on the local machine.
log false string File to log output on relative to current working directory, defaults to none
logLevel false LogLevel (string) Log level to pass to the pact core. One of "DEBUG", "ERROR", "WARN", "INFO"
ssl false boolean Create a self-signed SSL cert to run the server over HTTPS , defaults to 'false'
sslcert false string Path to a custom self-signed SSL cert file, 'ssl' option must be set to true to use this option. Defaults false
sslkey false string Path a custom key and self-signed SSL cert key file, 'ssl' option must be set to true to use this option false. Defaults to none
cors false boolean Allow CORS OPTION requests to be accepted, defaults to 'false'
timeout false number How long to wait for the stub server to start up (in milliseconds). Defaults to 30000 (30 seconds)

Message Pacts

Create Message Pacts

var pact = require('@pact-foundation/pact-core');
var message = pact.createMessage({
 ...
});

Options:

Parameter Required? Type Description
dir true string Directory to write the pact contracts relative to the current working directory, defaults to none
consumer true string The name of the consumer to be written to the pact contracts, defaults to none
provider true string The name of the provider to be written to the pact contracts, defaults to none
pactFileWriteMode false `"overwrite" "update"
Example
const messageFactory = messageFactory({
 consumer: "consumer",
 provider: "provider",
 dir: dirname(`${__filename}/pacts`),
 content: `{
  "description": "a test mesage",
  "content": {
   "name": "Mary"
  }
 }`
});

messageFactory.createMessage();

CLI Tools

This package also comes with the Pact Standalone Tools available as linked binaries in the standard NPM installation directory (e..g. ./node_modules/.bin).

This means you may call them direct from scripts in your package json, for example:

"scripts": {
  "pactPublish": "pact-broker publish ./pacts --consumer-app-version=$\(git describe\) --broker-base-url=$BROKER_BASE_URL --broker-username=$BROKER_USERNAME --broker-password=BROKER_PASSWORD"`
}
These are available in circumstances where `pact-core` has not yet implemented a feature or access via JavaScript APIs is not desirable. To run the binaries is as simple as the following:

*Example can-i-deploy check*:
```sh
./node_modules/.bin/pact-broker can-i-deploy --pacticipant "Banana Service" --broker-base-url https://test.pact.dius.com.au --latest --broker-username dXfltyFMgNOFZAxr8io9wJ37iUpY42M --broker-password O5AIZWxelWbLvqMd8PkAVycBJh2Psyg1

Computer says no ยฏ\_(ใƒ„)_/ยฏ

CONSUMER       | C.VERSION | PROVIDER       | P.VERSION | SUCCESS?
---------------|-----------|----------------|-----------|---------
Banana Service | 1.0.0     | Fofana Service | 1.0.0     | false

The verification between the latest version of Banana Service (1.0.0) and version 1.0.0 of Fofana Service failed

The following are the binaries currently made available:

  • pact-mock-service
  • pact-broker
  • pact-stub-service
  • pact-message
  • pact-provider-verifier
  • pact

Windows Issues

Enable Long Paths

Windows has a default path length limit of 260 causing issues with projects that are nested deep inside several directory and with how npm handles node_modules directory structures. To fix this issue, please enable Windows Long Paths in the registry by running regedit.exe, find the key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled and change the value from 0 to 1, then reboot your computer. Pact should now work as it should, if not, please raise an issue on github.

Contributing

To develop this project, simply install the dependencies with npm install --ignore-scripts, and run npm run watch to for continual development, linting and testing when a source file changes.

Testing

Running npm test will execute the tests that has the *.spec.js pattern.

Questions?

Please search for potential answers or post question on our official Pact StackOverflow.

More Repositories

1

pact-ruby

Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project.
Ruby
2,160
star
2

pact-js

JS version of Pact. Pact is a contract testing framework for HTTP APIs and non-HTTP asynchronous messaging systems.
TypeScript
1,456
star
3

pact-jvm

JVM version of Pact. Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project.
Kotlin
1,082
star
4

pact-go

Golang version of Pact. Pact is a contract testing framework for HTTP APIs and non-HTTP asynchronous messaging systems.
Go
857
star
5

pact-net

.NET version of Pact. Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project.
C#
845
star
6

pact_broker

Enables your consumer driven contracts workflow
Ruby
702
star
7

pact-python

Python version of Pact. Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project.
Python
501
star
8

pact-specification

Describes the pact format and verification specifications
295
star
9

pact-php

PHP version of Pact. Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project
PHP
244
star
10

pact.io

Pact Foundation Website
HTML
219
star
11

pact-workshop-js

Pact JS workshop - learn Pact in 60 minutes
JavaScript
129
star
12

pact-workshop-go

Golang Pact workshop
Go
106
star
13

pact-broker-docker

Dockerized Pact Broker
Shell
92
star
14

pact-reference

Reference implementations for the pact specifications
Rust
87
star
15

pact-workshop-jvm-spring

Example Spring Boot project for the Pact workshop
Java
85
star
16

jest-pact

A Pact adaptor for to allow you to easily run tests with Jest
TypeScript
81
star
17

pact-workshop-dotnet-core-v1

A workshop for Pact using .NET Core
C#
76
star
18

pact-stub-server

Standalone pact stub server
Rust
75
star
19

pact-mock_service

Provides a mock service for use with Pact
Ruby
73
star
20

pact_broker-client

A Ruby and CLI client for the Pact Broker. Publish and retrieve pacts and verification results.
Ruby
69
star
21

nestjs-pact

Injectable Pact.js Consumer/Producer for NestJS
TypeScript
48
star
22

devrel

Developer Relations @ Pact - Your map to the Pact landscape for all-comers (maintainers, contributors, users, newbies)
38
star
23

pact-ruby-standalone

A standalone pact command line executable using the ruby pact implementation and Travelling Ruby
Shell
35
star
24

pact-provider-verifier

Cross-platform, generic language, Pact provider verification tool
Ruby
28
star
25

pact-workshop-Maven-Springboot-JUnit5

Pact Maven + Springboot + JUnit5 workshop - learn Pact in 60 minutes
28
star
26

pact-stub-server-archived

Wraps the Pact Rust mock server in a Docker container
Dockerfile
25
star
27

pact-js-mocha

EXPERIMENTAL Mocha Interface for Pact JS (warning: it is not recommended for beginners)
JavaScript
18
star
28

pact-plugins

๐Ÿฐ Architecture to support Plugins ๐Ÿ”Œ with Pact ๐Ÿ”—
Rust
16
star
29

pact-provider-proxy

Allows pact verification against a running provider at a configurable base URL
Ruby
16
star
30

docs.pact.io

Pact documentation website
HTML
15
star
31

pact-broker-chart

This repository houses the Pact Broker Helm Chart
Smarty
11
star
32

karma-pact

Pact Framework Plugin for Karma
Shell
11
star
33

pact-5-minute-getting-started-guide

JavaScript
11
star
34

pact-ruby-cli

Amalgamated Pact Ruby CLI
Shell
11
star
35

pact-support

Shared code for Pact gems
Ruby
7
star
36

pact_broker-serverless

Pact Broker running in AWS Lambda with Serverless
Shell
7
star
37

pact-cplusplus

C++ DSL for Pact Library
HTML
6
star
38

pact-ruby-e2e-example

Code base to use for demonstrating features and recreating issues in the ruby implementation of pact. Please fork it and modify to recreate your own code.
Ruby
5
star
39

pact-xml

XML support for the Pact gem
Ruby
4
star
40

pact-plugin-template-golang

Pact ๐Ÿ”— Plugin ๐Ÿ”Œ template for the GoLang ๐Ÿฟ๏ธ language = ๐Ÿซถ
Go
4
star
41

pact-message-demo

Ruby
4
star
42

pact-consumer-minitest

Minitest support for the Pact Consumer gem
Ruby
4
star
43

serverless-offline-pact

A serverless offline plugin to start one or more pact stub service alongside your serverless application
TypeScript
3
star
44

pact-mock-service-docker

Docker image running the Pact mock service
Ruby
3
star
45

homebrew-pact-ruby-standalone

The Pact Ruby Standalone public homebrew tap for macos/linux homebrew formulae
Shell
3
star
46

.github

The GitHub landing page for Pact - The de-facto contract testing tool
3
star
47

pact-event-bot

TypeScript
2
star
48

pact-standalone-npm

Pact Standalone wrapper for NPM projects
JavaScript
2
star
49

pact-parser

Small server to aid using existing pacts files as data sources in unit and integrational testing.
JavaScript
2
star
50

pact-mock-service-npm

Shell
2
star
51

pact-js-cli

The Broker CLI for Pact, but available to your node scripts
TypeScript
2
star
52

grunt-pact

A grunt task to run pact-node
JavaScript
1
star
53

pactr

R version of Pact. Enables consumer driven contract testing. Please read the Pact.io for specific information about PACT.
R
1
star
54

release-gem

Github action that bumps the version, generates the changelog, releases the gem, and creates a Github release
Shell
1
star
55

mocha-pact

An adaptor to allow you to easily run pact tests with Mocha
TypeScript
1
star
56

pact-ruby-standalone-e2e-example

Code base to use for demonstrating features and recreating issues in the Ruby standalone implementation of pact. Please fork it and modify to recreate your own code.
Shell
1
star
57

cypress-pact

Pact plugin for integrating Pact with Cypress tests
1
star
58

pact-js-dev-config

Shared configs for developers working on pact-js and related projects
JavaScript
1
star
59

blog.pact.io

Ghost application setup for blog.pact.io
SCSS
1
star