{"version":3,"sources":["../../../src/mocks/mock-resource.js"],"sourcesContent":["import { configs } from '../mappersmith'\nimport MockRequest from './mock-request'\nimport Request from '../request'\n\nconst VALUE_NOT_MATCHED = '<MAPPERSMITH_VALUE_NOT_MATCHED>'\n\n/**\n * @param {Integer} id\n * @param {Object} client - the client generated by {@link forge}\n */\nfunction MockResource(id, client) {\n  if (!client || !client._manifest) {\n    throw new Error('[Mappersmith Test] \"mockClient\" received an invalid client')\n  }\n\n  this.id = id\n  this.manifest = client._manifest\n  this.resourceName = null\n  this.methodName = null\n  this.requestParams = {}\n  this.responseData = null\n  this.responseHandler = null\n  this.responseHeaders = {}\n  this.responseStatus = 200\n  this.responseStatusHandler = null\n  this.mockRequest = null\n  this.asyncFinalRequest = null\n  this.pendingMiddlewareExecution = true\n}\n\nMockResource.prototype = {\n  /**\n   * @return {MockResource}\n   */\n  resource(resourceName) {\n    this.resourceName = resourceName\n    return this\n  },\n\n  /**\n   * @return {MockResource}\n   */\n  method(methodName) {\n    this.methodName = methodName\n    return this\n  },\n\n  /**\n   * @return {MockResource}\n   */\n  with(requestParams) {\n    this.requestParams = requestParams\n    return this\n  },\n\n  /**\n   * @return {MockResource}\n   */\n  headers(responseHeaders) {\n    this.responseHeaders = responseHeaders\n    return this\n  },\n\n  /**\n   * @return {MockResource}\n   */\n  status(responder) {\n    if (typeof responder === 'function') {\n      this.responseStatusHandler = responder\n    } else {\n      this.responseStatus = responder\n    }\n    return this\n  },\n\n  /**\n   * @return {MockResource}\n   */\n  response(responder) {\n    if (typeof responder === 'function') {\n      this.responseHandler = responder\n    } else {\n      this.responseData = responder\n    }\n    return this\n  },\n\n  /**\n   * @return {Promise<MockAssert>}\n   */\n  assertObjectAsync() {\n    return this.createAsyncRequest().then((finalRequest) => {\n      this.asyncFinalRequest = finalRequest\n      this.pendingMiddlewareExecution = false\n      return this.toMockRequest().assertObject()\n    })\n  },\n\n  /**\n   * @return {MockAssert}\n   */\n  assertObject() {\n    // The middleware \"prepareRequest\" phase is always async, so the middleware\n    // stack will never run when assertObject is used\n    return this.toMockRequest().assertObject()\n  },\n\n  /**\n   * @return {MockRequest}\n   */\n  toMockRequest() {\n    const finalRequest = this.asyncFinalRequest ? this.asyncFinalRequest : this.createRequest()\n\n    const responseStatus = this.responseStatusHandler || this.responseStatus\n\n    if (!this.mockRequest) {\n      this.mockRequest = new MockRequest(this.id, {\n        method: finalRequest.method(),\n        url: this.generateUrlMatcher(finalRequest),\n        body: finalRequest.body(),\n        headers: finalRequest.headers(),\n        response: {\n          status: responseStatus,\n          headers: this.responseHeaders,\n          body: this.responseData,\n          handler: this.responseHandler,\n        },\n      })\n    }\n\n    return this.mockRequest\n  },\n\n  /**\n   * @private\n   */\n  generateUrlMatcher(finalRequest) {\n    const params = finalRequest.params()\n    const hasParamMatchers = Object.keys(params).find((key) => typeof params[key] === 'function')\n\n    if (!hasParamMatchers) {\n      return finalRequest.url()\n    }\n\n    const urlMatcher = (requestUrl, requestParams) => {\n      const additionalParams = this.evaluateParamMatchers(params, requestParams)\n      const testRequest = finalRequest.enhance({ params: additionalParams })\n      return testRequest.url() === requestUrl\n    }\n\n    return urlMatcher\n  },\n\n  /**\n   * @private\n   */\n  executeMiddlewareStack() {\n    return this.createAsyncRequest().then((finalRequest) => {\n      this.asyncFinalRequest = finalRequest\n\n      if (this.mockRequest) {\n        const urlMatcher = this.generateUrlMatcher(finalRequest)\n        this.mockRequest.url = urlMatcher\n        this.mockRequest.body = finalRequest.body()\n        this.pendingMiddlewareExecution = false\n      }\n    })\n  },\n\n  /**\n   * @private\n   */\n  evaluateParamMatchers(mockParams, requestParams) {\n    return Object.keys(mockParams).reduce((obj, key) => {\n      const matcher = mockParams[key]\n\n      if (typeof matcher !== 'function') {\n        return obj\n      }\n\n      const value = requestParams[key]\n      // Only evaluate if key was provided in request params.\n      // Otherwise we always consider it not to match.\n      if (key in requestParams && matcher(value)) {\n        obj[key] = value\n      } else {\n        obj[key] = VALUE_NOT_MATCHED\n      }\n\n      return obj\n    }, {})\n  },\n\n  /**\n   * @private\n   * It never runs the middleware stack\n   */\n  createRequest() {\n    const methodDescriptor = this.manifest.createMethodDescriptor(\n      this.resourceName,\n      this.methodName\n    )\n    return new Request(methodDescriptor, this.requestParams)\n  },\n\n  /**\n   * @private\n   * Always runs the middleware stack\n   */\n  createAsyncRequest() {\n    const methodDescriptor = this.manifest.createMethodDescriptor(\n      this.resourceName,\n      this.methodName\n    )\n    const initialRequest = new Request(methodDescriptor, this.requestParams)\n    const middleware = this.manifest.createMiddleware({\n      resourceName: this.resourceName,\n      resourceMethod: this.methodName,\n      mockRequest: true,\n    })\n    const abort = (error) => {\n      throw error\n    }\n    const getInitialRequest = () => configs.Promise.resolve(initialRequest)\n    const prepareRequest = middleware.reduce(\n      (next, middleware) => () =>\n        configs.Promise.resolve().then(() => middleware.prepareRequest(next, abort)),\n      getInitialRequest\n    )\n\n    return prepareRequest()\n  },\n}\n\nexport default MockResource\n"],"mappings":"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","names":["middleware"]}