91 lines
2.8 KiB
TypeScript
91 lines
2.8 KiB
TypeScript
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<keyof SgsMapEvents, (payload: never) => 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.5.0',
|
|
sdkUrl: '/engine/index.html',
|
|
targetOrigin: 'https://map.example.com',
|
|
floorId: 'L1',
|
|
timeout: 7000
|
|
})
|
|
const ready = service.init()
|
|
|
|
await vi.waitFor(() => expect(SDKConstructor).toHaveBeenCalledOnce())
|
|
listeners.get('ready')?.({
|
|
engineVersion: '2.5.0',
|
|
protocolVersion: 2
|
|
} as never)
|
|
await ready
|
|
|
|
return { sdk, service, SDKConstructor }
|
|
}
|
|
|
|
beforeEach(() => {
|
|
loadSgsMapScript.mockReset()
|
|
})
|
|
|
|
describe('SGS Map SDK 2.5.0 service adapter', () => {
|
|
it('向 SDK 构造器传入完整的 Engine 桥接配置', async () => {
|
|
const { SDKConstructor } = await createHarness()
|
|
|
|
expect(SDKConstructor).toHaveBeenCalledWith({
|
|
container: expect.any(Object),
|
|
sdkUrl: '/engine/index.html',
|
|
targetOrigin: 'https://map.example.com',
|
|
floorId: 'L1',
|
|
timeout: 7000
|
|
})
|
|
})
|
|
|
|
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)
|
|
})
|
|
})
|