/**
 * @license Angular v11.2.14
 * (c) 2010-2021 Google LLC. https://angular.io/
 * License: MIT
 */

(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/common/http'), require('@angular/core'), require('rxjs')) :
    typeof define === 'function' && define.amd ? define('@angular/common/http/testing', ['exports', '@angular/common/http', '@angular/core', 'rxjs'], factory) :
    (global = global || self, factory((global.ng = global.ng || {}, global.ng.common = global.ng.common || {}, global.ng.common.http = global.ng.common.http || {}, global.ng.common.http.testing = {}), global.ng.common.http, global.ng.core, global.rxjs));
}(this, (function (exports, http, core, rxjs) { 'use strict';

    /**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
    /**
     * Controller to be injected into tests, that allows for mocking and flushing
     * of requests.
     *
     * @publicApi
     */
    var HttpTestingController = /** @class */ (function () {
        function HttpTestingController() {
        }
        return HttpTestingController;
    }());

    /**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
    /**
     * A mock requests that was received and is ready to be answered.
     *
     * This interface allows access to the underlying `HttpRequest`, and allows
     * responding with `HttpEvent`s or `HttpErrorResponse`s.
     *
     * @publicApi
     */
    var TestRequest = /** @class */ (function () {
        function TestRequest(request, observer) {
            this.request = request;
            this.observer = observer;
            /**
             * @internal set by `HttpClientTestingBackend`
             */
            this._cancelled = false;
        }
        Object.defineProperty(TestRequest.prototype, "cancelled", {
            /**
             * Whether the request was cancelled after it was sent.
             */
            get: function () {
                return this._cancelled;
            },
            enumerable: false,
            configurable: true
        });
        /**
         * Resolve the request by returning a body plus additional HTTP information (such as response
         * headers) if provided.
         * If the request specifies an expected body type, the body is converted into the requested type.
         * Otherwise, the body is converted to `JSON` by default.
         *
         * Both successful and unsuccessful responses can be delivered via `flush()`.
         */
        TestRequest.prototype.flush = function (body, opts) {
            if (opts === void 0) { opts = {}; }
            if (this.cancelled) {
                throw new Error("Cannot flush a cancelled request.");
            }
            var url = this.request.urlWithParams;
            var headers = (opts.headers instanceof http.HttpHeaders) ? opts.headers : new http.HttpHeaders(opts.headers);
            body = _maybeConvertBody(this.request.responseType, body);
            var statusText = opts.statusText;
            var status = opts.status !== undefined ? opts.status : 200;
            if (opts.status === undefined) {
                if (body === null) {
                    status = 204;
                    statusText = statusText || 'No Content';
                }
                else {
                    statusText = statusText || 'OK';
                }
            }
            if (statusText === undefined) {
                throw new Error('statusText is required when setting a custom status.');
            }
            if (status >= 200 && status < 300) {
                this.observer.next(new http.HttpResponse({ body: body, headers: headers, status: status, statusText: statusText, url: url }));
                this.observer.complete();
            }
            else {
                this.observer.error(new http.HttpErrorResponse({ error: body, headers: headers, status: status, statusText: statusText, url: url }));
            }
        };
        /**
         * Resolve the request by returning an `ErrorEvent` (e.g. simulating a network failure).
         */
        TestRequest.prototype.error = function (error, opts) {
            if (opts === void 0) { opts = {}; }
            if (this.cancelled) {
                throw new Error("Cannot return an error for a cancelled request.");
            }
            if (opts.status && opts.status >= 200 && opts.status < 300) {
                throw new Error("error() called with a successful status.");
            }
            var headers = (opts.headers instanceof http.HttpHeaders) ? opts.headers : new http.HttpHeaders(opts.headers);
            this.observer.error(new http.HttpErrorResponse({
                error: error,
                headers: headers,
                status: opts.status || 0,
                statusText: opts.statusText || '',
                url: this.request.urlWithParams,
            }));
        };
        /**
         * Deliver an arbitrary `HttpEvent` (such as a progress event) on the response stream for this
         * request.
         */
        TestRequest.prototype.event = function (event) {
            if (this.cancelled) {
                throw new Error("Cannot send events to a cancelled request.");
            }
            this.observer.next(event);
        };
        return TestRequest;
    }());
    /**
     * Helper function to convert a response body to an ArrayBuffer.
     */
    function _toArrayBufferBody(body) {
        if (typeof ArrayBuffer === 'undefined') {
            throw new Error('ArrayBuffer responses are not supported on this platform.');
        }
        if (body instanceof ArrayBuffer) {
            return body;
        }
        throw new Error('Automatic conversion to ArrayBuffer is not supported for response type.');
    }
    /**
     * Helper function to convert a response body to a Blob.
     */
    function _toBlob(body) {
        if (typeof Blob === 'undefined') {
            throw new Error('Blob responses are not supported on this platform.');
        }
        if (body instanceof Blob) {
            return body;
        }
        if (ArrayBuffer && body instanceof ArrayBuffer) {
            return new Blob([body]);
        }
        throw new Error('Automatic conversion to Blob is not supported for response type.');
    }
    /**
     * Helper function to convert a response body to JSON data.
     */
    function _toJsonBody(body, format) {
        if (format === void 0) { format = 'JSON'; }
        if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer) {
            throw new Error("Automatic conversion to " + format + " is not supported for ArrayBuffers.");
        }
        if (typeof Blob !== 'undefined' && body instanceof Blob) {
            throw new Error("Automatic conversion to " + format + " is not supported for Blobs.");
        }
        if (typeof body === 'string' || typeof body === 'number' || typeof body === 'object' ||
            typeof body === 'boolean' || Array.isArray(body)) {
            return body;
        }
        throw new Error("Automatic conversion to " + format + " is not supported for response type.");
    }
    /**
     * Helper function to convert a response body to a string.
     */
    function _toTextBody(body) {
        if (typeof body === 'string') {
            return body;
        }
        if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer) {
            throw new Error('Automatic conversion to text is not supported for ArrayBuffers.');
        }
        if (typeof Blob !== 'undefined' && body instanceof Blob) {
            throw new Error('Automatic conversion to text is not supported for Blobs.');
        }
        return JSON.stringify(_toJsonBody(body, 'text'));
    }
    /**
     * Convert a response body to the requested type.
     */
    function _maybeConvertBody(responseType, body) {
        if (body === null) {
            return null;
        }
        switch (responseType) {
            case 'arraybuffer':
                return _toArrayBufferBody(body);
            case 'blob':
                return _toBlob(body);
            case 'json':
                return _toJsonBody(body);
            case 'text':
                return _toTextBody(body);
            default:
                throw new Error("Unsupported responseType: " + responseType);
        }
    }

    /**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
    /**
     * A testing backend for `HttpClient` which both acts as an `HttpBackend`
     * and as the `HttpTestingController`.
     *
     * `HttpClientTestingBackend` works by keeping a list of all open requests.
     * As requests come in, they're added to the list. Users can assert that specific
     * requests were made and then flush them. In the end, a verify() method asserts
     * that no unexpected requests were made.
     *
     *
     */
    var HttpClientTestingBackend = /** @class */ (function () {
        function HttpClientTestingBackend() {
            /**
             * List of pending requests which have not yet been expected.
             */
            this.open = [];
        }
        /**
         * Handle an incoming request by queueing it in the list of open requests.
         */
        HttpClientTestingBackend.prototype.handle = function (req) {
            var _this = this;
            return new rxjs.Observable(function (observer) {
                var testReq = new TestRequest(req, observer);
                _this.open.push(testReq);
                observer.next({ type: http.HttpEventType.Sent });
                return function () {
                    testReq._cancelled = true;
                };
            });
        };
        /**
         * Helper function to search for requests in the list of open requests.
         */
        HttpClientTestingBackend.prototype._match = function (match) {
            if (typeof match === 'string') {
                return this.open.filter(function (testReq) { return testReq.request.urlWithParams === match; });
            }
            else if (typeof match === 'function') {
                return this.open.filter(function (testReq) { return match(testReq.request); });
            }
            else {
                return this.open.filter(function (testReq) { return (!match.method || testReq.request.method === match.method.toUpperCase()) &&
                    (!match.url || testReq.request.urlWithParams === match.url); });
            }
        };
        /**
         * Search for requests in the list of open requests, and return all that match
         * without asserting anything about the number of matches.
         */
        HttpClientTestingBackend.prototype.match = function (match) {
            var _this = this;
            var results = this._match(match);
            results.forEach(function (result) {
                var index = _this.open.indexOf(result);
                if (index !== -1) {
                    _this.open.splice(index, 1);
                }
            });
            return results;
        };
        /**
         * Expect that a single outstanding request matches the given matcher, and return
         * it.
         *
         * Requests returned through this API will no longer be in the list of open requests,
         * and thus will not match twice.
         */
        HttpClientTestingBackend.prototype.expectOne = function (match, description) {
            description = description || this.descriptionFromMatcher(match);
            var matches = this.match(match);
            if (matches.length > 1) {
                throw new Error("Expected one matching request for criteria \"" + description + "\", found " + matches.length + " requests.");
            }
            if (matches.length === 0) {
                var message = "Expected one matching request for criteria \"" + description + "\", found none.";
                if (this.open.length > 0) {
                    // Show the methods and URLs of open requests in the error, for convenience.
                    var requests = this.open
                        .map(function (testReq) {
                        var url = testReq.request.urlWithParams;
                        var method = testReq.request.method;
                        return method + " " + url;
                    })
                        .join(', ');
                    message += " Requests received are: " + requests + ".";
                }
                throw new Error(message);
            }
            return matches[0];
        };
        /**
         * Expect that no outstanding requests match the given matcher, and throw an error
         * if any do.
         */
        HttpClientTestingBackend.prototype.expectNone = function (match, description) {
            description = description || this.descriptionFromMatcher(match);
            var matches = this.match(match);
            if (matches.length > 0) {
                throw new Error("Expected zero matching requests for criteria \"" + description + "\", found " + matches.length + ".");
            }
        };
        /**
         * Validate that there are no outstanding requests.
         */
        HttpClientTestingBackend.prototype.verify = function (opts) {
            if (opts === void 0) { opts = {}; }
            var open = this.open;
            // It's possible that some requests may be cancelled, and this is expected.
            // The user can ask to ignore open requests which have been cancelled.
            if (opts.ignoreCancelled) {
                open = open.filter(function (testReq) { return !testReq.cancelled; });
            }
            if (open.length > 0) {
                // Show the methods and URLs of open requests in the error, for convenience.
                var requests = open.map(function (testReq) {
                    var url = testReq.request.urlWithParams.split('?')[0];
                    var method = testReq.request.method;
                    return method + " " + url;
                })
                    .join(', ');
                throw new Error("Expected no open requests, found " + open.length + ": " + requests);
            }
        };
        HttpClientTestingBackend.prototype.descriptionFromMatcher = function (matcher) {
            if (typeof matcher === 'string') {
                return "Match URL: " + matcher;
            }
            else if (typeof matcher === 'object') {
                var method = matcher.method || '(any)';
                var url = matcher.url || '(any)';
                return "Match method: " + method + ", URL: " + url;
            }
            else {
                return "Match by function: " + matcher.name;
            }
        };
        return HttpClientTestingBackend;
    }());
    HttpClientTestingBackend.decorators = [
        { type: core.Injectable }
    ];

    /**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
    /**
     * Configures `HttpClientTestingBackend` as the `HttpBackend` used by `HttpClient`.
     *
     * Inject `HttpTestingController` to expect and flush requests in your tests.
     *
     * @publicApi
     */
    var HttpClientTestingModule = /** @class */ (function () {
        function HttpClientTestingModule() {
        }
        return HttpClientTestingModule;
    }());
    HttpClientTestingModule.decorators = [
        { type: core.NgModule, args: [{
                    imports: [
                        http.HttpClientModule,
                    ],
                    providers: [
                        HttpClientTestingBackend,
                        { provide: http.HttpBackend, useExisting: HttpClientTestingBackend },
                        { provide: HttpTestingController, useExisting: HttpClientTestingBackend },
                    ],
                },] }
    ];

    /**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */

    /**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */

    /**
     * Generated bundle index. Do not edit.
     */

    exports.HttpClientTestingModule = HttpClientTestingModule;
    exports.HttpTestingController = HttpTestingController;
    exports.TestRequest = TestRequest;
    exports.ɵangular_packages_common_http_testing_testing_a = HttpClientTestingBackend;

    Object.defineProperty(exports, '__esModule', { value: true });

})));
//# sourceMappingURL=common-http-testing.umd.js.map
