{"version":3,"file":"http-testing.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/common/http/testing/src/api.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/common/http/testing/src/request.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/common/http/testing/src/backend.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/common/http/testing/src/provider.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/common/http/testing/src/module.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.dev/license\n */\n\nimport {HttpRequest} from '../../index';\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(\n    match: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n  ): 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(\n    matchFn: (req: HttpRequest<any>) => boolean,\n    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,\n  ): 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),\n    description?: string,\n  ): 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.dev/license\n */\n\nimport {\n  HttpErrorResponse,\n  HttpEvent,\n  HttpHeaders,\n  HttpRequest,\n  HttpResponse,\n  HttpStatusCode,\n} from '../../index';\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(\n    public request: HttpRequest<any>,\n    private observer: Observer<HttpEvent<any>>,\n  ) {}\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:\n      | ArrayBuffer\n      | Blob\n      | boolean\n      | string\n      | number\n      | Object\n      | (boolean | string | number | Object | null)[]\n      | null,\n    opts: {\n      headers?: HttpHeaders | {[name: string]: string | string[]};\n      status?: number;\n      statusText?: string;\n    } = {},\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 ||= 'No Content';\n      } else {\n        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    const headers =\n      opts.headers instanceof HttpHeaders ? opts.headers : new HttpHeaders(opts.headers);\n    this.observer.error(\n      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  /**\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 * Helper function to convert a response body to an ArrayBuffer.\n */\nfunction _toArrayBufferBody(\n  body: ArrayBuffer | Blob | string | number | Object | (string | number | Object | null)[],\n): 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(\n  body: ArrayBuffer | Blob | string | number | Object | (string | number | Object | null)[],\n): 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:\n    | ArrayBuffer\n    | Blob\n    | boolean\n    | string\n    | number\n    | Object\n    | (boolean | string | number | Object | null)[],\n  format: string = 'JSON',\n): 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 (\n    typeof body === 'string' ||\n    typeof body === 'number' ||\n    typeof body === 'object' ||\n    typeof body === 'boolean' ||\n    Array.isArray(body)\n  ) {\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(\n  body: ArrayBuffer | Blob | string | number | Object | (string | number | Object | null)[],\n): 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)[] | null,\n): 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.dev/license\n */\n\nimport {HttpBackend, HttpEvent, HttpEventType, HttpRequest} from '../../index';\nimport {Injectable} from '@angular/core';\nimport {Observable, Observer} from 'rxjs';\n\nimport {HttpTestingController, RequestMatch} from './api';\nimport {TestRequest} from './request';\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   * Used when checking if we need to throw the NOT_USING_FETCH_BACKEND_IN_SSR error\n   */\n  private isTestingBackend = true;\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(\n    match: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n  ): 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) =>\n          (!match.method || testReq.request.method === match.method.toUpperCase()) &&\n          (!match.url || testReq.request.urlWithParams === match.url),\n      );\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(\n    match: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n    description?: string,\n  ): TestRequest {\n    description ||= this.descriptionFromMatcher(match);\n    const matches = this.match(match);\n    if (matches.length > 1) {\n      throw new Error(\n        `Expected one matching request for criteria \"${description}\", found ${matches.length} requests.`,\n      );\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(\n    match: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n    description?: string,\n  ): void {\n    description ||= this.descriptionFromMatcher(match);\n    const matches = this.match(match);\n    if (matches.length > 0) {\n      throw new Error(\n        `Expected zero matching requests for criteria \"${description}\", found ${matches.length}.`,\n      );\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(\n    matcher: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n  ): 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.dev/license\n */\n\nimport {HttpBackend, ɵREQUESTS_CONTRIBUTE_TO_STABILITY} from '../../index';\nimport {Provider} from '@angular/core';\n\nimport {HttpTestingController} from './api';\nimport {HttpClientTestingBackend} from './backend';\n\nexport function provideHttpClientTesting(): Provider[] {\n  return [\n    HttpClientTestingBackend,\n    {provide: HttpBackend, useExisting: HttpClientTestingBackend},\n    {provide: HttpTestingController, useExisting: HttpClientTestingBackend},\n    {provide: ɵREQUESTS_CONTRIBUTE_TO_STABILITY, useValue: false},\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.dev/license\n */\n\nimport {HttpClientModule} from '../../index';\nimport {NgModule} from '@angular/core';\n\nimport {provideHttpClientTesting} from './provider';\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 * @deprecated Add `provideHttpClientTesting()` to your providers instead.\n */\n@NgModule({\n  imports: [HttpClientModule],\n  providers: [provideHttpClientTesting()],\n})\nexport class HttpClientTestingModule {}\n"],"names":["ɵREQUESTS_CONTRIBUTE_TO_STABILITY"],"mappings":"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"}