1
0
Fork 0
arangodb/tests/js/client/shell/shell-graph-transaction.js

760 lines
25 KiB
JavaScript

/* jshint globalstrict:false, strict:false, maxlen: 200 */
/* global fail, arango, assertTrue, assertFalse, assertEqual, assertNotUndefined */
// //////////////////////////////////////////////////////////////////////////////
// / @brief ArangoTransaction tests for graphs
// /
// /
// / DISCLAIMER
// /
// / Copyright 2018 ArangoDB GmbH, Cologne, Germany
// /
// / Licensed under the Apache License, Version 2.0 (the "License")
// / you may not use this file except in compliance with the License.
// / You may obtain a copy of the License at
// /
// / http://www.apache.org/licenses/LICENSE-2.0
// /
// / Unless required by applicable law or agreed to in writing, software
// / distributed under the License is distributed on an "AS IS" BASIS,
// / WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// / See the License for the specific language governing permissions and
// / limitations under the License.
// /
// / Copyright holder is triAGENS GmbH, Cologne, Germany
// /
// / @author Jan Steemann
// //////////////////////////////////////////////////////////////////////////////
var jsunity = require('jsunity');
var arangodb = require('@arangodb');
var ERRORS = arangodb.errors;
var Graph = require('@arangodb/general-graph');
var db = arangodb.db;
function JSTransactionGraphSuite () {
'use strict';
const graph = 'UnitTestsGraph';
const vertex = 'UnitTestsVertex';
const edge = 'UnitTestsEdge';
let g;
return {
setUp: function () {
if (Graph._exists(graph)) {
Graph._drop(graph, true);
}
g = Graph._create(graph,
[Graph._relation(edge, vertex, vertex)]
);
},
tearDown: function () {
Graph._drop(graph, true);
},
// / @brief test: insert vertex
testVertexInsertUndeclaredJS: function () {
try {
db._executeTransaction({
collections: {},
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
graph[params.vertex].insert({ _key: "test", value: "test" });
},
params: { vertex, graph }
});
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_TRANSACTION_UNREGISTERED_COLLECTION.code, err.errorNum);
}
},
// / @brief test: insert edge
testEdgeInsertUndeclaredJS: function () {
try {
db._executeTransaction({
collections: {},
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
graph[params.edge].insert({ _key: "test", value: "test", _from: params.vertex + "/1", _to: params.vertex + "/2" });
},
params: { vertex, edge, graph }
});
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_TRANSACTION_UNREGISTERED_COLLECTION.code, err.errorNum);
}
},
// / @brief test: insert vertex
testVertexInsertJS: function () {
db._executeTransaction({
collections: { write: vertex },
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
graph[params.vertex].insert({ _key: "test", value: "test" });
let result = graph[params.vertex].document("test");
if (result.value !== "test") {
throw "peng";
}
},
params: { vertex, graph }
});
let result = db._collection(vertex).document("test");
assertEqual("test", result.value);
},
// / @brief test: insert edge
testEdgeInsertJS: function () {
db._executeTransaction({
collections: { write: [ vertex, edge ] },
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
graph[params.vertex].insert({ _key: "1", value: "test" });
graph[params.vertex].insert({ _key: "2", value: "test" });
graph[params.edge].insert({ _key: "test", value: "test", _from: params.vertex + "/1", _to: params.vertex + "/2" });
let result = graph[params.edge].document("test");
if (result.value !== "test") {
throw "peng";
}
},
params: { vertex, edge, graph }
});
let result = db._collection(edge).document("test");
assertEqual("test", result.value);
assertEqual(vertex + "/1", result._from);
assertEqual(vertex + "/2", result._to);
},
// / @brief test: remove vertex
testVertexRemoveJS: function () {
db[vertex].insert({ _key: "test", value: "test" });
db._executeTransaction({
collections: { write: [vertex, edge] },
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
let ERRORS = require("@arangodb").errors;
graph[params.vertex].remove("test");
try {
graph[params.vertex].document("test");
throw "peng";
} catch (err) {
if (ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code !== err.errorNum) {
throw "peng";
}
}
},
params: { vertex, graph }
});
try {
db._collection(vertex).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
},
// / @brief test: remove vertex with dependencies
testVertexRemoveWithDependenciesJS: function () {
db[vertex].insert({ _key: "1" });
db[vertex].insert({ _key: "2" });
db[edge].insert({ _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" });
db._executeTransaction({
collections: { write: [ vertex, edge ] },
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
let ERRORS = require("@arangodb").errors;
graph[params.vertex].remove("1");
try {
graph[params.vertex].document("1");
throw "peng";
} catch (err) {
if (ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code !== err.errorNum) {
throw "peng";
}
}
try {
graph[params.edge].document("test");
throw "peng";
} catch (err) {
if (ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code !== err.errorNum) {
throw "peng";
}
}
},
params: { vertex, edge, graph }
});
try {
db._collection(vertex).document("1");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
try {
db._collection(edge).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
},
// / @brief test: remove vertex with dependencies
testVertexRemoveWithDependenciesUndeclaredVertexCollectionJS: function () {
db[vertex].insert({ _key: "1" });
db[vertex].insert({ _key: "2" });
db[edge].insert({ _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" });
try {
db._executeTransaction({
collections: { write: edge },
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
graph[params.vertex].remove("1");
throw "peng";
},
params: { vertex, edge, graph }
});
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_TRANSACTION_UNREGISTERED_COLLECTION.code, err.errorNum);
}
let result = db._collection(vertex).document("1");
assertEqual("1", result._key);
result = db._collection(edge).document("test");
assertEqual("test", result.value);
},
// / @brief test: remove edge
testEdgeRemoveJS: function () {
db[vertex].insert({ _key: "1" });
db[vertex].insert({ _key: "2" });
db[edge].insert({ _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" });
db._executeTransaction({
collections: { write: edge },
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
let ERRORS = require("@arangodb").errors;
graph[params.edge].remove("test");
try {
graph[params.edge].document("test");
throw "peng";
} catch (err) {
if (ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code !== err.errorNum) {
throw "peng";
}
}
},
params: { edge, graph }
});
try {
db._collection(edge).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
},
// / @brief test: update edge
testEdgeUpdateJS: function () {
db[vertex].insert({ _key: "1" });
db[vertex].insert({ _key: "2" });
db[edge].insert({ _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" });
db._executeTransaction({
collections: { write: edge },
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
graph[params.edge].update("test", { value: "meow" });
let result = graph[params.edge].document("test");
if (result.value !== "meow") {
throw "peng";
}
},
params: { edge, graph }
});
let result = db._collection(edge).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
},
// / @brief test: update vertex
testVertexUpdateJS: function () {
db[vertex].insert({ _key: "test", value: "test" });
db._executeTransaction({
collections: { write: vertex },
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
graph[params.vertex].update("test", { value: "meow" });
let result = graph[params.vertex].document("test");
if (result.value !== "meow") {
throw "peng";
}
},
params: { vertex, graph }
});
let result = db._collection(vertex).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
},
// / @brief test: replace edge
testEdgeReplaceJS: function () {
db[vertex].insert({ _key: "1" });
db[vertex].insert({ _key: "2" });
db[edge].insert({ _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" });
db._executeTransaction({
collections: { write: edge },
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
graph[params.edge].replace("test", { value: "meow", _from: params.vertex + "/1", _to: params.vertex + "/2" });
let result = graph[params.edge].document("test");
if (result.value !== "meow") {
throw "peng";
}
},
params: { vertex, edge, graph }
});
let result = db._collection(edge).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
},
// / @brief test: replace vertex
testVertexReplaceJS: function () {
db[vertex].insert({ _key: "test", value: "test" });
db._executeTransaction({
collections: { write: vertex },
action: function(params) {
let graph = require("@arangodb/general-graph")._graph(params.graph);
graph[params.vertex].replace("test", { value: "meow" });
let result = graph[params.vertex].document("test");
if (result.value !== "meow") {
throw "peng";
}
},
params: { vertex, graph }
});
let result = db._collection(vertex).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
},
};
}
function TransactionGraphSuite () {
'use strict';
const graph = 'UnitTestsGraph';
const vertex = 'UnitTestsVertex';
const edge = 'UnitTestsEdge';
let g;
return {
setUp: function () {
if (Graph._exists(graph)) {
Graph._drop(graph, true);
}
g = Graph._create(graph,
[Graph._relation(edge, vertex, vertex)]
);
},
tearDown: function () {
db._transactions().forEach(function(trx) {
try {
db._createTransaction(trx.id).abort();
} catch (err) {}
});
Graph._drop(graph, true);
},
// / @brief test: insert vertex
testVertexInsertUndeclared: function () {
let trx = db._createTransaction({
collections: {}
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "test", value: "test" }, headers);
assertTrue(result.error);
assertEqual(ERRORS.ERROR_TRANSACTION_UNREGISTERED_COLLECTION.code, result.errorNum);
},
// / @brief test: insert edge
testEdgeInsertUndeclared: function () {
let trx = db._createTransaction({
collections: {}
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.POST("/_api/gharial/" + graph + "/edge/" + edge, { _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" }, headers);
assertTrue(result.error);
assertEqual(ERRORS.ERROR_TRANSACTION_UNREGISTERED_COLLECTION.code, result.errorNum);
},
// / @brief test: insert vertex
testVertexInsert: function () {
let trx = db._createTransaction({
collections: { write: [ vertex ] }
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "test", value: "test" }, headers);
assertFalse(result.error);
assertEqual(202, result.code);
if (db._engine().name !== 'mmfiles') {
try {
db._collection(vertex).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
}
trx.commit();
result = db._collection(vertex).document("test");
assertEqual("test", result.value);
},
// / @brief test: insert edge
testEdgeInsert: function () {
let trx = db._createTransaction({
collections: { write: [ vertex, edge ] }
});
let headers = { "x-arango-trx-id" : trx.id() };
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "1" }, headers);
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "2" }, headers);
let result = arango.POST("/_api/gharial/" + graph + "/edge/" + edge, { _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" }, headers);
assertFalse(result.error);
assertEqual(202, result.code);
if (db._engine().name !== 'mmfiles') {
try {
db._collection(edge).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
}
trx.commit();
result = db._collection(edge).document("test");
assertEqual("test", result.value);
assertEqual(vertex + "/1", result._from);
assertEqual(vertex + "/2", result._to);
},
// / @brief test: remove vertex
testVertexRemove: function () {
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "test", value: "test" });
let trx = db._createTransaction({
collections: { write: [ vertex, edge ] }
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.DELETE("/_api/gharial/" + graph + "/vertex/" + vertex + "/test", null, headers);
assertFalse(result.error);
assertEqual(202, result.code);
if (db._engine().name !== 'mmfiles') {
result = db._collection(vertex).document("test");
assertEqual("test", result._key);
assertEqual("test", result.value);
}
try {
trx.collection(vertex).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
trx.commit();
try {
db._collection(vertex).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
},
// / @brief test: remove vertex with dependencies
testVertexRemoveWithDependencies: function () {
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "1" });
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "2" });
arango.POST("/_api/gharial/" + graph + "/edge/" + edge, { _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" });
let trx = db._createTransaction({
collections: { write: [ vertex, edge ] }
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.DELETE("/_api/gharial/" + graph + "/vertex/" + vertex + "/1", null, headers);
assertFalse(result.error);
assertEqual(202, result.code);
if (db._engine().name !== 'mmfiles') {
result = db._collection(vertex).document("1");
assertEqual("1", result._key);
result = db._collection(edge).document("test");
assertEqual("test", result.value);
}
if (db._engine().name !== 'mmfiles') {
try {
trx.collection(vertex).document("1");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
}
try {
trx.collection(edge).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
trx.commit();
try {
db._collection(vertex).document("1");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
try {
db._collection(edge).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
},
// / @brief test: remove vertex with dependencies
testVertexRemoveWithDependenciesUndeclaredVertexCollection: function () {
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "1" });
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "2" });
arango.POST("/_api/gharial/" + graph + "/edge/" + edge, { _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" });
let trx = db._createTransaction({
collections: { write: [ edge ] }
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.DELETE("/_api/gharial/" + graph + "/vertex/" + vertex + "/1", null, headers);
assertTrue(result.error);
assertEqual(ERRORS.ERROR_TRANSACTION_UNREGISTERED_COLLECTION.code, result.errorNum);
trx.abort();
result = db._collection(vertex).document("1");
assertEqual("1", result._key);
result = db._collection(edge).document("test");
assertEqual("test", result.value);
},
// / @brief test: remove edge
testEdgeRemove: function () {
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "1" });
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "2" });
arango.POST("/_api/gharial/" + graph + "/edge/" + edge, { _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" });
let trx = db._createTransaction({
collections: { write: [ edge ] }
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.DELETE("/_api/gharial/" + graph + "/edge/" + edge + "/test", null, headers);
assertFalse(result.error);
assertEqual(202, result.code);
if (db._engine().name !== 'mmfiles') {
result = db._collection(edge).document("test");
assertEqual("test", result._key);
assertEqual("test", result.value);
}
try {
trx.collection(edge).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
trx.commit();
try {
db._collection(edge).document("test");
fail();
} catch (err) {
assertEqual(ERRORS.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code, err.errorNum);
}
},
// / @brief test: update edge
testEdgeUpdate: function () {
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "1" });
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "2" });
arango.POST("/_api/gharial/" + graph + "/edge/" + edge, { _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" });
let trx = db._createTransaction({
collections: { write: [ edge ] }
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.PATCH("/_api/gharial/" + graph + "/edge/" + edge + "/test", { value: "meow" }, headers);
assertFalse(result.error);
assertEqual(202, result.code);
if (db._engine().name !== 'mmfiles') {
result = db._collection(edge).document("test");
assertEqual("test", result._key);
assertEqual("test", result.value);
result = trx.collection(edge).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
}
trx.commit();
result = db._collection(edge).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
},
// / @brief test: update vertex
testVertexUpdate: function () {
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "test", value: "test" });
let trx = db._createTransaction({
collections: { write: [ vertex ] }
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.PATCH("/_api/gharial/" + graph + "/vertex/" + vertex + "/test", { value: "meow" }, headers);
assertFalse(result.error);
assertEqual(202, result.code);
if (db._engine().name !== 'mmfiles') {
result = db._collection(vertex).document("test");
assertEqual("test", result._key);
assertEqual("test", result.value);
result = trx.collection(vertex).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
}
trx.commit();
result = db._collection(vertex).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
},
// / @brief test: replace edge
testEdgeReplace: function () {
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "1" });
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "2" });
arango.POST("/_api/gharial/" + graph + "/edge/" + edge, { _key: "test", value: "test", _from: vertex + "/1", _to: vertex + "/2" });
let trx = db._createTransaction({
collections: { write: [ edge ] }
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.PUT("/_api/gharial/" + graph + "/edge/" + edge + "/test", { value: "meow", _from: vertex + "/1", _to: vertex + "/2" }, headers);
assertFalse(result.error);
assertEqual(202, result.code);
if (db._engine().name !== 'mmfiles') {
result = db._collection(edge).document("test");
assertEqual("test", result._key);
assertEqual("test", result.value);
result = trx.collection(edge).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
}
trx.commit();
result = db._collection(edge).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
},
// / @brief test: replace vertex
testVertexReplace: function () {
arango.POST("/_api/gharial/" + graph + "/vertex/" + vertex, { _key: "test", value: "test" });
let trx = db._createTransaction({
collections: { write: [ vertex ] }
});
let headers = { "x-arango-trx-id" : trx.id() };
let result = arango.PUT("/_api/gharial/" + graph + "/vertex/" + vertex + "/test", { value: "meow" }, headers);
assertFalse(result.error);
assertEqual(202, result.code);
if (db._engine().name !== 'mmfiles') {
result = db._collection(vertex).document("test");
assertEqual("test", result._key);
assertEqual("test", result.value);
result = trx.collection(vertex).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
}
trx.commit();
result = db._collection(vertex).document("test");
assertEqual("test", result._key);
assertEqual("meow", result.value);
},
};
}
jsunity.run(JSTransactionGraphSuite);
jsunity.run(TransactionGraphSuite);
return jsunity.done();