embark/test/helpers/fakeIpcProvider.js

138 lines
3.4 KiB
JavaScript

const assert = require('assert');
const _ = require('lodash');
const FakeIpcProvider = function IpcProvider() {
var _this = this;
this.countId = 1;
this.notificationCount = 1;
this.getResponseStub = function () {
return {
jsonrpc: '2.0',
id: _this.countId,
result: null
};
};
this.getErrorStub = function () {
return {
jsonrpc: '2.0',
id: _this.countId,
error: {
code: 1234,
message: 'Stub error'
}
};
};
this.response = [];
this.error = [];
this.validation = [];
this.notificationCallbacks = [];
};
FakeIpcProvider.prototype.send = function (payload, callback) {
var _this = this;
// set id
if(payload.id)
this.countId = payload.id;
// else
// this.countId++;
assert.equal(_.isArray(payload) || _.isObject(payload), true);
assert.equal(_.isFunction(callback), true);
var validation = this.validation.shift();
if (validation) {
// imitate plain json object
validation(JSON.parse(JSON.stringify(payload)), callback);
}
var response = this.getResponseOrError('response', payload);
var error = this.getResponseOrError('error', payload);
setTimeout(function(){
callback(error, response);
}, 1);
};
FakeIpcProvider.prototype.on = function (type, callback) {
if(type === 'data') {
this.notificationCallbacks.push(callback);
}
};
FakeIpcProvider.prototype.getResponseOrError = function (type, payload) {
var _this = this;
var response;
if(type === 'error') {
response = this.error.shift();
} else {
response = this.response.shift() || this.getResponseStub();
}
if(response) {
if(_.isArray(response)) {
response = response.map(function(resp, index) {
resp.id = payload[index] ? payload[index].id : _this.countId++;
return resp;
});
} else
response.id = payload.id;
}
return response;
};
FakeIpcProvider.prototype.injectNotification = function (notification) {
var _this = this;
setTimeout(function(){
_this.notificationCallbacks.forEach(function(cb){
if(notification && cb)
cb(null, notification);
});
}, 100 + this.notificationCount);
this.notificationCount += 10;
};
// FakeHttpProvider.prototype.injectResponse = function (response) {
// this.response = response;
// };
FakeIpcProvider.prototype.injectBatchResults = function (results, error) {
var _this = this;
this.response.push(results.map(function (r) {
if(error) {
var response = _this.getErrorStub();
response.error.message = r;
} else {
var response = _this.getResponseStub();
response.result = r;
}
return response;
}));
};
FakeIpcProvider.prototype.injectResult = function (result) {
var response = this.getResponseStub();
response.result = result;
this.response.push(response);
};
FakeIpcProvider.prototype.injectError = function (error) {
var errorStub = this.getErrorStub();
errorStub.error = error; // message, code
this.error.push(errorStub);
};
FakeIpcProvider.prototype.injectValidation = function (callback) {
this.validation.push(callback);
};
module.exports = FakeIpcProvider;