diff --git a/frontend/public/components/factory/__tests__/list-page.spec.tsx b/frontend/public/components/factory/__tests__/list-page.spec.tsx index 0f383c88d66..5dcf568980e 100644 --- a/frontend/public/components/factory/__tests__/list-page.spec.tsx +++ b/frontend/public/components/factory/__tests__/list-page.spec.tsx @@ -221,4 +221,58 @@ describe('MultiListPage component', () => { expect(watchConfig?.Pod?.kind).toBe('Pod'); expect(watchConfig?.Pod?.name).toBe('example-pod'); }); + + it('does not treat errors from optional resources as fatal page errors', () => { + let receivedLoadError: unknown; + const ListComponent = (props: { loadError?: unknown }) => { + receivedLoadError = props.loadError; + return
List Content
; + }; + + mockUseK8sWatchResources.mockReturnValue({ + Pod: { data: [{ kind: 'Pod' }], loaded: true, loadError: undefined }, + CatalogSource: { + data: [], + loaded: true, + loadError: 'catalogsources.operators.coreos.com is forbidden', + }, + }); + + renderWithProviders( + , + ); + + expect(screen.getByText('List Content')).toBeVisible(); + expect(receivedLoadError).toBeUndefined(); + }); + + it('treats errors from non-optional resources as fatal page errors', () => { + let receivedLoadError: unknown; + const ListComponent = (props: { loadError?: unknown }) => { + receivedLoadError = props.loadError; + return
List Content
; + }; + + const forbiddenError = 'pods is forbidden'; + mockUseK8sWatchResources.mockReturnValue({ + Pod: { data: [], loaded: true, loadError: forbiddenError }, + }); + + renderWithProviders( + , + ); + + expect(receivedLoadError).toBe(forbiddenError); + }); }); diff --git a/frontend/public/components/factory/list-page.tsx b/frontend/public/components/factory/list-page.tsx index 0050c5a1e54..e4331efdc95 100644 --- a/frontend/public/components/factory/list-page.tsx +++ b/frontend/public/components/factory/list-page.tsx @@ -604,10 +604,13 @@ export const MultiListPage: FC = (props) => { const loadError = useMemo( () => - Object.values(watchedResources).find( - (r) => r.loadError && !(r.loadError instanceof NoModelError), - )?.loadError, - [watchedResources], + Object.entries(watchedResources).find( + ([key, r]) => + r.loadError && + !(r.loadError instanceof NoModelError) && + !watchResources[key]?.optional, + )?.[1]?.loadError, + [watchedResources, watchResources], ); const reduxIDs = useMemo(