top
Version:
Taobao Open API Client.
499 lines (457 loc) • 17 kB
JavaScript
/*!
* top - test/client.test.js
* Copyright(c) 2012 - 2013 fengmk2 <fengmk2@gmail.com>
* MIT Licensed
*/
/**
* Module dependencies.
*/
var should = require('should');
var mm = require('mm');
var urllib = require('urllib');
var fs = require('fs');
var path = require('path');
var top = require('../');
var REST_URL = 'http://gw.api.tbsandbox.com/router/rest';
describe('client.test.js', function () {
var client = top.createClient({
appkey: '1021178166',
appsecret: 'sandboxbc0042b2231100842349ad492',
REST_URL: REST_URL
});
afterEach(mm.restore);
describe('new Client()', function () {
it('should return Client', function () {
var client = new top.Client({appkey: 'key', appsecret: 'secret'});
client.should.be.instanceof(top.Client);
var clientWithoutNew = top.Client({appkey: 'key', appsecret: 'secret'});
clientWithoutNew.should.be.instanceof(top.Client);
});
it('should throw error when miss appkey or appsecret', function () {
(function () {
top.createClient();
}).should.throw('appkey or appsecret need!');
(function () {
top.createClient({ appkey: 'test' });
}).should.throw('appkey or appsecret need!');
(function () {
top.createClient({ appsecret: 'test' });
}).should.throw('appkey or appsecret need!');
});
});
describe('sign() http://open.taobao.com/doc/detail.htm?id=111#s6', function () {
it('should equal 990FD28323F67A1EEC29336EDF373C0E', function () {
var c = top.createClient({
appkey: 'test',
appsecret: 'test'
});
var params = {
method: 'taobao.user.get',
timestamp: '2011-07-01 13: 52:03',
format: 'xml',
app_key: 'test',
v: '2.0',
fields: 'nick,location.state,location.city',
nick: '商家测试帐号17',
sign_method: 'md5',
};
c.sign(params).should.equal('990FD28323F67A1EEC29336EDF373C0E');
});
});
describe('timestamp()', function () {
it('should return yyyy-MM-dd HH:mm:ss format', function () {
var s = client.timestamp();
s.should.match(/\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}/);
});
});
describe('request()', function () {
it('should request success', function (done) {
client.request({
method: 'taobao.user.get',
fields: 'nick,seller_credit',
nick: 'sandbox_c_1'
}, function (err, result) {
should.not.exist(err);
var user = result.user_get_response.user;
user.should.have.keys(['nick', 'seller_credit']);
user.nick.should.equal('sandbox_c_1');
done();
});
});
it('should throw error when method miss', function (done) {
client.request({}, function (err) {
should.exist(err);
err.message.should.equal('`method` required');
done();
});
});
it('should return error when method wrong', function (done) {
client.request({ method: 'not_exists' }, function (err, data) {
should.exist(err);
err.message.should.equal('Invalid method, code 22');
err.code.should.equal(22);
err.data.should.equal('{"error_response":{"code":22,"msg":"Invalid method"}}');
done();
});
});
});
describe('_wrapJSON()', function () {
it('should convert long id number to string', function () {
var s = fs.readFileSync(path.join(__dirname, 'fixtures', 'tmc_messages_consume_response.json')).toString();
s = client._wrapJSON(s);
var o = JSON.parse(s);
// console.log('%s, %j', s, o.tmc_messages_consume_response.messages)
o.tmc_messages_consume_response.messages.tmc_message[0].id.should.equal('7104300007405429232');
});
});
describe('invoke()', function () {
var _request = urllib.request;
afterEach(function () {
urllib.request = _request;
});
it('should mock urllib.request() error', function (done) {
urllib.request = function (url, options, callback) {
process.nextTick(function () {
callback(new Error('mock error'));
});
};
client.invoke('taobao.shop.get', {nick: 'abc', fields: '123'}, [], null, 'GET',
function (err, item) {
should.exist(err);
should.not.exist(item);
err.should.have.property('message', 'mock error');
done();
});
});
it('should mock urllib.request() json parse error', function (done) {
urllib.request = function (url, options, callback) {
process.nextTick(function () {
callback(null, '{');
});
};
client.invoke('taobao.shop.get', {nick: 'abc', fields: '123'}, [], null, 'GET',
function (err, item) {
should.exist(err);
should.not.exist(item);
err.should.have.property('message', 'Unexpected end of input');
err.should.have.property('name', 'SyntaxError');
done();
});
});
});
describe('taobao_user_buyer_get()', function () {
var _request = urllib.request;
afterEach(function () {
urllib.request = _request;
});
it('should return buyer', function (done) {
urllib.request = function (url, options, callback) {
process.nextTick(function () {
callback(null, JSON.stringify(require('./fixtures/user_buyer_get_response.json')));
});
};
client.taobao_user_buyer_get({
session: 'mock',
fields: 'nick,sex,buyer_credit,avatar,has_shop,vip_info',
nick: 'sandbox_c_1'
}, function (err, user) {
should.not.exist(err);
user.should.have.keys('nick,sex,buyer_credit,avatar,has_shop,vip_info'.split(','));
user.nick.should.equal('sandbox_c_1');
done();
});
});
it('should return null when session wrong', function (done) {
client.taobao_user_buyer_get({session: 'mock', fields: 'sex,nick', nick: 'alipublic01notexists'},
function (err, user) {
should.exist(err);
err.name.should.equal('TOPClientError');
err.message.should.equal('Invalid session, code 27; sessionkey-not-generated-by-server: RealSession don't create by top ! appKey is : 1021178166');
err.code.should.equal(27);
err.sub_code.should.equal('sessionkey-not-generated-by-server');
should.not.exist(user);
done();
});
});
it('should throw error when nick miss', function (done) {
client.taobao_user_buyer_get({fields: 'sex,nick'}, function (err, user) {
should.exist(err);
err.message.should.equal('`session` required');
done();
});
});
});
describe('taobao_user_seller_get()', function () {
var _request = urllib.request;
afterEach(function () {
urllib.request = _request;
});
it('should return seller', function (done) {
var fields = 'user_id,nick,sex,seller_credit,type,has_more_pic,item_img_num,item_img_size,prop_img_num,prop_img_size,auto_repost,promoted_type,status,alipay_bind,consumer_protection,avatar,liangpin,sign_food_seller_promise,has_shop,is_lightning_consignment,has_sub_stock,is_golden_seller,vip_info,magazine_subscribe,vertical_market,online_gaming';
urllib.request = function (url, options, callback) {
process.nextTick(function () {
var user = require('./fixtures/user_seller_get_response.json');
var keys = fields.split(',');
var seller = {user_seller_get_response: {user: {}}};
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
seller.user_seller_get_response.user[k] = user.user_seller_get_response.user[k];
}
callback(null, JSON.stringify(seller));
});
};
client.taobao_user_seller_get({
session: 'mock',
fields: fields,
nick: 'hz0799'
}, function (err, user) {
should.not.exist(err);
user.should.have.keys(fields.split(','));
user.nick.should.equal('hz0799');
done();
});
});
it('should return err when session wrong', function (done) {
client.taobao_user_seller_get({session: 'mock', fields: 'sex,nick', nick: 'alipublic01notexists'},
function (err, user) {
should.exist(err);
err.name.should.equal('TOPClientError');
err.message.should.equal('Invalid session, code 27; sessionkey-not-generated-by-server: RealSession don't create by top ! appKey is : 1021178166');
should.not.exist(user);
done();
});
});
it('should throw error when nick miss', function (done) {
client.taobao_user_seller_get({fields: 'sex,nick'}, function (err, user) {
should.exist(err);
err.message.should.equal('`session` required');
done();
});
});
});
describe('taobao_user_get()', function () {
it('should return user', function (done) {
client.taobao_user_get({fields: 'seller_credit,nick', nick: 'sandbox_c_1'},
function (err, user) {
should.not.exist(err);
user.should.have.keys(['seller_credit', 'nick']);
user.nick.should.equal('sandbox_c_1');
done();
});
});
it('should return null when nick not exists', function (done) {
client.taobao_user_get({fields: 'user_id,nick', nick: 'alipublic01notexists'},
function (err, user) {
should.not.exist(err);
should.not.exist(user);
done();
});
});
it('should throw error when nick miss', function (done) {
client.taobao_user_get({fields: 'user_id,nick'}, function (err, user) {
should.exist(err);
err.message.should.equal('`nick` required');
done();
});
});
});
describe('taobao_users_get()', function () {
it('should return users list', function (done) {
client.taobao_users_get({ fields: 'seller_credit,nick', nicks: 'sandbox_c_2,sandbox_c_1' },
function (err, users) {
should.not.exist(err);
users.should.length(2);
for (var i = users.length; i--;) {
var user = users[i];
user.should.have.keys(['seller_credit', 'nick']);
user.nick.should.equal(i === 0 ? 'sandbox_c_2' : 'sandbox_c_1');
}
done();
});
});
it('should return 4 length list when nicks are all same', function (done) {
client.taobao_users_get({
fields: 'nick',
nicks: 'sandbox_c_1,sandbox_c_2,sandbox_c_3,sandbox_c_4'
}, function (err, users) {
should.not.exist(err);
users.should.length(4);
for (var i = users.length; i--;) {
var user = users[i];
user.should.have.keys(['nick']);
user.nick.should.match(/sandbox_c_\d/);
}
done();
});
});
it('should return 1 length list when one nick not exists', function (done) {
client.taobao_users_get({fields: 'nick', nicks: 'sandbox_c_3,苏千notexists'},
function (err, users) {
should.not.exist(err);
users.should.length(1);
for (var i = users.length; i--;) {
var user = users[i];
user.should.have.keys(['nick']);
user.nick.should.equal('sandbox_c_3');
}
done();
});
});
it('should return [] no nick exists', function (done) {
client.taobao_users_get({ fields: 'user_id,nick', nicks: '苏千苏千notexists2,苏千notexists' },
function (err, users) {
should.not.exist(err);
users.should.length(0);
done();
});
});
it('should throw error when nicks miss', function () {
client.taobao_users_get({ fields: 'user_id,nick' }, function (err, user) {
should.exist(err);
err.message.should.be.equal('`nicks` required');
});
});
});
describe('tmall_selected_items_search()', function () {
var mockData = JSON.stringify({
"tmall_selected_items_search_response": {
"item_list": {
"selected_item": [{
"cid": 1101,
"num_iid": 13088700250,
"shop_id": 59227746,
"item_score": "67.33659988217163"
}]
}
}
});
var _request = urllib.request;
after(function () {
urllib.request = _request;
});
// api permission required
it('should return items', function (done) {
urllib.request = function (url, options, callback) {
process.nextTick(function () {
callback(null, mockData);
});
};
client.tmall_selected_items_search({cid: 50016349}, function (err, items) {
should.not.exist(err);
should.exist(items);
items.should.be.an.instanceof(Array).with.length(1);
items[0].should.have.keys('cid', 'num_iid', 'shop_id', 'item_score');
client.taobao_item_get({
num_iid: items[0].num_iid,
fields: 'item_img.url,title,price'
}, done);
});
});
it('should return parameter missing error', function (done) {
client.tmall_selected_items_search({}, function (err, items) {
should.exist(err);
err.name.should.equal('ParameterMissingError');
err.message.should.equal('`cid` required');
done();
});
});
});
describe('taobao_jindoucloud_message_send()', function () {
var mockData = JSON.stringify({
"jindoucloud_message_send_response": {
"send_results": {
"send_result": [{
"nick": "nick",
"err_msg": "nick is null",
"err_code": "isv.invalid-parameter",
"is_success": "false"
}]
}
}
});
before(function () {
mm.data(urllib, 'request', mockData);
});
after(function () {
mm.restore();
});
// api permission required
it('should return items', function (done) {
var params = {
messages: [{
"nick": "nick",
"title": "title",
"view_data": ["a", "b"],
"biz_data": {"k1": "v1", "k2": "v2"},
"biz_id": 0,
"send_no": 0,
"msg_category": "item",
"msg_type": "ItemCreate"
}]
};
client.taobao_jindoucloud_message_send(params, function (err, items) {
should.not.exist(err);
should.exist(items);
items.should.be.an.instanceof(Array).with.length(1);
items[0].should.have.keys('nick', 'err_msg', 'err_code', 'is_success');
done();
});
});
it('should return parameter missing error', function (done) {
var params = {};
client.taobao_jindoucloud_message_send(params, function (err, items) {
should.exist(err);
err.name.should.equal('ParameterMissingError');
err.message.should.equal('`messages` required');
done();
});
});
});
describe('taobao_shop_get()', function () {
it('should return shop info', function (done) {
client.taobao_shop_get({nick: 'sandbox_c_1', fields: 'sid,cid,title,nick,desc,bulletin,pic_path,created,modified'},
function (err, item) {
should.not.exist(err);
item.should.have.keys('sid,cid,title,nick,desc,bulletin,pic_path,created,modified'.split(','));
done();
});
});
it('should return null when user no shop', function (done) {
client.taobao_shop_get({nick: 'sandbox_c_1_notexists', fields: 'sid,cid,title,nick,desc,bulletin,pic_path,created,modified'},
function (err, item) {
should.not.exist(err);
should.not.exist(item);
done();
});
});
it('should return parameter missing error', function (done) {
client.taobao_shop_get({}, function (err, items) {
should.exist(err);
err.name.should.equal('ParameterMissingError');
err.message.should.equal('`nick` required');
done();
});
});
it('should return mock error', function (done) {
var errRes = {
error_response: {
code: 11,
msg: 'Insufficient isv permissions',
sub_code: 'isv.permission-ip-whitelist-limit',
sub_msg: 'The appkey 4272 is only allowed to call from 10.232.*.*,10.13.*.*,10.62.*.*,10.20.*.*,10.235.*.*,110.75.*.*,10.32.*.*,10.14.*.*,10.12.*.*,10.250.*.*,10.253.*.*,10.17.*.*,10.9.*.*,10.7.*.*,10.33.*.*,10.5.*.*,10.1.*.*,127.0.*.*,10.209.*.*,10.208.*.*,10.249.*.*,10.8.*.*, but your ip is 10.68.179.114'
}
};
mm.http.request(/\//, JSON.stringify(errRes));
client.taobao_shop_get({nick: 'sandbox_c_1', fields: 'sid,cid,title,nick,desc,bulletin,pic_path,created,modified'},
function (err, item) {
should.exist(err);
err.name.should.equal('TOPClientError');
err.message.should.include('Insufficient isv permissions, code 11; isv.permission-ip-whitelist-limit: ');
err.code.should.equal(11);
err.sub_code.should.equal('isv.permission-ip-whitelist-limit');
should.not.exists(item);
done();
});
});
});
});