Merge pull request #38 from dgsan/master
Cleaned up and added tests for collation support.
This commit is contained in:
commit
aef99ca919
12
lib/mysql.js
12
lib/mysql.js
|
@ -9,8 +9,13 @@ exports.initialize = function initializeSchema(schema, callback) {
|
|||
|
||||
var s = schema.settings;
|
||||
|
||||
s.collation = (s.collation || 'utf8mb4_general_ci');
|
||||
s.charset = (s.charset || 'utf8mb4');
|
||||
if (s.collation) {
|
||||
s.charset = s.collation.substr(0,s.collation.indexOf('_')); // Charset should be first 'chunk' of collation.
|
||||
} else {
|
||||
s.collation = 'utf8mb4_general_ci';
|
||||
s.charset = 'utf8mb4';
|
||||
}
|
||||
|
||||
s.supportBigNumbers = (s.supportBigNumbers || false);
|
||||
s.timezone = (s.timezone || 'local');
|
||||
|
||||
|
@ -22,7 +27,7 @@ exports.initialize = function initializeSchema(schema, callback) {
|
|||
timezone: s.timezone,
|
||||
debug: s.debug,
|
||||
socketPath: s.socketPath,
|
||||
charset: s.collation, // Correct by docs despite seeming odd.
|
||||
charset: s.collation.toUpperCase(), // Correct by docs despite seeming odd.
|
||||
supportBigNumbers: s.supportBigNumbers
|
||||
});
|
||||
|
||||
|
@ -42,7 +47,6 @@ exports.initialize = function initializeSchema(schema, callback) {
|
|||
var q = 'CREATE DATABASE ' + dbName + ' CHARACTER SET ' + charset + ' COLLATE ' + collation;
|
||||
schema.client.query(q, function (error) {
|
||||
if (!error) {
|
||||
console.log('go');
|
||||
schema.client.query('USE ' + s.database, callback);
|
||||
} else {
|
||||
throw error;
|
||||
|
|
|
@ -13,7 +13,8 @@
|
|||
"devDependencies": {
|
||||
"coffee-script": "latest",
|
||||
"should": "~1.2.2",
|
||||
"mocha": "~1.8.2"
|
||||
"mocha": "~1.8.2",
|
||||
"semicov": "*"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
var should = require('./init.js');
|
||||
var assert = require('assert');
|
||||
var Schema = require('jugglingdb').Schema;
|
||||
|
||||
var db, settings, adapter, DummyModel, odb;
|
||||
|
||||
describe('migrations', function() {
|
||||
|
||||
|
||||
|
||||
before(function() {
|
||||
require('./init.js');
|
||||
|
||||
odb = getSchema({collation: 'utf8mb4_general_ci'});
|
||||
db = odb;
|
||||
});
|
||||
|
||||
|
||||
it('should use utf8mb4 charset', function(done) {
|
||||
|
||||
var test_set = /utf8mb4/;
|
||||
var test_collo = /utf8mb4_general_ci/;
|
||||
var test_set_str = 'utf8mb4';
|
||||
var test_set_collo = 'utf8mb4_general_ci';
|
||||
charsetTest(test_set, test_collo, test_set_str, test_set_collo, done);
|
||||
|
||||
});
|
||||
|
||||
it('should disconnect first db', function(done) {
|
||||
db.client.end(function(){
|
||||
odb = getSchema();
|
||||
done()
|
||||
});
|
||||
});
|
||||
|
||||
it('should use latin1 charset', function(done) {
|
||||
|
||||
var test_set = /latin1/;
|
||||
var test_collo = /latin1_general_ci/;
|
||||
var test_set_str = 'latin1';
|
||||
var test_set_collo = 'latin1_general_ci';
|
||||
charsetTest(test_set, test_collo, test_set_str, test_set_collo, done);
|
||||
|
||||
});
|
||||
|
||||
it('should drop db and disconnect all', function(done) {
|
||||
db.adapter.query('DROP DATABASE IF EXISTS ' + db.settings.database, function(err) {
|
||||
db.client.end(function(){
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
function charsetTest(test_set, test_collo, test_set_str, test_set_collo, done){
|
||||
|
||||
query('DROP DATABASE IF EXISTS ' + odb.settings.database, function(err) {
|
||||
assert.ok(!err);
|
||||
odb.client.end(function(){
|
||||
|
||||
db = getSchema({collation: test_set_collo});
|
||||
DummyModel = db.define('DummyModel', {string: String});
|
||||
db.automigrate(function(){
|
||||
var q = 'SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ' + db.client.escape(db.settings.database) + ' LIMIT 1';
|
||||
db.client.query(q, function(err, r) {
|
||||
assert.ok(!err);
|
||||
assert.ok(r[0].DEFAULT_COLLATION_NAME.match(test_collo));
|
||||
db.client.query('SHOW VARIABLES LIKE "character_set%"', function(err, r){
|
||||
assert.ok(!err);
|
||||
var hit_all = 0;
|
||||
for (var result in r) {
|
||||
hit_all += matchResult(r[result], 'character_set_connection', test_set);
|
||||
hit_all += matchResult(r[result], 'character_set_database', test_set);
|
||||
hit_all += matchResult(r[result], 'character_set_results', test_set);
|
||||
hit_all += matchResult(r[result], 'character_set_client', test_set);
|
||||
}
|
||||
assert.equal(hit_all, 4);
|
||||
});
|
||||
db.client.query('SHOW VARIABLES LIKE "collation%"', function(err, r){
|
||||
assert.ok(!err);
|
||||
var hit_all = 0;
|
||||
for (var result in r) {
|
||||
hit_all += matchResult(r[result], 'collation_connection', test_set);
|
||||
hit_all += matchResult(r[result], 'collation_database', test_set);
|
||||
}
|
||||
assert.equal(hit_all, 2);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function matchResult(result, variable_name, match) {
|
||||
if(result.Variable_name == variable_name){
|
||||
assert.ok(result.Value.match(match));
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
var query = function (sql, cb) {
|
||||
odb.adapter.query(sql, cb);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
20
test/init.js
20
test/init.js
|
@ -2,11 +2,23 @@ module.exports = require('should');
|
|||
|
||||
var Schema = require('jugglingdb').Schema;
|
||||
|
||||
global.getSchema = function() {
|
||||
var db = new Schema(require('../'), {
|
||||
global.getConfig = function(options) {
|
||||
|
||||
var dbConf = {
|
||||
database: 'myapp_test',
|
||||
username: 'root'
|
||||
});
|
||||
// db.log = function (a) { console.log(a); };
|
||||
};
|
||||
|
||||
if (options) {
|
||||
for (var el in options) {
|
||||
dbConf[el] = options[el]
|
||||
}
|
||||
}
|
||||
|
||||
return dbConf;
|
||||
}
|
||||
|
||||
global.getSchema = function(options) {
|
||||
var db = new Schema(require('../'), getConfig(options));
|
||||
return db;
|
||||
};
|
||||
|
|
|
@ -2,7 +2,7 @@ var should = require('./init.js');
|
|||
var assert = require('assert');
|
||||
var Schema = require('jugglingdb').Schema;
|
||||
|
||||
var db, UserData, StringData, NumberData, DateData;
|
||||
var db, UserData, StringData, NumberData, DateData;
|
||||
|
||||
describe('migrations', function() {
|
||||
|
||||
|
@ -331,6 +331,9 @@ describe('migrations', function() {
|
|||
});
|
||||
|
||||
function setup(done) {
|
||||
|
||||
require('./init.js');
|
||||
|
||||
db = getSchema();
|
||||
|
||||
UserData = db.define('UserData', {
|
||||
|
@ -380,8 +383,13 @@ var blankDatabase = function (db, cb) {
|
|||
var cs = db.settings.charset;
|
||||
var co = db.settings.collation;
|
||||
query('DROP DATABASE IF EXISTS ' + dbn, function(err) {
|
||||
var q = 'CREATE DATABASE ' + dbn + ' CHARACTER SET ' + cs + ' COLLATE ' + co;
|
||||
// console.log(q);
|
||||
var q = 'CREATE DATABASE ' + dbn;
|
||||
if(cs){
|
||||
q += ' CHARACTER SET ' + cs;
|
||||
}
|
||||
if(co){
|
||||
q += ' COLLATE ' + co;
|
||||
}
|
||||
query(q, function(err) {
|
||||
query('USE '+ dbn, cb);
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue