@ledgerhq/coin-stellar
Version:
Ledger Stellar Coin integration
116 lines • 5.68 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const index_1 = require("./index");
const expect_1 = __importDefault(require("expect"));
const mockGetOperations = jest.fn();
jest.mock("../logic/listOperations", () => ({
listOperations: () => mockGetOperations(),
}));
const CUSTOM_FEES = 300n;
const estimateFeesMock = jest.fn(() => CUSTOM_FEES);
jest.mock("../logic/estimateFees", () => ({
estimateFees: () => estimateFeesMock(),
}));
const logicCraftTransactionMock = jest.fn((_account, _transaction) => {
return { xdr: undefined };
});
jest.mock("../logic/craftTransaction", () => ({
craftTransaction: (account, transaction) => logicCraftTransactionMock(account, transaction),
}));
const api = (0, index_1.createApi)({
explorer: {
url: "explorer.com",
fetchLimit: 200,
},
useStaticFees: true,
enableNetworkLogs: false,
});
const fromGenesis = { minHeight: 0 };
describe("operations", () => {
beforeEach(() => {
jest.clearAllMocks();
});
const mockOperation = {
asset: { type: "native" },
tx: {
hash: "e035a56c32003e3b0e4c9c5499b0750d71d98233ae6ae94323ff0a458b05a30b",
fees: 0.0291,
block: {
hash: "hash",
time: new Date("2024-03-20T10:00:00Z"),
height: 10,
},
date: new Date("2024-03-20T10:00:00Z"),
},
type: "Operation",
value: 200,
senders: ["addr"],
recipients: ["recipient"],
};
it("should return 0 operations for a valid account", async () => {
mockGetOperations.mockResolvedValue([[], ""]);
// When
const operations = await api.listOperations("addr", fromGenesis);
// Then
(0, expect_1.default)(operations).toEqual([[], ""]);
(0, expect_1.default)(mockGetOperations).toHaveBeenCalledTimes(1);
});
it("should return 1 operation for a valid account", async () => {
mockGetOperations.mockResolvedValue([[mockOperation], ""]);
// When
const operations = await api.listOperations("addr", fromGenesis);
// Then
(0, expect_1.default)(operations).toEqual([[mockOperation], ""]);
(0, expect_1.default)(mockGetOperations).toHaveBeenCalledTimes(1);
});
it("should call multiple times listOperations", async () => {
mockGetOperations
.mockResolvedValueOnce([[mockOperation], "10"])
.mockResolvedValueOnce([[mockOperation], ""]);
// When
const operations = await api.listOperations("addr", fromGenesis);
// Then
(0, expect_1.default)(operations).toEqual([[mockOperation, mockOperation], ""]);
(0, expect_1.default)(mockGetOperations).toHaveBeenCalledTimes(2);
});
});
describe("Testing craftTransaction function", () => {
beforeEach(() => {
estimateFeesMock.mockClear();
logicCraftTransactionMock.mockClear();
});
it("should use estimated fees when user does not provide them for crafting a transaction", async () => {
await api.craftTransaction({ asset: {} });
(0, expect_1.default)(estimateFeesMock).toHaveBeenCalledTimes(1);
(0, expect_1.default)(logicCraftTransactionMock).toHaveBeenCalledWith(expect_1.default.any(Object), expect_1.default.objectContaining({ fee: CUSTOM_FEES }));
});
it.each([[1n], [50n], [99n]])("should use custom user fees when user provide them for crafting a transaction", async (fees) => {
await api.craftTransaction({ asset: {} }, fees);
(0, expect_1.default)(estimateFeesMock).toHaveBeenCalledTimes(0);
(0, expect_1.default)(logicCraftTransactionMock).toHaveBeenCalledWith(expect_1.default.any(Object), expect_1.default.objectContaining({ fee: fees }));
});
});
describe("Testing transaction loading functions", () => {
it("should deserialize a transaction as expected", async () => {
const transactionPayloadXDR = "esM5l1ROMXXSZr0CJDmyLNsWUIwBFj8m5csqPhBFqXkAAAACAAAAAEFMhHdla/OhHE2CYrF1VVPnLgBThGuzpNFZyYMh" +
"8L6XAAAAZAAAJ/cAAAkYAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAABHRlc3QAAAABAAAAAAAAAAAAAAAA/QIumXyU" +
"+Nq3dDZfGCXjgxYI7uvPElz8zGb0gN+vWD8AAAAAAA9CQAAAAAA=";
const transactionEnvelopeXDR = "AAAAAgAAAABBTIR3ZWvzoRxNgmKxdVVT5y4AU4Rrs6TRWcmDIfC+lwAAAGQAACf3AAAJGAAAAAEAAAAAAAAAAAAAAAAA" +
"AAAAAAAAAQAAAAR0ZXN0AAAAAQAAAAAAAAAAAAAAAP0CLpl8lPjat3Q2Xxgl44MWCO7rzxJc/Mxm9IDfr1g/AAAAAAAP" +
"QkAAAAAAAAAAAA==";
const txFromSignaturePayload = (0, index_1.envelopeFromAnyXDR)(transactionPayloadXDR, "base64");
const txFromEnvelope = (0, index_1.envelopeFromAnyXDR)(transactionEnvelopeXDR, "base64");
(0, expect_1.default)(txFromEnvelope).toEqual(txFromSignaturePayload);
(0, expect_1.default)(txFromEnvelope.toXDR("base64")).toEqual(transactionEnvelopeXDR);
(0, expect_1.default)(txFromSignaturePayload.toXDR("base64")).toEqual(transactionEnvelopeXDR);
});
it("throw expected error when deserializing an invalid transaction", async () => {
(0, expect_1.default)(() => (0, index_1.envelopeFromAnyXDR)("lulz", "base64")).toThrowError("Failed decoding transaction as an envelope (TypeError: XDR Read Error: attempt to read outside the boundary of" +
" the buffer) or as a signature base: (TypeError: XDR Read Error: attempt to read outside the boundary of the" +
" buffer)");
});
});
//# sourceMappingURL=index.test.js.map