Axolotl desktop CI / guardrails (push) Has been cancelled
Axolotl desktop CI / desktop (macos-latest) (push) Has been cancelled
Axolotl desktop CI / desktop (ubuntu-latest) (push) Has been cancelled
Axolotl desktop CI / desktop (windows-latest) (push) Has been cancelled
Axolotl desktop CI / website (push) Has been cancelled
Repository checks / typos (push) Has been cancelled
Repository checks / tombi (push) Has been cancelled
Rust checks / shear (push) Has been cancelled
Sync source to CNB / Sync Git ref (push) Has been cancelled
40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
import { test } from 'node:test'
|
|
|
|
import { isInstanceLaunching, launchOnce } from './instance-launch-state.ts'
|
|
|
|
test('launches different instances concurrently and coalesces repeated pending clicks', async () => {
|
|
let finishA!: (value: string) => void
|
|
let starts = 0
|
|
const first = launchOnce('a', () => {
|
|
starts++
|
|
return new Promise<string>((resolve) => {
|
|
finishA = resolve
|
|
})
|
|
})
|
|
assert.equal(
|
|
launchOnce('a', async () => 'unexpected duplicate'),
|
|
first,
|
|
)
|
|
assert.equal(isInstanceLaunching('a'), true)
|
|
assert.equal(isInstanceLaunching('b'), false)
|
|
assert.equal(await launchOnce('b', async () => 'b started'), 'b started')
|
|
assert.equal(isInstanceLaunching('a'), true)
|
|
finishA('a started')
|
|
assert.equal(await first, 'a started')
|
|
assert.equal(starts, 1)
|
|
assert.equal(isInstanceLaunching('a'), false)
|
|
assert.equal(await launchOnce('a', async () => 'second window'), 'second window')
|
|
})
|
|
|
|
test('failed launch releases only its own pending state and can retry', async () => {
|
|
await assert.rejects(
|
|
launchOnce('failed', async () => {
|
|
throw new Error('launch failed')
|
|
}),
|
|
/launch failed/,
|
|
)
|
|
assert.equal(isInstanceLaunching('failed'), false)
|
|
assert.equal(await launchOnce('failed', async () => 'retry'), 'retry')
|
|
})
|