41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { settleWithConcurrency } from './useMapThemeSelectionInsights'
|
|
|
|
describe('settleWithConcurrency', () => {
|
|
it('keeps result order and never exceeds the acquisition limit', async () => {
|
|
let active = 0
|
|
let maximumActive = 0
|
|
|
|
const results = await settleWithConcurrency([0, 1, 2, 3, 4, 5], 3, async (value) => {
|
|
active += 1
|
|
maximumActive = Math.max(maximumActive, active)
|
|
await new Promise((resolve) => setTimeout(resolve, (5 - value) * 2))
|
|
active -= 1
|
|
return value * 10
|
|
})
|
|
|
|
expect(maximumActive).toBe(3)
|
|
expect(results).toEqual([
|
|
{ status: 'fulfilled', value: 0 },
|
|
{ status: 'fulfilled', value: 10 },
|
|
{ status: 'fulfilled', value: 20 },
|
|
{ status: 'fulfilled', value: 30 },
|
|
{ status: 'fulfilled', value: 40 },
|
|
{ status: 'fulfilled', value: 50 },
|
|
])
|
|
})
|
|
|
|
it('retains individual acquisition failures without stopping the queue', async () => {
|
|
const results = await settleWithConcurrency(['ok', 'fail', 'later'], 2, async (value) => {
|
|
if (value === 'fail') {
|
|
throw new Error('provider unavailable')
|
|
}
|
|
return value.toUpperCase()
|
|
})
|
|
|
|
expect(results[0]).toEqual({ status: 'fulfilled', value: 'OK' })
|
|
expect(results[1].status).toBe('rejected')
|
|
expect(results[2]).toEqual({ status: 'fulfilled', value: 'LATER' })
|
|
})
|
|
})
|