UNPKG

23.8 kBPlain TextView Raw
1"use strict";
2
3/* tslint:disable:no-unused-expression */
4// https://github.com/palantir/tslint/issues/2614
5
6import chai = require("chai");
7import chaiPromised = require("chai-as-promised");
8import "mocha";
9import nock = require("nock");
10import { APIClient, ISPAPI_CONNECTION_URL, ISPAPI_CONNECTION_URL_PROXY } from "../src/apiclient";
11import { Response } from "../src/response";
12import { ResponseTemplateManager } from "../src/responsetemplatemanager";
13chai.use(chaiPromised);
14
15const expect = chai.expect;
16const rtm = ResponseTemplateManager.getInstance();
17const cmd = { COMMAND: "StatusAccount" };
18let cl: APIClient;
19
20after(() => {
21 nock.cleanAll();
22});
23
24before(() => {
25 cl = new APIClient();
26 rtm.addTemplate("login200", "[RESPONSE]\r\nPROPERTY[SESSION][0]=h8JLZZHdF2WgWWXlwbKWzEG3XrzoW4yshhvtqyg0LCYiX55QnhgYX9cB0W4mlpbx\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.169\r\nEOF\r\n")
27 .addTemplate("login500", rtm.generateTemplate("530", "Authentication failed"))
28 .addTemplate("OK", rtm.generateTemplate("200", "Command completed successfully"))
29 .addTemplate("CHECKS", "[RESPONSE]\r\nPROPERTY[TOTAL][0]=2701\r\nPROPERTY[FIRST][0]=0\r\nPROPERTY[DOMAIN][0]=0-60motorcycletimes.com\r\nPROPERTY[DOMAIN][1]=0-be-s01-0.com\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[LAST][0]=1\r\nPROPERTY[LIMIT][0]=2\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.023\r\nEOF\r\n")
30 .addTemplate("listP0", "[RESPONSE]\r\nPROPERTY[TOTAL][0]=2701\r\nPROPERTY[FIRST][0]=0\r\nPROPERTY[DOMAIN][0]=0-60motorcycletimes.com\r\nPROPERTY[DOMAIN][1]=0-be-s01-0.com\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[LAST][0]=1\r\nPROPERTY[LIMIT][0]=2\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.023\r\nEOF\r\n")
31 .addTemplate("listP1", "[RESPONSE]\r\nPROPERTY[TOTAL][0]=2701\r\nPROPERTY[FIRST][0]=2\r\nPROPERTY[DOMAIN][0]=0-qas-ao17-0.org\r\nPROPERTY[DOMAIN][1]=0-sunnyda222y.com\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[LAST][0]=3\r\nPROPERTY[LIMIT][0]=2\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.032\r\nEOF\r\n")
32 .addTemplate("listFP0", "[RESPONSE]\r\nPROPERTY[TOTAL][0]=3\r\nPROPERTY[FIRST][0]=0\r\nPROPERTY[DOMAIN][0]=0-60motorcycletimes.com\r\nPROPERTY[COUNT][0]=1\r\nPROPERTY[LAST][0]=1\r\nPROPERTY[LIMIT][0]=1\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.023\r\nEOF\r\n")
33 .addTemplate("listFP1", "[RESPONSE]\r\nPROPERTY[TOTAL][0]=3\r\nPROPERTY[FIRST][0]=1\r\nPROPERTY[DOMAIN][0]=0-be-s01-0.com\r\nPROPERTY[COUNT][0]=1\r\nPROPERTY[LAST][0]=2\r\nPROPERTY[LIMIT][0]=1\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.032\r\nEOF\r\n")
34 .addTemplate("listFP2", "[RESPONSE]\r\nPROPERTY[TOTAL][0]=3\r\nPROPERTY[FIRST][0]=2\r\nPROPERTY[DOMAIN][0]=0-qas-ao17-0.org\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[LAST][0]=3\r\nPROPERTY[LIMIT][0]=1\r\nDESCRIPTION=Command completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.032\r\nEOF\r\n");
35});
36
37describe("APIClient class", function () {
38 this.timeout(APIClient.socketTimeout);
39 this.slow(1000);
40
41 describe("#.getPOSTData", () => {
42 it("test object input with special chars", () => {
43 const validate = "s_entity=54cd&s_command=AUTH%3Dgwrgwqg%25%26%5C44t3%2A%0ACOMMAND%3DModifyDomain";
44 const enc = cl.getPOSTData({
45 AUTH: "gwrgwqg%&\\44t3*",
46 COMMAND: "ModifyDomain",
47 });
48 expect(enc).to.equal(validate);
49 });
50
51 it("test string input", () => {
52 const enc = cl.getPOSTData("gregergege");
53 expect(enc).to.equal("s_entity=54cd&s_command=gregergege");
54 });
55
56 it("test object input with null value in parameter", () => {
57 const validate = "s_entity=54cd&s_command=COMMAND%3DModifyDomain";
58 const enc = cl.getPOSTData({
59 AUTH: null,
60 COMMAND: "ModifyDomain",
61 });
62 expect(enc).to.equal(validate);
63 });
64
65 it("test object input with undefined value in parameter", () => {
66 const validate = "s_entity=54cd&s_command=COMMAND%3DModifyDomain";
67 const enc = cl.getPOSTData({
68 AUTH: undefined,
69 COMMAND: "ModifyDomain",
70 });
71 expect(enc).to.equal(validate);
72 });
73
74 it("test data getting secured correctly", () => {
75 const validate = "s_entity=54cd&s_login=test.user&s_pw=***&s_command=COMMAND%3DCheckAuthentication%0APASSWORD%3D%2A%2A%2A%0ASUBUSER%3Dtest.user";
76 cl.setCredentials("test.user", "test.passw0rd");
77 const enc = cl.getPOSTData({
78 COMMAND: "CheckAuthentication",
79 PASSWORD: "test.passw0rd",
80 SUBUSER: "test.user",
81 }, true);
82 cl.setCredentials("", "");
83 expect(enc).to.equal(validate);
84 });
85 });
86
87 describe("#.enableDebugMode", () => {
88 it("activate debug mode", () => {
89 cl.enableDebugMode();
90 });
91 });
92
93 describe("#.disableDebugMode", () => {
94 it("deactivate debug mode", () => {
95 cl.disableDebugMode();
96 });
97 });
98
99 describe("#.getSession", () => {
100 it("validate response", () => {
101 const session = cl.getSession();
102 expect(session).to.be.null;
103 });
104 });
105
106 describe("#.getSession", () => {
107 it("validate response", () => {
108 const sessid = "testSessionID12345678";
109 cl.setSession(sessid);
110 const session = cl.getSession();
111 expect(session).to.be.equal(sessid);
112 cl.setSession("");
113 });
114 });
115
116 describe("#.getURL", () => {
117 it("validate default socket url", () => {
118 const url = cl.getURL();
119 expect(url).to.equal(ISPAPI_CONNECTION_URL);
120 });
121 });
122
123 describe("#.getUserAgent", () => {
124 it("validate response", () => {
125 const ua = cl.getUserAgent();
126 expect(ua).to.equal(`NODE-SDK (${process.platform}; ${process.arch}; rv:${cl.getVersion()}) node/${process.version}`);
127 });
128 });
129
130 describe("#.setUserAgent", () => {
131 it("validate response", () => {
132 const cls = cl.setUserAgent("WHMCS", "7.7.0");
133 const ua = cl.getUserAgent();
134 expect(cls).to.be.instanceOf(APIClient);
135 expect(ua).to.equal(`WHMCS (${process.platform}; ${process.arch}; rv:7.7.0) node-sdk/${cl.getVersion()} node/${process.version}`);
136 });
137
138 it("validate agent string including modules", () => {
139 const cls = cl.setUserAgent("WHMCS", "7.7.0", ["reg/2.6.2", "ssl/7.2.2", "dc/8.2.2"]);
140 const ua = cl.getUserAgent();
141 expect(cls).to.be.instanceOf(APIClient);
142 expect(ua).to.equal(`WHMCS (${process.platform}; ${process.arch}; rv:7.7.0) reg/2.6.2 ssl/7.2.2 dc/8.2.2 node-sdk/${cl.getVersion()} node/${process.version}`);
143 });
144 });
145
146 describe("#.setURL", () => {
147 it("validate http socket url", () => {
148 const url = cl.setURL(ISPAPI_CONNECTION_URL_PROXY).getURL();
149 expect(url).to.equal(ISPAPI_CONNECTION_URL_PROXY);
150 cl.setURL(ISPAPI_CONNECTION_URL);
151 });
152 });
153
154 describe("#.setOTP", () => {
155 it("validate getPOSTData response [otp set] ", () => {
156 cl.setOTP("12345678");
157 const tmp = cl.getPOSTData({
158 COMMAND: "StatusAccount",
159 });
160 expect(tmp).to.equal("s_entity=54cd&s_otp=12345678&s_command=COMMAND%3DStatusAccount");
161 });
162
163 it("validate getPOSTData response [otp reset]", () => {
164 cl.setOTP("");
165 const tmp = cl.getPOSTData({
166 COMMAND: "StatusAccount",
167 });
168 expect(tmp).to.equal("s_entity=54cd&s_command=COMMAND%3DStatusAccount");
169 });
170 });
171
172 describe("#.setSession", () => {
173 it("validate getPOSTData response [session set] ", () => {
174 cl.setSession("12345678");
175 const tmp = cl.getPOSTData({
176 COMMAND: "StatusAccount",
177 });
178 expect(tmp).to.equal("s_entity=54cd&s_session=12345678&s_command=COMMAND%3DStatusAccount");
179 });
180
181 it("validate getPOSTData response [credentials and session set] ", () => {
182 // credentials and otp code have to be unset when session id is set
183 cl.setRoleCredentials("myaccountid", "myrole", "mypassword")
184 .setOTP("12345678")
185 .setSession("12345678");
186 const tmp = cl.getPOSTData({
187 COMMAND: "StatusAccount",
188 });
189 expect(tmp).to.equal("s_entity=54cd&s_session=12345678&s_command=COMMAND%3DStatusAccount");
190 });
191
192 it("validate getPOSTData response [session reset]", () => {
193 cl.setSession("");
194 const tmp = cl.getPOSTData({
195 COMMAND: "StatusAccount",
196 });
197 expect(tmp).to.equal("s_entity=54cd&s_command=COMMAND%3DStatusAccount");
198 });
199 });
200
201 describe("#.saveSession/reuseSession", () => {
202 after(() => {
203 cl.setSession("");
204 });
205
206 it("validate correct settings", () => {
207 const sessionobj = {};
208 cl.setSession("12345678")
209 .saveSession(sessionobj);
210 const cl2 = new APIClient();
211 cl2.reuseSession(sessionobj);
212 const tmp = cl2.getPOSTData({
213 COMMAND: "StatusAccount",
214 });
215 expect(tmp).to.equal("s_entity=54cd&s_session=12345678&s_command=COMMAND%3DStatusAccount");
216 });
217 });
218
219 describe("#.setRemoteIPAddress", () => {
220 it("validate getPOSTData response [ip set] ", () => {
221 cl.setRemoteIPAddress("10.10.10.10");
222 const tmp = cl.getPOSTData({
223 COMMAND: "StatusAccount",
224 });
225 expect(tmp).to.equal("s_entity=54cd&s_remoteaddr=10.10.10.10&s_command=COMMAND%3DStatusAccount");
226 });
227
228 it("validate getPOSTData response [ip reset]", () => {
229 cl.setRemoteIPAddress("");
230 const tmp = cl.getPOSTData({
231 COMMAND: "StatusAccount",
232 });
233 expect(tmp).to.equal("s_entity=54cd&s_command=COMMAND%3DStatusAccount");
234 });
235 });
236
237 describe("#.setCredentials", () => {
238 it("validate getPOSTData response [credentials set] ", () => {
239 cl.setCredentials("myaccountid", "mypassword");
240 const tmp = cl.getPOSTData({
241 COMMAND: "StatusAccount",
242 });
243 expect(tmp).to.equal("s_entity=54cd&s_login=myaccountid&s_pw=mypassword&s_command=COMMAND%3DStatusAccount");
244 });
245
246 it("validate getPOSTData response [session reset]", () => {
247 cl.setCredentials("", "");
248 const tmp = cl.getPOSTData({
249 COMMAND: "StatusAccount",
250 });
251 expect(tmp).to.equal("s_entity=54cd&s_command=COMMAND%3DStatusAccount");
252 });
253 });
254
255 describe("#.setRoleCredentials", () => {
256 it("validate getPOSTData response [role credentials set] ", () => {
257 cl.setRoleCredentials("myaccountid", "myroleid", "mypassword");
258 const tmp = cl.getPOSTData({
259 COMMAND: "StatusAccount",
260 });
261 expect(tmp).to.equal("s_entity=54cd&s_login=myaccountid%21myroleid&s_pw=mypassword&s_command=COMMAND%3DStatusAccount");
262 });
263
264 it("validate getPOSTData response [role credentials reset]", () => {
265 cl.setRoleCredentials("", "", "");
266 const tmp = cl.getPOSTData({
267 COMMAND: "StatusAccount",
268 });
269 expect(tmp).to.equal("s_entity=54cd&s_command=COMMAND%3DStatusAccount");
270 });
271 });
272
273 describe("#.login", () => {
274 it("validate against mocked API response [login succeeded; no role used]", async () => {
275 const tpl = new Response(rtm.getTemplate("login200").getPlain(), cmd);
276 nock("https://api.ispapi.net")
277 .post("/api/call.cgi")
278 .reply(200, tpl.getPlain());
279 cl.useOTESystem()
280 .setCredentials("test.user", "test.passw0rd");
281 const r = await cl.login();
282 expect(r).to.be.instanceOf(Response);
283 expect(r.isSuccess()).to.be.true;
284 const rec = r.getRecord(0);
285 expect(rec).not.to.be.null;
286 if (rec) {
287 const rec2 = tpl.getRecord(0);
288 expect(rec2).not.to.be.null;
289 if (rec2) {
290 expect(rec.getDataByKey("SESSION")).to.equal(rec2.getDataByKey("SESSION"));
291 }
292 }
293 });
294
295 it("validate against mocked API response [login succeeded; role used]", async () => {
296 const tpl = new Response(rtm.getTemplate("login200").getPlain(), cmd);
297 nock("https://api.ispapi.net")
298 .post("/api/call.cgi")
299 .reply(200, tpl.getPlain());
300 cl.useOTESystem()
301 .setRoleCredentials("test.user", "testrole", "test.passw0rd");
302 const r = await cl.login();
303 expect(r).to.be.instanceOf(Response);
304 expect(r.isSuccess()).to.be.true;
305 const rec = r.getRecord(0);
306 expect(rec).not.to.be.null;
307 if (rec) {
308 const rec2 = tpl.getRecord(0);
309 expect(rec2).not.to.be.null;
310 if (rec2) {
311 expect(rec.getDataByKey("SESSION")).to.equal(rec2.getDataByKey("SESSION"));
312 }
313 }
314 });
315
316 it("validate against mocked API response [login failed; wrong credentials]", async () => {
317 nock("https://api.ispapi.net")
318 .post("/api/call.cgi")
319 .reply(200, rtm.getTemplate("login500").getPlain());
320 cl.setCredentials("test.user", "WRONGPASSWORD");
321 const r = await cl.login();
322 expect(r).to.be.instanceOf(Response);
323 expect(r.isError()).to.be.true;
324 });
325
326 it("validate against mocked API response [login failed; http timeout]", async () => {
327 // nock.cleanAll()
328 const tpl = rtm.getTemplate("httperror");
329 nock("https://api.ispapi.net")
330 .post("/api/call.cgi")
331 .socketDelay(APIClient.socketTimeout)
332 .reply(200, tpl.getPlain());
333 cl.setCredentials("test.user", "WRONGPASSWORD");
334 const r = await cl.login();
335 expect(r).to.be.instanceOf(Response);
336 expect(r.isTmpError()).to.be.true;
337 expect(r.getDescription()).to.equal(tpl.getDescription());
338 });
339
340 it("validate against mocked API response [login succeeded; no session returned] ", async () => {
341 // this case cannot really happen as the api always returns SESSION property.
342 // this case is just to increase coverage
343 const tpl = new Response(rtm.getTemplate("OK").getPlain(), cmd);
344 nock("https://api.ispapi.net")
345 .post("/api/call.cgi")
346 .reply(200, tpl.getPlain());
347 cl.useOTESystem()
348 .setCredentials("test.user", "test.passw0rd");
349 const r = await cl.login();
350 expect(r).to.be.instanceOf(Response);
351 expect(r.isSuccess()).to.be.true;
352 const rec = r.getRecord(0);
353 expect(rec).to.be.null;
354 });
355 });
356
357 describe("#.loginExtended", () => {
358 it("validate against mocked API response [login succeeded; no role used] ", async () => {
359 const tpl = new Response(rtm.getTemplate("login200").getPlain(), cmd);
360 nock("https://api.ispapi.net")
361 .post("/api/call.cgi")
362 .reply(200, tpl.getPlain());
363 cl.useOTESystem()
364 .setCredentials("test.user", "test.passw0rd");
365 const r = await cl.loginExtended({
366 TIMEOUT: 60,
367 });
368 expect(r).to.be.instanceOf(Response);
369 expect(r.isSuccess()).to.be.true;
370 const rec = r.getRecord(0);
371 expect(rec).not.to.be.null;
372 if (rec) {
373 const rec2 = tpl.getRecord(0);
374 expect(rec2).not.to.be.null;
375 if (rec2) {
376 expect(rec.getDataByKey("SESSION")).to.equal(rec2.getDataByKey("SESSION"));
377 }
378 }
379 });
380 });
381
382 describe("#.logout", () => {
383 it("validate against mocked API response [logout succeeded]", async () => {
384 nock("https://api.ispapi.net")
385 .post("/api/call.cgi")
386 .reply(200, rtm.getTemplate("OK").getPlain());
387 const r = await cl.logout();
388 expect(r).to.be.instanceOf(Response);
389 expect(r.isSuccess()).to.be.true;
390 });
391
392 it("validate against mocked API response [logout failed; session no longer exists]", async () => {
393 const tpl = new Response(rtm.getTemplate("login200").getPlain(), cmd);
394 nock("https://api.ispapi.net")
395 .post("/api/call.cgi")
396 .reply(200, rtm.getTemplate("login500").getPlain());
397
398 const rec2 = tpl.getRecord(0);
399 expect(rec2).not.to.be.null;
400 if (rec2) {
401 const sessid = rec2.getDataByKey("SESSION");
402 expect(sessid).not.to.be.null;
403 if (sessid) {
404 cl.enableDebugMode()
405 .setSession(sessid);
406 const r = await cl.logout();
407 expect(r).to.be.instanceOf(Response);
408 expect(r.isError()).to.be.true;
409 }
410 }
411 });
412 });
413
414 describe("#.request", () => {
415 // TODO additional test for statusMessage - not supported through nock [https://github.com/nock/nock/issues/558]
416 it("validate against mocked API response [200 < r.statusCode > 299]", async () => {
417 const tpl2 = new Response(rtm.getTemplate("httperror").getPlain(), cmd);
418 nock("https://api.ispapi.net")
419 .post("/api/call.cgi")
420 .reply(404, rtm.getTemplate("404").getPlain());
421 cl.enableDebugMode()
422 .setCredentials("test.user", "test.passw0rd")
423 .useOTESystem();
424 const r = await cl.request(cmd);
425 expect(r).to.be.instanceOf(Response);
426 expect(r.isTmpError()).to.be.true;
427 expect(r.getCode()).to.equal(tpl2.getCode());
428 expect(r.getDescription()).to.equal(tpl2.getDescription());
429 });
430
431 it("validate against mocked API response [200 < r.statusCode > 299, no debug]", async () => {
432 const tpl2 = new Response(rtm.getTemplate("httperror").getPlain(), cmd);
433 nock("https://api.ispapi.net")
434 .post("/api/call.cgi")
435 .reply(404, rtm.getTemplate("404").getPlain());
436 cl.disableDebugMode();
437 const r = await cl.request(cmd);
438 expect(r).to.be.instanceOf(Response);
439 expect(r.isTmpError()).to.be.true;
440 expect(r.getCode()).to.equal(tpl2.getCode());
441 expect(r.getDescription()).to.equal(tpl2.getDescription());
442 });
443
444 it("test if flattening of nested array / bulk parameters works", async () => {
445 nock("https://api.ispapi.net")
446 .post("/api/call.cgi")
447 .reply(200, rtm.getTemplate("OK").getPlain());
448 const r = await cl.request({
449 COMMAND: "CheckDomains",
450 DOMAIN: ["example.com", "example.net"],
451 });
452 expect(r).to.be.instanceOf(Response);
453 const mycmd = r.getCommand();
454 const keys = Object.keys(mycmd);
455 expect(keys.includes("DOMAIN")).to.be.false;
456 expect(keys.includes("DOMAIN0")).to.be.true;
457 expect(keys.includes("DOMAIN1")).to.be.true;
458 expect(mycmd.DOMAIN0).to.equal("example.com");
459 expect(mycmd.DOMAIN1).to.equal("example.net");
460 });
461
462 it("test if auto-idn convert works", async () => {
463 nock.cleanAll();
464 const r = await cl.request({
465 COMMAND: "CheckDomains",
466 DOMAIN: ["example.com", "dömäin.example", "example.net"],
467 });
468 expect(r).to.be.instanceOf(Response);
469 const mycmd = r.getCommand();
470 const keys = Object.keys(mycmd);
471 expect(keys.includes("DOMAIN")).to.be.false;
472 expect(keys.includes("DOMAIN0")).to.be.true;
473 expect(keys.includes("DOMAIN1")).to.be.true;
474 expect(keys.includes("DOMAIN2")).to.be.true;
475 expect(mycmd.DOMAIN0).to.equal("example.com");
476 expect(mycmd.DOMAIN1).to.equal("xn--dmin-moa0i.example");
477 expect(mycmd.DOMAIN2).to.equal("example.net");
478 });
479 });
480
481 describe("#.requestNextResponsePage", () => {
482 it("validate against mocked API response [no LAST set]", async () => {
483 nock("https://api.ispapi.net")
484 .post("/api/call.cgi")
485 .reply(200, rtm.getTemplate("listP1").getPlain());
486 const r = new Response(
487 rtm.getTemplate("listP0").getPlain(),
488 { COMMAND: "QueryDomainList", LIMIT: 2, FIRST: 0 },
489 );
490 const nr = await cl.requestNextResponsePage(r);
491 expect(r.isSuccess()).to.be.true;
492 expect(r.getRecordsLimitation()).to.equal(2);
493 expect(r.getRecordsCount()).to.equal(2);
494 expect(r.getFirstRecordIndex()).to.equal(0);
495 expect(r.getLastRecordIndex()).to.equal(1);
496 expect(nr).not.to.be.null;
497 if (nr) {
498 expect(nr.isSuccess()).to.be.true;
499 expect(nr.getRecordsLimitation()).to.equal(2);
500 expect(nr.getRecordsCount()).to.equal(2);
501 expect(nr.getFirstRecordIndex()).to.equal(2);
502 expect(nr.getLastRecordIndex()).to.equal(3);
503 }
504 });
505
506 it("validate against mocked API response [LAST set]", () => {
507 const r = new Response(
508 rtm.getTemplate("listP0").getPlain(),
509 { COMMAND: "QueryDomainList", LIMIT: 2, FIRST: 0, LAST: 1 },
510 );
511 return expect(cl.requestNextResponsePage(r)).to.be.rejectedWith(Error, "Parameter LAST in use. Please remove it to avoid issues in requestNextPage.");
512 });
513
514 it("validate against mocked API response [no FIRST set]", async () => {
515 nock("https://api.ispapi.net")
516 .post("/api/call.cgi")
517 .reply(200, rtm.getTemplate("listP1").getPlain());
518 cl.disableDebugMode();
519 const r = new Response(
520 rtm.getTemplate("listP0").getPlain(),
521 { COMMAND: "QueryDomainList", LIMIT: 2 },
522 );
523 const nr = await cl.requestNextResponsePage(r);
524 expect(r.isSuccess()).to.be.true;
525 expect(r.getRecordsLimitation()).to.equal(2);
526 expect(r.getRecordsCount()).to.equal(2);
527 expect(r.getFirstRecordIndex()).to.equal(0);
528 expect(r.getLastRecordIndex()).to.equal(1);
529 expect(nr).not.to.be.null;
530 if (nr) {
531 expect(nr.isSuccess()).to.be.true;
532 expect(nr.getRecordsLimitation()).to.equal(2);
533 expect(nr.getRecordsCount()).to.equal(2);
534 expect(nr.getFirstRecordIndex()).to.equal(2);
535 expect(nr.getLastRecordIndex()).to.equal(3);
536 }
537 });
538 });
539
540 describe("#.requestAllResponsePages", () => {
541 it("validate against mocked API response [success case]", async () => {
542 let reqcount = 0;
543 const scope = nock("https://api.ispapi.net")
544 .persist()
545 .post("/api/call.cgi")
546 .reply(200, () => {
547 reqcount++;
548 if (reqcount === 1) {
549 return rtm.getTemplate("listFP0").getPlain();
550 }
551 if (reqcount === 2) {
552 return rtm.getTemplate("listFP1").getPlain();
553 }
554 return rtm.getTemplate("listFP2").getPlain();
555 });
556 const nr = await cl.requestAllResponsePages({ COMMAND: "QueryDomainList", FIRST: 0, LIMIT: 1 });
557 expect(nr.length).to.equal(3);
558 scope.persist(false);
559 });
560 });
561
562 describe("#.setUserView", () => {
563 it("validate against mocked API response", async () => {
564 nock("https://api.ispapi.net")
565 .post("/api/call.cgi")
566 .reply(200, rtm.getTemplate("OK").getPlain());
567 cl.setUserView("hexotestman.com");
568 const r = await cl.request({ COMMAND: "GetUserIndex" });
569 expect(r).to.be.instanceOf(Response);
570 expect(r.isSuccess()).to.be.true;
571 });
572 });
573
574 describe("#.resetUserView", () => {
575 it("validate against mocked API response", async () => {
576 nock("https://api.ispapi.net")
577 .post("/api/call.cgi")
578 .reply(200, rtm.getTemplate("OK").getPlain());
579 cl.resetUserView();
580 const r = await cl.request({ COMMAND: "GetUserIndex" });
581 expect(r).to.be.instanceOf(Response);
582 expect(r.isSuccess()).to.be.true;
583 });
584 });
585
586 describe("#.setProxy", () => {
587 it("test setting proxy works", () => {
588 cl.setProxy("127.0.0.1");
589 expect(cl.getProxy()).to.equal("127.0.0.1");
590 cl.setProxy("");
591 });
592 });
593
594 describe("#.setReferer", () => {
595 it("test setting referer works", () => {
596 cl.setReferer("https://www.hexonet.net");
597 expect(cl.getReferer()).to.equal("https://www.hexonet.net");
598 cl.setReferer("");
599 });
600 });
601
602 describe("#.useHighPerformanceConnectionSetup", () => {
603 it("test setting high performance connection setup works", () => {
604 cl.useHighPerformanceConnectionSetup();
605 expect(cl.getURL()).to.equal(ISPAPI_CONNECTION_URL_PROXY);
606 });
607 });
608
609 describe("#.useDefaultConnectionSetup", () => {
610 it("test setting default connection setup works", () => {
611 cl.useDefaultConnectionSetup();
612 expect(cl.getURL()).to.equal(ISPAPI_CONNECTION_URL);
613 });
614 });
615});