From e4db403d62d6751c8e6216df546fc63ee5f88525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=27rysiek=27=20Wo=C5=BAniak?= Date: Wed, 13 Mar 2024 02:48:29 +0000 Subject: [PATCH] additional tests for handling errors/rejections in plugins (ref. #36) --- .../service-worker/service-worker.test.js | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/__tests__/service-worker/service-worker.test.js b/__tests__/service-worker/service-worker.test.js index 5a1d814..8aa341a 100644 --- a/__tests__/service-worker/service-worker.test.js +++ b/__tests__/service-worker/service-worker.test.js @@ -2882,4 +2882,110 @@ describe('service-worker', async () => { assertEquals(await response.json(), { test: "success" }) }) + + it("should return a 404 Not Found HTTP response object when handling a failed navigation request", async () => { + window.LibResilientConfig = { + plugins: [{ + name: 'reject-all' + }], + loggedComponents: [ + 'service-worker' + ] + } + + let rejectingFetch = spy( + (request, init)=>{ return Promise.reject('reject-all rejecting a request for: ' + request); } + ) + + window.LibResilientPluginConstructors.set('reject-all', ()=>{ + return { + name: 'reject-all', + description: 'Reject all requests.', + version: '0.0.1', + fetch: rejectingFetch + } + }) + + await import("../../service-worker.js?" + window.test_id); + await self.dispatchEvent(new Event('install')) + await self.waitForSWInstall() + + let fetch_event = new FetchEvent(window.location.origin + 'test.json', {mode: "navigate"}) + window.dispatchEvent(fetch_event) + let response = await fetch_event.waitForResponse() + + assertEquals(response.status, 404) + assertEquals(response.statusText, 'Not Found') + assertEquals(response.headers.get('content-type'), 'text/html') + assertEquals((await response.text()).slice(0, 57), 'Loading failed.') + }) + + it("should not return a 404 Not Found HTTP response object when handling a rejected non-navigation request", async () => { + window.LibResilientConfig = { + plugins: [{ + name: 'reject-all' + }], + loggedComponents: [ + 'service-worker' + ] + } + + let rejectingFetch = spy( + (request, init)=>{ return Promise.reject('reject-all rejecting a request for: ' + request); } + ) + + window.LibResilientPluginConstructors.set('reject-all', ()=>{ + return { + name: 'reject-all', + description: 'Reject all requests.', + version: '0.0.1', + fetch: rejectingFetch + } + }) + + await import("../../service-worker.js?" + window.test_id); + await self.dispatchEvent(new Event('install')) + await self.waitForSWInstall() + + let fetch_event = new FetchEvent(window.location.origin + 'test.json') + window.dispatchEvent(fetch_event) + assertRejects(async ()=>{ await fetch_event.waitForResponse() }) + }) + + it("should not return a 404 Not Found HTTP response object when handling a non-navigation request that throws an error", async () => { + window.LibResilientConfig = { + plugins: [{ + name: 'error-out' + }], + loggedComponents: [ + 'service-worker' + ] + } + + let throwingFetch = spy( + (request, init)=>{ throw new Error('error-out throwing an Error for: ' + request); } + ) + + window.LibResilientPluginConstructors.set('error-out', ()=>{ + return { + name: 'error-out', + description: 'Throws.', + version: '0.0.1', + fetch: throwingFetch + } + }) + + await import("../../service-worker.js?" + window.test_id); + await self.dispatchEvent(new Event('install')) + await self.waitForSWInstall() + + let fetch_event = new FetchEvent(window.location.origin + 'test.json') + window.dispatchEvent(fetch_event) + assertRejects(async ()=>{ + await fetch_event.waitForResponse() + }, + Error, + 'error-out throwing an Error for: https://test.resilient.is/test.json' + ) + }) })