Skip to content

Commit

Permalink
Merge pull request #16 from yosimasu/topic/json-packer
Browse files Browse the repository at this point in the history
Support JSON packer
  • Loading branch information
bajtos committed Nov 16, 2016
2 parents c2b202c + c40fb11 commit 2803602
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 3 deletions.
7 changes: 6 additions & 1 deletion lib/kv-redis.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ var connectorCore = require('loopback-connector');
var Connector = connectorCore.Connector;
var ModelKeyComposer = connectorCore.ModelKeyComposer;
var BinaryPacker = connectorCore.BinaryPacker;
var JSONStringPacker = connectorCore.JSONStringPacker;
var debug = require('debug')('loopback:connector:kv-redis');
var Redis = require('ioredis');
var util = require('util');
Expand Down Expand Up @@ -59,7 +60,11 @@ function RedisKeyValueConnector(settings, dataSource) {
debug('Connector settings', settings);

this._client = new Redis(settings.url || settings);
this._packer = new BinaryPacker();
if (settings.packer && settings.packer === 'json') {
this._packer = new JSONStringPacker(settings.bufferEncoding);
} else {
this._packer = new BinaryPacker();
}
this.DataAccessObject = dataSource.juggler.KeyValueAccessObject;
};

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"dependencies": {
"debug": "^2.2.0",
"ioredis": "^2.2.0",
"loopback-connector": "^2.6.0",
"loopback-connector": "^2.7.1",
"strong-globalize": "^2.6.6"
},
"devDependencies": {
Expand Down
17 changes: 17 additions & 0 deletions test/helpers/data-source-factory.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,23 @@ createDataSource.failing = function(options) {
return createDataSource(settings);
};

createDataSource.json = function(options) {
var settings = extend({
packer: 'json',
}, options);

return createDataSource(settings);
};

createDataSource.jsonWithHexBuffers = function(options) {
var settings = extend({
packer: 'json',
bufferEncoding: 'hex',
}, options);

return createDataSource(settings);
};

beforeEach(function clearDatabase(done) {
var ds = createDataSource();
ds.connector.execute('FLUSHDB', function(err) {
Expand Down
12 changes: 12 additions & 0 deletions test/integration/execute.integration.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,17 @@ describe('execute', function() {
done();
});
});

it('returns "INFO keyspace" result as a Buffer w/ json packer',
function(done) {
var ds = createDataSource.json();
ds.connector.execute('INFO', ['keyspace'], function(err, result) {
if (err) return done(err);
expect(result).to.be.instanceOf(Buffer);
result = result.toString('utf8');
expect(result).to.match(/^# Keyspace/);
done();
});
});
});

13 changes: 12 additions & 1 deletion test/integration/juggler-api.integration.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,18 @@

var createDataSource = require('../helpers/data-source-factory');
var expect = require('../helpers/expect');
var kvaoTestSuite = require('loopback-datasource-juggler/test/kvao.suite.js');

describe('Juggler API', function() {
require('loopback-datasource-juggler/test/kvao.suite.js')(createDataSource);
context('using binary packer', function() {
kvaoTestSuite(createDataSource);
});

context('using json-string packer', function() {
kvaoTestSuite(createDataSource.json);
});

context('using json-string packer with hex buffers', function() {
kvaoTestSuite(createDataSource.jsonWithHexBuffers);
});
});
28 changes: 28 additions & 0 deletions test/integration/packer.integration.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use strict';

var createDataSource = require('../helpers/data-source-factory');
var expect = require('../helpers/expect');
var extend = require('util')._extend;

describe('packer option', function() {
it('changes storage format to JSON', function(done) {
var ds = createDataSource.json();
var value = {
name: 'a-string',
age: 42,
flag: true,
date: new Date(),
};

ds.connector.set('TestModel', 'a-key', value, {}, function(err) {
if (err) return done(err);
ds.connector.execute('GET', ['TestModel:a-key'], function(err, result) {
if (err) return done(err);
var stored = JSON.parse(result.toString());
var expected = JSON.parse(JSON.stringify(value));
expect(stored).to.eql(expected);
done();
});
});
});
});

0 comments on commit 2803602

Please sign in to comment.