@team-internet/apiconnector 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/.devcontainer/Dockerfile +66 -0
  2. package/.devcontainer/devcontainer.json +30 -0
  3. package/.devcontainer/docker-compose.yml +11 -0
  4. package/.devcontainer/supporting_files/configuration/.czrc +1 -0
  5. package/.devcontainer/supporting_files/configuration/.p10k.zsh +1735 -0
  6. package/.devcontainer/supporting_files/configuration/.zshrc +23 -0
  7. package/.devcontainer/supporting_files/configuration/p10k-instant-prompt-vscode.zsh +323 -0
  8. package/.devcontainer/supporting_files/scripts/post-create.sh +11 -0
  9. package/.nycrc +6 -0
  10. package/CHANGELOG.md +582 -0
  11. package/CONTRIBUTING.md +132 -0
  12. package/LICENSE +21 -0
  13. package/README.md +56 -0
  14. package/dist/apiclient.d.ts +233 -0
  15. package/dist/apiclient.js +517 -0
  16. package/dist/column.d.ts +40 -0
  17. package/dist/column.js +52 -0
  18. package/dist/customlogger.d.ts +15 -0
  19. package/dist/customlogger.js +23 -0
  20. package/dist/index.d.ts +16 -0
  21. package/dist/index.js +16 -0
  22. package/dist/logger.d.ts +14 -0
  23. package/dist/logger.js +21 -0
  24. package/dist/record.d.ts +31 -0
  25. package/dist/record.js +42 -0
  26. package/dist/response.d.ts +264 -0
  27. package/dist/response.js +512 -0
  28. package/dist/responseparser.d.ts +1 -0
  29. package/dist/responseparser.js +36 -0
  30. package/dist/responsetemplatemanager.d.ts +65 -0
  31. package/dist/responsetemplatemanager.js +111 -0
  32. package/dist/responsetranslator.d.ts +32 -0
  33. package/dist/responsetranslator.js +144 -0
  34. package/dist/socketconfig.d.ts +62 -0
  35. package/dist/socketconfig.js +107 -0
  36. package/package.json +86 -0
  37. package/src/apiclient.ts +579 -0
  38. package/src/column.ts +57 -0
  39. package/src/customlogger.ts +29 -0
  40. package/src/index.ts +18 -0
  41. package/src/logger.ts +23 -0
  42. package/src/record.ts +46 -0
  43. package/src/response.ts +562 -0
  44. package/src/responseparser.ts +35 -0
  45. package/src/responsetemplatemanager.ts +136 -0
  46. package/src/responsetranslator.ts +191 -0
  47. package/src/socketconfig.ts +116 -0
  48. package/tests/apiclient.spec.ts +610 -0
  49. package/tests/app.js +47 -0
  50. package/tests/column.spec.ts +23 -0
  51. package/tests/index.spec.ts +22 -0
  52. package/tests/record.spec.ts +31 -0
  53. package/tests/response.spec.ts +341 -0
  54. package/tests/responseparser.spec.ts +13 -0
  55. package/tests/responsetemplatemanager.spec.ts +52 -0
  56. package/tests/socketconfig.spec.ts +14 -0
  57. package/tsconfig.json +7 -0
  58. package/typedoc.json +7 -0
@@ -0,0 +1,610 @@
1
+ import { expect, use } from "chai"; // Using Expect style
2
+ import chaiAsPromised from "chai-as-promised";
3
+ import "mocha";
4
+ import nock from "nock";
5
+ import {
6
+ APIClient,
7
+ CNR_CONNECTION_URL_LIVE,
8
+ CNR_CONNECTION_URL_OTE,
9
+ CNR_CONNECTION_URL_PROXY,
10
+ } from "../src/apiclient.ts";
11
+ import { Response } from "../src/response.ts";
12
+ import { ResponseTemplateManager } from "../src/responsetemplatemanager.ts";
13
+ use(chaiAsPromised);
14
+
15
+ const apiScript = "/api/call.cgi";
16
+ const oteHost = CNR_CONNECTION_URL_OTE.replace(apiScript, "");
17
+ const rtm = ResponseTemplateManager.getInstance();
18
+ const cmd = { COMMAND: "StatusAccount" };
19
+ let cl: APIClient;
20
+
21
+ after(() => {
22
+ nock.cleanAll();
23
+ });
24
+
25
+ before(() => {
26
+ cl = new APIClient();
27
+ rtm
28
+ .addTemplate(
29
+ "login200",
30
+ "[RESPONSE]\r\nproperty[expiration date][0] = 2024-09-19 10:52:51\r\nproperty[sessionid][0] = bb7a884b09b9a674fb4a22211758ce87\r\ndescription = Command completed successfully\r\ncode = 200\r\nqueuetime = 0.004\r\nruntime = 0.023\r\nEOF\r\n",
31
+ )
32
+ .addTemplate(
33
+ "login500",
34
+ rtm.generateTemplate("530", "Authentication failed"),
35
+ )
36
+ .addTemplate(
37
+ "OK",
38
+ rtm.generateTemplate("200", "Command completed successfully"),
39
+ )
40
+ .addTemplate(
41
+ "CHECKS",
42
+ "[RESPONSE]\r\nproperty[total][0] = 4\r\nproperty[first][0] = 0\r\nproperty[domain][0] = cnic-ssl-test1.com\r\nproperty[domain][1] = cnic-ssl-test2.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.007\r\nEOF\r\n",
43
+ )
44
+ .addTemplate(
45
+ "listP0",
46
+ "[RESPONSE]\r\nproperty[total][0] = 4\r\nproperty[first][0] = 0\r\nproperty[domain][0] = cnic-ssl-test1.com\r\nproperty[domain][1] = cnic-ssl-test2.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.007\r\nEOF\r\n",
47
+ )
48
+ .addTemplate(
49
+ "listP1",
50
+ "[RESPONSE]\r\nproperty[total][0] = 4\r\nproperty[first][0] = 2\r\nproperty[domain][0] = emailcustomization.com\r\nproperty[domain][1] = test-keysysbe0123.be\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.006\r\nEOF\r\n",
51
+ )
52
+ .addTemplate(
53
+ "listFP0",
54
+ "[RESPONSE]\r\nproperty[total][0] = 4\r\nproperty[first][0] = 0\r\nproperty[domain][0] = cnic-ssl-test1.com\r\nproperty[count][0] = 1\r\nproperty[last][0] = 0\r\nproperty[limit][0] = 1\r\ndescription = Command completed successfully\r\ncode = 200\r\nqueuetime = 0\r\nruntime = 0.009\r\nEOF\r\n",
55
+ )
56
+ .addTemplate(
57
+ "listFP1",
58
+ "[RESPONSE]\r\nproperty[total][0] = 4\r\nproperty[first][0] = 1\r\nproperty[domain][0] = cnic-ssl-test2.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.007\r\nEOF\r\n",
59
+ )
60
+ .addTemplate(
61
+ "listFP2",
62
+ "[RESPONSE]\r\nproperty[total][0] = 4\r\nproperty[first][0] = 2\r\nproperty[domain][0] = emailcustomization.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.007\r\nEOF\r\n",
63
+ )
64
+ .addTemplate(
65
+ "subUserSet",
66
+ "[RESPONSE]\r\nproperty[amount][0] = 670.77\r\nproperty[credit][0] = 0.00\r\nproperty[credit threshold][0] = 0.00\r\nproperty[currency][0] = USD\r\nproperty[registrar][0] = sub1\r\nproperty[vat][0] = 0.00\r\ndescription = Command completed successfully\r\ncode = 200\r\nruntime = 0.008\r\nqueuetime = 0\r\nEOF\r\n",
67
+ )
68
+ .addTemplate(
69
+ "subUserReset",
70
+ "[RESPONSE]\r\nproperty[amount][0] = 670.77\r\nproperty[credit][0] = 0.00\r\nproperty[credit threshold][0] = 0.00\r\nproperty[currency][0] = USD\r\nproperty[registrar][0] = test\r\nproperty[vat][0] = 0.00\r\ndescription = Command completed successfully\r\ncode = 200\r\nruntime = 0.008\r\nqueuetime = 0\r\nEOF\r\n",
71
+ );
72
+ });
73
+
74
+ describe("APIClient class", function () {
75
+ this.timeout(APIClient.socketTimeout);
76
+ this.slow(1000);
77
+
78
+ describe("#.getPOSTData", () => {
79
+ it("test object input with special chars", () => {
80
+ const validate =
81
+ "s_command=AUTH%3Dgwrgwqg%25%26%5C44t3%2A%0ACOMMAND%3DModifyDomain";
82
+ const enc = cl.getPOSTData({
83
+ AUTH: "gwrgwqg%&\\44t3*",
84
+ COMMAND: "ModifyDomain",
85
+ });
86
+ expect(enc).to.equal(validate);
87
+ });
88
+
89
+ it("test string input", () => {
90
+ const enc = cl.getPOSTData("gregergege");
91
+ expect(enc).to.equal("s_command=gregergege");
92
+ });
93
+
94
+ it("test object input with null value in parameter", () => {
95
+ const validate = "s_command=COMMAND%3DModifyDomain";
96
+ const enc = cl.getPOSTData({
97
+ AUTH: null,
98
+ COMMAND: "ModifyDomain",
99
+ });
100
+ expect(enc).to.equal(validate);
101
+ });
102
+
103
+ it("test object input with undefined value in parameter", () => {
104
+ const validate = "s_command=COMMAND%3DModifyDomain";
105
+ const enc = cl.getPOSTData({
106
+ AUTH: undefined,
107
+ COMMAND: "ModifyDomain",
108
+ });
109
+ expect(enc).to.equal(validate);
110
+ });
111
+
112
+ it("test data getting secured correctly", () => {
113
+ const encodedTestUserName = encodeURIComponent(
114
+ process.env.CNR_TEST_USER || "",
115
+ );
116
+ const validate =
117
+ "s_login=" +
118
+ encodedTestUserName +
119
+ "&s_pw=***&s_command=COMMAND%3DCheckAuthentication%0APASSWORD%3D%2A%2A%2A%0ASUBUSER%3D" +
120
+ encodedTestUserName;
121
+ cl.setCredentials(
122
+ process.env.CNR_TEST_USER || "",
123
+ process.env.CNR_TEST_PASSWORD || "",
124
+ );
125
+ const enc = cl.getPOSTData(
126
+ {
127
+ COMMAND: "CheckAuthentication",
128
+ PASSWORD: "test.passw0rd",
129
+ SUBUSER: process.env.CNR_TEST_USER,
130
+ },
131
+ true,
132
+ );
133
+ cl.setCredentials("", "");
134
+ expect(enc).to.equal(validate);
135
+ });
136
+ });
137
+
138
+ describe("#.enableDebugMode", () => {
139
+ it("activate debug mode", () => {
140
+ cl.enableDebugMode();
141
+ });
142
+ });
143
+
144
+ describe("#.disableDebugMode", () => {
145
+ it("deactivate debug mode", () => {
146
+ cl.disableDebugMode();
147
+ });
148
+ });
149
+
150
+ describe("#.getURL", () => {
151
+ it("validate default socket url", () => {
152
+ const url = cl.getURL();
153
+ expect(url).to.equal(CNR_CONNECTION_URL_LIVE);
154
+ });
155
+ });
156
+
157
+ describe("#.getUserAgent", () => {
158
+ it("validate response", () => {
159
+ const ua = cl.getUserAgent();
160
+ expect(ua).to.equal(
161
+ `NODE-SDK (${process.platform}; ${
162
+ process.arch
163
+ }; rv:${cl.getVersion()}) node/${process.version}`,
164
+ );
165
+ });
166
+ });
167
+
168
+ describe("#.setUserAgent", () => {
169
+ it("validate response", () => {
170
+ const cls = cl.setUserAgent("WHMCS", "7.7.0");
171
+ const ua = cl.getUserAgent();
172
+ expect(cls).to.be.instanceOf(APIClient);
173
+ expect(ua).to.equal(
174
+ `WHMCS (${process.platform}; ${
175
+ process.arch
176
+ }; rv:7.7.0) node-sdk/${cl.getVersion()} node/${process.version}`,
177
+ );
178
+ });
179
+
180
+ it("validate agent string including modules", () => {
181
+ const cls = cl.setUserAgent("WHMCS", "7.7.0", [
182
+ "reg/2.6.2",
183
+ "ssl/7.2.2",
184
+ "dc/8.2.2",
185
+ ]);
186
+ const ua = cl.getUserAgent();
187
+ expect(cls).to.be.instanceOf(APIClient);
188
+ expect(ua).to.equal(
189
+ `WHMCS (${process.platform}; ${
190
+ process.arch
191
+ }; rv:7.7.0) reg/2.6.2 ssl/7.2.2 dc/8.2.2 node-sdk/${cl.getVersion()} node/${
192
+ process.version
193
+ }`,
194
+ );
195
+ });
196
+ });
197
+
198
+ describe("#.setURL", () => {
199
+ it("validate http socket url", () => {
200
+ const url = cl.setURL(CNR_CONNECTION_URL_PROXY).getURL();
201
+ expect(url).to.equal(CNR_CONNECTION_URL_PROXY);
202
+ cl.setURL(CNR_CONNECTION_URL_LIVE);
203
+ });
204
+ });
205
+
206
+ describe("#.saveSession/reuseSession", () => {
207
+ after(() => {
208
+ cl.reuseSession({});
209
+ });
210
+
211
+ it("validate correct settings", async () => {
212
+ const sessionobj = {};
213
+ const tpl = new Response(rtm.getTemplate("login200").getPlain(), cmd);
214
+ nock(oteHost).post(apiScript).reply(200, tpl.getPlain());
215
+ cl.useOTESystem().setCredentials(
216
+ process.env.CNR_TEST_USER || "",
217
+ process.env.CNR_TEST_PASSWORD || "",
218
+ );
219
+ const r = await cl.login();
220
+ cl.saveSession(sessionobj);
221
+ expect(r).to.be.instanceOf(Response);
222
+ expect(r.isSuccess()).to.be.true;
223
+ const rec = r.getRecord(0);
224
+ expect(rec).not.to.be.null;
225
+ const cl2 = new APIClient();
226
+ cl2.reuseSession(sessionobj);
227
+ const tmp = cl2.getPOSTData({
228
+ COMMAND: "StatusAccount",
229
+ });
230
+ expect(tmp).to.include("s_sessionid");
231
+ });
232
+ });
233
+
234
+ describe("#.setCredentials", () => {
235
+ it("validate getPOSTData response [credentials set] ", () => {
236
+ cl.setCredentials("myaccountid", "mypassword");
237
+ const tmp = cl.getPOSTData({
238
+ COMMAND: "StatusAccount",
239
+ });
240
+ expect(tmp).to.equal(
241
+ "s_login=myaccountid&s_pw=mypassword&s_command=COMMAND%3DStatusAccount",
242
+ );
243
+ });
244
+
245
+ it("validate getPOSTData response [session reset]", () => {
246
+ cl.setCredentials("", "");
247
+ const tmp = cl.getPOSTData({
248
+ COMMAND: "StatusAccount",
249
+ });
250
+ expect(tmp).to.equal("s_command=COMMAND%3DStatusAccount");
251
+ });
252
+ });
253
+
254
+ describe("#.setRoleCredentials", () => {
255
+ it("validate getPOSTData response [role credentials set] ", () => {
256
+ cl.setRoleCredentials("myaccountid", "myroleid", "mypassword");
257
+ const tmp = cl.getPOSTData({
258
+ COMMAND: "StatusAccount",
259
+ });
260
+ expect(tmp).to.equal(
261
+ "s_login=myaccountid%3Amyroleid&s_pw=mypassword&s_command=COMMAND%3DStatusAccount",
262
+ );
263
+ });
264
+
265
+ it("validate getPOSTData response [role credentials reset]", () => {
266
+ cl.setRoleCredentials("", "", "");
267
+ const tmp = cl.getPOSTData({
268
+ COMMAND: "StatusAccount",
269
+ });
270
+ expect(tmp).to.equal("s_command=COMMAND%3DStatusAccount");
271
+ });
272
+ });
273
+
274
+ describe("#.login", () => {
275
+ it("validate against mocked API response [login succeeded; no role used]", async () => {
276
+ const tpl = new Response(rtm.getTemplate("login200").getPlain(), cmd);
277
+ nock(oteHost).post(apiScript).reply(200, tpl.getPlain());
278
+ cl.useOTESystem().setCredentials(
279
+ process.env.CNR_TEST_USER || "",
280
+ process.env.CNR_TEST_PASSWORD || "",
281
+ );
282
+ const r = await cl.login();
283
+ expect(r).to.be.instanceOf(Response);
284
+ expect(r.isSuccess()).to.be.true;
285
+ const rec = r.getRecord(0);
286
+ expect(rec).not.to.be.null;
287
+ if (rec) {
288
+ const rec2 = tpl.getRecord(0);
289
+ expect(rec2).not.to.be.null;
290
+ if (rec2) {
291
+ expect(rec.getDataByKey("SESSIONID")).to.equal(
292
+ rec2.getDataByKey("SESSIONID"),
293
+ );
294
+ }
295
+ }
296
+ });
297
+
298
+ it("validate against mocked API response [login failed; wrong credentials]", async () => {
299
+ nock(oteHost)
300
+ .post(apiScript)
301
+ .reply(200, rtm.getTemplate("login500").getPlain());
302
+ cl.setCredentials("test.user", "WRONGPASSWORD");
303
+ const r = await cl.login();
304
+ expect(r).to.be.instanceOf(Response);
305
+ expect(r.isError()).to.be.true;
306
+ });
307
+
308
+ // deactivated as delayConnection is not working together with node-fetch
309
+ it.skip("validate against mocked API response [login failed; http timeout]", async () => {
310
+ nock.cleanAll();
311
+ const tpl = rtm.getTemplate("httperror");
312
+ nock(oteHost)
313
+ .post(apiScript)
314
+ .delayConnection(APIClient.socketTimeout + 1000)
315
+ .reply(200, tpl.getPlain());
316
+ cl.setCredentials("test.user", "WRONGPASSWORD");
317
+ const r = await cl.login();
318
+ expect(r).to.be.instanceOf(Response);
319
+ expect(r.isTmpError()).to.be.true;
320
+ expect(r.getDescription()).to.equal(tpl.getDescription());
321
+ });
322
+
323
+ it("validate against mocked API response [login succeeded; no session returned] ", async () => {
324
+ // this case cannot really happen as the api always returns SESSIONID property.
325
+ // this case is just to increase coverage
326
+ const tpl = new Response(rtm.getTemplate("OK").getPlain(), cmd);
327
+ nock(oteHost).post(apiScript).reply(200, tpl.getPlain());
328
+ cl.useOTESystem().setCredentials(
329
+ process.env.CNR_TEST_USER || "",
330
+ process.env.CNR_TEST_PASSWORD || "",
331
+ );
332
+ const r = await cl.login();
333
+ expect(r).to.be.instanceOf(Response);
334
+ expect(r.isSuccess()).to.be.true;
335
+ const rec = r.getRecord(0);
336
+ expect(rec).to.be.null;
337
+ });
338
+ });
339
+
340
+ describe("#.logout", () => {
341
+ it("validate against mocked API response [logout succeeded]", async () => {
342
+ nock(oteHost)
343
+ .post(apiScript)
344
+ .reply(200, rtm.getTemplate("OK").getPlain());
345
+
346
+ // Perform login to establish a session
347
+ cl.reuseSession({
348
+ socketconfig: { login: "myaccountid", session: "12345678" },
349
+ });
350
+ // Perform logout
351
+ const logoutResponse = await cl.logout();
352
+ console.log(
353
+ "Logout Response:",
354
+ cl.getPOSTData({ COMMAND: "StatusAccount" }),
355
+ );
356
+ expect(logoutResponse).to.be.instanceOf(Response);
357
+ expect(logoutResponse.isSuccess()).to.be.true;
358
+ });
359
+
360
+ it("validate against mocked API response [logout failed; session no longer exists]", async () => {
361
+ const tpl = new Response(rtm.getTemplate("login200").getPlain(), cmd);
362
+ nock(oteHost)
363
+ .post(apiScript)
364
+ .reply(200, rtm.getTemplate("login500").getPlain());
365
+
366
+ const rec2 = tpl.getRecord(0);
367
+ expect(rec2).not.to.be.null;
368
+ if (rec2) {
369
+ const sessid = rec2.getDataByKey("SESSIONID");
370
+ expect(sessid).not.to.be.null;
371
+ if (sessid) {
372
+ cl.enableDebugMode();
373
+ const r = await cl.logout();
374
+ expect(r).to.be.instanceOf(Response);
375
+ expect(r.isError()).to.be.true;
376
+ }
377
+ }
378
+ });
379
+ });
380
+
381
+ describe("#.request", () => {
382
+ // TODO additional test for statusMessage - not supported through nock [https://github.com/nock/nock/issues/558]
383
+ it("validate against mocked API response [200 < r.statusCode > 299]", async () => {
384
+ const tpl2 = new Response(rtm.getTemplate("httperror").getPlain(), cmd);
385
+ nock(oteHost)
386
+ .post(apiScript)
387
+ .reply(404, rtm.getTemplate("404").getPlain());
388
+ cl.enableDebugMode()
389
+ .setCredentials(
390
+ process.env.CNR_TEST_USER || "",
391
+ process.env.CNR_TEST_PASSWORD || "",
392
+ )
393
+ .useOTESystem();
394
+ const r = await cl.request(cmd);
395
+ expect(r).to.be.instanceOf(Response);
396
+ expect(r.isTmpError()).to.be.true;
397
+ expect(r.getCode()).to.equal(tpl2.getCode());
398
+ expect(r.getDescription()).to.equal(tpl2.getDescription());
399
+ });
400
+
401
+ it("validate against mocked API response [200 < r.statusCode > 299, no debug]", async () => {
402
+ const tpl2 = new Response(rtm.getTemplate("httperror").getPlain(), cmd);
403
+ nock(oteHost)
404
+ .post(apiScript)
405
+ .reply(404, rtm.getTemplate("404").getPlain());
406
+ cl.disableDebugMode();
407
+ const r = await cl.request(cmd);
408
+ expect(r).to.be.instanceOf(Response);
409
+ expect(r.isTmpError()).to.be.true;
410
+ expect(r.getCode()).to.equal(tpl2.getCode());
411
+ expect(r.getDescription()).to.equal(tpl2.getDescription());
412
+ });
413
+
414
+ it("test if flattening of nested array / bulk parameters works", async () => {
415
+ nock(oteHost)
416
+ .post(apiScript)
417
+ .reply(200, rtm.getTemplate("OK").getPlain());
418
+ cl.enableDebugMode();
419
+ const r = await cl.request({
420
+ COMMAND: "CheckDomains",
421
+ DOMAIN: ["example.com", "example.net"],
422
+ });
423
+ expect(r).to.be.instanceOf(Response);
424
+ const mycmd = r.getCommand();
425
+ const keys = Object.keys(mycmd);
426
+ expect(keys.includes("DOMAIN")).to.be.false;
427
+ expect(keys.includes("DOMAIN0")).to.be.true;
428
+ expect(keys.includes("DOMAIN1")).to.be.true;
429
+ expect(mycmd.DOMAIN0).to.equal("example.com");
430
+ expect(mycmd.DOMAIN1).to.equal("example.net");
431
+ });
432
+
433
+ it("test if auto-idn convert works on domains", async () => {
434
+ nock.cleanAll();
435
+ const r = await cl.request({
436
+ COMMAND: "CheckDomains",
437
+ DOMAIN: ["example.com", "dömäin.example", "example.net"],
438
+ });
439
+ expect(r).to.be.instanceOf(Response);
440
+ const mycmd = r.getCommand();
441
+
442
+ const keys = Object.keys(mycmd);
443
+ expect(keys.includes("DOMAIN")).to.be.false;
444
+ expect(keys.includes("DOMAIN0")).to.be.true;
445
+ expect(keys.includes("DOMAIN1")).to.be.true;
446
+ expect(keys.includes("DOMAIN2")).to.be.true;
447
+ expect(mycmd.DOMAIN0).to.equal("example.com");
448
+ expect(mycmd.DOMAIN1).to.equal("dömäin.example");
449
+ expect(mycmd.DOMAIN2).to.equal("example.net");
450
+ });
451
+
452
+ it("test if auto-idn convert works on dnszone", () => {
453
+ cl.setRoleCredentials("myaccountid", "myroleid", "mypassword");
454
+ const tmp = cl.getPOSTData({
455
+ COMMAND: "StatusDNSZone",
456
+ DNSZONE: "hallööö.com",
457
+ });
458
+ expect(tmp).to.equal(
459
+ "s_login=myaccountid%3Amyroleid&s_pw=mypassword&s_command=COMMAND%3DStatusDNSZone%0ADNSZONE%3Dhall%C3%B6%C3%B6%C3%B6.com",
460
+ );
461
+ });
462
+ });
463
+
464
+ describe("#.requestNextResponsePage", () => {
465
+ it("validate against mocked API response [no LAST set]", async () => {
466
+ nock(oteHost)
467
+ .post(apiScript)
468
+ .reply(200, rtm.getTemplate("listP1").getPlain());
469
+ const r = new Response(rtm.getTemplate("listP0").getPlain(), {
470
+ COMMAND: "QueryDomainList",
471
+ LIMIT: 2,
472
+ FIRST: 0,
473
+ });
474
+ const nr = await cl.requestNextResponsePage(r);
475
+ expect(r.isSuccess()).to.be.true;
476
+ expect(r.getRecordsLimitation()).to.equal(2);
477
+ expect(r.getRecordsCount()).to.equal(2);
478
+ expect(r.getFirstRecordIndex()).to.equal(0);
479
+ expect(r.getLastRecordIndex()).to.equal(1);
480
+ expect(nr).not.to.be.null;
481
+ if (nr) {
482
+ expect(nr.isSuccess()).to.be.true;
483
+ expect(nr.getRecordsLimitation()).to.equal(2);
484
+ expect(nr.getRecordsCount()).to.equal(2);
485
+ expect(nr.getFirstRecordIndex()).to.equal(2);
486
+ expect(nr.getLastRecordIndex()).to.equal(3);
487
+ }
488
+ });
489
+
490
+ it("validate against mocked API response [LAST set]", () => {
491
+ const r = new Response(rtm.getTemplate("listP0").getPlain(), {
492
+ COMMAND: "QueryDomainList",
493
+ LIMIT: 2,
494
+ FIRST: 0,
495
+ LAST: 1,
496
+ });
497
+ return expect(cl.requestNextResponsePage(r)).to.be.rejectedWith(
498
+ Error,
499
+ "Parameter LAST in use. Please remove it to avoid issues in requestNextPage.",
500
+ );
501
+ });
502
+
503
+ it("validate against mocked API response [no FIRST set]", async () => {
504
+ nock(oteHost)
505
+ .post(apiScript)
506
+ .reply(200, rtm.getTemplate("listP1").getPlain());
507
+ cl.disableDebugMode();
508
+ const r = new Response(rtm.getTemplate("listP0").getPlain(), {
509
+ COMMAND: "QueryDomainList",
510
+ LIMIT: 2,
511
+ });
512
+ const nr = await cl.requestNextResponsePage(r);
513
+ expect(r.isSuccess()).to.be.true;
514
+ expect(r.getRecordsLimitation()).to.equal(2);
515
+ expect(r.getRecordsCount()).to.equal(2);
516
+ expect(r.getFirstRecordIndex()).to.equal(0);
517
+ expect(r.getLastRecordIndex()).to.equal(1);
518
+ expect(nr).not.to.be.null;
519
+ if (nr) {
520
+ expect(nr.isSuccess()).to.be.true;
521
+ expect(nr.getRecordsLimitation()).to.equal(2);
522
+ expect(nr.getRecordsCount()).to.equal(2);
523
+ expect(nr.getFirstRecordIndex()).to.equal(2);
524
+ expect(nr.getLastRecordIndex()).to.equal(3);
525
+ }
526
+ });
527
+ });
528
+
529
+ describe("#.requestAllResponsePages", () => {
530
+ it("validate against mocked API response [success case]", async () => {
531
+ let reqcount = 0;
532
+ const scope = nock(oteHost)
533
+ .persist()
534
+ .post(apiScript)
535
+ .reply(200, () => {
536
+ reqcount++;
537
+ if (reqcount === 1) {
538
+ return rtm.getTemplate("listFP0").getPlain();
539
+ }
540
+ if (reqcount === 2) {
541
+ return rtm.getTemplate("listFP1").getPlain();
542
+ }
543
+ return rtm.getTemplate("listFP2").getPlain();
544
+ });
545
+ const nr = await cl.requestAllResponsePages({
546
+ COMMAND: "QueryDomainList",
547
+ FIRST: 0,
548
+ LIMIT: 1,
549
+ });
550
+ expect(nr.length).to.equal(4);
551
+ scope.persist(false);
552
+ });
553
+ });
554
+
555
+ describe("#.setUserView", () => {
556
+ it("validate against mocked API response", async () => {
557
+ nock(oteHost)
558
+ .post(apiScript)
559
+ .reply(200, rtm.getTemplate("subUserSet").getPlain());
560
+ cl.setUserView("sub1");
561
+ cl.enableDebugMode();
562
+ const r = await cl.request({ COMMAND: "StatusAccount" });
563
+ console.log("Response:", r);
564
+ expect(r).to.be.instanceOf(Response);
565
+ expect(r.isSuccess()).to.be.true;
566
+ });
567
+ });
568
+
569
+ describe("#.resetUserView", () => {
570
+ it("validate against mocked API response", async () => {
571
+ nock(oteHost)
572
+ .post(apiScript)
573
+ .reply(200, rtm.getTemplate("subUserReset").getPlain());
574
+ cl.resetUserView();
575
+ const r = await cl.request({ COMMAND: "StatusAccount" });
576
+ expect(r).to.be.instanceOf(Response);
577
+ expect(r.isSuccess()).to.be.true;
578
+ });
579
+ });
580
+
581
+ describe("#.setProxy", () => {
582
+ it("test setting proxy works", () => {
583
+ cl.setProxy("127.0.0.1");
584
+ expect(cl.getProxy()).to.equal("127.0.0.1");
585
+ cl.setProxy("");
586
+ });
587
+ });
588
+
589
+ describe("#.setReferer", () => {
590
+ it("test setting referer works", () => {
591
+ cl.setReferer("https://www.centralnicreseller.com");
592
+ expect(cl.getReferer()).to.equal("https://www.centralnicreseller.com");
593
+ cl.setReferer("");
594
+ });
595
+ });
596
+
597
+ describe("#.useHighPerformanceConnectionSetup", () => {
598
+ it("test setting high performance connection setup works", () => {
599
+ cl.useHighPerformanceConnectionSetup();
600
+ expect(cl.getURL()).to.equal(CNR_CONNECTION_URL_PROXY);
601
+ });
602
+ });
603
+
604
+ describe("#.useDefaultConnectionSetup", () => {
605
+ it("test setting default connection setup works", () => {
606
+ cl.useDefaultConnectionSetup();
607
+ expect(cl.getURL()).to.equal(CNR_CONNECTION_URL_LIVE);
608
+ });
609
+ });
610
+ });
package/tests/app.js ADDED
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ import { APIClient } from "../dist/apiclient.js";
4
+
5
+ const cl = new APIClient();
6
+
7
+ // choose endpoint system and set credentials
8
+ cl.useOTESystem();
9
+ cl.setCredentials(
10
+ process.env.CNR_TEST_USER || "",
11
+ process.env.CNR_TEST_PASSWORD || "",
12
+ );
13
+ cl.enableDebugMode();
14
+ // SESSION LESS
15
+ let r = await cl.request({
16
+ COMMAND: "StatusAccount",
17
+ });
18
+
19
+ console.dir(r.getPlain());
20
+ console.dir(r.getHash());
21
+ console.dir(r.getListHash());
22
+
23
+ // SESSION BASED
24
+ // optional: access on a subuser account
25
+ // cl.setUserView("...");
26
+
27
+ // --- Perform Login ---
28
+ r = await cl.login();
29
+ if (r.isSuccess()) {
30
+ console.log("LOGIN -> SUCCEEDED");
31
+
32
+ // --- Perform API requests reusing the API session ---
33
+ r = await cl.request({
34
+ COMMAND: "StatusAccount",
35
+ });
36
+ console.dir(r.getHash());
37
+
38
+ // --- Perform Logout ---
39
+ r = await cl.logout();
40
+ if (r.isSuccess()) {
41
+ console.log("LOGOUT -> SUCCEEDED");
42
+ } else {
43
+ console.log("LOGOUT -> FAILED");
44
+ }
45
+ } else {
46
+ console.log("LOGIN -> FAILED");
47
+ }
@@ -0,0 +1,23 @@
1
+ import { expect } from "chai";
2
+ import "mocha";
3
+ import { Column } from "../src/column.ts";
4
+
5
+ let col: Column;
6
+
7
+ before(() => {
8
+ col = new Column("DOMAIN", [
9
+ "mydomain1.com",
10
+ "mydomain2.com",
11
+ "mydomain3.com",
12
+ ]);
13
+ });
14
+
15
+ describe("Column class", function () {
16
+ this.slow(1000);
17
+
18
+ describe("#.getKey", () => {
19
+ it("check return value", () => {
20
+ expect(col.getKey()).to.equal("DOMAIN");
21
+ });
22
+ });
23
+ });
@@ -0,0 +1,22 @@
1
+ import { expect } from "chai";
2
+ import "mocha";
3
+ import { APIClient, Response, ResponseTemplateManager } from "../src/index.ts";
4
+
5
+ describe("index file", function () {
6
+ this.slow(1000);
7
+
8
+ it("check access to APIClient class", () => {
9
+ const cl = new APIClient();
10
+ expect(cl).to.be.instanceOf(APIClient);
11
+ });
12
+
13
+ it("check access to Response class", () => {
14
+ const cl = new Response("", { COMMAND: "StatusAccount" });
15
+ expect(cl).to.be.instanceOf(Response);
16
+ });
17
+
18
+ it("check access to ResponseTemplateManager class", () => {
19
+ const cl = ResponseTemplateManager.getInstance();
20
+ expect(cl).to.be.instanceOf(ResponseTemplateManager);
21
+ });
22
+ });