106 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import * as _ from 'lodash';
 | 
						|
import * as process from 'process';
 | 
						|
 | 
						|
import { expect } from '../src/chai_setup';
 | 
						|
import { constants } from '../src/constants';
 | 
						|
import { blockchainTests, describe } from '../src/mocha_blockchain';
 | 
						|
 | 
						|
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_CHAIN_ID);
 | 
						|
            expect(await env.getAccountAddressesAsync()).to.be.not.empty('');
 | 
						|
        });
 | 
						|
 | 
						|
        describe('modifiers', () => {
 | 
						|
            blockchainTests.skip('skip', () => {
 | 
						|
                it('does not execute this test', () => {
 | 
						|
                    expect.fail();
 | 
						|
                });
 | 
						|
            });
 | 
						|
 | 
						|
            blockchainTests('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').append(env);
 | 
						|
        });
 | 
						|
    });
 | 
						|
 | 
						|
    describe('describe extensions', () => {
 | 
						|
        describe('modifiers', () => {
 | 
						|
            describe.optional('optional', () => {
 | 
						|
                it('only runs this with `TEST_ALL` environment flag set', () => {
 | 
						|
                    expect(process.env.TEST_ALL).to.be.ok('');
 | 
						|
                });
 | 
						|
            });
 | 
						|
        });
 | 
						|
    });
 | 
						|
});
 | 
						|
 | 
						|
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));
 | 
						|
}
 |