sql-soar
Version:
A SQL build and query tool for node.js.
473 lines (398 loc) • 15.8 kB
JavaScript
/*!
* sql-soar
* authors: Ben Lue
* license: MIT License
* Copyright(c) 2015 ~ 2018 Gocharm Inc.
*/
const assert = require('assert'),
path = require('path'),
soar = require('../lib/soar.js');
describe('Test sql expression', function() {
before(function() {
soar.config();
});
it('Simple query', function(done) {
var expr = soar.sql('Person')
.column(['psnID', 'name'])
.filter( {name: 'psnID', op: '='} );
var option = {
op: 'query',
expr: expr
},
query = {psnID: 1};
soar.execute(option, query, function(err, data) {
assert( data, 'Missing psnID=1 data');
assert.equal( data.name, 'John', 'Person name not matched.');
done();
});
});
it('Simple query, simple filter', function(done) {
var expr = soar.sql('Person')
.column(['psnID', 'name'])
.filter( 'psnID' );
var option = {
op: 'query',
expr: expr
},
query = {psnID: 1};
soar.execute(option, query, function(err, data) {
assert( data, 'Missing psnID=1 data');
assert.equal( data.name, 'John', 'Person name not matched.');
done();
});
});
it('Simple query with alias', function(done) {
var expr = soar.sql('Person')
.column(['psnID', 'name AS fullName'])
.filter( {name: 'psnID', op: '='} );
var option = {
op: 'query',
expr: expr
},
query = {psnID: 1};
soar.execute(option, query, function(err, data) {
assert( data, 'Missing psnID=1 data');
assert.equal( data.fullName, 'John', 'Person name not matched.');
done();
});
});
it('Query without specifying table columns', function(done) {
var expr = soar.sql('Person')
.filter( {name: 'psnID', op: '='} );
var option = {query: expr},
query = {psnID: 1};
soar.execute(option, query, function(err, data) {
assert( data, 'Missing psnID=1 data');
assert.equal( data.name, 'John', 'Person name not matched.');
done();
});
});
it('Query without specifying table columns and query conditions', function(done) {
var stemp = soar.sql('Person'),
option = {query: stemp},
query = {psnID: 1};
soar.execute(option, query, function(err, data) {
//console.log( JSON.stringify(data, null, 4) );
assert( data, 'Missing psnID=1 data');
assert.equal( data.name, 'John', 'Person name not matched.');
done();
});
});
it('List all persons', function(done) {
var option = {list: soar.sql('Person')};
soar.execute(option, function(err, list) {
//console.log( JSON.stringify(list, null, 4) );
assert.equal( list.length, 5, 'Totally 5 persons.');
done();
});
});
it('List with OR filter', function(done) {
var expr = soar.sql('Person')
.filter( {
or: [
'name',
{dob: '>='}
]
});
var option = {
op: 'list',
expr: expr
},
query = {
name: 'Stacy',
dob: '1980-01-01'
};
soar.execute(option, query, function(err, data) {
assert.equal( data.length, 3, 'Should have 3 matches');
//console.log( JSON.stringify(data, null, 4) );
done();
});
});
it('List with the IN condition', function(done) {
var expr = soar.sql('Person')
.filter({name: 'psnID', op: 'IN'});
var cmd = {
op: 'list',
expr: expr
};
soar.execute(cmd, {psnID: [1, 3]}, function(err, list) {
//console.log( JSON.stringify(list, null, 4) );
assert.equal( list.length, 2, 'Should return 2 persons.');
done();
});
});
it('List -- pagination', function(done) {
var option = {
list: soar.sql('Person'),
range: soar.range(1, 2)
};
soar.execute(option, function(err, list, count) {
//console.log( JSON.stringify(list, null, 4) );
assert.equal( count, 5, 'Totally 5 persons.');
assert.equal( list.length, 2, 'page size is 2.');
done();
});
});
it('Update', function(done) {
var expr = soar.sql('Person')
.column(['psnID', 'name'])
.filter( {name: 'psnID', op: '='} );
var option = {update: expr},
data = {name: 'John Mayer'},
query = {psnID: 1};
soar.execute(option, data, query, function(err) {
assert(!err, 'Failed to do update.');
delete option.update;
option.query = expr;
soar.execute(option, query, function(err, data) {
assert.equal( data.name, 'John Mayer', 'Person name not matched.');
// restore data
delete option.query;
option.update = expr;
soar.execute(option, {name: 'John'}, query, function(err) {
assert(!err, 'Failed to do update.');
done();
});
});
})
});
it('Update without specifying table columns', function(done) {
var expr = soar.sql('Person')
.filter( {name: 'psnID', op: '='} );
var option = {
op: 'update',
expr: expr
},
data = {name: 'John Mayer'},
query = {psnID: 1};
soar.execute(option, data, query, function(err) {
assert(!err, 'Failed to do update.');
option.op = 'query';
soar.execute(option, query, function(err, data) {
assert.equal( data.name, 'John Mayer', 'Person name not matched.');
// restore data
option.op = 'update';
soar.execute(option, {name: 'John'}, query, function(err) {
assert(!err, 'Failed to do update.');
done();
});
});
});
});
it('Update without specifying table columns and query conditions', function(done) {
var expr = soar.sql('Person'),
cmd = {
op: 'update',
expr: expr
},
now = new Date(),
data = {name: 'John Mayer', modifyTime: now},
query = {psnID: 1};
soar.execute(cmd, data, query, function(err) {
assert(!err, 'Failed to do update.');
cmd.op = 'query';
soar.execute(cmd, query, function(err, data) {
var mdTime = data.modifyTime;
//console.log('written time: %d, readback time: %d', now.getSeconds(), mdTime.getSeconds());
assert.equal( data.name, 'John Mayer', 'Person name not matched.');
assert.equal( now.getMinutes(), mdTime.getMinutes(), 'modify time does not match');
// restore data
cmd.op = 'update';
soar.execute(cmd, {name: 'John'}, query, function(err) {
assert(!err, 'Failed to do update.');
done();
});
});
})
});
it('Insert and delete with transactions', function(done) {
var expr = soar.sql('Person')
.column(['psnID', 'name'])
.filter( {name: 'psnID', op: '='} );
soar.getConnection( function(err, conn) {
conn.beginTransaction(function(err) {
assert(!err, 'Transaction failed to get started.');
var option = {
insert: expr,
conn: conn
},
data = {name: 'Scott Cooper'};
soar.execute(option, data, function(err, value) {
assert(value, 'Failed to insert');
delete option.insert;
option.delete = expr;
soar.execute(option, value, function(err) {
assert(!err, 'Failed to delete.');
conn.commit( function(err) {
assert(!err, 'Transaction failed to commit.');
conn.release();
done();
});
});
})
});
});
});
it('Insert and delete without specifying table columns', function(done) {
var expr = soar.sql('Person')
.filter( {name: 'psnID', op: '='} );
soar.getConnection( function(err, conn) {
conn.beginTransaction(function(err) {
assert(!err, 'Transaction failed to get started.');
var option = {
op: 'insert',
expr: expr,
conn: conn
},
data = {name: 'Scott Cooper', dob: new Date()};
soar.execute(option, data, null, function(err, value) {
assert(value, 'Failed to insert');
option.op = 'delete';
soar.execute(option, value, function(err) {
assert(!err, 'Failed to delete.');
conn.commit( function(err) {
assert(!err, 'Transaction failed to commit.');
conn.release();
done();
});
});
})
});
});
});
it('Use join expression to do insert & delete', function(done) {
var expr = soar.sql('Person AS psn')
.join({table: 'PsnLoc AS pl', onWhat: 'psn.psnID = pl.psnID'})
.join({table: 'GeoLoc AS geo', onWhat: 'pl.geID=geo.geID'})
.column(['psn.psnID', 'psn.name', 'latitude', 'longitude'])
.filter({name: 'psn.psnID', op: '='});
soar.getConnection( function(err, conn) {
conn.beginTransaction(function(err) {
assert(!err, 'Transaction failed to get started.');
var cmd = {
op: 'insert',
expr: expr,
conn: conn
},
data = {name: 'Scott Cooper'};
soar.execute(cmd, data, null, function(err, value) {
//console.log('inserted key is\n%s', JSON.stringify(value));
assert(value, 'Failed to insert');
cmd.op = 'delete';
soar.execute(cmd, value, function(err) {
assert(!err, 'Failed to delete.');
conn.commit( function(err) {
assert(!err, 'Transaction failed to commit.');
conn.release();
done();
});
});
});
});
});
});
it('Use join expression to do update', function(done) {
var expr = soar.sql('Person AS psn')
.join({table: 'PsnLoc AS pl', onWhat: 'psn.psnID = pl.psnID'})
.join({table: 'GeoLoc AS geo', onWhat: 'pl.geID=geo.geID'})
.column(['psn.psnID', 'psn.name', 'latitude', 'longitude'])
.filter({name: 'psn.psnID', op: '='});
var option = {
op: 'update',
expr: expr
},
data = {name: 'John Mayer'},
query = {psnID: 1};
soar.execute(option, data, query, function(err) {
if (err)
console.log( err.stack );
assert(!err, 'Failed to do update.');
option.op = 'query';
soar.execute(option, query, function(err, data) {
assert.equal( data.name, 'John Mayer', 'Person name not matched.');
// restore data
option.op = 'update';
soar.execute(option, {name: 'John'}, query, function(err) {
assert(!err, 'Failed to do update.');
done();
});
});
});
});
it('Run SQL directly', function(done) {
var sql = "SELECT COUNT(*) count FROM Person WHERE name LIKE ?",
p = ['David%'];
soar.runSql(sql, p, function(err, result) {
//console.log(JSON.stringify(result, null, 4));
assert.equal(result[0].count, 1, 'one match');
done();
});
});
});
describe('Test short hand', function() {
it('simple query', function(done) {
soar.query('Person', {name: 'David'}, function(err, data) {
assert.equal(data.psnID, 2, 'id is 2');
done();
});
});
it('query', function(done) {
var sql = soar.sql('Person');
soar.query(sql, {name: 'David'}, function(err, data) {
assert.equal(data.psnID, 2, 'id is 2');
done();
});
});
it('list', function(done) {
soar.list('Person', {psnID: {op: '>=', value: 2}}, function(err, list) {
assert.equal(list.length, 4, '4 matches');
done();
});
});
it('list -- compound query', function(done) {
var query = {
psnID: {op: '>=', value: 2},
name: 'John'
};
soar.list('Person', query, function(err, list) {
assert.equal(list.length, 0, 'no match.');
done();
});
});
it('list -- IS NULL', function(done) {
var query = {
addr: {op: 'IS NULL', value: true}
};
soar.list('Person', query, function(err, list) {
assert.equal(list.length, 4, '4 matches.');
done();
});
});
it('update', function(done) {
var updData = {
name: 'David Black',
addr: 'San Fransisco'
};
soar.update('Person', updData, {psnID: 2}, function(err, data) {
//console.log( JSON.stringify(data, null, 4) );
soar.query('Person', {psnID: 2}, function(err, data) {
assert.equal(data.name, 'David Black', 'full name changed to David Black');
assert.equal(data.addr, 'San Fransisco', 'address is San Fransisco');
updData.name = 'David';
updData.addr = 'Oakland';
soar.update('Person', updData, {psnID: 2}, function(err, data) {
done();
});
});
});
});
it('create & delete', function(done) {
soar.insert('Person', {name: 'Millman'}, function(err, pk) {
//console.log( JSON.stringify(pk, null, 4) );
soar.del('Person', pk, function(err) {
assert(!err, 'fail to delete');
done();
});
});
});
});