diff --git a/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/emptify_mock.ts b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/emptify_mock.ts index 580c5a9baf4048..530b78157f0df3 100644 --- a/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/emptify_mock.ts +++ b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/emptify_mock.ts @@ -36,7 +36,7 @@ export function emptifyMock( dataAccessLayer: DataAccessLayer; metadata: Metadata; }, - dataShouldBeEmpty?: EmptiableRequests | EmptiableRequests[] + dataShouldBeEmpty?: EmptiableRequests[] ): { dataAccessLayer: DataAccessLayer; metadata: Metadata; @@ -47,41 +47,42 @@ export function emptifyMock( /** * Fetch related events for an entity ID */ - async relatedEvents(entityID: string): Promise { + async relatedEvents(...args): Promise { return dataShouldBeEmpty?.includes('relatedEvents') ? Promise.resolve({ - entityID, + entityID: args[0], events: [], nextEvent: null, }) - : dataAccessLayer.relatedEvents(entityID); + : dataAccessLayer.relatedEvents(...args); }, /** * Fetch a ResolverTree for a entityID */ - async resolverTree(): Promise { + async resolverTree(...args): Promise { return dataShouldBeEmpty?.includes('resolverTree') ? Promise.resolve(mockTreeWithNoProcessEvents()) - : // @ts-ignore - ignore the argument requirement for dataAccessLayer - Promise.resolve(dataAccessLayer.resolverTree()); + : dataAccessLayer.resolverTree(...args); }, /** * Get an array of index patterns that contain events. */ - indexPatterns(): string[] { - return dataShouldBeEmpty?.includes('indexPatterns') ? [] : dataAccessLayer.indexPatterns(); + indexPatterns(...args): string[] { + return dataShouldBeEmpty?.includes('indexPatterns') + ? [] + : dataAccessLayer.indexPatterns(...args); }, /** * Get entities matching a document. */ - async entities(): Promise { + async entities(...args): Promise { return dataShouldBeEmpty?.includes('entities') ? Promise.resolve([]) : // @ts-ignore - ignore the argument requirement for dataAccessLayer - dataAccessLayer.entities(); + dataAccessLayer.entities(...args); }, }, }; diff --git a/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/pausify_mock.ts b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/pausify_mock.ts index 2d0feb241d7ef6..baddcdfd0cd841 100644 --- a/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/pausify_mock.ts +++ b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/pausify_mock.ts @@ -36,81 +36,88 @@ export function pausifyMock({ }): { dataAccessLayer: DataAccessLayer; metadata: Metadata; - pause: (pausableRequests: PausableRequests) => void; - resume: (pausableRequests: PausableRequests) => void; + pause: (pausableRequests: PausableRequests[]) => void; + resume: (pausableRequests: PausableRequests[]) => void; } { let relatedEventsPromise = Promise.resolve(); let resolverTreePromise = Promise.resolve(); let entitiesPromise = Promise.resolve(); - let relatedEventsResolver: () => void; - let resolverTreeResolver: () => void; - let entitiesResolver: () => void; + let relatedEventsResolver: (() => void) | null; + let resolverTreeResolver: (() => void) | null; + let entitiesResolver: (() => void) | null; return { metadata, - pause: (pausableRequests: PausableRequests | PausableRequests[]) => { + pause: (pausableRequests: PausableRequests[]) => { const pauseRelatedEventsRequest = pausableRequests.includes('relatedEvents'); const pauseResolverTreeRequest = pausableRequests.includes('resolverTree'); const pauseEntitiesRequest = pausableRequests.includes('entities'); - if (pauseRelatedEventsRequest) { + if (pauseRelatedEventsRequest && !relatedEventsResolver) { relatedEventsPromise = new Promise((resolve) => { relatedEventsResolver = resolve; }); } - if (pauseResolverTreeRequest) { + if (pauseResolverTreeRequest && !resolverTreeResolver) { resolverTreePromise = new Promise((resolve) => { resolverTreeResolver = resolve; }); } - if (pauseEntitiesRequest) { + if (pauseEntitiesRequest && !entitiesResolver) { entitiesPromise = new Promise((resolve) => { entitiesResolver = resolve; }); } }, - resume: (pausableRequests: PausableRequests | PausableRequests[]) => { + resume: (pausableRequests: PausableRequests[]) => { const resumeEntitiesRequest = pausableRequests.includes('entities'); const resumeResolverTreeRequest = pausableRequests.includes('resolverTree'); const resumeRelatedEventsRequest = pausableRequests.includes('relatedEvents'); - if (resumeEntitiesRequest && entitiesResolver) entitiesResolver(); - if (resumeResolverTreeRequest && resolverTreeResolver) resolverTreeResolver(); - if (resumeRelatedEventsRequest && relatedEventsResolver) relatedEventsResolver(); + if (resumeEntitiesRequest && entitiesResolver) { + entitiesResolver(); + entitiesResolver = null; + } + if (resumeResolverTreeRequest && resolverTreeResolver) { + resolverTreeResolver(); + resolverTreeResolver = null; + } + if (resumeRelatedEventsRequest && relatedEventsResolver) { + relatedEventsResolver(); + relatedEventsResolver = null; + } }, dataAccessLayer: { /** * Fetch related events for an entity ID */ - async relatedEvents(entityID: string): Promise { + async relatedEvents(...args): Promise { await relatedEventsPromise; - return dataAccessLayer.relatedEvents(entityID); + return dataAccessLayer.relatedEvents(...args); }, /** * Fetch a ResolverTree for a entityID */ - async resolverTree(): Promise { + async resolverTree(...args): Promise { await resolverTreePromise; - // @ts-ignore - ignore the argument requirement for dataAccessLayer - return dataAccessLayer.resolverTree(); + return dataAccessLayer.resolverTree(...args); }, /** * Get an array of index patterns that contain events. */ - indexPatterns(): string[] { - return dataAccessLayer.indexPatterns(); + indexPatterns(...args): string[] { + return dataAccessLayer.indexPatterns(...args); }, /** * Get entities matching a document. */ - async entities(): Promise { + async entities(...args): Promise { await entitiesPromise; - // @ts-ignore - ignore the argument requirement for dataAccessLayer - return dataAccessLayer.entities(); + return dataAccessLayer.entities(...args); }, }, }; diff --git a/x-pack/plugins/security_solution/public/resolver/view/resolver_loading_state.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/resolver_loading_state.test.tsx index 03d293302175ce..c357ee18acfebd 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/resolver_loading_state.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/resolver_loading_state.test.tsx @@ -21,7 +21,7 @@ describe('Resolver: data loading and resolution states', () => { dataAccessLayer, pause, } = pausifyMock(noAncestorsTwoChildren()); - pause('entities'); + pause(['entities']); simulator = new Simulator({ dataAccessLayer, databaseDocumentID, @@ -51,7 +51,7 @@ describe('Resolver: data loading and resolution states', () => { dataAccessLayer, pause, } = pausifyMock(noAncestorsTwoChildren()); - pause('resolverTree'); + pause(['resolverTree']); simulator = new Simulator({ dataAccessLayer, databaseDocumentID, @@ -60,8 +60,6 @@ describe('Resolver: data loading and resolution states', () => { }); it('should display a loading state', async () => { - // Trigger a loading state by requesting data based on a new DocumentID. - // There really is no way to do this in the view besides changing the url, so triggering the action instead await expect( simulator.map(() => ({ resolverGraphLoading: simulator.testSubject('resolver:graph:loading').length, @@ -81,7 +79,7 @@ describe('Resolver: data loading and resolution states', () => { const { metadata: { databaseDocumentID }, dataAccessLayer, - } = emptifyMock(noAncestorsTwoChildren(), 'entities'); + } = emptifyMock(noAncestorsTwoChildren(), ['entities']); simulator = new Simulator({ dataAccessLayer, @@ -110,7 +108,7 @@ describe('Resolver: data loading and resolution states', () => { const { metadata: { databaseDocumentID }, dataAccessLayer, - } = emptifyMock(noAncestorsTwoChildren(), 'resolverTree'); + } = emptifyMock(noAncestorsTwoChildren(), ['resolverTree']); simulator = new Simulator({ dataAccessLayer,