From e01eadaecd58d0e10210acfc54e89bdf7cc76e52 Mon Sep 17 00:00:00 2001 From: Lawrence Forman Date: Sun, 28 Jul 2019 00:31:45 -0400 Subject: [PATCH] `@0x/contracts-exchange`: Add tests and run prettier. --- contracts/test-utils/src/index.ts | 2 +- contracts/test-utils/src/mocha_blockchain.ts | 98 ++++++++----------- contracts/test-utils/test/mocha_blockchain.ts | 93 ++++++++++++++++++ .../test/subtests/mocha_blockchain_1.ts | 10 ++ 4 files changed, 144 insertions(+), 59 deletions(-) create mode 100644 contracts/test-utils/test/mocha_blockchain.ts create mode 100644 contracts/test-utils/test/subtests/mocha_blockchain_1.ts diff --git a/contracts/test-utils/src/index.ts b/contracts/test-utils/src/index.ts index ce423d4517..caa36b10eb 100644 --- a/contracts/test-utils/src/index.ts +++ b/contracts/test-utils/src/index.ts @@ -45,5 +45,5 @@ export { Token, TransactionDataParams, } from './types'; -export { blockchainTests} from './mocha_blockchain'; +export { blockchainTests, BlockchainTestsEnvironment } from './mocha_blockchain'; export { chaiSetup, expect } from './chai_setup'; diff --git a/contracts/test-utils/src/mocha_blockchain.ts b/contracts/test-utils/src/mocha_blockchain.ts index f18d789486..68263c834a 100644 --- a/contracts/test-utils/src/mocha_blockchain.ts +++ b/contracts/test-utils/src/mocha_blockchain.ts @@ -79,15 +79,9 @@ function defineBlockchainSuite( callback: Mocha.BlockchainSuiteCallback, describeCall: Mocha.ContextDefinitionCallback, ): T { - return describeCall( - description, - function(this: Mocha.ISuiteCallbackContext): void { - callback.call( - this, - BlockchainTestsEnvironment.create(), - ); - }, - ); + return describeCall(description, function(this: Mocha.ISuiteCallbackContext): void { + callback.call(this, BlockchainTestsEnvironment.create()); + }); } function defineResetsSuite( @@ -95,22 +89,18 @@ function defineResetsSuite( callback: Mocha.SuiteCallback, describeCall: Mocha.ContextDefinitionCallback, ): T { - return describeCall( - description, - function(this: Mocha.ISuiteCallbackContext): void { - const env = BlockchainTestsEnvironment.getInstance(); - if (env !== undefined) { - const _blockchainLifecycle = env.blockchainLifecycle; - beforeEach(async () => { - return _blockchainLifecycle.startAsync(); - }); - afterEach(async () => { - return _blockchainLifecycle.revertAsync(); - }); - } - callback.call(this); - }, - ); + return describeCall(description, function(this: Mocha.ISuiteCallbackContext): void { + const env = BlockchainTestsEnvironment.getInstance(); + if (env !== undefined) { + beforeEach(async () => { + return env.blockchainLifecycle.startAsync(); + }); + afterEach(async () => { + return env.blockchainLifecycle.revertAsync(); + }); + } + callback.call(this); + }); } /** @@ -128,50 +118,42 @@ export const blockchainTests: Mocha.BlockchainContextDefinition = _.assign( return defineBlockchainSuite(description, callback, describe.skip); }, optional(description: string, callback: Mocha.BlockchainSuiteCallback): Mocha.ISuite | void { - return defineBlockchainSuite( - description, - callback, - process.env.TEST_ALL ? describe : describe.skip, - ); + return defineBlockchainSuite(description, callback, process.env.TEST_ALL ? describe : describe.skip); }, resets: _.assign( function(description: string, callback: Mocha.BlockchainSuiteCallback): Mocha.ISuite { - return defineBlockchainSuite( - description, - callback, - function(_description: string, _callback: Mocha.SuiteCallback): Mocha.ISuite { - return defineResetsSuite(_description, _callback, describe); - }, - ); + return defineBlockchainSuite(description, callback, function( + _description: string, + _callback: Mocha.SuiteCallback, + ): Mocha.ISuite { + return defineResetsSuite(_description, _callback, describe); + }); }, { only(description: string, callback: Mocha.BlockchainSuiteCallback): Mocha.ISuite { - return defineBlockchainSuite( - description, - callback, - function(_description: string, _callback: Mocha.SuiteCallback): Mocha.ISuite { - return defineResetsSuite(_description, _callback, describe.only); - }, - ); + return defineBlockchainSuite(description, callback, function( + _description: string, + _callback: Mocha.SuiteCallback, + ): Mocha.ISuite { + return defineResetsSuite(_description, _callback, describe.only); + }); }, skip(description: string, callback: Mocha.BlockchainSuiteCallback): void { - return defineBlockchainSuite( - description, - callback, - function(_description: string, _callback: Mocha.SuiteCallback): void { - return defineResetsSuite(_description, _callback, describe.skip); - }, - ); + return defineBlockchainSuite(description, callback, function( + _description: string, + _callback: Mocha.SuiteCallback, + ): void { + return defineResetsSuite(_description, _callback, describe.skip); + }); }, optional(description: string, callback: Mocha.BlockchainSuiteCallback): Mocha.ISuite | void { const describeCall = process.env.TEST_ALL ? describe : describe.skip; - return defineBlockchainSuite( - description, - callback, - function(_description: string, _callback: Mocha.SuiteCallback): Mocha.ISuite | void { - return defineResetsSuite(_description, _callback, describeCall); - }, - ); + return defineBlockchainSuite(description, callback, function( + _description: string, + _callback: Mocha.SuiteCallback, + ): Mocha.ISuite | void { + return defineResetsSuite(_description, _callback, describeCall); + }); }, }, ), diff --git a/contracts/test-utils/test/mocha_blockchain.ts b/contracts/test-utils/test/mocha_blockchain.ts new file mode 100644 index 0000000000..8514dc3d20 --- /dev/null +++ b/contracts/test-utils/test/mocha_blockchain.ts @@ -0,0 +1,93 @@ +import * as _ from 'lodash'; +import * as process from 'process'; + +import { blockchainTests, constants, expect } from '../src'; + +blockchainTests('mocha blockchain extensions', env => { + describe('blockchainTests()', () => { + it('passes a valid environment object', () => { + expect(env.blockchainLifecycle).to.exist(''); + expect(env.provider).to.exist(''); + expect(env.txDefaults).to.exist(''); + expect(env.web3Wrapper).to.exist(''); + // HACK(dorothy-zbornak): tslint seems to get confused by these assertions. + // tslint:disable: no-unbound-method + expect(typeof env.getChainIdAsync).to.eq('function'); + expect(typeof env.getAccountAddressesAsync).to.eq('function'); + // tslint:enable: no-unbound-method + }); + + it('initializes the test environment', async () => { + expect(await env.getChainIdAsync()).to.eq(constants.TESTRPC_NETWORK_ID); + expect(await env.getAccountAddressesAsync()).to.be.not.empty(''); + }); + + describe('modifiers', () => { + blockchainTests.skip('skip', () => { + it('does not execute this test', () => { + expect.fail(); + }); + }); + + blockchainTests(/*.only*/ 'only', () => { + it.skip("can't test `only` :-(", () => { + // no-op. + }); + }); + + blockchainTests.optional('optional', () => { + it('only runs this with `TEST_ALL` environment flag set', () => { + expect(process.env.TEST_ALL).to.be.ok(''); + }); + }); + + blockchainTests.resets('resets', () => { + const originalBlockhainLifecycle = env.blockchainLifecycle; + const blockchainLifecycleCalls = [] as string[]; + + before(() => { + // Replace `blockchainLifecycle` with a hooked version. + env.blockchainLifecycle = createHookedObject( + originalBlockhainLifecycle, + methodName => blockchainLifecycleCalls.push(methodName), + ['startAsync', 'revertAsync'], + ); + }); + + after(() => { + // Undo the hook. + env.blockchainLifecycle = originalBlockhainLifecycle; + }); + + it('calls `blockchainLifecycle.startAsync()` before this test', () => { + expect(blockchainLifecycleCalls).to.eql(['startAsync']); + }); + + it('calls `blockchainLifecycle.revertAsync()` after the last test', () => { + expect(blockchainLifecycleCalls).to.eql(['startAsync', 'revertAsync', 'startAsync']); + }); + }); + }); + + blockchainTests('nested tests', nestedEnv => { + it('shares the same environment object', () => { + expect(nestedEnv).to.eq(env); + }); + }); + + describe('subtests', () => { + require('./subtests/mocha_blockchain_1').define(env); + }); + }); +}); + +function createHookedObject(obj: any, handler: (name: string) => void, methods: string[]): any { + const hookedMethods = _.map(methods, methodName => { + // tslint:disable: only-arrow-functions + return function(this: any, ...args: any[]): any { + handler(methodName); + return obj[methodName].call(this, ...args); + }; + }); + return _.assign(_.clone(obj), _.zipObject(methods, hookedMethods)); +} diff --git a/contracts/test-utils/test/subtests/mocha_blockchain_1.ts b/contracts/test-utils/test/subtests/mocha_blockchain_1.ts new file mode 100644 index 0000000000..408105ac3b --- /dev/null +++ b/contracts/test-utils/test/subtests/mocha_blockchain_1.ts @@ -0,0 +1,10 @@ +import { blockchainTests, BlockchainTestsEnvironment, expect } from '../../src'; + +// tslint:disable: no-default-export completed-docs +export function define(env: BlockchainTestsEnvironment): void { + blockchainTests('imported subtests', subtestsEnv => { + it('shares the same environment object', () => { + expect(subtestsEnv).to.eq(env); + }); + }); +}