mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-10-20 21:05:02 +03:00
14b92fbcff
A node's "update available" tag compares its reported panel version with the master's latest, and any non-semver side fell back to string inequality. A dev build reports dev+<sha> (config.GetPanelVersion), so a node moved to the dev channel from a master on the stable channel kept the tag forever; the reverse, a stable node under a master on the dev channel, was flagged too and the tag's default stable update installed nothing new. A dev label and a release tag carry no order, so the comparison now only decides within one channel; dev-to-dev still compares commits, which keeps a node on the current dev-latest commit untagged as config.go intends.
64 lines
2.5 KiB
TypeScript
64 lines
2.5 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
|
|
import { formatPanelVersion, isPanelUpdateAvailable } from '@/lib/panel-version';
|
|
|
|
// Parity with web/service/panel.go isNewerVersion.
|
|
describe('isPanelUpdateAvailable', () => {
|
|
it('flags a strictly newer latest', () => {
|
|
expect(isPanelUpdateAvailable('2.6.5', '2.6.4')).toBe(true);
|
|
expect(isPanelUpdateAvailable('v2.7.0', 'v2.6.9')).toBe(true);
|
|
expect(isPanelUpdateAvailable('3.0.0', '2.9.9')).toBe(true);
|
|
});
|
|
|
|
it('returns false when equal or the node is ahead', () => {
|
|
expect(isPanelUpdateAvailable('2.6.4', '2.6.4')).toBe(false);
|
|
expect(isPanelUpdateAvailable('v2.6.4', '2.6.4')).toBe(false);
|
|
expect(isPanelUpdateAvailable('2.6.4', '2.6.5')).toBe(false);
|
|
});
|
|
|
|
it('ignores a leading v on either side', () => {
|
|
expect(isPanelUpdateAvailable('v2.6.5', '2.6.4')).toBe(true);
|
|
expect(isPanelUpdateAvailable('2.6.5', 'v2.6.4')).toBe(true);
|
|
});
|
|
|
|
it('never flags when a version is unknown', () => {
|
|
expect(isPanelUpdateAvailable('', '2.6.4')).toBe(false);
|
|
expect(isPanelUpdateAvailable('2.6.5', '')).toBe(false);
|
|
});
|
|
|
|
it('falls back to string inequality for non-semver tags', () => {
|
|
expect(isPanelUpdateAvailable('nightly-2', 'nightly-1')).toBe(true);
|
|
expect(isPanelUpdateAvailable('nightly-1', 'nightly-1')).toBe(false);
|
|
});
|
|
|
|
it('compares dev builds by commit and never across channels', () => {
|
|
expect(isPanelUpdateAvailable('dev+1a2b3c4d', 'dev+0f0f0f0f')).toBe(true);
|
|
expect(isPanelUpdateAvailable('dev+1a2b3c4d', 'dev+1a2b3c4d')).toBe(false);
|
|
expect(isPanelUpdateAvailable('v3.5.0', 'dev+1a2b3c4d')).toBe(false);
|
|
expect(isPanelUpdateAvailable('dev+1a2b3c4d', '3.5.0')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('formatPanelVersion', () => {
|
|
it('adds a single v prefix to bare semantic versions', () => {
|
|
expect(formatPanelVersion('3.4.0')).toBe('v3.4.0');
|
|
expect(formatPanelVersion('2.6.5')).toBe('v2.6.5');
|
|
});
|
|
|
|
it('does not double up the v on already-prefixed tags', () => {
|
|
expect(formatPanelVersion('v3.4.0')).toBe('v3.4.0');
|
|
expect(formatPanelVersion('V3.4.0')).toBe('v3.4.0');
|
|
});
|
|
|
|
it('shows dev builds verbatim without a v prefix', () => {
|
|
expect(formatPanelVersion('dev+1a2b3c4d')).toBe('dev+1a2b3c4d');
|
|
expect(formatPanelVersion('dev')).toBe('dev');
|
|
});
|
|
|
|
it('returns empty for blank input and leaves unknown markers untouched', () => {
|
|
expect(formatPanelVersion('')).toBe('');
|
|
expect(formatPanelVersion(undefined)).toBe('');
|
|
expect(formatPanelVersion('?')).toBe('?');
|
|
});
|
|
});
|