2026-07-27 00:39:26 +08:00
|
|
|
import assert from 'node:assert/strict'
|
|
|
|
|
import test from 'node:test'
|
|
|
|
|
|
2026-07-28 20:29:06 +08:00
|
|
|
import {
|
|
|
|
|
normalizeRemoteConfig,
|
|
|
|
|
parseCachedRemoteConfig,
|
|
|
|
|
parseRemoteConfigCache,
|
|
|
|
|
serializeRemoteConfigCache,
|
|
|
|
|
} from '../src/remoteConfig'
|
2026-07-27 00:39:26 +08:00
|
|
|
|
|
|
|
|
test('platform update feature is authoritative over the flat compatibility field', () => {
|
|
|
|
|
assert.equal(
|
|
|
|
|
normalizeRemoteConfig({ features: { update: false }, updateEnabled: true }).updateEnabled,
|
|
|
|
|
false,
|
|
|
|
|
)
|
|
|
|
|
assert.equal(normalizeRemoteConfig({ updateEnabled: true }).updateEnabled, true)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test('missing update feature stays absent so XuqmConfig can safely default it off', () => {
|
|
|
|
|
assert.equal(normalizeRemoteConfig({}).updateEnabled, undefined)
|
|
|
|
|
assert.deepEqual(parseCachedRemoteConfig({ apiUrl: 'https://api.example.test' }), {
|
|
|
|
|
apiUrl: 'https://api.example.test',
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test('cached update availability is preserved exactly', () => {
|
|
|
|
|
assert.equal(parseCachedRemoteConfig({ updateEnabled: true })?.updateEnabled, true)
|
|
|
|
|
assert.equal(parseCachedRemoteConfig({ updateEnabled: false })?.updateEnabled, false)
|
|
|
|
|
})
|
2026-07-28 20:29:06 +08:00
|
|
|
|
|
|
|
|
test('non-sensitive LKG cache is strict, versioned and does not expire by age', () => {
|
|
|
|
|
const raw = serializeRemoteConfigCache(
|
|
|
|
|
{
|
|
|
|
|
bugCollectApiUrl: 'https://errors.example.test',
|
|
|
|
|
bugCollectEnabled: true,
|
|
|
|
|
updateEnabled: false,
|
|
|
|
|
},
|
|
|
|
|
1,
|
|
|
|
|
)
|
|
|
|
|
assert.deepEqual(parseRemoteConfigCache(raw), {
|
|
|
|
|
cachedAt: 1,
|
|
|
|
|
remote: {
|
|
|
|
|
bugCollectApiUrl: 'https://errors.example.test',
|
|
|
|
|
bugCollectEnabled: true,
|
|
|
|
|
updateEnabled: false,
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
assert.equal(raw.includes('signingKey'), false)
|
|
|
|
|
assert.equal(
|
|
|
|
|
parseRemoteConfigCache(
|
|
|
|
|
JSON.stringify({
|
|
|
|
|
...JSON.parse(raw),
|
|
|
|
|
injectedSecret: 'must-be-rejected',
|
|
|
|
|
}),
|
|
|
|
|
),
|
|
|
|
|
null,
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test('cached remote config rejects unknown fields and unsafe endpoint schemes', () => {
|
|
|
|
|
assert.equal(parseCachedRemoteConfig({ updateEnabled: true, unknown: true }), null)
|
|
|
|
|
assert.equal(parseCachedRemoteConfig({ apiUrl: 'javascript:alert(1)' }), null)
|
|
|
|
|
})
|