stellar-plus
Version:
beta version of stellar-plus, an all-in-one sdk for the Stellar blockchain
198 lines (197 loc) • 13.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const build_transaction_1 = require("../../../../stellar-plus/core/pipelines/build-transaction");
const classic_sign_requirements_1 = require("../../../../stellar-plus/core/pipelines/classic-sign-requirements");
const classic_transaction_1 = require("../../../../stellar-plus/core/pipelines/classic-transaction");
const types_1 = require("../../../../stellar-plus/core/pipelines/classic-transaction/types");
const sign_transaction_1 = require("../../../../stellar-plus/core/pipelines/sign-transaction");
const submit_transaction_1 = require("../../../../stellar-plus/core/pipelines/submit-transaction");
const network_1 = require("../../../../stellar-plus/network");
const channel_accounts_1 = require("../../../../stellar-plus/utils/pipeline/plugins/classic-transaction/channel-accounts");
const debug_1 = require("../../../../stellar-plus/utils/pipeline/plugins/generic/debug");
const fee_bump_1 = require("../../../../stellar-plus/utils/pipeline/plugins/submit-transaction/fee-bump");
jest.mock('stellar-plus/core/pipelines/build-transaction', () => ({
BuildTransactionPipeline: jest.fn().mockImplementation(() => ({
execute: jest.fn(),
})),
}));
jest.mock('stellar-plus/core/pipelines/classic-sign-requirements', () => ({
ClassicSignRequirementsPipeline: jest.fn().mockImplementation(() => ({
execute: jest.fn(),
})),
}));
jest.mock('stellar-plus/core/pipelines/sign-transaction', () => ({
SignTransactionPipeline: jest.fn().mockImplementation(() => ({
execute: jest.fn(),
})),
}));
jest.mock('stellar-plus/core/pipelines/submit-transaction', () => ({
SubmitTransactionPipeline: jest.fn().mockImplementation(() => ({
execute: jest.fn(),
})),
}));
const MOCKED_BUILD_TRANSACTION_PIPELINE = build_transaction_1.BuildTransactionPipeline;
const MOCKED_CLASSIC_SIGN_REQUIREMENTS_PIPELINE = classic_sign_requirements_1.ClassicSignRequirementsPipeline;
const MOCKED_SIGN_TRANSACTION_PIPELINE = sign_transaction_1.SignTransactionPipeline;
const MOCKED_SUBMIT_TRANSACTION_PIPELINE = submit_transaction_1.SubmitTransactionPipeline;
const MOCKED_PLUGIN_BASE = {
preProcess: jest.fn(),
postProcess: jest.fn(),
};
const MOCKED_BUILD_TRANSACTION_PLUGIN = jest.mocked(Object.assign(Object.assign({}, MOCKED_PLUGIN_BASE), { type: 'BuildTransactionPipeline' }));
const MOCKED_CLASSIC_SIGN_REQUIREMENTS_PLUGIN = jest.mocked(Object.assign(Object.assign({}, MOCKED_PLUGIN_BASE), { type: 'ClassicSignRequirementsPipeline' }));
const MOCKED_SIGN_TRANSACTION_PLUGIN = jest.mocked(Object.assign(Object.assign({}, MOCKED_PLUGIN_BASE), { type: 'SignTransactionPipeline' }));
const MOCKED_SUBMIT_TRANSACTION_PLUGIN = jest.mocked(Object.assign(Object.assign({}, MOCKED_PLUGIN_BASE), { type: 'SubmitTransactionPipeline' }));
const TESTNET_NETWORK_CONFIG = (0, network_1.TestNet)();
const MOCKED_TX_INVOCATION = {
header: {
source: 'GACF23GKVFTU77K6W6PWSVN7YBM63UHDULILIEXJO6FR4YKMJ7FW3DTI',
fee: '100',
timeout: 100,
},
signers: [],
};
const MOCKED_PIPELINE_ITEM = {
operations: [],
txInvocation: MOCKED_TX_INVOCATION,
};
describe('Classic Transaction Pipeline', () => {
describe('Initialize', () => {
it('should initialize the Classic Transaction Pipeline', () => {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG);
expect(pipeline).toBeInstanceOf(classic_transaction_1.ClassicTransactionPipeline);
expect(pipeline.type).toEqual(types_1.ClassicTransactionPipelineType.id);
});
it('should initialize the Classic Transaction Pipeline with no plugins', () => {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG, {
plugins: [],
});
expect(pipeline).toBeInstanceOf(classic_transaction_1.ClassicTransactionPipeline);
expect(pipeline.type).toEqual(types_1.ClassicTransactionPipelineType.id);
});
it('should initialize the Classic Transaction Pipeline with generic plugins', () => {
const debugPlugin = new debug_1.DebugPlugin('error');
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG, {
plugins: [debugPlugin],
});
expect(pipeline).toBeInstanceOf(classic_transaction_1.ClassicTransactionPipeline);
expect(pipeline.type).toEqual(types_1.ClassicTransactionPipelineType.id);
});
it('should initialize the Classic Transaction Pipeline with classic transaction pipeline plugins', () => {
const channelAccountsPlugin = new channel_accounts_1.ClassicChannelAccountsPlugin({ channels: [] });
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG, {
plugins: [channelAccountsPlugin],
});
expect(pipeline).toBeInstanceOf(classic_transaction_1.ClassicTransactionPipeline);
expect(pipeline.type).toEqual(types_1.ClassicTransactionPipelineType.id);
});
it('should initialize the Classic Transaction Pipeline with classic transaction internal pipelines plugins', () => {
const feeBumpWrapperPlugin = new fee_bump_1.FeeBumpWrapperPlugin(MOCKED_TX_INVOCATION);
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG, {
plugins: [feeBumpWrapperPlugin],
});
expect(pipeline).toBeInstanceOf(classic_transaction_1.ClassicTransactionPipeline);
expect(pipeline.type).toEqual(types_1.ClassicTransactionPipelineType.id);
});
it('should initialize the Classic Transaction Pipeline with multiple plugin types', () => {
const debugPlugin = new debug_1.DebugPlugin('error');
const feeBumpWrapperPlugin = new fee_bump_1.FeeBumpWrapperPlugin(MOCKED_TX_INVOCATION);
const channelAccountsPlugin = new channel_accounts_1.ClassicChannelAccountsPlugin({ channels: [] });
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG, {
plugins: [debugPlugin, feeBumpWrapperPlugin, channelAccountsPlugin],
});
expect(pipeline).toBeInstanceOf(classic_transaction_1.ClassicTransactionPipeline);
expect(pipeline.type).toEqual(types_1.ClassicTransactionPipelineType.id);
});
it('should initialize the Classic Transaction Pipeline with build transaction pipeline plugins', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG, {
plugins: [MOCKED_BUILD_TRANSACTION_PLUGIN],
});
yield pipeline.execute(MOCKED_PIPELINE_ITEM);
expect(MOCKED_BUILD_TRANSACTION_PIPELINE).toHaveBeenCalledWith([MOCKED_BUILD_TRANSACTION_PLUGIN]);
}));
it('should initialize the Classic Transaction Pipeline with classic sign requirements pipeline plugins', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG, {
plugins: [MOCKED_CLASSIC_SIGN_REQUIREMENTS_PLUGIN],
});
yield pipeline.execute(MOCKED_PIPELINE_ITEM);
expect(MOCKED_CLASSIC_SIGN_REQUIREMENTS_PIPELINE).toHaveBeenCalledWith([MOCKED_CLASSIC_SIGN_REQUIREMENTS_PLUGIN]);
}));
it('should initialize the Classic Transaction Pipeline with sign transaction pipeline plugins', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG, {
plugins: [MOCKED_SIGN_TRANSACTION_PLUGIN],
});
yield pipeline.execute(MOCKED_PIPELINE_ITEM);
expect(MOCKED_SIGN_TRANSACTION_PIPELINE).toHaveBeenCalledWith([MOCKED_SIGN_TRANSACTION_PLUGIN]);
}));
it('should initialize the Classic Transaction Pipeline with submit transaction pipeline plugins', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG, {
plugins: [MOCKED_SUBMIT_TRANSACTION_PLUGIN],
});
yield pipeline.execute(MOCKED_PIPELINE_ITEM);
expect(MOCKED_SUBMIT_TRANSACTION_PIPELINE).toHaveBeenCalledWith([MOCKED_SUBMIT_TRANSACTION_PLUGIN]);
}));
});
describe('Core functionalities', () => {
beforeEach(() => {
jest.clearAllMocks();
});
it('should execute each internal transaction pipeline once', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG);
yield pipeline.execute(MOCKED_PIPELINE_ITEM);
expect(MOCKED_BUILD_TRANSACTION_PIPELINE).toHaveBeenCalledOnce();
expect(MOCKED_CLASSIC_SIGN_REQUIREMENTS_PIPELINE).toHaveBeenCalledOnce();
expect(MOCKED_SIGN_TRANSACTION_PIPELINE).toHaveBeenCalledOnce();
expect(MOCKED_SUBMIT_TRANSACTION_PIPELINE).toHaveBeenCalledOnce();
}));
it('should execute each internal transaction pipeline in order', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG);
yield pipeline.execute(MOCKED_PIPELINE_ITEM);
expect(MOCKED_CLASSIC_SIGN_REQUIREMENTS_PIPELINE).toHaveBeenCalledAfter(MOCKED_BUILD_TRANSACTION_PIPELINE);
expect(MOCKED_SIGN_TRANSACTION_PIPELINE).toHaveBeenCalledAfter(MOCKED_CLASSIC_SIGN_REQUIREMENTS_PIPELINE);
expect(MOCKED_SUBMIT_TRANSACTION_PIPELINE).toHaveBeenCalledAfter(MOCKED_SIGN_TRANSACTION_PIPELINE);
}));
});
it('should process the Input into an Output', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
MOCKED_SUBMIT_TRANSACTION_PIPELINE.mockImplementationOnce(() => ({
execute: jest.fn().mockResolvedValueOnce('output'),
}));
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const processSpy = jest.spyOn(pipeline, 'process');
const result = yield pipeline.execute(MOCKED_PIPELINE_ITEM, '0');
expect(processSpy).toHaveBeenCalledOnce();
expect(processSpy).toHaveBeenCalledWith(MOCKED_PIPELINE_ITEM, '0');
expect(processSpy).toHaveBeenCalledExactlyOnceWith(MOCKED_PIPELINE_ITEM, '0');
expect(result).toEqual('output');
}));
it('should accept build transaction pipeline execution plugins', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG);
const executionPlugins = [MOCKED_BUILD_TRANSACTION_PLUGIN];
const MOCKED_ITEM_WITH_PLUGINS = Object.assign(Object.assign({}, MOCKED_PIPELINE_ITEM), { options: { executionPlugins } });
yield pipeline.execute(MOCKED_ITEM_WITH_PLUGINS);
expect(MOCKED_BUILD_TRANSACTION_PIPELINE).toHaveBeenCalledWith([MOCKED_BUILD_TRANSACTION_PLUGIN]);
}));
it('should accept classic sign requirements pipeline execution plugins', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG);
const executionPlugins = [MOCKED_CLASSIC_SIGN_REQUIREMENTS_PLUGIN];
const MOCKED_ITEM_WITH_PLUGINS = Object.assign(Object.assign({}, MOCKED_PIPELINE_ITEM), { options: { executionPlugins } });
yield pipeline.execute(MOCKED_ITEM_WITH_PLUGINS);
expect(MOCKED_CLASSIC_SIGN_REQUIREMENTS_PIPELINE).toHaveBeenCalledWith([MOCKED_CLASSIC_SIGN_REQUIREMENTS_PLUGIN]);
}));
it('should accept sign transaction pipeline execution plugins', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG);
const executionPlugins = [MOCKED_SIGN_TRANSACTION_PLUGIN];
const MOCKED_ITEM_WITH_PLUGINS = Object.assign(Object.assign({}, MOCKED_PIPELINE_ITEM), { options: { executionPlugins } });
yield pipeline.execute(MOCKED_ITEM_WITH_PLUGINS);
expect(MOCKED_SIGN_TRANSACTION_PIPELINE).toHaveBeenCalledWith([MOCKED_SIGN_TRANSACTION_PLUGIN]);
}));
it('should accept submit transaction pipeline execution plugins', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const pipeline = new classic_transaction_1.ClassicTransactionPipeline(TESTNET_NETWORK_CONFIG);
const executionPlugins = [MOCKED_SUBMIT_TRANSACTION_PLUGIN];
const MOCKED_ITEM_WITH_PLUGINS = Object.assign(Object.assign({}, MOCKED_PIPELINE_ITEM), { options: { executionPlugins } });
yield pipeline.execute(MOCKED_ITEM_WITH_PLUGINS);
expect(MOCKED_SUBMIT_TRANSACTION_PIPELINE).toHaveBeenCalledWith([MOCKED_SUBMIT_TRANSACTION_PLUGIN]);
}));
});