60 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import * as chai from 'chai';
 | 
						|
import * as dirtyChai from 'dirty-chai';
 | 
						|
import * as _ from 'lodash';
 | 
						|
import 'mocha';
 | 
						|
import * as Sinon from 'sinon';
 | 
						|
import * as WebSocket from 'websocket';
 | 
						|
 | 
						|
import { WebSocketOrderbookChannel } from '../src/ws_orderbook_channel';
 | 
						|
 | 
						|
chai.config.includeStack = true;
 | 
						|
chai.use(dirtyChai);
 | 
						|
const expect = chai.expect;
 | 
						|
const emptyOrderbookChannelHandler = {
 | 
						|
    onSnapshot: () => {
 | 
						|
        _.noop();
 | 
						|
    },
 | 
						|
    onUpdate: () => {
 | 
						|
        _.noop();
 | 
						|
    },
 | 
						|
    onError: () => {
 | 
						|
        _.noop();
 | 
						|
    },
 | 
						|
    onClose: () => {
 | 
						|
        _.noop();
 | 
						|
    },
 | 
						|
};
 | 
						|
 | 
						|
describe('WebSocketOrderbookChannel', () => {
 | 
						|
    const websocketUrl = 'ws://localhost:8080';
 | 
						|
    const openClient = new WebSocket.w3cwebsocket(websocketUrl);
 | 
						|
    Sinon.stub(openClient, 'readyState').get(() => WebSocket.w3cwebsocket.OPEN);
 | 
						|
    Sinon.stub(openClient, 'send').callsFake(_.noop.bind(_));
 | 
						|
    const openOrderbookChannel = new WebSocketOrderbookChannel(openClient, emptyOrderbookChannelHandler);
 | 
						|
    const subscriptionOpts = {
 | 
						|
        baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
 | 
						|
        quoteTokenAddress: '0xef7fff64389b814a946f3e92105513705ca6b990',
 | 
						|
        snapshot: true,
 | 
						|
        limit: 100,
 | 
						|
    };
 | 
						|
    describe('#subscribe', () => {
 | 
						|
        it('throws when subscriptionOpts does not conform to schema', () => {
 | 
						|
            const badSubscribeCall = openOrderbookChannel.subscribe.bind(openOrderbookChannel, {});
 | 
						|
            expect(badSubscribeCall).throws(
 | 
						|
                'Expected subscriptionOpts to conform to schema /RelayerApiOrderbookChannelSubscribePayload\nEncountered: {}\nValidation errors: instance requires property "baseTokenAddress", instance requires property "quoteTokenAddress"',
 | 
						|
            );
 | 
						|
        });
 | 
						|
        it('does not throw when inputs are of correct types', () => {
 | 
						|
            const goodSubscribeCall = openOrderbookChannel.subscribe.bind(openOrderbookChannel, subscriptionOpts);
 | 
						|
            expect(goodSubscribeCall).to.not.throw();
 | 
						|
        });
 | 
						|
        it('throws when client is closed', () => {
 | 
						|
            const closedClient = new WebSocket.w3cwebsocket(websocketUrl);
 | 
						|
            Sinon.stub(closedClient, 'readyState').get(() => WebSocket.w3cwebsocket.CLOSED);
 | 
						|
            const closedOrderbookChannel = new WebSocketOrderbookChannel(closedClient, emptyOrderbookChannelHandler);
 | 
						|
            const badSubscribeCall = closedOrderbookChannel.subscribe.bind(closedOrderbookChannel, subscriptionOpts);
 | 
						|
            expect(badSubscribeCall).throws('WebSocket connection is closed');
 | 
						|
        });
 | 
						|
    });
 | 
						|
});
 |