@ledgerhq/coin-icon
Version:
Ledger Icon Coin integration
169 lines • 8.76 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const bignumber_js_1 = require("bignumber.js");
const errors_1 = require("@ledgerhq/errors");
const logic = __importStar(require("../../logic"));
const getTransactionStatus_1 = require("../../getTransactionStatus");
const TransactionStatus = __importStar(require("../../getTransactionStatus"));
const index_1 = require("@ledgerhq/coin-framework/currencies/index");
const errors_2 = require("../../errors");
jest.mock("../../logic");
jest.mock("../../api");
jest.mock("@ledgerhq/coin-framework/currencies/index");
const mockedLogic = jest.mocked(logic);
const mockedFormatCurrencyUnit = jest.mocked(index_1.formatCurrencyUnit);
describe("getSendTransactionStatus", () => {
let account;
let transaction;
beforeEach(() => {
account = {
spendableBalance: new bignumber_js_1.BigNumber(1000),
currency: {
name: "Icon",
units: [
{
code: "ICX",
name: "",
magnitude: 0,
},
],
},
iconResources: {
totalDelegated: new bignumber_js_1.BigNumber(0),
votingPower: new bignumber_js_1.BigNumber(0),
nonce: 0,
},
};
transaction = {
fees: new bignumber_js_1.BigNumber(10),
recipient: "test-recipient",
useAllAmount: false,
};
mockedLogic.calculateAmount.mockReturnValue(new bignumber_js_1.BigNumber(100));
mockedLogic.getMinimumBalance.mockReturnValue(new bignumber_js_1.BigNumber(50));
mockedLogic.isSelfTransaction.mockReturnValue(false);
mockedLogic.isValidAddress.mockReturnValue(true);
mockedFormatCurrencyUnit.mockReturnValue("1 ICX");
});
it("should return FeeNotLoaded error if fees are not loaded", async () => {
transaction.fees = null;
const result = await (0, getTransactionStatus_1.getSendTransactionStatus)(account, transaction);
expect(result.errors.fees).toBeInstanceOf(errors_1.FeeNotLoaded);
});
it("should return RecipientRequired error if recipient is missing", async () => {
transaction.recipient = "";
const result = await (0, getTransactionStatus_1.getSendTransactionStatus)(account, transaction);
expect(result.errors.recipient).toBeInstanceOf(errors_1.RecipientRequired);
});
it("should return InvalidAddressBecauseDestinationIsAlsoSource error if recipient is the same as source", async () => {
mockedLogic.isSelfTransaction.mockReturnValue(true);
const result = await (0, getTransactionStatus_1.getSendTransactionStatus)(account, transaction);
expect(result.errors.recipient).toBeInstanceOf(errors_1.InvalidAddressBecauseDestinationIsAlsoSource);
});
it("should return InvalidAddress error if recipient is invalid", async () => {
mockedLogic.isValidAddress.mockReturnValue(false);
const result = await (0, getTransactionStatus_1.getSendTransactionStatus)(account, transaction);
expect(result.errors.recipient).toBeInstanceOf(errors_1.InvalidAddress);
});
it("should return AmountRequired error if amount is less than or equal to zero", async () => {
mockedLogic.calculateAmount.mockReturnValue(new bignumber_js_1.BigNumber(0));
const result = await (0, getTransactionStatus_1.getSendTransactionStatus)(account, transaction);
expect(result.errors.amount).toBeInstanceOf(errors_1.AmountRequired);
});
it("should return NotEnoughBalance error if total spent exceeds spendable balance", async () => {
account.spendableBalance = new bignumber_js_1.BigNumber(50);
const result = await (0, getTransactionStatus_1.getSendTransactionStatus)(account, transaction);
expect(result.errors.amount).toBeInstanceOf(errors_1.NotEnoughBalance);
});
it("should return proper TransactionStatus when everything is valid", async () => {
const result = await (0, getTransactionStatus_1.getSendTransactionStatus)(account, transaction);
expect(result.errors).toEqual({});
expect(result.warnings).toEqual({});
expect(result.estimatedFees).toEqual(transaction.fees);
expect(result.amount).toEqual(new bignumber_js_1.BigNumber(100));
expect(result.totalSpent).toEqual(new bignumber_js_1.BigNumber(110));
});
it("should return IconDoMaxSendInstead error if leftover balance is less than minimumBalanceExistential but greater than zero", async () => {
account.spendableBalance = new bignumber_js_1.BigNumber(120);
const result = await (0, getTransactionStatus_1.getSendTransactionStatus)(account, transaction);
expect(result.errors.amount).toBeInstanceOf(errors_2.IconDoMaxSendInstead);
expect(result.errors.amount.message).toBe("Balance cannot be below {{minimumBalance}}. Send max to empty account.");
});
});
describe("getTransactionStatus", () => {
let account;
let transaction;
beforeEach(() => {
account = {
spendableBalance: new bignumber_js_1.BigNumber(1000),
currency: { name: "ICON", units: [{ code: "ICX" }] },
};
transaction = {
fees: new bignumber_js_1.BigNumber(10),
mode: "send",
useAllAmount: false,
};
mockedLogic.calculateAmount.mockReturnValue(new bignumber_js_1.BigNumber(100));
});
it("should delegate to getSendTransactionStatus for send mode", async () => {
const sendTransactionStatus = {
errors: {},
warnings: {},
estimatedFees: new bignumber_js_1.BigNumber(10),
amount: new bignumber_js_1.BigNumber(100),
totalSpent: new bignumber_js_1.BigNumber(110),
};
jest
.spyOn(TransactionStatus, "getSendTransactionStatus")
.mockResolvedValue(sendTransactionStatus);
const result = await (0, getTransactionStatus_1.getTransactionStatus)(account, transaction);
expect(result).toEqual(sendTransactionStatus);
});
it("should handle default case correctly", async () => {
transaction.mode = "other";
const result = await (0, getTransactionStatus_1.getTransactionStatus)(account, transaction);
expect(result.errors).toEqual({});
expect(result.warnings).toEqual({});
expect(result.estimatedFees).toEqual(transaction.fees);
expect(result.amount).toEqual(new bignumber_js_1.BigNumber(100));
expect(result.totalSpent).toEqual(new bignumber_js_1.BigNumber(110));
});
it("should return NotEnoughBalance error if totalSpent is greater than spendableBalance", async () => {
transaction.mode = "";
mockedLogic.calculateAmount.mockReturnValue(new bignumber_js_1.BigNumber(1000));
transaction.fees = new bignumber_js_1.BigNumber(100);
const result = await (0, getTransactionStatus_1.getTransactionStatus)(account, transaction);
expect(result.errors.amount).toBeInstanceOf(errors_1.NotEnoughBalance);
});
it("should return AmountRequired error if amount is less than or equal to zero and useAllAmount is false", async () => {
transaction.mode = "";
mockedLogic.calculateAmount.mockReturnValue(new bignumber_js_1.BigNumber(0));
transaction.useAllAmount = false;
const result = await (0, getTransactionStatus_1.getTransactionStatus)(account, transaction);
expect(result.errors.amount).toBeInstanceOf(errors_1.AmountRequired);
});
});
//# sourceMappingURL=getTransactionStatus.unit.test.js.map