Skip to content

Commit f769f32

Browse files
authored
Merge pull request #27 from holidayextras/multi-dialect-testing
Multi dialect testing
2 parents 5a9dfca + e8b2b1b commit f769f32

8 files changed

+103
-47
lines changed

.travis.yml

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
language: node_js
22
node_js:
33
- "0.10"
4+
- "4"
5+
services:
6+
- mysql
7+
- postgresql
48
script: "npm run $TEST_STEP"
59
env:
610
matrix:
711
- TEST_STEP=lint
8-
- TEST_STEP=test
12+
- TEST_STEP=test SEQUELIZE_DIALECT=mysql
13+
- TEST_STEP=test SEQUELIZE_DIALECT=postgres
914
notifications:
1015
email: false

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
- 2016-07-18 - v1.2.6
2+
- 2016-07-18 - Fix case insensitive matches for PostgreSQL
3+
- 2016-07-18 - Enable multi-dialect support for tests
14
- 2016-07-11 - v1.2.5
25
- 2016-07-11 - Fixing bug when concurrently updating the same resource id
36
- 2016-07-04 - v1.2.4

example/server.js

+6-11
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
"use strict";
22
var async = require("async");
3+
var config = require("../lib/config.js");
34
var JsonapiStoreRelationalDb = require("..");
5+
46
var instances = [ ];
57

8+
var DATABASE = "jsonapi-relationaldb";
9+
610
// Replace the MemoryStore default handler with our own version
711
require("jsonapi-server/lib/MemoryHandler");
8-
module.children[2].exports = function() {
9-
var dbStore = new JsonapiStoreRelationalDb({
10-
dialect: "mysql",
11-
host: "localhost",
12-
port: 3306,
13-
username: "root",
14-
password: null,
15-
database: "jsonapi-relationaldb",
16-
logging: null
17-
});
18-
12+
module.children[3].exports = function() {
13+
var dbStore = new JsonapiStoreRelationalDb(config(DATABASE));
1914
// Keep the handler around for after the test rig is live
2015
instances.push(dbStore);
2116
return dbStore;

lib/config.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"use strict";
2+
3+
var CONFIGURATIONS = {
4+
mysql: {
5+
dialect: "mysql",
6+
username: "root"
7+
},
8+
postgres: {
9+
dialect: "postgres",
10+
username: "postgres"
11+
},
12+
sqlite: {
13+
dialect: "sqlite",
14+
storage: ":memory:"
15+
}
16+
}
17+
18+
module.exports = function(database) {
19+
var config = CONFIGURATIONS[process.env.SEQUELIZE_DIALECT] || CONFIGURATIONS.mysql;
20+
config.database = database;
21+
return config;
22+
};

lib/sqlHandler.js

+32-14
Original file line numberDiff line numberDiff line change
@@ -272,26 +272,42 @@ SqlStore.prototype._generateSearchBlock = function(request) {
272272
var self = this;
273273

274274
var attributesToFilter = _.omit(request.processedFilter, Object.keys(self.relations));
275-
var searchBlock = SqlStore._getSearchBlock(attributesToFilter);
275+
var searchBlock = self._getSearchBlock(attributesToFilter);
276276
return searchBlock;
277277
};
278278

279-
SqlStore._scalarFilterElementToWhereObj = function(element) {
279+
SqlStore.prototype._scalarFilterElementToWhereObj = function(element) {
280+
var self = this;
281+
280282
var value = element.value;
281-
if (!element.operator) return value;
282-
var whereObj = {
283-
">": { $gt: value },
284-
"<": { $lt: value },
285-
"~": { $like: value },
286-
":": { $like: "%" + value + "%" }
287-
}[element.operator];
288-
return whereObj;
283+
var op = element.operator;
284+
if (!op) return value;
285+
286+
if (op === ">") return { $gt: value };
287+
if (op === "<") return { $lt: value };
288+
289+
var iLikeOperator = '$like';
290+
if (self.sequelize.getDialect() === 'postgres') iLikeOperator = '$iLike';
291+
292+
if (op === "~") {
293+
var caseInsensitiveEqualExpression = { };
294+
caseInsensitiveEqualExpression[iLikeOperator] = value;
295+
return caseInsensitiveEqualExpression;
296+
}
297+
298+
if (op === ":") {
299+
var caseInsensitiveContainsExpression = { };
300+
caseInsensitiveContainsExpression[iLikeOperator] = "%" + value + "%";
301+
return caseInsensitiveContainsExpression;
302+
}
289303
};
290304

291-
SqlStore._filterElementToSearchBlock = function(filterElement) {
305+
SqlStore.prototype._filterElementToSearchBlock = function(filterElement) {
306+
var self = this;
307+
292308
if (!filterElement) return { };
293309
var whereObjs = filterElement.map(function(scalarFilterElement) {
294-
return SqlStore._scalarFilterElementToWhereObj(scalarFilterElement);
310+
return self._scalarFilterElementToWhereObj(scalarFilterElement);
295311
});
296312
if (!whereObjs.length) return { };
297313
if (filterElement.length === 1) {
@@ -300,13 +316,15 @@ SqlStore._filterElementToSearchBlock = function(filterElement) {
300316
return { $or: whereObjs };
301317
};
302318

303-
SqlStore._getSearchBlock = function(filter) {
319+
SqlStore.prototype._getSearchBlock = function(filter) {
320+
var self = this;
321+
304322
if (!filter) return { };
305323
var searchBlock = { };
306324

307325
Object.keys(filter).forEach(function(attributeName) {
308326
var filterElement = filter[attributeName];
309-
searchBlock[attributeName] = SqlStore._filterElementToSearchBlock(filterElement);
327+
searchBlock[attributeName] = self._filterElementToSearchBlock(filterElement);
310328
});
311329

312330
return searchBlock;

package.json

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "jsonapi-store-relationaldb",
3-
"version": "1.2.5",
3+
"version": "1.2.6",
44
"description": "Relational data store for jsonapi-server.",
55
"keywords": [
66
"json:api",
@@ -28,23 +28,26 @@
2828
"lodash.assign": "^4.0.9",
2929
"lodash.omit": "^4.3.0",
3030
"lodash.pick": "^4.2.1",
31-
"semver": "^5.1.0",
32-
"sequelize": "^3.23.3"
31+
"semver": "^5.3.0",
32+
"sequelize": "^3.23.4"
3333
},
3434
"devDependencies": {
35-
"blanket": "1.1.9",
36-
"coveralls": "^2.11.9",
35+
"blanket": "^1.2.3",
36+
"coveralls": "^2.11.11",
3737
"eslint": "^2.11.0",
3838
"jsonapi-server": "^1.15.4",
3939
"mocha": "^2.5.3",
4040
"mocha-lcov-reporter": "^1.2.0",
4141
"mocha-performance": "^0.1.1",
42-
"mysql": "^2.10.2",
43-
"plato": "^1.5.0",
42+
"mysql": "^2.11.1",
43+
"pg": "^6.0.2",
44+
"pg-hstore": "^2.3.2",
45+
"plato": "^1.6.0",
46+
"sqlite3": "^3.1.4",
4447
"v8-profiler": "^5.6.5"
4548
},
4649
"scripts": {
47-
"test": "./setupDatabase.sh jsonapi-relationaldb-test && ./node_modules/mocha/bin/mocha --timeout 20000 -R spec ./test/*.js",
50+
"test": "./setupDatabase.sh jsonapi-relationaldb-test $SEQUELIZE_DIALECT && ./node_modules/mocha/bin/mocha --timeout 20000 -R spec ./test/*.js",
4851
"start": "node example/server.js",
4952
"coveralls": "./node_modules/mocha/bin/mocha --require blanket --reporter mocha-lcov-reporter ./test/*.js | ./node_modules/coveralls/bin/coveralls.js",
5053
"coverage": "./node_modules/mocha/bin/mocha --timeout 20000 --require blanket --reporter html-cov ./test/*.js > coverage.html || true",

setupDatabase.sh

+17-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,20 @@
11
#!/bin/bash -x
22

33
DB=$1
4-
mysql -u root -e "DROP DATABASE IF EXISTS \`$DB\`"
5-
mysql -u root -e "CREATE DATABASE \`$DB\`"
4+
DIALECT=${2:-mysql}
5+
6+
case "$DIALECT" in
7+
mysql)
8+
mysql -u root -e "DROP DATABASE IF EXISTS \`$DB\`"
9+
mysql -u root -e "CREATE DATABASE \`$DB\`"
10+
;;
11+
postgres)
12+
psql -c "DROP DATABASE IF EXISTS \"$DB\"" postgres postgres
13+
psql -c "CREATE DATABASE \"$DB\"" postgres postgres
14+
;;
15+
sqlite)
16+
;;
17+
*)
18+
echo "unknown database dialect: $DIALECT"
19+
exit 1
20+
esac

test/proxy.js

+6-11
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
"use strict";
22
var async = require("async");
3+
var config = require("../lib/config.js");
34
var JsonapiStoreRelationalDb = require("..");
5+
46
var instances = [ ];
57

8+
var DATABASE = "jsonapi-relationaldb-test";
9+
610
// Replace the MemoryStore default handler with our own version
711
require("jsonapi-server/lib/MemoryHandler");
8-
module.children[2].exports = function() {
9-
var dbStore = new JsonapiStoreRelationalDb({
10-
dialect: "mysql",
11-
host: "localhost",
12-
port: 3306,
13-
username: "root",
14-
password: null,
15-
database: "jsonapi-relationaldb-test",
16-
logging: false
17-
});
18-
12+
module.children[3].exports = function() {
13+
var dbStore = new JsonapiStoreRelationalDb(config(DATABASE));
1914
// Keep the handler around for after the test rig is live
2015
instances.push(dbStore);
2116
return dbStore;

0 commit comments

Comments
 (0)