eeadeef664
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.
53 lines
2.5 KiB
TypeScript
53 lines
2.5 KiB
TypeScript
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})
|
|
})
|