Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@ppwcode/ng-unit-testing

Package Overview
Dependencies
Maintainers
5
Versions
74
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ppwcode/ng-unit-testing - npm Package Compare versions

Comparing version
0.0.70
to
0.0.71
+22
-14
esm2022/lib/http/http-call-tester.mjs

@@ -21,4 +21,2 @@ import { notUndefined } from '@ppwcode/js-ts-oddsandends/lib/conditional-assert';

* .verify();
*
* // No further expectations necessary.
* });

@@ -117,3 +115,3 @@ */

verify() {
this.verifySubscription(1, 0);
this.verifySubscription({ expectedSubscriptionHits: 1, expectedFailureHits: 0 });
}

@@ -128,5 +126,8 @@ /**

verifyFailure() {
this.verifySubscription(0, 1);
this.verifySubscription({
expectedSubscriptionHits: 0,
expectedFailureHits: 1
});
}
verifySubscription(expectedSubscriptionHits, expectedFailureHits) {
verifySubscription({ expectedSubscriptionHits, expectedFailureHits }) {
const stream$ = notUndefined(this.stream$);

@@ -136,15 +137,22 @@ const response = notUndefined(this.mockedResponse);

let failureHits = 0;
const subscription = stream$.subscribe((result) => {
this.expectStreamResultFn(result);
subscriptionHits++;
}, (error) => {
this.expectErrorFn(error);
failureHits++;
const subscription = stream$.subscribe({
next: (result) => {
this.expectStreamResultFn(result);
subscriptionHits++;
},
error: (error) => {
this.expectErrorFn(error);
failureHits++;
}
});
expectOneCallToUrl(this.url, response, this.expectRequestFn, this.responseOptions);
subscription.unsubscribe();
expect(subscriptionHits).toEqual(expectedSubscriptionHits);
expect(failureHits).toEqual(expectedFailureHits);
expect(subscriptionHits)
.withContext(`Expected ${expectedSubscriptionHits} successful http stream results but got ${subscriptionHits}`)
.toEqual(expectedSubscriptionHits);
expect(failureHits)
.withContext(`Expected ${expectedFailureHits} failed http stream results but got ${failureHits}`)
.toEqual(expectedFailureHits);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jYWxsLXRlc3Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Bwd2NvZGUvbmctdW5pdC10ZXN0aW5nL3NyYy9saWIvaHR0cC9odHRwLWNhbGwtdGVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtREFBbUQsQ0FBQTtBQUNoRixPQUFPLEVBQUUsSUFBSSxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBRXZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBbUIsTUFBTSxrQ0FBa0MsQ0FBQTtBQUd0Rjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQW1CdkIsWUFBNkIsR0FBVztRQUFYLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFUeEMsd0hBQXdIO1FBQ2hILG9CQUFlLEdBQW1DLElBQUksQ0FBQTtRQUU5RCxxSUFBcUk7UUFDN0gseUJBQW9CLEdBQW9DLElBQUksQ0FBQTtRQUVwRSxxSUFBcUk7UUFDN0gsa0JBQWEsR0FBNkIsSUFBSSxDQUFBO0lBRVgsQ0FBQztJQUU1QywyRkFBMkY7SUFDcEYsTUFBTSxDQUFDLGtCQUFrQixDQUM1QixHQUFXO1FBRVgsT0FBTyxJQUFJLGNBQWMsQ0FBa0MsR0FBRyxDQUFDLENBQUE7SUFDbkUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBdUIsR0FBVztRQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBRXZCLE9BQU8sSUFBSSxjQUFjLENBQXNCLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ25HLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBZ0MsQ0FBQyxDQUFBO1FBQ3pELENBQUMsQ0FB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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXN0UmVxdWVzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwL3Rlc3RpbmcnXG5pbXBvcnQgeyBub3RVbmRlZmluZWQgfSBmcm9tICdAcHB3Y29kZS9qcy10cy1vZGRzYW5kZW5kcy9saWIvY29uZGl0aW9uYWwtYXNzZXJ0J1xuaW1wb3J0IHsgbm9vcCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5cbmltcG9ydCB7IGV4cGVjdE9uZUNhbGxUb1VybCwgUmVzcG9uc2VPcHRpb25zIH0gZnJvbSAnLi9odHRwLWNsaWVudC10ZXN0aW5nLWNvbnRyb2xsZXInXG5pbXBvcnQgeyBGaWxlRG93bmxvYWQgfSBmcm9tICdAcHB3Y29kZS9uZy1hc3luYydcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGluIHRlc3RpbmcgdG8gbGV2ZXJhZ2UgdGhlIEh0dHBUZXN0aW5nQ29udHJvbGxlciBmb3IgSFRUUCBjYWxsIHRlc3RpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGl0KCdzaG91bGQgdmVyaWZ5IHRoZSBjYWxsIHRvIC9hcGknLCAoKSA9PiB7XG4gKiAgIGNvbnN0IHJlc3BvbnNlOiBBcnJheTxzdHJpbmc+ID0gW107XG4gKlxuICogICBIdHRwQ2FsbFRlc3Rlci5leHBlY3RPbmVDYWxsVG9VcmwoJy9hcGknKVxuICogICAgIC53aGVuU3Vic2NyaWJpbmdUbyhodHRwQ2xpZW50LmdldCgnL2FwaScpKVxuICogICAgIC5jaGVja1JlcXVlc3QoKHRlc3RSZXF1ZXN0KSA9PiB7IC8vIE9wdGlvbmFsXG4gKiAgICAgICBleHBlY3QodGVzdFJlcXVlc3QucmVxdWVzdC51cmwpLnRvRXF1YWwoJy9hcGknKTtcbiAqICAgICB9KVxuICogICAgIC53aXRoUmVzcG9uc2UocmVzcG9uc2UpXG4gKiAgICAgLmNoZWNrUmVzdWx0KChyZXN1bHQpID0+IHsgLy8gT3B0aW9uYWxcbiAqICAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUocmVzcG9uc2UpO1xuICogICAgIH0pXG4gKiAgICAgLnZlcmlmeSgpO1xuICpcbiAqICAgLy8gTm8gZnVydGhlciBleHBlY3RhdGlvbnMgbmVjZXNzYXJ5LlxuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBIdHRwQ2FsbFRlc3RlcjxUUmVxdWVzdFJlc3BvbnNlLCBUU3RyZWFtUmVzdWx0PiB7XG4gICAgLyoqIFRoZSBzdHJlYW0gdGhhdCB3aWxsIGJlIHN1YnNjcmliZWQgdG8gaW4gdGhlIHZlcmlmeSBmdW5jdGlvbi4gKi9cbiAgICBwcml2YXRlIHN0cmVhbSQ/OiBPYnNlcnZhYmxlPFRTdHJlYW1SZXN1bHQ+XG5cbiAgICAvKiogVGhlIHJlcXVlc3QgcmVzcG9uc2UgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgd2hlbiBhIHJlcXVlc3QgaXMgcmVjZWl2ZWQgb24gdGhlIHVybC4gKi9cbiAgICBwcml2YXRlIG1vY2tlZFJlc3BvbnNlPzogVFJlcXVlc3RSZXNwb25zZVxuXG4gICAgLyoqIFRoZSBvcHRpb25zIHRvIGZ1cnRoZXIgY29uZmlndXJlIHRoZSByZXNwb25zZS4gKi9cbiAgICBwcml2YXRlIHJlc3BvbnNlT3B0aW9ucz86IFJlc3BvbnNlT3B0aW9uc1xuXG4gICAgLyoqIFZlcmlmaWNhdGlvbiBmdW5jdGlvbiBleGVjdXRlZCBkdXJpbmcgdGhlIHZlcmlmeSBmdW5jdGlvbiB0byBhbGxvdyBkZXZlbG9wZXJzIHRvIHNldCBleHBlY3RhdGlvbnMgb24gdGhlIHJlcXVlc3QuICovXG4gICAgcHJpdmF0ZSBleHBlY3RSZXF1ZXN0Rm46IChyZXF1ZXN0OiBUZXN0UmVxdWVzdCkgPT4gdm9pZCA9IG5vb3BcblxuICAgIC8qKiBWZXJpZmljYXRpb24gZnVuY3Rpb24gZXhlY3V0ZWQgZHVyaW5nIHRoZSB2ZXJpZnkgZnVuY3Rpb24gdG8gYWxsb3cgZGV2ZWxvcGVycyB0byBzZXQgZXhwZWN0YXRpb25zIG9uIHRoZSByZXN1bHQgb2YgdGhlIHN0cmVhbS4gKi9cbiAgICBwcml2YXRlIGV4cGVjdFN0cmVhbVJlc3VsdEZuOiAocmVzdWx0OiBUU3RyZWFtUmVzdWx0KSA9PiB2b2lkID0gbm9vcFxuXG4gICAgLyoqIFZlcmlmaWNhdGlvbiBmdW5jdGlvbiBleGVjdXRlZCBkdXJpbmcgdGhlIHZlcmlmeSBmdW5jdGlvbiB0byBhbGxvdyBkZXZlbG9wZXJzIHRvIHNldCBleHBlY3RhdGlvbnMgb24gdGhlIGVycm9yIHRoYXQgaXMgdGhyb3duLiAqL1xuICAgIHByaXZhdGUgZXhwZWN0RXJyb3JGbjogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkID0gbm9vcFxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB1cmw6IHN0cmluZykge31cblxuICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEh0dHBDYWxsVGVzdGVyIHRoYXQgY2FuIGJlIGNoYWluZWQgdG8gdmVyaWZ5IGFuIEhUVFAgY2FsbC4gKi9cbiAgICBwdWJsaWMgc3RhdGljIGV4cGVjdE9uZUNhbGxUb1VybDxUUmVxdWVzdFJlc3BvbnNlLCBUU3RyZWFtUmVzdWx0PihcbiAgICAgICAgdXJsOiBzdHJpbmdcbiAgICApOiBIdHRwQ2FsbFRlc3RlcjxUUmVxdWVzdFJlc3BvbnNlLCBUU3RyZWFtUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBuZXcgSHR0cENhbGxUZXN0ZXI8VFJlcXVlc3RSZXNwb25zZSwgVFN0cmVhbVJlc3VsdD4odXJsKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgSHR0cENhbGxUZXN0ZXIgdGhhdCBoYXMgYmVlbiBzZXQgdXAgdG8gY2hlY2sgdGhlIHJldHJpZXZhbCBvZiBhIEJsb2IuXG4gICAgICogSXQgaGFzIGJlZW4gc2V0IHVwIHdpdGggYW4gZW1wdHkgYmxvYiBhcyB0aGUgcmVzcG9uc2UgcmVzdWx0IGFuZCBleHBlY3RzIHRoYXQgdGhlIHN0cmVhbSByZXN1bHQgaXMgdGhlIHNhbWUgYmxvYi5cbiAgICAgKlxuICAgICAqIFRoZSBleHBlY3RhdGlvbiBvZiB0aGUgc3RyZWFtIHJlc3VsdCBjYW4gc2ltcGx5IGJlIG92ZXJyaWRkZW4gYnkgY2FsbGluZyBgLmV4cGVjdFN0cmVhbVJlc3VsdFRvYCBhZ2Fpbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSHR0cENhbGxUZXN0ZXIuZXhwZWN0T25lQmxvYkZyb20oJ2h0dHBzOi8vYXBpL2V4cG9ydCcpXG4gICAgICogICAgLndoZW5TdWJzY3JpYmluZ1RvKGh0dHBDbGllbnQuZ2V0KCdodHRwczovL2FwaS9leHBvcnQpKVxuICAgICAqICAgIC52ZXJpZnkoKTtcbiAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQuXG4gICAgICogQHJldHVybnMgQW4gSHR0cENhbGxUZXN0ZXIgaW5zdGFuY2UgcmVhZHkgdG8gdmVyaWZ5IHRoZSBjYWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZXhwZWN0T25lQmxvYkZyb21Vcmw8VFN0cmVhbVJlc3VsdCA9IEJsb2I+KHVybDogc3RyaW5nKTogSHR0cENhbGxUZXN0ZXI8QmxvYiwgVFN0cmVhbVJlc3VsdD4ge1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoKVxuXG4gICAgICAgIHJldHVybiBuZXcgSHR0cENhbGxUZXN0ZXI8QmxvYiwgVFN0cmVhbVJlc3VsdD4odXJsKS53aXRoUmVzcG9uc2UoYmxvYikuZXhwZWN0U3RyZWFtUmVzdWx0VG8oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShibG9iIGFzIHVua25vd24gYXMgVFN0cmVhbVJlc3VsdClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEh0dHBDYWxsVGVzdGVyIHRoYXQgaGFzIGJlZW4gc2V0IHVwIHRvIGNoZWNrIHRoZSByZXRyaWV2YWwgb2YgYSBCbG9iLlxuICAgICAqIEl0IGhhcyBiZWVuIHNldCB1cCB3aXRoIGFuIGVtcHR5IGJsb2IgYXMgdGhlIHJlc3BvbnNlIHJlc3VsdCBhbmQgZXhwZWN0cyB0aGF0IHRoZSBzdHJlYW0gcmVzdWx0IGlzIHRoZSBzYW1lIGJsb2IuXG4gICAgICpcbiAgICAgKiBUaGUgZXhwZWN0YXRpb24gb2YgdGhlIHN0cmVhbSByZXN1bHQgY2FuIHNpbXBseSBiZSBvdmVycmlkZGVuIGJ5IGNhbGxpbmcgYC5leHBlY3RTdHJlYW1SZXN1bHRUb2AgYWdhaW4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIEh0dHBDYWxsVGVzdGVyLmV4cGVjdE9uZUJsb2JGcm9tKCdodHRwczovL2FwaS9leHBvcnQnKVxuICAgICAqICAgIC53aGVuU3Vic2NyaWJpbmdUbyhodHRwQ2xpZW50LmdldCgnaHR0cHM6Ly9hcGkvZXhwb3J0KSlcbiAgICAgKiAgICAudmVyaWZ5KCk7XG4gICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkLlxuICAgICAqIEByZXR1cm5zIEFuIEh0dHBDYWxsVGVzdGVyIGluc3RhbmNlIHJlYWR5IHRvIHZlcmlmeSB0aGUgY2FsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGV4cGVjdE9uZUZpbGVEb3dubG9hZEZyb21Vcmw8VFN0cmVhbVJlc3VsdCA9IEZpbGVEb3dubG9hZD4oXG4gICAgICAgIHVybDogc3RyaW5nXG4gICAgKTogSHR0cENhbGxUZXN0ZXI8RmlsZURvd25sb2FkLCBUU3RyZWFtUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGZpbGVEb3dubG9hZDogRmlsZURvd25sb2FkID0ge1xuICAgICAgICAgICAgYmxvYjogbmV3IEJsb2IoKSxcbiAgICAgICAgICAgIGZpbGVOYW1lOiAndGVzdEZpbGUudHh0J1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwQ2FsbFRlc3RlcjxGaWxlRG93bmxvYWQsIFRTdHJlYW1SZXN1bHQ+KHVybClcbiAgICAgICAgICAgIC53aXRoUmVzcG9uc2UoZmlsZURvd25sb2FkKVxuICAgICAgICAgICAgLmV4cGVjdFN0cmVhbVJlc3VsdFRvKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZpbGVEb3dubG9hZCBhcyB1bmtub3duIGFzIFRTdHJlYW1SZXN1bHQpXG4gICAgICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKiBTZXQgdGhlIHN0cmVhbSB0aGF0IHdpbGwgYmUgc3Vic2NyaWJlZCB0byBpbiB0aGUgdmVyaWZ5IGZ1bmN0aW9uLiBUaGUgc3RyZWFtIHNob3VsZCBoYXZlIGFuIEhUVFAgY2FsbCBhcyBjb25zZXF1ZW5jZS4gKi9cbiAgICBwdWJsaWMgd2hlblN1YnNjcmliaW5nVG8oc3RyZWFtJDogT2JzZXJ2YWJsZTxUU3RyZWFtUmVzdWx0Pik6IEh0dHBDYWxsVGVzdGVyPFRSZXF1ZXN0UmVzcG9uc2UsIFRTdHJlYW1SZXN1bHQ+IHtcbiAgICAgICAgdGhpcy5zdHJlYW0kID0gc3RyZWFtJFxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqIFNldCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgdmVyaWZ5IGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHJlcXVlc3QgbWF0Y2hlcyBjZXJ0YWluIGNvbmRpdGlvbnMuICovXG4gICAgcHVibGljIGV4cGVjdFJlcXVlc3RUbyhcbiAgICAgICAgZXhwZWN0UmVxdWVzdEZuOiAocmVxdWVzdDogVGVzdFJlcXVlc3QpID0+IHZvaWRcbiAgICApOiBIdHRwQ2FsbFRlc3RlcjxUUmVxdWVzdFJlc3BvbnNlLCBUU3RyZWFtUmVzdWx0PiB7XG4gICAgICAgIHRoaXMuZXhwZWN0UmVxdWVzdEZuID0gZXhwZWN0UmVxdWVzdEZuXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogU2V0IHRoZSByZXNwb25zZSB0aGF0IHdpbGwgYmUgc2VudCBieSB0aGUgSHR0cFRlc3RpbmdDb250cm9sbGVyIHdoZW4gZmx1c2hpbmcgdGhlIHJlcXVlc3QuICovXG4gICAgcHVibGljIHdpdGhSZXNwb25zZShcbiAgICAgICAgbW9ja2VkUmVzcG9uc2U6IFRSZXF1ZXN0UmVzcG9uc2UsXG4gICAgICAgIHJlc3BvbnNlT3B0aW9ucz86IFJlc3BvbnNlT3B0aW9uc1xuICAgICk6IEh0dHBDYWxsVGVzdGVyPFRSZXF1ZXN0UmVzcG9uc2UsIFRTdHJlYW1SZXN1bHQ+IHtcbiAgICAgICAgdGhpcy5tb2NrZWRSZXNwb25zZSA9IG1vY2tlZFJlc3BvbnNlXG4gICAgICAgIHRoaXMucmVzcG9uc2VPcHRpb25zID0gcmVzcG9uc2VPcHRpb25zXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogU2V0IGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSB2ZXJpZnkgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciB0aGUgc3RyZWFtIHJlc3VsdCBtYXRjaGVzIGNlcnRhaW4gY29uZGl0aW9ucy4gKi9cbiAgICBwdWJsaWMgZXhwZWN0U3RyZWFtUmVzdWx0VG8oXG4gICAgICAgIGV4cGVjdFN0cmVhbVJlc3VsdEZuOiAocmVzdWx0OiBUU3RyZWFtUmVzdWx0KSA9PiB2b2lkXG4gICAgKTogSHR0cENhbGxUZXN0ZXI8VFJlcXVlc3RSZXNwb25zZSwgVFN0cmVhbVJlc3VsdD4ge1xuICAgICAgICB0aGlzLmV4cGVjdFN0cmVhbVJlc3VsdEZuID0gZXhwZWN0U3RyZWFtUmVzdWx0Rm5cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBTZXQgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHZlcmlmeSBmdW5jdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBlcnJvciBtYXRjaGVzIGNlcnRhaW4gY29uZGl0aW9ucy4gKi9cbiAgICBwdWJsaWMgZXhwZWN0RXJyb3JUbyhleHBlY3RFcnJvckZuOiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQpOiBIdHRwQ2FsbFRlc3RlcjxUUmVxdWVzdFJlc3BvbnNlLCBUU3RyZWFtUmVzdWx0PiB7XG4gICAgICAgIHRoaXMuZXhwZWN0RXJyb3JGbiA9IGV4cGVjdEVycm9yRm5cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIGlmIGFuIEhUVFAgY2FsbCBpcyBtYWRlIHN1Y2Nlc3NmdWxseSBhbmQgdHJpZ2dlcnMgdGhlIHZlcmlmaWNhdGlvbiBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gc2V0LlxuICAgICAqIEFsc28gY2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHN0cmVhbSBvbmx5IGVtaXRzIG9uY2UuXG4gICAgICogSGFuZGxlcyBjbGVhbnVwIHRvIHByZXZlbnQgYW55IG1lbW9yeSBsZWFrcyBkdXJpbmcgdGhlIHByb2Nlc3MuXG4gICAgICogQHRocm93cyBUaHJvd3MgYSBDb25kaXRpb25WaW9sYXRpb24gaWYgbm8gc3RyZWFtIGhhcyBiZWVuIHNldC5cbiAgICAgKiBAdGhyb3dzIFRocm93cyBhIENvbmRpdGlvblZpb2xhdGlvbiBpZiBubyBtb2NrZWQgcmVxdWVzdCByZXNwb25zZSBoYXMgYmVlbiBzZXQuXG4gICAgICovXG4gICAgcHVibGljIHZlcmlmeSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52ZXJpZnlTdWJzY3JpcHRpb24oMSwgMClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyBpZiBhbiBIVFRQIGNhbGwgaXMgbWFkZSB1bnN1Y2Nlc3NmdWxseSBhbmQgdHJpZ2dlcnMgdGhlIHZlcmlmaWNhdGlvbiBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gc2V0LlxuICAgICAqIEFsc28gY2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHN0cmVhbSBvbmx5IGZhaWxzIG9uY2UuXG4gICAgICogSGFuZGxlcyBjbGVhbnVwIHRvIHByZXZlbnQgYW55IG1lbW9yeSBsZWFrcyBkdXJpbmcgdGhlIHByb2Nlc3MuXG4gICAgICogQHRocm93cyBUaHJvd3MgYSBDb25kaXRpb25WaW9sYXRpb24gaWYgbm8gc3RyZWFtIGhhcyBiZWVuIHNldC5cbiAgICAgKiBAdGhyb3dzIFRocm93cyBhIENvbmRpdGlvblZpb2xhdGlvbiBpZiBubyBtb2NrZWQgcmVxdWVzdCByZXNwb25zZSBoYXMgYmVlbiBzZXQuXG4gICAgICovXG4gICAgcHVibGljIHZlcmlmeUZhaWx1cmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmVyaWZ5U3Vic2NyaXB0aW9uKDAsIDEpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2ZXJpZnlTdWJzY3JpcHRpb24oZXhwZWN0ZWRTdWJzY3JpcHRpb25IaXRzOiBudW1iZXIsIGV4cGVjdGVkRmFpbHVyZUhpdHM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdHJlYW0kID0gbm90VW5kZWZpbmVkKHRoaXMuc3RyZWFtJClcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBub3RVbmRlZmluZWQodGhpcy5tb2NrZWRSZXNwb25zZSlcblxuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uSGl0cyA9IDBcbiAgICAgICAgbGV0IGZhaWx1cmVIaXRzID0gMFxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBzdHJlYW0kLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXN1bHQ6IFRTdHJlYW1SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdFN0cmVhbVJlc3VsdEZuKHJlc3VsdClcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25IaXRzKytcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdEVycm9yRm4oZXJyb3IpXG4gICAgICAgICAgICAgICAgZmFpbHVyZUhpdHMrK1xuICAgICAgICAgICAgfVxuICAgICAgICApXG5cbiAgICAgICAgZXhwZWN0T25lQ2FsbFRvVXJsKHRoaXMudXJsLCByZXNwb25zZSwgdGhpcy5leHBlY3RSZXF1ZXN0Rm4sIHRoaXMucmVzcG9uc2VPcHRpb25zKVxuXG4gICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgICAgIGV4cGVjdChzdWJzY3JpcHRpb25IaXRzKS50b0VxdWFsKGV4cGVjdGVkU3Vic2NyaXB0aW9uSGl0cylcbiAgICAgICAgZXhwZWN0KGZhaWx1cmVIaXRzKS50b0VxdWFsKGV4cGVjdGVkRmFpbHVyZUhpdHMpXG4gICAgfVxufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jYWxsLXRlc3Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Bwd2NvZGUvbmctdW5pdC10ZXN0aW5nL3NyYy9saWIvaHR0cC9odHRwLWNhbGwtdGVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtREFBbUQsQ0FBQTtBQUVoRixPQUFPLEVBQUUsSUFBSSxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBRXZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBbUIsTUFBTSxrQ0FBa0MsQ0FBQTtBQUV0Rjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFtQnZCLFlBQTZCLEdBQVc7UUFBWCxRQUFHLEdBQUgsR0FBRyxDQUFRO1FBVHhDLHdIQUF3SDtRQUNoSCxvQkFBZSxHQUFtQyxJQUFJLENBQUE7UUFFOUQscUlBQXFJO1FBQzdILHlCQUFvQixHQUFvQyxJQUFJLENBQUE7UUFFcEUscUlBQXFJO1FBQzdILGtCQUFhLEdBQTZCLElBQUksQ0FBQTtJQUVYLENBQUM7SUFFNUMsMkZBQTJGO0lBQ3BGLE1BQU0sQ0FBQyxrQkFBa0IsQ0FDNUIsR0FBVztRQUVYLE9BQU8sSUFBSSxjQUFjLENBQWtDLEdBQUcsQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQXVCLEdBQVc7UUFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUV2QixPQUFPLElBQUksY0FBYyxDQUFzQixHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNuRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQWdDLENBQUMsQ0FBQTtRQUN6RCxDQUFDLENBQUMs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QWdCLENBQUM7YUFDbkIsV0FBVyxDQUNSLFlBQVksd0JBQXdCLDJDQUEyQyxnQkFBZ0IsRUFBRSxDQUNwRzthQUNBLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQ3RDLE1BQU0sQ0FBQyxXQUFXLENBQUM7YUFDZCxXQUFXLENBQUMsWUFBWSxtQkFBbUIsdUNBQXVDLFdBQVcsRUFBRSxDQUFDO2FBQ2hHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3RSZXF1ZXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAvdGVzdGluZydcbmltcG9ydCB7IG5vdFVuZGVmaW5lZCB9IGZyb20gJ0BwcHdjb2RlL2pzLXRzLW9kZHNhbmRlbmRzL2xpYi9jb25kaXRpb25hbC1hc3NlcnQnXG5pbXBvcnQgeyBGaWxlRG93bmxvYWQgfSBmcm9tICdAcHB3Y29kZS9uZy1hc3luYydcbmltcG9ydCB7IG5vb3AsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJ1xuXG5pbXBvcnQgeyBleHBlY3RPbmVDYWxsVG9VcmwsIFJlc3BvbnNlT3B0aW9ucyB9IGZyb20gJy4vaHR0cC1jbGllbnQtdGVzdGluZy1jb250cm9sbGVyJ1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gdGVzdGluZyB0byBsZXZlcmFnZSB0aGUgSHR0cFRlc3RpbmdDb250cm9sbGVyIGZvciBIVFRQIGNhbGwgdGVzdGluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaXQoJ3Nob3VsZCB2ZXJpZnkgdGhlIGNhbGwgdG8gL2FwaScsICgpID0+IHtcbiAqICAgY29uc3QgcmVzcG9uc2U6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAqXG4gKiAgIEh0dHBDYWxsVGVzdGVyLmV4cGVjdE9uZUNhbGxUb1VybCgnL2FwaScpXG4gKiAgICAgLndoZW5TdWJzY3JpYmluZ1RvKGh0dHBDbGllbnQuZ2V0KCcvYXBpJykpXG4gKiAgICAgLmNoZWNrUmVxdWVzdCgodGVzdFJlcXVlc3QpID0+IHsgLy8gT3B0aW9uYWxcbiAqICAgICAgIGV4cGVjdCh0ZXN0UmVxdWVzdC5yZXF1ZXN0LnVybCkudG9FcXVhbCgnL2FwaScpO1xuICogICAgIH0pXG4gKiAgICAgLndpdGhSZXNwb25zZShyZXNwb25zZSlcbiAqICAgICAuY2hlY2tSZXN1bHQoKHJlc3VsdCkgPT4geyAvLyBPcHRpb25hbFxuICogICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShyZXNwb25zZSk7XG4gKiAgICAgfSlcbiAqICAgICAudmVyaWZ5KCk7XG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDYWxsVGVzdGVyPFRSZXF1ZXN0UmVzcG9uc2UsIFRTdHJlYW1SZXN1bHQ+IHtcbiAgICAvKiogVGhlIHN0cmVhbSB0aGF0IHdpbGwgYmUgc3Vic2NyaWJlZCB0byBpbiB0aGUgdmVyaWZ5IGZ1bmN0aW9uLiAqL1xuICAgIHByaXZhdGUgc3RyZWFtJD86IE9ic2VydmFibGU8VFN0cmVhbVJlc3VsdD5cblxuICAgIC8qKiBUaGUgcmVxdWVzdCByZXNwb25zZSB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIGEgcmVxdWVzdCBpcyByZWNlaXZlZCBvbiB0aGUgdXJsLiAqL1xuICAgIHByaXZhdGUgbW9ja2VkUmVzcG9uc2U/OiBUUmVxdWVzdFJlc3BvbnNlXG5cbiAgICAvKiogVGhlIG9wdGlvbnMgdG8gZnVydGhlciBjb25maWd1cmUgdGhlIHJlc3BvbnNlLiAqL1xuICAgIHByaXZhdGUgcmVzcG9uc2VPcHRpb25zPzogUmVzcG9uc2VPcHRpb25zXG5cbiAgICAvKiogVmVyaWZpY2F0aW9uIGZ1bmN0aW9uIGV4ZWN1dGVkIGR1cmluZyB0aGUgdmVyaWZ5IGZ1bmN0aW9uIHRvIGFsbG93IGRldmVsb3BlcnMgdG8gc2V0IGV4cGVjdGF0aW9ucyBvbiB0aGUgcmVxdWVzdC4gKi9cbiAgICBwcml2YXRlIGV4cGVjdFJlcXVlc3RGbjogKHJlcXVlc3Q6IFRlc3RSZXF1ZXN0KSA9PiB2b2lkID0gbm9vcFxuXG4gICAgLyoqIFZlcmlmaWNhdGlvbiBmdW5jdGlvbiBleGVjdXRlZCBkdXJpbmcgdGhlIHZlcmlmeSBmdW5jdGlvbiB0byBhbGxvdyBkZXZlbG9wZXJzIHRvIHNldCBleHBlY3RhdGlvbnMgb24gdGhlIHJlc3VsdCBvZiB0aGUgc3RyZWFtLiAqL1xuICAgIHByaXZhdGUgZXhwZWN0U3RyZWFtUmVzdWx0Rm46IChyZXN1bHQ6IFRTdHJlYW1SZXN1bHQpID0+IHZvaWQgPSBub29wXG5cbiAgICAvKiogVmVyaWZpY2F0aW9uIGZ1bmN0aW9uIGV4ZWN1dGVkIGR1cmluZyB0aGUgdmVyaWZ5IGZ1bmN0aW9uIHRvIGFsbG93IGRldmVsb3BlcnMgdG8gc2V0IGV4cGVjdGF0aW9ucyBvbiB0aGUgZXJyb3IgdGhhdCBpcyB0aHJvd24uICovXG4gICAgcHJpdmF0ZSBleHBlY3RFcnJvckZuOiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQgPSBub29wXG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHVybDogc3RyaW5nKSB7fVxuXG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgSHR0cENhbGxUZXN0ZXIgdGhhdCBjYW4gYmUgY2hhaW5lZCB0byB2ZXJpZnkgYW4gSFRUUCBjYWxsLiAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZXhwZWN0T25lQ2FsbFRvVXJsPFRSZXF1ZXN0UmVzcG9uc2UsIFRTdHJlYW1SZXN1bHQ+KFxuICAgICAgICB1cmw6IHN0cmluZ1xuICAgICk6IEh0dHBDYWxsVGVzdGVyPFRSZXF1ZXN0UmVzcG9uc2UsIFRTdHJlYW1SZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwQ2FsbFRlc3RlcjxUUmVxdWVzdFJlc3BvbnNlLCBUU3RyZWFtUmVzdWx0Pih1cmwpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBIdHRwQ2FsbFRlc3RlciB0aGF0IGhhcyBiZWVuIHNldCB1cCB0byBjaGVjayB0aGUgcmV0cmlldmFsIG9mIGEgQmxvYi5cbiAgICAgKiBJdCBoYXMgYmVlbiBzZXQgdXAgd2l0aCBhbiBlbXB0eSBibG9iIGFzIHRoZSByZXNwb25zZSByZXN1bHQgYW5kIGV4cGVjdHMgdGhhdCB0aGUgc3RyZWFtIHJlc3VsdCBpcyB0aGUgc2FtZSBibG9iLlxuICAgICAqXG4gICAgICogVGhlIGV4cGVjdGF0aW9uIG9mIHRoZSBzdHJlYW0gcmVzdWx0IGNhbiBzaW1wbHkgYmUgb3ZlcnJpZGRlbiBieSBjYWxsaW5nIGAuZXhwZWN0U3RyZWFtUmVzdWx0VG9gIGFnYWluLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBIdHRwQ2FsbFRlc3Rlci5leHBlY3RPbmVCbG9iRnJvbSgnaHR0cHM6Ly9hcGkvZXhwb3J0JylcbiAgICAgKiAgICAud2hlblN1YnNjcmliaW5nVG8oaHR0cENsaWVudC5nZXQoJ2h0dHBzOi8vYXBpL2V4cG9ydCkpXG4gICAgICogICAgLnZlcmlmeSgpO1xuICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZC5cbiAgICAgKiBAcmV0dXJucyBBbiBIdHRwQ2FsbFRlc3RlciBpbnN0YW5jZSByZWFkeSB0byB2ZXJpZnkgdGhlIGNhbGwuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBleHBlY3RPbmVCbG9iRnJvbVVybDxUU3RyZWFtUmVzdWx0ID0gQmxvYj4odXJsOiBzdHJpbmcpOiBIdHRwQ2FsbFRlc3RlcjxCbG9iLCBUU3RyZWFtUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYigpXG5cbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwQ2FsbFRlc3RlcjxCbG9iLCBUU3RyZWFtUmVzdWx0Pih1cmwpLndpdGhSZXNwb25zZShibG9iKS5leHBlY3RTdHJlYW1SZXN1bHRUbygocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKGJsb2IgYXMgdW5rbm93biBhcyBUU3RyZWFtUmVzdWx0KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgSHR0cENhbGxUZXN0ZXIgdGhhdCBoYXMgYmVlbiBzZXQgdXAgdG8gY2hlY2sgdGhlIHJldHJpZXZhbCBvZiBhIEJsb2IuXG4gICAgICogSXQgaGFzIGJlZW4gc2V0IHVwIHdpdGggYW4gZW1wdHkgYmxvYiBhcyB0aGUgcmVzcG9uc2UgcmVzdWx0IGFuZCBleHBlY3RzIHRoYXQgdGhlIHN0cmVhbSByZXN1bHQgaXMgdGhlIHNhbWUgYmxvYi5cbiAgICAgKlxuICAgICAqIFRoZSBleHBlY3RhdGlvbiBvZiB0aGUgc3RyZWFtIHJlc3VsdCBjYW4gc2ltcGx5IGJlIG92ZXJyaWRkZW4gYnkgY2FsbGluZyBgLmV4cGVjdFN0cmVhbVJlc3VsdFRvYCBhZ2Fpbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSHR0cENhbGxUZXN0ZXIuZXhwZWN0T25lQmxvYkZyb20oJ2h0dHBzOi8vYXBpL2V4cG9ydCcpXG4gICAgICogICAgLndoZW5TdWJzY3JpYmluZ1RvKGh0dHBDbGllbnQuZ2V0KCdodHRwczovL2FwaS9leHBvcnQpKVxuICAgICAqICAgIC52ZXJpZnkoKTtcbiAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQuXG4gICAgICogQHJldHVybnMgQW4gSHR0cENhbGxUZXN0ZXIgaW5zdGFuY2UgcmVhZHkgdG8gdmVyaWZ5IHRoZSBjYWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZXhwZWN0T25lRmlsZURvd25sb2FkRnJvbVVybDxUU3RyZWFtUmVzdWx0ID0gRmlsZURvd25sb2FkPihcbiAgICAgICAgdXJsOiBzdHJpbmdcbiAgICApOiBIdHRwQ2FsbFRlc3RlcjxGaWxlRG93bmxvYWQsIFRTdHJlYW1SZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgZmlsZURvd25sb2FkOiBGaWxlRG93bmxvYWQgPSB7XG4gICAgICAgICAgICBibG9iOiBuZXcgQmxvYigpLFxuICAgICAgICAgICAgZmlsZU5hbWU6ICd0ZXN0RmlsZS50eHQnXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEh0dHBDYWxsVGVzdGVyPEZpbGVEb3dubG9hZCwgVFN0cmVhbVJlc3VsdD4odXJsKVxuICAgICAgICAgICAgLndpdGhSZXNwb25zZShmaWxlRG93bmxvYWQpXG4gICAgICAgICAgICAuZXhwZWN0U3RyZWFtUmVzdWx0VG8oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmlsZURvd25sb2FkIGFzIHVua25vd24gYXMgVFN0cmVhbVJlc3VsdClcbiAgICAgICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqIFNldCB0aGUgc3RyZWFtIHRoYXQgd2lsbCBiZSBzdWJzY3JpYmVkIHRvIGluIHRoZSB2ZXJpZnkgZnVuY3Rpb24uIFRoZSBzdHJlYW0gc2hvdWxkIGhhdmUgYW4gSFRUUCBjYWxsIGFzIGNvbnNlcXVlbmNlLiAqL1xuICAgIHB1YmxpYyB3aGVuU3Vic2NyaWJpbmdUbyhzdHJlYW0kOiBPYnNlcnZhYmxlPFRTdHJlYW1SZXN1bHQ+KTogSHR0cENhbGxUZXN0ZXI8VFJlcXVlc3RSZXNwb25zZSwgVFN0cmVhbVJlc3VsdD4ge1xuICAgICAgICB0aGlzLnN0cmVhbSQgPSBzdHJlYW0kXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogU2V0IGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSB2ZXJpZnkgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciB0aGUgcmVxdWVzdCBtYXRjaGVzIGNlcnRhaW4gY29uZGl0aW9ucy4gKi9cbiAgICBwdWJsaWMgZXhwZWN0UmVxdWVzdFRvKFxuICAgICAgICBleHBlY3RSZXF1ZXN0Rm46IChyZXF1ZXN0OiBUZXN0UmVxdWVzdCkgPT4gdm9pZFxuICAgICk6IEh0dHBDYWxsVGVzdGVyPFRSZXF1ZXN0UmVzcG9uc2UsIFRTdHJlYW1SZXN1bHQ+IHtcbiAgICAgICAgdGhpcy5leHBlY3RSZXF1ZXN0Rm4gPSBleHBlY3RSZXF1ZXN0Rm5cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBTZXQgdGhlIHJlc3BvbnNlIHRoYXQgd2lsbCBiZSBzZW50IGJ5IHRoZSBIdHRwVGVzdGluZ0NvbnRyb2xsZXIgd2hlbiBmbHVzaGluZyB0aGUgcmVxdWVzdC4gKi9cbiAgICBwdWJsaWMgd2l0aFJlc3BvbnNlKFxuICAgICAgICBtb2NrZWRSZXNwb25zZTogVFJlcXVlc3RSZXNwb25zZSxcbiAgICAgICAgcmVzcG9uc2VPcHRpb25zPzogUmVzcG9uc2VPcHRpb25zXG4gICAgKTogSHR0cENhbGxUZXN0ZXI8VFJlcXVlc3RSZXNwb25zZSwgVFN0cmVhbVJlc3VsdD4ge1xuICAgICAgICB0aGlzLm1vY2tlZFJlc3BvbnNlID0gbW9ja2VkUmVzcG9uc2VcbiAgICAgICAgdGhpcy5yZXNwb25zZU9wdGlvbnMgPSByZXNwb25zZU9wdGlvbnNcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBTZXQgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHZlcmlmeSBmdW5jdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBzdHJlYW0gcmVzdWx0IG1hdGNoZXMgY2VydGFpbiBjb25kaXRpb25zLiAqL1xuICAgIHB1YmxpYyBleHBlY3RTdHJlYW1SZXN1bHRUbyhcbiAgICAgICAgZXhwZWN0U3RyZWFtUmVzdWx0Rm46IChyZXN1bHQ6IFRTdHJlYW1SZXN1bHQpID0+IHZvaWRcbiAgICApOiBIdHRwQ2FsbFRlc3RlcjxUUmVxdWVzdFJlc3BvbnNlLCBUU3RyZWFtUmVzdWx0PiB7XG4gICAgICAgIHRoaXMuZXhwZWN0U3RyZWFtUmVzdWx0Rm4gPSBleHBlY3RTdHJlYW1SZXN1bHRGblxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqIFNldCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgdmVyaWZ5IGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGVycm9yIG1hdGNoZXMgY2VydGFpbiBjb25kaXRpb25zLiAqL1xuICAgIHB1YmxpYyBleHBlY3RFcnJvclRvKGV4cGVjdEVycm9yRm46IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCk6IEh0dHBDYWxsVGVzdGVyPFRSZXF1ZXN0UmVzcG9uc2UsIFRTdHJlYW1SZXN1bHQ+IHtcbiAgICAgICAgdGhpcy5leHBlY3RFcnJvckZuID0gZXhwZWN0RXJyb3JGblxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgaWYgYW4gSFRUUCBjYWxsIGlzIG1hZGUgc3VjY2Vzc2Z1bGx5IGFuZCB0cmlnZ2VycyB0aGUgdmVyaWZpY2F0aW9uIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBzZXQuXG4gICAgICogQWxzbyBjaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gc3RyZWFtIG9ubHkgZW1pdHMgb25jZS5cbiAgICAgKiBIYW5kbGVzIGNsZWFudXAgdG8gcHJldmVudCBhbnkgbWVtb3J5IGxlYWtzIGR1cmluZyB0aGUgcHJvY2Vzcy5cbiAgICAgKiBAdGhyb3dzIFRocm93cyBhIENvbmRpdGlvblZpb2xhdGlvbiBpZiBubyBzdHJlYW0gaGFzIGJlZW4gc2V0LlxuICAgICAqIEB0aHJvd3MgVGhyb3dzIGEgQ29uZGl0aW9uVmlvbGF0aW9uIGlmIG5vIG1vY2tlZCByZXF1ZXN0IHJlc3BvbnNlIGhhcyBiZWVuIHNldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmVyaWZ5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZlcmlmeVN1YnNjcmlwdGlvbih7IGV4cGVjdGVkU3Vic2NyaXB0aW9uSGl0czogMSwgZXhwZWN0ZWRGYWlsdXJlSGl0czogMCB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIGlmIGFuIEhUVFAgY2FsbCBpcyBtYWRlIHVuc3VjY2Vzc2Z1bGx5IGFuZCB0cmlnZ2VycyB0aGUgdmVyaWZpY2F0aW9uIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBzZXQuXG4gICAgICogQWxzbyBjaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gc3RyZWFtIG9ubHkgZmFpbHMgb25jZS5cbiAgICAgKiBIYW5kbGVzIGNsZWFudXAgdG8gcHJldmVudCBhbnkgbWVtb3J5IGxlYWtzIGR1cmluZyB0aGUgcHJvY2Vzcy5cbiAgICAgKiBAdGhyb3dzIFRocm93cyBhIENvbmRpdGlvblZpb2xhdGlvbiBpZiBubyBzdHJlYW0gaGFzIGJlZW4gc2V0LlxuICAgICAqIEB0aHJvd3MgVGhyb3dzIGEgQ29uZGl0aW9uVmlvbGF0aW9uIGlmIG5vIG1vY2tlZCByZXF1ZXN0IHJlc3BvbnNlIGhhcyBiZWVuIHNldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmVyaWZ5RmFpbHVyZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52ZXJpZnlTdWJzY3JpcHRpb24oe1xuICAgICAgICAgICAgZXhwZWN0ZWRTdWJzY3JpcHRpb25IaXRzOiAwLFxuICAgICAgICAgICAgZXhwZWN0ZWRGYWlsdXJlSGl0czogMVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgdmVyaWZ5U3Vic2NyaXB0aW9uKHtcbiAgICAgICAgZXhwZWN0ZWRTdWJzY3JpcHRpb25IaXRzLFxuICAgICAgICBleHBlY3RlZEZhaWx1cmVIaXRzXG4gICAgfToge1xuICAgICAgICBleHBlY3RlZFN1YnNjcmlwdGlvbkhpdHM6IG51bWJlclxuICAgICAgICBleHBlY3RlZEZhaWx1cmVIaXRzOiBudW1iZXJcbiAgICB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0cmVhbSQgPSBub3RVbmRlZmluZWQodGhpcy5zdHJlYW0kKVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG5vdFVuZGVmaW5lZCh0aGlzLm1vY2tlZFJlc3BvbnNlKVxuXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25IaXRzID0gMFxuICAgICAgICBsZXQgZmFpbHVyZUhpdHMgPSAwXG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN0cmVhbSQuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChyZXN1bHQ6IFRTdHJlYW1SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdFN0cmVhbVJlc3VsdEZuKHJlc3VsdClcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25IaXRzKytcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RFcnJvckZuKGVycm9yKVxuICAgICAgICAgICAgICAgIGZhaWx1cmVIaXRzKytcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBleHBlY3RPbmVDYWxsVG9VcmwodGhpcy51cmwsIHJlc3BvbnNlLCB0aGlzLmV4cGVjdFJlcXVlc3RGbiwgdGhpcy5yZXNwb25zZU9wdGlvbnMpXG5cbiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgZXhwZWN0KHN1YnNjcmlwdGlvbkhpdHMpXG4gICAgICAgICAgICAud2l0aENvbnRleHQoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkICR7ZXhwZWN0ZWRTdWJzY3JpcHRpb25IaXRzfSBzdWNjZXNzZnVsIGh0dHAgc3RyZWFtIHJlc3VsdHMgYnV0IGdvdCAke3N1YnNjcmlwdGlvbkhpdHN9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnRvRXF1YWwoZXhwZWN0ZWRTdWJzY3JpcHRpb25IaXRzKVxuICAgICAgICBleHBlY3QoZmFpbHVyZUhpdHMpXG4gICAgICAgICAgICAud2l0aENvbnRleHQoYEV4cGVjdGVkICR7ZXhwZWN0ZWRGYWlsdXJlSGl0c30gZmFpbGVkIGh0dHAgc3RyZWFtIHJlc3VsdHMgYnV0IGdvdCAke2ZhaWx1cmVIaXRzfWApXG4gICAgICAgICAgICAudG9FcXVhbChleHBlY3RlZEZhaWx1cmVIaXRzKVxuICAgIH1cbn1cbiJdfQ==

@@ -51,4 +51,2 @@ import { notUndefined } from '@ppwcode/js-ts-oddsandends/lib/conditional-assert';

* .verify();
*
* // No further expectations necessary.
* });

@@ -147,3 +145,3 @@ */

verify() {
this.verifySubscription(1, 0);
this.verifySubscription({ expectedSubscriptionHits: 1, expectedFailureHits: 0 });
}

@@ -158,5 +156,8 @@ /**

verifyFailure() {
this.verifySubscription(0, 1);
this.verifySubscription({
expectedSubscriptionHits: 0,
expectedFailureHits: 1
});
}
verifySubscription(expectedSubscriptionHits, expectedFailureHits) {
verifySubscription({ expectedSubscriptionHits, expectedFailureHits }) {
const stream$ = notUndefined(this.stream$);

@@ -166,13 +167,20 @@ const response = notUndefined(this.mockedResponse);

let failureHits = 0;
const subscription = stream$.subscribe((result) => {
this.expectStreamResultFn(result);
subscriptionHits++;
}, (error) => {
this.expectErrorFn(error);
failureHits++;
const subscription = stream$.subscribe({
next: (result) => {
this.expectStreamResultFn(result);
subscriptionHits++;
},
error: (error) => {
this.expectErrorFn(error);
failureHits++;
}
});
expectOneCallToUrl(this.url, response, this.expectRequestFn, this.responseOptions);
subscription.unsubscribe();
expect(subscriptionHits).toEqual(expectedSubscriptionHits);
expect(failureHits).toEqual(expectedFailureHits);
expect(subscriptionHits)
.withContext(`Expected ${expectedSubscriptionHits} successful http stream results but got ${subscriptionHits}`)
.toEqual(expectedSubscriptionHits);
expect(failureHits)
.withContext(`Expected ${expectedFailureHits} failed http stream results but got ${failureHits}`)
.toEqual(expectedFailureHits);
}

@@ -179,0 +187,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"ppwcode-ng-unit-testing.mjs","sources":["../../../../projects/ppwcode/ng-unit-testing/src/lib/constants.ts","../../../../projects/ppwcode/ng-unit-testing/src/lib/http/http-client-testing-controller.ts","../../../../projects/ppwcode/ng-unit-testing/src/lib/http/http-call-tester.ts","../../../../projects/ppwcode/ng-unit-testing/src/lib/http/throw-error-response.ts","../../../../projects/ppwcode/ng-unit-testing/src/public-api.ts","../../../../projects/ppwcode/ng-unit-testing/src/ppwcode-ng-unit-testing.ts"],"sourcesContent":["export const ERROR_MESSAGE = 'Error message only used during testing.'\n","import { HttpHeaders } from '@angular/common/http'\nimport { HttpTestingController, TestRequest } from '@angular/common/http/testing'\nimport { TestBed } from '@angular/core/testing'\n\n/**\n * Function that leverages the HttpTestingController to verify that a url is called once. When the request\n * is flushed, the passed `mockedResponse` value will be set as the request response value.\n *\n * If you want to do some checks, pass a `requestExpectations` function that will be called before flushing\n * the request with the response.\n * @param url The url that is expected to be called once.\n * @param mockedResponse The response that should be sent when flushing the request.\n * @param requestExpectations A function taking the request instance to allow verifying the request.\n * @param responseOptions Optionally specify extra options for the response like status code.\n */\nexport const expectOneCallToUrl = <TResponse>(\n url: string,\n mockedResponse: TResponse,\n requestExpectations?: (request: TestRequest) => void,\n responseOptions?: ResponseOptions\n): void => {\n const httpTestingController = TestBed.inject(HttpTestingController)\n\n const request = httpTestingController.expectOne(url)\n\n requestExpectations?.(request)\n\n request.flush(\n mockedResponse as\n | string\n | number\n | boolean\n | NonNullable<unknown>\n | ArrayBuffer\n | Blob\n | Array<string | number | boolean | NonNullable<unknown> | null>\n | null,\n responseOptions\n )\n}\n\n/**\n * Verifies on the HttpTestingController that there are no outstanding requests left.\n */\nexport const expectNoOutstandingRequests = (): void => {\n const httpTestingController = TestBed.inject(HttpTestingController)\n httpTestingController.verify()\n}\n\nexport interface ResponseOptions {\n headers?:\n | HttpHeaders\n | {\n [name: string]: string | Array<string>\n }\n status?: number\n statusText?: string\n}\n","import { TestRequest } from '@angular/common/http/testing'\nimport { notUndefined } from '@ppwcode/js-ts-oddsandends/lib/conditional-assert'\nimport { noop, Observable } from 'rxjs'\n\nimport { expectOneCallToUrl, ResponseOptions } from './http-client-testing-controller'\nimport { FileDownload } from '@ppwcode/ng-async'\n\n/**\n * This class can be used in testing to leverage the HttpTestingController for HTTP call testing.\n *\n * @example\n * it('should verify the call to /api', () => {\n * const response: Array<string> = [];\n *\n * HttpCallTester.expectOneCallToUrl('/api')\n * .whenSubscribingTo(httpClient.get('/api'))\n * .checkRequest((testRequest) => { // Optional\n * expect(testRequest.request.url).toEqual('/api');\n * })\n * .withResponse(response)\n * .checkResult((result) => { // Optional\n * expect(result).toBe(response);\n * })\n * .verify();\n *\n * // No further expectations necessary.\n * });\n */\nexport class HttpCallTester<TRequestResponse, TStreamResult> {\n /** The stream that will be subscribed to in the verify function. */\n private stream$?: Observable<TStreamResult>\n\n /** The request response that should be returned when a request is received on the url. */\n private mockedResponse?: TRequestResponse\n\n /** The options to further configure the response. */\n private responseOptions?: ResponseOptions\n\n /** Verification function executed during the verify function to allow developers to set expectations on the request. */\n private expectRequestFn: (request: TestRequest) => void = noop\n\n /** Verification function executed during the verify function to allow developers to set expectations on the result of the stream. */\n private expectStreamResultFn: (result: TStreamResult) => void = noop\n\n /** Verification function executed during the verify function to allow developers to set expectations on the error that is thrown. */\n private expectErrorFn: (error: unknown) => void = noop\n\n constructor(private readonly url: string) {}\n\n /** Creates a new instance of HttpCallTester that can be chained to verify an HTTP call. */\n public static expectOneCallToUrl<TRequestResponse, TStreamResult>(\n url: string\n ): HttpCallTester<TRequestResponse, TStreamResult> {\n return new HttpCallTester<TRequestResponse, TStreamResult>(url)\n }\n\n /**\n * Creates a new instance of HttpCallTester that has been set up to check the retrieval of a Blob.\n * It has been set up with an empty blob as the response result and expects that the stream result is the same blob.\n *\n * The expectation of the stream result can simply be overridden by calling `.expectStreamResultTo` again.\n *\n * @example\n * HttpCallTester.expectOneBlobFrom('https://api/export')\n * .whenSubscribingTo(httpClient.get('https://api/export))\n * .verify();\n * @param url The url that is expected to be called.\n * @returns An HttpCallTester instance ready to verify the call.\n */\n public static expectOneBlobFromUrl<TStreamResult = Blob>(url: string): HttpCallTester<Blob, TStreamResult> {\n const blob = new Blob()\n\n return new HttpCallTester<Blob, TStreamResult>(url).withResponse(blob).expectStreamResultTo((result) => {\n expect(result).toBe(blob as unknown as TStreamResult)\n })\n }\n\n /**\n * Creates a new instance of HttpCallTester that has been set up to check the retrieval of a Blob.\n * It has been set up with an empty blob as the response result and expects that the stream result is the same blob.\n *\n * The expectation of the stream result can simply be overridden by calling `.expectStreamResultTo` again.\n *\n * @example\n * HttpCallTester.expectOneBlobFrom('https://api/export')\n * .whenSubscribingTo(httpClient.get('https://api/export))\n * .verify();\n * @param url The url that is expected to be called.\n * @returns An HttpCallTester instance ready to verify the call.\n */\n public static expectOneFileDownloadFromUrl<TStreamResult = FileDownload>(\n url: string\n ): HttpCallTester<FileDownload, TStreamResult> {\n const fileDownload: FileDownload = {\n blob: new Blob(),\n fileName: 'testFile.txt'\n }\n\n return new HttpCallTester<FileDownload, TStreamResult>(url)\n .withResponse(fileDownload)\n .expectStreamResultTo((result) => {\n expect(result).toBe(fileDownload as unknown as TStreamResult)\n })\n }\n\n /** Set the stream that will be subscribed to in the verify function. The stream should have an HTTP call as consequence. */\n public whenSubscribingTo(stream$: Observable<TStreamResult>): HttpCallTester<TRequestResponse, TStreamResult> {\n this.stream$ = stream$\n\n return this\n }\n\n /** Set a function that will be executed in the verify function to check whether the request matches certain conditions. */\n public expectRequestTo(\n expectRequestFn: (request: TestRequest) => void\n ): HttpCallTester<TRequestResponse, TStreamResult> {\n this.expectRequestFn = expectRequestFn\n\n return this\n }\n\n /** Set the response that will be sent by the HttpTestingController when flushing the request. */\n public withResponse(\n mockedResponse: TRequestResponse,\n responseOptions?: ResponseOptions\n ): HttpCallTester<TRequestResponse, TStreamResult> {\n this.mockedResponse = mockedResponse\n this.responseOptions = responseOptions\n\n return this\n }\n\n /** Set a function that will be executed in the verify function to check whether the stream result matches certain conditions. */\n public expectStreamResultTo(\n expectStreamResultFn: (result: TStreamResult) => void\n ): HttpCallTester<TRequestResponse, TStreamResult> {\n this.expectStreamResultFn = expectStreamResultFn\n\n return this\n }\n\n /** Set a function that will be executed in the verify function to check whether the error matches certain conditions. */\n public expectErrorTo(expectErrorFn: (error: unknown) => void): HttpCallTester<TRequestResponse, TStreamResult> {\n this.expectErrorFn = expectErrorFn\n\n return this\n }\n\n /**\n * Verifies if an HTTP call is made successfully and triggers the verification functions that have been set.\n * Also checks whether the given stream only emits once.\n * Handles cleanup to prevent any memory leaks during the process.\n * @throws Throws a ConditionViolation if no stream has been set.\n * @throws Throws a ConditionViolation if no mocked request response has been set.\n */\n public verify(): void {\n this.verifySubscription(1, 0)\n }\n\n /**\n * Verifies if an HTTP call is made unsuccessfully and triggers the verification functions that have been set.\n * Also checks whether the given stream only fails once.\n * Handles cleanup to prevent any memory leaks during the process.\n * @throws Throws a ConditionViolation if no stream has been set.\n * @throws Throws a ConditionViolation if no mocked request response has been set.\n */\n public verifyFailure(): void {\n this.verifySubscription(0, 1)\n }\n\n private verifySubscription(expectedSubscriptionHits: number, expectedFailureHits: number): void {\n const stream$ = notUndefined(this.stream$)\n const response = notUndefined(this.mockedResponse)\n\n let subscriptionHits = 0\n let failureHits = 0\n const subscription = stream$.subscribe(\n (result: TStreamResult) => {\n this.expectStreamResultFn(result)\n subscriptionHits++\n },\n (error: unknown) => {\n this.expectErrorFn(error)\n failureHits++\n }\n )\n\n expectOneCallToUrl(this.url, response, this.expectRequestFn, this.responseOptions)\n\n subscription.unsubscribe()\n expect(subscriptionHits).toEqual(expectedSubscriptionHits)\n expect(failureHits).toEqual(expectedFailureHits)\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http'\nimport { Observable, throwError } from 'rxjs'\n\nexport const throwHttpErrorResponse = (statusCode: number): Observable<never> =>\n throwError(\n () =>\n new HttpErrorResponse({\n error: `Error ${statusCode}`,\n status: statusCode\n })\n )\n","/*\n * Public API Surface of ng-unit-testing\n */\n\nexport * from './lib/constants'\nexport * from './lib/http/http-call-tester'\nexport * from './lib/http/http-client-testing-controller'\nexport * from './lib/http/throw-error-response'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
{"version":3,"file":"ppwcode-ng-unit-testing.mjs","sources":["../../../../projects/ppwcode/ng-unit-testing/src/lib/constants.ts","../../../../projects/ppwcode/ng-unit-testing/src/lib/http/http-client-testing-controller.ts","../../../../projects/ppwcode/ng-unit-testing/src/lib/http/http-call-tester.ts","../../../../projects/ppwcode/ng-unit-testing/src/lib/http/throw-error-response.ts","../../../../projects/ppwcode/ng-unit-testing/src/public-api.ts","../../../../projects/ppwcode/ng-unit-testing/src/ppwcode-ng-unit-testing.ts"],"sourcesContent":["export const ERROR_MESSAGE = 'Error message only used during testing.'\n","import { HttpHeaders } from '@angular/common/http'\nimport { HttpTestingController, TestRequest } from '@angular/common/http/testing'\nimport { TestBed } from '@angular/core/testing'\n\n/**\n * Function that leverages the HttpTestingController to verify that a url is called once. When the request\n * is flushed, the passed `mockedResponse` value will be set as the request response value.\n *\n * If you want to do some checks, pass a `requestExpectations` function that will be called before flushing\n * the request with the response.\n * @param url The url that is expected to be called once.\n * @param mockedResponse The response that should be sent when flushing the request.\n * @param requestExpectations A function taking the request instance to allow verifying the request.\n * @param responseOptions Optionally specify extra options for the response like status code.\n */\nexport const expectOneCallToUrl = <TResponse>(\n url: string,\n mockedResponse: TResponse,\n requestExpectations?: (request: TestRequest) => void,\n responseOptions?: ResponseOptions\n): void => {\n const httpTestingController = TestBed.inject(HttpTestingController)\n\n const request = httpTestingController.expectOne(url)\n\n requestExpectations?.(request)\n\n request.flush(\n mockedResponse as\n | string\n | number\n | boolean\n | NonNullable<unknown>\n | ArrayBuffer\n | Blob\n | Array<string | number | boolean | NonNullable<unknown> | null>\n | null,\n responseOptions\n )\n}\n\n/**\n * Verifies on the HttpTestingController that there are no outstanding requests left.\n */\nexport const expectNoOutstandingRequests = (): void => {\n const httpTestingController = TestBed.inject(HttpTestingController)\n httpTestingController.verify()\n}\n\nexport interface ResponseOptions {\n headers?:\n | HttpHeaders\n | {\n [name: string]: string | Array<string>\n }\n status?: number\n statusText?: string\n}\n","import { TestRequest } from '@angular/common/http/testing'\nimport { notUndefined } from '@ppwcode/js-ts-oddsandends/lib/conditional-assert'\nimport { FileDownload } from '@ppwcode/ng-async'\nimport { noop, Observable } from 'rxjs'\n\nimport { expectOneCallToUrl, ResponseOptions } from './http-client-testing-controller'\n\n/**\n * This class can be used in testing to leverage the HttpTestingController for HTTP call testing.\n *\n * @example\n * it('should verify the call to /api', () => {\n * const response: Array<string> = [];\n *\n * HttpCallTester.expectOneCallToUrl('/api')\n * .whenSubscribingTo(httpClient.get('/api'))\n * .checkRequest((testRequest) => { // Optional\n * expect(testRequest.request.url).toEqual('/api');\n * })\n * .withResponse(response)\n * .checkResult((result) => { // Optional\n * expect(result).toBe(response);\n * })\n * .verify();\n * });\n */\nexport class HttpCallTester<TRequestResponse, TStreamResult> {\n /** The stream that will be subscribed to in the verify function. */\n private stream$?: Observable<TStreamResult>\n\n /** The request response that should be returned when a request is received on the url. */\n private mockedResponse?: TRequestResponse\n\n /** The options to further configure the response. */\n private responseOptions?: ResponseOptions\n\n /** Verification function executed during the verify function to allow developers to set expectations on the request. */\n private expectRequestFn: (request: TestRequest) => void = noop\n\n /** Verification function executed during the verify function to allow developers to set expectations on the result of the stream. */\n private expectStreamResultFn: (result: TStreamResult) => void = noop\n\n /** Verification function executed during the verify function to allow developers to set expectations on the error that is thrown. */\n private expectErrorFn: (error: unknown) => void = noop\n\n constructor(private readonly url: string) {}\n\n /** Creates a new instance of HttpCallTester that can be chained to verify an HTTP call. */\n public static expectOneCallToUrl<TRequestResponse, TStreamResult>(\n url: string\n ): HttpCallTester<TRequestResponse, TStreamResult> {\n return new HttpCallTester<TRequestResponse, TStreamResult>(url)\n }\n\n /**\n * Creates a new instance of HttpCallTester that has been set up to check the retrieval of a Blob.\n * It has been set up with an empty blob as the response result and expects that the stream result is the same blob.\n *\n * The expectation of the stream result can simply be overridden by calling `.expectStreamResultTo` again.\n *\n * @example\n * HttpCallTester.expectOneBlobFrom('https://api/export')\n * .whenSubscribingTo(httpClient.get('https://api/export))\n * .verify();\n * @param url The url that is expected to be called.\n * @returns An HttpCallTester instance ready to verify the call.\n */\n public static expectOneBlobFromUrl<TStreamResult = Blob>(url: string): HttpCallTester<Blob, TStreamResult> {\n const blob = new Blob()\n\n return new HttpCallTester<Blob, TStreamResult>(url).withResponse(blob).expectStreamResultTo((result) => {\n expect(result).toBe(blob as unknown as TStreamResult)\n })\n }\n\n /**\n * Creates a new instance of HttpCallTester that has been set up to check the retrieval of a Blob.\n * It has been set up with an empty blob as the response result and expects that the stream result is the same blob.\n *\n * The expectation of the stream result can simply be overridden by calling `.expectStreamResultTo` again.\n *\n * @example\n * HttpCallTester.expectOneBlobFrom('https://api/export')\n * .whenSubscribingTo(httpClient.get('https://api/export))\n * .verify();\n * @param url The url that is expected to be called.\n * @returns An HttpCallTester instance ready to verify the call.\n */\n public static expectOneFileDownloadFromUrl<TStreamResult = FileDownload>(\n url: string\n ): HttpCallTester<FileDownload, TStreamResult> {\n const fileDownload: FileDownload = {\n blob: new Blob(),\n fileName: 'testFile.txt'\n }\n\n return new HttpCallTester<FileDownload, TStreamResult>(url)\n .withResponse(fileDownload)\n .expectStreamResultTo((result) => {\n expect(result).toBe(fileDownload as unknown as TStreamResult)\n })\n }\n\n /** Set the stream that will be subscribed to in the verify function. The stream should have an HTTP call as consequence. */\n public whenSubscribingTo(stream$: Observable<TStreamResult>): HttpCallTester<TRequestResponse, TStreamResult> {\n this.stream$ = stream$\n\n return this\n }\n\n /** Set a function that will be executed in the verify function to check whether the request matches certain conditions. */\n public expectRequestTo(\n expectRequestFn: (request: TestRequest) => void\n ): HttpCallTester<TRequestResponse, TStreamResult> {\n this.expectRequestFn = expectRequestFn\n\n return this\n }\n\n /** Set the response that will be sent by the HttpTestingController when flushing the request. */\n public withResponse(\n mockedResponse: TRequestResponse,\n responseOptions?: ResponseOptions\n ): HttpCallTester<TRequestResponse, TStreamResult> {\n this.mockedResponse = mockedResponse\n this.responseOptions = responseOptions\n\n return this\n }\n\n /** Set a function that will be executed in the verify function to check whether the stream result matches certain conditions. */\n public expectStreamResultTo(\n expectStreamResultFn: (result: TStreamResult) => void\n ): HttpCallTester<TRequestResponse, TStreamResult> {\n this.expectStreamResultFn = expectStreamResultFn\n\n return this\n }\n\n /** Set a function that will be executed in the verify function to check whether the error matches certain conditions. */\n public expectErrorTo(expectErrorFn: (error: unknown) => void): HttpCallTester<TRequestResponse, TStreamResult> {\n this.expectErrorFn = expectErrorFn\n\n return this\n }\n\n /**\n * Verifies if an HTTP call is made successfully and triggers the verification functions that have been set.\n * Also checks whether the given stream only emits once.\n * Handles cleanup to prevent any memory leaks during the process.\n * @throws Throws a ConditionViolation if no stream has been set.\n * @throws Throws a ConditionViolation if no mocked request response has been set.\n */\n public verify(): void {\n this.verifySubscription({ expectedSubscriptionHits: 1, expectedFailureHits: 0 })\n }\n\n /**\n * Verifies if an HTTP call is made unsuccessfully and triggers the verification functions that have been set.\n * Also checks whether the given stream only fails once.\n * Handles cleanup to prevent any memory leaks during the process.\n * @throws Throws a ConditionViolation if no stream has been set.\n * @throws Throws a ConditionViolation if no mocked request response has been set.\n */\n public verifyFailure(): void {\n this.verifySubscription({\n expectedSubscriptionHits: 0,\n expectedFailureHits: 1\n })\n }\n\n private verifySubscription({\n expectedSubscriptionHits,\n expectedFailureHits\n }: {\n expectedSubscriptionHits: number\n expectedFailureHits: number\n }): void {\n const stream$ = notUndefined(this.stream$)\n const response = notUndefined(this.mockedResponse)\n\n let subscriptionHits = 0\n let failureHits = 0\n const subscription = stream$.subscribe({\n next: (result: TStreamResult) => {\n this.expectStreamResultFn(result)\n subscriptionHits++\n },\n error: (error: unknown) => {\n this.expectErrorFn(error)\n failureHits++\n }\n })\n\n expectOneCallToUrl(this.url, response, this.expectRequestFn, this.responseOptions)\n\n subscription.unsubscribe()\n expect(subscriptionHits)\n .withContext(\n `Expected ${expectedSubscriptionHits} successful http stream results but got ${subscriptionHits}`\n )\n .toEqual(expectedSubscriptionHits)\n expect(failureHits)\n .withContext(`Expected ${expectedFailureHits} failed http stream results but got ${failureHits}`)\n .toEqual(expectedFailureHits)\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http'\nimport { Observable, throwError } from 'rxjs'\n\nexport const throwHttpErrorResponse = (statusCode: number): Observable<never> =>\n throwError(\n () =>\n new HttpErrorResponse({\n error: `Error ${statusCode}`,\n status: statusCode\n })\n )\n","/*\n * Public API Surface of ng-unit-testing\n */\n\nexport * from './lib/constants'\nexport * from './lib/http/http-call-tester'\nexport * from './lib/http/http-client-testing-controller'\nexport * from './lib/http/throw-error-response'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
import { TestRequest } from '@angular/common/http/testing';
import { FileDownload } from '@ppwcode/ng-async';
import { Observable } from 'rxjs';
import { ResponseOptions } from './http-client-testing-controller';
import { FileDownload } from '@ppwcode/ng-async';
/**

@@ -22,4 +22,2 @@ * This class can be used in testing to leverage the HttpTestingController for HTTP call testing.

* .verify();
*
* // No further expectations necessary.
* });

@@ -26,0 +24,0 @@ */

{
"name": "@ppwcode/ng-unit-testing",
"version": "0.0.70",
"version": "0.0.71",
"peerDependencies": {

@@ -5,0 +5,0 @@ "@angular/common": "^17.0.0",