Adding tests suites for readAll and readStream
This commit is contained in:
@ -13,17 +13,17 @@ const positions = {
|
||||
|
||||
/**
|
||||
* @param {string} eventId
|
||||
* @param {object} data
|
||||
* @param {object} event
|
||||
* @param {object} [metadata]
|
||||
* @param {string} [type]
|
||||
* @returns {EventData}
|
||||
*/
|
||||
function jsonEventDataFactory(eventId, data, metadata, type) {
|
||||
if (!data || typeof data !== 'object') throw new TypeError("data must be an object.");
|
||||
function jsonEventDataFactory(eventId, event, metadata, type) {
|
||||
if (!event || typeof event !== 'object') throw new TypeError("data must be an object.");
|
||||
|
||||
var d = new Buffer(JSON.stringify(data));
|
||||
var m = metadata ? new Buffer(JSON.stringify(metadata)) : null;
|
||||
return new EventData(eventId, type || data.constructor.name, true, d, m);
|
||||
var eventBuf = new Buffer(JSON.stringify(event));
|
||||
var metaBuf = metadata ? new Buffer(JSON.stringify(metadata)) : null;
|
||||
return new EventData(eventId, type || event.constructor.name, true, eventBuf, metaBuf);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -53,6 +53,7 @@ module.exports.expectedVersion = expectedVersion;
|
||||
module.exports.positions = positions;
|
||||
module.exports.systemMetadata = require('./common/systemMetadata');
|
||||
module.exports.eventReadStatus = results.EventReadStatus;
|
||||
module.exports.sliceReadStatus = require('./sliceReadStatus');
|
||||
// Helper functions
|
||||
module.exports.createConnection = module.exports.EventStoreConnection.create;
|
||||
module.exports.createEventData = eventDataFactory;
|
||||
|
@ -7,6 +7,7 @@ var ReadDirection = require('../readDirection');
|
||||
var InspectionResult = require('./../systemData/inspectionResult');
|
||||
var InspectionDecision = require('../systemData/inspectionDecision');
|
||||
var results = require('../results');
|
||||
var AccessDeniedError = require('../errors/accessDeniedError');
|
||||
|
||||
var OperationBase = require('./operationBase');
|
||||
|
||||
@ -37,7 +38,7 @@ ReadAllEventsBackwardOperation.prototype._inspectResponse = function(response) {
|
||||
this.fail(new Error("Server error: " + response.error));
|
||||
return new InspectionResult(InspectionDecision.EndOperation, "Error");
|
||||
case ClientMessage.ReadAllEventsCompleted.ReadAllResult.AccessDenied:
|
||||
this.fail(new Error("Read access denied for $all."));
|
||||
this.fail(new AccessDeniedError("Read", "$all"));
|
||||
return new InspectionResult(InspectionDecision.EndOperation, "AccessDenied");
|
||||
default:
|
||||
throw new Error(util.format("Unexpected ReadStreamResult: %s.", response.result));
|
||||
|
@ -7,6 +7,7 @@ var ReadDirection = require('../readDirection');
|
||||
var InspectionResult = require('./../systemData/inspectionResult');
|
||||
var InspectionDecision = require('../systemData/inspectionDecision');
|
||||
var results = require('../results');
|
||||
var AccessDeniedError = require('../errors/accessDeniedError');
|
||||
|
||||
var OperationBase = require('./operationBase');
|
||||
|
||||
@ -37,7 +38,7 @@ ReadAllEventsForwardOperation.prototype._inspectResponse = function(response) {
|
||||
this.fail(new Error("Server error: " + response.error));
|
||||
return new InspectionResult(InspectionDecision.EndOperation, "Error");
|
||||
case ClientMessage.ReadAllEventsCompleted.ReadAllResult.AccessDenied:
|
||||
this.fail(new Error("Read access denied for $all."));
|
||||
this.fail(new AccessDeniedError("Read", "$all"));
|
||||
return new InspectionResult(InspectionDecision.EndOperation, "AccessDenied");
|
||||
default:
|
||||
throw new Error(util.format("Unexpected ReadStreamResult: %s.", response.result));
|
||||
|
@ -8,6 +8,7 @@ var StatusCode = require('../systemData/statusCode');
|
||||
var InspectionResult = require('./../systemData/inspectionResult');
|
||||
var InspectionDecision = require('../systemData/inspectionDecision');
|
||||
var results = require('../results');
|
||||
var AccessDeniedError = require('../errors/accessDeniedError');
|
||||
|
||||
var OperationBase = require('./operationBase');
|
||||
|
||||
@ -45,7 +46,7 @@ ReadStreamEventsBackwardOperation.prototype._inspectResponse = function(response
|
||||
this.fail(new Error("Server error: " + response.error));
|
||||
return new InspectionResult(InspectionDecision.EndOperation, "Error");
|
||||
case ClientMessage.ReadStreamEventsCompleted.ReadStreamResult.AccessDenied:
|
||||
this.fail(new Error(util.format("Read access denied for stream '%s'.", this._stream)));
|
||||
this.fail(new AccessDeniedError("Read", this._stream));
|
||||
return new InspectionResult(InspectionDecision.EndOperation, "AccessDenied");
|
||||
default:
|
||||
throw new Error(util.format("Unexpected ReadStreamResult: %s.", response.result));
|
||||
|
@ -8,6 +8,7 @@ var StatusCode = require('../systemData/statusCode');
|
||||
var InspectionResult = require('./../systemData/inspectionResult');
|
||||
var InspectionDecision = require('../systemData/inspectionDecision');
|
||||
var results = require('../results');
|
||||
var AccessDeniedError = require('../errors/accessDeniedError');
|
||||
|
||||
var OperationBase = require('./operationBase');
|
||||
|
||||
@ -45,7 +46,7 @@ ReadStreamEventsForwardOperation.prototype._inspectResponse = function(response)
|
||||
this.fail(new Error("Server error: " + response.error));
|
||||
return new InspectionResult(InspectionDecision.EndOperation, "Error");
|
||||
case ClientMessage.ReadStreamEventsCompleted.ReadStreamResult.AccessDenied:
|
||||
this.fail(new Error(util.format("Read access denied for stream '%s'.", this._stream)));
|
||||
this.fail(new AccessDeniedError("Read", this._stream));
|
||||
return new InspectionResult(InspectionDecision.EndOperation, "AccessDenied");
|
||||
default:
|
||||
throw new Error(util.format("Unexpected ReadStreamResult: %s.", response.result));
|
||||
|
@ -1,23 +1,38 @@
|
||||
module.exports.notNullOrEmpty = function(value, name) {
|
||||
if (value === null)
|
||||
throw new Error(name + " is null.");
|
||||
throw new TypeError(name + " should not be null.");
|
||||
if (value === '')
|
||||
throw new Error(name + " is empty.");
|
||||
throw new Error(name + " should not be empty.");
|
||||
};
|
||||
|
||||
module.exports.notNull = function(value, name) {
|
||||
if (value === null)
|
||||
throw new Error(name + " is null.");
|
||||
throw new TypeError(name + " should not be null.");
|
||||
};
|
||||
|
||||
module.exports.isInteger = function(value, name) {
|
||||
if (typeof value !== 'number' || value % 1 !== 0)
|
||||
throw new TypeError(name + " is not an integer.");
|
||||
throw new TypeError(name + " should be an integer.");
|
||||
};
|
||||
|
||||
module.exports.isArrayOf = function(expectedType, value, name) {
|
||||
if (!Array.isArray(value))
|
||||
throw new TypeError(name + " is not an array.");
|
||||
throw new TypeError(name + " should be an array.");
|
||||
if (!value.every(function(x) { return x instanceof expectedType; }))
|
||||
throw new TypeError([name, " is not an array of ", expectedType, "."].join(""));
|
||||
throw new TypeError([name, " should be an array of ", expectedType, "."].join(""));
|
||||
};
|
||||
|
||||
module.exports.isTypeOf = function(expectedType, value, name) {
|
||||
if (!(value instanceof expectedType))
|
||||
throw new TypeError([name, " should be of type '", expectedType, "'."].join(""));
|
||||
};
|
||||
|
||||
module.exports.positive = function(value, name) {
|
||||
if (value <= 0)
|
||||
throw new Error(name + " should be positive.");
|
||||
};
|
||||
|
||||
module.exports.nonNegative = function(value, name) {
|
||||
if (value < 0)
|
||||
throw new Error(name + " should be non-negative.");
|
||||
};
|
@ -30,6 +30,8 @@ var systemStreams = require('./common/systemStreams');
|
||||
var systemEventTypes = require('./common/systemEventTypes');
|
||||
var EventData = require('./eventData');
|
||||
|
||||
const MaxReadSize = 4096;
|
||||
|
||||
/**
|
||||
* @param settings
|
||||
* @param endpointDiscoverer
|
||||
@ -209,6 +211,12 @@ EventStoreNodeConnection.prototype.commitTransaction = function(transaction, use
|
||||
* @returns {Promise.<EventReadResult>}
|
||||
*/
|
||||
EventStoreNodeConnection.prototype.readEvent = function(stream, eventNumber, resolveLinkTos, userCredentials) {
|
||||
ensure.notNullOrEmpty(stream, "stream");
|
||||
ensure.isInteger(eventNumber, "eventNumber");
|
||||
if (eventNumber < -1) throw new Error("eventNumber out of range.");
|
||||
resolveLinkTos = !!resolveLinkTos;
|
||||
userCredentials = userCredentials || null;
|
||||
|
||||
if (typeof stream !== 'string' || stream === '') throw new TypeError("stream must be an non-empty string.");
|
||||
if (typeof eventNumber !== 'number' || eventNumber % 1 !== 0) throw new TypeError("eventNumber must be an integer.");
|
||||
if (eventNumber < -1) throw new Error("eventNumber out of range.");
|
||||
@ -220,8 +228,8 @@ EventStoreNodeConnection.prototype.readEvent = function(stream, eventNumber, res
|
||||
if (err) return reject(err);
|
||||
resolve(result);
|
||||
}
|
||||
var operation = new ReadEventOperation(self._settings.log, cb, stream, eventNumber, resolveLinkTos || false,
|
||||
self._settings.requireMaster, userCredentials || null);
|
||||
var operation = new ReadEventOperation(self._settings.log, cb, stream, eventNumber, resolveLinkTos,
|
||||
self._settings.requireMaster, userCredentials);
|
||||
self._enqueueOperation(operation);
|
||||
});
|
||||
};
|
||||
@ -238,10 +246,14 @@ EventStoreNodeConnection.prototype.readEvent = function(stream, eventNumber, res
|
||||
EventStoreNodeConnection.prototype.readStreamEventsForward = function(
|
||||
stream, start, count, resolveLinkTos, userCredentials
|
||||
) {
|
||||
if (typeof stream !== 'string' || stream === '') throw new TypeError("stream must be an non-empty string.");
|
||||
if (typeof start !== 'number' || start % 1 !== 0) throw new TypeError("start must be an integer.");
|
||||
if (typeof count !== 'number' || count % 1 !== 0) throw new TypeError("count must be an integer.");
|
||||
if (resolveLinkTos && typeof resolveLinkTos !== 'boolean') throw new TypeError("resolveLinkTos must be a boolean.");
|
||||
ensure.notNullOrEmpty(stream, "stream");
|
||||
ensure.isInteger(start, "start");
|
||||
ensure.nonNegative(start, "start");
|
||||
ensure.isInteger(count, "count");
|
||||
ensure.positive(count, "count");
|
||||
if (count > MaxReadSize) throw new Error(util.format("Count should be less than %d. For larger reads you should page.", MaxReadSize));
|
||||
resolveLinkTos = !!resolveLinkTos;
|
||||
userCredentials = userCredentials || null;
|
||||
|
||||
var self = this;
|
||||
return new Promise(function(resolve, reject) {
|
||||
@ -250,7 +262,7 @@ EventStoreNodeConnection.prototype.readStreamEventsForward = function(
|
||||
resolve(result);
|
||||
}
|
||||
var operation = new ReadStreamEventsForwardOperation(self._settings.log, cb, stream, start, count,
|
||||
resolveLinkTos || false, self._settings.requireMaster, userCredentials || null);
|
||||
resolveLinkTos, self._settings.requireMaster, userCredentials);
|
||||
self._enqueueOperation(operation);
|
||||
});
|
||||
};
|
||||
@ -267,10 +279,13 @@ EventStoreNodeConnection.prototype.readStreamEventsForward = function(
|
||||
EventStoreNodeConnection.prototype.readStreamEventsBackward = function(
|
||||
stream, start, count, resolveLinkTos, userCredentials
|
||||
) {
|
||||
if (typeof stream !== 'string' || stream === '') throw new TypeError("stream must be an non-empty string.");
|
||||
if (typeof start !== 'number' || start % 1 !== 0) throw new TypeError("start must be an integer.");
|
||||
if (typeof count !== 'number' || count % 1 !== 0) throw new TypeError("count must be an integer.");
|
||||
if (resolveLinkTos && typeof resolveLinkTos !== 'boolean') throw new TypeError("resolveLinkTos must be a boolean.");
|
||||
ensure.notNullOrEmpty(stream, "stream");
|
||||
ensure.isInteger(start, "start");
|
||||
ensure.isInteger(count, "count");
|
||||
ensure.positive(count, "count");
|
||||
if (count > MaxReadSize) throw new Error(util.format("Count should be less than %d. For larger reads you should page.", MaxReadSize));
|
||||
resolveLinkTos = !!resolveLinkTos;
|
||||
userCredentials = userCredentials || null;
|
||||
|
||||
var self = this;
|
||||
return new Promise(function(resolve, reject) {
|
||||
@ -279,7 +294,7 @@ EventStoreNodeConnection.prototype.readStreamEventsBackward = function(
|
||||
resolve(result);
|
||||
}
|
||||
var operation = new ReadStreamEventsBackwardOperation(self._settings.log, cb, stream, start, count,
|
||||
resolveLinkTos || false, self._settings.requireMaster, userCredentials || null);
|
||||
resolveLinkTos, self._settings.requireMaster, userCredentials);
|
||||
self._enqueueOperation(operation);
|
||||
});
|
||||
};
|
||||
@ -295,7 +310,12 @@ EventStoreNodeConnection.prototype.readStreamEventsBackward = function(
|
||||
EventStoreNodeConnection.prototype.readAllEventsForward = function(
|
||||
position, maxCount, resolveLinkTos, userCredentials
|
||||
) {
|
||||
//TODO validations
|
||||
ensure.isTypeOf(results.Position, position, "position");
|
||||
ensure.isInteger(maxCount, "maxCount");
|
||||
ensure.positive(maxCount, "maxCount");
|
||||
if (maxCount > MaxReadSize) throw new Error(util.format("Count should be less than %d. For larger reads you should page.", MaxReadSize));
|
||||
resolveLinkTos = !!resolveLinkTos;
|
||||
userCredentials = userCredentials || null;
|
||||
|
||||
var self = this;
|
||||
return new Promise(function(resolve, reject) {
|
||||
@ -304,7 +324,7 @@ EventStoreNodeConnection.prototype.readAllEventsForward = function(
|
||||
resolve(result);
|
||||
}
|
||||
var operation = new ReadAllEventsForwardOperation(self._settings.log, cb, position, maxCount,
|
||||
resolveLinkTos || false, self._settings.requireMaster, userCredentials || null);
|
||||
resolveLinkTos, self._settings.requireMaster, userCredentials);
|
||||
self._enqueueOperation(operation);
|
||||
});
|
||||
};
|
||||
@ -320,7 +340,12 @@ EventStoreNodeConnection.prototype.readAllEventsForward = function(
|
||||
EventStoreNodeConnection.prototype.readAllEventsBackward = function(
|
||||
position, maxCount, resolveLinkTos, userCredentials
|
||||
) {
|
||||
//TODO validations
|
||||
ensure.isTypeOf(results.Position, position, "position");
|
||||
ensure.isInteger(maxCount, "maxCount");
|
||||
ensure.positive(maxCount, "maxCount");
|
||||
if (maxCount > MaxReadSize) throw new Error(util.format("Count should be less than %d. For larger reads you should page.", MaxReadSize));
|
||||
resolveLinkTos = !!resolveLinkTos;
|
||||
userCredentials = userCredentials || null;
|
||||
|
||||
var self = this;
|
||||
return new Promise(function(resolve, reject) {
|
||||
|
Reference in New Issue
Block a user