These calls were mostly mistakes that should have been assert.eq(). assert() will now trip if passed a non-string msg, or too many params.
172 lines
5.4 KiB
JavaScript
172 lines
5.4 KiB
JavaScript
|
|
var collectionName = "bulk_api_ordered";
|
|
var coll = db.getCollection(collectionName);
|
|
coll.drop();
|
|
|
|
var request;
|
|
var result;
|
|
|
|
jsTest.log("Starting bulk api ordered tests...");
|
|
|
|
/********************************************************
|
|
*
|
|
* Unordered tests should return same results for write command as
|
|
* well as for the legacy operations
|
|
*
|
|
*******************************************************/
|
|
var executeTests = function() {
|
|
/**
|
|
* find() requires selector and $key is disallowed as field name
|
|
*/
|
|
var bulkOp = coll.initializeOrderedBulkOp();
|
|
|
|
assert.throws( function(){ bulkOp.find();} );
|
|
assert.throws( function(){ bulkOp.insert({$key: 1});} );
|
|
|
|
/**
|
|
* Single successful ordered bulk operation
|
|
*/
|
|
var bulkOp = coll.initializeOrderedBulkOp();
|
|
bulkOp.insert({a:1});
|
|
bulkOp.find({a:1}).updateOne({$set: {b:1}});
|
|
// no-op, should increment nMatched but not nModified
|
|
bulkOp.find({a:1}).updateOne({$set: {b:1}});
|
|
bulkOp.find({a:2}).upsert().updateOne({$set: {b:2}});
|
|
bulkOp.insert({a:3});
|
|
bulkOp.find({a:3}).update({$set: {b:1}});
|
|
bulkOp.find({a:3}).upsert().update({$set: {b:2}});
|
|
bulkOp.find({a:10}).upsert().update({$set: {b:2}});
|
|
bulkOp.find({a:2}).replaceOne({a:11});
|
|
bulkOp.find({a:11}).removeOne();
|
|
bulkOp.find({a:3}).remove({a:3});
|
|
var result = bulkOp.execute();
|
|
assert.eq(2, result.nInserted);
|
|
assert.eq(2, result.nUpserted);
|
|
assert.eq(5, result.nMatched);
|
|
// only check nModified if write commands are enabled
|
|
if ( coll.getMongo().writeMode() == "commands" ) {
|
|
assert.eq(4, result.nModified);
|
|
}
|
|
assert.eq(2, result.nRemoved);
|
|
var upserts = result.getUpsertedIds();
|
|
assert.eq(2, upserts.length);
|
|
assert.eq(3, upserts[0].index);
|
|
assert(upserts[0]._id != null);
|
|
var upsert = result.getUpsertedIdAt(0);
|
|
assert.eq(3, upsert.index);
|
|
assert(upsert._id != null);
|
|
assert.eq(2, coll.find({}).itcount(), "find should return two documents");
|
|
|
|
// illegal to try to convert a multi-op batch into a SingleWriteResult
|
|
assert.throws(function() { result.toSingleResult(); } );
|
|
|
|
// attempt to re-run bulk operation
|
|
assert.throws(function() { bulkOp.execute(); } );
|
|
|
|
// Test SingleWriteResult
|
|
var singleBatch = coll.initializeOrderedBulkOp();
|
|
singleBatch.find({a:4}).upsert().updateOne({$set: {b:1}});
|
|
var singleResult = singleBatch.execute().toSingleResult();
|
|
assert(singleResult.getUpsertedId() != null);
|
|
|
|
// Create unique index
|
|
coll.remove({});
|
|
coll.ensureIndex({a : 1}, {unique : true});
|
|
|
|
/**
|
|
* Single error ordered bulk operation
|
|
*/
|
|
var bulkOp = coll.initializeOrderedBulkOp();
|
|
bulkOp.insert({b:1, a:1});
|
|
bulkOp.find({b:2}).upsert().updateOne({$set: {a:1}});
|
|
bulkOp.insert({b:3, a:2});
|
|
var result = assert.throws( function() { bulkOp.execute(); } );
|
|
assert(result instanceof BulkWriteError);
|
|
assert(result instanceof Error);
|
|
// Basic properties check
|
|
assert.eq(1, result.nInserted);
|
|
assert.eq(true, result.hasWriteErrors());
|
|
assert.eq(1, result.getWriteErrorCount());
|
|
|
|
// Get the first error
|
|
var error = result.getWriteErrorAt(0);
|
|
assert.eq(11000, error.code);
|
|
assert(error.errmsg != null);
|
|
|
|
// Get the operation that caused the error
|
|
var op = error.getOperation();
|
|
assert.eq(2, op.q.b);
|
|
assert.eq(1, op.u['$set'].a);
|
|
assert.eq(false, op.multi);
|
|
assert.eq(true, op.upsert);
|
|
|
|
// Get the first error
|
|
var error = result.getWriteErrorAt(1);
|
|
assert.eq(null, error);
|
|
|
|
// Create unique index
|
|
coll.dropIndexes();
|
|
coll.remove({});
|
|
coll.ensureIndex({a : 1}, {unique : true});
|
|
|
|
/**
|
|
* Multiple error ordered bulk operation
|
|
*/
|
|
var bulkOp = coll.initializeOrderedBulkOp();
|
|
bulkOp.insert({b:1, a:1});
|
|
bulkOp.find({b:2}).upsert().updateOne({$set: {a:1}});
|
|
bulkOp.find({b:3}).upsert().updateOne({$set: {a:2}});
|
|
bulkOp.find({b:2}).upsert().updateOne({$set: {a:1}});
|
|
bulkOp.insert({b:4, a:3});
|
|
bulkOp.insert({b:5, a:1});
|
|
var result = assert.throws( function() { bulkOp.execute(); } );
|
|
|
|
// Basic properties check
|
|
assert.eq(1, result.nInserted);
|
|
assert.eq(true, result.hasWriteErrors());
|
|
assert.eq(1, result.getWriteErrorCount());
|
|
|
|
// Individual error checking
|
|
var error = result.getWriteErrorAt(0);
|
|
assert.eq(1, error.index);
|
|
assert.eq(11000, error.code);
|
|
assert(error.errmsg != null);
|
|
assert.eq(2, error.getOperation().q.b);
|
|
assert.eq(1, error.getOperation().u['$set'].a);
|
|
assert.eq(false, error.getOperation().multi);
|
|
assert.eq(true, error.getOperation().upsert);
|
|
|
|
// Create unique index
|
|
coll.dropIndexes();
|
|
coll.remove({});
|
|
coll.ensureIndex({a : 1}, {unique : true});
|
|
}
|
|
|
|
var buildVersion = parseInt(db.runCommand({buildInfo:1}).versionArray.slice(0, 3).join(""), 10);
|
|
// Save the existing useWriteCommands function
|
|
var _useWriteCommands = coll.getMongo().useWriteCommands;
|
|
|
|
//
|
|
// Only execute write command tests if we have > 2.5.5 otherwise
|
|
// execute the down converted version
|
|
if(buildVersion >= 255) {
|
|
// Force the use of useWriteCommands
|
|
coll._mongo.useWriteCommands = function() {
|
|
return true;
|
|
}
|
|
|
|
// Execute tests using legacy operations
|
|
executeTests();
|
|
}
|
|
|
|
// Force the use of legacy commands
|
|
coll._mongo.useWriteCommands = function() {
|
|
return false;
|
|
}
|
|
|
|
// Execute tests using legacy operations
|
|
executeTests();
|
|
|
|
// Reset the function
|
|
coll.getMongo().useWriteCommands = _useWriteCommands;
|