Files
outline/shared/utils/files.test.ts
T
codegen-sh[bot] e28dfbe0bc Fix file size display to use binary units instead of decimal (#10095)
* Fix file size display to use binary units instead of decimal

- Update bytesToHumanReadable function to use 1024-based units (KB, MB, GB)
- This matches user expectations from operating systems like Windows
- Fixes issue where 87.2MB file was displayed as 91.53MB
- Update unit tests to reflect binary unit calculations
- Resolves GitHub issue #10085

Co-authored-by: Tom Moor <tom@getoutline.com>

* Make file size display platform-aware

- Use decimal units (base 1000) on macOS to match Finder behavior
- Use binary units (base 1024) on Windows to match Explorer behavior
- Import isMac utility from shared/utils/browser
- Update comprehensive tests for both platforms
- Resolves platform-specific file size display discrepancies

Co-authored-by: Tom Moor <tom@getoutline.com>

---------

Co-authored-by: codegen-sh[bot] <131295404+codegen-sh[bot]@users.noreply.github.com>
Co-authored-by: Tom Moor <tom@getoutline.com>
2025-09-05 06:17:43 -04:00

89 lines
3.2 KiB
TypeScript

import { bytesToHumanReadable, getFileNameFromUrl } from "./files";
import * as browser from "./browser";
// Mock the browser detection
jest.mock("./browser", () => ({
isMac: jest.fn(),
}));
const mockIsMac = browser.isMac as jest.MockedFunction<typeof browser.isMac>;
describe("bytesToHumanReadable", () => {
afterEach(() => {
jest.clearAllMocks();
});
describe("on macOS (decimal units)", () => {
beforeEach(() => {
mockIsMac.mockReturnValue(true);
});
it("outputs readable string using decimal units", () => {
expect(bytesToHumanReadable(0)).toBe("0 Bytes");
expect(bytesToHumanReadable(0.0)).toBe("0 Bytes");
expect(bytesToHumanReadable(33)).toBe("33 Bytes");
expect(bytesToHumanReadable(500)).toBe("500 Bytes");
expect(bytesToHumanReadable(1000)).toBe("1 KB");
expect(bytesToHumanReadable(15000)).toBe("15 KB");
expect(bytesToHumanReadable(12345)).toBe("12.35 KB");
expect(bytesToHumanReadable(123456)).toBe("123.46 KB");
expect(bytesToHumanReadable(1234567)).toBe("1.23 MB");
expect(bytesToHumanReadable(1234567890)).toBe("1.23 GB");
expect(bytesToHumanReadable(undefined)).toBe("0 Bytes");
});
});
describe("on Windows/other platforms (binary units)", () => {
beforeEach(() => {
mockIsMac.mockReturnValue(false);
});
it("outputs readable string using binary units", () => {
expect(bytesToHumanReadable(0)).toBe("0 Bytes");
expect(bytesToHumanReadable(0.0)).toBe("0 Bytes");
expect(bytesToHumanReadable(33)).toBe("33 Bytes");
expect(bytesToHumanReadable(500)).toBe("500 Bytes");
expect(bytesToHumanReadable(1000)).toBe("1000 Bytes");
expect(bytesToHumanReadable(1024)).toBe("1 KB");
expect(bytesToHumanReadable(1536)).toBe("1.5 KB");
expect(bytesToHumanReadable(15360)).toBe("15 KB");
expect(bytesToHumanReadable(12345)).toBe("12.06 KB");
expect(bytesToHumanReadable(126464)).toBe("123.5 KB");
expect(bytesToHumanReadable(1048576)).toBe("1 MB");
expect(bytesToHumanReadable(1073741824)).toBe("1 GB");
expect(bytesToHumanReadable(undefined)).toBe("0 Bytes");
});
});
describe("platform-specific behavior for issue #10085", () => {
const fileSize = 91435827; // 87.2MB in binary, ~91.44MB in decimal
it("displays correctly on macOS (decimal)", () => {
mockIsMac.mockReturnValue(true);
expect(bytesToHumanReadable(fileSize)).toBe("91.44 MB");
});
it("displays correctly on Windows (binary)", () => {
mockIsMac.mockReturnValue(false);
expect(bytesToHumanReadable(fileSize)).toBe("87.2 MB");
});
});
});
describe("getFileNameFromUrl", () => {
it("returns the filename from a URL", () => {
expect(getFileNameFromUrl("https://example.com/file")).toBe("file");
expect(getFileNameFromUrl("https://example.com/file.txt")).toBe("file.txt");
expect(
getFileNameFromUrl("https://example.com/file.txt?query=string")
).toBe("file.txt");
expect(getFileNameFromUrl("https://example.com/file.txt#hash")).toBe(
"file.txt"
);
expect(
getFileNameFromUrl("https://example.com/file.txt?query=string#hash")
).toBe("file.txt");
expect(getFileNameFromUrl("https://example.com/")).toBe("");
});
});