mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-07-12 23:56:07 +00:00
feat(ui): show per-inbound live speed (#5261)
* feat(utils): add speedFormat utility and tests * feat(inbounds): add InboundSpeedEntry type * feat(inbounds): add speed column to inbound list * feat(inbounds): show speed in inbound stats modal * feat(inbounds): compute inbound speed from traffic deltas * feat(inbounds): wire inbound speed through page * feat(i18n): add speed translation for all locales * refactor(inbounds): dedupe live-speed UI and harden formatting Extract a shared InboundSpeedTag component and isActiveSpeed guard used by the speed column and stats modal, unify InboundSpeedEntry into a single type, and route speedFormat through sizeFormat. Also guard sizeFormat against non-finite input (no more "NaN PB/s") and clear stale per-inbound speeds when a traffic poll returns no deltas. --------- Co-authored-by: Sanaei <ho3ein.sanaei@gmail.com>
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { SizeFormatter } from '@/utils';
|
||||
|
||||
describe('SizeFormatter.sizeFormat', () => {
|
||||
it('formats zero and negative values', () => {
|
||||
expect(SizeFormatter.sizeFormat(0)).toBe('0 B');
|
||||
expect(SizeFormatter.sizeFormat(-1)).toBe('0 B');
|
||||
expect(SizeFormatter.sizeFormat(null)).toBe('0 B');
|
||||
expect(SizeFormatter.sizeFormat(undefined)).toBe('0 B');
|
||||
});
|
||||
|
||||
it('formats bytes', () => {
|
||||
expect(SizeFormatter.sizeFormat(512)).toBe('512 B');
|
||||
});
|
||||
|
||||
it('formats kilobytes', () => {
|
||||
expect(SizeFormatter.sizeFormat(1536)).toBe('1.50 KB');
|
||||
});
|
||||
});
|
||||
|
||||
describe('SizeFormatter.speedFormat', () => {
|
||||
it('formats zero and negative values', () => {
|
||||
expect(SizeFormatter.speedFormat(0)).toBe('0 B/s');
|
||||
expect(SizeFormatter.speedFormat(-1)).toBe('0 B/s');
|
||||
expect(SizeFormatter.speedFormat(null)).toBe('0 B/s');
|
||||
expect(SizeFormatter.speedFormat(undefined)).toBe('0 B/s');
|
||||
});
|
||||
|
||||
it('formats non-finite values as zero', () => {
|
||||
expect(SizeFormatter.speedFormat(NaN)).toBe('0 B/s');
|
||||
expect(SizeFormatter.speedFormat(Infinity)).toBe('0 B/s');
|
||||
expect(SizeFormatter.sizeFormat(NaN)).toBe('0 B');
|
||||
expect(SizeFormatter.sizeFormat(Infinity)).toBe('0 B');
|
||||
});
|
||||
|
||||
it('formats bytes per second', () => {
|
||||
expect(SizeFormatter.speedFormat(512)).toBe('512 B/s');
|
||||
expect(SizeFormatter.speedFormat(1023)).toBe('1023 B/s');
|
||||
});
|
||||
|
||||
it('formats kilobytes per second', () => {
|
||||
expect(SizeFormatter.speedFormat(1024)).toBe('1.00 KB/s');
|
||||
expect(SizeFormatter.speedFormat(1536)).toBe('1.50 KB/s');
|
||||
});
|
||||
|
||||
it('formats megabytes per second', () => {
|
||||
expect(SizeFormatter.speedFormat(1024 * 1024)).toBe('1.00 MB/s');
|
||||
expect(SizeFormatter.speedFormat(2.5 * 1024 * 1024)).toBe('2.50 MB/s');
|
||||
});
|
||||
|
||||
it('formats gigabytes per second', () => {
|
||||
expect(SizeFormatter.speedFormat(1024 * 1024 * 1024)).toBe('1.00 GB/s');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user