From d114613384599f69c6fe10bb3172ad9be7d086f3 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Thu, 12 Oct 2017 17:01:55 +0300 Subject: Add a regression test --- test/order_validation_test.ts | 36 ++++++++++++++++++++++++++++++++++++ test/utils/fill_scenarios.ts | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/order_validation_test.ts b/test/order_validation_test.ts index 6f9388a69..742739aaa 100644 --- a/test/order_validation_test.ts +++ b/test/order_validation_test.ts @@ -257,5 +257,41 @@ describe('OrderValidation', () => { ), ).to.be.true(); }); + it('should call exchangeTransferSimulator.transferFrom with correct values for an open order', async () => { + const makerFee = new BigNumber(2); + const takerFee = new BigNumber(2); + const signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync( + makerTokenAddress, takerTokenAddress, makerFee, takerFee, + makerAddress, ZeroEx.NULL_ADDRESS, fillableAmount, feeRecipient, + ); + await orderValidationUtils.validateFillOrderBalancesAllowancesThrowIfInvalidAsync( + exchangeTransferSimulator, signedOrder, fillableAmount, takerAddress, zrxTokenAddress, + ); + expect(transferFromAsync.callCount).to.be.equal(4); + expect( + transferFromAsync.getCall(0).calledWith( + makerTokenAddress, makerAddress, takerAddress, bigNumberMatch(fillableAmount), + TradeSide.Maker, TransferType.Trade, + ), + ).to.be.true(); + expect( + transferFromAsync.getCall(1).calledWith( + takerTokenAddress, takerAddress, makerAddress, bigNumberMatch(fillableAmount), + TradeSide.Taker, TransferType.Trade, + ), + ).to.be.true(); + expect( + transferFromAsync.getCall(2).calledWith( + zrxTokenAddress, makerAddress, feeRecipient, bigNumberMatch(makerFee), + TradeSide.Maker, TransferType.Fee, + ), + ).to.be.true(); + expect( + transferFromAsync.getCall(3).calledWith( + zrxTokenAddress, takerAddress, feeRecipient, bigNumberMatch(takerFee), + TradeSide.Taker, TransferType.Fee, + ), + ).to.be.true(); + }); }); }); diff --git a/test/utils/fill_scenarios.ts b/test/utils/fill_scenarios.ts index e305759f6..c399c7bf4 100644 --- a/test/utils/fill_scenarios.ts +++ b/test/utils/fill_scenarios.ts @@ -91,7 +91,7 @@ export class FillScenarios { } private async increaseBalanceAndAllowanceAsync( tokenAddress: string, address: string, amount: BigNumber.BigNumber): Promise { - if (amount.isZero()) { + if (amount.isZero() || address === ZeroEx.NULL_ADDRESS) { return; // noop } await Promise.all([ -- cgit v1.2.3 From 0eaca6c691d92a10b08c0e69306291aa8de06bfb Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 13 Oct 2017 12:52:59 +0300 Subject: Make logs fetching and sunscriptions more type-safe --- test/0x.js_test.ts | 6 +++--- test/exchange_wrapper_test.ts | 16 +++++++++------- test/token_wrapper_test.ts | 29 ++++++++++++++++------------- 3 files changed, 28 insertions(+), 23 deletions(-) (limited to 'test') diff --git a/test/0x.js_test.ts b/test/0x.js_test.ts index cc6b91e99..dd5dd19b1 100644 --- a/test/0x.js_test.ts +++ b/test/0x.js_test.ts @@ -4,7 +4,7 @@ import {chaiSetup} from './utils/chai_setup'; import 'mocha'; import * as BigNumber from 'bignumber.js'; import * as Sinon from 'sinon'; -import {ZeroEx, Order, ZeroExError, LogWithDecodedArgs} from '../src'; +import {ZeroEx, Order, ZeroExError, LogWithDecodedArgs, ApprovalContractEventArgs, TokenEvents} from '../src'; import {constants} from './utils/constants'; import {TokenUtils} from './utils/token_utils'; import {web3Factory} from './utils/web3_factory'; @@ -223,8 +223,8 @@ describe('ZeroEx library', () => { const proxyAddress = await zeroEx.proxy.getContractAddressAsync(); const txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(zrxTokenAddress, coinbase); const txReceiptWithDecodedLogs = await zeroEx.awaitTransactionMinedAsync(txHash); - const log = txReceiptWithDecodedLogs.logs[0] as LogWithDecodedArgs; - expect(log.event).to.be.equal('Approval'); + const log = txReceiptWithDecodedLogs.logs[0] as LogWithDecodedArgs; + expect(log.event).to.be.equal(TokenEvents.Approval); expect(log.args._owner).to.be.equal(coinbase); expect(log.args._spender).to.be.equal(proxyAddress); expect(log.args._value).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); diff --git a/test/exchange_wrapper_test.ts b/test/exchange_wrapper_test.ts index afc33f1f4..1bedfc4da 100644 --- a/test/exchange_wrapper_test.ts +++ b/test/exchange_wrapper_test.ts @@ -18,6 +18,7 @@ import { OrderCancellationRequest, OrderFillRequest, LogFillContractEventArgs, + LogCancelContractEventArgs, OrderFillOrKillRequest, LogEvent, } from '../src'; @@ -651,7 +652,7 @@ describe('ExchangeWrapper', () => { // Source: https://github.com/mochajs/mocha/issues/2407 it('Should receive the LogFill event when an order is filled', (done: DoneCallback) => { (async () => { - const callback = (logEvent: LogEvent) => { + const callback = (logEvent: LogEvent) => { expect(logEvent.event).to.be.equal(ExchangeEvents.LogFill); done(); }; @@ -665,7 +666,7 @@ describe('ExchangeWrapper', () => { }); it('Should receive the LogCancel event when an order is cancelled', (done: DoneCallback) => { (async () => { - const callback = (logEvent: LogEvent) => { + const callback = (logEvent: LogEvent) => { expect(logEvent.event).to.be.equal(ExchangeEvents.LogCancel); done(); }; @@ -677,7 +678,7 @@ describe('ExchangeWrapper', () => { }); it('Outstanding subscriptions are cancelled when zeroEx.setProviderAsync called', (done: DoneCallback) => { (async () => { - const callbackNeverToBeCalled = (logEvent: LogEvent) => { + const callbackNeverToBeCalled = (logEvent: LogEvent) => { done(new Error('Expected this subscription to have been cancelled')); }; await zeroEx.exchange.subscribeAsync( @@ -687,7 +688,7 @@ describe('ExchangeWrapper', () => { const newProvider = web3Factory.getRpcProvider(); await zeroEx.setProviderAsync(newProvider); - const callback = (logEvent: LogEvent) => { + const callback = (logEvent: LogEvent) => { expect(logEvent.event).to.be.equal(ExchangeEvents.LogFill); done(); }; @@ -701,7 +702,7 @@ describe('ExchangeWrapper', () => { }); it('Should cancel subscription when unsubscribe called', (done: DoneCallback) => { (async () => { - const callbackNeverToBeCalled = (logEvent: LogEvent) => { + const callbackNeverToBeCalled = (logEvent: LogEvent) => { done(new Error('Expected this subscription to have been cancelled')); }; const subscriptionToken = await zeroEx.exchange.subscribeAsync( @@ -811,11 +812,12 @@ describe('ExchangeWrapper', () => { const indexFilterValues = { maker: differentMakerAddress, }; - const logs = await zeroEx.exchange.getLogsAsync( + const logs = await zeroEx.exchange.getLogsAsync( eventName, subscriptionOpts, indexFilterValues, ); expect(logs).to.have.length(1); - expect(logs[0].args.maker).to.be.equal(differentMakerAddress); + const args = logs[0].args; + expect(args.maker).to.be.equal(differentMakerAddress); }); }); }); diff --git a/test/token_wrapper_test.ts b/test/token_wrapper_test.ts index 50f2db2ac..f1f6543b7 100644 --- a/test/token_wrapper_test.ts +++ b/test/token_wrapper_test.ts @@ -14,6 +14,7 @@ import { ContractEvent, TransferContractEventArgs, ApprovalContractEventArgs, + TokenContractEventArgs, LogWithDecodedArgs, LogEvent, } from '../src'; @@ -357,9 +358,9 @@ describe('TokenWrapper', () => { // Source: https://github.com/mochajs/mocha/issues/2407 it('Should receive the Transfer event when tokens are transfered', (done: DoneCallback) => { (async () => { - const callback = (logEvent: LogEvent) => { + const callback = (logEvent: LogEvent) => { expect(logEvent).to.not.be.undefined(); - const args = logEvent.args as any as TransferContractEventArgs; + const args = logEvent.args; expect(args._from).to.be.equal(coinbase); expect(args._to).to.be.equal(addressWithoutFunds); expect(args._value).to.be.bignumber.equal(transferAmount); @@ -372,9 +373,9 @@ describe('TokenWrapper', () => { }); it('Should receive the Approval event when allowance is being set', (done: DoneCallback) => { (async () => { - const callback = (logEvent: LogEvent) => { + const callback = (logEvent: LogEvent) => { expect(logEvent).to.not.be.undefined(); - const args = logEvent.args as any as ApprovalContractEventArgs; + const args = logEvent.args; expect(args._owner).to.be.equal(coinbase); expect(args._spender).to.be.equal(addressWithoutFunds); expect(args._value).to.be.bignumber.equal(allowanceAmount); @@ -387,13 +388,13 @@ describe('TokenWrapper', () => { }); it('Outstanding subscriptions are cancelled when zeroEx.setProviderAsync called', (done: DoneCallback) => { (async () => { - const callbackNeverToBeCalled = (logEvent: LogEvent) => { + const callbackNeverToBeCalled = (logEvent: LogEvent) => { done(new Error('Expected this subscription to have been cancelled')); }; zeroEx.token.subscribe( tokenAddress, TokenEvents.Transfer, indexFilterValues, callbackNeverToBeCalled, ); - const callbackToBeCalled = (logEvent: LogEvent) => { + const callbackToBeCalled = (logEvent: LogEvent) => { done(); }; const newProvider = web3Factory.getRpcProvider(); @@ -406,7 +407,7 @@ describe('TokenWrapper', () => { }); it('Should cancel subscription when unsubscribe called', (done: DoneCallback) => { (async () => { - const callbackNeverToBeCalled = (logEvent: LogEvent) => { + const callbackNeverToBeCalled = (logEvent: LogEvent) => { done(new Error('Expected this subscription to have been cancelled')); }; const subscriptionToken = zeroEx.token.subscribe( @@ -435,14 +436,15 @@ describe('TokenWrapper', () => { await zeroEx.awaitTransactionMinedAsync(txHash); const eventName = TokenEvents.Approval; const indexFilterValues = {}; - const logs = await zeroEx.token.getLogsAsync( + const logs = await zeroEx.token.getLogsAsync( tokenAddress, eventName, subscriptionOpts, indexFilterValues, ); expect(logs).to.have.length(1); + const args = logs[0].args; expect(logs[0].event).to.be.equal(eventName); - expect(logs[0].args._owner).to.be.equal(coinbase); - expect(logs[0].args._spender).to.be.equal(tokenTransferProxyAddress); - expect(logs[0].args._value).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); + expect(args._owner).to.be.equal(coinbase); + expect(args._spender).to.be.equal(tokenTransferProxyAddress); + expect(args._value).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); }); it('should only get the logs with the correct event name', async () => { txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(tokenAddress, coinbase); @@ -463,11 +465,12 @@ describe('TokenWrapper', () => { const indexFilterValues = { _owner: coinbase, }; - const logs = await zeroEx.token.getLogsAsync( + const logs = await zeroEx.token.getLogsAsync( tokenAddress, eventName, subscriptionOpts, indexFilterValues, ); expect(logs).to.have.length(1); - expect(logs[0].args._owner).to.be.equal(coinbase); + const args = logs[0].args; + expect(args._owner).to.be.equal(coinbase); }); }); }); -- cgit v1.2.3 From dde2268f9fad24ad8baee88eca7aef068d05c178 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 13 Oct 2017 13:03:00 +0300 Subject: Remove unused code --- test/ether_token_wrapper_test.ts | 1 - test/exchange_transfer_simulator_test.ts | 4 +--- test/exchange_wrapper_test.ts | 4 ---- test/order_validation_test.ts | 2 -- 4 files changed, 1 insertion(+), 10 deletions(-) (limited to 'test') diff --git a/test/ether_token_wrapper_test.ts b/test/ether_token_wrapper_test.ts index f50aac48b..389ec1619 100644 --- a/test/ether_token_wrapper_test.ts +++ b/test/ether_token_wrapper_test.ts @@ -3,7 +3,6 @@ import * as chai from 'chai'; import {chaiSetup} from './utils/chai_setup'; import * as Web3 from 'web3'; import * as BigNumber from 'bignumber.js'; -import promisify = require('es6-promisify'); import {web3Factory} from './utils/web3_factory'; import {ZeroEx, ZeroExError} from '../src'; import {BlockchainLifecycle} from './utils/blockchain_lifecycle'; diff --git a/test/exchange_transfer_simulator_test.ts b/test/exchange_transfer_simulator_test.ts index 6ad2c007c..ee24f4fe4 100644 --- a/test/exchange_transfer_simulator_test.ts +++ b/test/exchange_transfer_simulator_test.ts @@ -1,12 +1,10 @@ import * as chai from 'chai'; import * as BigNumber from 'bignumber.js'; -import * as Web3 from 'web3'; import {chaiSetup} from './utils/chai_setup'; import {web3Factory} from './utils/web3_factory'; -import {ZeroEx, SignedOrder, ExchangeContractErrs, Token} from '../src'; +import {ZeroEx, ExchangeContractErrs, Token} from '../src'; import {TradeSide, TransferType} from '../src/types'; import {BlockchainLifecycle} from './utils/blockchain_lifecycle'; -import {FillScenarios} from './utils/fill_scenarios'; import {ExchangeTransferSimulator} from '../src/utils/exchange_transfer_simulator'; chaiSetup.configure(); diff --git a/test/exchange_wrapper_test.ts b/test/exchange_wrapper_test.ts index 1bedfc4da..5f979ad76 100644 --- a/test/exchange_wrapper_test.ts +++ b/test/exchange_wrapper_test.ts @@ -3,8 +3,6 @@ import * as chai from 'chai'; import * as Web3 from 'web3'; import * as BigNumber from 'bignumber.js'; import {chaiSetup} from './utils/chai_setup'; -import ChaiBigNumber = require('chai-bignumber'); -import promisify = require('es6-promisify'); import {web3Factory} from './utils/web3_factory'; import {BlockchainLifecycle} from './utils/blockchain_lifecycle'; import { @@ -25,8 +23,6 @@ import { import {DoneCallback, BlockParamLiteral} from '../src/types'; import {FillScenarios} from './utils/fill_scenarios'; import {TokenUtils} from './utils/token_utils'; -import {assert} from '../src/utils/assert'; -import {TokenTransferProxyWrapper} from '../src/contract_wrappers/token_transfer_proxy_wrapper'; chaiSetup.configure(); const expect = chai.expect; diff --git a/test/order_validation_test.ts b/test/order_validation_test.ts index 742739aaa..784fa9ec4 100644 --- a/test/order_validation_test.ts +++ b/test/order_validation_test.ts @@ -1,7 +1,6 @@ import * as chai from 'chai'; import * as Web3 from 'web3'; import * as BigNumber from 'bignumber.js'; -import promisify = require('es6-promisify'); import * as Sinon from 'sinon'; import {chaiSetup} from './utils/chai_setup'; import {web3Factory} from './utils/web3_factory'; @@ -35,7 +34,6 @@ describe('OrderValidation', () => { let orderValidationUtils: OrderValidationUtils; const fillableAmount = new BigNumber(5); const fillTakerAmount = new BigNumber(5); - const shouldThrowOnInsufficientBalanceOrAllowance = false; before(async () => { web3 = web3Factory.create(); zeroEx = new ZeroEx(web3.currentProvider); -- cgit v1.2.3