Path: blob/main/client/test/waitForResource.test.ts
1028 views
import IResourceMeta from '@secret-agent/interfaces/IResourceMeta';1import { Helpers } from '@secret-agent/testing/index';2import ICoreRequestPayload from '@secret-agent/interfaces/ICoreRequestPayload';3import ICoreResponsePayload from '@secret-agent/interfaces/ICoreResponsePayload';4import { Handler } from '../index';5import ConnectionToCore from '../connections/ConnectionToCore';67let payloadHandler: (payload: ICoreRequestPayload) => ICoreResponsePayload = () => null;8const outgoing = jest.fn(9async (payload: ICoreRequestPayload): Promise<ICoreResponsePayload> => {10const { command } = payload;11const response = payloadHandler(payload);12if (response) return response;13if (command === 'Session.create') {14return {15data: { tabId: 'tab-id', sessionId: 'session-id', sessionsDataLocation: '' },16};17}18if (command === 'Session.addEventListener') {19return {20data: { listenerId: 1 },21};22}23},24);25class Piper extends ConnectionToCore {26async internalSendRequest(payload: ICoreRequestPayload): Promise<void> {27const responsePayload = await outgoing(payload);28const response = <ICoreResponsePayload>{29responseId: payload.messageId,30...(responsePayload ?? {}),31};32this.onMessage(response);33}3435protected createConnection = () => Promise.resolve(null);36protected destroyConnection = () => Promise.resolve(null);37}3839beforeAll(() => {});4041afterEach(Helpers.afterEach);42afterAll(Helpers.afterAll);4344describe('waitForResource', () => {45it('should break after finding one resource', async () => {46payloadHandler = ({ command }: ICoreRequestPayload): ICoreResponsePayload => {47if (command === 'Tab.waitForResource') {48return { data: [{ id: 1, url: '/test.js' } as IResourceMeta] };49}50};5152const handler = new Handler(new Piper());53Helpers.needsClosing.push(handler);54const agent = await handler.createAgent();55const resources = await agent.waitForResource({ url: '/test.js' });56expect(resources).toHaveLength(1);57await agent.close();58await handler.close();59});6061it('should try more than once to get files', async () => {62let attempts = 0;63payloadHandler = ({ command }: ICoreRequestPayload): ICoreResponsePayload => {64if (command === 'Tab.waitForResource') {65attempts += 1;66if (attempts === 3) {67return { data: [{ id: 1, url: '/test2.js' } as IResourceMeta] };68}69return { data: [] };70}71};7273const handler = new Handler(new Piper());74Helpers.needsClosing.push(handler);75const agent = await handler.createAgent();76const resources = await agent.waitForResource({ url: '/test2.js' });77expect(resources).toHaveLength(1);78expect(attempts).toBe(3);7980await agent.close();81await handler.close();82});8384it('should return multiple files if many match on one round trip', async () => {85payloadHandler = ({ command }: ICoreRequestPayload): ICoreResponsePayload => {86if (command === 'Tab.waitForResource') {87return {88data: [89{ id: 1, url: '/test3.js', type: 'Xhr' } as IResourceMeta,90{ id: 2, url: '/test4.js', type: 'Xhr' } as IResourceMeta,91],92};93}94};9596const handler = new Handler(new Piper());97Helpers.needsClosing.push(handler);98const agent = await handler.createAgent();99const resources = await agent.waitForResource({ type: 'Xhr' });100expect(resources).toHaveLength(2);101102await agent.close();103await handler.close();104});105106it('should match multiple files by url', async () => {107payloadHandler = ({ command }: ICoreRequestPayload): ICoreResponsePayload => {108if (command === 'Tab.waitForResource') {109return {110data: [111{ id: 1, url: '/test3.js' } as IResourceMeta,112{ id: 2, url: '/test4.js' } as IResourceMeta,113],114};115}116};117118const handler = new Handler(new Piper());119Helpers.needsClosing.push(handler);120const agent = await handler.createAgent();121const resources = await agent.waitForResource({ url: '/test3.js' });122expect(resources).toHaveLength(2);123124await agent.close();125await handler.close();126});127128it('should allow a user to specify a match function', async () => {129payloadHandler = ({ command }: ICoreRequestPayload): ICoreResponsePayload => {130if (command === 'Tab.waitForResource') {131return {132data: [133{ id: 1, url: '/test1.js' } as IResourceMeta,134{ id: 2, url: '/test2.js' } as IResourceMeta,135{ id: 3, url: '/test3.js' } as IResourceMeta,136{ id: 4, url: '/test4.js' } as IResourceMeta,137],138};139}140};141142const handler = new Handler(new Piper());143Helpers.needsClosing.push(handler);144const agent = await handler.createAgent();145const resources = await agent.waitForResource({146filterFn(resource, done) {147if (resource.url === '/test1.js') {148done();149return true;150}151},152});153expect(resources).toHaveLength(1);154expect(resources[0].url).toBe('/test1.js');155156await agent.close();157await handler.close();158});159160it('should run multiple batches when a match function is provided', async () => {161let counter = 0;162payloadHandler = ({ command }: ICoreRequestPayload): ICoreResponsePayload => {163if (command === 'Tab.waitForResource') {164counter += 1;165if (counter === 1) {166return {167data: [168{ id: 1, url: '/test1.js' } as IResourceMeta,169{ id: 2, url: '/test2.js' } as IResourceMeta,170{ id: 3, url: '/test3.js' } as IResourceMeta,171{ id: 4, url: '/test4.js' } as IResourceMeta,172],173};174}175if (counter === 2 || counter === 3) {176return { data: [] };177}178if (counter === 4) {179return { data: [{ id: 5, url: '/test5.js' } as IResourceMeta] };180}181}182};183184const handler = new Handler(new Piper());185Helpers.needsClosing.push(handler);186const agent = await handler.createAgent();187const resources = await agent.waitForResource({188filterFn(resource, done) {189if (resource.url === '/test5.js') {190done();191}192if (resource.url === '/test2.js') {193return false;194}195return true;196},197});198expect(resources).toHaveLength(4);199200await agent.close();201await handler.close();202});203});204205206