|
|
@@ -0,0 +1,153 @@
|
|
|
+var assert = require("assert"),
|
|
|
+ SplitDocumentSource = require("../../../../lib/pipeline/documentSources/SplitDocumentSource"),
|
|
|
+ CursorDocumentSource = require("../../../../lib/pipeline/documentSources/CursorDocumentSource"),
|
|
|
+ Cursor = require("../../../../lib/Cursor");
|
|
|
+
|
|
|
+module.exports = {
|
|
|
+
|
|
|
+ "SplitDocumentSource": {
|
|
|
+
|
|
|
+ "constructor()": {
|
|
|
+
|
|
|
+ "should not throw Error when constructing without args": function testConstructor(){
|
|
|
+ assert.doesNotThrow(function(){
|
|
|
+ new SplitDocumentSource();
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ "should throw an error if called with arguments.length > 0": function throwsWithArgs(){
|
|
|
+ assert.throws(function(){
|
|
|
+ new SplitDocumentSource(1);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ "#getSourceName()": {
|
|
|
+
|
|
|
+ "should return the correct source name; $split": function testSourceName(){
|
|
|
+ var pds = new SplitDocumentSource();
|
|
|
+ assert.strictEqual(pds.getSourceName(), SplitDocumentSource.splitName);
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ "#eof()": {
|
|
|
+
|
|
|
+ "shouldn't be eof after init": function testEOF(){
|
|
|
+ var cwc = new CursorDocumentSource.CursorWithContext();
|
|
|
+ cwc._cursor = new Cursor( [{a: 1}] );
|
|
|
+ var cds = new CursorDocumentSource(cwc);
|
|
|
+ var split = new SplitDocumentSource();
|
|
|
+ split.setSource(cds);
|
|
|
+ assert.ok(!split.eof());
|
|
|
+ },
|
|
|
+
|
|
|
+ "should be eof after one call to get current": function testAdvanceFirst() {
|
|
|
+ var cwc = new CursorDocumentSource.CursorWithContext();
|
|
|
+ var input = [{_id: 0, a: 1}, {_id: 1, a: 2}];
|
|
|
+ cwc._cursor = new Cursor( input );
|
|
|
+ var cds = new CursorDocumentSource(cwc);
|
|
|
+ var split = new SplitDocumentSource();
|
|
|
+ split.setSource(cds);
|
|
|
+ assert.ok(split.getCurrent());
|
|
|
+ assert.ok(split.eof);
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ "#advance()": {
|
|
|
+
|
|
|
+ "can't advance after one call to getCurrent": function testAdvanceFirst() {
|
|
|
+ var cwc = new CursorDocumentSource.CursorWithContext();
|
|
|
+ var input = [{_id: 0, a: 1}, {_id: 1, a: 2}];
|
|
|
+ cwc._cursor = new Cursor( input );
|
|
|
+ var cds = new CursorDocumentSource(cwc);
|
|
|
+ var split = new SplitDocumentSource();
|
|
|
+ split.setSource(cds);
|
|
|
+ assert.ok(split.getCurrent());
|
|
|
+ assert.ok(!split.advance());
|
|
|
+ },
|
|
|
+
|
|
|
+ "throws exception if advanced beyond eof": function throwsBeyondEof() {
|
|
|
+ assert.throws(function() {
|
|
|
+ var cwc = new CursorDocumentSource.CursorWithContext();
|
|
|
+ var input = [{_id: 0, a: 1}, {_id: 1, a: 2}];
|
|
|
+ cwc._cursor = new Cursor( input );
|
|
|
+ var cds = new CursorDocumentSource(cwc);
|
|
|
+ var split = new SplitDocumentSource();
|
|
|
+ split.setSource(cds);
|
|
|
+ split.getCurrent();
|
|
|
+ split.advance();
|
|
|
+ split.advance();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ "#populate()": function testPopulate() {
|
|
|
+ var spec = {
|
|
|
+ aX2:[{$project:{a:{$multiply:["$a", 2]}}}],
|
|
|
+ aX3:[{$project:{a:{$multiply:["$a", 3]}}}]
|
|
|
+ };
|
|
|
+
|
|
|
+ var cwc = new CursorDocumentSource.CursorWithContext();
|
|
|
+ var input = [{a:1}, {a:2}];
|
|
|
+ cwc._cursor = new Cursor( input );
|
|
|
+ var cds = new CursorDocumentSource(cwc);
|
|
|
+ var split = SplitDocumentSource.createFromJson(spec);
|
|
|
+ split.setSource(cds);
|
|
|
+
|
|
|
+ assert.ok(!split.eof());
|
|
|
+ assert.deepEqual({aX2:[{a:2}, {a:4}], aX3:[{a:3}, {a:6}]}, split.getCurrent());
|
|
|
+ /*
|
|
|
+ assert.ok(!split.getCurrent().b);
|
|
|
+ assert.ok(split.advance());
|
|
|
+ assert.ok(!split.eof());
|
|
|
+ assert.equal(3, split.getCurret().a);
|
|
|
+ assert.ok(!split.getCurrent().b);
|
|
|
+ assert.ok(!split.advance());
|
|
|
+ assertExhausted(split);
|
|
|
+ */
|
|
|
+ },
|
|
|
+
|
|
|
+ "#createFromJson()": {
|
|
|
+
|
|
|
+ "should error if called with non-object": function testNonObjectPassed() {
|
|
|
+ //String as arg
|
|
|
+ assert.throws(function() {
|
|
|
+ var split = SplitDocumentSource.createFromJson("not an object");
|
|
|
+ });
|
|
|
+ //Date as arg
|
|
|
+ assert.throws(function() {
|
|
|
+ var split = SplitDocumentSource.createFromJson(new Date());
|
|
|
+ });
|
|
|
+ //Array as arg
|
|
|
+ assert.throws(function() {
|
|
|
+ var split = SplitDocumentSource.createFromJson([]);
|
|
|
+ });
|
|
|
+ //Empty args
|
|
|
+ assert.throws(function() {
|
|
|
+ var split = SplitDocumentSource.createFromJson();
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ "should error if spec has no keys": function testNoKeys() {
|
|
|
+ assert.throws(function() {
|
|
|
+ var split = SplitDocumentSource.createFromJson({});
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ "should error if value of a key in top level is not an array": function testNoKeys() {
|
|
|
+ assert.throws(function() {
|
|
|
+ var split = SplitDocumentSource.createFromJson({a: "not an array"});
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+};
|
|
|
+
|
|
|
+if (!module.parent)(new(require("mocha"))()).ui("exports").reporter("spec").addFile(__filename).run(process.exit);
|
|
|
+
|