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 {children} } 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}) })