newsql
Version:
Get the best of both worlds
219 lines (180 loc) • 5.98 kB
JavaScript
/*!
* newsql
* authors: Ben Lue
* license: GPL 2.0
* Copyright(c) 2015 Gocharm Inc.
*/
var assert = require('assert'),
newsql = require('../lib/newsql.js');
before(function() {
newsql.config();
});
describe('Test newSQL update', function() {
it('Insert', function(done) {
var data = {name: 'David', dob: '1988-12-05', gender: 1, skill: ['node.js', 'Java'], weight: 80};
newsql.insert('Person', data, function(err, pk) {
//console.log('new entity id is %d', id);
assert(pk.Person_id, 'should return the primary key');
done();
});
});
it('Delete', function(done) {
var query = {weight: {op: '<', value: 100}};
newsql.del('Person', query, function(err, result) {
//assert(!err, 'cannot delete successfully');
//console.log(JSON.stringify(result, null, 2));
done();
});
});
it('Update', function(done) {
var data = {dob: '1992-04-01'},
query = {
weight: {op: '>=', value: 180},
gender: 1
};
newsql.update('Person', data, query, function(err) {
var expr = newsql.sql('Person')
.column(['dob'])
.filter({name: 'Person_id', op: '='});
var qcmd = {
op: 'query',
expr: expr.value()
},
query = {Person_id: 7};
newsql.execute(qcmd, query, function(err, result) {
//console.log(JSON.stringify(result, null, 4));
assert.equal(result.dob.toString().indexOf('Wed Apr 01'), 0, 'dob not correct');
data = {dob: '1992-04-21'};
newsql.update('Person', data, query, function(err) {
done();
});
});
});
});
it('update part of the non-SQL columns', function(done) {
var data = {hobby: 'hiking'},
query = {Person_id: 9};
newsql.update('Person', data, query, function(err) {
newsql.find('Person', query, function(err, result) {
assert.equal(result[0].weight, 130, 'weight is not changed');
assert.equal(result[0].hobby, 'hiking', 'hobby becomes hiking');
data.hobby = 'music';
newsql.update('Person', data, query, function(err) {
done();
});
});
});
});
it('Update with restriected columns', function(done) {
var expr = newsql.sql('Person')
.column(['gender'])
.filter({name: 'Person_id', op: '='}),
data = {name: 'Maria', gender: 0, hobby: 'jogging'},
query = {Person_id: 1},
cmd = {
op: 'update',
expr: expr.value()
};
newsql.execute(cmd, data, query, function(err) {
var expr = newsql.sql('Person')
.column(['dob'])
.filter({name: 'Person_id', op: '='});
newsql.findOne('Person', query, function(err, result) {
//console.log(JSON.stringify(result, null, 4));
assert.equal(result.name, 'Mike', 'name should not changed');
assert.equal(result.gender, 0, 'gender should be changed!');
assert(!result.hobby, 'hobby should not be saved');
data = {gender: 1};
newsql.execute(cmd, data, query, function(err) {
done();
});
});
});
});
});
describe('Update with transactons', function() {
it('Insert & delete with transactions', function(done) {
var data = {name: 'David', dob: '1988-12-05', gender: 1, skill: ['node.js', 'Java'], weight: 80},
cmd = {op: 'insert', expr: newsql.sqlTemplate('Person').value()};
newsql.getConnection(function(err, conn) {
assert(!err, 'Failed to get connection');
cmd.conn = conn;
conn.beginTransaction(function(err) {
assert(!err, 'Failed to begin transaction');
newsql.execute(cmd, data, null, function(err, pk) {
assert(!err, 'Failed to insert');
//console.log('new entity id is %s', JSON.stringify(pk, null, 4));
var stemp = newsql.sqlTemplate('Person');
stemp.filter({name: 'Person_id', op: '='});
var delCmd = {op: 'delete', expr: stemp.value(), conn: conn};
newsql.execute(delCmd, pk, function(err) {
assert(!err, 'cannot delete successfully');
conn.commit(function(err) {
conn.release();
assert(!err, 'Failed to commit');
done();
});
});
});
});
});
});
it('Update with transaction', function(done) {
var data = {dob: '1992-04-01'},
filter = newsql.chainFilters('and',
[
{name: 'weight', op: '>='},
{name: 'gender', op: '='},
{name: 'Person_id', op: '='}
]
),
query = {weight: 180, gender: 1},
expr = newsql.sql('Person').filter(filter);
var cmd = {op: 'update', expr: expr.value()};
newsql.getConnection(function(err, conn) {
assert(!err, 'Failed to get connection');
cmd.conn = conn;
conn.beginTransaction(function(err) {
assert(!err, 'Failed to begin transaction');
newsql.execute(cmd, data, query, function(err) {
var sqlExpr = newsql.sql('Person')
.column(['dob'])
.filter({name: 'Person_id', op: '='});
var qcmd = {
op: 'query',
expr: sqlExpr.value(),
conn: conn
},
query = {Person_id: 7};
newsql.execute(qcmd, query, function(err, result) {
assert.equal(result.dob.toString().indexOf('Apr 01'), 4, 'dob not correct');
newsql.execute(cmd, {dob: '1992-04-21'}, query, function(err) {
assert(!err, 'cannot update successfully');
conn.commit(function(err) {
conn.release();
assert(!err, 'Failed to commit');
done();
});
});
});
});
});
});
});
it.skip('temp', function(done) {
var filter = newsql.chainFilters('and',
[
{name: 'weight', op: '>='},
{name: 'gender', op: '='}
]
),
query = {weight: 180, gender: 1},
expr = newsql.sql('Person').filter(filter);
var cmd = {op: 'list', expr: expr.value()};
newsql.execute(cmd, query, function(err, result) {
console.log(JSON.stringify(result, null, 4));
//assert.equal(result.dob.toString().indexOf('Apr 21'), 4, 'dob not correct');
done();
});
});
});