PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/abstract-eth/dist/test/unit/messages

Просмотр файла: abstractEthMessageBuilderTests.js

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.testEthMessageBuilding = testEthMessageBuilding;
const sdk_core_1 = require("@bitgo/sdk-core");
const statics_1 = require("@bitgo/statics");
const src_1 = require("../../../src");
const should_1 = __importDefault(require("should"));
const coinConfig = statics_1.coins.get('eth');
function testEthMessageBuilding(testConfig) {
    const { messageType, messageBuilderClass, messageClass, test } = testConfig;
    describe(`${messageType} - Build Method`, () => {
        const factory = new src_1.MessageBuilderFactory(coinConfig);
        const { payload, metadata, signature, signer } = test.input;
        it('should initialize with the correct message type', () => {
            const builder = factory.getMessageBuilder(messageType);
            builder.should.be.instanceof(messageBuilderClass);
        });
        it('should build a valid message', async () => {
            const builder = factory.getMessageBuilder(messageType);
            builder.setPayload(payload).setMetadata(metadata || {});
            const builtMessage = await builder.build();
            builtMessage.getType().should.equal(messageType);
            builtMessage.getPayload().should.equal(payload);
            if (metadata) {
                should_1.default.deepEqual(builtMessage.getMetadata(), metadata);
            }
            else {
                should_1.default.deepEqual(builtMessage.getMetadata(), {});
            }
        });
        it('should throw an error when building without setting the payload', async () => {
            const builder = factory.getMessageBuilder(messageType);
            await builder.build().should.be.rejectedWith('Message payload must be set before building the message');
        });
        it('should include signers when building a message', async () => {
            const builder = factory.getMessageBuilder(messageType);
            builder.setPayload(payload);
            builder.addSigner(signer);
            const message = await builder.build();
            message.getSigners().should.containEql(signer);
        });
        it('should include signatures when building a message', async () => {
            const builder = factory.getMessageBuilder(messageType);
            builder.setPayload(payload);
            builder.addSignature(signature);
            const message = await builder.build();
            message.getSignatures().should.containEql(signature);
        });
        it('should override metadata.encoding with utf8', async () => {
            const builder = factory.getMessageBuilder(messageType);
            builder.setPayload(payload);
            builder.setMetadata({ encoding: 'hex', customData: 'test data' });
            const message = await builder.build();
            const metadata = message.getMetadata();
            (0, should_1.default)(metadata).not.be.undefined();
            (0, should_1.default)(metadata).have.property('encoding', 'utf8');
            (0, should_1.default)(metadata).have.property('customData', 'test data');
        });
    });
    describe(`${messageType} - From Broadcast Format`, () => {
        const factory = new src_1.MessageBuilderFactory(coinConfig);
        const { payload, signature, signer, metadata } = test.input;
        const broadcastMessage = {
            payload,
            type: messageType,
            serializedSignatures: (0, sdk_core_1.serializeSignatures)([signature]),
            signers: [signer],
            metadata: metadata,
        };
        it('should reconstruct a message from broadcast format', async () => {
            const builder = factory.getMessageBuilder(messageType);
            const message = await builder.fromBroadcastFormat(broadcastMessage);
            message.getType().should.equal(messageType);
            message.getPayload().should.equal(payload);
            message.getSignatures().should.containEql(signature);
            message.getSigners().should.containEql(signer);
            message.should.be.instanceof(messageClass);
            if (metadata) {
                should_1.default.deepEqual(message.getMetadata(), metadata);
            }
            else {
                should_1.default.deepEqual(message.getMetadata(), {});
            }
        });
        it('should throw an error for incorrect message type', async () => {
            const builder = factory.getMessageBuilder(messageType);
            const broadcastMessageWrongType = { ...broadcastMessage, type: sdk_core_1.MessageStandardType.UNKNOWN };
            await builder
                .fromBroadcastFormat(broadcastMessageWrongType)
                .should.be.rejectedWith(`Invalid message type, expected ${messageType}`);
        });
    });
    describe(`${messageType} - From Broadcast String`, () => {
        const { payload, signature, signer } = test.input;
        const broadcastHex = test.broadcastHex;
        it('should parse broadcastable string and return correct builder type', async () => {
            const factory = new src_1.MessageBuilderFactory(coinConfig);
            const builder = factory.fromBroadcastString(broadcastHex);
            const message = await builder.build();
            message.getType().should.equal(messageType);
            message.getPayload().should.equal(payload);
            message.getSignatures().should.containEql(signature);
            message.getSigners().should.containEql(signer);
        });
    });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFdGhNZXNzYWdlQnVpbGRlclRlc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L21lc3NhZ2VzL2Fic3RyYWN0RXRoTWVzc2FnZUJ1aWxkZXJUZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFBLHdEQW9IQztBQTVIRCw4Q0FBMkU7QUFDM0UsNENBQXVDO0FBQ3ZDLHNDQUFxRDtBQUNyRCxvREFBNEI7QUFHNUIsTUFBTSxVQUFVLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVwQyxTQUFnQixzQkFBc0IsQ0FBQyxVQUFxQztJQUMxRSxNQUFNLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFFNUUsUUFBUSxDQUFDLEdBQUcsV0FBVyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RCxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUU1RCxFQUFFLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1lBQ3pELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2RCxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM1QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkQsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMs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QUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUV0QyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRCxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1lc3NhZ2VTdGFuZGFyZFR5cGUsIHNlcmlhbGl6ZVNpZ25hdHVyZXMgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBNZXNzYWdlQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgTWVzc2FnZUJ1aWxkaW5nVGVzdENvbmZpZyB9IGZyb20gJy4vYWJzdHJhY3RFdGhNZXNzYWdlVGVzdFR5cGVzJztcblxuY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgnZXRoJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RXRoTWVzc2FnZUJ1aWxkaW5nKHRlc3RDb25maWc6IE1lc3NhZ2VCdWlsZGluZ1Rlc3RDb25maWcpOiB2b2lkIHtcbiAgY29uc3QgeyBtZXNzYWdlVHlwZSwgbWVzc2FnZUJ1aWxkZXJDbGFzcywgbWVzc2FnZUNsYXNzLCB0ZXN0IH0gPSB0ZXN0Q29uZmlnO1xuXG4gIGRlc2NyaWJlKGAke21lc3NhZ2VUeXBlfSAtIEJ1aWxkIE1ldGhvZGAsICgpID0+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IE1lc3NhZ2VCdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcbiAgICBjb25zdCB7IHBheWxvYWQsIG1ldGFkYXRhLCBzaWduYXR1cmUsIHNpZ25lciB9ID0gdGVzdC5pbnB1dDtcblxuICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB3aXRoIHRoZSBjb3JyZWN0IG1lc3NhZ2UgdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldE1lc3NhZ2VCdWlsZGVyKG1lc3NhZ2VUeXBlKTtcbiAgICAgIGJ1aWxkZXIuc2hvdWxkLmJlLmluc3RhbmNlb2YobWVzc2FnZUJ1aWxkZXJDbGFzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdmFsaWQgbWVzc2FnZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldE1lc3NhZ2VCdWlsZGVyKG1lc3NhZ2VUeXBlKTtcbiAgICAgIGJ1aWxkZXIuc2V0UGF5bG9hZChwYXlsb2FkKS5zZXRNZXRhZGF0YShtZXRhZGF0YSB8fCB7fSk7XG5cbiAgICAgIGNvbnN0IGJ1aWx0TWVzc2FnZSA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGJ1aWx0TWVzc2FnZS5nZXRUeXBlKCkuc2hvdWxkLmVxdWFsKG1lc3NhZ2VUeXBlKTtcbiAgICAgIGJ1aWx0TWVzc2FnZS5nZXRQYXlsb2FkKCkuc2hvdWxkLmVxdWFsKHBheWxvYWQpO1xuXG4gICAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChidWlsdE1lc3NhZ2UuZ2V0TWV0YWRhdGEoKSwgbWV0YWRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChidWlsdE1lc3NhZ2UuZ2V0TWV0YWRhdGEoKSwge30pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgc2V0dGluZyB0aGUgcGF5bG9hZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldE1lc3NhZ2VCdWlsZGVyKG1lc3NhZ2VUeXBlKTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdNZXNzYWdlIHBheWxvYWQgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSBtZXNzYWdlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgc2lnbmVycyB3aGVuIGJ1aWxkaW5nIGEgbWVzc2FnZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldE1lc3NhZ2VCdWlsZGVyKG1lc3NhZ2VUeXBlKTtcbiAgICAgIGJ1aWxkZXIuc2V0UGF5bG9hZChwYXlsb2FkKTtcbiAgICAgIGJ1aWxkZXIuYWRkU2lnbmVyKHNpZ25lcik7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBtZXNzYWdlLmdldFNpZ25lcnMoKS5zaG91bGQuY29udGFpbkVxbChzaWduZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIHNpZ25hdHVyZXMgd2hlbiBidWlsZGluZyBhIG1lc3NhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRNZXNzYWdlQnVpbGRlcihtZXNzYWdlVHlwZSk7XG4gICAgICBidWlsZGVyLnNldFBheWxvYWQocGF5bG9hZCk7XG4gICAgICBidWlsZGVyLmFkZFNpZ25hdHVyZShzaWduYXR1cmUpO1xuXG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgbWVzc2FnZS5nZXRTaWduYXR1cmVzKCkuc2hvdWxkLmNvbnRhaW5FcWwoc2lnbmF0dXJlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb3ZlcnJpZGUgbWV0YWRhdGEuZW5jb2Rpbmcgd2l0aCB1dGY4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0TWVzc2FnZUJ1aWxkZXIobWVzc2FnZVR5cGUpO1xuICAgICAgYnVpbGRlci5zZXRQYXlsb2FkKHBheWxvYWQpO1xuICAgICAgYnVpbGRlci5zZXRNZXRhZGF0YSh7IGVuY29kaW5nOiAnaGV4JywgY3VzdG9tRGF0YTogJ3Rlc3QgZGF0YScgfSk7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IG1lc3NhZ2UuZ2V0TWV0YWRhdGEoKTtcbiAgICAgIHNob3VsZChtZXRhZGF0YSkubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgc2hvdWxkKG1ldGFkYXRhKS5oYXZlLnByb3BlcnR5KCdlbmNvZGluZycsICd1dGY4Jyk7XG4gICAgICBzaG91bGQobWV0YWRhdGEpLmhhdmUucHJvcGVydHkoJ2N1c3RvbURhdGEnLCAndGVzdCBkYXRhJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKGAke21lc3NhZ2VUeXBlfSAtIEZyb20gQnJvYWRjYXN0IEZvcm1hdGAsICgpID0+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IE1lc3NhZ2VCdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcbiAgICBjb25zdCB7IHBheWxvYWQsIHNpZ25hdHVyZSwgc2lnbmVyLCBtZXRhZGF0YSB9ID0gdGVzdC5pbnB1dDtcblxuICAgIGNvbnN0IGJyb2FkY2FzdE1lc3NhZ2UgPSB7XG4gICAgICBwYXlsb2FkLFxuICAgICAgdHlwZTogbWVzc2FnZVR5cGUsXG4gICAgICBzZXJpYWxpemVkU2lnbmF0dXJlczogc2VyaWFsaXplU2lnbmF0dXJlcyhbc2lnbmF0dXJlXSksXG4gICAgICBzaWduZXJzOiBbc2lnbmVyXSxcbiAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvbnN0cnVjdCBhIG1lc3NhZ2UgZnJvbSBicm9hZGNhc3QgZm9ybWF0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0TWVzc2FnZUJ1aWxkZXIobWVzc2FnZVR5cGUpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IGJ1aWxkZXIuZnJvbUJyb2FkY2FzdEZvcm1hdChicm9hZGNhc3RNZXNzYWdlKTtcblxuICAgICAgbWVzc2FnZS5nZXRUeXBlKCkuc2hvdWxkLmVxdWFsKG1lc3NhZ2VUeXBlKTtcbiAgICAgIG1lc3NhZ2UuZ2V0UGF5bG9hZCgpLnNob3VsZC5lcXVhbChwYXlsb2FkKTtcbiAgICAgIG1lc3NhZ2UuZ2V0U2lnbmF0dXJlcygpLnNob3VsZC5jb250YWluRXFsKHNpZ25hdHVyZSk7XG4gICAgICBtZXNzYWdlLmdldFNpZ25lcnMoKS5zaG91bGQuY29udGFpbkVxbChzaWduZXIpO1xuICAgICAgbWVzc2FnZS5zaG91bGQuYmUuaW5zdGFuY2VvZihtZXNzYWdlQ2xhc3MpO1xuXG4gICAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChtZXNzYWdlLmdldE1ldGFkYXRhKCksIG1ldGFkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwobWVzc2FnZS5nZXRNZXRhZGF0YSgpLCB7fSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGZvciBpbmNvcnJlY3QgbWVzc2FnZSB0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0TWVzc2FnZUJ1aWxkZXIobWVzc2FnZVR5cGUpO1xuICAgICAgY29uc3QgYnJvYWRjYXN0TWVzc2FnZVdyb25nVHlwZSA9IHsgLi4uYnJvYWRjYXN0TWVzc2FnZSwgdHlwZTogTWVzc2FnZVN0YW5kYXJkVHlwZS5VTktOT1dOIH07XG4gICAgICBhd2FpdCBidWlsZGVyXG4gICAgICAgIC5mcm9tQnJvYWRjYXN0Rm9ybWF0KGJyb2FkY2FzdE1lc3NhZ2VXcm9uZ1R5cGUpXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKGBJbnZhbGlkIG1lc3NhZ2UgdHlwZSwgZXhwZWN0ZWQgJHttZXNzYWdlVHlwZX1gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoYCR7bWVzc2FnZVR5cGV9IC0gRnJvbSBCcm9hZGNhc3QgU3RyaW5nYCwgKCkgPT4ge1xuICAgIGNvbnN0IHsgcGF5bG9hZCwgc2lnbmF0dXJlLCBzaWduZXIgfSA9IHRlc3QuaW5wdXQ7XG4gICAgY29uc3QgYnJvYWRjYXN0SGV4ID0gdGVzdC5icm9hZGNhc3RIZXg7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIGJyb2FkY2FzdGFibGUgc3RyaW5nIGFuZCByZXR1cm4gY29ycmVjdCBidWlsZGVyIHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IE1lc3NhZ2VCdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmZyb21Ccm9hZGNhc3RTdHJpbmcoYnJvYWRjYXN0SGV4KTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIG1lc3NhZ2UuZ2V0VHlwZSgpLnNob3VsZC5lcXVhbChtZXNzYWdlVHlwZSk7XG4gICAgICBtZXNzYWdlLmdldFBheWxvYWQoKS5zaG91bGQuZXF1YWwocGF5bG9hZCk7XG4gICAgICBtZXNzYWdlLmdldFNpZ25hdHVyZXMoKS5zaG91bGQuY29udGFpbkVxbChzaWduYXR1cmUpO1xuICAgICAgbWVzc2FnZS5nZXRTaWduZXJzKCkuc2hvdWxkLmNvbnRhaW5FcWwoc2lnbmVyKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=

Выполнить команду


Для локальной разработки. Не используйте в интернете!