From dfd07201eb491cdb6ab1febe7d6d19ff6935458b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=27rysiek=27=20Wo=C5=BAniak?= Date: Sat, 7 Oct 2023 17:08:05 +0000 Subject: [PATCH] implemented query params normalization (ref. #27) --- .../service-worker/service-worker.test.js | 70 ++++++++++++++++++- service-worker.js | 7 ++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/__tests__/service-worker/service-worker.test.js b/__tests__/service-worker/service-worker.test.js index 696a315..8649fa9 100644 --- a/__tests__/service-worker/service-worker.test.js +++ b/__tests__/service-worker/service-worker.test.js @@ -349,6 +349,7 @@ describe('service-worker', async () => { assertEquals(self.LibResilientConfig.defaultPluginTimeout, 10000) assertEquals(self.LibResilientConfig.plugins, [{name: "fetch"},{name: "cache"}]) assertEquals(self.LibResilientConfig.loggedComponents, ['service-worker', 'fetch', 'cache']) + assertEquals(self.LibResilientConfig.normalizeQueryParams, true) assertSpyCalls(self.fetch, 1) }) @@ -367,6 +368,7 @@ describe('service-worker', async () => { assertEquals(self.LibResilientConfig.defaultPluginTimeout, 10000) assertEquals(self.LibResilientConfig.plugins, [{name: "fetch"},{name: "cache"}]) assertEquals(self.LibResilientConfig.loggedComponents, ['service-worker', 'fetch', 'cache']) + assertEquals(self.LibResilientConfig.normalizeQueryParams, true) assertSpyCalls(self.fetch, 1) }) @@ -385,6 +387,7 @@ describe('service-worker', async () => { assertEquals(self.LibResilientConfig.defaultPluginTimeout, 10000) assertEquals(self.LibResilientConfig.plugins, [{name: "fetch"},{name: "cache"}]) assertEquals(self.LibResilientConfig.loggedComponents, ['service-worker', 'fetch', 'cache']) + assertEquals(self.LibResilientConfig.normalizeQueryParams, true) assertSpyCalls(self.fetch, 1) }) @@ -403,6 +406,7 @@ describe('service-worker', async () => { assertEquals(self.LibResilientConfig.defaultPluginTimeout, 10000) assertEquals(self.LibResilientConfig.plugins, [{name: "fetch"},{name: "cache"}]) assertEquals(self.LibResilientConfig.loggedComponents, ['service-worker', 'fetch', 'cache']) + assertEquals(self.LibResilientConfig.normalizeQueryParams, true) assertSpyCalls(self.fetch, 1) }) @@ -421,12 +425,32 @@ describe('service-worker', async () => { assertEquals(self.LibResilientConfig.defaultPluginTimeout, 10000) assertEquals(self.LibResilientConfig.plugins, [{name: "fetch"},{name: "cache"}]) assertEquals(self.LibResilientConfig.loggedComponents, ['service-worker', 'fetch', 'cache']) + assertEquals(self.LibResilientConfig.normalizeQueryParams, true) + assertSpyCalls(self.fetch, 1) + }) + + it("should use default LibResilientConfig values when 'normalizeQueryParams' field in config.json contains an invalid value", async () => { + + let mock_response_data = { + data: JSON.stringify({loggedComponents: ['service-worker', 'fetch'], plugins: [{name: "fetch"}], defaultPluginTimeout: 5000, normalizeQueryParams: "not a boolean"}) + } + window.fetch = spy(window.getMockedFetch(mock_response_data)) + + await import("../../service-worker.js?" + window.test_id); + await self.dispatchEvent(new Event('install')) + await self.waitForSWInstall() + + assertEquals(typeof self.LibResilientConfig, "object") + assertEquals(self.LibResilientConfig.defaultPluginTimeout, 10000) + assertEquals(self.LibResilientConfig.plugins, [{name: "fetch"},{name: "cache"}]) + assertEquals(self.LibResilientConfig.loggedComponents, ['service-worker', 'fetch', 'cache']) + assertEquals(self.LibResilientConfig.normalizeQueryParams, true) assertSpyCalls(self.fetch, 1) }) it("should use config values from a valid fetched config.json file, caching it", async () => { let mock_response_data = { - data: JSON.stringify({loggedComponents: ['service-worker', 'cache'], plugins: [{name: "cache"}], defaultPluginTimeout: 5000}) + data: JSON.stringify({loggedComponents: ['service-worker', 'cache'], plugins: [{name: "cache"}], defaultPluginTimeout: 5000, normalizeQueryParams: false}) } window.fetch = spy(window.getMockedFetch(mock_response_data)) @@ -438,6 +462,7 @@ describe('service-worker', async () => { assertEquals(self.LibResilientConfig.defaultPluginTimeout, 5000) assertEquals(self.LibResilientConfig.plugins, [{name: "cache"}]) assertEquals(self.LibResilientConfig.loggedComponents, ['service-worker', 'cache']) + assertEquals(self.LibResilientConfig.normalizeQueryParams, false) assertSpyCalls(self.fetch, 1) // cacheConfigJSON() is called asynchronously in the Service Worker, @@ -987,6 +1012,49 @@ describe('service-worker', async () => { assertEquals(await response.json(), { test: "success" }) }); + it("should normalize query params in requested URLs by default", async () => { + + console.log(self.LibResilientConfig) + + await import("../../service-worker.js?" + window.test_id); + await self.dispatchEvent(new Event('install')) + await self.waitForSWInstall() + + let fetch_event = new FetchEvent('test.json?b=bbb&a=aaa&d=ddd&c=ccc') + window.dispatchEvent(fetch_event) + let response = await fetch_event.waitForResponse() + + assertEquals( + fetch.calls[1].args[0], + "https://test.resilient.is/test.json?a=aaa&b=bbb&c=ccc&d=ddd" + ) + }) + + it("should not normalize query params in requested URLs if 'normalizeQueryParams' is set to false", async () => { + self.LibResilientConfig = { + plugins: [{ + name: 'fetch' + }], + loggedComponents: [ + 'service-worker' + ], + normalizeQueryParams: false + } + + await import("../../service-worker.js?" + window.test_id); + await self.dispatchEvent(new Event('install')) + await self.waitForSWInstall() + + let fetch_event = new FetchEvent('test.json?b=bbb&a=aaa&d=ddd&c=ccc') + window.dispatchEvent(fetch_event) + let response = await fetch_event.waitForResponse() + + assertEquals( + fetch.calls[1].args[0], + "https://test.resilient.is/test.json?b=bbb&a=aaa&d=ddd&c=ccc" + ) + }) + it("should pass the Request() init data to plugins", async () => { self.LibResilientConfig = { plugins: [{ diff --git a/service-worker.js b/service-worker.js index 3e31368..2515de9 100644 --- a/service-worker.js +++ b/service-worker.js @@ -98,6 +98,13 @@ let verifyConfigData = (cdata) => { return false; } } + // normalizeQueryParams is optional + if ("normalizeQueryParams" in cdata) { + if (cdata.normalizeQueryParams !== true && cdata.normalizeQueryParams !=- false) { + self.log('service-worker', 'fetched config contains invalid "normalizeQueryParams" data (boolean expected)') + return false; + } + } // we're good return true; }