Socket
Socket
Sign inDemoInstall

jest-pact

Package Overview
Dependencies
Maintainers
2
Versions
38
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

jest-pact

a pact adaptor for jest


Version published
Weekly downloads
38K
increased by7.51%
Maintainers
2
Weekly downloads
 
Created
Source

Jest-Pact

npm version npm TravisCI Maintainability Coverage Status Dependency Status devDependency Status CircleCI

Jest Adaptor to help write Pact files with ease

Features

  • instantiates the PactOptions for you
  • Setups Pact mock service before and after hooks so you don’t have to
  • Assign random ports and pass port back to user so we can run in parallel without port clashes

Jest-Pact Roadmap

  • user configurable paths for log/pact output dirs
  • integration with Jest's API to make setup and teardown of pact tests very simple
  • Ensure that jest-pact plays well with jest's default of watch-mode
  • Ensure that pact failures print nice diffs (at the moment you have to go digging in the log files)

Adapter Installation

npm i jest-pact --save-dev

OR

yarn add jest-pact --dev

Usage

import { pactWith } from 'jest-pact';

pactWith({ consumer: 'MyConsumer', provider: 'MyProvider' }, provider => {
    // regular pact tests go here
}

Configuration


pactWith({PactOptions}, provider => {
    // regular pact tests go here
}

export interface PactOptions {
  provider: string;
  consumer: string;
  port?: number; // defaults to a random port if not provided
  pactfileWriteMode?: PactFileWriteMode;
  dir? string // defaults to pact/pacts if not provided
}

export declare type LogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal";
export declare type PactFileWriteMode = "overwrite" | "update" | "merge";

Output

  • Log files are written to /pact/logs
  • Pact files are written to /pact/pacts

Example

A contrived example using supertest as a client

import {InteractionObject} from "@pact-foundation/pact"
import * as jestpact from "jest-pact";
import * as supertest from "supertest";

jestpact.pactWith(
  { consumer: "test-consumer", provider: "json-provider" },
  async (provider: any) => {
    const client = () => {
      const url = `${provider.mockService.baseUrl}`;
      return supertest(url);
    };
    test("should accept a valid get request to get a pet", async () => {
      const postValidRequest: InteractionObject = {
        state: "A pet 1845563262948980200 exists",
        uponReceiving: "A get request to get a pet",
        willRespondWith: {
          status: 200
        },
        withRequest: {
          method: "GET",
          path: "/v2/pet/1845563262948980200",
          headers: { api_key: "[]" }
        }
      };
      await provider.addInteraction(postValidRequest);

      await client()
        .get("/v2/pet/1845563262948980200")
        .set("api_key", "[]")
        .expect(200);
      await provider.verify();
    });
  }
);

To use Pact to it's full effect, you should replace the client above with your API call in your code and instantiate with pact mock service base url provider.mockService.baseUrl

So if your calling method is

export const api = (baseURl) => ({ 
     getUser: () => axios(opts).then(processResponse)
})

Then your test may look like

import {InteractionObject} from "@pact-foundation/pact"
import * as jestpact from "jest-pact";
import {api} from "yourCode";

jestpact.pactWith(
  { consumer: "test-consumer", provider: "json-provider" },
  async (provider: any) => {
    const client = () => {
      const url = `${provider.mockService.baseUrl}`;
      return api(url);
    };
    test("should accept a valid get request to get a pet", async () => {
      const postValidRequest: InteractionObject = {
        state: "A pet 1845563262948980200 exists",
        uponReceiving: "A get request to get a pet",
        willRespondWith: {
          status: 200
        },
        withRequest: {
          method: "GET",
          path: "/v2/pet/1845563262948980200",
          headers: { api_key: "[]" }
        }
      };
      await provider.addInteraction(postValidRequest);

      await client()
        .get("/v2/pet/1845563262948980200")
        .set("api_key", "[]")
        .expect(200);
      await provider.verify();
    });
  }
);

You can make your test shorter, by moving your interaction object into another file

import * as jestpact from "jest-pact";
import * as supertest from "supertest";
import * as interaction from "./expectation/json.expectation";
import * as json from "./requestResponse/json.reqRes";

jestpact.pactWith(
  { consumer: "test-consumer", provider: "json-provider" },
  async (provider: any) => {
    const client = () => {
      const url = `${provider.mockService.baseUrl}`;
      return supertest(url);
    };
    test("should accept a valid get request to get a pet", async () => {
      await provider.addInteraction(interaction.postValidRequest);

      await client()
        .get("/v2/pet/1845563262948980200")
        .set("api_key", "[]")
        .expect(200, json.getPetValidResponse);
      await provider.verify();
    });
  }
);

Jest Watch Mode

By default Jest will watch all your files for changes, which means it will run in an infinite loop as your pact tests will generate json pact files and log files.

You can get round this by using the following watchPathIgnorePatterns: ["pact/logs/*","pact/pacts/*"] in your jest.config.js

Example

module.exports = {
  globals: {
    "ts-jest": {
      tsConfig: "tsconfig.json"
    }
  },
  moduleFileExtensions: ["ts", "js", "json"],
  transform: {
    "^.+\\.(ts|tsx)$": "ts-jest"
  },
  testMatch: ["**/*.test.(ts|js)", "**/*.it.(ts|js)", "**/*.pacttest.(ts|js)"],
  testEnvironment: "node",
  reporters: ["default", "jest-junit"],
  watchPathIgnorePatterns: ["pact/logs/*","pact/pacts/*"]
};

You can now run your tests with jest --watch and when you change a pact file, or your source code, your pact tests will run

Examples of usage of jest-pact

See Jest-Pact-Typescript which showcases a full consumer workflow written in Typescript with Jest, using this adaptor

  • Example pact tests
    • AWS v4 Signed API Gateway Provider
    • Soap API provider
    • File upload API provider
    • JSON API provider
Examples Installation
  • clone repository git@github.com:YOU54F/jest-pact-typescript.git
  • Run yarn install
  • Run yarn run pact-test

Generated pacts will be output in pact/pacts Log files will be output in pact/logs

Credits

FAQs

Package last updated on 14 Jun 2019

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc