| 1 | {"version":3,"file":"testing.mjs","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/provider.ts","../../../../../../../packages/common/http/testing/src/module.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, HttpStatusCode} from '@angular/common/http';\nimport {Observer} from 'rxjs';\n\n/**\n * Type that describes options that can be used to create an error\n * in `TestRequest`.\n */\ntype TestRequestErrorOptions = {\n  headers?: HttpHeaders|{[name: string]: string | string[]},\n  status?: number,\n  statusText?: string,\n};\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 : HttpStatusCode.Ok;\n    if (opts.status === undefined) {\n      if (body === null) {\n        status = HttpStatusCode.NoContent;\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   * @deprecated Http requests never emit an `ErrorEvent`. Please specify a `ProgressEvent`.\n   */\n  error(error: ErrorEvent, opts?: TestRequestErrorOptions): void;\n  /**\n   * Resolve the request by returning an `ProgressEvent` (e.g. simulating a network failure).\n   */\n  error(error: ProgressEvent, opts?: TestRequestErrorOptions): void;\n  error(error: ProgressEvent|ErrorEvent, opts: TestRequestErrorOptions = {}): 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.map(describeRequest).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(describeRequest).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\nfunction describeRequest(testRequest: TestRequest): string {\n  const url = testRequest.request.urlWithParams;\n  const method = testRequest.request.method;\n  return `${method} ${url}`;\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} from '@angular/common/http';\nimport {Provider} from '@angular/core';\n\nimport {HttpTestingController} from './api';\nimport {HttpClientTestingBackend} from './backend';\n\n\nexport function provideHttpClientTesting(): Provider[] {\n  return [\n    HttpClientTestingBackend,\n    {provide: HttpBackend, useExisting: HttpClientTestingBackend},\n    {provide: HttpTestingController, useExisting: HttpClientTestingBackend},\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 {HttpClientModule} from '@angular/common/http';\nimport {NgModule} from '@angular/core';\n\nimport {provideHttpClientTesting} from './provider';\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    provideHttpClientTesting(),\n  ],\n})\nexport class HttpClientTestingModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
 |