feat:移除了弹窗,服务器添加sls
This commit is contained in:
238
apps/app-frontend/src/helpers/loader-metadata.test.ts
Normal file
238
apps/app-frontend/src/helpers/loader-metadata.test.ts
Normal file
@ -0,0 +1,238 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import test from 'node:test'
|
||||
|
||||
import {
|
||||
createLatestRequestGuard,
|
||||
gameVersionSelectorText,
|
||||
isLoaderSupportStateDisabled,
|
||||
loaderMetadataCacheKey,
|
||||
loaderMetadataQueryKey,
|
||||
loaderSupportState,
|
||||
loaderVersionSelectorText,
|
||||
loaderVersionsForGameVersion,
|
||||
loaderVersionSummaryState,
|
||||
preserveOrSelectGameVersion,
|
||||
scopedLoaderMetadataQueryKey,
|
||||
} from '../../../../packages/ui/src/components/flows/creation-flow-modal/loader-metadata.ts'
|
||||
import {
|
||||
clientInstallableLoaders,
|
||||
instanceInstallablePlatforms,
|
||||
} from '../../../../packages/ui/src/utils/loaders.ts'
|
||||
|
||||
const manifest = (gameVersion: string, versions: string[]) => ({
|
||||
gameVersions: [
|
||||
{
|
||||
id: gameVersion,
|
||||
loaders: versions.map((id) => ({ id, stable: true })),
|
||||
},
|
||||
],
|
||||
})
|
||||
|
||||
test('shares the complete client loader list with instance installation settings', () => {
|
||||
assert.deepEqual(
|
||||
[...clientInstallableLoaders],
|
||||
[
|
||||
'fabric',
|
||||
'neoforge',
|
||||
'forge',
|
||||
'quilt',
|
||||
'optifine',
|
||||
'cleanroom',
|
||||
'lite_loader',
|
||||
'legacy_fabric',
|
||||
'babric',
|
||||
],
|
||||
)
|
||||
assert.deepEqual([...instanceInstallablePlatforms], ['vanilla', ...clientInstallableLoaders])
|
||||
})
|
||||
|
||||
test('instance settings scopes Forge and Fabric queries by Minecraft version', () => {
|
||||
const forgeA = scopedLoaderMetadataQueryKey('instance-settings', 'forge', '1.20.1')
|
||||
const forgeB = scopedLoaderMetadataQueryKey('instance-settings', 'forge', '26.2')
|
||||
const forgeAReturn = scopedLoaderMetadataQueryKey('instance-settings', 'forge', '1.20.1')
|
||||
const fabricA = scopedLoaderMetadataQueryKey('instance-settings', 'fabric', '1.20.1')
|
||||
const fabricB = scopedLoaderMetadataQueryKey('instance-settings', 'fabric', '1.21.1')
|
||||
|
||||
assert.deepEqual(forgeA, ['instance-settings', 'loader-versions', 'forge', '1.20.1'])
|
||||
assert.deepEqual(forgeB, ['instance-settings', 'loader-versions', 'forge', '26.2'])
|
||||
assert.deepEqual(forgeAReturn, forgeA)
|
||||
assert.notDeepEqual(forgeA, forgeB)
|
||||
assert.notDeepEqual(fabricA, fabricB)
|
||||
|
||||
const cache = new Map([
|
||||
[JSON.stringify(forgeA), manifest('1.20.1', ['47.4.22'])],
|
||||
[JSON.stringify(forgeB), manifest('26.2', ['65.1.1', '65.1.0'])],
|
||||
[JSON.stringify(fabricA), manifest('1.20.1', ['0.18.4'])],
|
||||
[JSON.stringify(fabricB), manifest('1.21.1', ['0.18.4', '0.17.3'])],
|
||||
])
|
||||
const ids = (key: readonly string[], gameVersion: string) =>
|
||||
loaderVersionsForGameVersion(cache.get(JSON.stringify(key)), gameVersion).map(
|
||||
(version) => version.id,
|
||||
)
|
||||
|
||||
assert.deepEqual(ids(forgeA, '1.20.1'), ['47.4.22'])
|
||||
assert.deepEqual(ids(forgeB, '26.2'), ['65.1.1', '65.1.0'])
|
||||
assert.deepEqual(ids(forgeAReturn, '1.20.1'), ['47.4.22'])
|
||||
assert.deepEqual(ids(fabricA, '1.20.1'), ['0.18.4'])
|
||||
assert.deepEqual(ids(fabricB, '1.21.1'), ['0.18.4', '0.17.3'])
|
||||
})
|
||||
|
||||
test('isolates loader metadata by loader and Minecraft version', () => {
|
||||
const forge262Key = loaderMetadataCacheKey('forge', '26.2')
|
||||
const forge1201Key = loaderMetadataCacheKey('forge', '1.20.1')
|
||||
const cache = {
|
||||
[forge262Key]: manifest('26.2', ['65.1.1', '65.1.0']),
|
||||
[forge1201Key]: manifest('1.20.1', ['47.4.22', '47.4.21']),
|
||||
}
|
||||
|
||||
assert.notEqual(forge262Key, forge1201Key)
|
||||
assert.deepEqual(loaderMetadataQueryKey('forge', '26.2'), [
|
||||
'creation-flow',
|
||||
'loader-versions',
|
||||
'forge',
|
||||
'26.2',
|
||||
])
|
||||
assert.deepEqual(loaderMetadataQueryKey('forge', '1.20.1'), [
|
||||
'creation-flow',
|
||||
'loader-versions',
|
||||
'forge',
|
||||
'1.20.1',
|
||||
])
|
||||
|
||||
assert.deepEqual(
|
||||
loaderVersionsForGameVersion(cache[forge262Key], '26.2').map((version) => version.id),
|
||||
['65.1.1', '65.1.0'],
|
||||
)
|
||||
assert.deepEqual(
|
||||
loaderVersionsForGameVersion(cache[forge1201Key], '1.20.1').map((version) => version.id),
|
||||
['47.4.22', '47.4.21'],
|
||||
)
|
||||
assert.deepEqual(
|
||||
loaderVersionsForGameVersion(cache[forge262Key], '26.2').map((version) => version.id),
|
||||
['65.1.1', '65.1.0'],
|
||||
)
|
||||
})
|
||||
|
||||
test('rejects stale loader metadata requests after rapid selection changes', () => {
|
||||
const guard = createLatestRequestGuard()
|
||||
const minecraftARequest = guard.begin()
|
||||
const minecraftBRequest = guard.begin()
|
||||
const minecraftAReturnRequest = guard.begin()
|
||||
|
||||
assert.equal(guard.isCurrent(minecraftARequest), false)
|
||||
assert.equal(guard.isCurrent(minecraftBRequest), false)
|
||||
assert.equal(guard.isCurrent(minecraftAReturnRequest), true)
|
||||
|
||||
const fabricRequest = guard.begin()
|
||||
const forgeRequest = guard.begin()
|
||||
const neoForgeRequest = guard.begin()
|
||||
assert.equal(guard.isCurrent(fabricRequest), false)
|
||||
assert.equal(guard.isCurrent(forgeRequest), false)
|
||||
assert.equal(guard.isCurrent(neoForgeRequest), true)
|
||||
})
|
||||
|
||||
test('does not treat missing, loading, or errored metadata as unsupported', () => {
|
||||
assert.equal(loaderSupportState('unknown', undefined, '1.20.1'), 'unknown')
|
||||
assert.equal(loaderSupportState('loading', undefined, '1.20.1'), 'loading')
|
||||
assert.equal(loaderSupportState('error', undefined, '1.20.1'), 'error')
|
||||
})
|
||||
|
||||
test('marks only a successfully resolved empty loader set as unsupported', () => {
|
||||
assert.equal(
|
||||
loaderSupportState('success', manifest('1.20.1', ['47.4.22']), '1.20.1'),
|
||||
'supported',
|
||||
)
|
||||
assert.equal(
|
||||
loaderSupportState('success', manifest('unsupported', []), 'unsupported'),
|
||||
'unsupported',
|
||||
)
|
||||
})
|
||||
|
||||
test('restores loader support state across Minecraft version changes', () => {
|
||||
const cache = {
|
||||
[loaderMetadataCacheKey('forge', '1.20.1')]: manifest('1.20.1', ['47.4.22']),
|
||||
[loaderMetadataCacheKey('forge', 'unsupported')]: manifest('unsupported', []),
|
||||
}
|
||||
|
||||
const support = (gameVersion: string) =>
|
||||
loaderSupportState(
|
||||
'success',
|
||||
cache[loaderMetadataCacheKey('forge', gameVersion) as keyof typeof cache],
|
||||
gameVersion,
|
||||
)
|
||||
|
||||
assert.equal(support('1.20.1'), 'supported')
|
||||
assert.equal(support('unsupported'), 'unsupported')
|
||||
assert.equal(support('1.20.1'), 'supported')
|
||||
})
|
||||
|
||||
test('disables loader chips until compatibility is positively confirmed', () => {
|
||||
assert.equal(isLoaderSupportStateDisabled('unknown'), true)
|
||||
assert.equal(isLoaderSupportStateDisabled('loading'), true)
|
||||
assert.equal(isLoaderSupportStateDisabled('unsupported'), true)
|
||||
assert.equal(isLoaderSupportStateDisabled('supported'), false)
|
||||
assert.equal(isLoaderSupportStateDisabled('error'), true)
|
||||
})
|
||||
|
||||
test('does not replace an explicit Minecraft version when loader options change', () => {
|
||||
assert.equal(preserveOrSelectGameVersion('26.2', ['26.1.2', '1.21.11']), '26.2')
|
||||
assert.equal(preserveOrSelectGameVersion(null, ['26.1.2', '1.21.11']), '26.1.2')
|
||||
assert.equal(preserveOrSelectGameVersion(null, []), null)
|
||||
})
|
||||
|
||||
test('tracks loader chips through pending, supported, and unsupported responses', () => {
|
||||
const pendingB = loaderSupportState('loading', undefined, '26.2')
|
||||
assert.equal(isLoaderSupportStateDisabled(pendingB), true)
|
||||
|
||||
const unsupportedB = loaderSupportState('success', manifest('unsupported', []), 'unsupported')
|
||||
assert.equal(unsupportedB, 'unsupported')
|
||||
assert.equal(isLoaderSupportStateDisabled(unsupportedB), true)
|
||||
|
||||
const pendingC = loaderSupportState('loading', undefined, '1.20.1')
|
||||
assert.equal(isLoaderSupportStateDisabled(pendingC), true)
|
||||
|
||||
const supportedC = loaderSupportState('success', manifest('1.20.1', ['47.4.22']), '1.20.1')
|
||||
assert.equal(supportedC, 'supported')
|
||||
assert.equal(isLoaderSupportStateDisabled(supportedC), false)
|
||||
})
|
||||
|
||||
test('uses the loading label for both loader version selector placeholders while pending', () => {
|
||||
assert.deepEqual(
|
||||
loaderVersionSelectorText(true, false, {
|
||||
loading: 'Loading',
|
||||
empty: 'No versions available',
|
||||
placeholder: 'Select loader version',
|
||||
searchPlaceholder: 'Search loader version...',
|
||||
}),
|
||||
{ placeholder: 'Loading', searchPlaceholder: 'Loading' },
|
||||
)
|
||||
})
|
||||
|
||||
test('hides an old loader version behind the loading summary until the new version resolves', () => {
|
||||
assert.equal(loaderVersionSummaryState(true, '47.4.22'), 'loading')
|
||||
assert.equal(loaderVersionSummaryState(false, '65.1.0'), 'selected')
|
||||
assert.equal(loaderVersionSummaryState(false, null), 'empty')
|
||||
})
|
||||
|
||||
test('shows a loader-specific message after game version metadata resolves empty', () => {
|
||||
const labels = {
|
||||
loading: 'Loading',
|
||||
empty: 'No game versions support this loader',
|
||||
error: 'Failed to load game versions',
|
||||
placeholder: 'Select game version',
|
||||
searchPlaceholder: 'Search game version...',
|
||||
}
|
||||
|
||||
assert.deepEqual(gameVersionSelectorText('loading', labels), {
|
||||
placeholder: 'Loading',
|
||||
searchPlaceholder: 'Loading',
|
||||
})
|
||||
assert.deepEqual(gameVersionSelectorText('empty', labels), {
|
||||
placeholder: 'No game versions support this loader',
|
||||
searchPlaceholder: 'No game versions support this loader',
|
||||
})
|
||||
assert.deepEqual(gameVersionSelectorText('error', labels), {
|
||||
placeholder: 'Failed to load game versions',
|
||||
searchPlaceholder: 'Failed to load game versions',
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user