Skip to content

Commit

Permalink
Merge 3b16473 into 98e3a10
Browse files Browse the repository at this point in the history
  • Loading branch information
nivida committed Apr 26, 2019
2 parents 98e3a10 + 3b16473 commit 45cf725
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ export default class AbstractSubscription extends EventEmitter {
*
* @constructor
*/
constructor(type, method, options, utils, formatters, moduleInstance) {
constructor(type, method, options = null, utils, formatters, moduleInstance) {
super();
this.type = type;
this.method = method;
this.options = options || null;
this.options = options;
this.utils = utils;
this.formatters = formatters;
this.moduleInstance = moduleInstance;
Expand Down Expand Up @@ -93,21 +93,40 @@ export default class AbstractSubscription extends EventEmitter {
.then((subscriptionId) => {
this.id = subscriptionId;

this.moduleInstance.currentProvider.once('error', (error) => {
this.moduleInstance.currentProvider.removeAllListeners(this.id);

if (isFunction(callback)) {
callback(error, false);

return;
}

this.emit('error', error);
this.removeAllListeners();
});

this.moduleInstance.currentProvider.on(this.id, (response) => {
const formattedOutput = this.onNewSubscriptionItem(response.result);
this.emit('data', formattedOutput);

if (isFunction(callback)) {
callback(false, formattedOutput);

return;
}

this.emit('data', formattedOutput);
});
})
.catch((error) => {
this.emit('error', error);

if (isFunction(callback)) {
callback(error, null);

return;
}

this.emit('error', error);
this.removeAllListeners();
});

return this;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export default class SocketProvider {
constructor() {}
on() {}
once() {}
subscribe() {}
removeAllListeners() {}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import * as Utils from 'web3-utils';
import {formatters} from 'web3-core-helpers';
import AbstractSubscription from '../../../lib/subscriptions/AbstractSubscription';
import AbstractWeb3Module from '../../__mocks__/AbstractWeb3Module';
import SocketProvider from '../../__mocks__/SocketProvider';

// Mocks
jest.mock('web3-utils');
jest.mock('web3-core-helpers');
jest.mock('../../__mocks__/SocketProvider');

/**
* AbstractSubscription test
Expand All @@ -15,6 +17,7 @@ describe('AbstractSubscriptionTest', () => {

beforeEach(() => {
moduleInstanceMock = new AbstractWeb3Module();
moduleInstanceMock.currentProvider = new SocketProvider();
moduleInstanceMock.currentProvider.subscribe = jest.fn((type, method, parameters) => {
expect(type).toEqual(abstractSubscription.type);

Expand Down Expand Up @@ -61,31 +64,67 @@ describe('AbstractSubscriptionTest', () => {
expect(abstractSubscription.onNewSubscriptionItem('string')).toEqual('string');
});

it('calls subscribe and returns a Subscription object', (done) => {
moduleInstanceMock.currentProvider.on = jest.fn((id, callback) => {
expect(id).toEqual('MY_ID');
it('calls subscribe and emits a error from the provider error listener', (done) => {
moduleInstanceMock.currentProvider.once = jest.fn((event, callback) => {
expect(event).toEqual('error');

callback({result: 'SUBSCRIPTION_ITEM'});
callback(new Error('ERROR'));
});

const callback = jest.fn((error, response) => {
expect(abstractSubscription.id).toEqual('MY_ID');
const subscription = abstractSubscription.subscribe();

expect(error).toEqual(false);
subscription.on('error', (error) => {
expect(error).toEqual(new Error('ERROR'));

expect(response).toEqual('SUBSCRIPTION_ITEM');
expect(moduleInstanceMock.currentProvider.removeAllListeners).toHaveBeenCalledWith('MY_ID');

done();
});
});

const subscription = abstractSubscription.subscribe(callback);
it('calls subscribe and emits a error because of the provider subscribe method', (done) => {
moduleInstanceMock.currentProvider.subscribe = jest.fn(() => {
return Promise.reject(new Error('ERROR'));
});

subscription.on('data', (data) => {
expect(data).toEqual('SUBSCRIPTION_ITEM');
const subscription = abstractSubscription.subscribe();

subscription.on('error', (error) => {
expect(error).toEqual(new Error('ERROR'));

done();
});
});

it('calls subscribe and returns a error because of the provider subscribe method', (done) => {
moduleInstanceMock.currentProvider.subscribe = jest.fn(() => {
return Promise.reject(new Error('ERROR'));
});

abstractSubscription.subscribe((error) => {
expect(error).toEqual(new Error('ERROR'));

done();
});
});

it('calls subscribe with options set to null and returns a Subscription object', (done) => {
it('calls subscribe and returns a error from the provider error listener', (done) => {
moduleInstanceMock.currentProvider.once = jest.fn((event, callback) => {
expect(event).toEqual('error');

callback(new Error('ERROR'));
});

abstractSubscription.subscribe((error) => {
expect(error).toEqual(new Error('ERROR'));

expect(moduleInstanceMock.currentProvider.removeAllListeners).toHaveBeenCalledWith('MY_ID');

done();
});
});

it('calls subscribe with a callback and it returns the expected value', (done) => {
moduleInstanceMock.currentProvider.on = jest.fn((id, callback) => {
expect(id).toEqual('MY_ID');

Expand All @@ -99,15 +138,31 @@ describe('AbstractSubscriptionTest', () => {

expect(response).toEqual('SUBSCRIPTION_ITEM');

expect(moduleInstanceMock.currentProvider.once).toHaveBeenCalled();

done();
});

abstractSubscription.options = null;
abstractSubscription.subscribe(callback);
});

const subscription = abstractSubscription.subscribe(callback);
it('calls subscribe and emits the data event', (done) => {
moduleInstanceMock.currentProvider.on = jest.fn((id, callback) => {
expect(id).toEqual('MY_ID');

callback({result: 'SUBSCRIPTION_ITEM'});
});

abstractSubscription.options = null;
const subscription = abstractSubscription.subscribe();

subscription.on('data', (data) => {
expect(data).toEqual('SUBSCRIPTION_ITEM');

expect(moduleInstanceMock.currentProvider.once).toHaveBeenCalled();

done();
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {formatters} from 'web3-core-helpers';
import LogSubscription from '../../../../src/subscriptions/eth/LogSubscription';
import AbstractWeb3Module from '../../../__mocks__/AbstractWeb3Module';
import GetPastLogsMethod from '../../../__mocks__/GetPastLogsMethod';
import SocketProviderAdapter from '../../../__mocks__/SocketProviderAdapter';
import SocketProvider from '../../../__mocks__/SocketProvider';

// Mocks
jest.mock('web3-utils');
Expand All @@ -13,11 +13,11 @@ jest.mock('web3-core-helpers');
* LogSubscription test
*/
describe('LogSubscriptionTest', () => {
let logSubscription, moduleInstanceMock, getPastLogsMethodMock, socketProviderAdapterMock;
let logSubscription, moduleInstanceMock, getPastLogsMethodMock, socketProviderMock;

beforeEach(() => {
moduleInstanceMock = new AbstractWeb3Module();
socketProviderAdapterMock = new SocketProviderAdapter();
socketProviderMock = new SocketProvider();
getPastLogsMethodMock = new GetPastLogsMethod();
getPastLogsMethodMock.execute = jest.fn();

Expand Down Expand Up @@ -45,7 +45,7 @@ describe('LogSubscriptionTest', () => {

getPastLogsMethodMock.execute.mockReturnValueOnce(Promise.resolve([0]));

socketProviderAdapterMock.subscribe = jest.fn((type, method, parameters) => {
socketProviderMock.subscribe = jest.fn((type, method, parameters) => {
expect(type).toEqual('eth_subscribe');

expect(method).toEqual('logs');
Expand All @@ -55,13 +55,13 @@ describe('LogSubscriptionTest', () => {
return Promise.resolve('MY_ID');
});

socketProviderAdapterMock.on = jest.fn((subscriptionId, callback) => {
socketProviderMock.on = jest.fn((subscriptionId, callback) => {
expect(subscriptionId).toEqual('MY_ID');

callback(false, 'SUBSCRIPTION_ITEM');
callback('SUBSCRIPTION_ITEM');
});

moduleInstanceMock.currentProvider = socketProviderAdapterMock;
moduleInstanceMock.currentProvider = socketProviderMock;

let second = false;
logSubscription.options.fromBlock = 0;
Expand Down Expand Up @@ -121,10 +121,36 @@ describe('LogSubscriptionTest', () => {
).toBeInstanceOf(LogSubscription);
});

it('calls subscribe executes GetPastLogsMethod and emits the error event', (done) => {
formatters.inputLogFormatter.mockReturnValueOnce({});

getPastLogsMethodMock.execute = jest.fn(() => {
return Promise.reject(new Error('ERROR'));
});

logSubscription.options.fromBlock = 0;

const subscription = logSubscription.subscribe();

subscription.on('error', (error) => {
expect(error).toEqual(new Error('ERROR'));

expect(formatters.inputLogFormatter).toHaveBeenCalledWith(logSubscription.options);

expect(getPastLogsMethodMock.parameters).toEqual([{}]);

expect(getPastLogsMethodMock.execute).toHaveBeenCalled();

expect(subscription).toBeInstanceOf(LogSubscription);

done();
});
});

it('calls subscribe and calls the callback once', (done) => {
formatters.outputLogFormatter.mockReturnValueOnce('ITEM');

socketProviderAdapterMock.subscribe = jest.fn((type, method, parameters) => {
socketProviderMock.subscribe = jest.fn((type, method, parameters) => {
expect(type).toEqual('eth_subscribe');

expect(method).toEqual('logs');
Expand All @@ -134,13 +160,13 @@ describe('LogSubscriptionTest', () => {
return Promise.resolve('MY_ID');
});

socketProviderAdapterMock.on = jest.fn((subscriptionId, callback) => {
socketProviderMock.on = jest.fn((subscriptionId, callback) => {
expect(subscriptionId).toEqual('MY_ID');

callback(false, 'SUBSCRIPTION_ITEM');
callback('SUBSCRIPTION_ITEM');
});

moduleInstanceMock.currentProvider = socketProviderAdapterMock;
moduleInstanceMock.currentProvider = socketProviderMock;

const subscription = logSubscription.subscribe((error, response) => {
expect(error).toEqual(false);
Expand All @@ -158,11 +184,11 @@ describe('LogSubscriptionTest', () => {
it('calls subscribe and it returns with an Subscription object that calls the callback with an error', (done) => {
formatters.inputLogFormatter.mockReturnValueOnce({});

socketProviderAdapterMock.subscribe = jest.fn(() => {
socketProviderMock.subscribe = jest.fn(() => {
return Promise.reject(new Error('ERROR'));
});

moduleInstanceMock.currentProvider = socketProviderAdapterMock;
moduleInstanceMock.currentProvider = socketProviderMock;

expect(
logSubscription.subscribe((error, response) => {
Expand Down

0 comments on commit 45cf725

Please sign in to comment.