PHP WebShell

Текущая директория: /opt/BitGoJS/modules/account-lib/test/unit/coin/baseCoin

Просмотр файла: transactionBuilder.ts

import sinon from 'sinon';
import assert from 'assert';
import should from 'should';
import { TestTransactionBuilder } from '../../../resources/testTransactionBuilder';
import { TestTransaction } from '../../../resources/testTransaction';

describe('Transaction builder', () => {
  let txBuilder;
  let sandbox: sinon.SinonSandbox;

  beforeEach(() => {
    sandbox = sinon.createSandbox();
    txBuilder = new TestTransactionBuilder();
  });

  afterEach(() => {
    sandbox.restore();
  });

  it('should sign a transaction that is valid', () => {
    const testTx = sinon.createStubInstance(TestTransaction);
    testTx.canSign.returns(true);
    const validateKey = sinon.spy(txBuilder, 'validateKey');

    txBuilder.from(testTx);
    txBuilder.sign({ key: 'validKey' });

    sandbox.assert.calledOnce(validateKey);
  });

  it('should sign a transaction with an invalid signature', () => {
    const testTx = sinon.createStubInstance(TestTransaction);
    testTx.canSign.returns(false);
    const validateKey = sinon.spy(txBuilder, 'validateKey');

    txBuilder.from(testTx);
    assert.throws(() => txBuilder.sign({ key: 'invalidKey' }));

    sandbox.assert.calledOnce(validateKey);
  });

  it('should parse a valid transaction', () => {
    const testTx = sinon.createStubInstance(TestTransaction);
    testTx.canSign.returns(true);
    const validateRawTransaction = sinon.spy(txBuilder, 'validateRawTransaction');
    const fromImplementation = sinon.spy(txBuilder, 'fromImplementation');

    txBuilder.from(testTx);

    sandbox.assert.calledOnce(validateRawTransaction);
    sandbox.assert.calledOnce(fromImplementation);
  });

  it('should build a valid transaction', () => {
    const testTx = sinon.createStubInstance(TestTransaction);
    testTx.canSign.returns(true);
    const validateTransaction = sinon.spy(txBuilder, 'validateTransaction');
    const buildImplementation = sinon.spy(txBuilder, 'buildImplementation');

    txBuilder.from(testTx);
    txBuilder.build();

    sandbox.assert.calledOnce(validateTransaction);
    sandbox.assert.calledOnce(buildImplementation);
  });

  it('should verify validity window params', () => {
    const testTx = sinon.createStubInstance(TestTransaction);
    testTx.canSign.returns(true);
    txBuilder.from(testTx);
    txBuilder.build();
    let validityWindow;

    let params = {};
    should(() => txBuilder.getValidityWindow(params)).throwError(
      'Unit parameter must be specified as blockheight or timestamp',
    );

    params = {
      unit: 'wrongUnit',
    };
    should(() => txBuilder.getValidityWindow(params)).throwError(
      'Unit parameter must be specified as blockheight or timestamp',
    );

    params = {
      firstValid: 10,
      lastValid: 23,
      minDuration: 10,
      maxDuration: 20,
      unit: '',
    };
    should(() => txBuilder.getValidityWindow(params)).throwError(
      'Unit parameter must be specified as blockheight or timestamp',
    );

    params = {
      firstValid: 10,
      lastValid: 23,
      minDuration: 10,
      maxDuration: 5,
      unit: 'blockheight',
    };
    should(() => txBuilder.getValidityWindow(params)).throwError(
      `Expected maxDuration (5) to be grather than minDuration (10)`,
    );

    params = {
      firstValid: 10,
      lastValid: 11,
      minDuration: 10,
      maxDuration: 20,
      unit: 'timestamp',
    };
    validityWindow = txBuilder.getValidityWindow(params);
    validityWindow.should.have.properties(['firstValid', 'lastValid', 'minDuration', 'maxDuration', 'unit']);
    validityWindow.firstValid.should.be.equal(10);
    validityWindow.lastValid.should.be.equal(30);
    validityWindow.minDuration.should.be.equal(10);
    validityWindow.maxDuration.should.be.equal(20);
    validityWindow.unit.should.be.equal('timestamp');

    params = {
      firstValid: 10,
      lastValid: 23,
      minDuration: 10,
      maxDuration: 11,
      unit: 'blockheight',
    };
    validityWindow = txBuilder.getValidityWindow(params);
    validityWindow.should.have.properties(['firstValid', 'lastValid', 'minDuration', 'maxDuration', 'unit']);
    validityWindow.firstValid.should.be.equal(10);
    validityWindow.lastValid.should.be.equal(21);
    validityWindow.minDuration.should.be.equal(10);
    validityWindow.maxDuration.should.be.equal(11);
    validityWindow.unit.should.be.equal('blockheight');

    params = {
      unit: 'timestamp',
    };
    const dateNow = Date.now();
    validityWindow = txBuilder.getValidityWindow(params);
    validityWindow.should.have.properties(['firstValid', 'lastValid', 'minDuration', 'maxDuration', 'unit']);
    validityWindow.firstValid.should.be.greaterThanOrEqual(dateNow);
    validityWindow.lastValid.should.be.equal(validityWindow.firstValid + 31536000000);
    validityWindow.minDuration.should.be.equal(0);
    validityWindow.maxDuration.should.be.equal(31536000000);
    validityWindow.unit.should.be.equal('timestamp');

    params = {
      unit: 'blockheight',
    };
    validityWindow = txBuilder.getValidityWindow(params);
    validityWindow.should.have.properties(['firstValid', 'lastValid', 'minDuration', 'maxDuration', 'unit']);
    validityWindow.firstValid.should.be.equal(0);
    validityWindow.lastValid.should.be.equal(1000000);
    validityWindow.minDuration.should.be.equal(0);
    validityWindow.maxDuration.should.be.equal(1000000);
    validityWindow.unit.should.be.equal('blockheight');
  });
});

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


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