@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
170 lines (149 loc) • 4.97 kB
text/typescript
import { BigNumber } from "bignumber.js";
import {
formatAmountForInput,
formatFiatForInput,
processRawInput,
processFiatInput,
calculateFiatEquivalent,
shouldSyncInput,
} from "../amountInput";
const mockUnit = {
code: "BTC",
name: "bitcoin",
magnitude: 8,
symbol: "₿",
};
const mockFiatUnit = {
code: "USD",
name: "US Dollar",
magnitude: 2,
symbol: "$",
};
describe("amountInput utils", () => {
describe("formatAmountForInput", () => {
it("returns empty string for zero amount", () => {
expect(formatAmountForInput(mockUnit, new BigNumber(0), "en-US")).toBe("");
});
it("formats non-zero amount without grouping", () => {
// formatCurrencyUnit expects atomic values (sats for BTC)
const result = formatAmountForInput(mockUnit, new BigNumber("123456789"), "en-US");
expect(result).toBe("1.23456789");
});
});
describe("formatFiatForInput", () => {
it("returns empty string for zero amount", () => {
expect(formatFiatForInput(mockFiatUnit, new BigNumber(0), "en-US")).toBe("");
});
it("clamps and trims fiat amount", () => {
// formatCurrencyUnit expects atomic values (cents for USD)
const result = formatFiatForInput(mockFiatUnit, new BigNumber("123456"), "en-US");
expect(result).toBe("1234.56");
});
it("removes trailing zeros", () => {
// 100.00 USD
const result = formatFiatForInput(mockFiatUnit, new BigNumber("10000"), "en-US");
expect(result).toBe("100");
});
});
describe("processRawInput", () => {
it("processes valid input", () => {
const result = processRawInput("123.456", mockUnit, "en-US");
expect(result.value.toString()).toBe("12345600000");
expect(result.display).toBe("123.456");
});
it("handles empty input", () => {
const result = processRawInput("", mockUnit, "en-US");
expect(result.value.toString()).toBe("0");
expect(result.display).toBe("");
});
it("handles invalid input", () => {
const result = processRawInput("abc", mockUnit, "en-US");
expect(result.value.toString()).toBe("0");
});
});
describe("processFiatInput", () => {
it("processes and clamps fiat input", () => {
const result = processFiatInput("123.456", mockFiatUnit, "en-US");
expect(result.clampedDisplay).toBe("123.45");
expect(result.value.toString()).toBe("12345");
expect(typeof result.isOverLimit).toBe("boolean");
});
it("detects when input is within limit", () => {
const result = processFiatInput("123.45", mockFiatUnit, "en-US");
expect(result.clampedDisplay).toBe("123.45");
expect(result.isOverLimit).toBe(false);
});
});
describe("calculateFiatEquivalent", () => {
const mockCalculate = (amount: BigNumber) => amount.multipliedBy(50000);
it("uses direct calculation when available", () => {
const result = calculateFiatEquivalent({
amount: new BigNumber(1),
lastTransactionAmount: new BigNumber(0.5),
lastFiatAmount: new BigNumber(25000),
calculateFiatFromCrypto: mockCalculate,
});
expect(result?.toString()).toBe("50000");
});
it("uses ratio calculation when direct is null", () => {
const result = calculateFiatEquivalent({
amount: new BigNumber(1),
lastTransactionAmount: new BigNumber(0.5),
lastFiatAmount: new BigNumber(25000),
calculateFiatFromCrypto: () => null,
});
expect(result?.toString()).toBe("50000");
});
it("returns null when both methods fail", () => {
const result = calculateFiatEquivalent({
amount: new BigNumber(1),
lastTransactionAmount: new BigNumber(0),
lastFiatAmount: new BigNumber(0),
calculateFiatFromCrypto: () => null,
});
expect(result).toBeNull();
});
});
describe("shouldSyncInput", () => {
it("syncs on quick action", () => {
expect(
shouldSyncInput({
isQuickAction: true,
useAllAmountChanged: false,
isActiveInput: true,
hasInputValue: true,
}),
).toBe(true);
});
it("syncs when useAllAmount changed", () => {
expect(
shouldSyncInput({
isQuickAction: false,
useAllAmountChanged: true,
isActiveInput: true,
hasInputValue: true,
}),
).toBe(true);
});
it("does not sync when actively typing", () => {
expect(
shouldSyncInput({
isQuickAction: false,
useAllAmountChanged: false,
isActiveInput: true,
hasInputValue: true,
}),
).toBe(false);
});
it("syncs when not actively typing", () => {
expect(
shouldSyncInput({
isQuickAction: false,
useAllAmountChanged: false,
isActiveInput: false,
hasInputValue: false,
}),
).toBe(true);
});
});
});