{"version":3,"sources":["../../../src/mocks/mock-request.js"],"sourcesContent":["import MockAssert from './mock-assert'\nimport Response from '../response'\nimport { isPlainObject } from '../utils/index'\nimport { clone } from '../utils/clone'\nimport { sortedUrl, toSortedQueryString, isSubset } from './mock-utils'\n\n/**\n * @param {number} id\n * @param {object} props\n *   @param {string} props.method\n *   @param {string|function} props.url\n *   @param {string|function} props.body - request body\n *   @param {object} props.response\n *     @param {string} props.response.body\n *     @param {object} props.response.headers\n *     @param {integer} props.response.status\n */\nfunction MockRequest(id, props) {\n  this.id = id\n\n  this.method = props.method || 'get'\n  this.urlFunction = typeof props.url === 'function'\n  this.url = props.url\n  this.bodyFunction = typeof props.body === 'function'\n  this.body = this.bodyFunction ? props.body : toSortedQueryString(props.body)\n  this.headersFunction = typeof props.headers === 'function'\n  this.headers = props.headersFunction ? props.headers : toSortedQueryString(props.headers)\n  this.headersObject = props.headers\n  this.responseHeaders = props.response.headers || {}\n  this.setResponseData(props.response.body)\n  this.responseHandler = props.response.handler\n  this.statusFunction = typeof props.response.status === 'function'\n  this.responseStatus = props.response.status || 200\n\n  this.calls = []\n}\n\nMockRequest.prototype = {\n  /**\n   * If passed a plain object, the data is stringified and the content-type header is set to JSON\n   *\n   * @public\n   */\n  setResponseData(responseData) {\n    if (isPlainObject(responseData)) {\n      this.responseData = JSON.stringify(responseData)\n      if (!this.responseHeaders['content-type']) {\n        this.responseHeaders['content-type'] = 'application/json'\n      }\n    } else {\n      this.responseData = responseData\n    }\n  },\n\n  /**\n   * @return {Response}\n   */\n  call(request) {\n    const assertObject = this.assertObject()\n\n    if (this.responseHandler) {\n      this.setResponseData(this.responseHandler(request, assertObject))\n    }\n\n    const status = this.statusFunction\n      ? this.responseStatus(request, assertObject)\n      : this.responseStatus\n\n    this.calls.push(request)\n\n    const responseData = clone(this.responseData)\n    const responseHeaders = clone(this.responseHeaders)\n    return new Response(request, status, responseData, responseHeaders)\n  },\n\n  /**\n   * @return {MockAssert}\n   */\n  assertObject() {\n    return new MockAssert(this.calls)\n  },\n\n  /**\n   * Checks if the request matches with the mock HTTP method, URL, headers and body\n   *\n   * @return {boolean}\n   */\n  isExactMatch(request) {\n    const bodyMatch = () => {\n      if (this.body === undefined) {\n        return true\n      }\n\n      return this.bodyFunction\n        ? this.body(request.body())\n        : this.body === toSortedQueryString(request.body())\n    }\n\n    const urlMatch = this.urlFunction\n      ? this.url(request.url(), request.params())\n      : sortedUrl(this.url) === sortedUrl(request.url())\n\n    const headerMatch =\n      !this.headers ||\n      (this.headersFunction\n        ? this.headers(request.headers())\n        : isSubset(this.headersObject, request.headers()))\n\n    return this.method === request.method() && urlMatch && bodyMatch() && headerMatch\n  },\n\n  /**\n   * Checks if the request partially matches the mock HTTP method and URL\n   *\n   * @return {boolean}\n   */\n  isPartialMatch(request) {\n    return (\n      new RegExp(this.method).test(request.method()) && new RegExp(this.url).test(request.url())\n    )\n  },\n\n  /**\n   * @return {MockRequest}\n   */\n  toMockRequest() {\n    return this\n  },\n}\n\nexport default MockRequest\n"],"mappings":";AAAA,OAAO,gBAAgB;AACvB,OAAO,cAAc;AACrB,SAAS,qBAAqB;AAC9B,SAAS,aAAa;AACtB,SAAS,WAAW,qBAAqB,gBAAgB;AAazD,SAAS,YAAY,IAAI,OAAO;AAC9B,OAAK,KAAK;AAEV,OAAK,SAAS,MAAM,UAAU;AAC9B,OAAK,cAAc,OAAO,MAAM,QAAQ;AACxC,OAAK,MAAM,MAAM;AACjB,OAAK,eAAe,OAAO,MAAM,SAAS;AAC1C,OAAK,OAAO,KAAK,eAAe,MAAM,OAAO,oBAAoB,MAAM,IAAI;AAC3E,OAAK,kBAAkB,OAAO,MAAM,YAAY;AAChD,OAAK,UAAU,MAAM,kBAAkB,MAAM,UAAU,oBAAoB,MAAM,OAAO;AACxF,OAAK,gBAAgB,MAAM;AAC3B,OAAK,kBAAkB,MAAM,SAAS,WAAW,CAAC;AAClD,OAAK,gBAAgB,MAAM,SAAS,IAAI;AACxC,OAAK,kBAAkB,MAAM,SAAS;AACtC,OAAK,iBAAiB,OAAO,MAAM,SAAS,WAAW;AACvD,OAAK,iBAAiB,MAAM,SAAS,UAAU;AAE/C,OAAK,QAAQ,CAAC;AAChB;AAEA,YAAY,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtB,gBAAgB,cAAc;AAC5B,QAAI,cAAc,YAAY,GAAG;AAC/B,WAAK,eAAe,KAAK,UAAU,YAAY;AAC/C,UAAI,CAAC,KAAK,gBAAgB,cAAc,GAAG;AACzC,aAAK,gBAAgB,cAAc,IAAI;AAAA,MACzC;AAAA,IACF,OAAO;AACL,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,SAAS;AACZ,UAAM,eAAe,KAAK,aAAa;AAEvC,QAAI,KAAK,iBAAiB;AACxB,WAAK,gBAAgB,KAAK,gBAAgB,SAAS,YAAY,CAAC;AAAA,IAClE;AAEA,UAAM,SAAS,KAAK,iBAChB,KAAK,eAAe,SAAS,YAAY,IACzC,KAAK;AAET,SAAK,MAAM,KAAK,OAAO;AAEvB,UAAM,eAAe,MAAM,KAAK,YAAY;AAC5C,UAAM,kBAAkB,MAAM,KAAK,eAAe;AAClD,WAAO,IAAI,SAAS,SAAS,QAAQ,cAAc,eAAe;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACb,WAAO,IAAI,WAAW,KAAK,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,SAAS;AACpB,UAAM,YAAY,MAAM;AACtB,UAAI,KAAK,SAAS,QAAW;AAC3B,eAAO;AAAA,MACT;AAEA,aAAO,KAAK,eACR,KAAK,KAAK,QAAQ,KAAK,CAAC,IACxB,KAAK,SAAS,oBAAoB,QAAQ,KAAK,CAAC;AAAA,IACtD;AAEA,UAAM,WAAW,KAAK,cAClB,KAAK,IAAI,QAAQ,IAAI,GAAG,QAAQ,OAAO,CAAC,IACxC,UAAU,KAAK,GAAG,MAAM,UAAU,QAAQ,IAAI,CAAC;AAEnD,UAAM,cACJ,CAAC,KAAK,YACL,KAAK,kBACF,KAAK,QAAQ,QAAQ,QAAQ,CAAC,IAC9B,SAAS,KAAK,eAAe,QAAQ,QAAQ,CAAC;AAEpD,WAAO,KAAK,WAAW,QAAQ,OAAO,KAAK,YAAY,UAAU,KAAK;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,SAAS;AACtB,WACE,IAAI,OAAO,KAAK,MAAM,EAAE,KAAK,QAAQ,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,GAAG,EAAE,KAAK,QAAQ,IAAI,CAAC;AAAA,EAE7F;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AACd,WAAO;AAAA,EACT;AACF;AAEA,IAAO,uBAAQ;","names":[]}