2026-07-17 13:50:30 +08:00
|
|
|
import assert from 'node:assert/strict'
|
|
|
|
|
import test from 'node:test'
|
|
|
|
|
|
2026-07-20 19:31:43 +08:00
|
|
|
import { apiRequest } from '../src/http'
|
|
|
|
|
import { _initializeFromResolvedConfig, awaitInitialization } from '../src/sdk'
|
2026-07-17 13:50:30 +08:00
|
|
|
|
2026-07-18 06:59:57 +08:00
|
|
|
test('awaitInitialization observes in-flight work and retries a transient config request failure', async () => {
|
2026-07-17 13:50:30 +08:00
|
|
|
const originalFetch = globalThis.fetch
|
|
|
|
|
let requestCount = 0
|
2026-07-20 19:31:43 +08:00
|
|
|
const requestedUrls: string[] = []
|
|
|
|
|
globalThis.fetch = async input => {
|
2026-07-17 13:50:30 +08:00
|
|
|
requestCount += 1
|
2026-07-20 19:31:43 +08:00
|
|
|
requestedUrls.push(String(input))
|
2026-07-18 06:59:57 +08:00
|
|
|
if (requestCount === 1) {
|
|
|
|
|
throw new TypeError('Network request failed')
|
|
|
|
|
}
|
2026-07-20 19:31:43 +08:00
|
|
|
if (requestCount === 3) {
|
|
|
|
|
return new Response(JSON.stringify({ data: { available: true } }), {
|
|
|
|
|
headers: { 'content-type': 'application/json' },
|
|
|
|
|
status: 200,
|
|
|
|
|
})
|
|
|
|
|
}
|
2026-07-17 13:50:30 +08:00
|
|
|
return new Response(
|
|
|
|
|
JSON.stringify({
|
|
|
|
|
data: {
|
|
|
|
|
apiUrl: 'https://api.example.test',
|
|
|
|
|
},
|
|
|
|
|
}),
|
|
|
|
|
{
|
|
|
|
|
headers: { 'content-type': 'application/json' },
|
|
|
|
|
status: 200,
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
2026-07-20 19:31:43 +08:00
|
|
|
const autoInitialization = _initializeFromResolvedConfig(
|
|
|
|
|
{
|
|
|
|
|
appKey: 'test-app',
|
|
|
|
|
appName: '测试应用',
|
|
|
|
|
serverUrl: 'https://dev.xuqinmin.com',
|
|
|
|
|
signingKey: 'secret',
|
|
|
|
|
},
|
|
|
|
|
{ debug: true },
|
|
|
|
|
)
|
2026-07-18 06:59:57 +08:00
|
|
|
await assert.rejects(() => awaitInitialization(), /Network request failed/)
|
|
|
|
|
await assert.rejects(() => autoInitialization, /Network request failed/)
|
|
|
|
|
|
|
|
|
|
// 配置内容由 common 保存,扩展包再次等待时可以自行重试,无需宿主传递配置。
|
2026-07-17 13:50:30 +08:00
|
|
|
await assert.doesNotReject(() => awaitInitialization())
|
2026-07-18 06:59:57 +08:00
|
|
|
assert.equal(requestCount, 2)
|
2026-07-20 19:31:43 +08:00
|
|
|
|
|
|
|
|
const result = await apiRequest<{ available: boolean }>('/api/v1/rn/release-set/check', {
|
|
|
|
|
skipAuth: true,
|
|
|
|
|
})
|
|
|
|
|
assert.deepEqual(result, { available: true })
|
|
|
|
|
assert.equal(requestedUrls[2], 'https://dev.xuqinmin.com/api/v1/rn/release-set/check')
|
|
|
|
|
assert.equal(requestedUrls[2]?.includes('api.example.test'), false)
|
2026-07-17 13:50:30 +08:00
|
|
|
} finally {
|
|
|
|
|
globalThis.fetch = originalFetch
|
|
|
|
|
}
|
|
|
|
|
})
|