thinkjs/test/Common/function.js
2014-08-11 19:05:20 +08:00

535 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var should = require('should');
var assert = require('assert');
var muk = require('muk');
var path = require('path');
var fs = require('fs');
global.APP_PATH = path.normalize(__dirname + '/../App');
process.execArgv.push('--no-app');
require(path.normalize(__dirname + '/../../index.js'));
describe('getThinkRequirePath', function(){
it('getThinkRequirePath("AdvModel") with APP_DEBUG', function(done){
global.APP_DEBUG = true;
var path = getThinkRequirePath('AdvModel');
assert.equal(path.indexOf('AdvModel.js') > -1, true);
global.APP_DEBUG = false;
done();
})
it('getThinkRequirePath("Model")', function(){
var path = getThinkRequirePath('Model');
assert.equal(path.indexOf('lib/Lib/Core/Model.js') > -1, true);
})
it('getThinkRequirePath("notExistModule") with APP_DEBUG', function(){
global.APP_DEBUG = true;
var path = getThinkRequirePath('notExistModule');
//console.log(path)
assert.equal(path, '');
global.APP_DEBUG = false;
})
it('getThinkRequirePath("notExistModule")', function(){
var path = getThinkRequirePath('notExistModule');
assert.equal(path, '');
})
})
describe('thinkRequire', function(){
it('thinkRequire is function', function(){
assert.equal(isFunction(thinkRequire), true)
})
it('thinkRequire(function(){})', function(){
var fn = thinkRequire(function(){});
assert.equal(isFunction(fn), true);
})
it('thinkRequire("modulenotexist")', function(){
var module = '';
try{
module = thinkRequire('modulenotexist');
}catch(e){}
assert.equal(module, '')
})
it('thinkRequire("/fasdf")', function(){
var filePath = getThinkRequirePath('Controller');
var controller = thinkRequire(filePath);
assert.equal(isFunction(controller), true)
})
var list = [
'Controller', 'App', 'Behavior', 'Cache', 'Db',
'Dispatcher', 'Filter', 'Http', 'Model',
'Session', 'Think', 'Valid', 'View', 'Cookie', 'WebSocket',
'AdvModel', 'CheckResourceBehavior', 'CheckRouteBehavior',
'DenyIpBehavior', 'LocateTemplateBehavior', 'ParseTemplateBehavior',
'ReadHtmlCacheBehavior', 'WriteHtmlCacheBehavior', 'FileCache',
'MemcacheCache', 'MysqlDb', 'DbSession', 'FileSession', 'MemcacheSocket',
'MysqlSocket', 'EjsTemplate', 'RestController'
];
list.forEach(function(item){
it(item + ' is module', function(){
var module = thinkRequire(item);
assert.equal(isFunction(module) || isObject(module), true)
})
})
})
describe('inherits from base Class', function(){
it('inherits from FileCache', function(){
var fileCache = thinkRequire('FileCache');
var cls = Cache('FileCache', function(){})
assert.equal(cls.super_ === fileCache, true)
})
it('inherits from Cache', function(){
var cache = thinkRequire('Cache');
var cls = Cache(function(){})
assert.equal(cls.super_ === cache, true)
})
})
describe('aliasImport', function(){
it('aliasImport string', function(){
aliasImport('test', 'path/to/test');
assert.equal(getThinkRequirePath('test'), 'path/to/test');
})
it('aliasImport obj', function(){
aliasImport({test: 'path/to/test1'});
assert.equal(getThinkRequirePath('test'), 'path/to/test1')
})
})
describe('B', function(){
it('B()', function(){
assert.equal(B(), undefined)
})
it('B(function(){})', function(){
var fn = function(){
return 'welefen';
}
assert.equal(B(fn), 'welefen')
})
it('B("DenyIpBehavior") = true', function(){
assert.equal(B('DenyIp'), true)
})
it('B("DenyIpBehavior"), promise', function(){
C('deny_ip', ['127.0.0.1']);
var result = B('DenyIp', {
ip: function(){
return '127.0.0.1';
},
res: {
end: function(){}
}
});
assert.equal(isFunction(result.then), true)
})
})
describe('C', function(){
it('C("db_host") = "localhost"', function(){
var host = C('db_host');
assert.equal(host, '127.0.0.1');
})
it('C("one.two") = undefined', function(){
assert.equal(C('one.two'), undefined)
})
it('C("one") = undefined', function(){
assert.equal(C('one'), undefined);
})
it('C("one", "welefen")', function(){
C('one', 'welefen');
assert.equal(C('one'), 'welefen');
})
it('C("one1.two", "welefen")', function(){
C('one1.two', 'welefen');
assert.equal(C('one1.two'), 'welefen');
assert.equal(JSON.stringify(C('one1')), '{"two":"welefen"}')
})
it('C()', function(){
var data = C();
assert.equal(data.db_host, '127.0.0.1');
assert.equal(data.db_type, 'mysql');
assert.equal(data.port, 8360)
})
it('C(null)', function(){
var data = C();
C(null);
assert.equal(C('db_host'), undefined)
assert.equal(C('db_type'), undefined);
assert.equal(C('port'), undefined)
C(data);
assert.equal(C('db_type'), 'mysql')
})
})
describe('F', function(){
it('F("not exist")', function(){
var value = F('not exist');
assert.equal(value, false)
})
it('F("welefen", "suredy")', function(){
F('welefen', 'suredy');
var value = F('welefen');
assert.equal(value, 'suredy')
})
it('F("welefen", null)', function(){
F('welefen', null);
assert.equal(F('welefen'), null)
})
it('F("welefen", {})', function(){
var data = {name: 'welefen', value: 'suredy'};
F('welefen', data);
assert.equal(JSON.stringify(F('welefen')), JSON.stringify(data))
})
it('F("welefen", "suredy", tmpPath)', function(){
F('welefen', 'suredy', DATA_PATH + '/xxx/other');
var value = F('welefen', undefined, DATA_PATH + '/xxx/other');
assert.equal(value, 'suredy')
})
it('F() file no content', function(){
var filePath = path.normalize(__dirname + '/../App/Runtime/Data/a.json');
mkdir(path.dirname(filePath));
fs.writeFileSync(filePath, '');
var value = F('a');
assert.equal(value, false)
})
})
describe('tag', function(){
var http = thinkRequire('Http').getDefaultHttp('/index/index');
http = thinkRequire('Http')(http.req, http.res).run();
it('tags not found', function(done){
tag('xxxx', http).then(function(data){
assert.equal(data, undefined)
done();
})
})
it('tag:app_init', function(done){
http.then(function(http){
return tag('app_init', http)
}).then(function(data){
assert.equal(data, undefined);
done();
})
})
it('tag:form_parse', function(done){
http.then(function(http){
return tag('form_parse', http)
}).then(function(data){
assert.equal(data, undefined);
done();
})
})
it('tag:path_info', function(done){
http.then(function(http){
return tag('path_info', http)
}).then(function(data){
assert.equal(data, undefined);
done();
})
})
it('tag return value', function(done){
C('tag.testtag', [function(){
return 'testtag'
}]);
http.then(function(http){
return tag('testtag', http)
}).then(function(data){
assert.equal(data, 'testtag');
done();
})
})
})
describe('A', function(){
var http = thinkRequire('Http').getDefaultHttp('/index/index');
http = thinkRequire('Http')(http.req, http.res).run();
it('A("home:index:test")', function(done){
var filepath = path.normalize(__dirname + '/../App/Lib/Controller/Home/IndexController.js');
mkdir(path.dirname(filepath));
fs.writeFileSync(filepath, 'module.exports = Controller({testAction: function(){return "welefen"}})')
var ret = A('home:index:test', http);
ret.then(function(value){
assert.equal(value, 'welefen')
done();
})
})
it('A("home:test:test")', function(done){
var filepath = path.normalize(__dirname + '/../App/Lib/Controller/Home/TestController.js');
mkdir(path.dirname(filepath));
fs.writeFileSync(filepath, 'module.exports = Controller({testAction: function(){return "test:test"},otherAction: function(){return {"name":"welefen"}}})')
var ret = A('home:test:test', http);
ret.then(function(value){
assert.equal(value, 'test:test')
done();
})
})
it('A("home:test:other")', function(done){
var ret = A('home:test:other', http, 'welefen');
ret.then(function(value){
assert.deepEqual(value, {"name":"welefen"})
done();
})
})
it('A("home:test1:other")', function(done){
var ret = A('home:test1:other', http, 'welefen');
ret.catch(function(err){
assert.equal(isError(err), true)
done()
})
})
it('A("home:test")', function(done){
var ret = A('home:test', http, 'welefen');
assert.equal(isFunction(ret.otherAction), true)
done();
})
})
describe('D', function(){
it('D()', function(){
var model = D();
var Model = thinkRequire('Model');
assert.equal(model instanceof Model, true)
})
it('D("User").hasFile = function', function(){
var filepath = path.normalize(__dirname + '/../App/Lib/Model/UserModel.js');
mkdir(path.dirname(filepath))
fs.writeFileSync(filepath, 'module.exports = Model({testName: "welefen", hasFile: function(){return true;}})')
var model = D('User');
assert.equal(isFunction(model.hasFile), true);
})
it('D("User") prop', function(){
var model = D('User');
var testName = model.constructor.__prop.testName;
assert.equal(testName, 'welefen')
})
it('D("xxx").hasFile = undefined', function(){
var model = D('xxx');
assert.equal(model.hasFile, undefined)
})
it('D("xxx").prop', function(){
var model = D('xxx');
assert.equal(model.constructor.__prop.testName, undefined)
})
it('D("User:AdvModel")', function(){
var model = D('User:AdvModel');
assert.equal(isFunction(model.setRelation), false)
})
it('D("Xxx:AdvModel")', function(){
var model = D('Xxx:AdvModel');
assert.equal(isFunction(model.setRelation), true)
})
})
describe('M', function(){
it('M()', function(){
var model = M();
var Model = thinkRequire('Model');
assert.equal(model instanceof Model, true)
})
it('M("User").hasFile = undefined', function(){
var model = M('User');
assert.equal(model.hasFile, undefined);
})
it('M("User") prop', function(){
var model = M('User');
var testName = model.constructor.__prop.testName;
assert.equal(testName, undefined)
})
it('M("XXX").hasFile = undefined', function(){
var model = M('XXX');
assert.equal(model.hasFile, undefined);
})
it('M("User:AdvModel")', function(){
var model = M('User:AdvModel');
assert.equal(isFunction(model.setRelation), true)
})
it('M("Xxx:AdvModel")', function(){
var model = D('Xxx:AdvModel');
assert.equal(isFunction(model.setRelation), true)
})
})
describe('S', function(){
describe('FileCache', function(){
it('file cache string', function(done){
S('name', 'welefen').then(function(){
return S('name');
}).then(function(value){
assert.equal(value, 'welefen');
done();
})
})
it('file cache json', function(done){
S('json', {name: 'welefen'}).then(function(){
return S('json');
}).then(function(value){
//console.log(JSON.stringify(value))
assert.equal(JSON.stringify(value), '{"name":"welefen"}');
done();
})
})
it('file rm cache', function(done){
S('json', {name: 'welefen'}).then(function(){
return S('json', null);
}).then(function(){
return S('json')
}).then(function(value){
//console.log(JSON.stringify(value))
assert.equal(value, undefined);
done();
})
})
it('file cache timeout', function(done){
S('json', {name: 'welefen'}, -100).then(function(){
return S('json');
}).then(function(value){
//console.log(JSON.stringify(value))
assert.equal(value, undefined);
done();
})
})
it('file cache time', function(done){
S('json', {name: 'welefen'}, 3).then(function(){
return S('json');
}).then(function(value){
//console.log(JSON.stringify(value))
assert.equal(JSON.stringify(value), '{"name":"welefen"}');
done();
})
})
it('file cache, timeout remove', function(done){
S('json', {name: 'welefen'}, 0.01).then(function(){
var deferred = getDefer();
setTimeout(function(){
S('json').then(function(data){
deferred.resolve(data)
})
}, 20)
return deferred.promise;
}).then(function(value){
//console.log(JSON.stringify(value))
assert.equal(value, undefined);
done();
})
})
it('file cache, promise', function(done){
S('wwwwwwwwfasdfasdw', function(){
return 'welefen';
}, -100).then(function(data){
assert.equal(data, 'welefen');
return S('wwwwwwwwfasdfasdw', null)
}).then(function(){
done();
})
})
})
describe('Node.js memory', function(){
//使用Node.js内存cache
it('Node.js mem, cache string', function(done){
S('name', 'welefen', true).then(function(){
return S('name');
}).then(function(value){
assert.equal(value, 'welefen');
done();
})
})
it('Node.js mem, cache function', function(done){
S('name', 'welefen', true).then(function(){
return S('name', function(){
return 'welefen cache'
});
}).then(function(value){
assert.equal(value, 'welefen');
done();
})
})
it('Node.js mem, cache function 1', function(done){
S('name', 'welefen', true).then(function(){
return S('name1', function(){
return 'welefen cache'
});
}).then(function(value){
assert.equal(value, 'welefen cache');
done();
})
})
it('Node.js mem, cache json', function(done){
S('json', {name: 'welefen'}, true).then(function(){
return S('json', undefined, true);
}).then(function(value){
//console.log(JSON.stringify(value))
assert.equal(JSON.stringify(value), '{"name":"welefen"}');
done();
})
})
it('Node.js mem, rm cache', function(done){
S('json1', {name: 'welefen'}, true).then(function(){
return S('json1', null, true);
}).then(function(){
return S('json1', undefined, true)
}).then(function(value){
//console.log(JSON.stringify(value))
assert.equal(value, undefined);
done();
})
})
it('Node.js mem, cache timeout', function(done){
S('json2', {name: 'welefen'}, {type: true, timeout: -100}).then(function(){
return S('json2', undefined, true);
}).then(function(value){
assert.equal(value, undefined);
done();
})
})
it('Node.js mem, cache time', function(done){
S('json3', {name: 'welefen'}, {type: true, timeout: 3}).then(function(){
return S('json3', undefined, true);
}).then(function(value){
//console.log(JSON.stringify(value))
assert.equal(JSON.stringify(value), '{"name":"welefen"}');
done();
})
})
it('Node.js mem, cache timeout remove', function(done){
S('json4', {name: 'welefen'}, {type: true, timeout: 0.01}).then(function(){
var deferred = getDefer();
setTimeout(function(){
S('json4', undefined, true).then(function(data){
deferred.resolve(data)
})
}, 20)
return deferred.promise;
}).then(function(value){
//console.log(JSON.stringify(value))
assert.equal(value, undefined);
done();
})
})
})
})
describe('L', function(){
it('L("welefen") = welefen', function(){
assert.equal(L('welefen'), 'welefen')
})
it('L() = undefined', function(){
assert.equal(L(), undefined)
})
})
//删除缓存文件
//异步删除不能在after里操作
describe('rm tmp files', function(){
it('rm tmp files', function(done){
rmdir(path.normalize(__dirname + '/../App')).then(done)
})
})