diff --git a/src/v1/internal/util.js b/src/v1/internal/util.js
index 50811e23a..168052d77 100644
--- a/src/v1/internal/util.js
+++ b/src/v1/internal/util.js
@@ -58,6 +58,14 @@ function assertString(obj, objName) {
return obj;
}
+function assertCypherStatement(obj) {
+ assertString(obj, 'Cypher statement');
+ if (obj.trim().length == 0) {
+ throw new TypeError('Cypher statement is expected to be a non-empty string.');
+ }
+ return obj;
+}
+
function isString(str) {
return Object.prototype.toString.call(str) === '[object String]';
}
@@ -118,6 +126,7 @@ export {
isEmptyObjectOrNull,
isString,
assertString,
+ assertCypherStatement,
parseScheme,
parseUrl,
parseHost,
diff --git a/src/v1/session.js b/src/v1/session.js
index 5ff5f13e6..cfd947082 100644
--- a/src/v1/session.js
+++ b/src/v1/session.js
@@ -20,7 +20,7 @@ import StreamObserver from './internal/stream-observer';
import Result from './result';
import Transaction from './transaction';
import {newError} from './error';
-import {assertString} from './internal/util';
+import {assertCypherStatement} from './internal/util';
import ConnectionHolder from './internal/connection-holder';
import Driver, {READ, WRITE} from './driver';
import TransactionExecutor from './internal/transaction-executor';
@@ -53,7 +53,7 @@ class Session {
/**
* Run Cypher statement
- * Could be called with a statement object i.e.: {statement: "MATCH ...", parameters: {param: 1}}
+ * Could be called with a statement object i.e.: {text: "MATCH ...", parameters: {param: 1}}
* or with the statement and parameters as separate arguments.
* @param {mixed} statement - Cypher statement to execute
* @param {Object} parameters - Map with parameters to use in statement
@@ -64,7 +64,7 @@ class Session {
parameters = statement.parameters || {};
statement = statement.text;
}
- assertString(statement, 'Cypher statement');
+ assertCypherStatement(statement);
return this._run(statement, parameters, (connection, streamObserver) =>
connection.run(statement, parameters, streamObserver)
diff --git a/src/v1/transaction.js b/src/v1/transaction.js
index 1c1ac34b3..f904d9275 100644
--- a/src/v1/transaction.js
+++ b/src/v1/transaction.js
@@ -18,7 +18,7 @@
*/
import StreamObserver from './internal/stream-observer';
import Result from './result';
-import {assertString} from './internal/util';
+import {assertCypherStatement} from './internal/util';
import {EMPTY_CONNECTION_HOLDER} from './internal/connection-holder';
import Bookmark from './internal/bookmark';
@@ -53,7 +53,7 @@ class Transaction {
/**
* Run Cypher statement
- * Could be called with a statement object i.e.: {statement: "MATCH ...", parameters: {param: 1}}
+ * Could be called with a statement object i.e.: {text: "MATCH ...", parameters: {param: 1}}
* or with the statement and parameters as separate arguments.
* @param {mixed} statement - Cypher statement to execute
* @param {Object} parameters - Map with parameters to use in statement
@@ -64,7 +64,7 @@ class Transaction {
parameters = statement.parameters || {};
statement = statement.text;
}
- assertString(statement, "Cypher statement");
+ assertCypherStatement(statement);
return this._state.run(this._connectionHolder, new _TransactionStreamObserver(this), statement, parameters);
}
diff --git a/test/internal/util.test.js b/test/internal/util.test.js
index 907ad3421..56cabe389 100644
--- a/test/internal/util.test.js
+++ b/test/internal/util.test.js
@@ -55,6 +55,25 @@ describe('util', () => {
verifyInvalidString(console.log);
});
+ it('should check cypher statements (non-empty strings)', () => {
+ verifyValidString(new String('foo'));
+ verifyValidString(String('foo'));
+ verifyValidString("foo");
+
+ verifyInvalidCypherStatement('');
+ verifyInvalidCypherStatement('\n');
+ verifyInvalidCypherStatement('\t');
+ verifyInvalidCypherStatement('\r');
+ verifyInvalidCypherStatement(' ');
+ verifyInvalidCypherStatement(' \n\r');
+ verifyInvalidCypherStatement({});
+ verifyInvalidCypherStatement({foo: 1});
+ verifyInvalidCypherStatement([]);
+ verifyInvalidCypherStatement(['1']);
+ verifyInvalidCypherStatement([1, '2']);
+ verifyInvalidCypherStatement(console.log);
+ });
+
it('should parse scheme', () => {
verifyScheme('bolt://', 'bolt://localhost');
verifyScheme('bolt://', 'bolt://localhost:7687');
@@ -169,6 +188,14 @@ describe('util', () => {
expect(() => util.assertString(str, 'Test string')).toThrowError(TypeError);
}
+ function verifyValidCypherStatement(str) {
+ expect(util.assertCypherStatement(str)).toBe(str);
+ }
+
+ function verifyInvalidCypherStatement(str) {
+ expect(() => util.assertCypherStatement(str)).toThrowError(TypeError);
+ }
+
function verifyScheme(expectedScheme, url) {
expect(util.parseScheme(url)).toEqual(expectedScheme);
}
diff --git a/test/v1/session.test.js b/test/v1/session.test.js
index b6dc104ad..51c358e15 100644
--- a/test/v1/session.test.js
+++ b/test/v1/session.test.js
@@ -427,6 +427,7 @@ describe('session', () => {
expect(() => session.run({})).toThrowError(TypeError);
expect(() => session.run(42)).toThrowError(TypeError);
expect(() => session.run([])).toThrowError(TypeError);
+ expect(() => session.run('')).toThrowError(TypeError);
expect(() => session.run(['CREATE ()'])).toThrowError(TypeError);
expect(() => session.run({statement: 'CREATE ()'})).toThrowError(TypeError);