@case-contract-testing/case
Version:
Next-generation contract testing suite
255 lines (254 loc) • 11.5 kB
JavaScript
;
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,
},
}),
}));
});
});
});
});
});
});