UNPKG

@ledgerhq/coin-icon

Version:
169 lines 8.76 kB
"use strict"; 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