ncloud-mcp-server 1.0.4 → 1.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 (147) hide show
  1. package/README.md +18 -2
  2. package/README_EN.md +18 -2
  3. package/dist/index.js +12 -331
  4. package/dist/index.js.map +1 -1
  5. package/dist/tools/_response.d.ts +69 -0
  6. package/dist/tools/_response.js +96 -0
  7. package/dist/tools/_response.js.map +1 -0
  8. package/dist/tools/acg.js +10 -9
  9. package/dist/tools/acg.js.map +1 -1
  10. package/dist/tools/activity-tracer.js +4 -3
  11. package/dist/tools/activity-tracer.js.map +1 -1
  12. package/dist/tools/analytics-cdss.js +51 -50
  13. package/dist/tools/analytics-cdss.js.map +1 -1
  14. package/dist/tools/analytics-datacatalog.js +22 -21
  15. package/dist/tools/analytics-datacatalog.js.map +1 -1
  16. package/dist/tools/analytics-dataflow.js +27 -26
  17. package/dist/tools/analytics-dataflow.js.map +1 -1
  18. package/dist/tools/analytics-dataforest.js +25 -24
  19. package/dist/tools/analytics-dataforest.js.map +1 -1
  20. package/dist/tools/analytics-dataquery.js +6 -5
  21. package/dist/tools/analytics-dataquery.js.map +1 -1
  22. package/dist/tools/analytics-datastream.js +22 -21
  23. package/dist/tools/analytics-datastream.js.map +1 -1
  24. package/dist/tools/analytics-hadoop.js +30 -29
  25. package/dist/tools/analytics-hadoop.js.map +1 -1
  26. package/dist/tools/analytics-ses.js +43 -42
  27. package/dist/tools/analytics-ses.js.map +1 -1
  28. package/dist/tools/api-gateway.js +13 -12
  29. package/dist/tools/api-gateway.js.map +1 -1
  30. package/dist/tools/autoscaling.js +25 -24
  31. package/dist/tools/autoscaling.js.map +1 -1
  32. package/dist/tools/billing.d.ts +0 -11
  33. package/dist/tools/billing.js +210 -48
  34. package/dist/tools/billing.js.map +1 -1
  35. package/dist/tools/certificate-manager.js +4 -3
  36. package/dist/tools/certificate-manager.js.map +1 -1
  37. package/dist/tools/cloud-advisor.js +16 -15
  38. package/dist/tools/cloud-advisor.js.map +1 -1
  39. package/dist/tools/cloud-functions.js +22 -21
  40. package/dist/tools/cloud-functions.js.map +1 -1
  41. package/dist/tools/cloud-insight-integration.js +6 -5
  42. package/dist/tools/cloud-insight-integration.js.map +1 -1
  43. package/dist/tools/cloud-insight-plugin.js +34 -33
  44. package/dist/tools/cloud-insight-plugin.js.map +1 -1
  45. package/dist/tools/cloud-insight-rule.js +28 -27
  46. package/dist/tools/cloud-insight-rule.js.map +1 -1
  47. package/dist/tools/cloud-insight.js +12 -11
  48. package/dist/tools/cloud-insight.js.map +1 -1
  49. package/dist/tools/common.js +6 -5
  50. package/dist/tools/common.js.map +1 -1
  51. package/dist/tools/compute-initscript.js +5 -4
  52. package/dist/tools/compute-initscript.js.map +1 -1
  53. package/dist/tools/compute-loginkey.js +5 -4
  54. package/dist/tools/compute-loginkey.js.map +1 -1
  55. package/dist/tools/compute-placement.js +14 -13
  56. package/dist/tools/compute-placement.js.map +1 -1
  57. package/dist/tools/compute-publicip.js +8 -7
  58. package/dist/tools/compute-publicip.js.map +1 -1
  59. package/dist/tools/compute-server.js +29 -28
  60. package/dist/tools/compute-server.js.map +1 -1
  61. package/dist/tools/compute-storage.js +16 -15
  62. package/dist/tools/compute-storage.js.map +1 -1
  63. package/dist/tools/containers-nks.js +38 -37
  64. package/dist/tools/containers-nks.js.map +1 -1
  65. package/dist/tools/containers-registry.js +13 -12
  66. package/dist/tools/containers-registry.js.map +1 -1
  67. package/dist/tools/database-cache.js +25 -24
  68. package/dist/tools/database-cache.js.map +1 -1
  69. package/dist/tools/database-mongodb.js +25 -24
  70. package/dist/tools/database-mongodb.js.map +1 -1
  71. package/dist/tools/database-mssql.js +23 -22
  72. package/dist/tools/database-mssql.js.map +1 -1
  73. package/dist/tools/database-mysql.js +30 -29
  74. package/dist/tools/database-mysql.js.map +1 -1
  75. package/dist/tools/database-postgresql.js +26 -25
  76. package/dist/tools/database-postgresql.js.map +1 -1
  77. package/dist/tools/global-dns.js +13 -12
  78. package/dist/tools/global-dns.js.map +1 -1
  79. package/dist/tools/global-edge.js +21 -20
  80. package/dist/tools/global-edge.js.map +1 -1
  81. package/dist/tools/global-traffic-manager.js +27 -26
  82. package/dist/tools/global-traffic-manager.js.map +1 -1
  83. package/dist/tools/kms.js +52 -39
  84. package/dist/tools/kms.js.map +1 -1
  85. package/dist/tools/loadbalancer.js +17 -16
  86. package/dist/tools/loadbalancer.js.map +1 -1
  87. package/dist/tools/log-analytics.js +11 -10
  88. package/dist/tools/log-analytics.js.map +1 -1
  89. package/dist/tools/media-imageoptimizer.js +10 -9
  90. package/dist/tools/media-imageoptimizer.js.map +1 -1
  91. package/dist/tools/media-livestation.js +13 -12
  92. package/dist/tools/media-livestation.js.map +1 -1
  93. package/dist/tools/media-vodstation.js +11 -10
  94. package/dist/tools/media-vodstation.js.map +1 -1
  95. package/dist/tools/nat-gateway.js +6 -5
  96. package/dist/tools/nat-gateway.js.map +1 -1
  97. package/dist/tools/network-acl.js +18 -17
  98. package/dist/tools/network-acl.js.map +1 -1
  99. package/dist/tools/network-interface.js +15 -14
  100. package/dist/tools/network-interface.js.map +1 -1
  101. package/dist/tools/private-ca.js +32 -23
  102. package/dist/tools/private-ca.js.map +1 -1
  103. package/dist/tools/registry.d.ts +49 -0
  104. package/dist/tools/registry.js +254 -0
  105. package/dist/tools/registry.js.map +1 -0
  106. package/dist/tools/resource-manager.js +7 -6
  107. package/dist/tools/resource-manager.js.map +1 -1
  108. package/dist/tools/route-table.js +12 -11
  109. package/dist/tools/route-table.js.map +1 -1
  110. package/dist/tools/security-monitoring.js +8 -7
  111. package/dist/tools/security-monitoring.js.map +1 -1
  112. package/dist/tools/sens.js +7 -6
  113. package/dist/tools/sens.js.map +1 -1
  114. package/dist/tools/sourcebuild.js +18 -17
  115. package/dist/tools/sourcebuild.js.map +1 -1
  116. package/dist/tools/sourcecommit.js +13 -12
  117. package/dist/tools/sourcecommit.js.map +1 -1
  118. package/dist/tools/sourcedeploy.js +35 -34
  119. package/dist/tools/sourcedeploy.js.map +1 -1
  120. package/dist/tools/sourcepipeline.js +18 -17
  121. package/dist/tools/sourcepipeline.js.map +1 -1
  122. package/dist/tools/storage-archive.js +13 -12
  123. package/dist/tools/storage-archive.js.map +1 -1
  124. package/dist/tools/storage-nas.js +20 -19
  125. package/dist/tools/storage-nas.js.map +1 -1
  126. package/dist/tools/storage-ncloud.js +25 -24
  127. package/dist/tools/storage-ncloud.js.map +1 -1
  128. package/dist/tools/storage-object.js +29 -28
  129. package/dist/tools/storage-object.js.map +1 -1
  130. package/dist/tools/sub-account.js +19 -18
  131. package/dist/tools/sub-account.js.map +1 -1
  132. package/dist/tools/target-group.js +12 -11
  133. package/dist/tools/target-group.js.map +1 -1
  134. package/dist/tools/vpc-peering.js +8 -7
  135. package/dist/tools/vpc-peering.js.map +1 -1
  136. package/dist/tools/vpc.js +11 -10
  137. package/dist/tools/vpc.js.map +1 -1
  138. package/package.json +1 -1
  139. package/dist/auth/signature.test.d.ts +0 -1
  140. package/dist/auth/signature.test.js +0 -90
  141. package/dist/auth/signature.test.js.map +0 -1
  142. package/dist/client/ncloud-client.test.d.ts +0 -1
  143. package/dist/client/ncloud-client.test.js +0 -477
  144. package/dist/client/ncloud-client.test.js.map +0 -1
  145. package/dist/tools/compute-server.test.d.ts +0 -1
  146. package/dist/tools/compute-server.test.js +0 -224
  147. package/dist/tools/compute-server.test.js.map +0 -1
@@ -1,477 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import fc from "fast-check";
3
- import { NcloudClient } from "./ncloud-client.js";
4
- function createMockFetch(responseBody, status = 200) {
5
- return vi.fn(async () => ({
6
- ok: status >= 200 && status < 300,
7
- status,
8
- json: async () => responseBody,
9
- }));
10
- }
11
- describe("Feature: ncloud-mcp-server, Property 3: 인증 헤더 완전성", () => {
12
- it("every request includes all three auth headers", async () => {
13
- await fc.assert(fc.asyncProperty(fc.string({ minLength: 1, maxLength: 32 }), fc.string({ minLength: 1, maxLength: 32 }), fc.constantFrom("/vserver/v2/getServerInstanceList", "/vpc/v2/getVpcList"), async (accessKey, secretKey, action) => {
14
- const client = new NcloudClient({
15
- accessKey,
16
- secretKey,
17
- baseUrl: "https://ncloud.apigw.ntruss.com",
18
- });
19
- let capturedHeaders = {};
20
- vi.stubGlobal("fetch", vi.fn(async (_url, init) => {
21
- capturedHeaders = init.headers;
22
- return {
23
- ok: true,
24
- status: 200,
25
- json: async () => ({
26
- getServerInstanceListResponse: { returnCode: "0", returnMessage: "success" },
27
- }),
28
- };
29
- }));
30
- await client.request(action, {});
31
- expect(capturedHeaders).toHaveProperty("x-ncp-apigw-timestamp");
32
- expect(capturedHeaders).toHaveProperty("x-ncp-iam-access-key");
33
- expect(capturedHeaders).toHaveProperty("x-ncp-apigw-signature-v2");
34
- expect(capturedHeaders["x-ncp-iam-access-key"]).toBe(accessKey);
35
- }), { numRuns: 100 });
36
- });
37
- });
38
- describe("Feature: ncloud-mcp-server, Property 4: JSON 응답 포맷 자동 추가", () => {
39
- it("every request URL includes responseFormatType=json", async () => {
40
- await fc.assert(fc.asyncProperty(fc.constantFrom("/vserver/v2/getServerInstanceList", "/vpc/v2/getVpcList", "/vloadbalancer/v2/getLoadBalancerInstanceList"), fc.record({
41
- serverInstanceNo: fc.option(fc.string({ minLength: 1, maxLength: 10 })),
42
- }), async (action, params) => {
43
- const client = new NcloudClient({
44
- accessKey: "testKey",
45
- secretKey: "testSecret",
46
- baseUrl: "https://ncloud.apigw.ntruss.com",
47
- });
48
- let capturedUrl = "";
49
- vi.stubGlobal("fetch", vi.fn(async (url) => {
50
- capturedUrl = url;
51
- return {
52
- ok: true,
53
- status: 200,
54
- json: async () => ({ someResponse: { returnCode: "0" } }),
55
- };
56
- }));
57
- const cleanParams = {};
58
- for (const [k, v] of Object.entries(params)) {
59
- if (v !== null)
60
- cleanParams[k] = v;
61
- }
62
- await client.request(action, cleanParams);
63
- expect(capturedUrl).toContain("responseFormatType=json");
64
- }), { numRuns: 100 });
65
- });
66
- });
67
- describe("Feature: ncloud-mcp-server, Property 5: 에러 응답 전파", () => {
68
- it("error responses with responseError propagate returnCode and returnMessage", async () => {
69
- await fc.assert(fc.asyncProperty(fc.string({ minLength: 1, maxLength: 10 }), fc.string({ minLength: 1, maxLength: 50 }), async (returnCode, returnMessage) => {
70
- const client = new NcloudClient({
71
- accessKey: "testKey",
72
- secretKey: "testSecret",
73
- baseUrl: "https://ncloud.apigw.ntruss.com",
74
- });
75
- vi.stubGlobal("fetch", vi.fn(async () => ({
76
- ok: false,
77
- status: 400,
78
- json: async () => ({
79
- responseError: { returnCode, returnMessage },
80
- }),
81
- })));
82
- try {
83
- await client.request("/vserver/v2/getServerInstanceList", {});
84
- expect.fail("Should have thrown");
85
- }
86
- catch (e) {
87
- expect(e.message).toContain(returnCode);
88
- expect(e.message).toContain(returnMessage);
89
- }
90
- }), { numRuns: 100 });
91
- });
92
- it("error responses with error propagate errorCode and message", async () => {
93
- await fc.assert(fc.asyncProperty(fc.string({ minLength: 1, maxLength: 10 }), fc.string({ minLength: 1, maxLength: 50 }), async (errorCode, message) => {
94
- const client = new NcloudClient({
95
- accessKey: "testKey",
96
- secretKey: "testSecret",
97
- baseUrl: "https://ncloud.apigw.ntruss.com",
98
- });
99
- vi.stubGlobal("fetch", vi.fn(async () => ({
100
- ok: false,
101
- status: 400,
102
- json: async () => ({
103
- error: { errorCode, message },
104
- }),
105
- })));
106
- try {
107
- await client.request("/vserver/v2/getServerInstanceList", {});
108
- expect.fail("Should have thrown");
109
- }
110
- catch (e) {
111
- expect(e.message).toContain(errorCode);
112
- expect(e.message).toContain(message);
113
- }
114
- }), { numRuns: 100 });
115
- });
116
- });
117
- describe("Feature: ncloud-mcp-server, Property 8: 리스트 파라미터 직렬화 라운드트립", () => {
118
- it("array of K elements produces exactly K indexed params preserving values", () => {
119
- fc.assert(fc.property(fc.string({ minLength: 1, maxLength: 20 }).filter((s) => !s.includes(".")), fc.array(fc.string({ minLength: 1, maxLength: 20 }), { minLength: 1, maxLength: 10 }), (paramName, values) => {
120
- const client = new NcloudClient({
121
- accessKey: "key",
122
- secretKey: "secret",
123
- baseUrl: "https://ncloud.apigw.ntruss.com",
124
- });
125
- const result = client.serializeListParams({ [paramName]: values });
126
- // Should produce exactly K entries
127
- const keys = Object.keys(result);
128
- expect(keys.length).toBe(values.length);
129
- // Each key should be paramName.N (1-based)
130
- for (let i = 0; i < values.length; i++) {
131
- const expectedKey = `${paramName}.${i + 1}`;
132
- expect(result[expectedKey]).toBe(values[i]);
133
- }
134
- }), { numRuns: 100 });
135
- });
136
- });
137
- describe("Feature: ncloud-mcp-server, Property 11: 기본 리전 폴백", () => {
138
- it("requests without explicit regionCode use the client active region", async () => {
139
- await fc.assert(fc.asyncProperty(fc.constantFrom("KR", "JPN", "SGN", "USWN", "DEN"), async (regionCode) => {
140
- const client = new NcloudClient({
141
- accessKey: "testKey",
142
- secretKey: "testSecret",
143
- baseUrl: "https://ncloud.apigw.ntruss.com",
144
- regionCode,
145
- });
146
- let capturedUrl = "";
147
- vi.stubGlobal("fetch", vi.fn(async (url) => {
148
- capturedUrl = url;
149
- return {
150
- ok: true,
151
- status: 200,
152
- json: async () => ({
153
- getServerInstanceListResponse: { returnCode: "0", returnMessage: "success" },
154
- }),
155
- };
156
- }));
157
- await client.request("/vserver/v2/getServerInstanceList", {});
158
- expect(capturedUrl).toContain(`regionCode=${regionCode}`);
159
- }), { numRuns: 100 });
160
- });
161
- it("setRegionCode changes the fallback region for subsequent requests", async () => {
162
- const client = new NcloudClient({
163
- accessKey: "testKey",
164
- secretKey: "testSecret",
165
- baseUrl: "https://ncloud.apigw.ntruss.com",
166
- regionCode: "KR",
167
- });
168
- client.setRegionCode("JPN");
169
- expect(client.getRegionCode()).toBe("JPN");
170
- let capturedUrl = "";
171
- vi.stubGlobal("fetch", vi.fn(async (url) => {
172
- capturedUrl = url;
173
- return {
174
- ok: true,
175
- status: 200,
176
- json: async () => ({
177
- getServerInstanceListResponse: { returnCode: "0", returnMessage: "success" },
178
- }),
179
- };
180
- }));
181
- await client.request("/vserver/v2/getServerInstanceList", {});
182
- expect(capturedUrl).toContain("regionCode=JPN");
183
- });
184
- });
185
- describe("NcloudClient 단위 테스트: requestRaw 메서드", () => {
186
- let client;
187
- beforeEach(() => {
188
- client = new NcloudClient({
189
- accessKey: "testKey",
190
- secretKey: "testSecret",
191
- baseUrl: "https://cloudfunctions.apigw.ntruss.com",
192
- });
193
- });
194
- it("GET 요청 시 responseFormatType과 regionCode를 추가하지 않음", async () => {
195
- let capturedUrl = "";
196
- vi.stubGlobal("fetch", vi.fn(async (url) => {
197
- capturedUrl = url;
198
- return {
199
- ok: true,
200
- status: 200,
201
- json: async () => ({ packages: [] }),
202
- };
203
- }));
204
- await client.requestRaw("GET", "/api/v2/packages", { platform: "vpc" });
205
- expect(capturedUrl).not.toContain("responseFormatType");
206
- expect(capturedUrl).not.toContain("regionCode");
207
- expect(capturedUrl).toContain("platform=vpc");
208
- });
209
- it("GET 요청 시 Content-Type: application/json 헤더 포함", async () => {
210
- let capturedHeaders = {};
211
- vi.stubGlobal("fetch", vi.fn(async (_url, init) => {
212
- capturedHeaders = init.headers;
213
- return {
214
- ok: true,
215
- status: 200,
216
- json: async () => ({ packages: [] }),
217
- };
218
- }));
219
- await client.requestRaw("GET", "/api/v2/packages");
220
- expect(capturedHeaders["Content-Type"]).toBe("application/json");
221
- });
222
- it("GET 요청 시 인증 헤더 3개 포함", async () => {
223
- let capturedHeaders = {};
224
- vi.stubGlobal("fetch", vi.fn(async (_url, init) => {
225
- capturedHeaders = init.headers;
226
- return {
227
- ok: true,
228
- status: 200,
229
- json: async () => ({ packages: [] }),
230
- };
231
- }));
232
- await client.requestRaw("GET", "/api/v2/packages");
233
- expect(capturedHeaders).toHaveProperty("x-ncp-apigw-timestamp");
234
- expect(capturedHeaders).toHaveProperty("x-ncp-iam-access-key");
235
- expect(capturedHeaders).toHaveProperty("x-ncp-apigw-signature-v2");
236
- expect(capturedHeaders["x-ncp-iam-access-key"]).toBe("testKey");
237
- });
238
- it("PUT 요청 시 body를 JSON으로 직렬화하여 전송", async () => {
239
- let capturedInit = {};
240
- vi.stubGlobal("fetch", vi.fn(async (_url, init) => {
241
- capturedInit = init;
242
- return {
243
- ok: true,
244
- status: 200,
245
- json: async () => ({ name: "test-package" }),
246
- };
247
- }));
248
- const body = { description: "test", parameters: { key: "value" } };
249
- await client.requestRaw("PUT", "/api/v2/packages/test-pkg", { platform: "vpc" }, body);
250
- expect(capturedInit.method).toBe("PUT");
251
- expect(capturedInit.body).toBe(JSON.stringify(body));
252
- });
253
- it("POST 요청 시 body를 JSON으로 직렬화하여 전송", async () => {
254
- let capturedInit = {};
255
- vi.stubGlobal("fetch", vi.fn(async (_url, init) => {
256
- capturedInit = init;
257
- return {
258
- ok: true,
259
- status: 200,
260
- json: async () => ({ activationId: "abc123" }),
261
- };
262
- }));
263
- const body = { param1: "value1" };
264
- await client.requestRaw("POST", "/api/v2/packages/-/actions/myAction", { platform: "vpc" }, body);
265
- expect(capturedInit.method).toBe("POST");
266
- expect(capturedInit.body).toBe(JSON.stringify(body));
267
- });
268
- it("DELETE 요청 시 body를 전송하지 않음", async () => {
269
- let capturedInit = {};
270
- vi.stubGlobal("fetch", vi.fn(async (_url, init) => {
271
- capturedInit = init;
272
- return {
273
- ok: true,
274
- status: 204,
275
- json: async () => ({}),
276
- };
277
- }));
278
- await client.requestRaw("DELETE", "/api/v2/packages/test-pkg", { platform: "vpc" });
279
- expect(capturedInit.method).toBe("DELETE");
280
- expect(capturedInit.body).toBeUndefined();
281
- });
282
- it("204 No Content 응답 시 { success: true } 반환", async () => {
283
- vi.stubGlobal("fetch", vi.fn(async () => ({
284
- ok: true,
285
- status: 204,
286
- json: async () => ({}),
287
- })));
288
- const result = await client.requestRaw("DELETE", "/api/v2/packages/test-pkg", { platform: "vpc" });
289
- expect(result).toEqual({ success: true });
290
- });
291
- it("queryParams가 없으면 URL에 쿼리 스트링 없이 호출", async () => {
292
- let capturedUrl = "";
293
- vi.stubGlobal("fetch", vi.fn(async (url) => {
294
- capturedUrl = url;
295
- return {
296
- ok: true,
297
- status: 200,
298
- json: async () => ({ data: [] }),
299
- };
300
- }));
301
- await client.requestRaw("GET", "/api/v2/activations");
302
- expect(capturedUrl).toBe("https://cloudfunctions.apigw.ntruss.com/api/v2/activations");
303
- });
304
- it("에러 응답 시 handleErrorResponse를 통해 에러 throw", async () => {
305
- vi.stubGlobal("fetch", vi.fn(async () => ({
306
- ok: false,
307
- status: 404,
308
- json: async () => ({
309
- error: { errorCode: "404", message: "Not Found" },
310
- }),
311
- })));
312
- await expect(client.requestRaw("GET", "/api/v2/packages/nonexistent", { platform: "vpc" })).rejects.toThrow("에러 코드: 404");
313
- });
314
- it("응답 래퍼 해제 동작", async () => {
315
- const innerData = { packages: [{ name: "pkg1" }] };
316
- vi.stubGlobal("fetch", vi.fn(async () => ({
317
- ok: true,
318
- status: 200,
319
- json: async () => ({ getPackagesResponse: innerData }),
320
- })));
321
- const result = await client.requestRaw("GET", "/api/v2/packages", { platform: "vpc" });
322
- expect(result).toEqual(innerData);
323
- });
324
- });
325
- describe("NcloudClient 단위 테스트: HTTP 에러 코드별 메시지", () => {
326
- let client;
327
- beforeEach(() => {
328
- client = new NcloudClient({
329
- accessKey: "testKey",
330
- secretKey: "testSecret",
331
- baseUrl: "https://ncloud.apigw.ntruss.com",
332
- });
333
- });
334
- it("HTTP 401 → 인증 실패 메시지", async () => {
335
- vi.stubGlobal("fetch", createMockFetch({}, 401));
336
- await expect(client.request("/vserver/v2/getServerInstanceList", {})).rejects.toThrow("인증 실패: Access Key 또는 Secret Key가 올바르지 않습니다. 환경 변수 NCLOUD_ACCESS_KEY, NCLOUD_SECRET_KEY를 확인하세요.");
337
- });
338
- it("HTTP 413 → 요청 크기 초과 메시지", async () => {
339
- vi.stubGlobal("fetch", createMockFetch({}, 413));
340
- await expect(client.request("/vserver/v2/getServerInstanceList", {})).rejects.toThrow("요청 크기 초과: 요청 본문이 너무 큽니다.");
341
- });
342
- it("HTTP 429 → 요청 제한 초과 메시지", async () => {
343
- vi.stubGlobal("fetch", createMockFetch({}, 429));
344
- await expect(client.request("/vserver/v2/getServerInstanceList", {})).rejects.toThrow("요청 제한 초과: 잠시 후 다시 시도해주세요.");
345
- });
346
- it("HTTP 503 → 서비스 일시 불가 메시지", async () => {
347
- vi.stubGlobal("fetch", createMockFetch({}, 503));
348
- await expect(client.request("/vserver/v2/getServerInstanceList", {})).rejects.toThrow("서비스 일시 불가: Ncloud API 엔드포인트에 연결할 수 없습니다. 잠시 후 다시 시도해주세요.");
349
- });
350
- it("HTTP 504 → 요청 시간 초과 메시지", async () => {
351
- vi.stubGlobal("fetch", createMockFetch({}, 504));
352
- await expect(client.request("/vserver/v2/getServerInstanceList", {})).rejects.toThrow("요청 시간 초과: Ncloud API 응답 시간이 초과되었습니다. 잠시 후 다시 시도해주세요.");
353
- });
354
- it("알 수 없는 HTTP 에러 코드 → 상태 코드와 응답 본문 포함", async () => {
355
- vi.stubGlobal("fetch", createMockFetch({ someField: "value" }, 500));
356
- await expect(client.request("/vserver/v2/getServerInstanceList", {})).rejects.toThrow("API 호출 실패: HTTP 500");
357
- });
358
- });
359
- describe("NcloudClient 단위 테스트: 응답 래퍼 해제", () => {
360
- let client;
361
- beforeEach(() => {
362
- client = new NcloudClient({
363
- accessKey: "testKey",
364
- secretKey: "testSecret",
365
- baseUrl: "https://ncloud.apigw.ntruss.com",
366
- });
367
- });
368
- it("'{actionName}Response' 래퍼가 있으면 내부 객체를 반환", async () => {
369
- const innerData = {
370
- returnCode: "0",
371
- returnMessage: "success",
372
- totalRows: 2,
373
- serverInstanceList: [{ id: "1" }, { id: "2" }],
374
- };
375
- vi.stubGlobal("fetch", createMockFetch({ getServerInstanceListResponse: innerData }));
376
- const result = await client.request("/vserver/v2/getServerInstanceList", {});
377
- expect(result).toEqual(innerData);
378
- });
379
- it("'Response' 접미사가 없으면 원본 응답 그대로 반환", async () => {
380
- const rawBody = { returnCode: "0", data: [1, 2, 3] };
381
- vi.stubGlobal("fetch", createMockFetch(rawBody));
382
- const result = await client.request("/vserver/v2/getServerInstanceList", {});
383
- expect(result).toEqual(rawBody);
384
- });
385
- it("키가 여러 개이면 래퍼 해제하지 않고 원본 반환", async () => {
386
- const rawBody = {
387
- getServerInstanceListResponse: { returnCode: "0" },
388
- extraKey: "extra",
389
- };
390
- vi.stubGlobal("fetch", createMockFetch(rawBody));
391
- const result = await client.request("/vserver/v2/getServerInstanceList", {});
392
- expect(result).toEqual(rawBody);
393
- });
394
- it("createVpcResponse 래퍼도 정상 해제", async () => {
395
- const innerData = {
396
- returnCode: "0",
397
- returnMessage: "success",
398
- vpcList: [{ vpcNo: "123" }],
399
- };
400
- vi.stubGlobal("fetch", createMockFetch({ createVpcResponse: innerData }));
401
- const result = await client.request("/vpc/v2/createVpc", {
402
- ipv4CidrBlock: "10.0.0.0/16",
403
- });
404
- expect(result).toEqual(innerData);
405
- });
406
- it("postRequest에서도 래퍼 해제 동작", async () => {
407
- const innerData = { returnCode: "0", items: [] };
408
- vi.stubGlobal("fetch", createMockFetch({ queryDataResponse: innerData }));
409
- const result = await client.postRequest("/cw_fea/real/cw/api/data/query", {
410
- metric: "cpu",
411
- });
412
- expect(result).toEqual(innerData);
413
- });
414
- });
415
- describe("NcloudClient 단위 테스트: 두 가지 에러 형식 파싱", () => {
416
- let client;
417
- beforeEach(() => {
418
- client = new NcloudClient({
419
- accessKey: "testKey",
420
- secretKey: "testSecret",
421
- baseUrl: "https://ncloud.apigw.ntruss.com",
422
- });
423
- });
424
- it("형식 1 (API Gateway): error.errorCode와 error.message 추출", async () => {
425
- vi.stubGlobal("fetch", createMockFetch({ error: { errorCode: "210", message: "Permission Denied" } }, 401));
426
- await expect(client.request("/vserver/v2/getServerInstanceList", {})).rejects.toThrow("에러 코드: 210");
427
- vi.stubGlobal("fetch", createMockFetch({ error: { errorCode: "210", message: "Permission Denied" } }, 401));
428
- await expect(client.request("/vserver/v2/getServerInstanceList", {})).rejects.toThrow("메시지: Permission Denied");
429
- });
430
- it("형식 2 (서비스): responseError.returnCode와 returnMessage 추출", async () => {
431
- vi.stubGlobal("fetch", createMockFetch({
432
- responseError: {
433
- returnCode: "300",
434
- returnMessage: "요청한 리소스를 찾을 수 없습니다.",
435
- },
436
- }, 404));
437
- await expect(client.request("/vserver/v2/getServerInstanceDetail", {
438
- serverInstanceNo: "99999",
439
- })).rejects.toThrow("에러 코드: 300");
440
- vi.stubGlobal("fetch", createMockFetch({
441
- responseError: {
442
- returnCode: "300",
443
- returnMessage: "요청한 리소스를 찾을 수 없습니다.",
444
- },
445
- }, 404));
446
- await expect(client.request("/vserver/v2/getServerInstanceDetail", {
447
- serverInstanceNo: "99999",
448
- })).rejects.toThrow("메시지: 요청한 리소스를 찾을 수 없습니다.");
449
- });
450
- it("형식 1: HTTP 200이지만 body에 error가 있으면 에러 throw", async () => {
451
- vi.stubGlobal("fetch", createMockFetch({ error: { errorCode: "100", message: "Bad Request" } }, 200));
452
- await expect(client.request("/vserver/v2/getServerInstanceList", {})).rejects.toThrow("에러 코드: 100");
453
- });
454
- it("형식 2: HTTP 200이지만 body에 responseError가 있으면 에러 throw", async () => {
455
- vi.stubGlobal("fetch", createMockFetch({
456
- responseError: {
457
- returnCode: "900",
458
- returnMessage: "Internal Server Error",
459
- },
460
- }, 200));
461
- await expect(client.request("/vserver/v2/getServerInstanceList", {})).rejects.toThrow("에러 코드: 900");
462
- });
463
- it("postRequest에서도 형식 1 에러 처리", async () => {
464
- vi.stubGlobal("fetch", createMockFetch({ error: { errorCode: "401", message: "Unauthorized" } }, 401));
465
- await expect(client.postRequest("/cw_fea/real/cw/api/data/query", {})).rejects.toThrow("메시지: Unauthorized");
466
- });
467
- it("postRequest에서도 형식 2 에러 처리", async () => {
468
- vi.stubGlobal("fetch", createMockFetch({
469
- responseError: {
470
- returnCode: "500",
471
- returnMessage: "서버 내부 오류",
472
- },
473
- }, 500));
474
- await expect(client.postRequest("/cw_fea/real/cw/api/data/query", {})).rejects.toThrow("메시지: 서버 내부 오류");
475
- });
476
- });
477
- //# sourceMappingURL=ncloud-client.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ncloud-client.test.js","sourceRoot":"","sources":["../../src/client/ncloud-client.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};