soarjs
Version:
A simple relational DB to entity mapper.
230 lines (208 loc) • 7.39 kB
JavaScript
/*!
* soar
* authors: Ben Lue
* license: MIT License
* Copyright(c) 2015 Gocharm Inc.
*/
var assert = require('assert'),
path = require('path'),
soar = require('../soar.js'),
schMgr = require('../schemaManager.js');
before(function() {
soar.config(
{
"dbConfig": {
"host" : "127.0.0.1",
"database" : "udb001",
"user" : "your_acc_name",
"password" : "your_passwd",
"supportBigNumbers" : true,
"connectionLimit" : 16
},
"defPath": path.join(__dirname, '../def')
});
});
describe('SQL generation', function() {
it('Create table', function() {
var schema = {
title: 'Person',
columns: {
Person_id: {type: 'serial'},
fname: {
type: 'string',
maxLength: 32,
options: {
notNull: true
}
},
mdTime: {
type: 'datetime'
}
},
primary: ['Person_id', 'fname'],
options: {
engine: 'InnoDB'
}
};
schMgr.createTable(mockConn, schema, function(err, sql) {
var s1 = 'CREATE TABLE Person\n(\n Person_id\t\tbigint unsigned not null auto_increment unique,\n',
s2 = ' fname\t\tvarchar(32) NOT NULL,\n mdTime\t\tdatetime,\n primary key (Person_id, fname)\n)\nengine = InnoDB;',
correct = s1 + s2;
//console.log(sql);
assert.equal(sql, correct, 'sql mismatch');
});
schema.columns = {
Person_id: {type: "integer", format: 'int64', options: {autoInc: true}},
salary: {type: 'number', format: 'decimal10,2'},
isValid: {type: "boolean", options: {default: true}}
};
schema.options = {
engine: 'InnoDB',
comment: 'Person profile'
};
schMgr.createTable(mockConn, schema, function(err, sql) {
var s1 = 'CREATE TABLE Person\n(\n Person_id\t\tbigint AUTO_INCREMENT,\n';
s2 = " salary\t\tdecimal(10,2),\n isValid\t\tbool DEFAULT true,\n primary key (Person_id, fname)\n)\nengine = InnoDB COMMENT = 'Person profile';";
correct = s1 + s2;
//console.log(sql);
assert.equal(sql, correct, 'sql mismatch');
});
});
it('Alter table', function() {
var schema = {
title: 'Person',
add: {
column: {
salary: {type: 'number', format: 'decimal10,2'},
isValid: {type: "boolean", options: {default: true}}
},
index: {
IDX_PSN_LIST: {
columns: ['fname', 'isValid'],
unique: true
}
}
},
drop: {
column: ['addr']
}
};
schMgr.alterTable(mockConn, schema, function(err, sql) {
var s1 = 'ALTER TABLE Person\nADD COLUMN salary\tdecimal(10,2),\n';
s2 = "ADD COLUMN isValid\tbool DEFAULT true,\nADD UNIQUE INDEX IDX_PSN_LIST (fname, isValid),\n",
s3 = "DROP COLUMN addr;";
correct = s1 + s2 + s3;
//console.log(sql);
assert.equal(sql, correct, 'sql mismatch');
});
schema.add = {
column: {
salary: {type: 'number', format: 'decimal10,2'}
},
foreignKey: {
FK_bpdRbk: {
key: 'bkID',
reference: 'Books.bkID',
integrity: {
delete: 'cascade',
update: 'cascade'
}
}
}
};
schema.drop = {
index: ['IDX_A', 'IDX_B'],
foreignKey: ['FK_X', 'FK_Y']
};
schMgr.alterTable(mockConn, schema, function(err, sql) {
var s1 = 'ALTER TABLE Person\nADD COLUMN salary\tdecimal(10,2),\n';
s2 = "ADD CONSTRAINT FK_bpdRbk FOREIGN KEY (bkID) references Books (bkID) ON DELETE cascade ON UPDATE cascade,\n",
s3 = "DROP INDEX IDX_A,\nDROP INDEX IDX_B,\nDROP FOREIGN KEY FK_X,\nDROP FOREIGN KEY FK_Y;";
correct = s1 + s2 + s3;
//console.log(sql);
assert.equal(sql, correct, 'sql mismatch');
});
});
});
describe('Database administration', function() {
it('Create table', function(done) {
var schema = {
title: 'Person',
columns: {
Person_id: {type: 'serial'},
fname: {
type: 'string',
maxLength: 32,
options: {
notNull: true
}
},
mdTime: {
type: 'datetime'
}
},
primary: ['Person_id'],
options: {
engine: 'InnoDB'
}
};
soar.getConnection(function(err, conn) {
schMgr.createTable(conn, schema, function(err) {
done();
/*
schMgr.deleteTable(conn, 'Person', function(err) {
conn.release();
done();
});
*/
});
});
});
it('Describe table', function(done) {
soar.getConnection(function(err, conn) {
schMgr.describeTable(conn, 'Person', function(err, schema) {
//console.log( JSON.stringify(schema, null, 4) );
assert.equal(schema.title, 'Person', "Table name is 'Person'");
assert(schema.columns.psnID, 'Should have the Person_id column');
assert.equal(schema.columns.psnID.type, "integer", "integer type");
assert.equal(schema.columns.name.type, "string", "string type");
assert.equal(schema.primary.length, 1, 'One primary key');
assert.equal(schema.primary[0], 'psnID', 'PK is psnID');
assert.equal(schema.options.engine, 'InnoDB', 'engine type is InnoDB');
done();
});
});
});
it('Alter table', function(done) {
var schema = {
title: 'Person',
add: {
column: {
salary: {type: 'number', format: 'decimal10,2'}
},
index: {
IDX_PSN_fname: {
columns: ['fname'],
unique: true
}
}
},
drop: {
column: ['mdTime']
}
};
soar.getConnection(function(err, conn) {
schMgr.alterTable(conn, schema, function(err) {
schMgr.deleteTable(conn, 'Person', function(err) {
conn.release();
done();
});
});
});
});
});
var mockConn = {
query: function(sql, cb) {
cb( null, sql );
}
};