Project

General

Profile

1
{"version":3,"file":"common-http-testing.umd.js","sources":["../../../../packages/common/http/testing/src/module.ts","../../../../packages/common/http/testing/src/backend.ts","../../../../packages/common/http/testing/src/request.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google Inc. 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\n\nimport {HttpBackend, HttpClientModule} from '@angular/common/http';\nimport {NgModule} from '@angular/core';\n\nimport {HttpTestingController} from './api';\nimport {HttpClientTestingBackend} from './backend';\n/**\n * Configures `HttpClientTestingBackend` as the `HttpBackend` used by `HttpClient`.\n * \n * Inject `HttpTestingController` to expect and flush requests in your tests.\n * \n * \\@experimental\n */\nexport class HttpClientTestingModule {\nstatic decorators: DecoratorInvocation[] = [\n{ type: NgModule, args: [{\n  imports: [\n    HttpClientModule,\n  ],\n  providers: [\n    HttpClientTestingBackend,\n    {provide: HttpBackend, useExisting: HttpClientTestingBackend},\n    {provide: HttpTestingController, useExisting: HttpClientTestingBackend},\n  ],\n}, ] },\n];\n/**\n * @nocollapse\n */\nstatic ctorParameters: () => ({type: any, decorators?: DecoratorInvocation[]}|null)[] = () => [\n];\n}\n\nfunction HttpClientTestingModule_tsickle_Closure_declarations() {\n/** @type {?} */\nHttpClientTestingModule.decorators;\n/**\n * @nocollapse\n * @type {?}\n */\nHttpClientTestingModule.ctorParameters;\n}\n\n\ninterface DecoratorInvocation {\n  type: Function;\n  args?: any[];\n}\n","/**\n * @license\n * Copyright Google Inc. 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\n\nimport {HttpBackend, HttpEvent, HttpEventType, HttpRequest} from '@angular/common/http';\nimport {Injectable} from '@angular/core';\nimport {Observable} from 'rxjs/Observable';\nimport {Observer} from 'rxjs/Observer';\nimport {startWith} from 'rxjs/operator/startWith';\n\nimport {HttpTestingController, RequestMatch} from './api';\nimport {TestRequest} from './request';\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 * \\@experimental\n */\nexport class HttpClientTestingBackend implements HttpBackend, HttpTestingController {\n/**\n * List of pending requests which have not yet been expected.\n */\nprivate open: TestRequest[] = [];\n/**\n * Handle an incoming request by queueing it in the list of open requests.\n * @param {?} req\n * @return {?}\n */\nhandle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\n    return new Observable((observer: Observer<any>) => {\n      const /** @type {?} */ testReq = new TestRequest(req, observer);\n      this.open.push(testReq);\n      observer.next( /** @type {?} */(({ type: HttpEventType.Sent } as HttpEvent<any>)));\n      return () => { testReq._cancelled = true; };\n    });\n  }\n/**\n * Helper function to search for requests in the list of open requests.\n * @param {?} match\n * @return {?}\n */\nprivate _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 * Search for requests in the list of open requests, and return all that match\n * without asserting anything about the number of matches.\n * @param {?} match\n * @return {?}\n */\nmatch(match: string|RequestMatch|((req: HttpRequest<any>) => boolean)): TestRequest[] {\n    const /** @type {?} */ results = this._match(match);\n    results.forEach(result => {\n      const /** @type {?} */ index = this.open.indexOf(result);\n      if (index !== -1) {\n        this.open.splice(index, 1);\n      }\n    });\n    return results;\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 * @param {?} match\n * @param {?=} description\n * @return {?}\n */\nexpectOne(match: string|RequestMatch|((req: HttpRequest<any>) => boolean), description?: string):\n      TestRequest {\n    description = description || this.descriptionFromMatcher(match);\n    const /** @type {?} */ 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    if (matches.length === 0) {\n      throw new Error(`Expected one matching request for criteria \"${description}\", found none.`);\n    }\n    return matches[0];\n  }\n/**\n * Expect that no outstanding requests match the given matcher, and throw an error\n * if any do.\n * @param {?} match\n * @param {?=} description\n * @return {?}\n */\nexpectNone(match: string|RequestMatch|((req: HttpRequest<any>) => boolean), description?: string):\n      void {\n    description = description || this.descriptionFromMatcher(match);\n    const /** @type {?} */ 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 * Validate that there are no outstanding requests.\n * @param {?=} opts\n * @return {?}\n */\nverify(opts: {ignoreCancelled?: boolean} = {}): void {\n    let /** @type {?} */ 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 /** @type {?} */ requests = open.map(testReq => {\n                             const /** @type {?} */ url = testReq.request.urlWithParams.split('?')[0];\n                             const /** @type {?} */ 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 * @param {?} matcher\n * @return {?}\n */\nprivate 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 /** @type {?} */ method = matcher.method || '(any)';\n      const /** @type {?} */ url = matcher.url || '(any)';\n      return `Match method: ${method}, URL: ${url}`;\n    } else {\n      return `Match by function: ${matcher.name}`;\n    }\n  }\nstatic decorators: DecoratorInvocation[] = [\n{ type: Injectable },\n];\n/**\n * @nocollapse\n */\nstatic ctorParameters: () => ({type: any, decorators?: DecoratorInvocation[]}|null)[] = () => [\n];\n}\n\nfunction HttpClientTestingBackend_tsickle_Closure_declarations() {\n/** @type {?} */\nHttpClientTestingBackend.decorators;\n/**\n * @nocollapse\n * @type {?}\n */\nHttpClientTestingBackend.ctorParameters;\n/**\n * List of pending requests which have not yet been expected.\n * @type {?}\n */\nHttpClientTestingBackend.prototype.open;\n}\n\n\ninterface DecoratorInvocation {\n  type: Function;\n  args?: any[];\n}\n","/**\n * @license\n * Copyright Google Inc. 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\n\nimport {HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaders, HttpRequest, HttpResponse} from '@angular/common/http';\nimport {Observer} from 'rxjs/Observer';\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 * \\@experimental\n */\nexport class TestRequest {\n/**\n * Whether the request was cancelled after it was sent.\n * @return {?}\n */\nget cancelled(): boolean { return this._cancelled; }\n/**\n * \\@internal set by `HttpClientTestingBackend`\n */\n_cancelled = false;\n/**\n * @param {?} request\n * @param {?} observer\n */\nconstructor(public request: HttpRequest<any>,\nprivate observer: Observer<HttpEvent<any>>) {}\n/**\n * Resolve the request by returning a body plus additional HTTP information (such as response\n * headers) if provided.\n * \n * Both successful and unsuccessful responses can be delivered via `flush()`.\n * @param {?} body\n * @param {?=} opts\n * @return {?}\n */\nflush(body: ArrayBuffer|Blob|string|number|Object|(string|number|Object|null)[]|null, 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 /** @type {?} */ url = this.request.urlWithParams;\n    const /** @type {?} */ headers =\n        (opts.headers instanceof HttpHeaders) ? opts.headers : new HttpHeaders(opts.headers);\n    body = _maybeConvertBody(this.request.responseType, body);\n    let /** @type {?} */ statusText: string|undefined = opts.statusText;\n    let /** @type {?} */ 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 * Resolve the request by returning an `ErrorEvent` (e.g. simulating a network failure).\n * @param {?} error\n * @param {?=} opts\n * @return {?}\n */\nerror(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 /** @type {?} */ 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 * Deliver an arbitrary `HttpEvent` (such as a progress event) on the response stream for this\n * request.\n * @param {?} event\n * @return {?}\n */\nevent(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\nfunction TestRequest_tsickle_Closure_declarations() {\n/**\n * \\@internal set by `HttpClientTestingBackend`\n * @type {?}\n */\nTestRequest.prototype._cancelled;\n/** @type {?} */\nTestRequest.prototype.request;\n/** @type {?} */\nTestRequest.prototype.observer;\n}\n\n/**\n * Helper function to convert a response body to an ArrayBuffer.\n * @param {?} body\n * @return {?}\n */\nfunction _toArrayBufferBody(\n    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 * Helper function to convert a response body to a Blob.\n * @param {?} body\n * @return {?}\n */\nfunction _toBlob(\n    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 * Helper function to convert a response body to JSON data.\n * @param {?} body\n * @param {?=} format\n * @return {?}\n */\nfunction _toJsonBody(\n    body: ArrayBuffer | Blob | string | number | Object | (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      Array.isArray(body)) {\n    return body;\n  }\n  throw new Error(`Automatic conversion to ${format} is not supported for response type.`);\n}\n/**\n * Helper function to convert a response body to a string.\n * @param {?} body\n * @return {?}\n */\nfunction _toTextBody(\n    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 * Convert a response body to the requested type.\n * @param {?} responseType\n * @param {?} body\n * @return {?}\n */\nfunction _maybeConvertBody(\n    responseType: string, body: ArrayBuffer | Blob | string | number | Object |\n        (string | number | Object | null)[] | null): ArrayBuffer|Blob|string|number|Object|\n    (string | number | Object | null)[]|null {\n  switch (responseType) {\n    case 'arraybuffer':\n      if (body === null) {\n        return null;\n      }\n      return _toArrayBufferBody(body);\n    case 'blob':\n      if (body === null) {\n        return null;\n      }\n      return _toBlob(body);\n    case 'json':\n      if (body === null) {\n        return 'null';\n      }\n      return _toJsonBody(body);\n    case 'text':\n      if (body === null) {\n        return null;\n      }\n      return _toTextBody(body);\n    default:\n      throw new Error(`Unsupported responseType: ${responseType}`);\n  }\n}\n"],"names":["HttpClientModule","NgModule","Injectable","Observable","HttpErrorResponse","HttpHeaders","HttpResponse"],"mappings":"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"}
(2-2/16)