YOU54F/jest-pact

View on GitHub
src/test/messagePactWith.test.ts

Summary

Maintainability
B
4 hrs
Test Coverage
import {
  Matchers,
  MessageConsumerPact,
  synchronousBodyHandler,
} from '@pact-foundation/pact';
import { AnyJson } from '@pact-foundation/pact/src/common/jsonTypes';
import { messagePactWith } from '../index';

interface Dog {
  id: number;
  name: string;
  type: 'bulldog' | 'sheepdog';
}

function dogApiHandler(dog: Dog): void {
  if (!dog.id && !dog.name && !dog.type) {
    throw new Error('missing fields');
  }
}
const { like, term } = Matchers;

const arbitraryPact = (provider: MessageConsumerPact) => {
  describe('receive dog event', () => {
    it('accepts a valid dog', () =>
      provider
        .given('some state')
        .expectsToReceive('a request for a dog')
        .withContent({
          id: like(1),
          name: like('rover'),
          type: term({
            generate: 'bulldog',
            matcher: '^(bulldog|sheepdog)$',
          }),
        })
        .withMetadata({
          'content-type': 'application/json',
        })
        .verify(
          synchronousBodyHandler(
            (dogApiHandler as unknown) as (body: AnyJson | Buffer) => void
          )
        ));
  });
};

describe('custom log locations', () => {
  describe('with logDir', () => {
    describe('without logFileName', () => {
      messagePactWith(
        {
          consumer: 'MyMessageConsumer',
          provider: 'messagePactWith2',
          logDir: 'pact/log/custom',
        },
        (provider: MessageConsumerPact) => {
          arbitraryPact(provider);
        }
      );
    });
    describe('with logFileName', () => {
      messagePactWith(
        {
          consumer: 'MyMessageConsumer',
          provider: 'messagePactWith2',
          logDir: 'pact/log/custom',
          logFileName: 'someLog.txt',
        },
        (provider: MessageConsumerPact) => {
          arbitraryPact(provider);
        }
      );
    });
  });
  describe('with only logFileName', () => {
    messagePactWith(
      {
        consumer: 'MyMessageConsumer',
        provider: 'messagePactWith2',
        logFileName: 'someOtherLog.txt',
      },
      (provider: MessageConsumerPact) => {
        arbitraryPact(provider);
      }
    );
  });
});