diff --git a/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx b/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx index a5fda1bf5b..ef9b77d63f 100644 --- a/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx +++ b/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx @@ -299,6 +299,48 @@ describe('', () => { }); }); + it('does not re-fetch when backend filter params are unchanged', async () => { + const deferred = createDeferred(); + mockCatalogApi.getEntities!.mockReturnValueOnce(deferred); + + const { result } = renderHook(() => useEntityList(), { + wrapper: createWrapper({ pagination }), + }); + + act(() => { + result.current.updateFilters({ + kind: new EntityKindFilter('component', 'component'), + }); + }); + + await waitFor(() => { + expect(mockCatalogApi.getEntities).toHaveBeenCalledTimes(1); + }); + + // While first fetch is in flight, fire more updateFilters calls + // that produce the same backend filter (kind=component). + act(() => { + result.current.updateFilters({ + kind: new EntityKindFilter('component', 'Component'), + }); + }); + act(() => { + result.current.updateFilters({ + user: EntityUserFilter.all(), + }); + }); + + await act(async () => { + deferred.resolve({ items: entities }); + }); + + await waitFor(() => { + expect(result.current.backendEntities.length).toBe(2); + }); + + expect(mockCatalogApi.getEntities).toHaveBeenCalledTimes(1); + }); + it('returns an error on catalogApi failure', async () => { const { result } = renderHook(() => useEntityList(), { wrapper: createWrapper({ pagination }),