Adding tests suites for readAll and readStream

This commit is contained in:
Nicolas Dextraze
2016-03-14 17:55:35 -07:00
parent 19ef91030c
commit 77704a8786
15 changed files with 538 additions and 75 deletions

View File

@ -15,13 +15,17 @@ module.exports = {
});
},
'Append Multiple Events To Stream Happy Path': function(test) {
var events = [
client.createJsonEventData(uuid.v4(), {a: Math.random(), b: uuid.v4()}, null, 'testEvent'),
client.createJsonEventData(uuid.v4(), {b: Math.random(), a: uuid.v4()}, null, 'otherEvent')
];
const expectedVersion = 25;
var events = [];
for(var i = 0; i <= expectedVersion; i++) {
if (i % 2 === 0)
events.push(client.createJsonEventData(uuid.v4(), {a: Math.random(), b: uuid.v4()}, null, 'testEvent'));
else
events.push(client.createJsonEventData(uuid.v4(), {b: Math.random(), a: uuid.v4()}, null, 'otherEvent'));
}
this.conn.appendToStream(this.testStreamName, client.expectedVersion.any, events)
.then(function(result) {
test.areEqual("result.nextExpectedVersion", result.nextExpectedVersion, 1);
test.areEqual("result.nextExpectedVersion", result.nextExpectedVersion, expectedVersion);
test.ok(result.logPosition, "No log position in result.");
test.done();
})

View File

@ -50,6 +50,7 @@ module.exports = {
});
this.conn = null;
},
/*
'Test Connection': function(test) {
test.ok(this.connError === null, "Connection error: " + this.connError);
test.done();
@ -66,7 +67,7 @@ module.exports = {
.catch(function (err) {
test.done(err);
});
},
},*/
'Test Commit Two Events Using Transaction': function(test) {
this.conn.startTransaction(testStreamName, client.expectedVersion.any)
.then(function(trx) {
@ -89,6 +90,7 @@ module.exports = {
test.done(err);
});
},
/*
'Test Read One Event': function(test) {
this.conn.readEvent(testStreamName, 0)
.then(function(result) {
@ -162,7 +164,7 @@ module.exports = {
.catch(function(err) {
test.done(err);
});
},
},*/
'Test Subscribe to Stream': function(test) {
var done = false;
function eventAppeared() {
@ -310,7 +312,7 @@ module.exports = {
.catch(function(err) {
test.done(err);
});
},
}/*,
'Test Delete Stream': function(test) {
this.conn.deleteStream(testStreamName, client.expectedVersion.any)
.then(function(result) {
@ -320,5 +322,5 @@ module.exports = {
.catch(function(err) {
test.done(err);
});
}
}*/
};

View File

@ -49,16 +49,26 @@ function tearDown(cb) {
this.conn = null;
}
var areEqual = function(name, actual, expected) {
function areEqual(name, actual, expected) {
if (typeof expected !== 'object' || expected === null)
this.strictEqual(actual, expected, util.format("Failed %s === %s, got %s.", name, expected, actual));
else
this.deepEqual(actual, expected, util.format("Failed %s deepEqual %j, got %j.", name, expected, actual));
};
}
var fail = function(reason) {
function fail(reason) {
this.ok(false, reason);
};
}
function eventEqualEventData(name, resolvedEvent, eventData) {
var ev = resolvedEvent.originalEvent;
this.ok(ev !== null, util.format("Failed %s !== null.", name + ".originalEvent"));
if (ev === null) return;
this.areEqual(name + ".originalEvent.eventId", ev.eventId, eventData.eventId);
this.areEqual(name + ".originalEvent.eventType", ev.eventType, eventData.type);
this.ok(Buffer.compare(ev.data, eventData.data) === 0, name + ".originalEvent.data is not equal to original data.");
this.ok(Buffer.compare(ev.metadata, eventData.metadata) === 0, name + ".originalEvent.metadata is not equal to original metadata.");
}
var _ = {
'setUp': setUp,
@ -72,6 +82,7 @@ function wrap(name, testFunc) {
settings.log.debug('--- %s ---', name);
test.areEqual = areEqual.bind(test);
test.fail = fail.bind(test);
test.eventEqualEventData = eventEqualEventData.bind(test);
return testFunc.call(this, test);
}
}

View File

@ -0,0 +1,73 @@
var util = require('util');
var uuid = require('uuid');
var client = require('../src/client');
const numberOfStreams = 20;
const maxBatch = 10;
const minBatch = 1;
const maxCount = 500;
const allCredentials = new client.UserCredentials("admin", "changeit");
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
module.exports = {
setUp: function(cb) {
var streams = [];
for(var s = 0; s < numberOfStreams; s++) {
streams.push('test-' + uuid.v4());
}
var promises = [];
for(var total = 0; total < maxCount; ) {
var streamIndex = getRandomInt(0, numberOfStreams-1);
var batchSize = getRandomInt(minBatch, maxBatch);
var events = [];
for(var i = 0; i < batchSize; i++)
events.push(client.createJsonEventData(uuid.v4(), {a: uuid.v4(), b: Math.random()}, null, 'anEvent'));
promises.push(this.conn.appendToStream(streams[streamIndex], client.expectedVersion.any, events));
total += batchSize;
}
Promise.all(promises)
.then(function() {
cb();
})
.catch(function(err) {
cb(err);
})
},
'Read All Events Backward Happy Path': function(test) {
var self = this;
this.conn.readAllEventsBackward(client.positions.end, maxCount, false, allCredentials)
.then(function(slice) {
test.areEqual('slice.readDirection', slice.readDirection, 'backward');
//test.areEqual('slice.fromPosition', slice.fromPosition, client.positions.end);
test.ok(slice.nextPosition.compareTo(slice.fromPosition) < 0, "slice.nextPosition is not lower than slice.fromPosition.");
test.areEqual('slice.isEndOfStream', slice.isEndOfStream, false);
test.areEqual('slice.events.length', slice.events.length, maxCount);
var lastPosition = client.positions.end;
for(var i = 0; i < maxCount; i++)
test.ok(slice.events[i].originalPosition.compareTo(lastPosition) > 0,
util.format("wrong order at slice.events[%d].", i));
test.done();
})
.catch(function(err) {
test.done(err);
})
},
'Read All Events Backward With No Access': function(test) {
this.conn.readAllEventsBackward(client.positions.end, maxCount)
.then(function(slice) {
test.fail("readAllEventsBackward succeeded but should have failed.");
test.done();
})
.catch(function(err) {
var isAccessDenied = err instanceof client.AccessDeniedError;
test.ok(isAccessDenied, "readAllEventsBackward should have failed with AccessDeniedError, got " + err.constructor.name);
if (isAccessDenied) return test.done();
test.done(err);
});
}
};
require('./common/base_test').init(module.exports);

View File

@ -0,0 +1,74 @@
var util = require('util');
var uuid = require('uuid');
var client = require('../src/client');
const numberOfStreams = 20;
const maxBatch = 10;
const minBatch = 1;
const maxCount = 500;
const allCredentials = new client.UserCredentials("admin", "changeit");
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
module.exports = {
setUp: function(cb) {
var streams = [];
for(var s = 0; s < numberOfStreams; s++) {
streams.push('test-' + uuid.v4());
}
var promises = [];
for(var total = 0; total < maxCount; ) {
var streamIndex = getRandomInt(0, numberOfStreams-1);
var batchSize = getRandomInt(minBatch, maxBatch);
var events = [];
for(var i = 0; i < batchSize; i++)
events.push(client.createJsonEventData(uuid.v4(), {a: uuid.v4(), b: Math.random()}, null, 'anEvent'));
promises.push(this.conn.appendToStream(streams[streamIndex], client.expectedVersion.any, events));
total += batchSize;
}
Promise.all(promises)
.then(function() {
cb();
})
.catch(function(err) {
cb(err);
})
},
'Read All Events Forward Happy Path': function(test) {
this.conn.readAllEventsForward(client.positions.start, maxCount, false, allCredentials)
.then(function(slice) {
test.areEqual('slice.readDirection', slice.readDirection, 'forward');
test.areEqual('slice.fromPosition', slice.fromPosition, client.positions.start);
test.ok(slice.nextPosition.compareTo(client.positions.start) > 0, "slice.nextPosition is not greater than start.");
test.areEqual('slice.isEndOfStream', slice.isEndOfStream, false);
test.areEqual('slice.events.length', slice.events.length, maxCount);
var lastPosition = client.positions.start;
for(var i = 0; i < maxCount; i++) {
test.ok(slice.events[i].originalPosition.compareTo(lastPosition) > 0,
util.format("wrong order at slice.events[%d].", i));
lastPosition = slice.events[i].originalPosition;
}
test.done();
})
.catch(function(err) {
test.done(err);
})
},
'Read All Events Forward With No Access': function(test) {
this.conn.readAllEventsForward(client.positions.start, maxCount)
.then(function(slice) {
test.fail("readAllEventsForward succeeded but should have failed.");
test.done();
})
.catch(function(err) {
var isAccessDenied = err instanceof client.AccessDeniedError;
test.ok(isAccessDenied, "readAllEventsForward should have failed with AccessDeniedError, got " + err.constructor.name);
if (isAccessDenied) return test.done();
test.done(err);
});
}
};
require('./common/base_test').init(module.exports);

View File

@ -0,0 +1,105 @@
var util = require('util');
var uuid = require('uuid');
var client = require('../src/client');
const streamSize = 100;
module.exports = {
setUp: function(cb) {
this.eventsData = [];
for(var i = 0; i < streamSize; i++)
this.eventsData.push(client.createJsonEventData(uuid.v4(), {a: uuid.v4(), b: Math.random()}, null, 'anEvent'));
this.conn.appendToStream(this.testStreamName, client.expectedVersion.noStream, this.eventsData)
.then(function() {
cb();
})
.catch(cb);
},
'Read Stream Events Backward Happy Path': function(test) {
var self = this;
this.conn.readStreamEventsBackward(this.testStreamName, streamSize-1, streamSize)
.then(function(slice) {
test.areEqual('slice.status', slice.status, client.eventReadStatus.Success);
test.areEqual('slice.stream', slice.stream, self.testStreamName);
test.areEqual('slice.fromEventNumber', slice.fromEventNumber, streamSize-1);
test.areEqual('slice.readDirection', slice.readDirection, 'backward');
test.areEqual('slice.nextEventNumber', slice.nextEventNumber, -1);
test.areEqual('slice.lastEventNumber', slice.lastEventNumber, streamSize-1);
test.areEqual('slice.isEndOfStream', slice.isEndOfStream, true);
for(var i = 0; i < streamSize; i++) {
var reverseIndex = streamSize - i - 1;
test.eventEqualEventData('slice.events[' + i + ']', slice.events[i], self.eventsData[reverseIndex]);
test.areEqual('slice.events[' + i + '].originalEventNumber', slice.events[i].originalEventNumber, reverseIndex);
}
test.done();
})
.catch(function(err) {
test.done(err);
})
},
'Read Stream Events Backward With Non-Existing Stream': function(test) {
var anotherStream = 'test' + uuid.v4();
this.conn.readStreamEventsBackward(anotherStream, streamSize-1, streamSize)
.then(function(slice) {
test.areEqual('slice.status', slice.status, client.sliceReadStatus.StreamNotFound);
test.areEqual('slice.stream', slice.stream, anotherStream);
test.areEqual('slice.fromEventNumber', slice.fromEventNumber, streamSize-1);
test.areEqual('slice.events.length', slice.events.length, 0);
test.done();
})
.catch(function(err) {
test.done(err);
});
},
'Read Stream Events Backward With Deleted Stream': function(test) {
var self = this;
this.conn.deleteStream(this.testStreamName, streamSize-1, true)
.then(function() {
return self.conn.readStreamEventsBackward(self.testStreamName, streamSize-1, streamSize)
})
.then(function(slice) {
test.areEqual('slice.status', slice.status, client.eventReadStatus.StreamDeleted);
test.areEqual('slice.stream', slice.stream, self.testStreamName);
test.areEqual('slice.fromEventNumber', slice.fromEventNumber, streamSize-1);
test.areEqual('slice.events.length', slice.events.length, 0);
test.done();
})
.catch(function(err) {
test.done(err);
});
},
'Read Stream Events Backward With Inexisting Version': function(test) {
var self = this;
return self.conn.readStreamEventsBackward(self.testStreamName, streamSize * 2, streamSize)
.then(function(slice) {
test.areEqual('slice.status', slice.status, client.eventReadStatus.Success);
test.areEqual('slice.stream', slice.stream, self.testStreamName);
test.areEqual('slice.fromEventNumber', slice.fromEventNumber, streamSize*2);
test.areEqual('slice.events.length', slice.events.length, 0);
test.done();
})
.catch(function(err) {
test.done(err);
});
},
'Read Stream Events Backward With No Access': function(test) {
var self = this;
var metadata = {$acl: {$r: '$admins'}};
this.conn.setStreamMetadataRaw(self.testStreamName, client.expectedVersion.noStream, metadata)
.then(function(){
return self.conn.readStreamEventsBackward(self.testStreamName, streamSize-1, streamSize);
})
.then(function(slice) {
test.fail("readStreamEventsBackward succeeded but should have failed.");
test.done();
})
.catch(function(err) {
var isAccessDenied = err instanceof client.AccessDeniedError;
test.ok(isAccessDenied, "readStreamEventsBackward should have failed with AccessDeniedError, got " + err.constructor.name);
if (isAccessDenied) return test.done();
test.done(err);
});
}
};
require('./common/base_test').init(module.exports);

View File

@ -0,0 +1,104 @@
var util = require('util');
var uuid = require('uuid');
var client = require('../src/client');
const streamSize = 100;
module.exports = {
setUp: function(cb) {
this.eventsData = [];
for(var i = 0; i < streamSize; i++)
this.eventsData.push(client.createJsonEventData(uuid.v4(), {a: uuid.v4(), b: Math.random()}, null, 'anEvent'));
this.conn.appendToStream(this.testStreamName, client.expectedVersion.noStream, this.eventsData)
.then(function() {
cb();
})
.catch(cb);
},
'Read Stream Events Forward Happy Path': function(test) {
var self = this;
this.conn.readStreamEventsForward(this.testStreamName, 0, streamSize)
.then(function(slice) {
test.areEqual('slice.status', slice.status, client.eventReadStatus.Success);
test.areEqual('slice.stream', slice.stream, self.testStreamName);
test.areEqual('slice.fromEventNumber', slice.fromEventNumber, 0);
test.areEqual('slice.readDirection', slice.readDirection, 'forward');
test.areEqual('slice.nextEventNumber', slice.nextEventNumber, streamSize);
test.areEqual('slice.lastEventNumber', slice.lastEventNumber, streamSize-1);
test.areEqual('slice.isEndOfStream', slice.isEndOfStream, true);
for(var i = 0; i < streamSize; i++) {
test.eventEqualEventData('slice.events[' + i + ']', slice.events[i], self.eventsData[i]);
test.areEqual('slice.events[' + i + '].originalEventNumber', slice.events[i].originalEventNumber, i);
}
test.done();
})
.catch(function(err) {
test.done(err);
})
},
'Read Stream Events Forward With Non-Existing Stream': function(test) {
var anotherStream = 'test' + uuid.v4();
this.conn.readStreamEventsForward(anotherStream, 0, streamSize)
.then(function(slice) {
test.areEqual('slice.status', slice.status, client.sliceReadStatus.StreamNotFound);
test.areEqual('slice.stream', slice.stream, anotherStream);
test.areEqual('slice.fromEventNumber', slice.fromEventNumber, 0);
test.areEqual('slice.events.length', slice.events.length, 0);
test.done();
})
.catch(function(err) {
test.done(err);
});
},
'Read Stream Events Forward With Deleted Stream': function(test) {
var self = this;
this.conn.deleteStream(this.testStreamName, streamSize-1, true)
.then(function() {
return self.conn.readStreamEventsForward(self.testStreamName, 0, streamSize)
})
.then(function(slice) {
test.areEqual('slice.status', slice.status, client.eventReadStatus.StreamDeleted);
test.areEqual('slice.stream', slice.stream, self.testStreamName);
test.areEqual('slice.fromEventNumber', slice.fromEventNumber, 0);
test.areEqual('slice.events.length', slice.events.length, 0);
test.done();
})
.catch(function(err) {
test.done(err);
});
},
'Read Stream Events Forward With Inexisting Version': function(test) {
var self = this;
return self.conn.readStreamEventsForward(self.testStreamName, streamSize * 2, streamSize)
.then(function(slice) {
test.areEqual('slice.status', slice.status, client.eventReadStatus.Success);
test.areEqual('slice.stream', slice.stream, self.testStreamName);
test.areEqual('slice.fromEventNumber', slice.fromEventNumber, streamSize*2);
test.areEqual('slice.events.length', slice.events.length, 0);
test.done();
})
.catch(function(err) {
test.done(err);
});
},
'Read Stream Events Forward With No Access': function(test) {
var self = this;
var metadata = {$acl: {$r: '$admins'}};
this.conn.setStreamMetadataRaw(self.testStreamName, client.expectedVersion.noStream, metadata)
.then(function(){
return self.conn.readStreamEventsForward(self.testStreamName, 0, streamSize);
})
.then(function(slice) {
test.fail("readStreamEventsForward succeeded but should have failed.");
test.done();
})
.catch(function(err) {
var isAccessDenied = err instanceof client.AccessDeniedError;
test.ok(isAccessDenied, "readStreamEventsForward should have failed with AccessDeniedError, got " + err.constructor.name);
if (isAccessDenied) return test.done();
test.done(err);
});
}
};
require('./common/base_test').init(module.exports);