@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
109 lines (91 loc) • 3.62 kB
text/typescript
import { BigNumber } from "bignumber.js";
import { getMaxAvailable, isInsufficientFundsAmountError } from "../amountReview";
import type { TransactionStatus } from "../../../../../generated/types";
import { AccountLike } from "@ledgerhq/types-live";
function makeStatus(amountError?: { name: string }): TransactionStatus {
return {
errors: amountError ? { amount: amountError as Error } : {},
} as TransactionStatus;
}
describe("getMaxAvailable", () => {
it("returns 0 when account is null", () => {
expect(getMaxAvailable(null, new BigNumber(10)).toNumber()).toBe(0);
});
it("returns 0 when account is undefined", () => {
expect(getMaxAvailable(undefined, new BigNumber(10)).toNumber()).toBe(0);
});
it("returns balance minus fees when no spendableBalance", () => {
const account = {
balance: new BigNumber(100),
};
expect(getMaxAvailable(account as unknown as AccountLike, new BigNumber(10)).toNumber()).toBe(
90,
);
});
it("uses spendableBalance when present", () => {
const account = {
balance: new BigNumber(100),
spendableBalance: new BigNumber(80),
};
expect(getMaxAvailable(account as unknown as AccountLike, new BigNumber(5)).toNumber()).toBe(
75,
);
});
it("returns 0 when fees exceed balance", () => {
const account = {
balance: new BigNumber(10),
};
expect(getMaxAvailable(account as unknown as AccountLike, new BigNumber(20)).toNumber()).toBe(
0,
);
});
it("returns 0 when estimatedFees is zero and balance is zero", () => {
const account = {
balance: new BigNumber(0),
};
expect(getMaxAvailable(account as unknown as AccountLike, new BigNumber(0)).toNumber()).toBe(0);
});
});
describe("isInsufficientFundsAmountError", () => {
it("returns false when status has no amount error", () => {
expect(isInsufficientFundsAmountError(makeStatus())).toBe(false);
expect(isInsufficientFundsAmountError(makeStatus(undefined))).toBe(false);
});
it("returns true for NotEnoughBalance", () => {
expect(isInsufficientFundsAmountError(makeStatus({ name: "NotEnoughBalance" }))).toBe(true);
});
it("returns true for NotEnoughBalanceFees", () => {
expect(isInsufficientFundsAmountError(makeStatus({ name: "NotEnoughBalanceFees" }))).toBe(true);
});
it("returns true for NotEnoughBalanceSwap", () => {
expect(isInsufficientFundsAmountError(makeStatus({ name: "NotEnoughBalanceSwap" }))).toBe(true);
});
it("returns true for NotEnoughBalanceBecauseDestinationNotCreated", () => {
expect(
isInsufficientFundsAmountError(
makeStatus({ name: "NotEnoughBalanceBecauseDestinationNotCreated" }),
),
).toBe(true);
});
it("returns true for NotEnoughBalanceInParentAccount", () => {
expect(
isInsufficientFundsAmountError(makeStatus({ name: "NotEnoughBalanceInParentAccount" })),
).toBe(true);
});
it("returns true for NotEnoughBalanceToDelegate", () => {
expect(isInsufficientFundsAmountError(makeStatus({ name: "NotEnoughBalanceToDelegate" }))).toBe(
true,
);
});
it("returns true when error name includes Insufficient", () => {
expect(isInsufficientFundsAmountError(makeStatus({ name: "InsufficientLiquidity" }))).toBe(
true,
);
});
it("returns false for AmountRequired", () => {
expect(isInsufficientFundsAmountError(makeStatus({ name: "AmountRequired" }))).toBe(false);
});
it("returns false for other error names", () => {
expect(isInsufficientFundsAmountError(makeStatus({ name: "InvalidAddress" }))).toBe(false);
});
});