Files
EasyCLIProxyAPI/tests/versionManagement.test.ts
T
lzt404 45ecd37ce5 fix(update): compare core versions using SemVer
Only show update indicators when the remote core version is newer.
Add coverage for prereleases, build metadata, invalid versions, and version boundaries.
2026-09-06 01:28:58 +08:00

83 lines
3.5 KiB
TypeScript

import { describe, expect, it } from 'bun:test';
import {
DEFAULT_VERSION_DOWNLOAD_SOURCE,
displayAppVersion,
} from '../src/pages/VersionManagementPage';
import { coreUpdateAvailable } from '../src/coreUpdate';
import { appUpdateIndicatorState } from '../src/appUpdateModel';
describe('VersionManagement helper functions', () => {
it('defaults every version management session to GitHub', () => {
expect(DEFAULT_VERSION_DOWNLOAD_SOURCE).toBe('github');
});
it('formats app versions with v prefix properly', () => {
expect(displayAppVersion('1.0.0')).toBe('v1.0.0');
expect(displayAppVersion('v1.2.3')).toBe('v1.2.3');
expect(displayAppVersion(' 2.3.4 ')).toBe('v2.3.4');
expect(displayAppVersion(' v3.4.5 ')).toBe('v3.4.5');
});
it('resolves update indicators based on availability and processing state', () => {
expect(appUpdateIndicatorState(true, false, false)).toBe('available');
expect(appUpdateIndicatorState(false, true, false)).toBe('available');
expect(appUpdateIndicatorState(true, true, true)).toBe('processing');
expect(appUpdateIndicatorState(false, false, false)).toBeNull();
});
it('compares installed and latest core versions consistently', () => {
expect(coreUpdateAvailable('v6.6.0', '6.6.0')).toBe(false);
expect(coreUpdateAvailable('6.5.0', 'v6.6.0')).toBe(true);
expect(coreUpdateAvailable('v7.2.151', 'v7.2.150')).toBe(false);
expect(coreUpdateAvailable('6.9.0', '6.10.0')).toBe(true);
expect(coreUpdateAvailable('6.10.0', '6.9.0')).toBe(false);
expect(coreUpdateAvailable('6.6.0-rc.2', '6.6.0-rc.10')).toBe(true);
expect(coreUpdateAvailable('6.6.0-rc.1', '6.6.0')).toBe(true);
expect(coreUpdateAvailable('6.6.0', '6.6.0-rc.1')).toBe(false);
expect(coreUpdateAvailable('6.6.0+local', '6.6.0+remote')).toBe(false);
expect(coreUpdateAvailable(null, '6.6.0')).toBe(false);
expect(coreUpdateAvailable('6.5.0', '')).toBe(false);
expect(coreUpdateAvailable('dev', '6.6.0')).toBe(false);
expect(coreUpdateAvailable('6.5.0', 'unknown')).toBe(false);
});
it('does not show an update indicator for an older core release', () => {
const coreHasUpdate = coreUpdateAvailable('v7.2.151', 'v7.2.150');
expect(appUpdateIndicatorState(false, coreHasUpdate, false)).toBeNull();
});
it('follows the semantic version precedence rules', () => {
const orderedVersions = [
'1.0.0-alpha',
'1.0.0-alpha.1',
'1.0.0-alpha.beta',
'1.0.0-beta',
'1.0.0-beta.2',
'1.0.0-beta.11',
'1.0.0-rc.1',
'1.0.0',
'1.0.1',
'1.1.0',
'2.0.0',
];
for (let index = 1; index < orderedVersions.length; index += 1) {
const older = orderedVersions[index - 1];
const newer = orderedVersions[index];
expect(coreUpdateAvailable(older, newer)).toBe(true);
expect(coreUpdateAvailable(newer, older)).toBe(false);
expect(coreUpdateAvailable(newer, newer)).toBe(false);
}
});
it('handles prefixes, whitespace, large identifiers, and invalid versions', () => {
expect(coreUpdateAvailable(' V7.2.150 ', ' v7.2.151 ')).toBe(true);
expect(coreUpdateAvailable('999999999999999999.0.0', '1000000000000000000.0.0')).toBe(true);
expect(coreUpdateAvailable('1.0.0-999999999999999999', '1.0.0-1000000000000000000')).toBe(true);
expect(coreUpdateAvailable('1.0.0+build.1', '1.0.0+build.2')).toBe(false);
expect(coreUpdateAvailable('1.0.0', '1.01.0')).toBe(false);
expect(coreUpdateAvailable('1.0', '1.0.1')).toBe(false);
expect(coreUpdateAvailable('1.0.0.0', '1.0.1')).toBe(false);
});
});