Release 3X-UI for Docker / build (push) Canceled after 0s
Release 3X-UI / build (386) (push) Canceled after 0s
Release 3X-UI / build (amd64) (push) Canceled after 0s
Release 3X-UI / build (arm64) (push) Canceled after 0s
Release 3X-UI / build (armv5) (push) Canceled after 0s
Release 3X-UI / build (armv6) (push) Canceled after 0s
Release 3X-UI / build (armv7) (push) Canceled after 0s
Release 3X-UI / build (s390x) (push) Canceled after 0s
Release 3X-UI / Build for Windows (amd64) (push) Canceled after 0s
Release 3X-UI / Publish rolling dev release (push) Canceled after 0s
28 lines
1.2 KiB
TypeScript
28 lines
1.2 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import { deriveSpiderX } from '@/lib/xray/spider-x';
|
|
|
|
// Cross-language vectors shared with TestDeriveSpiderXMatchesFrontendVectors
|
|
// in internal/sub/service_sharelink_test.go: subscription links come from Go,
|
|
// panel links from this module, and the two must agree byte-for-byte.
|
|
describe('deriveSpiderX', () => {
|
|
it('matches the Go deriveSpiderX vectors', () => {
|
|
expect(deriveSpiderX('/seed', 'subAlice')).toBe('/c252fbc3ecd3e3c');
|
|
expect(deriveSpiderX('/', '')).toBe('/d08ed99bd9afc60');
|
|
});
|
|
|
|
it('is stable per client, distinct across clients, and rotates with the seed', () => {
|
|
expect(deriveSpiderX('/seed', 'subAlice')).toBe(deriveSpiderX('/seed', 'subAlice'));
|
|
expect(deriveSpiderX('/seed', 'subAlice')).not.toBe(deriveSpiderX('/seed', 'subBob'));
|
|
expect(deriveSpiderX('/seedA', 'subAlice')).not.toBe(deriveSpiderX('/seedB', 'subAlice'));
|
|
});
|
|
|
|
it('returns empty when there is nothing to derive from', () => {
|
|
expect(deriveSpiderX('', '')).toBe('');
|
|
});
|
|
|
|
it('emits a /-prefixed 15-hex-char path', () => {
|
|
expect(deriveSpiderX('/some-seed', 'client@example.com')).toMatch(/^\/[0-9a-f]{15}$/);
|
|
});
|
|
});
|