Socket
Socket
Sign inDemoInstall

ispapi-apiconnector

Package Overview
Dependencies
0
Maintainers
1
Versions
51
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 4.0.0 to 4.0.1

test/check-helper.js

15

client.js

@@ -6,6 +6,2 @@ /*

*/
/* jslint node:true */
/* jshint node:true */
'use strict';

@@ -17,3 +13,2 @@

var Response = require("./response.js");
var responses = require("./defaultresponses.js");

@@ -54,3 +49,3 @@ /**

if (!p_cfg) {
var r = new Response(responses.expired, p_cmd);
var r = new Response(Response.responses.expired, p_cmd);
p_cb(r["as_" + p_type]());

@@ -99,5 +94,5 @@ return;

else {
c.on("error", function(r) {
console.error('ispapi-apiconnector: error event thrown in request method but no error callback method provided.');
console.error(JSON.stringify(r["as_" + p_type]()));
c.on("error", function(/*r*/) {
//console.error('ispapi-apiconnector: error event thrown in request method but no error callback method provided.');
//console.error(JSON.stringify(r["as_" + p_type]()));
});

@@ -134,3 +129,3 @@ }

p_uri = "https://coreapi.1api.net/api/call.cgi";
else if (!p_uri.match(/^(http|https):\/\//))
if (!p_uri.match(/^(http|https):\/\//))
throw new Error("Unsupported protocol within api connection uri.");

@@ -137,0 +132,0 @@

@@ -0,1 +1,11 @@

4.0.1 / 2017-02-09
===================
* Separated reusable test methods into test/check-helper.js
* Deactivated console outputs
* defaultresponses.js is now directly available via response.js e.g. `var responses = require('./response.js').responses;`.
* moved more commands and responses into test-commands.js
* reviewed automated tests with usage of nock to simulate network traffic instead of making always real API connections. Just one scenario with login / request / logout left out to deal with an API connection to make sure everything works also well when doing a real API communication.
* some minor code reviews of the mocca tests
4.0.0 / 2017-02-03

@@ -2,0 +12,0 @@ ===================

{
"name": "ispapi-apiconnector",
"description": "1API API Connector for node.js",
"version": "4.0.0",
"version": "4.0.1",
"author": {

@@ -39,3 +39,3 @@ "name": "Kai Schwarz",

"test": "npm run test-unit --silent",
"test-unit": "NODE_ENV=development ./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha -- --use_strict --inline-diffs --require co-mocha $(find ./test -name '*.spec.js' -not -path './node_modules/*')"
"test-unit": "NODE_ENV=development ./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha -- --bail --use_strict --inline-diffs --require co-mocha $(find ./test -name '*.spec.js' -not -path './node_modules/*')"
},

@@ -46,7 +46,6 @@ "devDependencies": {

"mocha": "3.2.0",
"sinon": "1.17.7",
"sinon-chai": "2.8.0",
"istanbul": "0.4.5"
"istanbul": "0.4.5",
"nock": "9.0.4"
},
"dependencies": {}
}

@@ -38,3 +38,3 @@ /*

events.EventEmitter.call(this);
this.socketcfg = p_cfg;
this.socketcfg = Object.assign({}, p_cfg);
this.data = p_data;

@@ -46,24 +46,29 @@ this.cmd = Object.assign({}, p_command);

/**
* http request callback method
* @param {Object} res http client response object
*/
Request.prototype.requestCallback = function(res) {
var oself = this;
var response = "";
res.setEncoding('utf8');
res.on('data', function(chunk) {
response += chunk;
});
res.on('end', function() {
oself.emit("response", new Response(response, oself.cmd));
response = "";
});
};
/**
* perform a command request to the 1API backend API
*/
Request.prototype.request = function() {
var req, oself = this;
req = require(oself.socketcfg.protocol.replace(/\:$/, '')).request(oself.socketcfg, function(res) {
var response = "";
res.setEncoding('utf8');
res.on('data', function(chunk) {
response += chunk;
});
res.on('end', function() {
oself.emit("response", new Response(response, oself.cmd));
response = "";
});
res.on('error', function() {
//e.message = 'problem with response: ' + e.message;
oself.emit('error', new Response(Response.responses.error, oself.cmd));
});
});
req.setTimeout(250000); //250s (to be sure to get an API response)
var req;
req = require(this.socketcfg.protocol.replace(/\:$/, '')).request(
this.socketcfg,
this.requestCallback.bind(this)
);
req.on('socket', function(socket) {
socket.on('timeout', function() {
socket.setTimeout(250000, function() { //250s (to be sure to get an API response)
req.abort();

@@ -74,5 +79,5 @@ });

//e.message = 'problem with request: ' + e.message;
oself.emit('error', new Response(Response.responses.error, oself.cmd));
});
req.write(oself.data);
this.emit('error', new Response(Response.responses.error, this.cmd));
}.bind(this));
req.write(this.data);
req.end();

@@ -79,0 +84,0 @@ };

@@ -8,4 +8,2 @@ /*

var responses = require("./defaultresponses.js");
/**

@@ -19,3 +17,3 @@ * @alias node.ispapi-apiconnector.Response

var Response = function(p_r, p_command) {
p_r = ((!p_r || p_r === "") ? responses.empty : p_r);
p_r = ((!p_r || p_r === "") ? Response.responses.empty : p_r);
this.colregexp = false;

@@ -90,4 +88,4 @@ this.data = {

if (r.hasOwnProperty("PROPERTY")) {
Object.keys(r.PROPERTY).forEach(function(key){
r.PROPERTY[key].forEach(function(val, index){
Object.keys(r.PROPERTY).forEach(function(key) {
r.PROPERTY[key].forEach(function(val, index) {
plain += "\r\nPROPERTY[" + key + "][" + index + "]=" + val;

@@ -109,3 +107,3 @@ });

Response.getTemplates = function() {
return responses;
return Response.responses;
};

@@ -119,7 +117,7 @@ /**

Response.getTemplate = function(p_tplid, p_parse) {
if (responses[p_tplid])
if (Response.responses[p_tplid])
if (p_parse)
return Response.parse(responses[p_tplid]);
return Response.parse(Response.responses[p_tplid]);
else
return responses[p_tplid];
return Response.responses[p_tplid];
return false;

@@ -255,7 +253,5 @@ };

d = Object.assign({}, this.data.parsed);
if (d.hasOwnProperty("PROPERTY")) {
Object.keys(d.PROPERTY).forEach(function(key){
if (!key.match(this.colregexp)) delete d.PROPERTY[key];
}.bind(this));
}
Object.keys(d.PROPERTY).forEach(function(key) {
if (!key.match(this.colregexp)) delete d.PROPERTY[key];
}.bind(this));
}

@@ -270,3 +266,3 @@ else d = this.data.parsed;

as_list: function() {
var r, tmp, key, row, row2, i, count;
var r, tmp, key, row2, i, count, keys;
r = this.as_hash();

@@ -281,22 +277,21 @@ tmp = {};

tmp.LIST = [];
row = {};
for (key in r.PROPERTY) {
if (r.PROPERTY.hasOwnProperty(key)) {
if (!key.match(Response.pagerRegexp)) { // paging info
row[key] = "";
if (r.PROPERTY[key].length > count) count = r.PROPERTY[key].length;
}
}
}
if (count) {
if (r.PROPERTY) {
keys = Object.keys(r.PROPERTY).filter(function(key) {
return !key.match(Response.pagerRegexp); // paging info
});
keys.forEach(function(key) {
if (r.PROPERTY[key].length > count)
count = r.PROPERTY[key].length;
});
for (i = 0; i < count; i++) { // run up to max index found
row2 = {};
for (key in row) { // run over all columns (properties) found
// NOTE: do not add column indexes that are not available
// -- avoids blowing up response size
// -- requires implementation of mechanisms to avoid access on
// these not existing indexes later (not part of this lib!)
if (row.hasOwnProperty(key) && r.PROPERTY[key][i] !== undefined)
// run over all columns (properties) found
// NOTE: do not add column indexes that are not available
// -- avoids blowing up response size
// -- requires implementation of mechanisms to avoid access on
// these not existing indexes later (not part of this lib!)
keys.forEach(function(key) {
if (r.PROPERTY[key][i] !== undefined)
row2[key] = r.PROPERTY[key][i];
}
});
tmp.LIST.push(Object.assign({}, row2));

@@ -437,3 +432,3 @@ }

limit: function() {
return (this.getColumnIndex("LIMIT", 0, true) || this.count() || 100);
return (this.getColumnIndex("LIMIT", 0, true) || this.count());
},

@@ -453,3 +448,3 @@ /**

var t = this.total();
if (t) return (Math.ceil(t / this.limit()) || 1);
if (t) return Math.ceil(t / this.limit()); //will never be 0
return 1;

@@ -463,4 +458,4 @@ },

if (this.count()) {
var limit = this.limit();
if (limit) return Math.floor(this.first() / limit) + 1;
//limit cannot be 0 as this.count() will cover this, no worries
return Math.floor(this.first() / this.limit()) + 1;
}

@@ -487,2 +482,4 @@ return 1;

Response.responses = require('./defaultresponses');
module.exports = Response;

@@ -5,18 +5,27 @@ /* jshint -W024 */

var testcmds = require('./test-commands.js');
var expect = require('chai').expect;
var events = require('events');
var apiconnector = require('../index.js');
var events = require('events');
var nock = require('nock');
var Request = apiconnector.Request;
var Response = apiconnector.Response;
var Client = apiconnector.Client;
var chkHlp = require('./check-helper.js');
var expectPropertyFn = chkHlp.expectPropertyFn;
var expectResponseHash = chkHlp.expectResponseHash;
var expectValidSocketConfig = chkHlp.expectValidSocketConfig;
after(function() {
nock.cleanAll();
});
describe("client.js", function() {
this.timeout(250000);
this.slow(1000);
var client;
describe("check general class structure", function() {
it("check constructor", function() {
expect(apiconnector).to.have.property('Client');
expect(apiconnector.Request).to.be.an('function');
client = apiconnector.Client;
var req = new client();
expect(req).to.be.instanceof(client);
var req = new Client();
expect(req).to.be.instanceof(Client);
expect(req).to.be.instanceof(events.EventEmitter); //inheritance

@@ -28,4 +37,3 @@ });

it("check existance of non-prototype method '" + m + "'", function() {
expect(client).to.have.property(m);
expect(client[m]).to.be.an('function');
expectPropertyFn(Client, m);
});

@@ -37,4 +45,3 @@ });

it("check existance of prototype method '" + m + "'", function() {
expect(client.prototype).to.have.property(m);
expect(client.prototype[m]).to.be.an('function');
expectPropertyFn(Client.prototype, m);
});

@@ -48,3 +55,3 @@ });

validate = "COMMAND=ModifyDomain\nAUTH=gwrgwqg%&\\44t3*\n";
enc = client.command_encode({
enc = Client.command_encode({
COMMAND: "ModifyDomain",

@@ -54,5 +61,4 @@ AUTH: "gwrgwqg%&\\44t3*"

expect(enc).to.equal(validate);
enc = client.command_encode("gregergege");
expect(enc).to.be.a('string');
expect(enc).to.be.empty;
enc = Client.command_encode("gregergege");
expect(enc).to.equal('');
});

@@ -62,8 +68,5 @@ });

describe("Client.getDefaultOptions", function() {
it("test if generating configuration defaults works", function() {
var cfg = client.getDefaultOptions();
it("test if generating socket configuration defaults works", function() {
var cfg = Client.getDefaultOptions();
expect(cfg).to.be.an('object');
['host', 'port', 'protocol', 'method', 'path'].forEach(function(key) {
expect(cfg).to.have.property(key);
});
expect(cfg.protocol).to.equal('https:');

@@ -75,8 +78,6 @@ expect(cfg.host).to.equal('coreapi.1api.net');

});
it("test if generating configuration default works for given uri", function() {
var cfg = client.getDefaultOptions('http://coreapi.1api.net/api/call.cgi');
var cfg = Client.getDefaultOptions('http://coreapi.1api.net/api/call.cgi');
expect(cfg).to.be.an('object');
['host', 'port', 'protocol', 'method', 'path'].forEach(function(key) {
expect(cfg).to.have.property(key);
});
expect(cfg.protocol).to.equal('http:');

@@ -90,3 +91,3 @@ expect(cfg.host).to.equal('coreapi.1api.net');

var cl = new apiconnector.Client();
var cl = new Client();
var socketcfg;

@@ -115,3 +116,3 @@

expect(c).to.be.an('object');
expect(c).to.be.instanceof(apiconnector.Request);
expect(c).to.be.instanceof(Request);
});

@@ -128,3 +129,3 @@ });

//remoteaddr: provide it, if you have an ip address filter activated in your account for security reasons
}, done, 'ftp://coreapi.1api.net/api/call/.cgi');
}, null, 'ftp://coreapi.1api.net/api/call.cgi');
};

@@ -134,2 +135,23 @@ expect(fn).to.throw(Error);

});
it("perform an API login with invalid credentials", function(done) {
var fn = function() {
nock('http://coreapi.1api.net')
.post('/api/call.cgi')
.reply(200, "[RESPONSE]\r\ncode=530\r\ndescription=Authentication failed\r\nqueuetime=0\r\nruntime=0.001\r\nEOF\r\n");
cl.login({
entity: "1234", //OT&E system, use "54cd" for LIVE system
login: "test.user.donotexists", //your user id, here: the OT&E demo user
pw: "####" //your user password
//remoteaddr: provide it, if you have an ip address filter activated in your account for security reasons
}, function(r) {
nock.restore();
expectResponseHash(r, '530', 'Authentication failed'); //maybe we can improve here with apiconnector.Response instance
done();
}, 'http://coreapi.1api.net/api/call.cgi');
};
expect(fn).to.not.throw(Error);
});
it("perform an API login with demo credentials", function(done) {

@@ -143,17 +165,9 @@ var fn = function() {

}, function(r, sockcfg) {
expect(r).to.be.an('object'); //maybe we can improve here with apiconnector.Response instance
expect(r).to.have.property('CODE');
socketcfg = sockcfg;
expectResponseHash(r); //maybe we can improve here with apiconnector.Response instance
if (r.CODE !== "200") {
expect(parseInt(r.CODE), 10).to.be.within(200, 499);
expect(parseInt(r.CODE, 10)).to.be.within(200, 499);
done();
return;
}
expect(sockcfg).to.be.an('object');
expect(sockcfg).to.have.property('options');
expect(sockcfg).to.have.property('params');
expect(sockcfg.params).to.have.property('session');
expect(sockcfg.params).to.have.property('entity');
expect(sockcfg.params).to.not.have.property('pw');
expect(sockcfg.params).to.not.have.property('login');
expect(sockcfg.params).to.not.have.property('user');
socketcfg = sockcfg;
done();

@@ -167,5 +181,13 @@ });

describe("Client.request", function() {
beforeEach(function() {
expectValidSocketConfig(socketcfg);
});
afterEach(function() {
nock.restore();
});
var uidxCB = function(r, done) {
expect(r).to.be.an('object');
expect(r).to.have.property('CODE');
expectResponseHash(r);
if (r.CODE === '200') {

@@ -182,36 +204,30 @@ expect(r).to.have.property('PROPERTY');

it("perform an API request [no callback provided]", function() {
expect(socketcfg).to.be.an('object');
cl.request({
COMMAND: 'GetUserIndex'
}, socketcfg);
nock('https://coreapi.1api.net')
.post('/api/call.cgi')
.reply(200, testcmds.getuserindex.RESPONSE.success);
cl.request(testcmds.getuserindex.COMMAND, socketcfg);
});
it("perform an API request [no socket cfg provided]", function(done) {
//no connection will be established!
var cb = function(r) {
expect(r).to.be.an('object');
expect(r).to.have.property('CODE');
expect(r.CODE).to.be.equal('530');
expect(r.DESCRIPTION).to.be.equal('SESSION NOT FOUND');
expectResponseHash(r, '530', 'SESSION NOT FOUND');
done();
};
cl.request({
COMMAND: 'GetUserIndex'
}, null, cb, cb, 'hash');
cl.request(testcmds.getuserindex.COMMAND, null, cb, cb, 'hash');
});
it("perform an API request [socket cfg w/o options and headers]", function(done) {
expect(socketcfg).to.be.an('object');
nock.activate(); //reuse setting from 2 test before
var cb = function(r) {
uidxCB(r, done);
};
var newcfg = Object.assign({}, socketcfg);
var newcfg = JSON.parse(JSON.stringify(socketcfg));
delete newcfg.options;
cl.request({
COMMAND: 'GetUserIndex'
}, newcfg, cb, cb, 'hash');
cl.request(testcmds.getuserindex.COMMAND, newcfg, cb, cb, 'hash');
});
it("perform an API request [socket cfg w/o expect header]", function(done) {
expect(socketcfg).to.be.an('object');
var newcfg = Object.assign({}, socketcfg);
nock.activate(); //reuse setting from last test
var newcfg = JSON.parse(JSON.stringify(socketcfg));
var cb = function(r) {

@@ -221,20 +237,21 @@ uidxCB(r, done);

newcfg.options.headers = {};
cl.request({
COMMAND: 'GetUserIndex'
}, newcfg, cb, cb, 'hash');
cl.request(testcmds.getuserindex.COMMAND, newcfg, cb, cb, 'hash');
});
it("perform an API request [hash response]", function(done) {
expect(socketcfg).to.be.an('object');
nock.cleanAll();
//NOTE: here we perform a real API request for test purpose
var cb = function(r) {
uidxCB(r, done);
};
cl.request({
COMMAND: 'GetUserIndex'
}, socketcfg, cb, cb, 'hash');
cl.request(testcmds.getuserindex.COMMAND, socketcfg, cb, cb, 'hash');
});
it("perform an API request [list response]", function(done) {
//here we fake again to save test runtime
nock('https://coreapi.1api.net')
.post('/api/call.cgi')
.reply(200, testcmds.querydomainlist.success.RESPONSE);
var cb = function(r) {
expect(r).to.be.an('object');
expect(r).to.have.property('CODE');
expectResponseHash(r);
if (r.CODE === '200') {

@@ -247,7 +264,23 @@ expect(r).to.have.property('LIST');

};
cl.request({
COMMAND: 'QueryDomainList',
LIMIT: 2
}, socketcfg, cb, cb, 'list');
cl.request(testcmds.querydomainlist.success.COMMAND, socketcfg, cb, cb, 'list');
});
it("perform an API request [connection error]", function(done) {
//cannot nock connection error as nock is not on the network layer
var cfg = JSON.parse(JSON.stringify(socketcfg));
cfg.options.port = '8123';
cfg.options.protocol = 'http:';
cfg.options.host = 'gregergegegegerwrgwe.com';
var cb = function(r) {
var rv = Response.parse(Response.responses.error);
expectResponseHash(rv);
expectResponseHash(r, rv.CODE);
done();
};
cl.request(testcmds.getuserindex.COMMAND, cfg, cb, cb, 'hash');
//perform it again without callback for code coverage
//that's basically ok, as someone might really just want to do an API
//request without caring about the api response
cl.request(testcmds.getuserindex.COMMAND, cfg);
});
});

@@ -257,7 +290,4 @@

it("perform an API logout using previous session", function(done) {
expect(socketcfg).to.be.an('object');
cl.logout(socketcfg, function(r) {
expect(r).to.be.an('object');
expect(r).to.have.property('CODE');
expect(r.CODE).to.equal('200');
expectResponseHash(r, '200'); //maybe better Response instance here
done();

@@ -264,0 +294,0 @@ });

@@ -6,4 +6,9 @@ /* jshint -W024 */

var expect = require('chai').expect;
var apiconnector = require('../index.js');
var Request = require('../request.js');
var Response = require('../response.js');
var events = require('events');
var nock = require('nock');
var chkHlp = require('./check-helper.js');
var expectPropertyFn = chkHlp.expectPropertyFn;
var expectResponse = chkHlp.expectResponse;

@@ -13,19 +18,18 @@ describe("request.js", function() {

this.slow(1000);
var request;
after(function(){
nock.cleanAll();
});
describe("check general class structure", function() {
it("check constructor", function() {
expect(apiconnector).to.have.property('Request');
expect(apiconnector.Request).to.be.an('function');
request = apiconnector.Request;
var req = new request();
expect(req).to.be.instanceof(request);
expect(Request).to.be.an('function');
var req = new Request();
expect(req).to.be.instanceof(Request);
expect(req).to.be.instanceof(events.EventEmitter); //inheritance
});
var methods = ["request"];
methods.forEach(function(m) {
["request"].forEach(function(m) {
it("check existance of prototype method '" + m + "'", function() {
expect(request.prototype).to.have.property(m);
expect(request.prototype[m]).to.be.an('function');
expectPropertyFn(Request.prototype, m);
});

@@ -37,3 +41,3 @@ });

it("check successful communication based on OT&E system", function(done) {
var c = new request({
var c = new Request({
method: 'POST',

@@ -49,11 +53,7 @@ protocol: 'http:',

c.on("response", function(r) {
expect(r).to.be.an('object');
expect(r).to.be.instanceof(apiconnector.Response);
expect(r.code()).to.equal('530');
expect(r.description()).to.equal('Authentication failed; SESSION NOT FOUND');
expectResponse(r, '530', 'Authentication failed; SESSION NOT FOUND');
done();
});
c.on("error", function(r) {
expect(r).to.be.an('object');
expect(r).to.be.instanceof(apiconnector.Response);
expectResponse(r);
done();

@@ -63,3 +63,49 @@ });

});
it("check connection error [connection timeout]", function(done) {
nock('http://coreapi.1api.net')
.post('/api/call.cgi')
.socketDelay(300000) //300s; API timeout is 250s
.reply(200, Response.responses.expired);
//note: even though timeout is defined, app comes directly backorder
//but as requested: as a timeout! great!
var c = new Request({
method: 'POST',
protocol: 'http:',
host: 'coreapi.1api.net',
path: '/api/call.cgi'
},
's_entity=1234&s_session=__iWillNeverExist__&command=EndSession', {
COMMAND: "EndSession"
}
);
c.on("error", function(r) {
expectResponse(r, '421', 'Command failed due to server error. Client should try again');
done();
});
c.request();
});
it("check connection error [connection error]", function(done) {
nock('http://coreapi.1api.net')
.post('/api/call.cgi')
.replyWithError('Internal Server Error');
var c = new Request({
method: 'POST',
protocol: 'http:',
host: 'coreapi.1api.net',
path: '/api/call.cgi'
},
's_entity=1234&s_session=__iWillNeverExist__&command=EndSession', {
COMMAND: "EndSession"
}
);
c.on("error", function(r) {
expectResponse(r, '421', 'Command failed due to server error. Client should try again');
done();
});
c.request();
});
});
});

@@ -5,40 +5,19 @@ /* jshint -W024 */

var assert = require('chai').assert;
var expect = require('chai').expect;
var apiconnector = require('../index.js');
var Response = require('../response.js');
var chkHlp = require('./check-helper.js');
var expectResponse = chkHlp.expectResponse;
var expectResponseHash = chkHlp.expectResponseHash;
var expectPropertyFn = chkHlp.expectPropertyFn;
var responseHashFormatCheck = function(r) {
expect(r).to.be.an('object');
expect(r).to.have.property('CODE');
expect(r).to.have.property('DESCRIPTION');
expect(r.CODE).to.be.a('string');
expect(r.DESCRIPTION).to.be.a('string');
};
var responseListRowCheck = function(row) {
expect(row).to.be.an('object');
expect(row).to.be.an.instanceof(Object);
};
var arrayCheck = function(col) {
expect(col).to.be.an('array');
expect(col).to.be.an.instanceof(Array);
};
var stringCheck = function(str) {
expect(str).to.be.a('string');
};
var defaultResponseTemplates = ['404', 'error', 'empty', 'expired'];
describe("response.js", function() {
var response = apiconnector.Response;
describe("check general class structure", function() {
it("check constructor", function() {
expect(apiconnector).to.have.property('Response');
expect(apiconnector.Response).to.be.an('function');
expect(Response).to.be.an('function');
});
it("check non-prototype vars", function() {
expect(apiconnector.Response).to.have.property('pagerRegexp');
expect(apiconnector.Response.pagerRegexp).to.be.an('regexp');
expect(Response).to.have.property('pagerRegexp');
expect(Response.pagerRegexp).to.be.a('regexp');
});

@@ -48,4 +27,3 @@ var methods = ["parse", "serialize", "getTemplates", "getTemplate", "isTemplateMatch"];

it("check existance of non-prototype method '" + m + "'", function() {
expect(apiconnector.Response).to.have.property(m);
expect(apiconnector.Response[m]).to.be.an('function');
expectPropertyFn(Response, m);
});

@@ -62,4 +40,3 @@ });

it("check existance of prototype method '" + m + "'", function() {
expect(apiconnector.Response.prototype).to.have.property(m);
expect(apiconnector.Response.prototype[m]).to.be.an('function');
expectPropertyFn(Response.prototype, m);
});

@@ -73,8 +50,6 @@ });

it("return unparsed template '" + rtpl + "'", function() {
var r = response.getTemplate(rtpl);
stringCheck(r);
expect(Response.getTemplate(rtpl)).to.be.a('string');
});
it("return parsed template '" + rtpl + "'", function() {
var r = response.getTemplate(rtpl, true);
responseHashFormatCheck(r);
expectResponseHash(Response.getTemplate(rtpl, true));
});

@@ -85,4 +60,3 @@ }(tpl));

it("return non existing template '__iWillNeverExist__'", function() {
var r = response.getTemplate('__iWillNeverExist__');
expect(r).to.be.false; //false
expect(Response.getTemplate('__iWillNeverExist__')).to.be.false;
});

@@ -93,4 +67,3 @@ });

it("return all default response templates", function() {
var tpls = response.getTemplates();
expect(tpls).to.be.an('object');
expect(Response.getTemplates()).to.be.an('object');
});

@@ -104,8 +77,10 @@ });

//the below equals to Response.getTemplate(tpl, true);
var r = response.getTemplate(rtpl);
var hash = response.parse(r);
responseHashFormatCheck(hash);
expectResponseHash(Response.parse(Response.getTemplate(rtpl)));
});
}(tpl));
});
it("return parsed response for a response without DESCRIPTION", function() {
expectResponseHash(Response.parse("[RESPONSE]\r\ncode=421\r\nEOF\r\n"), '421', "");
});
});

@@ -118,5 +93,5 @@

//the below equals to Response.getTemplate(tpl, true);
var r = response.getTemplate(rtpl);
var hash = response.parse(r);
responseHashFormatCheck(hash);
var r = Response.getTemplate(rtpl);
var hash = Response.parse(r);
expectResponseHash(hash);
});

@@ -126,8 +101,12 @@ }(tpl));

it("serialize a parsed API response to plain text", function() {
var r = response.getTemplate('error');
var hash = response.parse(r);
var plain = response.serialize(hash);
stringCheck(plain);
var r = Response.getTemplate('error');
var plain = Response.serialize(Response.parse(r));
expect(plain).to.be.a('string');
expect(plain).to.equal(r);
});
it("serialize a parsed API response to plain text [w/o CODE and DESCRIPTION]", function() {
expect(Response.serialize({
QUEUETIME: "0.00"
})).to.equal("[RESPONSE]\r\nqueuetime=0.00\r\nEOF\r\n");
});
});

@@ -137,8 +116,8 @@

it("check if parsed API response matches a default response template", function() {
var hash = response.getTemplate('error', true);
var ismatch = response.isTemplateMatch(hash, 'error');
var hash = Response.getTemplate('error', true);
var ismatch = Response.isTemplateMatch(hash, 'error');
expect(ismatch).to.be.true;
ismatch = response.isTemplateMatch(hash, 'expired');
ismatch = Response.isTemplateMatch(hash, 'expired');
expect(ismatch).to.be.false;
ismatch = response.isTemplateMatch(hash, '__iWillNeverExist__');
ismatch = Response.isTemplateMatch(hash, '__iWillNeverExist__');
expect(ismatch).to.be.false;

@@ -149,15 +128,13 @@ });

describe("Response Instance", function() {
var exampleTPL = require('./test-commands.js');
var testcmds = require('./test-commands.js').querydomainlist;
var r;
it("construct success example response template", function() {
r = new apiconnector.Response(null, exampleTPL.success.COMMAND);
expect(r).to.be.an('object');
expect(r).to.be.an.instanceof(apiconnector.Response);
it("construct success example response template [w/o response]", function() {
r = new Response(null, testcmds.success.COMMAND);
expectResponse(r);
});
it("construct success example response template", function() {
r = new apiconnector.Response(exampleTPL.success.RESPONSE, exampleTPL.success.COMMAND);
expect(r).to.be.an('object');
expect(r).to.be.an.instanceof(apiconnector.Response);
r = new Response(testcmds.success.RESPONSE, testcmds.success.COMMAND);
expectResponse(r);
});

@@ -168,14 +145,14 @@

expect(it).to.be.an('object');
assert.isFunction(it.hasNext);
expectPropertyFn(it, 'hasNext');
expectPropertyFn(it, 'hasPrevious');
expectPropertyFn(it, 'rewind');
expectPropertyFn(it, 'previous');
expectPropertyFn(it, 'next');
expectPropertyFn(it, 'current');
expect(it.hasNext()).to.equal(true);
assert.isFunction(it.hasPrevious);
expect(it.hasPrevious()).to.equal(false);
assert.isFunction(it.rewind);
expect(it.rewind()).to.equal(it.current());
assert.isFunction(it.previous);
expect(it.previous()).to.equal(null);
assert.isFunction(it.next);
expect(it.next()).to.not.equal(null);
expect(it.next()).to.equal(null);
assert.isFunction(it.current);
expect(it.current()).to.be.an('object');

@@ -194,13 +171,7 @@ it.rewind();

it("hasNext", function() {
var flag;
assert.isFunction(r.hasNext);
flag = r.hasNext();
expect(flag).to.be.true; //index 0 (of two items)
expect(r.hasNext()).to.be.true; //index 0 (of two items)
});
it("hasPrevious", function() {
var flag;
assert.isFunction(r.hasPrevious);
flag = r.hasPrevious();
expect(flag).to.be.false; //index 0 (of two items)
expect(r.hasPrevious()).to.be.false; //index 0 (of two items)
});

@@ -210,5 +181,4 @@

var row, flag;
assert.isFunction(r.rewind);
row = r.rewind();
responseListRowCheck(row);
expect(row).to.be.an('object');
flag = r.hasNext();

@@ -222,5 +192,4 @@ expect(flag).to.be.true; //index 0 (of two items)

var row, flag;
assert.isFunction(r.next);
row = r.next();
responseListRowCheck(row);
expect(row).to.be.an('object');
flag = r.hasNext();

@@ -234,5 +203,4 @@ expect(flag).to.be.false; //index 1 (of two items)

var row, flag;
assert.isFunction(r.previous);
row = r.previous();
responseListRowCheck(row);
expect(row).to.be.an('object');
flag = r.hasNext();

@@ -245,12 +213,7 @@ expect(flag).to.be.true; //index 0 (of two items)

it("current", function() {
var row;
assert.isFunction(r.current);
row = r.current();
responseListRowCheck(row); //index 0
expect(r.current()).to.be.an('object'); //index 0
});
it("get", function() {
var pt;
assert.isFunction(r.get);
pt = r.get('PROPERTY');
var pt = r.get('PROPERTY');
expect(pt).to.be.an('object');

@@ -262,6 +225,4 @@ pt = r.get('__iWillNeverExist__');

it("getColumn", function() {
var col;
assert.isFunction(r.getColumn);
col = r.getColumn('CREATEDDATE');
arrayCheck(col);
var col = r.getColumn('CREATEDDATE');
expect(col).to.be.an('array');
col = r.get('__iWillNeverExist__');

@@ -272,6 +233,4 @@ expect(col).to.be.false;

it("getColumnIndex", function() {
var cell;
assert.isFunction(r.getColumnIndex);
cell = r.getColumnIndex('PREPAIDPERIOD', 1);
stringCheck(cell);
var cell = r.getColumnIndex('PREPAIDPERIOD', 1);
expect(cell).to.be.a('string');
expect(cell).to.equal("0");

@@ -284,7 +243,6 @@ cell = r.getColumnIndex('PREPAIDPERIOD', 1, true);

it("applyCustomChanges", function() { //nothings changes here, but can be overriden on demand
assert.isFunction(r.applyCustomChanges);
var test = {
var test, tmp;
test = {
test: true
};
var tmp;
tmp = r.applyCustomChanges(test);

@@ -295,14 +253,13 @@ expect(tmp).to.equal(test);

it("as_string", function() {
assert.isFunction(r.as_string);
var plain1, plain2;
r.useColumns('*'); //reset to default
var plain1, plain2;
plain1 = r.as_string();
stringCheck(plain1);
expect(plain1).to.be.a('string');
r.useColumns(["DOMAIN", "REPOSITORY"]);
plain2 = r.as_string();
stringCheck(plain2);
expect(plain2).to.be.a('string');
expect(plain1).to.not.equal(plain2);
r.useColumns('*'); //reset to default
plain2 = r.as_string();
stringCheck(plain2);
expect(plain2).to.be.a('string');
expect(plain1).to.equal(plain2);

@@ -312,3 +269,2 @@ });

it("as_hash", function() {
assert.isFunction(r.as_hash);
r.useColumns('*'); //reset to default

@@ -328,5 +284,2 @@ var h1, h2;

expect(pg).to.be.an('object');
['FIRST', 'LAST', 'COUNT', 'TOTAL', 'LIMIT', 'PAGES', 'PAGE', 'PAGENEXT', 'PAGEPREV'].forEach(function(key) {
expect(pg).to.have.property(key);
});
expect(pg.FIRST).to.equal(0);

@@ -336,3 +289,3 @@ expect(pg.LAST).to.equal(1);

expect(pg.TOTAL).to.equal(2);
expect(pg.LIMIT).to.equal(exampleTPL.success.COMMAND.LIMIT);
expect(pg.LIMIT).to.equal(testcmds.success.COMMAND.LIMIT);
expect(pg.PAGES).to.equal(1);

@@ -345,5 +298,4 @@ expect(pg.PAGE).to.equal(1);

it("as_list", function() {
assert.isFunction(r.as_list);
var l1, l2;
r.useColumns('*'); //reset to default
var l1, l2;
l1 = r.as_list();

@@ -358,6 +310,6 @@ r.useColumns(["DOMAIN", "REPOSITORY"]);

expect(l1).to.have.property('LIST');
arrayCheck(l1.LIST);
expect(l1.LIST).to.be.an('array');
expect(l1).to.have.property('meta');
expect(l1.meta).to.have.property('columns');
arrayCheck(l1.meta.columns);
expect(l1.meta.columns).to.be.an('array');
expect(l1.meta).to.have.property('pg');

@@ -367,24 +319,29 @@ expect(l1.meta.pg).to.be.an('object');

it("as_list [with different hash property count]", function() {
//PROPERTY[TRANSFERLOCK][1] removed
//especially in domain list we might have properties with different hash property count
var r2 = new Response(testcmds.indexlength.RESPONSE, testcmds.indexlength.COMMAND);
var l = r2.as_list();
expect(l).to.have.property('LIST');
expect(l.LIST).to.be.an('array');
expect(l).to.have.property('meta');
expect(l.meta).to.have.property('columns');
expect(l.meta.columns).to.be.an('array');
expect(l.meta).to.have.property('pg');
expect(l.meta.pg).to.be.an('object');
});
it("code", function() {
assert.isFunction(r.code);
var c = r.code();
stringCheck(c);
expect(c).to.equal('200');
expect(r.code()).to.equal('200');
});
it("description", function() {
assert.isFunction(r.description);
var d = r.description();
stringCheck(d);
expect(d).to.equal('Command completed successfully');
expect(r.description()).to.equal('Command completed successfully');
});
it("properties", function() {
assert.isFunction(r.properties);
var p = r.properties();
expect(p).to.be.a('object'); //in success case!
expect(r.properties()).to.be.a('object'); //in success case!
});
it("runtime", function() {
assert.isFunction(r.runtime);
var p = r.runtime();

@@ -396,3 +353,2 @@ expect(p).to.be.a('number');

it("queuetime", function() {
assert.isFunction(r.queuetime);
var p = r.queuetime();

@@ -404,102 +360,75 @@ expect(p).to.be.a('number');

it("is_success", function() {
assert.isFunction(r.is_success);
var p, r2;
p = r.is_success();
expect(p).to.equal(true);
r2 = new apiconnector.Response(exampleTPL.error.RESPONSE, exampleTPL.error.COMMAND);
p = r2.is_success();
expect(p).to.equal(false);
r2 = new apiconnector.Response(exampleTPL.tmperror.RESPONSE, exampleTPL.tmperror.COMMAND);
p = r2.is_success();
expect(p).to.equal(false);
var r2;
expect(r.is_success()).to.equal(true);
r2 = new Response(testcmds.error.RESPONSE, testcmds.error.COMMAND);
expect(r2.is_success()).to.equal(false);
r2 = new Response(testcmds.tmperror.RESPONSE, testcmds.tmperror.COMMAND);
expect(r2.is_success()).to.equal(false);
});
it("is_tmp_error", function() {
assert.isFunction(r.is_tmp_error);
var p, r2;
p = r.is_tmp_error();
expect(p).to.equal(false);
r2 = new apiconnector.Response(exampleTPL.error.RESPONSE, exampleTPL.error.COMMAND);
p = r2.is_tmp_error();
expect(p).to.equal(false);
r2 = new apiconnector.Response(exampleTPL.tmperror.RESPONSE, exampleTPL.tmperror.COMMAND);
p = r2.is_tmp_error();
expect(p).to.equal(true);
var r2;
expect(r.is_tmp_error()).to.equal(false);
r2 = new Response(testcmds.error.RESPONSE, testcmds.error.COMMAND);
expect(r2.is_tmp_error()).to.equal(false);
r2 = new Response(testcmds.tmperror.RESPONSE, testcmds.tmperror.COMMAND);
expect(r2.is_tmp_error()).to.equal(true);
});
it("is_error", function() {
assert.isFunction(r.is_error);
var p, r2;
p = r.is_error();
expect(p).to.be.false;
r2 = new apiconnector.Response(exampleTPL.error.RESPONSE, exampleTPL.error.COMMAND);
p = r2.is_error();
expect(p).to.be.true;
r2 = new apiconnector.Response(exampleTPL.tmperror.RESPONSE, exampleTPL.tmperror.COMMAND);
p = r2.is_error();
expect(p).to.be.false;
var r2;
expect(r.is_error()).to.be.false;
r2 = new Response(testcmds.error.RESPONSE, testcmds.error.COMMAND);
expect(r2.is_error()).to.be.true;
r2 = new Response(testcmds.tmperror.RESPONSE, testcmds.tmperror.COMMAND);
expect(r2.is_error()).to.be.false;
});
it("columns", function() {
assert.isFunction(r.columns);
var cols = r.columns();
arrayCheck(cols);
expect(r.columns()).to.be.an('array');
});
it("first", function() {
assert.isFunction(r.first);
var d = r.first();
expect(d).to.equal(0);
expect(r.first()).to.equal(0);
});
it("count", function() {
assert.isFunction(r.count);
var d = r.count();
expect(d).to.equal(2);
expect(r.count()).to.equal(2);
});
it("last", function() {
assert.isFunction(r.last);
var d = r.last();
expect(d).to.equal(1);
expect(r.last()).to.equal(1);
});
it("limit", function() {
assert.isFunction(r.limit);
var d = r.limit();
expect(d).to.equal(exampleTPL.success.COMMAND.LIMIT); //if not api would have it ignored
expect(r.limit()).to.equal(testcmds.success.COMMAND.LIMIT); //if not api would have it ignored
});
it("total", function() {
assert.isFunction(r.total);
var d = r.total();
expect(d).to.equal(2);
expect(r.total()).to.equal(2);
});
it("pages", function() {
assert.isFunction(r.pages);
var d = r.pages();
expect(d).to.equal(1);
expect(r.pages()).to.equal(1);
});
it("page", function() {
assert.isFunction(r.page);
var d = r.page();
expect(d).to.equal(1);
expect(r.page()).to.equal(1);
});
it("prevpage", function() {
assert.isFunction(r.prevpage);
var d = r.prevpage();
expect(d).to.equal(1);
expect(r.prevpage()).to.equal(1);
});
it("nextpage", function() {
assert.isFunction(r.nextpage);
var d = r.nextpage();
expect(d).to.equal(1);
expect(r.nextpage()).to.equal(1);
});
it("nextpage [response with multiple pages]", function() {
r = new Response(testcmds.multipage.RESPONSE, testcmds.multipage.COMMAND);
expect(r.nextpage()).to.equal(2);
});
});
});
module.exports = {
success: {
COMMAND: {
COMMAND: "QueryDomainList",
VERSION: 2,
NOTOTAL: 1,
WIDE: 1,
FIRST: 0,
LIMIT: 2
querydomainlist: {
indexlength: {
COMMAND: {
COMMAND: "QueryDomainList",
VERSION: 2,
NOTOTAL: 1,
WIDE: 1,
FIRST: 0,
LIMIT: 2
},
RESPONSE: "[RESPONSE]\r\nPROPERTY[CREATEDDATE][0]=2016-06-07 18:02:02\r\nPROPERTY[CREATEDDATE][1]=2008-03-18 09:37:25\r\nPROPERTY[FINALIZATIONDATE][0]=2017-06-08 18:02:02\r\nPROPERTY[FINALIZATIONDATE][1]=2017-03-19 09:37:25\r\nPROPERTY[NEXTACTION][0]=pay\r\nPROPERTY[NEXTACTION][1]=pay\r\nPROPERTY[ADDON-PROXY][0]=\r\nPROPERTY[ADDON-PROXY][1]=\r\nPROPERTY[TRANSFERDATE][0]=\r\nPROPERTY[TRANSFERDATE][1]=\r\nPROPERTY[NAMESERVER][0]=ns3.ispapi.net ns2.ispapi.net ns1.ispapi.net\r\nPROPERTY[NAMESERVER][1]=ns3010.1api.net ns2010.1api.net ns1010.1api.net\r\nPROPERTY[TECHCONTACT][0]=P-JUW40\r\nPROPERTY[TECHCONTACT][1]=P-JUW40\r\nPROPERTY[STATUS][0]=ACTIVE\r\nPROPERTY[STATUS][1]=ACTIVE clientTransferProhibited clientDeleteProhibited\r\nPROPERTY[OWNERCONTACT][0]=P-JUW40\r\nPROPERTY[OWNERCONTACT][1]=P-JUW40\r\nPROPERTY[TRANSFER-CREATEDDATE][0]=\r\nPROPERTY[TRANSFER-CREATEDDATE][1]=\r\nPROPERTY[FAILUREDATE][0]=2017-07-21 18:02:02\r\nPROPERTY[FAILUREDATE][1]=2017-05-01 09:37:25\r\nPROPERTY[RENEWALMODE][0]=AUTORENEW\r\nPROPERTY[RENEWALMODE][1]=AUTORENEW\r\nPROPERTY[MISSINGPARAMETER][0]=\r\nPROPERTY[MISSINGPARAMETER][1]=\r\nPROPERTY[LAST][0]=1\r\nPROPERTY[USER][0]=hom.hexonet.de\r\nPROPERTY[USER][1]=hom.hexonet.de\r\nPROPERTY[LIMIT][0]=2\r\nPROPERTY[NEXTACTIONDATE][0]=2017-06-02 18:02:02\r\nPROPERTY[NEXTACTIONDATE][1]=2017-03-13 09:37:25\r\nPROPERTY[PARENTUSER][0]=hexonet\r\nPROPERTY[PARENTUSER][1]=hexonet\r\nPROPERTY[EXPIRATIONDATE][0]=2017-06-07 18:02:02\r\nPROPERTY[EXPIRATIONDATE][1]=2017-03-18 09:37:25\r\nPROPERTY[SUBCLASS][0]=TOP\r\nPROPERTY[SUBCLASS][1]=ASIA\r\nPROPERTY[CLAIMKEY][0]=\r\nPROPERTY[CLAIMKEY][1]=\r\nPROPERTY[TRANSFER-OLDREGISTRAR][0]=\r\nPROPERTY[TRANSFER-OLDREGISTRAR][1]=\r\nPROPERTY[PREPAIDPERIOD][0]=0\r\nPROPERTY[PREPAIDPERIOD][1]=0\r\nPROPERTY[UPDATEDDATE][0]=2016-06-10 15:34:16\r\nPROPERTY[UPDATEDDATE][1]=2014-07-01 14:54:03\r\nPROPERTY[ROID][0]=\r\nPROPERTY[ROID][1]=\r\nPROPERTY[ADDON-TRUSTEE][0]=\r\nPROPERTY[ADDON-TRUSTEE][1]=\r\nPROPERTY[DESCRIPTION][0]=11112222.top\r\nPROPERTY[DESCRIPTION][1]=1api.asia\r\nPROPERTY[AUTH][0]=6FerWN!583\r\nPROPERTY[AUTH][1]=Clm6OKgYIB\r\nPROPERTY[PEERUSER][0]=\r\nPROPERTY[PEERUSER][1]=\r\nPROPERTY[BILLINGCONTACT][0]=P-JUW40\r\nPROPERTY[BILLINGCONTACT][1]=P-JUW40\r\nPROPERTY[PAIDUNTILDATE][0]=2017-06-07 18:02:02\r\nPROPERTY[PAIDUNTILDATE][1]=2017-03-18 09:37:25\r\nPROPERTY[RENEWALPERIOD][0]=1Y\r\nPROPERTY[RENEWALPERIOD][1]=1Y\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[TRANSFER-DIRECTION][0]=\r\nPROPERTY[TRANSFER-DIRECTION][1]=\r\nPROPERTY[INVALIDPARAMETER][0]=\r\nPROPERTY[INVALIDPARAMETER][1]=\r\nPROPERTY[ADMINCONTACT][0]=P-JUW40\r\nPROPERTY[ADMINCONTACT][1]=P-JUW40\r\nPROPERTY[INTERNALNAMESERVER][0]=ns3.ispapi.net ns1.ispapi.net ns2.ispapi.net\r\nPROPERTY[INTERNALNAMESERVER][1]=ns2010.1api.net ns3010.1api.net ns1010.1api.net\r\nPROPERTY[ACCOUNTINGDATE][0]=2017-06-02 18:02:02\r\nPROPERTY[ACCOUNTINGDATE][1]=2017-03-13 09:37:25\r\nPROPERTY[TRANSFER-NEWREGISTRAR][0]=\r\nPROPERTY[TRANSFER-NEWREGISTRAR][1]=\r\nPROPERTY[TRANSFER-STATUS][0]=\r\nPROPERTY[TRANSFER-STATUS][1]=\r\nPROPERTY[REPOSITORY][0]=ZODIAC-LIVE-1API\r\nPROPERTY[REPOSITORY][1]=ASIA-LIVE-1API\r\nPROPERTY[FIRST][0]=0\r\nPROPERTY[OBJECTID][0]=11112222.top\r\nPROPERTY[OBJECTID][1]=1api.asia\r\nPROPERTY[TRANSFERLOCK][0]=0\r\nPROPERTY[OBJECTCLASS][0]=DOMAIN\r\nPROPERTY[OBJECTCLASS][1]=DOMAIN\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.12\r\nEOF\r\n"
},
RESPONSE: "[RESPONSE]\r\nPROPERTY[CREATEDDATE][0]=2016-06-07 18:02:02\r\nPROPERTY[CREATEDDATE][1]=2008-03-18 09:37:25\r\nPROPERTY[FINALIZATIONDATE][0]=2017-06-08 18:02:02\r\nPROPERTY[FINALIZATIONDATE][1]=2017-03-19 09:37:25\r\nPROPERTY[NEXTACTION][0]=pay\r\nPROPERTY[NEXTACTION][1]=pay\r\nPROPERTY[ADDON-PROXY][0]=\r\nPROPERTY[ADDON-PROXY][1]=\r\nPROPERTY[TRANSFERDATE][0]=\r\nPROPERTY[TRANSFERDATE][1]=\r\nPROPERTY[NAMESERVER][0]=ns3.ispapi.net ns2.ispapi.net ns1.ispapi.net\r\nPROPERTY[NAMESERVER][1]=ns3010.1api.net ns2010.1api.net ns1010.1api.net\r\nPROPERTY[TECHCONTACT][0]=P-JUW40\r\nPROPERTY[TECHCONTACT][1]=P-JUW40\r\nPROPERTY[STATUS][0]=ACTIVE\r\nPROPERTY[STATUS][1]=ACTIVE clientTransferProhibited clientDeleteProhibited\r\nPROPERTY[OWNERCONTACT][0]=P-JUW40\r\nPROPERTY[OWNERCONTACT][1]=P-JUW40\r\nPROPERTY[TRANSFER-CREATEDDATE][0]=\r\nPROPERTY[TRANSFER-CREATEDDATE][1]=\r\nPROPERTY[FAILUREDATE][0]=2017-07-21 18:02:02\r\nPROPERTY[FAILUREDATE][1]=2017-05-01 09:37:25\r\nPROPERTY[RENEWALMODE][0]=AUTORENEW\r\nPROPERTY[RENEWALMODE][1]=AUTORENEW\r\nPROPERTY[MISSINGPARAMETER][0]=\r\nPROPERTY[MISSINGPARAMETER][1]=\r\nPROPERTY[LAST][0]=1\r\nPROPERTY[USER][0]=hom.hexonet.de\r\nPROPERTY[USER][1]=hom.hexonet.de\r\nPROPERTY[LIMIT][0]=2\r\nPROPERTY[NEXTACTIONDATE][0]=2017-06-02 18:02:02\r\nPROPERTY[NEXTACTIONDATE][1]=2017-03-13 09:37:25\r\nPROPERTY[PARENTUSER][0]=hexonet\r\nPROPERTY[PARENTUSER][1]=hexonet\r\nPROPERTY[EXPIRATIONDATE][0]=2017-06-07 18:02:02\r\nPROPERTY[EXPIRATIONDATE][1]=2017-03-18 09:37:25\r\nPROPERTY[SUBCLASS][0]=TOP\r\nPROPERTY[SUBCLASS][1]=ASIA\r\nPROPERTY[CLAIMKEY][0]=\r\nPROPERTY[CLAIMKEY][1]=\r\nPROPERTY[TRANSFER-OLDREGISTRAR][0]=\r\nPROPERTY[TRANSFER-OLDREGISTRAR][1]=\r\nPROPERTY[PREPAIDPERIOD][0]=0\r\nPROPERTY[PREPAIDPERIOD][1]=0\r\nPROPERTY[UPDATEDDATE][0]=2016-06-10 15:34:16\r\nPROPERTY[UPDATEDDATE][1]=2014-07-01 14:54:03\r\nPROPERTY[ROID][0]=\r\nPROPERTY[ROID][1]=\r\nPROPERTY[ADDON-TRUSTEE][0]=\r\nPROPERTY[ADDON-TRUSTEE][1]=\r\nPROPERTY[DESCRIPTION][0]=11112222.top\r\nPROPERTY[DESCRIPTION][1]=1api.asia\r\nPROPERTY[AUTH][0]=6FerWN!583\r\nPROPERTY[AUTH][1]=Clm6OKgYIB\r\nPROPERTY[PEERUSER][0]=\r\nPROPERTY[PEERUSER][1]=\r\nPROPERTY[BILLINGCONTACT][0]=P-JUW40\r\nPROPERTY[BILLINGCONTACT][1]=P-JUW40\r\nPROPERTY[PAIDUNTILDATE][0]=2017-06-07 18:02:02\r\nPROPERTY[PAIDUNTILDATE][1]=2017-03-18 09:37:25\r\nPROPERTY[RENEWALPERIOD][0]=1Y\r\nPROPERTY[RENEWALPERIOD][1]=1Y\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[TRANSFER-DIRECTION][0]=\r\nPROPERTY[TRANSFER-DIRECTION][1]=\r\nPROPERTY[INVALIDPARAMETER][0]=\r\nPROPERTY[INVALIDPARAMETER][1]=\r\nPROPERTY[ADMINCONTACT][0]=P-JUW40\r\nPROPERTY[ADMINCONTACT][1]=P-JUW40\r\nPROPERTY[INTERNALNAMESERVER][0]=ns3.ispapi.net ns1.ispapi.net ns2.ispapi.net\r\nPROPERTY[INTERNALNAMESERVER][1]=ns2010.1api.net ns3010.1api.net ns1010.1api.net\r\nPROPERTY[ACCOUNTINGDATE][0]=2017-06-02 18:02:02\r\nPROPERTY[ACCOUNTINGDATE][1]=2017-03-13 09:37:25\r\nPROPERTY[TRANSFER-NEWREGISTRAR][0]=\r\nPROPERTY[TRANSFER-NEWREGISTRAR][1]=\r\nPROPERTY[TRANSFER-STATUS][0]=\r\nPROPERTY[TRANSFER-STATUS][1]=\r\nPROPERTY[REPOSITORY][0]=ZODIAC-LIVE-1API\r\nPROPERTY[REPOSITORY][1]=ASIA-LIVE-1API\r\nPROPERTY[FIRST][0]=0\r\nPROPERTY[OBJECTID][0]=11112222.top\r\nPROPERTY[OBJECTID][1]=1api.asia\r\nPROPERTY[TRANSFERLOCK][0]=0\r\nPROPERTY[TRANSFERLOCK][1]=1\r\nPROPERTY[OBJECTCLASS][0]=DOMAIN\r\nPROPERTY[OBJECTCLASS][1]=DOMAIN\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.12\r\nEOF\r\n"
},
error: {
COMMAND: {
COMMAND: "QueryDomainList",
VERSION: 2,
NOTOTAL: 1,
WIDE: 1,
FIRST: 0,
LIMIT: 2,
PARAMNOTEXISTS: 1
multipage: {
COMMAND: {
COMMAND: "QueryDomainList",
VERSION: 2,
NOTOTAL: 1,
WIDE: 1,
FIRST: 0,
LIMIT: 1
},
RESPONSE: "[RESPONSE]\r\nPROPERTY[TOTAL][0]=100\r\nPROPERTY[FIRST][0]=0\r\nPROPERTY[LAST][0]=99\r\nPROPERTY[COUNT][0]=1\r\nPROPERTY[CREATEDDATE][0]=2016-06-07 18:02:02\r\nPROPERTY[CREATEDDATE][1]=2008-03-18 09:37:25\r\nPROPERTY[FINALIZATIONDATE][0]=2017-06-08 18:02:02\r\nPROPERTY[FINALIZATIONDATE][1]=2017-03-19 09:37:25\r\nPROPERTY[NEXTACTION][0]=pay\r\nPROPERTY[NEXTACTION][1]=pay\r\nPROPERTY[ADDON-PROXY][0]=\r\nPROPERTY[ADDON-PROXY][1]=\r\nPROPERTY[TRANSFERDATE][0]=\r\nPROPERTY[TRANSFERDATE][1]=\r\nPROPERTY[NAMESERVER][0]=ns3.ispapi.net ns2.ispapi.net ns1.ispapi.net\r\nPROPERTY[NAMESERVER][1]=ns3010.1api.net ns2010.1api.net ns1010.1api.net\r\nPROPERTY[TECHCONTACT][0]=P-JUW40\r\nPROPERTY[TECHCONTACT][1]=P-JUW40\r\nPROPERTY[STATUS][0]=ACTIVE\r\nPROPERTY[STATUS][1]=ACTIVE clientTransferProhibited clientDeleteProhibited\r\nPROPERTY[OWNERCONTACT][0]=P-JUW40\r\nPROPERTY[OWNERCONTACT][1]=P-JUW40\r\nPROPERTY[TRANSFER-CREATEDDATE][0]=\r\nPROPERTY[TRANSFER-CREATEDDATE][1]=\r\nPROPERTY[FAILUREDATE][0]=2017-07-21 18:02:02\r\nPROPERTY[FAILUREDATE][1]=2017-05-01 09:37:25\r\nPROPERTY[RENEWALMODE][0]=AUTORENEW\r\nPROPERTY[RENEWALMODE][1]=AUTORENEW\r\nPROPERTY[MISSINGPARAMETER][0]=\r\nPROPERTY[MISSINGPARAMETER][1]=\r\nPROPERTY[LAST][0]=1\r\nPROPERTY[USER][0]=hom.hexonet.de\r\nPROPERTY[USER][1]=hom.hexonet.de\r\nPROPERTY[LIMIT][0]=2\r\nPROPERTY[NEXTACTIONDATE][0]=2017-06-02 18:02:02\r\nPROPERTY[NEXTACTIONDATE][1]=2017-03-13 09:37:25\r\nPROPERTY[PARENTUSER][0]=hexonet\r\nPROPERTY[PARENTUSER][1]=hexonet\r\nPROPERTY[EXPIRATIONDATE][0]=2017-06-07 18:02:02\r\nPROPERTY[EXPIRATIONDATE][1]=2017-03-18 09:37:25\r\nPROPERTY[SUBCLASS][0]=TOP\r\nPROPERTY[SUBCLASS][1]=ASIA\r\nPROPERTY[CLAIMKEY][0]=\r\nPROPERTY[CLAIMKEY][1]=\r\nPROPERTY[TRANSFER-OLDREGISTRAR][0]=\r\nPROPERTY[TRANSFER-OLDREGISTRAR][1]=\r\nPROPERTY[PREPAIDPERIOD][0]=0\r\nPROPERTY[PREPAIDPERIOD][1]=0\r\nPROPERTY[UPDATEDDATE][0]=2016-06-10 15:34:16\r\nPROPERTY[UPDATEDDATE][1]=2014-07-01 14:54:03\r\nPROPERTY[ROID][0]=\r\nPROPERTY[ROID][1]=\r\nPROPERTY[ADDON-TRUSTEE][0]=\r\nPROPERTY[ADDON-TRUSTEE][1]=\r\nPROPERTY[DESCRIPTION][0]=11112222.top\r\nPROPERTY[DESCRIPTION][1]=1api.asia\r\nPROPERTY[AUTH][0]=6FerWN!583\r\nPROPERTY[AUTH][1]=Clm6OKgYIB\r\nPROPERTY[PEERUSER][0]=\r\nPROPERTY[PEERUSER][1]=\r\nPROPERTY[BILLINGCONTACT][0]=P-JUW40\r\nPROPERTY[BILLINGCONTACT][1]=P-JUW40\r\nPROPERTY[PAIDUNTILDATE][0]=2017-06-07 18:02:02\r\nPROPERTY[PAIDUNTILDATE][1]=2017-03-18 09:37:25\r\nPROPERTY[RENEWALPERIOD][0]=1Y\r\nPROPERTY[RENEWALPERIOD][1]=1Y\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[TRANSFER-DIRECTION][0]=\r\nPROPERTY[TRANSFER-DIRECTION][1]=\r\nPROPERTY[INVALIDPARAMETER][0]=\r\nPROPERTY[INVALIDPARAMETER][1]=\r\nPROPERTY[ADMINCONTACT][0]=P-JUW40\r\nPROPERTY[ADMINCONTACT][1]=P-JUW40\r\nPROPERTY[INTERNALNAMESERVER][0]=ns3.ispapi.net ns1.ispapi.net ns2.ispapi.net\r\nPROPERTY[INTERNALNAMESERVER][1]=ns2010.1api.net ns3010.1api.net ns1010.1api.net\r\nPROPERTY[ACCOUNTINGDATE][0]=2017-06-02 18:02:02\r\nPROPERTY[ACCOUNTINGDATE][1]=2017-03-13 09:37:25\r\nPROPERTY[TRANSFER-NEWREGISTRAR][0]=\r\nPROPERTY[TRANSFER-NEWREGISTRAR][1]=\r\nPROPERTY[TRANSFER-STATUS][0]=\r\nPROPERTY[TRANSFER-STATUS][1]=\r\nPROPERTY[REPOSITORY][0]=ZODIAC-LIVE-1API\r\nPROPERTY[REPOSITORY][1]=ASIA-LIVE-1API\r\nPROPERTY[FIRST][0]=0\r\nPROPERTY[OBJECTID][0]=11112222.top\r\nPROPERTY[OBJECTID][1]=1api.asia\r\nPROPERTY[TRANSFERLOCK][0]=0\r\nPROPERTY[TRANSFERLOCK][1]=1\r\nPROPERTY[OBJECTCLASS][0]=DOMAIN\r\nPROPERTY[OBJECTCLASS][1]=DOMAIN\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.12\r\nEOF\r\n"
},
RESPONSE: "[RESPONSE]\r\ncode=503\r\ndescription=Invalid Parameter: PARAMNOTEXISTS\r\nEOF\r\n"
success: {
COMMAND: {
COMMAND: "QueryDomainList",
VERSION: 2,
NOTOTAL: 1,
WIDE: 1,
FIRST: 0,
LIMIT: 2
},
RESPONSE: "[RESPONSE]\r\nPROPERTY[CREATEDDATE][0]=2016-06-07 18:02:02\r\nPROPERTY[CREATEDDATE][1]=2008-03-18 09:37:25\r\nPROPERTY[FINALIZATIONDATE][0]=2017-06-08 18:02:02\r\nPROPERTY[FINALIZATIONDATE][1]=2017-03-19 09:37:25\r\nPROPERTY[NEXTACTION][0]=pay\r\nPROPERTY[NEXTACTION][1]=pay\r\nPROPERTY[ADDON-PROXY][0]=\r\nPROPERTY[ADDON-PROXY][1]=\r\nPROPERTY[TRANSFERDATE][0]=\r\nPROPERTY[TRANSFERDATE][1]=\r\nPROPERTY[NAMESERVER][0]=ns3.ispapi.net ns2.ispapi.net ns1.ispapi.net\r\nPROPERTY[NAMESERVER][1]=ns3010.1api.net ns2010.1api.net ns1010.1api.net\r\nPROPERTY[TECHCONTACT][0]=P-JUW40\r\nPROPERTY[TECHCONTACT][1]=P-JUW40\r\nPROPERTY[STATUS][0]=ACTIVE\r\nPROPERTY[STATUS][1]=ACTIVE clientTransferProhibited clientDeleteProhibited\r\nPROPERTY[OWNERCONTACT][0]=P-JUW40\r\nPROPERTY[OWNERCONTACT][1]=P-JUW40\r\nPROPERTY[TRANSFER-CREATEDDATE][0]=\r\nPROPERTY[TRANSFER-CREATEDDATE][1]=\r\nPROPERTY[FAILUREDATE][0]=2017-07-21 18:02:02\r\nPROPERTY[FAILUREDATE][1]=2017-05-01 09:37:25\r\nPROPERTY[RENEWALMODE][0]=AUTORENEW\r\nPROPERTY[RENEWALMODE][1]=AUTORENEW\r\nPROPERTY[MISSINGPARAMETER][0]=\r\nPROPERTY[MISSINGPARAMETER][1]=\r\nPROPERTY[LAST][0]=1\r\nPROPERTY[USER][0]=hom.hexonet.de\r\nPROPERTY[USER][1]=hom.hexonet.de\r\nPROPERTY[LIMIT][0]=2\r\nPROPERTY[NEXTACTIONDATE][0]=2017-06-02 18:02:02\r\nPROPERTY[NEXTACTIONDATE][1]=2017-03-13 09:37:25\r\nPROPERTY[PARENTUSER][0]=hexonet\r\nPROPERTY[PARENTUSER][1]=hexonet\r\nPROPERTY[EXPIRATIONDATE][0]=2017-06-07 18:02:02\r\nPROPERTY[EXPIRATIONDATE][1]=2017-03-18 09:37:25\r\nPROPERTY[SUBCLASS][0]=TOP\r\nPROPERTY[SUBCLASS][1]=ASIA\r\nPROPERTY[CLAIMKEY][0]=\r\nPROPERTY[CLAIMKEY][1]=\r\nPROPERTY[TRANSFER-OLDREGISTRAR][0]=\r\nPROPERTY[TRANSFER-OLDREGISTRAR][1]=\r\nPROPERTY[PREPAIDPERIOD][0]=0\r\nPROPERTY[PREPAIDPERIOD][1]=0\r\nPROPERTY[UPDATEDDATE][0]=2016-06-10 15:34:16\r\nPROPERTY[UPDATEDDATE][1]=2014-07-01 14:54:03\r\nPROPERTY[ROID][0]=\r\nPROPERTY[ROID][1]=\r\nPROPERTY[ADDON-TRUSTEE][0]=\r\nPROPERTY[ADDON-TRUSTEE][1]=\r\nPROPERTY[DESCRIPTION][0]=11112222.top\r\nPROPERTY[DESCRIPTION][1]=1api.asia\r\nPROPERTY[AUTH][0]=6FerWN!583\r\nPROPERTY[AUTH][1]=Clm6OKgYIB\r\nPROPERTY[PEERUSER][0]=\r\nPROPERTY[PEERUSER][1]=\r\nPROPERTY[BILLINGCONTACT][0]=P-JUW40\r\nPROPERTY[BILLINGCONTACT][1]=P-JUW40\r\nPROPERTY[PAIDUNTILDATE][0]=2017-06-07 18:02:02\r\nPROPERTY[PAIDUNTILDATE][1]=2017-03-18 09:37:25\r\nPROPERTY[RENEWALPERIOD][0]=1Y\r\nPROPERTY[RENEWALPERIOD][1]=1Y\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[TRANSFER-DIRECTION][0]=\r\nPROPERTY[TRANSFER-DIRECTION][1]=\r\nPROPERTY[INVALIDPARAMETER][0]=\r\nPROPERTY[INVALIDPARAMETER][1]=\r\nPROPERTY[ADMINCONTACT][0]=P-JUW40\r\nPROPERTY[ADMINCONTACT][1]=P-JUW40\r\nPROPERTY[INTERNALNAMESERVER][0]=ns3.ispapi.net ns1.ispapi.net ns2.ispapi.net\r\nPROPERTY[INTERNALNAMESERVER][1]=ns2010.1api.net ns3010.1api.net ns1010.1api.net\r\nPROPERTY[ACCOUNTINGDATE][0]=2017-06-02 18:02:02\r\nPROPERTY[ACCOUNTINGDATE][1]=2017-03-13 09:37:25\r\nPROPERTY[TRANSFER-NEWREGISTRAR][0]=\r\nPROPERTY[TRANSFER-NEWREGISTRAR][1]=\r\nPROPERTY[TRANSFER-STATUS][0]=\r\nPROPERTY[TRANSFER-STATUS][1]=\r\nPROPERTY[REPOSITORY][0]=ZODIAC-LIVE-1API\r\nPROPERTY[REPOSITORY][1]=ASIA-LIVE-1API\r\nPROPERTY[FIRST][0]=0\r\nPROPERTY[OBJECTID][0]=11112222.top\r\nPROPERTY[OBJECTID][1]=1api.asia\r\nPROPERTY[TRANSFERLOCK][0]=0\r\nPROPERTY[TRANSFERLOCK][1]=1\r\nPROPERTY[OBJECTCLASS][0]=DOMAIN\r\nPROPERTY[OBJECTCLASS][1]=DOMAIN\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.12\r\nEOF\r\n"
},
error: {
COMMAND: {
COMMAND: "QueryDomainList",
VERSION: 2,
NOTOTAL: 1,
WIDE: 1,
FIRST: 0,
LIMIT: 2,
PARAMNOTEXISTS: 1
},
RESPONSE: "[RESPONSE]\r\ncode=503\r\ndescription=Invalid Parameter: PARAMNOTEXISTS\r\nEOF\r\n"
},
tmperror: {
COMMAND: {
COMMAND: "QueryDomainList",
VERSION: 2,
NOTOTAL: 1,
WIDE: 1,
FIRST: 0,
LIMIT: 2
},
RESPONSE: "[RESPONSE]\r\ncode=421\r\ndescription=Command failed due to server error. Client should try again\r\nEOF\r\n"
}
},
tmperror: {
getuserindex: {
COMMAND: {
COMMAND: "QueryDomainList",
VERSION: 2,
NOTOTAL: 1,
WIDE: 1,
FIRST: 0,
LIMIT: 2
COMMAND: "GetUserIndex"
},
RESPONSE: "[RESPONSE]\r\ncode=421\r\ndescription=Command failed due to server error. Client should try again\r\nEOF\r\n"
RESPONSE: {
success: '[RESPONSE]\r\nPROPERTY[PARENTUSERINDEX][0]=199\r\nPROPERTY[USERINDEX][0]=659\r\ncode=200\r\ndescription=Command completed successfully\r\nqueuetime=0\r\nruntime=0.005\r\nEOF\r\n',
error: '[RESPONSE]\r\ncode=530\r\ndescription=SESSION NOT FOUND\r\nqueuetime=0\r\nruntime=0.001\r\nEOF\r\n'
}
}
};

@@ -14,10 +14,27 @@ /* jshint -W024 */

it("check format of the example templates in use", function() {
['success', 'tmperror', 'error'].forEach(function(tpl){
['querydomainlist', 'getuserindex'].forEach(function(tpl){
expect(tpls).to.have.property(tpl);
var cfg = tpls[tpl];
expect(cfg).to.be.an("object");
expect(cfg).to.have.property("COMMAND");
expect(cfg).to.have.property("RESPONSE");
expect(cfg.COMMAND).to.be.an("object");
expect(cfg.RESPONSE).to.be.an("string");
switch(tpl){
case 'querydomainlist':
['error', 'success', 'tmperror', 'indexlength', 'multipage'].forEach(function(key){
expect(cfg).to.have.property(key);
expect(cfg[key]).to.have.property("COMMAND");
expect(cfg[key]).to.have.property("RESPONSE");
expect(cfg[key].COMMAND).to.be.an("object");
expect(cfg[key].RESPONSE).to.be.an("string");
});
break;
case 'getuserindex':
expect(cfg).to.have.property('COMMAND');
expect(cfg).to.have.property('RESPONSE');
expect(cfg.COMMAND).to.be.an("object");
expect(cfg.RESPONSE).to.be.an("object");
['error', 'success'].forEach(function(key){
expect(cfg.RESPONSE).to.have.property(key);
expect(cfg.RESPONSE[key]).to.be.an("string");
});
break;
}
});

@@ -24,0 +41,0 @@ });

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc