1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | import chai = require("chai");
|
7 | import chaiPromised = require("chai-as-promised");
|
8 | import "mocha";
|
9 | import nock = require("nock");
|
10 | import { APIClient, ISPAPI_CONNECTION_URL, ISPAPI_CONNECTION_URL_PROXY } from "../src/apiclient";
|
11 | import { Response } from "../src/response";
|
12 | import { ResponseTemplateManager } from "../src/responsetemplatemanager";
|
13 | chai.use(chaiPromised);
|
14 |
|
15 | const expect = chai.expect;
|
16 | const rtm = ResponseTemplateManager.getInstance();
|
17 | const cmd = { COMMAND: "StatusAccount" };
|
18 | let cl: APIClient;
|
19 |
|
20 | after(() => {
|
21 | nock.cleanAll();
|
22 | });
|
23 |
|
24 | before(() => {
|
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 |
|
37 | describe("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 |
|
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 |
|
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 |
|
342 |
|
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 |
|
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 | });
|