From 672be5d223a8131d34d5d99ac352728541cf8284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=27rysiek=27=20Wo=C5=BAniak?= Date: Sun, 19 Sep 2021 01:23:26 +0000 Subject: [PATCH] service-worker: tests fixed for the new plugin loader, and a test added for using multiple instances of the same plugin (ref. #15) --- __tests__/service-worker.test.js | 284 +++++++++++++++++++------------ 1 file changed, 172 insertions(+), 112 deletions(-) diff --git a/__tests__/service-worker.test.js b/__tests__/service-worker.test.js index 0b2da12..5c140f4 100644 --- a/__tests__/service-worker.test.js +++ b/__tests__/service-worker.test.js @@ -142,17 +142,21 @@ describe("service-worker", () => { }) ) }) - self.LibResilientPlugins.push({ - name: 'reject-all', - description: 'Reject all requests.', - version: '0.0.1', - fetch: rejectingFetch + global.LibResilientPluginConstructors.set('reject-all', ()=>{ + return { + name: 'reject-all', + description: 'Reject all requests.', + version: '0.0.1', + fetch: rejectingFetch + } }) - self.LibResilientPlugins.push({ - name: 'resolve-all', - description: 'Resolve all requests.', - version: '0.0.1', - fetch: resolvingFetch + global.LibResilientPluginConstructors.set('resolve-all', ()=>{ + return { + name: 'resolve-all', + description: 'Resolve all requests.', + version: '0.0.1', + fetch: resolvingFetch + } }) require("../service-worker.js"); @@ -175,15 +179,17 @@ describe("service-worker", () => { ] } let rwtCallback = jest.fn() - self.LibResilientPlugins.push({ - name: 'resolve-with-timeout', - description: 'Resolve all requests after a timeout.', - version: '0.0.1', - fetch: (request, init)=>{ - return new Promise((resolve, reject)=>{ - setTimeout(rwtCallback, 5000) - }) - } + global.LibResilientPluginConstructors.set('resolve-with-timeout', ()=>{ + return { + name: 'resolve-with-timeout', + description: 'Resolve all requests after a timeout.', + version: '0.0.1', + fetch: (request, init)=>{ + return new Promise((resolve, reject)=>{ + setTimeout(rwtCallback, 5000) + }) + } + } }) require("../service-worker.js"); @@ -226,11 +232,13 @@ describe("service-worker", () => { 'service-worker' ] } - self.LibResilientPlugins.push({ - name: 'reject-all', - description: 'Reject all requests.', - version: '0.0.1', - fetch: (request, init)=>{ return Promise.reject(request); } + global.LibResilientPluginConstructors.set('reject-all', ()=>{ + return { + name: 'reject-all', + description: 'Reject all requests.', + version: '0.0.1', + fetch: (request, init)=>{ return Promise.reject(request); } + } }) require("../service-worker.js"); var response = await self.trigger('fetch', new Request('https://example.com/test.json')) @@ -264,11 +272,13 @@ describe("service-worker", () => { 'service-worker' ] } - self.LibResilientPlugins.push({ - name: 'reject-all', - description: 'Reject all requests.', - version: '0.0.1', - fetch: (request, init)=>{ return Promise.reject(request); } + global.LibResilientPluginConstructors.set('reject-all', ()=>{ + return { + name: 'reject-all', + description: 'Reject all requests.', + version: '0.0.1', + fetch: (request, init)=>{ return Promise.reject(request); } + } }) require("../service-worker.js"); var response = await self.trigger('fetch', new Request('/test.json', {method: "POST"})) @@ -340,18 +350,22 @@ describe("service-worker", () => { let rejectingFetch = jest.fn((request, init)=>{ return Promise.reject(request); }) let stashingStash = jest.fn() - self.LibResilientPlugins.push({ - name: 'stashing-test', - description: 'Mock stashing plugin.', - version: '0.0.1', - fetch: resolvingFetch, - stash: stashingStash + global.LibResilientPluginConstructors.set('stashing-test', ()=>{ + return { + name: 'stashing-test', + description: 'Mock stashing plugin.', + version: '0.0.1', + fetch: resolvingFetch, + stash: stashingStash + } }) - self.LibResilientPlugins.push({ - name: 'reject-all', - description: 'Reject all requests.', - version: '0.0.1', - fetch: rejectingFetch + global.LibResilientPluginConstructors.set('reject-all', ()=>{ + return { + name: 'reject-all', + description: 'Reject all requests.', + version: '0.0.1', + fetch: rejectingFetch + } }) require("../service-worker.js"); @@ -414,18 +428,22 @@ describe("service-worker", () => { expect(response.headers.get('ETag')).toEqual('NewTestingETagHeader') }) - self.LibResilientPlugins.push({ - name: 'stashing-test', - description: 'Mock stashing plugin.', - version: '0.0.1', - fetch: resolvingFetch, - stash: stashingStash + global.LibResilientPluginConstructors.set('stashing-test', ()=>{ + return { + name: 'stashing-test', + description: 'Mock stashing plugin.', + version: '0.0.1', + fetch: resolvingFetch, + stash: stashingStash + } }) - self.LibResilientPlugins.push({ - name: 'resolve-all', - description: 'Resolve all requests.', - version: '0.0.1', - fetch: resolvingFetch2 + global.LibResilientPluginConstructors.set('resolve-all', ()=>{ + return { + name: 'resolve-all', + description: 'Resolve all requests.', + version: '0.0.1', + fetch: resolvingFetch2 + } }) var testClient = new Client() @@ -481,18 +499,22 @@ describe("service-worker", () => { }) let stashingStash = jest.fn() - self.LibResilientPlugins.push({ - name: 'stashing-test', - description: 'Mock stashing plugin.', - version: '0.0.1', - fetch: resolvingFetch, - stash: stashingStash + global.LibResilientPluginConstructors.set('stashing-test', ()=>{ + return { + name: 'stashing-test', + description: 'Mock stashing plugin.', + version: '0.0.1', + fetch: resolvingFetch, + stash: stashingStash + } }) - self.LibResilientPlugins.push({ - name: 'resolve-all', - description: 'Resolve all requests.', - version: '0.0.1', - fetch: resolvingFetch + global.LibResilientPluginConstructors.set('resolve-all', ()=>{ + return { + name: 'resolve-all', + description: 'Resolve all requests.', + version: '0.0.1', + fetch: resolvingFetch + } }) require("../service-worker.js"); @@ -621,12 +643,14 @@ describe("service-worker", () => { ] } var result = false - self.LibResilientPlugins.push({ - name: 'publish-test', - description: 'Publish plugin fixture.', - version: '0.0.1', - publish: (request)=>{ - result = 'publish-test success: ' + request.url + global.LibResilientPluginConstructors.set('publish-test', ()=>{ + return { + name: 'publish-test', + description: 'Publish plugin fixture.', + version: '0.0.1', + publish: (request)=>{ + result = 'publish-test success: ' + request.url + } } }) require("../service-worker.js"); @@ -655,7 +679,6 @@ describe("service-worker", () => { test("using plugins with dependencies should work", async () => { self.LibResilientConfig = { plugins: [{ - // TODO: actually implement the test? name: 'dependent-test', uses: [{ name: 'dependency1-test' @@ -667,29 +690,62 @@ describe("service-worker", () => { 'service-worker' ] } - self.LibResilientPlugins.push({ - name: 'dependent-test', - description: 'Dependent plugin fixture.', - version: '0.0.1', - uses: { - 'dependency1-test': {}, - 'dependency2-test': {} + global.LibResilientPluginConstructors.set('dependent-test', ()=>{ + return { + name: 'dependent-test', + description: 'Dependent plugin fixture.', + version: '0.0.1', + uses: [{ + name: 'dependency1-test' + },{ + name: 'dependency2-test' + }] } }) - self.LibResilientPlugins.push({ - name: 'dependency1-test', - description: 'First dependency plugin fixture.', - version: '0.0.1' + global.LibResilientPluginConstructors.set('dependency1-test', ()=>{ + return { + name: 'dependency1-test', + description: 'First dependency plugin fixture.', + version: '0.0.1' + } }) - self.LibResilientPlugins.push({ - name: 'dependency2-test', - description: 'Second dependency plugin fixture.', - version: '0.0.1' + global.LibResilientPluginConstructors.set('dependency2-test', ()=>{ + return { + name: 'dependency2-test', + description: 'Second dependency plugin fixture.', + version: '0.0.1' + } }) require("../service-worker.js"); - expect(Object.keys(self.LibResilientConfig.plugins)).toEqual(['dependent-test', 'dependency1-test', 'dependency2-test']) - expect(self.LibResilientConfig.plugins['dependency1-test'].indirect).toEqual(true) - expect(self.LibResilientConfig.plugins['dependency2-test'].indirect).toEqual(true) + expect(self.LibResilientPlugins.map(p=>p.name)).toEqual(['dependent-test']) + expect(self.LibResilientPlugins[0].uses.map(p=>p.name)).toEqual(['dependency1-test', 'dependency2-test']) + }) + + test("using multiple instances of the same plugin should work", async () => { + self.LibResilientConfig = { + plugins: [{ + name: 'plugin-test', + },{ + name: 'plugin-test', + },{ + name: 'plugin-test', + }], + loggedComponents: [ + 'service-worker' + ] + } + var pver = 0 + global.LibResilientPluginConstructors.set('plugin-test', ()=>{ + pver += 1 + return { + name: 'plugin-test', + description: 'Simple plugin stub.', + version: '0.0.' + pver + } + }) + require("../service-worker.js"); + expect(self.LibResilientPlugins.map(p=>p.name)).toEqual(['plugin-test', 'plugin-test', 'plugin-test']) + expect(self.LibResilientPlugins.map(p=>p.version)).toEqual(['0.0.1', '0.0.2', '0.0.3']) }) test("should error out if all plugins fail", async () => { @@ -701,11 +757,13 @@ describe("service-worker", () => { 'service-worker' ] } - self.LibResilientPlugins.push({ - name: 'reject-all', - description: 'Reject all requests.', - version: '0.0.1', - fetch: (request, init)=>{ return Promise.reject(request); } + global.LibResilientPluginConstructors.set('reject-all', ()=>{ + return { + name: 'reject-all', + description: 'Reject all requests.', + version: '0.0.1', + fetch: (request, init)=>{ return Promise.reject(request); } + } }) require("../service-worker.js"); expect.assertions(1) @@ -725,26 +783,28 @@ describe("service-worker", () => { 'service-worker' ] } - self.LibResilientPlugins.push({ - name: 'resolve-all', - description: 'Resolve all requests.', - version: '0.0.1', - fetch: (request, init)=>{ - return Promise.resolve( - new Response( - new Blob( - [JSON.stringify({ test: "success" })], - {type: "application/json"} - ), - { - status: 200, - statusText: "OK", - headers: { - 'ETag': 'TestingETagHeader' - }, - url: self.location.origin + '/test.json' - }) - ) + global.LibResilientPluginConstructors.set('resolve-all', ()=>{ + return { + name: 'resolve-all', + description: 'Resolve all requests.', + version: '0.0.1', + fetch: (request, init)=>{ + return Promise.resolve( + new Response( + new Blob( + [JSON.stringify({ test: "success" })], + {type: "application/json"} + ), + { + status: 200, + statusText: "OK", + headers: { + 'ETag': 'TestingETagHeader' + }, + url: self.location.origin + '/test.json' + }) + ) + } } }) var testClient = new Client()