UNPKG

@case-contract-testing/case

Version:

Next-generation contract testing suite

255 lines (254 loc) 11.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable jest/expect-expect */ const fs = __importStar(require("node:fs")); const web_1 = __importDefault(require("./__tests__/server/http/connectors/web")); const baseService_1 = require("./__tests__/server/http/domain/baseService"); // This import is our Jest DSL const jest_1 = require("./boundaries/jest/jest"); const _1 = require("."); // Normally you just let Case set filename and test-run-id for you const TEST_RUN_ID = 'PDC'; const FILENAME = `case-contracts/http-request-consumer-http-request-provider-${TEST_RUN_ID}.case.json`; describe('e2e http provider driven', () => { beforeAll(() => { try { fs.rmSync(FILENAME); fs.mkdirSync('case-contracts'); } catch (e) { // We don't care if this fails } }); describe('test and write contract', () => { // CODE UNDER TEST SETUP BOILERPLATE let server; let mockHealthStatus = true; let mockGetUser = () => undefined; const port = 8090; const serverDependencies = { healthService: { ready: () => mockHealthStatus, }, baseService: baseService_1.baseService, userRepository: { get: (id) => mockGetUser(id) }, }; beforeAll(async () => { server = await (0, web_1.default)(port, serverDependencies); }); afterAll(() => new Promise((resolve, reject) => { if (server) { server.close((err) => { if (err) reject(err); resolve(); }); } else { resolve(); } })); // END CODE UNDER TEST SETUP BOILERPLATE const stateHandlers = { 'Server is up': () => { mockHealthStatus = true; }, 'Server is down': () => { mockHealthStatus = false; }, 'A user exists': { setup: () => { const userId = '42'; mockGetUser = (id) => { if (id === userId) return { userId, name: 'John', }; return undefined; }; return { userId }; }, teardown: () => { mockGetUser = () => undefined; }, }, 'No users exist': () => { mockGetUser = () => undefined; }, }; (0, jest_1.defineContract)({ consumerName: 'http request consumer', providerName: 'http request provider', config: { stateHandlers, baseUrlUnderTest: `http://localhost:${port}`, // remove the following lines for your own tests publish: 'ALWAYS', printResults: false, testRunId: TEST_RUN_ID, // Remove this for your own tests }, }, (contract) => { describe('health get', () => { describe('When the server is up', () => { const state = (0, _1.inState)('Server is up'); describe('health endpoint', () => { it('behaves as expected', () => contract.runExample({ states: [state], definition: (0, _1.willReceiveHttpRequest)({ request: { method: 'GET', path: '/health', headers: { accept: 'application/json' }, }, response: { status: 200, body: { status: 'up' } }, }), })); describe('arbitrary status response string', () => { it('behaves as expected', () => contract.runExample({ states: [state], definition: (0, _1.willReceiveHttpRequest)({ request: { method: 'GET', path: '/health', }, response: { status: 200, body: (0, _1.shapedLike)({ status: 'whatever' }), }, }), })); }); }); }); describe('When the server is down', () => { const state = (0, _1.inState)('Server is down'); describe('No body server response', () => { it('calls server health', () => contract.runRejectingExample({ states: [state], definition: (0, _1.willReceiveHttpRequest)({ request: { method: 'GET', path: '/health', }, response: { status: (0, _1.httpStatus)(['4XX', '5XX']) }, }), })); }); describe('specific server response', () => { it('calls server health', async () => contract.runRejectingExample({ states: [state], definition: (0, _1.willReceiveHttpRequest)({ request: { method: 'GET', path: '/health', }, response: { status: 503, body: { status: 'down' } }, }), })); }); }); }); describe('User', () => { describe('With query variables', () => { describe('when the user exists', () => { const responseBody = { userId: (0, _1.stateVariable)('userId') }; it('returns an existing user', async () => contract.runExample({ states: [ (0, _1.inState)('Server is up'), (0, _1.inState)('A user exists', { userId: '123' }), ], definition: (0, _1.willReceiveHttpRequest)({ request: { method: 'GET', path: '/users', query: { id: (0, _1.stateVariable)('userId') }, }, response: { status: 200, body: responseBody, }, }), })); }); describe("when the user doesn't exist", () => { it('returns a user not found error', () => contract.runRejectingExample({ states: [(0, _1.inState)('Server is up'), (0, _1.inState)('No users exist')], definition: (0, _1.willReceiveHttpRequest)({ request: { method: 'GET', path: '/users', query: { id: (0, _1.stateVariable)('userId') }, }, response: { status: 404, }, }), })); }); }); describe('with path variables', () => { describe('when the user exists', () => { const responseBody = { userId: (0, _1.stateVariable)('userId') }; it('returns an existing user', async () => contract.runExample({ states: [ (0, _1.inState)('Server is up'), (0, _1.inState)('A user exists', { userId: '123' }), ], definition: (0, _1.willReceiveHttpRequest)({ request: { method: 'GET', path: (0, _1.stringPrefix)('/users/', (0, _1.stateVariable)('userId')), }, response: { status: 200, body: responseBody, }, }), })); }); describe("when the user doesn't exist", () => { it('returns a user not found error', () => contract.runRejectingExample({ states: [(0, _1.inState)('Server is up'), (0, _1.inState)('No users exist')], definition: (0, _1.willReceiveHttpRequest)({ request: { method: 'GET', path: (0, _1.stringPrefix)('/users/', '123'), }, response: { status: 404, }, }), })); }); }); }); }); }); });