import { beforeEach, describe, expect, it, vi } from 'vitest' import type { SgsMapEvents, SgsMapSDKConstructor, SgsMapSDKInstance } from '@/types/sgs-map-sdk' const loadSgsMapScript = vi.hoisted(() => vi.fn()) vi.mock('@/services/sgs/SgsMapScriptLoader', () => ({ loadSgsMapScript })) import { SgsMapService } from '@/services/sgs/SgsMapService' const createHarness = async () => { const listeners = new Map void>() const sdk = { on: vi.fn((event: keyof SgsMapEvents, listener: (payload: never) => void) => { listeners.set(event, listener) }), off: vi.fn(), getIsReady: vi.fn(() => true), changeFloor: vi.fn().mockResolvedValue({ success: true, floorId: 'L2' }), resetView: vi.fn().mockResolvedValue({ success: true }), setViewMode: vi.fn().mockResolvedValue({ success: true, mode: '2d' }), destroy: vi.fn() } as unknown as SgsMapSDKInstance const SDKConstructor = vi.fn(() => sdk) as unknown as SgsMapSDKConstructor loadSgsMapScript.mockResolvedValue(SDKConstructor) const service = new SgsMapService({ container: {} as HTMLElement, scriptUrl: '/static/sgs-map-sdk/index.global.js?v=2.4.1', sdkUrl: '/h5-sdk', targetOrigin: 'https://map.example.com', floorId: 'L1', timeout: 7000 }) const ready = service.init() await vi.waitFor(() => expect(SDKConstructor).toHaveBeenCalledOnce()) listeners.get('ready')?.({ engineVersion: '2.4.1', protocolVersion: 2 } as never) await ready return { sdk, service } } beforeEach(() => { loadSgsMapScript.mockReset() }) describe('SGS Map SDK 2.4.1 service adapter', () => { it('透传楼层强制刷新选项和统一命令超时', async () => { const { sdk, service } = await createHarness() await expect(service.changeFloor('L2', { forceReload: true })).resolves.toEqual({ success: true, floorId: 'L2' }) expect(sdk.changeFloor).toHaveBeenCalledWith('L2', 7000, { forceReload: true }) }) it('返回异步视图命令结果并向上传递 SDK 错误', async () => { const { sdk, service } = await createHarness() await expect(service.setViewMode('2d')).resolves.toEqual({ success: true, mode: '2d' }) expect(sdk.setViewMode).toHaveBeenCalledWith('2d', 7000) vi.mocked(sdk.resetView).mockRejectedValueOnce(new Error('RESET_VIEW failed')) await expect(service.resetView()).rejects.toThrow('RESET_VIEW failed') expect(sdk.resetView).toHaveBeenCalledWith(7000) }) })