Files
frontend/src/shared/lib/display.test.ts
T
codex-bot 2b94a16ae5
Frontend verify / commits (push) Skipped
Frontend verify / security (push) Successful in 11s
Frontend verify / verify (push) Failing after 9m0s
refactor!: support RUB only (WealthLedger/main#55) (#168)
2026-11-11 09:36:29 +03:00

91 lines
3.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, it } from "vitest";
import {
formatDate,
formatMoney,
formatPercentagePoints,
formatSignedPercent,
formatSnapshotDay,
formatSnapshotTime,
instrumentLogoUrl,
} from "./display";
describe("shared display helpers", () => {
it("formats signed rates as percentages and percentage points without negative zero", () => {
expect(formatSignedPercent("0.151")).toBe("+15,1 %");
expect(formatSignedPercent("-0.15149")).toBe("−15,1 %");
expect(formatSignedPercent("0")).toBe("0,0 %");
expect(formatSignedPercent("-0.00049")).toBe("0,0 %");
expect(formatPercentagePoints("0.043")).toBe("+4,3 п.п.");
expect(formatPercentagePoints("-0.0435")).toBe("−4,4 п.п.");
});
it("uses padded Russian dates and preserves the UTC date of timestamps", () => {
expect(formatDate("2027-09-10")).toBe("10.09.2027");
expect(formatDate("2024-02-29")).toBe("29.02.2024");
expect(formatDate("2027-09-10T00:30:00+03:00")).toBe("09.09.2027");
});
it("formats snapshot time in the browser time zone", () => {
const instant = "2027-09-10T00:30:00+03:00";
const expected = new Intl.DateTimeFormat("ru-RU", {
dateStyle: "short",
timeStyle: "short",
}).format(new Date(instant));
expect(formatSnapshotTime(instant)).toBe(expected);
expect(formatSnapshotDay(instant)).toBe(
new Intl.DateTimeFormat("ru-RU", { dateStyle: "short" })
.format(new Date(instant)),
);
});
it("formats decimal strings without financial arithmetic", () => {
expect(formatMoney({ currency: "RUB", value: "-1234567.89" })).toBe(
"-1 234 567,89 ₽",
);
expect(formatMoney({ currency: "RUB", value: "10" })).toBe("10 ₽");
expect(formatMoney({ currency: "RUB", value: "0001234.50" })).toBe(
"0 001 234,50 ₽",
);
expect(
formatMoney({
currency: "RUB",
value: "123456789012345678901234567890.01",
}),
).toBe("123 456 789 012 345 678 901 234 567 890,01 ₽");
expect(
formatMoney({ currency: "RUB", value: "1.5" }, { withZeroCents: true }),
).toBe("1,50 ₽");
expect(formatMoney(null)).toBe("—");
expect(formatMoney(
{ currency: "RUB", value: "136900" },
{ withSign: true },
)).toBe("+136 900 ₽");
expect(formatMoney(
{ currency: "RUB", value: "-4200" },
{ withSign: true },
)).toBe("−4 200 ₽");
expect(formatMoney(
{ currency: "RUB", value: "-0.00" },
{ withSign: true },
)).toBe("0,00 ₽");
});
it("rounds to minor units and drops the sign of a rounded zero", () => {
const rounded = { withRoundedCents: true };
expect(formatMoney({ currency: "RUB", value: "-0.004" }, rounded)).toBe("0,00 ₽");
expect(formatMoney({ currency: "RUB", value: "-0.005" }, rounded)).toBe("-0,01 ₽");
expect(formatMoney({ currency: "RUB", value: "999.995" }, rounded)).toBe("1 000,00 ₽");
});
it("builds the brand logo url from an upstream file name", () => {
expect(instrumentLogoUrl("sber3.png")).toBe(
"https://invest-brands.cdn-tinkoff.ru/sber3x160.png",
);
expect(instrumentLogoUrl(" RU000A0JPNM1.png ")).toBe(
"https://invest-brands.cdn-tinkoff.ru/RU000A0JPNM1x160.png",
);
expect(instrumentLogoUrl(null)).toBeNull();
expect(instrumentLogoUrl(" ")).toBeNull();
});
});