mirror of
https://github.com/thinkjs/thinkjs.git
synced 2026-01-18 14:26:56 +00:00
413 lines
10 KiB
JavaScript
413 lines
10 KiB
JavaScript
var assert = require('assert');
|
|
var muk = require('muk');
|
|
var path = require('path');
|
|
|
|
|
|
for(var filepath in require.cache){
|
|
delete require.cache[filepath];
|
|
}
|
|
|
|
var Index = require('../../../lib/index.js');
|
|
var instance = new Index();
|
|
instance.load();
|
|
|
|
think.APP_PATH = path.dirname(__dirname) + think.sep + 'testApp';
|
|
|
|
var MysqlSocket = think.adapter('socket', 'mysql');
|
|
|
|
|
|
var Connection = function(config) {
|
|
this.config = config;
|
|
this.events = {};
|
|
};
|
|
Connection.prototype = {
|
|
connect: function(cb) {
|
|
setTimeout(cb, 10);
|
|
},
|
|
on: function(en, cb) {
|
|
this.events[en] = cb;
|
|
},
|
|
error: function() {
|
|
this.events.error();
|
|
},
|
|
end: function() {
|
|
this.events.end();
|
|
},
|
|
query: function(data, cb) {
|
|
if (data.timeout) {
|
|
cb({ code: 'PROTOCOL_SEQUENCE_TIMEOUT' });
|
|
return;
|
|
}
|
|
var sql = data.sql;
|
|
if (sql === 'SELECT * FROM `connention_lost`') {
|
|
cb({ code: 'PROTOCOL_CONNECTION_LOST' });
|
|
} else if (sql === 'SELECT * FROM `query_error`') {
|
|
cb({ code: 'QUERY_ERROR' });
|
|
} else if (sql === 'SELECT * FROM `empty`') {
|
|
cb(null, []);
|
|
} else {
|
|
cb(null, ['DONE']);
|
|
}
|
|
},
|
|
destroy: function() {},
|
|
release: function(){}
|
|
};
|
|
|
|
|
|
describe('adapter/socket/mysql', function(){
|
|
|
|
var npm, error;
|
|
|
|
before(function() {
|
|
npm = think.npm;
|
|
think.npm = function() {
|
|
return {
|
|
createConnection: function(config) {
|
|
return new Connection(config);
|
|
},
|
|
createPool: function(config) {
|
|
return {
|
|
getConnection: function(cb) {
|
|
if (config.connectionLimit > 99) {
|
|
cb({ code: 'ERROR' });
|
|
} else {
|
|
cb(null, new Connection(config));
|
|
}
|
|
},
|
|
end: function() {}
|
|
};
|
|
}
|
|
};
|
|
};
|
|
error = think.error;
|
|
think.error = function(promise) {
|
|
return promise;
|
|
};
|
|
});
|
|
|
|
describe('init', function(){
|
|
it('create instance', function(){
|
|
var config = {
|
|
host: 'localhost',
|
|
port: 3306,
|
|
user: 'root',
|
|
password: ''
|
|
};
|
|
var socket = new MysqlSocket(config);
|
|
assert.deepEqual(socket.config, config);
|
|
});
|
|
|
|
it('alias', function(){
|
|
var config = {
|
|
host: 'localhost',
|
|
port: 3306,
|
|
user: 'root',
|
|
password: '123',
|
|
database: 'thinkjs'
|
|
};
|
|
var socket = new MysqlSocket(config);
|
|
assert.deepEqual(socket.config, {
|
|
host: 'localhost',
|
|
port: 3306,
|
|
user: 'root',
|
|
password: '123',
|
|
database: 'thinkjs'
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('connetion', function(){
|
|
it('get connetion 1', function(done){
|
|
var socket = new MysqlSocket();
|
|
socket.getConnection().then(function(connection) {
|
|
assert.deepEqual(connection.config, {
|
|
host: '127.0.0.1',
|
|
port: 3306,
|
|
user: 'root',
|
|
password: ''
|
|
});
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('get connetion 2', function(done){
|
|
var socket = new MysqlSocket();
|
|
socket.getConnection().then(function(connection1) {
|
|
socket.getConnection().then(function(connection2) {
|
|
assert.equal(connection1, connection2);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
it('get connetion from pool', function(done){
|
|
var socket = new MysqlSocket({
|
|
connectionLimit: 10
|
|
});
|
|
socket.getConnection().then(function() {
|
|
assert.ok(socket.pool);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('get connetion from pool, error', function(done){
|
|
var reject = think.reject;
|
|
think.reject = function(err){
|
|
return Promise.reject(err);
|
|
}
|
|
var socket = new MysqlSocket({
|
|
connectionLimit: 100
|
|
});
|
|
socket.getConnection().catch(function() {
|
|
think.reject = reject;
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('query', function(){
|
|
it('simple query', function(done){
|
|
var socket = new MysqlSocket();
|
|
socket.query('SELECT * FROM `simple`').then(function(data){
|
|
assert.equal(data[0], 'DONE');
|
|
done();
|
|
});
|
|
});
|
|
it('query empty', function(done){
|
|
var socket = new MysqlSocket();
|
|
socket.query('SELECT * FROM `empty`').then(function(data){
|
|
assert.deepEqual(data, []);
|
|
done();
|
|
});
|
|
});
|
|
it('query, timeout', function(done){
|
|
var socket = new MysqlSocket({ timeout: 10 });
|
|
socket.query('SELECT * FROM `query_error`').catch(function(err){
|
|
assert.equal(err.code, 'PROTOCOL_SEQUENCE_TIMEOUT');
|
|
done();
|
|
});
|
|
});
|
|
it('query connention_lost', function(done){
|
|
var socket = new MysqlSocket();
|
|
var flag = false;
|
|
socket.close = function(){
|
|
flag = true;
|
|
}
|
|
socket.query('SELECT * FROM `connention_lost`').catch(function(){
|
|
console.log('catch')
|
|
assert.equal(flag, true);
|
|
done();
|
|
}).then(data => {
|
|
console.log('data', data)
|
|
});
|
|
});
|
|
it('query error', function(done){
|
|
var socket = new MysqlSocket();
|
|
socket.query('SELECT * FROM `query_error`').catch(function(){
|
|
done();
|
|
});
|
|
});
|
|
it('query, pool release', function(done){
|
|
var instance = new MysqlSocket();
|
|
instance.pool = {};
|
|
var flag = false;
|
|
instance.getConnection = function(){
|
|
return {
|
|
query: function(query, fn){
|
|
fn && fn(null, 'data')
|
|
},
|
|
release: function(){
|
|
flag = true;
|
|
}
|
|
}
|
|
}
|
|
instance.query('SELECT * FROM `empty`').then(function(){
|
|
assert.equal(flag, true)
|
|
done();
|
|
}).catch(function(err){
|
|
console.log(err.stack)
|
|
})
|
|
});
|
|
it('query error, pool release', function(done){
|
|
var instance = new MysqlSocket();
|
|
instance.pool = {};
|
|
var flag = false;
|
|
instance.getConnection = function(){
|
|
return {
|
|
query: function(query, fn){
|
|
fn && fn(new Error('xxx'), 'data')
|
|
},
|
|
release: function(){
|
|
flag = true;
|
|
}
|
|
}
|
|
}
|
|
instance.query('SELECT * FROM `empty`').catch(function(){
|
|
assert.equal(flag, true)
|
|
done();
|
|
})
|
|
});
|
|
it('query, pool release, empty data', function(done){
|
|
var instance = new MysqlSocket();
|
|
instance.pool = {};
|
|
var flag = false;
|
|
instance.getConnection = function(){
|
|
return {
|
|
query: function(query, fn){
|
|
fn && fn(null)
|
|
},
|
|
release: function(){
|
|
flag = true;
|
|
}
|
|
}
|
|
}
|
|
instance.query('SELECT * FROM `empty`').then(function(){
|
|
assert.equal(flag, true)
|
|
done();
|
|
})
|
|
});
|
|
it('query error, pool release, log error', function(done){
|
|
var instance = new MysqlSocket({});
|
|
instance.pool = {};
|
|
var flag = false;
|
|
instance.getConnection = function(){
|
|
return {
|
|
query: function(query, fn){
|
|
fn && fn(new Error('xxx'), 'data')
|
|
},
|
|
release: function(){
|
|
flag = true;
|
|
}
|
|
}
|
|
}
|
|
muk(think, 'log', function(str, type){
|
|
assert.equal(type, 'SQL')
|
|
})
|
|
instance.config.log_sql = true;
|
|
instance.query('SELECT * FROM `empty`').catch(function(){
|
|
assert.equal(flag, true);
|
|
muk.restore();
|
|
done();
|
|
})
|
|
});
|
|
it('query, log sql', function(done){
|
|
var log = think.log;
|
|
think.log = function(sql, type, startTime){
|
|
assert.equal(sql, 'SELECT * FROM `empty`');
|
|
assert.equal(type, 'SQL');
|
|
assert.equal(think.isNumber(startTime), true);
|
|
};
|
|
var socket = new MysqlSocket({ log_sql: true });
|
|
socket.query('SELECT * FROM `empty`').then(function(data){
|
|
assert.deepEqual(data, []);
|
|
think.log = log;
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('execute', function(){
|
|
it('execute', function(){
|
|
var instance = new MysqlSocket();
|
|
instance.query = function(){
|
|
assert.deepEqual([].slice.call(arguments), [1,2,3]);
|
|
}
|
|
instance.execute(1,2,3)
|
|
})
|
|
})
|
|
|
|
describe('close connetion', function(){
|
|
it('close connetion 1', function(done){
|
|
var socket = new MysqlSocket();
|
|
socket.getConnection().then(function() {
|
|
socket.close();
|
|
assert.equal(socket.connection, null);
|
|
done();
|
|
});
|
|
});
|
|
it('close connetion 2', function(done){
|
|
var socket = new MysqlSocket();
|
|
socket.getConnection().then(function() {
|
|
socket.connection.end();
|
|
assert.equal(socket.connection, null);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('connetion error', function(){
|
|
it('connetion error 1', function(done){
|
|
var socket = new MysqlSocket();
|
|
var reject = think.reject;
|
|
think.reject = function(err){
|
|
return Promise.reject(err);
|
|
}
|
|
socket.getConnection().then(function() {
|
|
socket.connection.error();
|
|
assert.equal(socket.connection, null);
|
|
think.reject = reject;
|
|
done();
|
|
});
|
|
});
|
|
it('connetion error 2', function(done){
|
|
var fn = Connection.prototype.connect;
|
|
var reject = think.reject;
|
|
think.reject = function(err){
|
|
return Promise.reject(err);
|
|
}
|
|
Connection.prototype.connect = function(cb) {
|
|
setTimeout(function() {
|
|
cb(new Error('connection error'));
|
|
}, 10);
|
|
};
|
|
var socket = new MysqlSocket();
|
|
socket.getConnection().catch(function(err) {
|
|
assert.equal(think.isError(err), true);
|
|
Connection.prototype.connect = fn;
|
|
think.reject = reject;
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('close', function(){
|
|
it('pool close', function(){
|
|
var instance = new MysqlSocket();
|
|
instance.pool = {
|
|
end: function(fn){
|
|
fn && fn();
|
|
}
|
|
}
|
|
instance.close().then(function(){
|
|
assert.equal(instance.pool, null)
|
|
});
|
|
|
|
})
|
|
it('connection close', function(){
|
|
var instance = new MysqlSocket();
|
|
instance.connection = {
|
|
end: function(fn){
|
|
fn && fn();
|
|
}
|
|
}
|
|
instance.close().then(function(){
|
|
assert.equal(instance.connection, null)
|
|
});
|
|
|
|
})
|
|
it('empty close', function(){
|
|
var instance = new MysqlSocket();
|
|
instance.connection = null;
|
|
instance.close();
|
|
assert.equal(instance.connection, null)
|
|
})
|
|
})
|
|
|
|
|
|
after(function(){
|
|
think.npm = npm;
|
|
think.error = error;
|
|
});
|
|
|
|
});
|