llng-mcp 0.1.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 (114) hide show
  1. package/.github/workflows/ci.yml +77 -0
  2. package/.prettierrc +7 -0
  3. package/LICENSE +661 -0
  4. package/README.md +502 -0
  5. package/dist/__tests__/api-transport.test.d.ts +1 -0
  6. package/dist/__tests__/api-transport.test.js +577 -0
  7. package/dist/__tests__/api-transport.test.js.map +1 -0
  8. package/dist/__tests__/config.test.d.ts +1 -0
  9. package/dist/__tests__/config.test.js +472 -0
  10. package/dist/__tests__/config.test.js.map +1 -0
  11. package/dist/__tests__/integration/api-mode.test.d.ts +1 -0
  12. package/dist/__tests__/integration/api-mode.test.js +199 -0
  13. package/dist/__tests__/integration/api-mode.test.js.map +1 -0
  14. package/dist/__tests__/integration/oidc-rp.test.d.ts +1 -0
  15. package/dist/__tests__/integration/oidc-rp.test.js +120 -0
  16. package/dist/__tests__/integration/oidc-rp.test.js.map +1 -0
  17. package/dist/__tests__/integration/ssh-mode.test.d.ts +1 -0
  18. package/dist/__tests__/integration/ssh-mode.test.js +101 -0
  19. package/dist/__tests__/integration/ssh-mode.test.js.map +1 -0
  20. package/dist/__tests__/k8s-transport.test.d.ts +1 -0
  21. package/dist/__tests__/k8s-transport.test.js +254 -0
  22. package/dist/__tests__/k8s-transport.test.js.map +1 -0
  23. package/dist/__tests__/oidc-tools.test.d.ts +1 -0
  24. package/dist/__tests__/oidc-tools.test.js +457 -0
  25. package/dist/__tests__/oidc-tools.test.js.map +1 -0
  26. package/dist/__tests__/registry.test.d.ts +1 -0
  27. package/dist/__tests__/registry.test.js +96 -0
  28. package/dist/__tests__/registry.test.js.map +1 -0
  29. package/dist/__tests__/ssh-transport.test.d.ts +1 -0
  30. package/dist/__tests__/ssh-transport.test.js +618 -0
  31. package/dist/__tests__/ssh-transport.test.js.map +1 -0
  32. package/dist/__tests__/tools.test.d.ts +1 -0
  33. package/dist/__tests__/tools.test.js +525 -0
  34. package/dist/__tests__/tools.test.js.map +1 -0
  35. package/dist/config.d.ts +65 -0
  36. package/dist/config.js +506 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +42 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/resources/documentation.d.ts +5 -0
  42. package/dist/resources/documentation.js +56 -0
  43. package/dist/resources/documentation.js.map +1 -0
  44. package/dist/tools/cli-utilities.d.ts +3 -0
  45. package/dist/tools/cli-utilities.js +187 -0
  46. package/dist/tools/cli-utilities.js.map +1 -0
  47. package/dist/tools/config.d.ts +6 -0
  48. package/dist/tools/config.js +326 -0
  49. package/dist/tools/config.js.map +1 -0
  50. package/dist/tools/consents.d.ts +3 -0
  51. package/dist/tools/consents.js +39 -0
  52. package/dist/tools/consents.js.map +1 -0
  53. package/dist/tools/instances.d.ts +3 -0
  54. package/dist/tools/instances.js +14 -0
  55. package/dist/tools/instances.js.map +1 -0
  56. package/dist/tools/oidc-rp.d.ts +6 -0
  57. package/dist/tools/oidc-rp.js +246 -0
  58. package/dist/tools/oidc-rp.js.map +1 -0
  59. package/dist/tools/oidc.d.ts +3 -0
  60. package/dist/tools/oidc.js +343 -0
  61. package/dist/tools/oidc.js.map +1 -0
  62. package/dist/tools/secondfactors.d.ts +3 -0
  63. package/dist/tools/secondfactors.js +62 -0
  64. package/dist/tools/secondfactors.js.map +1 -0
  65. package/dist/tools/sessions.d.ts +6 -0
  66. package/dist/tools/sessions.js +300 -0
  67. package/dist/tools/sessions.js.map +1 -0
  68. package/dist/transport/api.d.ts +35 -0
  69. package/dist/transport/api.js +327 -0
  70. package/dist/transport/api.js.map +1 -0
  71. package/dist/transport/interface.d.ts +50 -0
  72. package/dist/transport/interface.js +2 -0
  73. package/dist/transport/interface.js.map +1 -0
  74. package/dist/transport/k8s.d.ts +41 -0
  75. package/dist/transport/k8s.js +303 -0
  76. package/dist/transport/k8s.js.map +1 -0
  77. package/dist/transport/registry.d.ts +20 -0
  78. package/dist/transport/registry.js +91 -0
  79. package/dist/transport/registry.js.map +1 -0
  80. package/dist/transport/ssh.d.ts +37 -0
  81. package/dist/transport/ssh.js +353 -0
  82. package/dist/transport/ssh.js.map +1 -0
  83. package/docker-compose.test.yml +16 -0
  84. package/eslint.config.js +21 -0
  85. package/package.json +38 -0
  86. package/src/__tests__/api-transport.test.ts +746 -0
  87. package/src/__tests__/config.test.ts +587 -0
  88. package/src/__tests__/integration/api-mode.test.ts +229 -0
  89. package/src/__tests__/integration/oidc-rp.test.ts +138 -0
  90. package/src/__tests__/integration/ssh-mode.test.ts +113 -0
  91. package/src/__tests__/k8s-transport.test.ts +342 -0
  92. package/src/__tests__/oidc-tools.test.ts +554 -0
  93. package/src/__tests__/registry.test.ts +110 -0
  94. package/src/__tests__/ssh-transport.test.ts +805 -0
  95. package/src/__tests__/tools.test.ts +735 -0
  96. package/src/config.ts +605 -0
  97. package/src/index.ts +48 -0
  98. package/src/resources/documentation.ts +65 -0
  99. package/src/tools/cli-utilities.ts +207 -0
  100. package/src/tools/config.ts +382 -0
  101. package/src/tools/consents.ts +50 -0
  102. package/src/tools/instances.ts +21 -0
  103. package/src/tools/oidc-rp.ts +299 -0
  104. package/src/tools/oidc.ts +434 -0
  105. package/src/tools/secondfactors.ts +78 -0
  106. package/src/tools/sessions.ts +342 -0
  107. package/src/transport/api.ts +429 -0
  108. package/src/transport/interface.ts +58 -0
  109. package/src/transport/k8s.ts +367 -0
  110. package/src/transport/registry.ts +105 -0
  111. package/src/transport/ssh.ts +430 -0
  112. package/tsconfig.json +16 -0
  113. package/vitest.config.ts +8 -0
  114. package/vitest.integration.config.ts +9 -0
@@ -0,0 +1,577 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { ApiTransport } from "../transport/api.js";
3
+ // Helper function to mock fetch response
4
+ function mockFetchResponse(data, ok = true, status = 200) {
5
+ return {
6
+ ok,
7
+ status,
8
+ statusText: ok ? "OK" : "Error",
9
+ json: () => Promise.resolve(data),
10
+ text: () => Promise.resolve(JSON.stringify(data)),
11
+ headers: new Headers({ "content-type": "application/json" }),
12
+ };
13
+ }
14
+ describe("ApiTransport", () => {
15
+ let originalFetch;
16
+ beforeEach(() => {
17
+ originalFetch = global.fetch;
18
+ });
19
+ afterEach(() => {
20
+ global.fetch = originalFetch;
21
+ vi.restoreAllMocks();
22
+ });
23
+ describe("constructor", () => {
24
+ it("should strip trailing slash from baseUrl", () => {
25
+ const transport = new ApiTransport({
26
+ baseUrl: "https://auth.example.com/",
27
+ verifySsl: true,
28
+ });
29
+ // Verify by making a request and checking the URL
30
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse({ cfgNum: 1 }));
31
+ global.fetch = mockFetch;
32
+ transport.configInfo();
33
+ expect(mockFetch).toHaveBeenCalledWith("https://auth.example.com/api/v1/config/latest", expect.any(Object));
34
+ });
35
+ });
36
+ describe("authentication", () => {
37
+ it("should add Basic auth header when basicAuth is configured", async () => {
38
+ const transport = new ApiTransport({
39
+ baseUrl: "https://auth.example.com",
40
+ basicAuth: { username: "admin", password: "secret" },
41
+ verifySsl: true,
42
+ });
43
+ const mockFetch = vi
44
+ .fn()
45
+ .mockResolvedValue(mockFetchResponse({ cfgNum: 1, cfgAuthor: "admin", cfgDate: 123456 }));
46
+ global.fetch = mockFetch;
47
+ await transport.configInfo();
48
+ const expectedAuth = Buffer.from("admin:secret").toString("base64");
49
+ expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
50
+ headers: expect.objectContaining({
51
+ Authorization: `Basic ${expectedAuth}`,
52
+ }),
53
+ }));
54
+ });
55
+ it("should not add auth header when basicAuth is not configured", async () => {
56
+ const transport = new ApiTransport({
57
+ baseUrl: "https://auth.example.com",
58
+ verifySsl: true,
59
+ });
60
+ const mockFetch = vi
61
+ .fn()
62
+ .mockResolvedValue(mockFetchResponse({ cfgNum: 1, cfgAuthor: "admin", cfgDate: 123456 }));
63
+ global.fetch = mockFetch;
64
+ await transport.configInfo();
65
+ const callArgs = mockFetch.mock.calls[0][1];
66
+ const headers = callArgs.headers;
67
+ expect(headers["Authorization"]).toBeUndefined();
68
+ });
69
+ });
70
+ describe("error handling", () => {
71
+ it("should throw error on HTTP error response", async () => {
72
+ const transport = new ApiTransport({
73
+ baseUrl: "https://auth.example.com",
74
+ verifySsl: true,
75
+ });
76
+ const mockFetch = vi
77
+ .fn()
78
+ .mockResolvedValue(mockFetchResponse({ error: "Not found" }, false, 404));
79
+ global.fetch = mockFetch;
80
+ await expect(transport.configInfo()).rejects.toThrow("API request failed");
81
+ });
82
+ });
83
+ describe("configInfo", () => {
84
+ it("should fetch config metadata", async () => {
85
+ const transport = new ApiTransport({
86
+ baseUrl: "https://auth.example.com",
87
+ verifySsl: true,
88
+ });
89
+ const configData = {
90
+ cfgNum: 5,
91
+ cfgAuthor: "admin",
92
+ cfgDate: 1234567890,
93
+ cfgLog: "Test update",
94
+ otherField: "ignored",
95
+ };
96
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse(configData));
97
+ global.fetch = mockFetch;
98
+ const result = await transport.configInfo();
99
+ expect(mockFetch).toHaveBeenCalledWith("https://auth.example.com/api/v1/config/latest", expect.any(Object));
100
+ expect(result).toEqual({
101
+ cfgNum: 5,
102
+ cfgAuthor: "admin",
103
+ cfgDate: 1234567890,
104
+ cfgLog: "Test update",
105
+ });
106
+ });
107
+ });
108
+ describe("configGet", () => {
109
+ it("should return only requested keys", async () => {
110
+ const transport = new ApiTransport({
111
+ baseUrl: "https://auth.example.com",
112
+ verifySsl: true,
113
+ });
114
+ const configData = {
115
+ cfgNum: 5,
116
+ portal: "https://portal.example.com",
117
+ domain: "example.com",
118
+ timeout: 3600,
119
+ extraField: "not requested",
120
+ };
121
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse(configData));
122
+ global.fetch = mockFetch;
123
+ const result = await transport.configGet(["portal", "domain"]);
124
+ expect(result).toEqual({
125
+ portal: "https://portal.example.com",
126
+ domain: "example.com",
127
+ });
128
+ expect(result).not.toHaveProperty("timeout");
129
+ expect(result).not.toHaveProperty("extraField");
130
+ });
131
+ });
132
+ describe("configSet", () => {
133
+ it("should merge pairs and PUT updated config", async () => {
134
+ const transport = new ApiTransport({
135
+ baseUrl: "https://auth.example.com",
136
+ verifySsl: true,
137
+ });
138
+ const currentConfig = {
139
+ cfgNum: 5,
140
+ portal: "https://portal.example.com",
141
+ domain: "example.com",
142
+ };
143
+ const mockFetch = vi
144
+ .fn()
145
+ .mockResolvedValueOnce(mockFetchResponse(currentConfig))
146
+ .mockResolvedValueOnce(mockFetchResponse({ success: true }));
147
+ global.fetch = mockFetch;
148
+ await transport.configSet({ domain: "newdomain.com", timeout: 7200 });
149
+ expect(mockFetch).toHaveBeenCalledTimes(2);
150
+ expect(mockFetch.mock.calls[0][0]).toBe("https://auth.example.com/api/v1/config/latest");
151
+ expect(mockFetch.mock.calls[1][0]).toBe("https://auth.example.com/api/v1/config");
152
+ expect(mockFetch.mock.calls[1][1].method).toBe("PUT");
153
+ const body = JSON.parse(mockFetch.mock.calls[1][1].body);
154
+ expect(body).toEqual({
155
+ cfgNum: 5,
156
+ portal: "https://portal.example.com",
157
+ domain: "newdomain.com",
158
+ timeout: 7200,
159
+ });
160
+ });
161
+ it("should add cfgLog when log parameter is provided", async () => {
162
+ const transport = new ApiTransport({
163
+ baseUrl: "https://auth.example.com",
164
+ verifySsl: true,
165
+ });
166
+ const currentConfig = {
167
+ cfgNum: 5,
168
+ portal: "https://portal.example.com",
169
+ };
170
+ const mockFetch = vi
171
+ .fn()
172
+ .mockResolvedValueOnce(mockFetchResponse(currentConfig))
173
+ .mockResolvedValueOnce(mockFetchResponse({ success: true }));
174
+ global.fetch = mockFetch;
175
+ await transport.configSet({ domain: "example.com" }, "Added domain");
176
+ const body = JSON.parse(mockFetch.mock.calls[1][1].body);
177
+ expect(body.cfgLog).toBe("Added domain");
178
+ });
179
+ });
180
+ describe("configAddKey", () => {
181
+ it("should add subkey to nested object", async () => {
182
+ const transport = new ApiTransport({
183
+ baseUrl: "https://auth.example.com",
184
+ verifySsl: true,
185
+ });
186
+ const currentConfig = {
187
+ cfgNum: 5,
188
+ locationRules: {
189
+ default: "accept",
190
+ },
191
+ };
192
+ const mockFetch = vi
193
+ .fn()
194
+ .mockResolvedValueOnce(mockFetchResponse(currentConfig))
195
+ .mockResolvedValueOnce(mockFetchResponse({ success: true }));
196
+ global.fetch = mockFetch;
197
+ await transport.configAddKey("locationRules", "admin.example.com", '$uid eq "admin"');
198
+ const body = JSON.parse(mockFetch.mock.calls[1][1].body);
199
+ expect(body.locationRules).toEqual({
200
+ default: "accept",
201
+ "admin.example.com": '$uid eq "admin"',
202
+ });
203
+ });
204
+ it("should initialize key if it does not exist", async () => {
205
+ const transport = new ApiTransport({
206
+ baseUrl: "https://auth.example.com",
207
+ verifySsl: true,
208
+ });
209
+ const currentConfig = {
210
+ cfgNum: 5,
211
+ portal: "https://portal.example.com",
212
+ };
213
+ const mockFetch = vi
214
+ .fn()
215
+ .mockResolvedValueOnce(mockFetchResponse(currentConfig))
216
+ .mockResolvedValueOnce(mockFetchResponse({ success: true }));
217
+ global.fetch = mockFetch;
218
+ await transport.configAddKey("locationRules", "default", "accept");
219
+ const body = JSON.parse(mockFetch.mock.calls[1][1].body);
220
+ expect(body.locationRules).toEqual({
221
+ default: "accept",
222
+ });
223
+ });
224
+ });
225
+ describe("configDelKey", () => {
226
+ it("should remove subkey from nested object", async () => {
227
+ const transport = new ApiTransport({
228
+ baseUrl: "https://auth.example.com",
229
+ verifySsl: true,
230
+ });
231
+ const currentConfig = {
232
+ cfgNum: 5,
233
+ locationRules: {
234
+ default: "accept",
235
+ "admin.example.com": '$uid eq "admin"',
236
+ },
237
+ };
238
+ const mockFetch = vi
239
+ .fn()
240
+ .mockResolvedValueOnce(mockFetchResponse(currentConfig))
241
+ .mockResolvedValueOnce(mockFetchResponse({ success: true }));
242
+ global.fetch = mockFetch;
243
+ await transport.configDelKey("locationRules", "admin.example.com");
244
+ const body = JSON.parse(mockFetch.mock.calls[1][1].body);
245
+ expect(body.locationRules).toEqual({
246
+ default: "accept",
247
+ });
248
+ });
249
+ it("should not fail when key does not exist", async () => {
250
+ const transport = new ApiTransport({
251
+ baseUrl: "https://auth.example.com",
252
+ verifySsl: true,
253
+ });
254
+ const currentConfig = {
255
+ cfgNum: 5,
256
+ locationRules: {
257
+ default: "accept",
258
+ },
259
+ };
260
+ const mockFetch = vi.fn().mockResolvedValueOnce(mockFetchResponse(currentConfig));
261
+ global.fetch = mockFetch;
262
+ await transport.configDelKey("locationRules", "nonexistent");
263
+ // Should only fetch, not PUT
264
+ expect(mockFetch).toHaveBeenCalledTimes(1);
265
+ });
266
+ });
267
+ describe("configSave", () => {
268
+ it("should return config as JSON string", async () => {
269
+ const transport = new ApiTransport({
270
+ baseUrl: "https://auth.example.com",
271
+ verifySsl: true,
272
+ });
273
+ const configData = {
274
+ cfgNum: 5,
275
+ portal: "https://portal.example.com",
276
+ domain: "example.com",
277
+ };
278
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse(configData));
279
+ global.fetch = mockFetch;
280
+ const result = await transport.configSave();
281
+ expect(result).toBe(JSON.stringify(configData, null, 2));
282
+ });
283
+ });
284
+ describe("configRestore", () => {
285
+ it("should PUT parsed JSON config", async () => {
286
+ const transport = new ApiTransport({
287
+ baseUrl: "https://auth.example.com",
288
+ verifySsl: true,
289
+ });
290
+ const configData = {
291
+ cfgNum: 5,
292
+ portal: "https://portal.example.com",
293
+ domain: "example.com",
294
+ };
295
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse({ success: true }));
296
+ global.fetch = mockFetch;
297
+ await transport.configRestore(JSON.stringify(configData));
298
+ expect(mockFetch).toHaveBeenCalledWith("https://auth.example.com/api/v1/config", expect.objectContaining({
299
+ method: "PUT",
300
+ body: JSON.stringify(configData),
301
+ }));
302
+ });
303
+ });
304
+ describe("configMerge", () => {
305
+ it("should deep merge JSON snippet with current config", async () => {
306
+ const transport = new ApiTransport({
307
+ baseUrl: "https://auth.example.com",
308
+ verifySsl: true,
309
+ });
310
+ const currentConfig = {
311
+ cfgNum: 5,
312
+ portal: "https://portal.example.com",
313
+ locationRules: {
314
+ default: "accept",
315
+ },
316
+ authParams: {
317
+ timeout: 3600,
318
+ },
319
+ };
320
+ const snippet = {
321
+ locationRules: {
322
+ "admin.example.com": '$uid eq "admin"',
323
+ },
324
+ authParams: {
325
+ maxRetries: 3,
326
+ },
327
+ };
328
+ const mockFetch = vi
329
+ .fn()
330
+ .mockResolvedValueOnce(mockFetchResponse(currentConfig))
331
+ .mockResolvedValueOnce(mockFetchResponse({ success: true }));
332
+ global.fetch = mockFetch;
333
+ await transport.configMerge(JSON.stringify(snippet));
334
+ const body = JSON.parse(mockFetch.mock.calls[1][1].body);
335
+ expect(body.locationRules).toEqual({
336
+ default: "accept",
337
+ "admin.example.com": '$uid eq "admin"',
338
+ });
339
+ expect(body.authParams).toEqual({
340
+ timeout: 3600,
341
+ maxRetries: 3,
342
+ });
343
+ });
344
+ });
345
+ describe("configRollback", () => {
346
+ it("should fetch previous config and PUT it", async () => {
347
+ const transport = new ApiTransport({
348
+ baseUrl: "https://auth.example.com",
349
+ verifySsl: true,
350
+ });
351
+ const currentConfig = {
352
+ cfgNum: 5,
353
+ portal: "https://portal.example.com",
354
+ };
355
+ const previousConfig = {
356
+ cfgNum: 4,
357
+ portal: "https://old-portal.example.com",
358
+ };
359
+ const mockFetch = vi
360
+ .fn()
361
+ .mockResolvedValueOnce(mockFetchResponse(currentConfig))
362
+ .mockResolvedValueOnce(mockFetchResponse(previousConfig))
363
+ .mockResolvedValueOnce(mockFetchResponse({ success: true }));
364
+ global.fetch = mockFetch;
365
+ await transport.configRollback();
366
+ expect(mockFetch).toHaveBeenCalledTimes(3);
367
+ expect(mockFetch.mock.calls[1][0]).toBe("https://auth.example.com/api/v1/config/4");
368
+ expect(mockFetch.mock.calls[2][0]).toBe("https://auth.example.com/api/v1/config");
369
+ const body = JSON.parse(mockFetch.mock.calls[2][1].body);
370
+ expect(body).toEqual(previousConfig);
371
+ });
372
+ it("should throw error when at cfgNum 1", async () => {
373
+ const transport = new ApiTransport({
374
+ baseUrl: "https://auth.example.com",
375
+ verifySsl: true,
376
+ });
377
+ const currentConfig = {
378
+ cfgNum: 1,
379
+ portal: "https://portal.example.com",
380
+ };
381
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse(currentConfig));
382
+ global.fetch = mockFetch;
383
+ await expect(transport.configRollback()).rejects.toThrow("Cannot rollback: already at first config");
384
+ });
385
+ });
386
+ describe("configUpdateCache", () => {
387
+ it("should be a no-op", async () => {
388
+ const transport = new ApiTransport({
389
+ baseUrl: "https://auth.example.com",
390
+ verifySsl: true,
391
+ });
392
+ const mockFetch = vi.fn();
393
+ global.fetch = mockFetch;
394
+ await transport.configUpdateCache();
395
+ expect(mockFetch).not.toHaveBeenCalled();
396
+ });
397
+ });
398
+ describe("sessionGet", () => {
399
+ it("should fetch session from global backend by default", async () => {
400
+ const transport = new ApiTransport({
401
+ baseUrl: "https://auth.example.com",
402
+ verifySsl: true,
403
+ });
404
+ const sessionData = {
405
+ _session_id: "abc123",
406
+ uid: "user1",
407
+ _startTime: 1234567890,
408
+ };
409
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse(sessionData));
410
+ global.fetch = mockFetch;
411
+ const result = await transport.sessionGet("abc123");
412
+ expect(mockFetch).toHaveBeenCalledWith("https://auth.example.com/api/v1/sessions/global/abc123", expect.any(Object));
413
+ expect(result).toEqual(sessionData);
414
+ });
415
+ it("should fetch session from specified backend", async () => {
416
+ const transport = new ApiTransport({
417
+ baseUrl: "https://auth.example.com",
418
+ verifySsl: true,
419
+ });
420
+ const sessionData = {
421
+ _session_id: "xyz789",
422
+ sub: "user@example.com",
423
+ };
424
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse(sessionData));
425
+ global.fetch = mockFetch;
426
+ await transport.sessionGet("xyz789", { backend: "oidc" });
427
+ expect(mockFetch).toHaveBeenCalledWith("https://auth.example.com/api/v1/sessions/oidc/xyz789", expect.any(Object));
428
+ });
429
+ });
430
+ describe("sessionSearch", () => {
431
+ it("should build query string with where clause", async () => {
432
+ const transport = new ApiTransport({
433
+ baseUrl: "https://auth.example.com",
434
+ verifySsl: true,
435
+ });
436
+ const sessionsData = {
437
+ session1: { uid: "user1", _startTime: 1234567890 },
438
+ session2: { uid: "user2", _startTime: 1234567891 },
439
+ };
440
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse(sessionsData));
441
+ global.fetch = mockFetch;
442
+ const result = await transport.sessionSearch({
443
+ where: { uid: "user1", ipAddr: "192.168.1.1" },
444
+ });
445
+ const expectedUrl = "https://auth.example.com/api/v1/sessions/global?where=uid%3Duser1%20AND%20ipAddr%3D192.168.1.1";
446
+ expect(mockFetch).toHaveBeenCalledWith(expectedUrl, expect.any(Object));
447
+ expect(result).toHaveLength(2);
448
+ expect(result[0]).toHaveProperty("id", "session1");
449
+ });
450
+ it("should handle select parameter", async () => {
451
+ const transport = new ApiTransport({
452
+ baseUrl: "https://auth.example.com",
453
+ verifySsl: true,
454
+ });
455
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse({}));
456
+ global.fetch = mockFetch;
457
+ await transport.sessionSearch({
458
+ select: ["uid", "_startTime"],
459
+ });
460
+ expect(mockFetch.mock.calls[0][0]).toContain("select=uid,_startTime");
461
+ });
462
+ it("should handle count parameter", async () => {
463
+ const transport = new ApiTransport({
464
+ baseUrl: "https://auth.example.com",
465
+ verifySsl: true,
466
+ });
467
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse({}));
468
+ global.fetch = mockFetch;
469
+ await transport.sessionSearch({
470
+ count: true,
471
+ });
472
+ expect(mockFetch.mock.calls[0][0]).toContain("count=1");
473
+ });
474
+ });
475
+ describe("sessionDelete", () => {
476
+ it("should DELETE each session ID", async () => {
477
+ const transport = new ApiTransport({
478
+ baseUrl: "https://auth.example.com",
479
+ verifySsl: true,
480
+ });
481
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse({ success: true }));
482
+ global.fetch = mockFetch;
483
+ await transport.sessionDelete(["session1", "session2", "session3"]);
484
+ expect(mockFetch).toHaveBeenCalledTimes(3);
485
+ expect(mockFetch.mock.calls[0][0]).toBe("https://auth.example.com/api/v1/sessions/global/session1");
486
+ expect(mockFetch.mock.calls[1][0]).toBe("https://auth.example.com/api/v1/sessions/global/session2");
487
+ expect(mockFetch.mock.calls[2][0]).toBe("https://auth.example.com/api/v1/sessions/global/session3");
488
+ mockFetch.mock.calls.forEach((call) => {
489
+ expect(call[1].method).toBe("DELETE");
490
+ });
491
+ });
492
+ it("should use specified backend", async () => {
493
+ const transport = new ApiTransport({
494
+ baseUrl: "https://auth.example.com",
495
+ verifySsl: true,
496
+ });
497
+ const mockFetch = vi.fn().mockResolvedValue(mockFetchResponse({ success: true }));
498
+ global.fetch = mockFetch;
499
+ await transport.sessionDelete(["session1"], { backend: "oidc" });
500
+ expect(mockFetch.mock.calls[0][0]).toBe("https://auth.example.com/api/v1/sessions/oidc/session1");
501
+ });
502
+ });
503
+ describe("deepMerge", () => {
504
+ it("should properly merge nested objects", async () => {
505
+ const transport = new ApiTransport({
506
+ baseUrl: "https://auth.example.com",
507
+ verifySsl: true,
508
+ });
509
+ const currentConfig = {
510
+ level1: {
511
+ level2: {
512
+ a: 1,
513
+ b: 2,
514
+ },
515
+ c: 3,
516
+ },
517
+ d: 4,
518
+ };
519
+ const snippet = {
520
+ level1: {
521
+ level2: {
522
+ b: 20,
523
+ e: 5,
524
+ },
525
+ f: 6,
526
+ },
527
+ g: 7,
528
+ };
529
+ const mockFetch = vi
530
+ .fn()
531
+ .mockResolvedValueOnce(mockFetchResponse(currentConfig))
532
+ .mockResolvedValueOnce(mockFetchResponse({ success: true }));
533
+ global.fetch = mockFetch;
534
+ await transport.configMerge(JSON.stringify(snippet));
535
+ const body = JSON.parse(mockFetch.mock.calls[1][1].body);
536
+ expect(body.level1.level2).toEqual({
537
+ a: 1,
538
+ b: 20,
539
+ e: 5,
540
+ });
541
+ expect(body.level1.c).toBe(3);
542
+ expect(body.level1.f).toBe(6);
543
+ expect(body.d).toBe(4);
544
+ expect(body.g).toBe(7);
545
+ });
546
+ it("should handle array replacement (not merge)", async () => {
547
+ const transport = new ApiTransport({
548
+ baseUrl: "https://auth.example.com",
549
+ verifySsl: true,
550
+ });
551
+ const currentConfig = {
552
+ arrayField: [1, 2, 3],
553
+ };
554
+ const snippet = {
555
+ arrayField: [4, 5],
556
+ };
557
+ const mockFetch = vi
558
+ .fn()
559
+ .mockResolvedValueOnce(mockFetchResponse(currentConfig))
560
+ .mockResolvedValueOnce(mockFetchResponse({ success: true }));
561
+ global.fetch = mockFetch;
562
+ await transport.configMerge(JSON.stringify(snippet));
563
+ const body = JSON.parse(mockFetch.mock.calls[1][1].body);
564
+ expect(body.arrayField).toEqual([4, 5]);
565
+ });
566
+ });
567
+ describe("execScript", () => {
568
+ it("should throw for execScript", async () => {
569
+ const transport = new ApiTransport({
570
+ baseUrl: "https://auth.example.com",
571
+ verifySsl: true,
572
+ });
573
+ await expect(transport.execScript("rotateOidcKeys", [])).rejects.toThrow("execScript is not supported via API. Use SSH or K8s mode.");
574
+ });
575
+ });
576
+ });
577
+ //# sourceMappingURL=api-transport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-transport.test.js","sourceRoot":"","sources":["../../src/__tests__/api-transport.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};