1
0
Fork 0

test suite for CRUD

This commit is contained in:
Jan Steemann 2014-02-03 19:26:05 +01:00
parent 67a3f306d6
commit a9c1fd005e
1 changed files with 717 additions and 304 deletions

View File

@ -33,15 +33,6 @@ var arangodb = require("org/arangodb");
var ERRORS = arangodb.errors;
var db = arangodb.db;
// -----------------------------------------------------------------------------
// --SECTION-- Cluster CRUD tests
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief test suite for save
////////////////////////////////////////////////////////////////////////////////
function ClusterCrudSaveSuite () {
var createCollection = function (properties) {
try {
db._drop("UnitTestsClusterCrud");
@ -56,33 +47,22 @@ function ClusterCrudSaveSuite () {
return db._create("UnitTestsClusterCrud", properties);
};
return {
// -----------------------------------------------------------------------------
// --SECTION-- Cluster CRUD tests
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief set up
/// @brief test suite for save
////////////////////////////////////////////////////////////////////////////////
setUp : function () {
},
function ClusterCrudSaveSuite () {
////////////////////////////////////////////////////////////////////////////////
/// @brief tear down
/// @brief helper function to execute save tests
////////////////////////////////////////////////////////////////////////////////
tearDown : function () {
try {
db._drop("UnitTestsClusterCrud");
}
catch (err) {
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test save
////////////////////////////////////////////////////////////////////////////////
testSaveOneShard : function () {
var c = createCollection({ numberOfShards: 1 });
var executeSave = function (c) {
var doc;
doc = c.save({ "a" : 1, "b" : "2", "c" : true });
@ -120,50 +100,13 @@ function ClusterCrudSaveSuite () {
catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_KEY_BAD.code, err.errorNum);
}
},
};
////////////////////////////////////////////////////////////////////////////////
/// @brief test save
/// @brief helper function to execute save tests
////////////////////////////////////////////////////////////////////////////////
testSaveMultipleShards : function () {
var c = createCollection({ numberOfShards: 5 });
var doc;
doc = c.save({ "a" : 1, "b" : "2", "c" : true });
assertEqual(doc._id, c.document(doc._id)._id);
assertEqual(doc._id, c.document(doc._key)._id);
assertEqual(doc._key, c.document(doc._id)._key);
assertEqual(doc._key, c.document(doc._key)._key);
assertEqual(1, c.document(doc).a);
assertEqual("2", c.document(doc).b);
assertEqual(true, c.document(doc).c);
doc = c.save({ "a" : 2, "b" : "3", "c" : false});
assertEqual(doc._id, c.document(doc._id)._id);
assertEqual(doc._id, c.document(doc._key)._id);
assertEqual(doc._key, c.document(doc._id)._key);
assertEqual(doc._key, c.document(doc._key)._key);
assertEqual(2, c.document(doc).a);
assertEqual("3", c.document(doc).b);
assertEqual(false, c.document(doc).c);
doc = c.save({ "a" : 3, "b" : "4", "c" : null});
assertEqual(doc._id, c.document(doc._id)._id);
assertEqual(doc._id, c.document(doc._key)._id);
assertEqual(doc._key, c.document(doc._id)._key);
assertEqual(doc._key, c.document(doc._key)._key);
assertEqual(3, c.document(doc).a);
assertEqual("4", c.document(doc).b);
assertNull(c.document(doc).c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test save
////////////////////////////////////////////////////////////////////////////////
testSaveShardKeysOneShard : function () {
var c = createCollection({ numberOfShards: 1, shardKeys: [ "a", "b" ] });
var executeSaveShardKeys = function (c) {
var doc;
doc = c.save({ "a" : 1, "b" : "2", "c" : true });
@ -218,59 +161,65 @@ function ClusterCrudSaveSuite () {
catch (err) {
assertEqual(ERRORS.ERROR_CLUSTER_MUST_NOT_SPECIFY_KEY.code, err.errorNum);
}
};
return {
////////////////////////////////////////////////////////////////////////////////
/// @brief set up
////////////////////////////////////////////////////////////////////////////////
setUp : function () {
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test save
/// @brief tear down
////////////////////////////////////////////////////////////////////////////////
tearDown : function () {
try {
db._drop("UnitTestsClusterCrud");
}
catch (err) {
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test save, one shard
////////////////////////////////////////////////////////////////////////////////
testSaveOneShard : function () {
var c = createCollection({ numberOfShards: 1 });
executeSave(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test save, multiple shards
////////////////////////////////////////////////////////////////////////////////
testSaveMultipleShards : function () {
var c = createCollection({ numberOfShards: 5 });
executeSave(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test save with shard keys, one shard
////////////////////////////////////////////////////////////////////////////////
testSaveShardKeysOneShard : function () {
var c = createCollection({ numberOfShards: 1, shardKeys: [ "a", "b" ] });
executeSaveShardKeys(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test save with shard keys, multiple shards
////////////////////////////////////////////////////////////////////////////////
testSaveShardKeysMultipleShards : function () {
var c = createCollection({ numberOfShards: 7, shardKeys: [ "a", "b" ] });
var doc;
doc = c.save({ "a" : 1, "b" : "2", "c" : true });
assertEqual(doc._id, c.document(doc._id)._id);
assertEqual(doc._id, c.document(doc._key)._id);
assertEqual(doc._key, c.document(doc._id)._key);
assertEqual(doc._key, c.document(doc._key)._key);
assertEqual(1, c.document(doc).a);
assertEqual("2", c.document(doc).b);
assertEqual(true, c.document(doc).c);
doc = c.save({ "a" : 2, "b" : "3", "c" : false});
assertEqual(doc._id, c.document(doc._id)._id);
assertEqual(doc._id, c.document(doc._key)._id);
assertEqual(doc._key, c.document(doc._id)._key);
assertEqual(doc._key, c.document(doc._key)._key);
assertEqual(2, c.document(doc).a);
assertEqual("3", c.document(doc).b);
assertEqual(false, c.document(doc).c);
doc = c.save({ "a" : 3, "b" : "4", "c" : null});
assertEqual(doc._id, c.document(doc._id)._id);
assertEqual(doc._id, c.document(doc._key)._id);
assertEqual(doc._key, c.document(doc._id)._key);
assertEqual(doc._key, c.document(doc._key)._key);
assertEqual(3, c.document(doc).a);
assertEqual("4", c.document(doc).b);
assertNull(c.document(doc).c);
// shard key values defined only partially
doc = c.save({ "b" : "this-is-a-test", "c" : "test" });
assertEqual(doc._id, c.document(doc._id)._id);
assertEqual(doc._id, c.document(doc._key)._id);
assertEqual(doc._key, c.document(doc._id)._key);
assertEqual(doc._key, c.document(doc._key)._key);
assertEqual("this-is-a-test", c.document(doc).b);
assertEqual("test", c.document(doc).c);
// no shard key values defined!!
doc = c.save({ "c" : "test" });
assertEqual(doc._id, c.document(doc._id)._id);
assertEqual(doc._id, c.document(doc._key)._id);
assertEqual(doc._key, c.document(doc._id)._key);
assertEqual(doc._key, c.document(doc._key)._key);
assertEqual("test", c.document(doc).c);
executeSaveShardKeys(c);
}
};
@ -281,18 +230,144 @@ function ClusterCrudSaveSuite () {
////////////////////////////////////////////////////////////////////////////////
function ClusterCrudReplaceSuite () {
var createCollection = function (properties) {
////////////////////////////////////////////////////////////////////////////////
/// @brief helper function for replace
////////////////////////////////////////////////////////////////////////////////
var executeReplace = function (c) {
var old, doc;
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.replace(old._key, { "a" : 4, "b" : "5", "c" : true });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(4, c.document(doc._key).a);
assertEqual("5", c.document(doc._key).b);
assertEqual(true, c.document(doc._key).c);
assertUndefined(c.document(doc._key).d);
doc = c.replace(doc._key, { "b": null, "c": "foo" });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertUndefined(c.document(doc._key).a);
assertNull(c.document(doc._key).b);
assertEqual("foo", c.document(doc._key).c);
assertUndefined(c.document(doc._key).d);
// use document object to replace
doc = c.replace(doc, { "a" : true, "c" : null, "d" : [ 1 ] });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(true, c.document(doc._key).a);
assertUndefined(c.document(doc._key).b);
assertNull(c.document(doc._key).c);
assertEqual([ 1 ], c.document(doc._key).d);
try {
db._drop("UnitTestsClusterCrud");
doc = c.replace(old, { "b" : null, "c" : "foo" });
fail();
}
catch (err) {
catch (err1) {
assertEqual(ERRORS.ERROR_ARANGO_CONFLICT.code, err1.errorNum);
}
if (properties === undefined) {
properties = { };
try {
doc = c.replace("foobar", { "value" : 1 });
fail();
}
catch (err2) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err2.errorNum);
}
};
////////////////////////////////////////////////////////////////////////////////
/// @brief helper function for replace
////////////////////////////////////////////////////////////////////////////////
var executeReplaceShardKeys = function (c) {
var old, doc;
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.replace(old._key, { "a" : 1, "b" : "2", "c" : false });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(1, c.document(doc._key).a);
assertEqual("2", c.document(doc._key).b);
assertEqual(false, c.document(doc._key).c);
assertUndefined(c.document(doc._key).d);
doc = c.replace(doc, { "a" : 1, "c" : null, "d" : [ 1 ], "b" : "2" });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(1, c.document(doc._key).a);
assertEqual("2", c.document(doc._key).b);
assertNull(c.document(doc._key).c);
assertEqual([ 1 ], c.document(doc._key).d);
// use an old revision for the replace
try {
doc = c.replace(old, { "a" : 1, "b" : "2", "c" : "fail" });
fail();
}
catch (err1) {
assertEqual(ERRORS.ERROR_ARANGO_CONFLICT.code, err1.errorNum);
}
return db._create("UnitTestsClusterCrud", properties);
// change shard keys
try {
doc = c.replace(doc._key, { "a" : 2, "b" : "2", "c" : false });
fail();
}
catch (err2) {
assertEqual(ERRORS.ERROR_CLUSTER_MUST_NOT_CHANGE_SHARDING_ATTRIBUTES.code, err2.errorNum);
}
// don't specify any values for shard keys, but update later
old = c.save({ "value" : 1 });
doc = c.replace(old, { "foo" : 2 });
assertEqual(2, c.document(doc._key).foo);
assertUndefined(c.document(doc._key).value);
doc = c.replace(doc, { "a" : null, "b" : null, "foo" : 3 });
assertEqual(3, c.document(doc._key).foo);
assertUndefined(c.document(doc._key).value);
// specify null values for shard keys, but update later
old = c.save({ "a" : null, "b" : null, "value" : 1 });
doc = c.replace(old, { "foo" : 2 });
assertUndefined(c.document(doc._key).a);
assertUndefined(c.document(doc._key).b);
assertEqual(2, c.document(doc._key).foo);
assertUndefined(c.document(doc._key).value);
// change shard keys
try {
doc = c.replace(doc._key, { "a" : 2, "b" : "2", "c" : false });
fail();
}
catch (err3) {
assertEqual(ERRORS.ERROR_CLUSTER_MUST_NOT_CHANGE_SHARDING_ATTRIBUTES.code, err3.errorNum);
}
try {
doc = c.replace("foobar", { "value" : 1 });
fail();
}
catch (err4) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err4.errorNum);
}
};
return {
@ -317,154 +392,488 @@ function ClusterCrudReplaceSuite () {
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test replace
/// @brief test replace, one shard
////////////////////////////////////////////////////////////////////////////////
testReplaceOneShard : function () {
var c = createCollection({ numberOfShards: 1 });
var old, doc;
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.replace(old._key, { "a" : 4, "b" : "5", "c" : true });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(4, c.document(doc._key).a);
assertEqual("5", c.document(doc._key).b);
assertEqual(true, c.document(doc._key).c);
assertUndefined(c.document(doc._key).d);
doc = c.replace(doc._key, { "b": null, "c": "foo" });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertNotEqual(old._rev, doc._rev);
assertUndefined(c.document(doc._key).a);
assertNull(c.document(doc._key).b);
assertEqual("foo", c.document(doc._key).c);
assertUndefined(c.document(doc._key).d);
// use document object to replace
doc = c.replace(doc, { "a" : true, "c" : null, "d" : [ 1 ] });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertNotEqual(old._rev, doc._rev);
assertEqual(true, c.document(doc._key).a);
assertUndefined(c.document(doc._key).b);
assertNull(c.document(doc._key).c);
assertEqual([ 1 ], c.document(doc._key).d);
try {
doc = c.replace(old, { "b" : null, "c" : "foo" });
fail();
}
catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_CONFLICT.code, err.errorNum);
}
executeReplace(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test replace
/// @brief test replace, multiple shards
////////////////////////////////////////////////////////////////////////////////
testReplaceMultipleShards : function () {
var c = createCollection({ numberOfShards: 7 });
var old, doc;
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.replace(old._key, { "a" : 4, "b" : "5", "c" : true });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(4, c.document(doc._key).a);
assertEqual("5", c.document(doc._key).b);
assertEqual(true, c.document(doc._key).c);
assertUndefined(c.document(doc._key).d);
doc = c.replace(doc._key, { "b": null, "c": "foo" });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertNotEqual(old._rev, doc._rev);
assertNull(c.document(doc._key).b);
assertEqual("foo", c.document(doc._key).c);
assertUndefined(c.document(doc._key).a);
assertUndefined(c.document(doc._key).d);
// use document object to replace
doc = c.replace(doc, { "a" : true, "c" : null, "d" : [ 1 ] });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertNotEqual(old._rev, doc._rev);
assertEqual(true, c.document(doc._key).a);
assertUndefined(c.document(doc._key).b);
assertNull(c.document(doc._key).c);
assertEqual([ 1 ], c.document(doc._key).d);
// use an old revision for the replace
try {
doc = c.replace(old, { "b" : null, "c" : "foo" });
fail();
}
catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_CONFLICT.code, err.errorNum);
}
executeReplace(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test replace
/// @brief test replace with shard keys, one shard
////////////////////////////////////////////////////////////////////////////////
testReplaceShardKeysOneShard : function () {
var c = createCollection({ numberOfShards: 1, shardKeys: [ "a", "b" ] });
executeReplaceShardKeys(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test replace with shard keys, multiple shards
////////////////////////////////////////////////////////////////////////////////
testReplaceShardKeysMultipleShards : function () {
var c = createCollection({ numberOfShards: 5, shardKeys: [ "a", "b" ] });
executeReplaceShardKeys(c);
}
};
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test suite for update
////////////////////////////////////////////////////////////////////////////////
function ClusterCrudUpdateSuite () {
////////////////////////////////////////////////////////////////////////////////
/// @brief helper function for update
////////////////////////////////////////////////////////////////////////////////
var executeUpdate = function (c) {
var old, doc;
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.replace(old._key, { "a" : 1, "b" : "2", "c" : false });
doc = c.update(old._key, { "a" : 4, "b" : "5", "c" : false, "e" : "foo" });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(1, c.document(doc._key).a);
assertEqual("2", c.document(doc._key).b);
assertEqual(4, c.document(doc._key).a);
assertEqual("5", c.document(doc._key).b);
assertEqual(false, c.document(doc._key).c);
assertUndefined(c.document(doc._key).d);
assertEqual("test", c.document(doc._key).d);
assertEqual("foo", c.document(doc._key).e);
doc = c.replace(doc, { "a" : 1, "c" : null, "d" : [ 1 ], "b" : "2" });
doc = c.update(doc._key, { "b" : null, "c" : "foo" });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(4, c.document(doc._key).a);
assertEqual("null", c.document(doc._key).b);
assertEqual("foo", c.document(doc._key).c);
assertEqual("test", c.document(doc._key).d);
assertEqual("foo", c.document(doc._key).e);
// use document object to update
doc = c.update(doc, { "a" : true, "c" : null, "d" : [ 1 ] });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(1, c.document(doc._key).a);
assertEqual("2", c.document(doc._key).b);
assertEqual(true, c.document(doc._key).a);
assertNull(c.document(doc._key).b);
assertNull(c.document(doc._key).c);
assertEqual([ 1 ], c.document(doc._key).d);
assertEqual("foo", c.document(doc._key).e);
// use keepNull = false
doc = c.update(doc._key, { "b" : null, "c" : "foo", e : null }, false, false);
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual("true", c.document(doc._key).a);
assertUndefined(c.document(doc._key).b);
assertEqual("foo", c.document(doc._key).c);
assertEqual([ 1 ], c.document(doc._key).d);
assertUndefined(c.document(doc._key).e);
// use keepNull = true
doc = c.update(doc._key, { "b" : null, "c" : "foo", e : null }, false, true);
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual("true", c.document(doc._key).a);
assertNull(c.document(doc._key).b);
assertEqual("foo", c.document(doc._key).c);
assertEqual([ 1 ], c.document(doc._key).d);
assertNull(c.document(doc._key).e);
// use an old revision for the replace
try {
doc = c.replace(old, { "a" : 1, "b" : "2", "c" : "fail" });
doc = c.update(old, { "b" : null, "c" : "foo" });
fail();
}
catch (err1) {
assertEqual(ERRORS.ERROR_ARANGO_CONFLICT.code, err1.errorNum);
}
try {
doc = c.update("foobar", { "value" : 1 });
fail();
}
catch (err2) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err2.errorNum);
}
};
////////////////////////////////////////////////////////////////////////////////
/// @brief helper function for update
////////////////////////////////////////////////////////////////////////////////
var executeUpdateShardKeys = function (c) {
var old, doc;
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.update(old._key, { "a" : 1, "b" : "2", "c" : false, "e" : "foo" });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(1, c.document(doc._key).a);
assertEqual("2", c.document(doc._key).b);
assertEqual(false, c.document(doc._key).c);
assertEqual("test", c.document(doc._key).d);
assertEqual("foo", c.document(doc._key).e);
doc = c.update(doc._key, { "b" : "2", "c" : "foo" });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(1, c.document(doc._key).a);
assertEqual("2", c.document(doc._key).b);
assertEqual("foo", c.document(doc._key).c);
assertEqual("test", c.document(doc._key).d);
assertEqual("foo", c.document(doc._key).e);
// use document object to update
doc = c.update(doc, { "a" : 1, "c" : null, "d" : [ 1 ] });
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(1, c.document(doc._key).a);
assertEqual("2", c.document(doc._key).b);
assertNull(c.document(doc._key).c);
assertEqual([ 1 ], c.document(doc._key).d);
assertEqual("foo", c.document(doc._key).e);
// use keepNull = false
doc = c.update(doc._key, { "c" : "foo", e : null }, false, false);
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(1, c.document(doc._key).a);
assertEqual("2", c.document(doc._key).b);
assertEqual("foo", c.document(doc._key).c);
assertEqual([ 1 ], c.document(doc._key).d);
assertUndefined(c.document(doc._key).e);
// use keepNull = true
doc = c.update(doc._key, { "c" : "foo", e : null }, false, true);
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertNotEqual(old._rev, doc._rev);
assertEqual(1, c.document(doc._key).a);
assertEqual("2", c.document(doc._key).b);
assertEqual("foo", c.document(doc._key).c);
assertEqual([ 1 ], c.document(doc._key).d);
assertNull(c.document(doc._key).e);
try {
doc = c.update(old, { "c" : "food" });
fail();
}
catch (err1) {
assertEqual(ERRORS.ERROR_ARANGO_CONFLICT.code, err1.errorNum);
}
try {
doc = c.update("foobar", { "value" : 1 });
fail();
}
catch (err2) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err2.errorNum);
}
// change shard keys
try {
doc = c.replace(doc._key, { "a" : 2, "b" : "2", "c" : false });
doc = c.update(doc._key, { "a" : 2, "b" : "2", "c" : false });
fail();
}
catch (err2) {
assertEqual(ERRORS.ERROR_CLUSTER_MUST_NOT_CHANGE_SHARDING_ATTRIBUTES.code, err2.errorNum);
}
try {
doc = c.update(doc._key, { "b" : "1", "c" : false });
fail();
}
catch (err3) {
assertEqual(ERRORS.ERROR_CLUSTER_MUST_NOT_CHANGE_SHARDING_ATTRIBUTES.code, err3.errorNum);
}
// don't specify any values for shard keys, but update later
old = c.save({ "value" : 1 });
doc = c.update(old, { "foo" : 2 });
assertEqual(2, c.document(doc._key).foo);
assertEqual(1, c.document(doc._key).value);
doc = c.update(doc, { "a" : null, "b" : null, "foo" : 3 });
assertEqual(3, c.document(doc._key).foo);
assertEqual(1, c.document(doc._key).value);
// specify null values for shard keys, but update later
old = c.save({ "a" : null, "b" : null, "value" : 1 });
doc = c.update(old, { "foo" : 2 });
assertNull(c.document(doc._key).a);
assertNull(c.document(doc._key).b);
assertEqual(2, c.document(doc._key).foo);
assertEqual(1, c.document(doc._key).value);
};
return {
////////////////////////////////////////////////////////////////////////////////
/// @brief set up
////////////////////////////////////////////////////////////////////////////////
setUp : function () {
},
////////////////////////////////////////////////////////////////////////////////
/// @brief tear down
////////////////////////////////////////////////////////////////////////////////
tearDown : function () {
try {
db._drop("UnitTestsClusterCrud");
}
catch (err) {
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test update
////////////////////////////////////////////////////////////////////////////////
testUpdateOneShard : function () {
var c = createCollection({ numberOfShards: 1 });
executeUpdate(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test update
////////////////////////////////////////////////////////////////////////////////
testUpdateMultipleShards : function () {
var c = createCollection({ numberOfShards: 7 });
executeUpdate(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test update
////////////////////////////////////////////////////////////////////////////////
testUpdateShardKeysOneShard : function () {
var c = createCollection({ numberOfShards: 1, shardKeys: [ "a", "b" ] });
executeUpdateShardKeys(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test update
////////////////////////////////////////////////////////////////////////////////
testUpdateShardKeysMultipleShards : function () {
var c = createCollection({ numberOfShards: 5, shardKeys: [ "a", "b" ] });
executeUpdateShardKeys(c);
}
};
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test suite for delete
////////////////////////////////////////////////////////////////////////////////
function ClusterCrudDeleteSuite () {
////////////////////////////////////////////////////////////////////////////////
/// @brief helper function for delete
////////////////////////////////////////////////////////////////////////////////
var executeDelete = function (c) {
var old, doc;
// remove by id
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.remove(old._id);
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertEqual(old._rev, doc._rev);
// remove by key
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.remove(old._key);
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertEqual(old._rev, doc._rev);
// remove by document
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.remove(old);
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertEqual(old._rev, doc._rev);
// remove by document, non-existing
try {
c.remove(old);
fail();
}
catch (err1) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err1.errorNum);
}
// remove a non-existing revision
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.update(old._key, { "foo" : "bar" });
try {
c.remove(old);
fail();
}
catch (err2) {
assertEqual(ERRORS.ERROR_ARANGO_CONFLICT.code, err2.errorNum);
}
// remove non-existing
try {
c.document("foobarbaz");
}
catch (err3) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err3.errorNum);
}
};
////////////////////////////////////////////////////////////////////////////////
/// @brief helper function for delete
////////////////////////////////////////////////////////////////////////////////
var executeDeleteShardKeys = function (c) {
var old, doc;
// remove by id
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.remove(old._id);
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertEqual(old._rev, doc._rev);
// remove by key
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.remove(old._key);
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertEqual(old._rev, doc._rev);
// remove by document
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.remove(old);
assertEqual(old._id, doc._id);
assertEqual(old._key, doc._key);
assertEqual(old._rev, doc._rev);
// remove by document, non-existing
try {
c.remove(old);
fail();
}
catch (err1) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err1.errorNum);
}
// remove a non-existing revision
old = c.save({ "a" : 1, "b" : "2", "c" : true, "d" : "test" });
doc = c.update(old._key, { "foo" : "bar" });
try {
c.remove(old);
fail();
}
catch (err2) {
assertEqual(ERRORS.ERROR_ARANGO_CONFLICT.code, err2.errorNum);
}
// remove non-existing
try {
c.document("foobarbaz");
}
catch (err3) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err3.errorNum);
}
};
return {
////////////////////////////////////////////////////////////////////////////////
/// @brief set up
////////////////////////////////////////////////////////////////////////////////
setUp : function () {
},
////////////////////////////////////////////////////////////////////////////////
/// @brief tear down
////////////////////////////////////////////////////////////////////////////////
tearDown : function () {
try {
db._drop("UnitTestsClusterCrud");
}
catch (err) {
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test delete
////////////////////////////////////////////////////////////////////////////////
testDeleteOneShard : function () {
var c = createCollection({ numberOfShards: 1 });
executeDelete(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test delete
////////////////////////////////////////////////////////////////////////////////
testDeleteMultipleShards : function () {
var c = createCollection({ numberOfShards: 5 });
executeDelete(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test delete
////////////////////////////////////////////////////////////////////////////////
testDeleteShardKeysOneShard : function () {
var c = createCollection({ numberOfShards: 1, shardKeys: [ "a", "b" ] });
executeDeleteShardKeys(c);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test delete
////////////////////////////////////////////////////////////////////////////////
testDeleteShardKeysMultipleShards : function () {
var c = createCollection({ numberOfShards: 5, shardKeys: [ "a", "b" ] });
executeDeleteShardKeys(c);
}
};
@ -480,6 +889,10 @@ function ClusterCrudReplaceSuite () {
jsunity.run(ClusterCrudSaveSuite);
jsunity.run(ClusterCrudReplaceSuite);
jsunity.run(ClusterCrudUpdateSuite);
jsunity.run(ClusterCrudDeleteSuite);
//jsunity.run(ClusterCrudDocumentSuite);
//jsunity.run(ClusterCrudExistsSuite);
return jsunity.done();