This commit is contained in:
87
tests/unit/FloorPoiLoader.spec.ts
Normal file
87
tests/unit/FloorPoiLoader.spec.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
import { describe, expect, it, vi } from 'vitest'
|
||||
import type { GuideModelSource, GuideRenderPoi } from '@/domain/guideModel'
|
||||
import { loadFloorPoisForInitialRender } from '@/components/map/floorPoiLoader'
|
||||
|
||||
const createPoi = (id: string): GuideRenderPoi => ({
|
||||
id,
|
||||
name: id,
|
||||
floorId: 'floor-1',
|
||||
primaryCategory: 'exhibition_hall',
|
||||
primaryCategoryZh: '展厅',
|
||||
iconType: 'hall'
|
||||
})
|
||||
|
||||
describe('loadFloorPoisForInitialRender', () => {
|
||||
it('keeps the model source instance context when using the fast loader', async () => {
|
||||
const fastPois = [createPoi('fast-poi')]
|
||||
const modelSource = {
|
||||
fastPois,
|
||||
loadPackage: vi.fn(),
|
||||
loadFloorPois: vi.fn(),
|
||||
async loadFloorPoisFast(floorId: string) {
|
||||
expect(this).toBe(modelSource)
|
||||
expect(floorId).toBe('floor-1')
|
||||
return this.fastPois
|
||||
}
|
||||
} satisfies GuideModelSource & { fastPois: GuideRenderPoi[] }
|
||||
|
||||
const result = await loadFloorPoisForInitialRender(modelSource, 'floor-1')
|
||||
|
||||
expect(result).toEqual({
|
||||
floorPois: fastPois,
|
||||
dataTier: 'fast'
|
||||
})
|
||||
expect(modelSource.loadFloorPois).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('falls back to the full loader and marks the result as full when fast loading fails', async () => {
|
||||
const fastError = new Error('fast loader unavailable')
|
||||
const fullPois = [createPoi('full-poi')]
|
||||
const modelSource = {
|
||||
loadPackage: vi.fn(),
|
||||
loadFloorPoisFast: vi.fn().mockRejectedValue(fastError),
|
||||
loadFloorPois: vi.fn().mockResolvedValue(fullPois)
|
||||
} satisfies GuideModelSource
|
||||
|
||||
const result = await loadFloorPoisForInitialRender(modelSource, 'floor-1')
|
||||
|
||||
expect(modelSource.loadFloorPoisFast).toHaveBeenCalledWith('floor-1')
|
||||
expect(modelSource.loadFloorPois).toHaveBeenCalledWith('floor-1')
|
||||
expect(result).toEqual({
|
||||
floorPois: fullPois,
|
||||
dataTier: 'full',
|
||||
fastLoadError: fastError
|
||||
})
|
||||
})
|
||||
|
||||
it('returns fast data without invoking the full loader when fast loading succeeds', async () => {
|
||||
const fastPois = [createPoi('fast-poi')]
|
||||
const modelSource = {
|
||||
loadPackage: vi.fn(),
|
||||
loadFloorPoisFast: vi.fn().mockResolvedValue(fastPois),
|
||||
loadFloorPois: vi.fn()
|
||||
} satisfies GuideModelSource
|
||||
|
||||
const result = await loadFloorPoisForInitialRender(modelSource, 'floor-1')
|
||||
|
||||
expect(result.dataTier).toBe('fast')
|
||||
expect(result.floorPois).toBe(fastPois)
|
||||
expect(modelSource.loadFloorPois).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('uses and marks the full path when no fast loader is available', async () => {
|
||||
const fullPois = [createPoi('full-poi')]
|
||||
const modelSource = {
|
||||
loadPackage: vi.fn(),
|
||||
loadFloorPois: vi.fn().mockResolvedValue(fullPois)
|
||||
} satisfies GuideModelSource
|
||||
|
||||
const result = await loadFloorPoisForInitialRender(modelSource, 'floor-1')
|
||||
|
||||
expect(modelSource.loadFloorPois).toHaveBeenCalledWith('floor-1')
|
||||
expect(result).toEqual({
|
||||
floorPois: fullPois,
|
||||
dataTier: 'full'
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user