2015-12-17 20:05:38 +08:00

372 lines
10 KiB
JavaScript

'use strict';
var assert = require('assert');
var path = require('path');
var fs = require('fs');
var muk = require('muk');
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 redisSocket = think.adapter('socket', 'redis');
describe('adapter/socket/redis', function(){
it('get instance', function(){
var instance = new redisSocket();
assert.deepEqual(instance.config, { port: 6379, host: '127.0.0.1', password: '' });
})
it('get connection', function(done){
var npm = think.npm;
var wait = think.await;
think.npm = function(){
return {
createClient: function(port, host, config){
assert.equal(port, 6379);
assert.equal(host, '127.0.0.1');
return {
on: function(type, callback){
if(type === 'connect'){
callback && callback();
}
}
}
}
}
}
think.await = function(str, callback){
assert.equal(str, 'redis://127.0.0.1:6379');
return callback && callback();
}
var instance = new redisSocket();
instance.getConnection().then(function(connection){
think.npm = npm;
think.await = wait;
done();
})
}),
it('get connection, change host & port', function(done){
var npm = think.npm;
var wait = think.await;
think.npm = function(){
return {
createClient: function(port, host, config){
assert.equal(port, 1234);
assert.equal(host, 'www.welefen.com');
return {
on: function(type, callback){
if(type === 'connect'){
callback && callback();
}
}
}
}
}
}
think.await = function(str, callback){
assert.equal(str, 'redis://www.welefen.com:1234');
return callback && callback();
}
var instance = new redisSocket({
host: 'www.welefen.com',
port: 1234
});
instance.getConnection().then(function(connection){
think.npm = npm;
think.await = wait;
done();
})
}),
it('get connection, has password', function(done){
var npm = think.npm;
var wait = think.await;
think.npm = function(){
return {
createClient: function(port, host, config){
assert.equal(port, 1234);
assert.equal(host, 'www.welefen.com');
return {
on: function(type, callback){
if(type === 'connect'){
callback && callback();
}
},
auth: function(password, callback){
assert.equal(password, 'password');
callback && callback();
}
}
}
}
}
think.await = function(str, callback){
assert.equal(str, 'redis://www.welefen.com:1234');
return callback && callback();
}
var instance = new redisSocket({
host: 'www.welefen.com',
port: 1234,
password: 'password'
});
instance.getConnection().then(function(connection){
think.npm = npm;
think.await = wait;
done();
})
})
it('get connection, error', function(done){
var npm = think.npm;
var wait = think.await;
var reject = think.reject;
think.npm = function(){
return {
createClient: function(port, host, config){
assert.equal(port, 1234);
assert.equal(host, 'www.welefen.com');
return {
on: function(type, callback){
if(type === 'error'){
callback && callback(new Error('redis get connection error'));
}
},
auth: function(password, callback){
assert.equal(password, 'password');
callback && callback();
}
}
}
}
}
think.await = function(str, callback){
assert.equal(str, 'redis://www.welefen.com:1234');
return callback && callback();
}
think.reject = function(err){
return Promise.reject(err);
}
var instance = new redisSocket({
host: 'www.welefen.com',
port: 1234,
password: 'password'
});
instance.getConnection().catch(function(err){
assert.equal(err.message, 'redis get connection error');
assert.equal(instance.connection, null);
think.npm = npm;
think.await = wait;
think.reject = reject;
done();
})
})
it('get connection, error 1', function(done){
var npm = think.npm;
var wait = think.await;
var reject = think.reject;
think.npm = function(){
return {
createClient: function(port, host, config){
assert.equal(port, 1234);
assert.equal(host, 'www.welefen.com');
return {
on: function(type, callback){
if(type === 'error'){
callback && callback(new Error('EADDRNOTAVAIL'));
}
},
auth: function(password, callback){
assert.equal(password, 'password');
callback && callback();
}
}
}
}
}
think.await = function(str, callback){
assert.equal(str, 'redis://www.welefen.com:1234');
return callback && callback();
}
think.reject = function(err){
return Promise.reject(err);
}
var instance = new redisSocket({
host: 'www.welefen.com',
port: 1234,
password: 'password'
});
instance.getConnection().catch(function(err){
assert.equal(err.message, 'Address not available, redis://www.welefen.com:1234. http://www.thinkjs.org/doc/error_message.html#eaddrnotavail');
assert.equal(instance.connection, null);
think.npm = npm;
think.await = wait;
think.reject = reject;
done();
})
})
it('get connection, exist', function(done){
var instance = new redisSocket({
host: 'www.welefen.com',
port: 1234,
password: 'password'
});
instance.connection = 'welefen';
instance.getConnection().then(function(connection){
assert.equal(connection, 'welefen')
done();
})
})
it('get connection, fail', function(done){
var instance = new redisSocket({
host: 'www.welefen.com',
port: 1234,
password: 'password'
});
var npm = think.npm;
think.npm = function(){
return Promise.reject(new Error('reject'));
}
instance.getConnection().catch(function(err){
think.npm = npm;
assert.equal(err.message, 'reject')
done();
})
})
it('on', function(done){
var instance = new redisSocket();
instance.getConnection = function(){
return Promise.resolve({
on: function(event, callback){
assert.equal(event, 'test');
assert.equal(think.isFunction(callback), true);
}
})
}
instance.on('test', function(){}).then(function(){
done();
})
})
it('wrap', function(done){
var instance = new redisSocket();
instance.getConnection = function(){
var obj = {
get: function(key, callback){
assert.equal(key, 'key');
callback && callback();
}
}
instance.connection = obj;
return Promise.resolve(obj);
}
instance.wrap('get', 'key').then(function(){
done();
})
})
it('wrap reject', function(done){
var instance = new redisSocket();
var reject = think.reject;
think.reject = function(err){
return Promise.reject(err);
}
instance.getConnection = function(){
var obj = {
get: function(key, callback){
assert.equal(key, 'key');
callback && callback(new Error('redis wrap error'));
}
}
instance.connection = obj;
return Promise.resolve(obj);
}
instance.wrap('get', 'key').catch(function(err){
assert.equal(err.message, 'redis wrap error');
think.reject = reject;
done();
})
})
it('get', function(done){
var instance = new redisSocket();
instance.getConnection = function(){
var obj = {
get: function(key, callback){
assert.equal(key, 'key');
callback && callback();
}
}
instance.connection = obj;
return Promise.resolve(obj);
}
instance.get('key').then(function(){
done();
})
})
it('set', function(done){
var instance = new redisSocket();
instance.getConnection = function(){
var obj = {
set: function(key, value, callback){
assert.equal(key, 'key');
assert.equal(value, 'value');
callback && callback();
}
}
instance.connection = obj;
return Promise.resolve(obj);
}
instance.set('key', 'value').then(function(){
done();
})
}),
it('set, timeout', function(done){
var instance = new redisSocket();
instance.getConnection = function(){
var obj = {
set: function(key, value, callback){
assert.equal(key, 'key');
assert.equal(value, 'value');
callback && callback();
},
expire: function(key, timeout, callback){
assert.equal(timeout, 10000);
callback && callback();
}
}
instance.connection = obj;
return Promise.resolve(obj);
}
instance.set('key', 'value', 10000).then(function(){
done();
})
})
it('delete', function(done){
var instance = new redisSocket();
instance.getConnection = function(){
var obj = {
del: function(key, callback){
assert.equal(key, 'key');
callback && callback();
}
}
instance.connection = obj;
return Promise.resolve(obj);
}
instance.delete('key').then(function(){
done();
})
})
it('close', function(){
var instance = new redisSocket();
var flag = false;
instance.connection = {
end: function(){
flag = true;
}
}
instance.close();
assert.equal(flag, true);
})
})