fix(frontend): stop MSK breaking the Console Home resource count
CI / checks (pull_request) Successful in 26m59s

Console Home counted every available service through the generic resource
list, but MSK and MSK Connect are available through their own pre-SPI pages
with no adapter behind /resources, so each answered 501 and the Resources tile
read "Resource load failed". Service descriptors now say whether the generic
list serves them (listable, true when an adapter is registered), and Console
Home counts only those; the MSK cards still link to their pages.
This commit is contained in:
Zakaria
2026-10-25 10:09:35 -04:00
parent 9f1ea32183
commit eeadeef664
7 changed files with 82 additions and 7 deletions
@@ -0,0 +1,52 @@
import type {ReactNode} from 'react'
import {QueryClient, QueryClientProvider} from '@tanstack/react-query'
import {renderHook, waitFor} from '@testing-library/react'
import {beforeEach, expect, test, vi} from 'vitest'
import {useCloudConsoleHomeData} from './useCloudConsoleHomeData'
import type {CloudServiceDescriptor} from '@/types/cloud'
const api = vi.hoisted(() => ({
listClouds: vi.fn(),
listCloudServices: vi.fn(),
getCloudStatus: vi.fn(),
listCloudResources: vi.fn(),
}))
vi.mock('@/api/cloudProxyClient', () => api)
function descriptor(service: CloudServiceDescriptor['service'], route: string, listable: boolean): CloudServiceDescriptor {
return {cloud: 'aws', service, displayName: service, availability: 'available', route, iconKey: service, group: 'Storage', order: 1, listable}
}
function wrapper({children}: {children: ReactNode}) {
const client = new QueryClient({defaultOptions: {queries: {retry: false}}})
return <QueryClientProvider client={client}>{children}</QueryClientProvider>
}
beforeEach(() => {
vi.clearAllMocks()
api.listClouds.mockResolvedValue([])
api.getCloudStatus.mockResolvedValue({cloud: 'aws', adapterRegistered: true, runtime: 'reachable', endpoint: 'http://floci:4566', checkedAt: '2026-10-25T10:00:00Z', error: null})
api.listCloudServices.mockResolvedValue([
descriptor('storage', 'storage', true),
descriptor('secrets', '/secretsmanager', true),
descriptor('msk', 'msk', false),
])
api.listCloudResources.mockImplementation(async (_cloud: string, service: string) => {
if (service === 'msk') throw new Error('501 operation_not_supported')
return service === 'storage' ? [{id: 'a'}, {id: 'b'}] : [{id: 'c'}]
})
})
test('counts only services the generic list serves, so a pre-SPI page cannot fail the total', async () => {
const {result} = renderHook(() => useCloudConsoleHomeData('aws'), {wrapper})
await waitFor(() => expect(result.current.resourceCount).toBe(3))
expect(api.listCloudResources.mock.calls.map((call) => call[1]).sort()).toEqual(['secrets', 'storage'])
expect(result.current.resourceDetail).toBe('Normalized resources across available services')
expect(result.current.activeServices).toBe(3)
const msk = result.current.serviceCards.find((card) => card.id === 'msk')
expect(msk).toMatchObject({route: '/cloud-explorer/aws/msk', meta: 'open service', count: undefined})
expect(result.current.serviceCards.find((card) => card.id === 'secrets')).toMatchObject({route: '/secretsmanager', count: 1})
})