diff --git a/__tests__/service-worker.test.js b/__tests__/service-worker.test.js index d95fe70..5d65bf1 100644 --- a/__tests__/service-worker.test.js +++ b/__tests__/service-worker.test.js @@ -109,6 +109,91 @@ describe("service-worker", () => { expect(response.headers.get('X-LibResilient-ETag')).toEqual('TestingETagHeader') }); + test("failed fetch by first configured plugin should not affect a successful fetch by a second one", async () => { + self.LibResilientConfig = { + plugins: { + 'reject-all': {}, + 'resolve-all': {} + }, + loggedComponents: [ + 'service-worker' + ] + } + let rejectingFetch = jest.fn((request, init)=>{ return Promise.reject(request); }) + let resolvingFetch = jest.fn((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' + }) + ) + }) + self.LibResilientPlugins.push({ + 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 + }) + + require("../service-worker.js"); + + var response = await self.trigger('fetch', new Request('/test.json')) + expect(rejectingFetch).toHaveBeenCalled(); + expect(resolvingFetch).toHaveBeenCalled(); + expect(await response.json()).toEqual({ test: "success" }) + }); + + test("defaultPluginTimeout should be respected", async () => { + jest.useFakeTimers() + self.LibResilientConfig = { + defaultPluginTimeout: 1000, + plugins: { + 'resolve-with-timeout': {} + }, + loggedComponents: [ + '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) + }) + } + }) + + require("../service-worker.js"); + + var response = self.trigger('fetch', new Request('/test.json')) + jest.advanceTimersByTime(1000); + expect.assertions(2) + try { + await response + } catch(e) { + expect(e.toString()).toBe("Error: LibResilient request using resolve-with-timeout timed out after 1000ms.") + } + expect(rwtCallback).not.toHaveBeenCalled() + }); + test("making an external request should work and not go through the plugins", async () => { global.fetch.mockImplementation((request, init) => { return Promise.resolve( @@ -440,7 +525,7 @@ describe("service-worker", () => { } self.LibResilientPlugins.push({ name: 'resolve-all', - description: 'Reject all requests.', + description: 'Resolve all requests.', version: '0.0.1', fetch: (request, init)=>{ return Promise.resolve(