Nasty Polka Music

    @pact-foundation/pact-node
    TypeScript icon, indicating that this package has built-in type declarations

    10.17.6 • Public • Published

    [Build and test Known Vulnerabilities npm license dependencies slack

    Pact Node

    An idiomatic Node wrapper for the Pact CLI Tools.

    NOTE: If you are new to Pact and are wanting to get started with contract testing, you almost certainly don't want to use this package. Head over to Pact JS instead.

    Installation

    npm install @pact-foundation/pact-node --save

    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
    	},
    	...
    }

    Pact Download Location

    For those that are behind a corporate firewall or are seeing issues where our package downloads binaries during installation, you can download the binaries directly from our github releases, and specify the location where you want Pact to get the binaries from using the 'config' section in your package.json file:

    {
    	"name": "some-project",
    	...
    	"config": {
    		"pact_binary_location": "/home/some-user/Downloads"
    	},
    	...
    }

    It will accept both a local path or an http(s) url. It must point to the directory containing the binary needed as the binary name is appended to the end of the location. For the example given above, Pact will look for the binary at /home/some-user/Downloads/pact-1.44.0-win32.zip for a Windows system. However, by using this method, you must use the correct Pact version binary associated with this version of Pact-Node. For extra security measurements, checksum validation has been added to prevent tampering with the binaries.

    If your environment uses self-signed certificates from an internal Certificate Authority (CA), you can configure this using the standard options in an npmrc file as per below:

    ~/.npmrc:

    cafile=/etc/ssl/certs/ca-certificates.crt
    strict-ssl=true
    

    Skip Pact binary downloading

    You can also force Pact to skip the installation of the binary during npm install by setting PACT_SKIP_BINARY_INSTALL=true. This feature is useful if you want to speed up builds that don't need Pact and don't want to modify your projects dependencies.

    Note that pact-node will not be functional without the binary.

    PACT_SKIP_BINARY_INSTALL=true npm install

    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-node");
    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-node";
    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-node");
    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-node');
    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

    List Mock Servers

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

    var pact = require("@pact-foundation/pact-node");
    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-node");
    pact.removeAllServers();

    Start a Mock Server

    Start the current server.

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

    Stop a Mock server

    Stop the current server.

    var pact = require("@pact-foundation/pact-node");
    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-node");
    pact.createServer()
    	.delete()
    	.then(function() {
    		// Do something after it was killed
    	});

    Check if a Mock server is running

    var pact = require("@pact-foundation/pact-node");
    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-node");
    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-node');
    
    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)
    customProviderHeaders false array Header(s) to add to provider state set up and pact verification
    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.
    format false string What format the verification results are printed in. Options are json, xml, progress and RspecJunitFormatter (which is a synonym for xml)
    verbose false boolean Enables verbose output for underlying pact binary.
    logDir false string Directory to output the pact.log file to
    logLevel false LogLevel (string) Log level. One of "DEBUG", "ERROR", "WARN", "INFO"

    Pact Broker Publishing

    var pact = require('@pact-foundation/pact-node');
    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
    buildUrl false string The build URL that created the pact. Optional
    branch false string The branch of the version for which you want to check the verification results. Optional
    verbose false boolean Enables verbose output for underlying pact binary.

    Pact Broker Deployment Check

    var pact = require('@pact-foundation/pact-node');
    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-node');
    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-node');
    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-node` 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.

    Install

    npm i @pact-foundation/pact-node

    DownloadsWeekly Downloads

    107,667

    Version

    10.17.6

    License

    MIT

    Unpacked Size

    281 kB

    Total Files

    101

    Last publish

    Collaborators

    • omerico
    • mfellows
    • you54f
    • mefellows-pact
    • mboudreau
    • tarcio
    • timothyjones