{"version":3,"file":"common-http-testing.umd.js","sources":["../../../../../packages/common/http/testing/src/api.ts","../../../../../packages/common/http/testing/src/request.ts","../../../../../packages/common/http/testing/src/backend.ts","../../../../../packages/common/http/testing/src/module.ts","../../../../../packages/common/http/testing/public_api.ts","../../../../../packages/common/http/testing/index.ts","../../../../../packages/common/http/testing/testing.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {HttpRequest} from '@angular/common/http';\n\nimport {TestRequest} from './request';\n\n/**\n * Defines a matcher for requests based on URL, method, or both.\n *\n * @publicApi\n */\nexport interface RequestMatch {\n  method?: string;\n  url?: string;\n}\n\n/**\n * Controller to be injected into tests, that allows for mocking and flushing\n * of requests.\n *\n * @publicApi\n */\nexport abstract class HttpTestingController {\n  /**\n   * Search for requests that match the given parameter, without any expectations.\n   */\n  abstract match(match: string|RequestMatch|((req: HttpRequest<any>) => boolean)): TestRequest[];\n\n  /**\n   * Expect that a single request has been made which matches the given URL, and return its\n   * mock.\n   *\n   * If no such request has been made, or more than one such request has been made, fail with an\n   * error message including the given request description, if any.\n   */\n  abstract expectOne(url: string, description?: string): TestRequest;\n\n  /**\n   * Expect that a single request has been made which matches the given parameters, and return\n   * its mock.\n   *\n   * If no such request has been made, or more than one such request has been made, fail with an\n   * error message including the given request description, if any.\n   */\n  abstract expectOne(params: RequestMatch, description?: string): TestRequest;\n\n  /**\n   * Expect that a single request has been made which matches the given predicate function, and\n   * return its mock.\n   *\n   * If no such request has been made, or more than one such request has been made, fail with an\n   * error message including the given request description, if any.\n   */\n  abstract expectOne(matchFn: ((req: HttpRequest<any>) => boolean), description?: string):\n      TestRequest;\n\n  /**\n   * Expect that a single request has been made which matches the given condition, and return\n   * its mock.\n   *\n   * If no such request has been made, or more than one such request has been made, fail with an\n   * error message including the given request description, if any.\n   */\n  abstract expectOne(\n      match: string|RequestMatch|((req: HttpRequest<any>) => boolean),\n      description?: string): TestRequest;\n\n  /**\n   * Expect that no requests have been made which match the given URL.\n   *\n   * If a matching request has been made, fail with an error message including the given request\n   * description, if any.\n   */\n  abstract expectNone(url: string, description?: string): void;\n\n  /**\n   * Expect that no requests have been made which match the given parameters.\n   *\n   * If a matching request has been made, fail with an error message including the given request\n   * description, if any.\n   */\n  abstract expectNone(params: RequestMatch, description?: string): void;\n\n  /**\n   * Expect that no requests have been made which match the given predicate function.\n   *\n   * If a matching request has been made, fail with an error message including the given request\n   * description, if any.\n   */\n  abstract expectNone(matchFn: ((req: HttpRequest<any>) => boolean), description?: string): void;\n\n  /**\n   * Expect that no requests have been made which match the given condition.\n   *\n   * If a matching request has been made, fail with an error message including the given request\n   * description, if any.\n   */\n  abstract expectNone(\n      match: string|RequestMatch|((req: HttpRequest<any>) => boolean), description?: string): void;\n\n  /**\n   * Verify that no unmatched requests are outstanding.\n   *\n   * If any requests are outstanding, fail with an error message indicating which requests were not\n   * handled.\n   *\n   * If `ignoreCancelled` is not set (the default), `verify()` will also fail if cancelled requests\n   * were not explicitly matched.\n   */\n  abstract verify(opts?: {ignoreCancelled?: boolean}): void;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {HttpErrorResponse, HttpEvent, HttpHeaders, HttpRequest, HttpResponse} from '@angular/common/http';\nimport {Observer} from 'rxjs';\n\n/**\n * A mock requests that was received and is ready to be answered.\n *\n * This interface allows access to the underlying `HttpRequest`, and allows\n * responding with `HttpEvent`s or `HttpErrorResponse`s.\n *\n * @publicApi\n */\nexport class TestRequest {\n  /**\n   * Whether the request was cancelled after it was sent.\n   */\n  get cancelled(): boolean {\n    return this._cancelled;\n  }\n\n  /**\n   * @internal set by `HttpClientTestingBackend`\n   */\n  _cancelled = false;\n\n  constructor(public request: HttpRequest<any>, private observer: Observer<HttpEvent<any>>) {}\n\n  /**\n   * Resolve the request by returning a body plus additional HTTP information (such as response\n   * headers) if provided.\n   * If the request specifies an expected body type, the body is converted into the requested type.\n   * Otherwise, the body is converted to `JSON` by default.\n   *\n   * Both successful and unsuccessful responses can be delivered via `flush()`.\n   */\n  flush(\n      body: ArrayBuffer|Blob|boolean|string|number|Object|(boolean|string|number|Object|null)[]|\n      null,\n      opts: {\n        headers?: HttpHeaders|{[name: string]: string | string[]},\n        status?: number,\n        statusText?: string,\n      } = {}): void {\n    if (this.cancelled) {\n      throw new Error(`Cannot flush a cancelled request.`);\n    }\n    const url = this.request.urlWithParams;\n    const headers =\n        (opts.headers instanceof HttpHeaders) ? opts.headers : new HttpHeaders(opts.headers);\n    body = _maybeConvertBody(this.request.responseType, body);\n    let statusText: string|undefined = opts.statusText;\n    let status: number = opts.status !== undefined ? opts.status : 200;\n    if (opts.status === undefined) {\n      if (body === null) {\n        status = 204;\n        statusText = statusText || 'No Content';\n      } else {\n        statusText = statusText || 'OK';\n      }\n    }\n    if (statusText === undefined) {\n      throw new Error('statusText is required when setting a custom status.');\n    }\n    if (status >= 200 && status < 300) {\n      this.observer.next(new HttpResponse<any>({body, headers, status, statusText, url}));\n      this.observer.complete();\n    } else {\n      this.observer.error(new HttpErrorResponse({error: body, headers, status, statusText, url}));\n    }\n  }\n\n  /**\n   * Resolve the request by returning an `ErrorEvent` (e.g. simulating a network failure).\n   */\n  error(error: ErrorEvent, opts: {\n    headers?: HttpHeaders|{[name: string]: string | string[]},\n    status?: number,\n    statusText?: string,\n  } = {}): void {\n    if (this.cancelled) {\n      throw new Error(`Cannot return an error for a cancelled request.`);\n    }\n    if (opts.status && opts.status >= 200 && opts.status < 300) {\n      throw new Error(`error() called with a successful status.`);\n    }\n    const headers =\n        (opts.headers instanceof HttpHeaders) ? opts.headers : new HttpHeaders(opts.headers);\n    this.observer.error(new HttpErrorResponse({\n      error,\n      headers,\n      status: opts.status || 0,\n      statusText: opts.statusText || '',\n      url: this.request.urlWithParams,\n    }));\n  }\n\n  /**\n   * Deliver an arbitrary `HttpEvent` (such as a progress event) on the response stream for this\n   * request.\n   */\n  event(event: HttpEvent<any>): void {\n    if (this.cancelled) {\n      throw new Error(`Cannot send events to a cancelled request.`);\n    }\n    this.observer.next(event);\n  }\n}\n\n\n/**\n * Helper function to convert a response body to an ArrayBuffer.\n */\nfunction _toArrayBufferBody(body: ArrayBuffer|Blob|string|number|Object|\n                            (string | number | Object | null)[]): ArrayBuffer {\n  if (typeof ArrayBuffer === 'undefined') {\n    throw new Error('ArrayBuffer responses are not supported on this platform.');\n  }\n  if (body instanceof ArrayBuffer) {\n    return body;\n  }\n  throw new Error('Automatic conversion to ArrayBuffer is not supported for response type.');\n}\n\n/**\n * Helper function to convert a response body to a Blob.\n */\nfunction _toBlob(body: ArrayBuffer|Blob|string|number|Object|\n                 (string | number | Object | null)[]): Blob {\n  if (typeof Blob === 'undefined') {\n    throw new Error('Blob responses are not supported on this platform.');\n  }\n  if (body instanceof Blob) {\n    return body;\n  }\n  if (ArrayBuffer && body instanceof ArrayBuffer) {\n    return new Blob([body]);\n  }\n  throw new Error('Automatic conversion to Blob is not supported for response type.');\n}\n\n/**\n * Helper function to convert a response body to JSON data.\n */\nfunction _toJsonBody(\n    body: ArrayBuffer|Blob|boolean|string|number|Object|\n    (boolean | string | number | Object | null)[],\n    format: string = 'JSON'): Object|string|number|(Object | string | number)[] {\n  if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer) {\n    throw new Error(`Automatic conversion to ${format} is not supported for ArrayBuffers.`);\n  }\n  if (typeof Blob !== 'undefined' && body instanceof Blob) {\n    throw new Error(`Automatic conversion to ${format} is not supported for Blobs.`);\n  }\n  if (typeof body === 'string' || typeof body === 'number' || typeof body === 'object' ||\n      typeof body === 'boolean' || Array.isArray(body)) {\n    return body;\n  }\n  throw new Error(`Automatic conversion to ${format} is not supported for response type.`);\n}\n\n/**\n * Helper function to convert a response body to a string.\n */\nfunction _toTextBody(body: ArrayBuffer|Blob|string|number|Object|\n                     (string | number | Object | null)[]): string {\n  if (typeof body === 'string') {\n    return body;\n  }\n  if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer) {\n    throw new Error('Automatic conversion to text is not supported for ArrayBuffers.');\n  }\n  if (typeof Blob !== 'undefined' && body instanceof Blob) {\n    throw new Error('Automatic conversion to text is not supported for Blobs.');\n  }\n  return JSON.stringify(_toJsonBody(body, 'text'));\n}\n\n/**\n * Convert a response body to the requested type.\n */\nfunction _maybeConvertBody(\n    responseType: string,\n    body: ArrayBuffer|Blob|string|number|Object|(string | number | Object | null)[]|\n    null): ArrayBuffer|Blob|string|number|Object|(string | number | Object | null)[]|null {\n  if (body === null) {\n    return null;\n  }\n  switch (responseType) {\n    case 'arraybuffer':\n      return _toArrayBufferBody(body);\n    case 'blob':\n      return _toBlob(body);\n    case 'json':\n      return _toJsonBody(body);\n    case 'text':\n      return _toTextBody(body);\n    default:\n      throw new Error(`Unsupported responseType: ${responseType}`);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {HttpBackend, HttpEvent, HttpEventType, HttpRequest} from '@angular/common/http';\nimport {Injectable} from '@angular/core';\nimport {Observable, Observer} from 'rxjs';\n\nimport {HttpTestingController, RequestMatch} from './api';\nimport {TestRequest} from './request';\n\n\n/**\n * A testing backend for `HttpClient` which both acts as an `HttpBackend`\n * and as the `HttpTestingController`.\n *\n * `HttpClientTestingBackend` works by keeping a list of all open requests.\n * As requests come in, they're added to the list. Users can assert that specific\n * requests were made and then flush them. In the end, a verify() method asserts\n * that no unexpected requests were made.\n *\n *\n */\n@Injectable()\nexport class HttpClientTestingBackend implements HttpBackend, HttpTestingController {\n  /**\n   * List of pending requests which have not yet been expected.\n   */\n  private open: TestRequest[] = [];\n\n  /**\n   * Handle an incoming request by queueing it in the list of open requests.\n   */\n  handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\n    return new Observable((observer: Observer<any>) => {\n      const testReq = new TestRequest(req, observer);\n      this.open.push(testReq);\n      observer.next({type: HttpEventType.Sent} as HttpEvent<any>);\n      return () => {\n        testReq._cancelled = true;\n      };\n    });\n  }\n\n  /**\n   * Helper function to search for requests in the list of open requests.\n   */\n  private _match(match: string|RequestMatch|((req: HttpRequest<any>) => boolean)): TestRequest[] {\n    if (typeof match === 'string') {\n      return this.open.filter(testReq => testReq.request.urlWithParams === match);\n    } else if (typeof match === 'function') {\n      return this.open.filter(testReq => match(testReq.request));\n    } else {\n      return this.open.filter(\n          testReq => (!match.method || testReq.request.method === match.method.toUpperCase()) &&\n              (!match.url || testReq.request.urlWithParams === match.url));\n    }\n  }\n\n  /**\n   * Search for requests in the list of open requests, and return all that match\n   * without asserting anything about the number of matches.\n   */\n  match(match: string|RequestMatch|((req: HttpRequest<any>) => boolean)): TestRequest[] {\n    const results = this._match(match);\n    results.forEach(result => {\n      const index = this.open.indexOf(result);\n      if (index !== -1) {\n        this.open.splice(index, 1);\n      }\n    });\n    return results;\n  }\n\n  /**\n   * Expect that a single outstanding request matches the given matcher, and return\n   * it.\n   *\n   * Requests returned through this API will no longer be in the list of open requests,\n   * and thus will not match twice.\n   */\n  expectOne(match: string|RequestMatch|((req: HttpRequest<any>) => boolean), description?: string):\n      TestRequest {\n    description = description || this.descriptionFromMatcher(match);\n    const matches = this.match(match);\n    if (matches.length > 1) {\n      throw new Error(`Expected one matching request for criteria \"${description}\", found ${\n          matches.length} requests.`);\n    }\n    if (matches.length === 0) {\n      let message = `Expected one matching request for criteria \"${description}\", found none.`;\n      if (this.open.length > 0) {\n        // Show the methods and URLs of open requests in the error, for convenience.\n        const requests = this.open\n                             .map(testReq => {\n                               const url = testReq.request.urlWithParams;\n                               const method = testReq.request.method;\n                               return `${method} ${url}`;\n                             })\n                             .join(', ');\n        message += ` Requests received are: ${requests}.`;\n      }\n      throw new Error(message);\n    }\n    return matches[0];\n  }\n\n  /**\n   * Expect that no outstanding requests match the given matcher, and throw an error\n   * if any do.\n   */\n  expectNone(match: string|RequestMatch|((req: HttpRequest<any>) => boolean), description?: string):\n      void {\n    description = description || this.descriptionFromMatcher(match);\n    const matches = this.match(match);\n    if (matches.length > 0) {\n      throw new Error(`Expected zero matching requests for criteria \"${description}\", found ${\n          matches.length}.`);\n    }\n  }\n\n  /**\n   * Validate that there are no outstanding requests.\n   */\n  verify(opts: {ignoreCancelled?: boolean} = {}): void {\n    let open = this.open;\n    // It's possible that some requests may be cancelled, and this is expected.\n    // The user can ask to ignore open requests which have been cancelled.\n    if (opts.ignoreCancelled) {\n      open = open.filter(testReq => !testReq.cancelled);\n    }\n    if (open.length > 0) {\n      // Show the methods and URLs of open requests in the error, for convenience.\n      const requests = open.map(testReq => {\n                             const url = testReq.request.urlWithParams.split('?')[0];\n                             const method = testReq.request.method;\n                             return `${method} ${url}`;\n                           })\n                           .join(', ');\n      throw new Error(`Expected no open requests, found ${open.length}: ${requests}`);\n    }\n  }\n\n  private descriptionFromMatcher(matcher: string|RequestMatch|\n                                 ((req: HttpRequest<any>) => boolean)): string {\n    if (typeof matcher === 'string') {\n      return `Match URL: ${matcher}`;\n    } else if (typeof matcher === 'object') {\n      const method = matcher.method || '(any)';\n      const url = matcher.url || '(any)';\n      return `Match method: ${method}, URL: ${url}`;\n    } else {\n      return `Match by function: ${matcher.name}`;\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {HttpBackend, HttpClientModule} from '@angular/common/http';\nimport {NgModule} from '@angular/core';\n\nimport {HttpTestingController} from './api';\nimport {HttpClientTestingBackend} from './backend';\n\n\n/**\n * Configures `HttpClientTestingBackend` as the `HttpBackend` used by `HttpClient`.\n *\n * Inject `HttpTestingController` to expect and flush requests in your tests.\n *\n * @publicApi\n */\n@NgModule({\n  imports: [\n    HttpClientModule,\n  ],\n  providers: [\n    HttpClientTestingBackend,\n    {provide: HttpBackend, useExisting: HttpClientTestingBackend},\n    {provide: HttpTestingController, useExisting: HttpClientTestingBackend},\n  ],\n})\nexport class HttpClientTestingModule {\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nexport {HttpTestingController, RequestMatch} from './src/api';\nexport {HttpClientTestingModule} from './src/module';\nexport {TestRequest} from './src/request';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nexport * from './public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {HttpClientTestingBackend as ɵangular_packages_common_http_testing_testing_a} from './src/backend';"],"names":["HttpHeaders","HttpResponse","HttpErrorResponse","Observable","HttpEventType","Injectable","NgModule","HttpClientModule","HttpBackend"],"mappings":"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"}