From bfcc69d8c04cb6d86ef034e84193a96ff35cf174 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Fri, 14 Jan 2022 20:45:57 +0200 Subject: [PATCH] test(service-worker): make `MockResponse` behave more similarly to real responses (#44723) Make the `MockResponse` class used in tests behave more similarly to how real responses work by making the following improvements: - Use an empty `statusText` (`''`) when provided, instead of the default `'OK'` value. This allows better representing opaque responses. - Preserve more properties (`redirected`, `type`, `url`) when cloning a `MockResponse`. PR Close #44723 --- packages/service-worker/worker/test/happy_spec.ts | 6 ++++++ packages/service-worker/worker/testing/fetch.ts | 12 +++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/service-worker/worker/test/happy_spec.ts b/packages/service-worker/worker/test/happy_spec.ts index 9b4fb1be301..d0a337eca6b 100644 --- a/packages/service-worker/worker/test/happy_spec.ts +++ b/packages/service-worker/worker/test/happy_spec.ts @@ -362,6 +362,7 @@ describe('Driver', () => { server.assertSawRequestFor('/foo.txt'); server.assertSawRequestFor('/bar.txt'); server.assertSawRequestFor('/redirected.txt'); + server.assertSawRequestFor('/redirect-target.txt'); expect(await makeRequest(scope, '/foo.txt')).toEqual('this is foo'); expect(await makeRequest(scope, '/bar.txt')).toEqual('this is bar'); server.assertNoOtherRequests(); @@ -374,6 +375,7 @@ describe('Driver', () => { server.assertSawRequestFor('/foo.txt'); server.assertSawRequestFor('/bar.txt'); server.assertSawRequestFor('/redirected.txt'); + server.assertSawRequestFor('/redirect-target.txt'); expect(await makeRequest(scope, '/foo.txt')).toEqual('this is foo'); expect(await makeRequest(scope, '/bar.txt')).toEqual('this is bar'); server.assertNoOtherRequests(); @@ -391,6 +393,7 @@ describe('Driver', () => { server.assertSawRequestFor('/foo.txt'); server.assertSawRequestFor('/bar.txt'); server.assertSawRequestFor('/redirected.txt'); + server.assertSawRequestFor('/redirect-target.txt'); // Once initialized, cached resources are served without network requests. expect(await makeRequest(scope, '/foo.txt')).toEqual('this is foo'); @@ -411,6 +414,7 @@ describe('Driver', () => { server.assertSawRequestFor('/foo.txt'); server.assertSawRequestFor('/bar.txt'); server.assertSawRequestFor('/redirected.txt'); + server.assertSawRequestFor('/redirect-target.txt'); // Once initialized, pushed messages are handled without re-initializing. await scope.handleMessage({action: 'bar'}, 'someClient'); @@ -476,6 +480,7 @@ describe('Driver', () => { serverUpdate.assertSawRequestFor('/ngsw.json'); serverUpdate.assertSawRequestFor('/foo.txt'); serverUpdate.assertSawRequestFor('/redirected.txt'); + serverUpdate.assertSawRequestFor('/redirect-target.txt'); serverUpdate.assertNoOtherRequests(); expect(client.messages).toEqual([ @@ -577,6 +582,7 @@ describe('Driver', () => { serverUpdate.assertSawRequestFor('/ngsw.json'); serverUpdate.assertSawRequestFor('/foo.txt'); serverUpdate.assertSawRequestFor('/redirected.txt'); + serverUpdate.assertSawRequestFor('/redirect-target.txt'); serverUpdate.assertNoOtherRequests(); }); diff --git a/packages/service-worker/worker/testing/fetch.ts b/packages/service-worker/worker/testing/fetch.ts index 06a2d8c1cfc..b53187d8fd2 100644 --- a/packages/service-worker/worker/testing/fetch.ts +++ b/packages/service-worker/worker/testing/fetch.ts @@ -171,7 +171,7 @@ export class MockResponse extends MockBody implements Response { init: ResponseInit&{type?: ResponseType, redirected?: boolean, url?: string} = {}) { super(typeof body === 'string' ? body : null); this.status = (init.status !== undefined) ? init.status : 200; - this.statusText = init.statusText || 'OK'; + this.statusText = (init.statusText !== undefined) ? init.statusText : 'OK'; const headers = init.headers as {[key: string]: string}; if (headers !== undefined) { if (headers instanceof MockHeaders) { @@ -197,7 +197,13 @@ export class MockResponse extends MockBody implements Response { if (this.bodyUsed) { throw 'Body already consumed'; } - return new MockResponse( - this._body, {status: this.status, statusText: this.statusText, headers: this.headers}); + return new MockResponse(this._body, { + status: this.status, + statusText: this.statusText, + headers: this.headers, + type: this.type, + redirected: this.redirected, + url: this.url, + }); } }