ncloud-mcp-server 1.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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/README_EN.md +159 -0
  4. package/dist/auth/signature.d.ts +16 -0
  5. package/dist/auth/signature.js +18 -0
  6. package/dist/auth/signature.js.map +1 -0
  7. package/dist/auth/signature.test.d.ts +1 -0
  8. package/dist/auth/signature.test.js +90 -0
  9. package/dist/auth/signature.test.js.map +1 -0
  10. package/dist/client/ncloud-client.d.ts +27 -0
  11. package/dist/client/ncloud-client.js +270 -0
  12. package/dist/client/ncloud-client.js.map +1 -0
  13. package/dist/client/ncloud-client.test.d.ts +1 -0
  14. package/dist/client/ncloud-client.test.js +477 -0
  15. package/dist/client/ncloud-client.test.js.map +1 -0
  16. package/dist/client/s3-compatible-client.d.ts +49 -0
  17. package/dist/client/s3-compatible-client.js +210 -0
  18. package/dist/client/s3-compatible-client.js.map +1 -0
  19. package/dist/client/swift-compatible-client.d.ts +68 -0
  20. package/dist/client/swift-compatible-client.js +173 -0
  21. package/dist/client/swift-compatible-client.js.map +1 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +362 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/tools/acg.d.ts +3 -0
  26. package/dist/tools/acg.js +220 -0
  27. package/dist/tools/acg.js.map +1 -0
  28. package/dist/tools/activity-tracer.d.ts +3 -0
  29. package/dist/tools/activity-tracer.js +77 -0
  30. package/dist/tools/activity-tracer.js.map +1 -0
  31. package/dist/tools/analytics-cdss.d.ts +3 -0
  32. package/dist/tools/analytics-cdss.js +618 -0
  33. package/dist/tools/analytics-cdss.js.map +1 -0
  34. package/dist/tools/analytics-datacatalog.d.ts +10 -0
  35. package/dist/tools/analytics-datacatalog.js +409 -0
  36. package/dist/tools/analytics-datacatalog.js.map +1 -0
  37. package/dist/tools/analytics-dataflow.d.ts +16 -0
  38. package/dist/tools/analytics-dataflow.js +478 -0
  39. package/dist/tools/analytics-dataflow.js.map +1 -0
  40. package/dist/tools/analytics-dataforest.d.ts +10 -0
  41. package/dist/tools/analytics-dataforest.js +379 -0
  42. package/dist/tools/analytics-dataforest.js.map +1 -0
  43. package/dist/tools/analytics-dataquery.d.ts +16 -0
  44. package/dist/tools/analytics-dataquery.js +143 -0
  45. package/dist/tools/analytics-dataquery.js.map +1 -0
  46. package/dist/tools/analytics-datastream.d.ts +13 -0
  47. package/dist/tools/analytics-datastream.js +359 -0
  48. package/dist/tools/analytics-datastream.js.map +1 -0
  49. package/dist/tools/analytics-hadoop.d.ts +12 -0
  50. package/dist/tools/analytics-hadoop.js +450 -0
  51. package/dist/tools/analytics-hadoop.js.map +1 -0
  52. package/dist/tools/analytics-ses.d.ts +3 -0
  53. package/dist/tools/analytics-ses.js +653 -0
  54. package/dist/tools/analytics-ses.js.map +1 -0
  55. package/dist/tools/api-gateway.d.ts +3 -0
  56. package/dist/tools/api-gateway.js +202 -0
  57. package/dist/tools/api-gateway.js.map +1 -0
  58. package/dist/tools/autoscaling.d.ts +3 -0
  59. package/dist/tools/autoscaling.js +430 -0
  60. package/dist/tools/autoscaling.js.map +1 -0
  61. package/dist/tools/billing.d.ts +14 -0
  62. package/dist/tools/billing.js +545 -0
  63. package/dist/tools/billing.js.map +1 -0
  64. package/dist/tools/certificate-manager.d.ts +18 -0
  65. package/dist/tools/certificate-manager.js +84 -0
  66. package/dist/tools/certificate-manager.js.map +1 -0
  67. package/dist/tools/cloud-advisor.d.ts +3 -0
  68. package/dist/tools/cloud-advisor.js +202 -0
  69. package/dist/tools/cloud-advisor.js.map +1 -0
  70. package/dist/tools/cloud-functions.d.ts +3 -0
  71. package/dist/tools/cloud-functions.js +497 -0
  72. package/dist/tools/cloud-functions.js.map +1 -0
  73. package/dist/tools/cloud-insight-integration.d.ts +3 -0
  74. package/dist/tools/cloud-insight-integration.js +90 -0
  75. package/dist/tools/cloud-insight-integration.js.map +1 -0
  76. package/dist/tools/cloud-insight-plugin.d.ts +3 -0
  77. package/dist/tools/cloud-insight-plugin.js +600 -0
  78. package/dist/tools/cloud-insight-plugin.js.map +1 -0
  79. package/dist/tools/cloud-insight-rule.d.ts +3 -0
  80. package/dist/tools/cloud-insight-rule.js +570 -0
  81. package/dist/tools/cloud-insight-rule.js.map +1 -0
  82. package/dist/tools/cloud-insight.d.ts +3 -0
  83. package/dist/tools/cloud-insight.js +246 -0
  84. package/dist/tools/cloud-insight.js.map +1 -0
  85. package/dist/tools/common.d.ts +3 -0
  86. package/dist/tools/common.js +120 -0
  87. package/dist/tools/common.js.map +1 -0
  88. package/dist/tools/compute-initscript.d.ts +3 -0
  89. package/dist/tools/compute-initscript.js +62 -0
  90. package/dist/tools/compute-initscript.js.map +1 -0
  91. package/dist/tools/compute-loginkey.d.ts +3 -0
  92. package/dist/tools/compute-loginkey.js +59 -0
  93. package/dist/tools/compute-loginkey.js.map +1 -0
  94. package/dist/tools/compute-placement.d.ts +3 -0
  95. package/dist/tools/compute-placement.js +196 -0
  96. package/dist/tools/compute-placement.js.map +1 -0
  97. package/dist/tools/compute-publicip.d.ts +3 -0
  98. package/dist/tools/compute-publicip.js +97 -0
  99. package/dist/tools/compute-publicip.js.map +1 -0
  100. package/dist/tools/compute-server.d.ts +3 -0
  101. package/dist/tools/compute-server.js +445 -0
  102. package/dist/tools/compute-server.js.map +1 -0
  103. package/dist/tools/compute-server.test.d.ts +1 -0
  104. package/dist/tools/compute-server.test.js +224 -0
  105. package/dist/tools/compute-server.test.js.map +1 -0
  106. package/dist/tools/compute-storage.d.ts +3 -0
  107. package/dist/tools/compute-storage.js +240 -0
  108. package/dist/tools/compute-storage.js.map +1 -0
  109. package/dist/tools/containers-nks.d.ts +13 -0
  110. package/dist/tools/containers-nks.js +576 -0
  111. package/dist/tools/containers-nks.js.map +1 -0
  112. package/dist/tools/containers-registry.d.ts +3 -0
  113. package/dist/tools/containers-registry.js +181 -0
  114. package/dist/tools/containers-registry.js.map +1 -0
  115. package/dist/tools/database-cache.d.ts +3 -0
  116. package/dist/tools/database-cache.js +388 -0
  117. package/dist/tools/database-cache.js.map +1 -0
  118. package/dist/tools/database-mongodb.d.ts +3 -0
  119. package/dist/tools/database-mongodb.js +460 -0
  120. package/dist/tools/database-mongodb.js.map +1 -0
  121. package/dist/tools/database-mssql.d.ts +3 -0
  122. package/dist/tools/database-mssql.js +345 -0
  123. package/dist/tools/database-mssql.js.map +1 -0
  124. package/dist/tools/database-mysql.d.ts +3 -0
  125. package/dist/tools/database-mysql.js +500 -0
  126. package/dist/tools/database-mysql.js.map +1 -0
  127. package/dist/tools/database-postgresql.d.ts +3 -0
  128. package/dist/tools/database-postgresql.js +432 -0
  129. package/dist/tools/database-postgresql.js.map +1 -0
  130. package/dist/tools/global-dns.d.ts +3 -0
  131. package/dist/tools/global-dns.js +207 -0
  132. package/dist/tools/global-dns.js.map +1 -0
  133. package/dist/tools/global-edge.d.ts +3 -0
  134. package/dist/tools/global-edge.js +386 -0
  135. package/dist/tools/global-edge.js.map +1 -0
  136. package/dist/tools/global-traffic-manager.d.ts +3 -0
  137. package/dist/tools/global-traffic-manager.js +497 -0
  138. package/dist/tools/global-traffic-manager.js.map +1 -0
  139. package/dist/tools/index.d.ts +63 -0
  140. package/dist/tools/index.js +64 -0
  141. package/dist/tools/index.js.map +1 -0
  142. package/dist/tools/kms.d.ts +8 -0
  143. package/dist/tools/kms.js +529 -0
  144. package/dist/tools/kms.js.map +1 -0
  145. package/dist/tools/loadbalancer.d.ts +3 -0
  146. package/dist/tools/loadbalancer.js +341 -0
  147. package/dist/tools/loadbalancer.js.map +1 -0
  148. package/dist/tools/log-analytics.d.ts +3 -0
  149. package/dist/tools/log-analytics.js +183 -0
  150. package/dist/tools/log-analytics.js.map +1 -0
  151. package/dist/tools/media-imageoptimizer.d.ts +3 -0
  152. package/dist/tools/media-imageoptimizer.js +187 -0
  153. package/dist/tools/media-imageoptimizer.js.map +1 -0
  154. package/dist/tools/media-livestation.d.ts +3 -0
  155. package/dist/tools/media-livestation.js +252 -0
  156. package/dist/tools/media-livestation.js.map +1 -0
  157. package/dist/tools/media-vodstation.d.ts +3 -0
  158. package/dist/tools/media-vodstation.js +197 -0
  159. package/dist/tools/media-vodstation.js.map +1 -0
  160. package/dist/tools/nat-gateway.d.ts +3 -0
  161. package/dist/tools/nat-gateway.js +91 -0
  162. package/dist/tools/nat-gateway.js.map +1 -0
  163. package/dist/tools/network-acl.d.ts +3 -0
  164. package/dist/tools/network-acl.js +322 -0
  165. package/dist/tools/network-acl.js.map +1 -0
  166. package/dist/tools/network-interface.d.ts +3 -0
  167. package/dist/tools/network-interface.js +193 -0
  168. package/dist/tools/network-interface.js.map +1 -0
  169. package/dist/tools/private-ca.d.ts +8 -0
  170. package/dist/tools/private-ca.js +368 -0
  171. package/dist/tools/private-ca.js.map +1 -0
  172. package/dist/tools/resource-manager.d.ts +3 -0
  173. package/dist/tools/resource-manager.js +151 -0
  174. package/dist/tools/resource-manager.js.map +1 -0
  175. package/dist/tools/route-table.d.ts +3 -0
  176. package/dist/tools/route-table.js +205 -0
  177. package/dist/tools/route-table.js.map +1 -0
  178. package/dist/tools/security-monitoring.d.ts +3 -0
  179. package/dist/tools/security-monitoring.js +182 -0
  180. package/dist/tools/security-monitoring.js.map +1 -0
  181. package/dist/tools/sens.d.ts +3 -0
  182. package/dist/tools/sens.js +240 -0
  183. package/dist/tools/sens.js.map +1 -0
  184. package/dist/tools/sourcebuild.d.ts +3 -0
  185. package/dist/tools/sourcebuild.js +481 -0
  186. package/dist/tools/sourcebuild.js.map +1 -0
  187. package/dist/tools/sourcecommit.d.ts +13 -0
  188. package/dist/tools/sourcecommit.js +228 -0
  189. package/dist/tools/sourcecommit.js.map +1 -0
  190. package/dist/tools/sourcedeploy.d.ts +3 -0
  191. package/dist/tools/sourcedeploy.js +448 -0
  192. package/dist/tools/sourcedeploy.js.map +1 -0
  193. package/dist/tools/sourcepipeline.d.ts +12 -0
  194. package/dist/tools/sourcepipeline.js +357 -0
  195. package/dist/tools/sourcepipeline.js.map +1 -0
  196. package/dist/tools/storage-archive.d.ts +3 -0
  197. package/dist/tools/storage-archive.js +337 -0
  198. package/dist/tools/storage-archive.js.map +1 -0
  199. package/dist/tools/storage-nas.d.ts +3 -0
  200. package/dist/tools/storage-nas.js +288 -0
  201. package/dist/tools/storage-nas.js.map +1 -0
  202. package/dist/tools/storage-ncloud.d.ts +3 -0
  203. package/dist/tools/storage-ncloud.js +864 -0
  204. package/dist/tools/storage-ncloud.js.map +1 -0
  205. package/dist/tools/storage-object.d.ts +3 -0
  206. package/dist/tools/storage-object.js +982 -0
  207. package/dist/tools/storage-object.js.map +1 -0
  208. package/dist/tools/sub-account.d.ts +3 -0
  209. package/dist/tools/sub-account.js +311 -0
  210. package/dist/tools/sub-account.js.map +1 -0
  211. package/dist/tools/target-group.d.ts +3 -0
  212. package/dist/tools/target-group.js +207 -0
  213. package/dist/tools/target-group.js.map +1 -0
  214. package/dist/tools/vpc-peering.d.ts +3 -0
  215. package/dist/tools/vpc-peering.js +109 -0
  216. package/dist/tools/vpc-peering.js.map +1 -0
  217. package/dist/tools/vpc.d.ts +3 -0
  218. package/dist/tools/vpc.js +194 -0
  219. package/dist/tools/vpc.js.map +1 -0
  220. package/package.json +53 -0
@@ -0,0 +1,477 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ncloud-client.test.js","sourceRoot":"","sources":["../../src/client/ncloud-client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export type S3StorageType = "object" | "ncloud";
2
+ export interface S3CompatibleClientConfig {
3
+ accessKey: string;
4
+ secretKey: string;
5
+ regionCode: string;
6
+ storageType?: S3StorageType;
7
+ }
8
+ interface S3RequestOptions {
9
+ method: string;
10
+ bucket?: string;
11
+ key?: string;
12
+ queryParams?: Record<string, string>;
13
+ headers?: Record<string, string>;
14
+ body?: string;
15
+ }
16
+ /**
17
+ * S3-compatible client for Ncloud Object Storage.
18
+ * Implements AWS Signature V4 authentication using Ncloud Access Key / Secret Key.
19
+ * Endpoints per region:
20
+ * KR: https://kr.object.ncloudstorage.com
21
+ * USWN: https://us.object.ncloudstorage.com
22
+ * SGN: https://sg.object.ncloudstorage.com
23
+ * JPN: https://jp.object.ncpstorage.com
24
+ * DEN: https://de.object.ncloudstorage.com
25
+ */
26
+ export declare class S3CompatibleClient {
27
+ private readonly accessKey;
28
+ private readonly secretKey;
29
+ private regionCode;
30
+ private readonly storageType;
31
+ constructor(config: S3CompatibleClientConfig);
32
+ setRegionCode(regionCode: string): void;
33
+ getRegionCode(): string;
34
+ private getEndpoint;
35
+ private getHost;
36
+ private sha256;
37
+ private hmacSha256;
38
+ private getSigningRegion;
39
+ private getSigningKey;
40
+ private buildCanonicalUri;
41
+ private buildCanonicalQueryString;
42
+ request(options: S3RequestOptions): Promise<{
43
+ status: number;
44
+ headers: Headers;
45
+ body: string;
46
+ }>;
47
+ private handleErrorResponse;
48
+ }
49
+ export {};