UNPKG

mappersmith

Version:

It is a lightweight rest client for node.js and the browser

1 lines 7.51 kB
{"version":3,"sources":["../../../src/test/index.js"],"sourcesContent":["import MockRequest from '../mocks/mock-request'\nimport MockResource from '../mocks/mock-resource'\nimport { Mock as MockGateway } from '../gateway/mock'\nimport { configs } from '../index'\nimport { toQueryString } from '../utils/index'\nexport { requestFactory } from './request-factory'\nexport { responseFactory } from './response-factory'\n\nlet store = []\nlet ids = 1\nlet originalGateway = null\n\n/**\n * High level abstraction, it works directly on your client mocking\n * the resources and their methods.\n * @param {Object} client - the client generated by {@link forge}\n *\n * @return {MockAssert}\n */\nexport const mockClient = (client) => {\n const entry = new MockResource(ids++, client)\n store.push(entry)\n return entry\n}\n\n/**\n * Low level abstraction, very useful for automations\n * @param {Object} props\n * @param {String} props.method - request method (get, post, etc)\n * @param {String} props.url - request url (http://example.com)\n * @param {String} props.body - request body\n * @param {String} props.response\n * @param {String} props.response.status\n * @param {String} props.response.headers\n * @param {String} props.response.body\n *\n * @return {MockAssert}\n */\nexport const mockRequest = (props) => {\n const entry = new MockRequest(ids++, props)\n store.push(entry)\n return entry.assertObject()\n}\n\n/**\n * Setup the test library\n */\nexport const install = () => {\n originalGateway = configs.gateway\n configs.gateway = MockGateway\n}\n\n/**\n * Teardown the test library\n */\nexport const uninstall = () => {\n clear()\n if (originalGateway) {\n configs.gateway = originalGateway\n originalGateway = null\n }\n}\n\n/**\n * Cleans up all mocks\n */\nexport const clear = () => {\n store = []\n}\n\n/**\n * Returns number of unused mocks\n * @returns {Number}\n */\nexport const unusedMocks = () => {\n const mocks = store.map((mock) => mock.toMockRequest())\n let count = 0\n mocks.forEach((mock) => {\n if (mock.calls.length === 0) count++\n })\n return count\n}\n\n/**\n * Similar to \"lookupResponse\" but it also runs the request/prepareRequest phase of the middleware\n * stack\n *\n * @param {Request} request\n * @return {Promise<Response>}\n * @throws Will throw an error if it doesn't find a mock to match the given request\n */\nexport const lookupResponseAsync = (request) => {\n const mocksPendingMiddlewareExecution = store.filter((mock) => mock.pendingMiddlewareExecution)\n return configs.Promise.all(\n mocksPendingMiddlewareExecution.map((mock) => mock.executeMiddlewareStack())\n ).then(() => lookupResponse(request))\n}\n\n/**\n * @param {Request} request\n * @return {Response}\n * @throws Will throw an error if it doesn't find a mock to match the given request\n */\nexport const lookupResponse = (request) => {\n const mocks = store.map((mock) => mock.toMockRequest())\n\n const exactMatch = mocks.filter((mock) => mock.isExactMatch(request)).pop()\n\n if (exactMatch) {\n return exactMatch.call(request)\n }\n\n const partialMatch = mocks.filter((mock) => mock.isPartialMatch(request)).pop()\n\n if (partialMatch) {\n throw new Error(\n `[Mappersmith Test] No exact match found for ${requestToLog(\n request\n )}, partial match with ${mockToLog(partialMatch)}, check your mock definition`\n )\n }\n\n throw new Error(\n `[Mappersmith Test] No match found for ${requestToLog(request)}, check your mock definition`\n )\n}\n\n/**\n * List of match functions\n */\nexport const m = {\n stringMatching: (regexp) => {\n if (!(regexp instanceof RegExp)) {\n throw new Error(`[Mappersmith Test] \"stringMatching\" received an invalid regexp (${regexp})`)\n }\n return (string) => regexp.test(string)\n },\n\n stringContaining: (sample) => {\n if (typeof sample !== 'string') {\n throw new Error(\n `[Mappersmith Test] \"stringContaining\" received an invalid string (${sample})`\n )\n }\n\n return (string) => stringIncludes(string, sample)\n },\n\n uuid4: () => {\n // NOTE: based on https://github.com/chriso/validator.js/blob/3443132beccddf06c3f0a5e88c1dd2ee6513b612/src/lib/isUUID.js\n const uuid4Rx = /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i\n\n return (string) => uuid4Rx.test(string)\n },\n\n anything: () => () => true,\n}\n\nconst requestToLog = (request) =>\n `\"${request.method().toUpperCase()} ${request.url()}\" (body: \"${toQueryString(\n request.body()\n )}\"; headers: \"${toQueryString(request.headers())}\")`\nconst mockToLog = (requestMock) =>\n `\"${requestMock.method.toUpperCase()} ${requestMock.url}\" (body: \"${\n requestMock.body\n }\"; headers: \"${requestMock.headers}\")`\n\nconst stringIncludes = (str, search, start) => {\n if (typeof start !== 'number') {\n start = 0\n }\n\n if (typeof str.includes === 'function') {\n return str.includes(search, start)\n }\n\n if (start + search.length > str.length) {\n return false\n }\n\n return str.indexOf(search, start) !== -1\n}\n"],"mappings":"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","names":[]}