@hazeljs/core 0.2.0-beta.1

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 (194) hide show
  1. package/README.md +522 -0
  2. package/dist/__tests__/container.test.d.ts +2 -0
  3. package/dist/__tests__/container.test.d.ts.map +1 -0
  4. package/dist/__tests__/container.test.js +454 -0
  5. package/dist/__tests__/decorators.test.d.ts +2 -0
  6. package/dist/__tests__/decorators.test.d.ts.map +1 -0
  7. package/dist/__tests__/decorators.test.js +693 -0
  8. package/dist/__tests__/errors/http.error.test.d.ts +2 -0
  9. package/dist/__tests__/errors/http.error.test.d.ts.map +1 -0
  10. package/dist/__tests__/errors/http.error.test.js +117 -0
  11. package/dist/__tests__/filters/exception-filter.test.d.ts +2 -0
  12. package/dist/__tests__/filters/exception-filter.test.d.ts.map +1 -0
  13. package/dist/__tests__/filters/exception-filter.test.js +135 -0
  14. package/dist/__tests__/filters/http-exception.filter.test.d.ts +2 -0
  15. package/dist/__tests__/filters/http-exception.filter.test.d.ts.map +1 -0
  16. package/dist/__tests__/filters/http-exception.filter.test.js +119 -0
  17. package/dist/__tests__/hazel-app.test.d.ts +2 -0
  18. package/dist/__tests__/hazel-app.test.d.ts.map +1 -0
  19. package/dist/__tests__/hazel-app.test.js +682 -0
  20. package/dist/__tests__/hazel-module.test.d.ts +2 -0
  21. package/dist/__tests__/hazel-module.test.d.ts.map +1 -0
  22. package/dist/__tests__/hazel-module.test.js +408 -0
  23. package/dist/__tests__/hazel-response.test.d.ts +2 -0
  24. package/dist/__tests__/hazel-response.test.d.ts.map +1 -0
  25. package/dist/__tests__/hazel-response.test.js +138 -0
  26. package/dist/__tests__/health.test.d.ts +2 -0
  27. package/dist/__tests__/health.test.d.ts.map +1 -0
  28. package/dist/__tests__/health.test.js +147 -0
  29. package/dist/__tests__/index.test.d.ts +2 -0
  30. package/dist/__tests__/index.test.d.ts.map +1 -0
  31. package/dist/__tests__/index.test.js +239 -0
  32. package/dist/__tests__/interceptors/interceptor.test.d.ts +2 -0
  33. package/dist/__tests__/interceptors/interceptor.test.d.ts.map +1 -0
  34. package/dist/__tests__/interceptors/interceptor.test.js +166 -0
  35. package/dist/__tests__/logger.test.d.ts +2 -0
  36. package/dist/__tests__/logger.test.d.ts.map +1 -0
  37. package/dist/__tests__/logger.test.js +141 -0
  38. package/dist/__tests__/middleware/cors.test.d.ts +2 -0
  39. package/dist/__tests__/middleware/cors.test.d.ts.map +1 -0
  40. package/dist/__tests__/middleware/cors.test.js +129 -0
  41. package/dist/__tests__/middleware/csrf.test.d.ts +2 -0
  42. package/dist/__tests__/middleware/csrf.test.d.ts.map +1 -0
  43. package/dist/__tests__/middleware/csrf.test.js +247 -0
  44. package/dist/__tests__/middleware/global-middleware.test.d.ts +2 -0
  45. package/dist/__tests__/middleware/global-middleware.test.d.ts.map +1 -0
  46. package/dist/__tests__/middleware/global-middleware.test.js +259 -0
  47. package/dist/__tests__/middleware/rate-limit.test.d.ts +2 -0
  48. package/dist/__tests__/middleware/rate-limit.test.d.ts.map +1 -0
  49. package/dist/__tests__/middleware/rate-limit.test.js +264 -0
  50. package/dist/__tests__/middleware/security-headers.test.d.ts +2 -0
  51. package/dist/__tests__/middleware/security-headers.test.d.ts.map +1 -0
  52. package/dist/__tests__/middleware/security-headers.test.js +229 -0
  53. package/dist/__tests__/middleware/timeout.test.d.ts +2 -0
  54. package/dist/__tests__/middleware/timeout.test.d.ts.map +1 -0
  55. package/dist/__tests__/middleware/timeout.test.js +132 -0
  56. package/dist/__tests__/middleware.test.d.ts +2 -0
  57. package/dist/__tests__/middleware.test.d.ts.map +1 -0
  58. package/dist/__tests__/middleware.test.js +180 -0
  59. package/dist/__tests__/pipes/pipe.test.d.ts +2 -0
  60. package/dist/__tests__/pipes/pipe.test.d.ts.map +1 -0
  61. package/dist/__tests__/pipes/pipe.test.js +245 -0
  62. package/dist/__tests__/pipes/validation.pipe.test.d.ts +2 -0
  63. package/dist/__tests__/pipes/validation.pipe.test.d.ts.map +1 -0
  64. package/dist/__tests__/pipes/validation.pipe.test.js +297 -0
  65. package/dist/__tests__/request-parser.test.d.ts +2 -0
  66. package/dist/__tests__/request-parser.test.d.ts.map +1 -0
  67. package/dist/__tests__/request-parser.test.js +182 -0
  68. package/dist/__tests__/router.test.d.ts +2 -0
  69. package/dist/__tests__/router.test.d.ts.map +1 -0
  70. package/dist/__tests__/router.test.js +680 -0
  71. package/dist/__tests__/routing/route-matcher.test.d.ts +2 -0
  72. package/dist/__tests__/routing/route-matcher.test.d.ts.map +1 -0
  73. package/dist/__tests__/routing/route-matcher.test.js +219 -0
  74. package/dist/__tests__/routing/version.decorator.test.d.ts +2 -0
  75. package/dist/__tests__/routing/version.decorator.test.d.ts.map +1 -0
  76. package/dist/__tests__/routing/version.decorator.test.js +298 -0
  77. package/dist/__tests__/service.test.d.ts +2 -0
  78. package/dist/__tests__/service.test.d.ts.map +1 -0
  79. package/dist/__tests__/service.test.js +121 -0
  80. package/dist/__tests__/shutdown.test.d.ts +2 -0
  81. package/dist/__tests__/shutdown.test.d.ts.map +1 -0
  82. package/dist/__tests__/shutdown.test.js +250 -0
  83. package/dist/__tests__/testing/testing.module.test.d.ts +2 -0
  84. package/dist/__tests__/testing/testing.module.test.d.ts.map +1 -0
  85. package/dist/__tests__/testing/testing.module.test.js +370 -0
  86. package/dist/__tests__/upload/file-upload.test.d.ts +2 -0
  87. package/dist/__tests__/upload/file-upload.test.d.ts.map +1 -0
  88. package/dist/__tests__/upload/file-upload.test.js +498 -0
  89. package/dist/__tests__/utils/sanitize.test.d.ts +2 -0
  90. package/dist/__tests__/utils/sanitize.test.d.ts.map +1 -0
  91. package/dist/__tests__/utils/sanitize.test.js +291 -0
  92. package/dist/__tests__/validator.test.d.ts +2 -0
  93. package/dist/__tests__/validator.test.d.ts.map +1 -0
  94. package/dist/__tests__/validator.test.js +300 -0
  95. package/dist/container.d.ts +80 -0
  96. package/dist/container.d.ts.map +1 -0
  97. package/dist/container.js +271 -0
  98. package/dist/decorators.d.ts +92 -0
  99. package/dist/decorators.d.ts.map +1 -0
  100. package/dist/decorators.js +343 -0
  101. package/dist/errors/http.error.d.ts +31 -0
  102. package/dist/errors/http.error.d.ts.map +1 -0
  103. package/dist/errors/http.error.js +62 -0
  104. package/dist/filters/exception-filter.d.ts +39 -0
  105. package/dist/filters/exception-filter.d.ts.map +1 -0
  106. package/dist/filters/exception-filter.js +38 -0
  107. package/dist/filters/http-exception.filter.d.ts +9 -0
  108. package/dist/filters/http-exception.filter.d.ts.map +1 -0
  109. package/dist/filters/http-exception.filter.js +42 -0
  110. package/dist/hazel-app.d.ts +78 -0
  111. package/dist/hazel-app.d.ts.map +1 -0
  112. package/dist/hazel-app.js +453 -0
  113. package/dist/hazel-module.d.ts +20 -0
  114. package/dist/hazel-module.d.ts.map +1 -0
  115. package/dist/hazel-module.js +109 -0
  116. package/dist/hazel-response.d.ts +20 -0
  117. package/dist/hazel-response.d.ts.map +1 -0
  118. package/dist/hazel-response.js +68 -0
  119. package/dist/health.d.ts +73 -0
  120. package/dist/health.d.ts.map +1 -0
  121. package/dist/health.js +174 -0
  122. package/dist/index.d.ts +41 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +140 -0
  125. package/dist/interceptors/interceptor.d.ts +22 -0
  126. package/dist/interceptors/interceptor.d.ts.map +1 -0
  127. package/dist/interceptors/interceptor.js +46 -0
  128. package/dist/logger.d.ts +8 -0
  129. package/dist/logger.d.ts.map +1 -0
  130. package/dist/logger.js +238 -0
  131. package/dist/middleware/cors.middleware.d.ts +44 -0
  132. package/dist/middleware/cors.middleware.d.ts.map +1 -0
  133. package/dist/middleware/cors.middleware.js +118 -0
  134. package/dist/middleware/csrf.middleware.d.ts +82 -0
  135. package/dist/middleware/csrf.middleware.d.ts.map +1 -0
  136. package/dist/middleware/csrf.middleware.js +183 -0
  137. package/dist/middleware/global-middleware.d.ts +111 -0
  138. package/dist/middleware/global-middleware.d.ts.map +1 -0
  139. package/dist/middleware/global-middleware.js +179 -0
  140. package/dist/middleware/rate-limit.middleware.d.ts +73 -0
  141. package/dist/middleware/rate-limit.middleware.d.ts.map +1 -0
  142. package/dist/middleware/rate-limit.middleware.js +124 -0
  143. package/dist/middleware/security-headers.middleware.d.ts +76 -0
  144. package/dist/middleware/security-headers.middleware.d.ts.map +1 -0
  145. package/dist/middleware/security-headers.middleware.js +123 -0
  146. package/dist/middleware/timeout.middleware.d.ts +25 -0
  147. package/dist/middleware/timeout.middleware.d.ts.map +1 -0
  148. package/dist/middleware/timeout.middleware.js +74 -0
  149. package/dist/middleware.d.ts +13 -0
  150. package/dist/middleware.d.ts.map +1 -0
  151. package/dist/middleware.js +47 -0
  152. package/dist/pipes/pipe.d.ts +50 -0
  153. package/dist/pipes/pipe.d.ts.map +1 -0
  154. package/dist/pipes/pipe.js +96 -0
  155. package/dist/pipes/validation.pipe.d.ts +6 -0
  156. package/dist/pipes/validation.pipe.d.ts.map +1 -0
  157. package/dist/pipes/validation.pipe.js +61 -0
  158. package/dist/request-context.d.ts +17 -0
  159. package/dist/request-context.d.ts.map +1 -0
  160. package/dist/request-context.js +2 -0
  161. package/dist/request-parser.d.ts +7 -0
  162. package/dist/request-parser.d.ts.map +1 -0
  163. package/dist/request-parser.js +60 -0
  164. package/dist/router.d.ts +33 -0
  165. package/dist/router.d.ts.map +1 -0
  166. package/dist/router.js +426 -0
  167. package/dist/routing/route-matcher.d.ts +39 -0
  168. package/dist/routing/route-matcher.d.ts.map +1 -0
  169. package/dist/routing/route-matcher.js +93 -0
  170. package/dist/routing/version.decorator.d.ts +36 -0
  171. package/dist/routing/version.decorator.d.ts.map +1 -0
  172. package/dist/routing/version.decorator.js +89 -0
  173. package/dist/service.d.ts +9 -0
  174. package/dist/service.d.ts.map +1 -0
  175. package/dist/service.js +39 -0
  176. package/dist/shutdown.d.ts +32 -0
  177. package/dist/shutdown.d.ts.map +1 -0
  178. package/dist/shutdown.js +109 -0
  179. package/dist/testing/testing.module.d.ts +83 -0
  180. package/dist/testing/testing.module.d.ts.map +1 -0
  181. package/dist/testing/testing.module.js +164 -0
  182. package/dist/types.d.ts +76 -0
  183. package/dist/types.d.ts.map +1 -0
  184. package/dist/types.js +2 -0
  185. package/dist/upload/file-upload.d.ts +75 -0
  186. package/dist/upload/file-upload.d.ts.map +1 -0
  187. package/dist/upload/file-upload.js +261 -0
  188. package/dist/utils/sanitize.d.ts +45 -0
  189. package/dist/utils/sanitize.d.ts.map +1 -0
  190. package/dist/utils/sanitize.js +165 -0
  191. package/dist/validator.d.ts +7 -0
  192. package/dist/validator.d.ts.map +1 -0
  193. package/dist/validator.js +119 -0
  194. package/package.json +65 -0
@@ -0,0 +1,682 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const hazel_app_1 = require("../hazel-app");
4
+ require("reflect-metadata");
5
+ // Mock all dependencies
6
+ jest.mock('../logger', () => ({
7
+ info: jest.fn(),
8
+ debug: jest.fn(),
9
+ warn: jest.fn(),
10
+ error: jest.fn(),
11
+ isDebugEnabled: jest.fn().mockReturnValue(false),
12
+ }));
13
+ jest.mock('../container', () => {
14
+ const actualContainer = jest.requireActual('../container');
15
+ return {
16
+ ...actualContainer,
17
+ Container: {
18
+ getInstance: jest.fn(() => actualContainer.Container.createTestInstance()),
19
+ createTestInstance: actualContainer.Container.createTestInstance,
20
+ },
21
+ };
22
+ });
23
+ describe('HazelApp', () => {
24
+ describe('constructor', () => {
25
+ it('should create HazelApp instance', () => {
26
+ class AppModule {
27
+ }
28
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
29
+ const app = new hazel_app_1.HazelApp(AppModule);
30
+ expect(app).toBeDefined();
31
+ expect(app).toBeInstanceOf(hazel_app_1.HazelApp);
32
+ });
33
+ it('should initialize with module metadata', () => {
34
+ class AppModule {
35
+ }
36
+ Reflect.defineMetadata('hazel:module', {
37
+ controllers: [],
38
+ providers: [],
39
+ }, AppModule);
40
+ const app = new hazel_app_1.HazelApp(AppModule);
41
+ expect(app).toBeDefined();
42
+ });
43
+ it('should handle module with controllers', () => {
44
+ class TestController {
45
+ }
46
+ Reflect.defineMetadata('hazel:controller', { path: '/test' }, TestController);
47
+ Reflect.defineMetadata('hazel:routes', [], TestController);
48
+ class AppModule {
49
+ }
50
+ Reflect.defineMetadata('hazel:module', {
51
+ controllers: [TestController],
52
+ }, AppModule);
53
+ const app = new hazel_app_1.HazelApp(AppModule);
54
+ expect(app).toBeDefined();
55
+ });
56
+ it('should handle module with providers', () => {
57
+ class TestService {
58
+ }
59
+ class AppModule {
60
+ }
61
+ Reflect.defineMetadata('hazel:module', {
62
+ providers: [TestService],
63
+ }, AppModule);
64
+ const app = new hazel_app_1.HazelApp(AppModule);
65
+ expect(app).toBeDefined();
66
+ });
67
+ it('should handle module with imports', () => {
68
+ class ImportedModule {
69
+ }
70
+ Reflect.defineMetadata('hazel:module', {}, ImportedModule);
71
+ class AppModule {
72
+ }
73
+ Reflect.defineMetadata('hazel:module', {
74
+ imports: [ImportedModule],
75
+ }, AppModule);
76
+ const app = new hazel_app_1.HazelApp(AppModule);
77
+ expect(app).toBeDefined();
78
+ });
79
+ });
80
+ describe('configuration methods', () => {
81
+ let app;
82
+ beforeEach(() => {
83
+ class AppModule {
84
+ }
85
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
86
+ app = new hazel_app_1.HazelApp(AppModule);
87
+ });
88
+ it('should enable CORS', () => {
89
+ app.enableCors();
90
+ // Should not throw
91
+ expect(true).toBe(true);
92
+ });
93
+ it('should enable CORS with options', () => {
94
+ const corsOptions = {
95
+ origin: 'https://example.com',
96
+ credentials: true,
97
+ };
98
+ app.enableCors(corsOptions);
99
+ // Should not throw
100
+ expect(true).toBe(true);
101
+ });
102
+ it('should set request timeout', () => {
103
+ app.setRequestTimeout(5000);
104
+ // Should not throw
105
+ expect(true).toBe(true);
106
+ });
107
+ it('should set request timeout with options', () => {
108
+ const timeoutOptions = {
109
+ message: 'Custom timeout message',
110
+ };
111
+ app.setRequestTimeout(10000, timeoutOptions);
112
+ // Should not throw
113
+ expect(true).toBe(true);
114
+ });
115
+ it('should disable CORS', () => {
116
+ app.enableCors();
117
+ app.disableCors();
118
+ // Should not throw
119
+ expect(true).toBe(true);
120
+ });
121
+ });
122
+ describe('health and shutdown', () => {
123
+ let app;
124
+ beforeEach(() => {
125
+ class AppModule {
126
+ }
127
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
128
+ app = new hazel_app_1.HazelApp(AppModule);
129
+ });
130
+ it('should get health manager', () => {
131
+ const healthManager = app.getHealthManager();
132
+ expect(healthManager).toBeDefined();
133
+ });
134
+ it('should get shutdown manager', () => {
135
+ const shutdownManager = app.getShutdownManager();
136
+ expect(shutdownManager).toBeDefined();
137
+ });
138
+ it('should get container', () => {
139
+ const container = app.getContainer();
140
+ expect(container).toBeDefined();
141
+ });
142
+ });
143
+ describe('listen', () => {
144
+ let app;
145
+ beforeEach(() => {
146
+ class AppModule {
147
+ }
148
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
149
+ app = new hazel_app_1.HazelApp(AppModule);
150
+ });
151
+ it('should return promise when listening', async () => {
152
+ const listenPromise = app.listen(0); // Use port 0 for random available port
153
+ expect(listenPromise).toBeInstanceOf(Promise);
154
+ // Clean up
155
+ await listenPromise;
156
+ await app.close();
157
+ }, 10000);
158
+ it('should listen on specified port', async () => {
159
+ await app.listen(0);
160
+ // Clean up
161
+ await app.close();
162
+ }, 10000);
163
+ it('should handle multiple listen calls', async () => {
164
+ await app.listen(0);
165
+ // Server should be running
166
+ expect(true).toBe(true);
167
+ // Clean up
168
+ await app.close();
169
+ }, 10000);
170
+ });
171
+ describe('close', () => {
172
+ let app;
173
+ beforeEach(() => {
174
+ class AppModule {
175
+ }
176
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
177
+ app = new hazel_app_1.HazelApp(AppModule);
178
+ });
179
+ it('should close server gracefully', async () => {
180
+ await app.listen(0);
181
+ await app.close();
182
+ // Should not throw
183
+ expect(true).toBe(true);
184
+ }, 10000);
185
+ it('should handle close when server not started', async () => {
186
+ await app.close();
187
+ // Should not throw
188
+ expect(true).toBe(true);
189
+ });
190
+ });
191
+ describe('module initialization', () => {
192
+ it('should initialize module with nested imports', () => {
193
+ class NestedModule {
194
+ }
195
+ Reflect.defineMetadata('hazel:module', {}, NestedModule);
196
+ class MiddleModule {
197
+ }
198
+ Reflect.defineMetadata('hazel:module', {
199
+ imports: [NestedModule],
200
+ }, MiddleModule);
201
+ class AppModule {
202
+ }
203
+ Reflect.defineMetadata('hazel:module', {
204
+ imports: [MiddleModule],
205
+ }, AppModule);
206
+ const app = new hazel_app_1.HazelApp(AppModule);
207
+ expect(app).toBeDefined();
208
+ });
209
+ it('should initialize module with multiple controllers', () => {
210
+ class Controller1 {
211
+ }
212
+ Reflect.defineMetadata('hazel:controller', { path: '/c1' }, Controller1);
213
+ Reflect.defineMetadata('hazel:routes', [], Controller1);
214
+ class Controller2 {
215
+ }
216
+ Reflect.defineMetadata('hazel:controller', { path: '/c2' }, Controller2);
217
+ Reflect.defineMetadata('hazel:routes', [], Controller2);
218
+ class AppModule {
219
+ }
220
+ Reflect.defineMetadata('hazel:module', {
221
+ controllers: [Controller1, Controller2],
222
+ }, AppModule);
223
+ const app = new hazel_app_1.HazelApp(AppModule);
224
+ expect(app).toBeDefined();
225
+ });
226
+ it('should initialize module with multiple providers', () => {
227
+ class Service1 {
228
+ }
229
+ class Service2 {
230
+ }
231
+ class Service3 {
232
+ }
233
+ class AppModule {
234
+ }
235
+ Reflect.defineMetadata('hazel:module', {
236
+ providers: [Service1, Service2, Service3],
237
+ }, AppModule);
238
+ const app = new hazel_app_1.HazelApp(AppModule);
239
+ expect(app).toBeDefined();
240
+ });
241
+ });
242
+ describe('method chaining', () => {
243
+ let app;
244
+ beforeEach(() => {
245
+ class AppModule {
246
+ }
247
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
248
+ app = new hazel_app_1.HazelApp(AppModule);
249
+ });
250
+ it('should support configuration methods', () => {
251
+ app.enableCors();
252
+ app.setRequestTimeout(5000);
253
+ app.disableCors();
254
+ // Should not throw
255
+ expect(true).toBe(true);
256
+ });
257
+ });
258
+ describe('HttpResponse', () => {
259
+ it('should handle json response', () => {
260
+ // Test via actual app request handling would be complex
261
+ // Just verify app was created
262
+ expect(true).toBe(true);
263
+ });
264
+ });
265
+ describe('request handling', () => {
266
+ let app;
267
+ beforeEach(() => {
268
+ class TestController {
269
+ getTest() {
270
+ return { message: 'test' };
271
+ }
272
+ }
273
+ Reflect.defineMetadata('hazel:controller', { path: '/test' }, TestController);
274
+ Reflect.defineMetadata('hazel:routes', [{ method: 'GET', path: '/', propertyKey: 'getTest' }], TestController);
275
+ Reflect.defineMetadata('hazel:inject', [], TestController, 'getTest');
276
+ class AppModule {
277
+ }
278
+ Reflect.defineMetadata('hazel:module', {
279
+ controllers: [TestController],
280
+ }, AppModule);
281
+ app = new hazel_app_1.HazelApp(AppModule);
282
+ });
283
+ it('should initialize with controllers', () => {
284
+ expect(app).toBeDefined();
285
+ });
286
+ });
287
+ describe('error handling', () => {
288
+ it('should handle module without metadata', () => {
289
+ class AppModule {
290
+ }
291
+ const app = new hazel_app_1.HazelApp(AppModule);
292
+ expect(app).toBeDefined();
293
+ });
294
+ it('should handle empty module', () => {
295
+ class AppModule {
296
+ }
297
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
298
+ const app = new hazel_app_1.HazelApp(AppModule);
299
+ expect(app).toBeDefined();
300
+ });
301
+ });
302
+ describe('health and shutdown managers', () => {
303
+ let app;
304
+ beforeEach(() => {
305
+ class AppModule {
306
+ }
307
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
308
+ app = new hazel_app_1.HazelApp(AppModule);
309
+ });
310
+ it('should have health manager', () => {
311
+ const healthManager = app.getHealthManager();
312
+ expect(healthManager).toBeDefined();
313
+ });
314
+ it('should have shutdown manager', () => {
315
+ const shutdownManager = app.getShutdownManager();
316
+ expect(shutdownManager).toBeDefined();
317
+ });
318
+ it('should have container', () => {
319
+ const container = app.getContainer();
320
+ expect(container).toBeDefined();
321
+ });
322
+ });
323
+ describe('CORS configuration', () => {
324
+ let app;
325
+ beforeEach(() => {
326
+ class AppModule {
327
+ }
328
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
329
+ app = new hazel_app_1.HazelApp(AppModule);
330
+ });
331
+ it('should enable CORS with default options', () => {
332
+ app.enableCors();
333
+ expect(app).toBeDefined();
334
+ });
335
+ it('should enable CORS with custom options', () => {
336
+ app.enableCors({
337
+ origin: 'https://example.com',
338
+ credentials: true,
339
+ });
340
+ expect(app).toBeDefined();
341
+ });
342
+ it('should disable CORS', () => {
343
+ app.enableCors();
344
+ app.disableCors();
345
+ expect(app).toBeDefined();
346
+ });
347
+ });
348
+ describe('timeout configuration', () => {
349
+ let app;
350
+ beforeEach(() => {
351
+ class AppModule {
352
+ }
353
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
354
+ app = new hazel_app_1.HazelApp(AppModule);
355
+ });
356
+ it('should set request timeout', () => {
357
+ app.setRequestTimeout(5000);
358
+ expect(app).toBeDefined();
359
+ });
360
+ it('should set timeout with options', () => {
361
+ app.setRequestTimeout(10000, {
362
+ message: 'Custom timeout message',
363
+ });
364
+ expect(app).toBeDefined();
365
+ });
366
+ });
367
+ describe('module initialization', () => {
368
+ it('should initialize with imports', () => {
369
+ class ImportedModule {
370
+ }
371
+ Reflect.defineMetadata('hazel:module', {}, ImportedModule);
372
+ class AppModule {
373
+ }
374
+ Reflect.defineMetadata('hazel:module', {
375
+ imports: [ImportedModule],
376
+ }, AppModule);
377
+ const app = new hazel_app_1.HazelApp(AppModule);
378
+ expect(app).toBeDefined();
379
+ });
380
+ it('should initialize with providers', () => {
381
+ class TestService {
382
+ }
383
+ class AppModule {
384
+ }
385
+ Reflect.defineMetadata('hazel:module', {
386
+ providers: [TestService],
387
+ }, AppModule);
388
+ const app = new hazel_app_1.HazelApp(AppModule);
389
+ expect(app).toBeDefined();
390
+ });
391
+ it('should initialize with controllers and providers', () => {
392
+ class TestService {
393
+ }
394
+ class TestController {
395
+ constructor(service) {
396
+ this.service = service;
397
+ }
398
+ getTest() {
399
+ return { message: 'test' };
400
+ }
401
+ }
402
+ Reflect.defineMetadata('hazel:controller', { path: '/test' }, TestController);
403
+ Reflect.defineMetadata('hazel:routes', [{ method: 'GET', path: '/', propertyKey: 'getTest' }], TestController);
404
+ Reflect.defineMetadata('hazel:inject', [], TestController, 'getTest');
405
+ Reflect.defineMetadata('design:paramtypes', [TestService], TestController);
406
+ class AppModule {
407
+ }
408
+ Reflect.defineMetadata('hazel:module', {
409
+ providers: [TestService],
410
+ controllers: [TestController],
411
+ }, AppModule);
412
+ const app = new hazel_app_1.HazelApp(AppModule);
413
+ expect(app).toBeDefined();
414
+ });
415
+ });
416
+ describe('HTTP method helpers', () => {
417
+ let app;
418
+ beforeEach(() => {
419
+ class AppModule {
420
+ }
421
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
422
+ app = new hazel_app_1.HazelApp(AppModule);
423
+ });
424
+ it('should register GET route', () => {
425
+ const handler = jest.fn();
426
+ const result = app.get('/test', handler);
427
+ expect(result).toBe(app);
428
+ });
429
+ it('should register POST route', () => {
430
+ const handler = jest.fn();
431
+ const result = app.post('/test', handler);
432
+ expect(result).toBe(app);
433
+ });
434
+ it('should register PUT route', () => {
435
+ const handler = jest.fn();
436
+ const result = app.put('/test', handler);
437
+ expect(result).toBe(app);
438
+ });
439
+ it('should register DELETE route', () => {
440
+ const handler = jest.fn();
441
+ const result = app.delete('/test', handler);
442
+ expect(result).toBe(app);
443
+ });
444
+ it('should support method chaining', () => {
445
+ const handler = jest.fn();
446
+ const result = app
447
+ .get('/get', handler)
448
+ .post('/post', handler)
449
+ .put('/put', handler)
450
+ .delete('/delete', handler);
451
+ expect(result).toBe(app);
452
+ });
453
+ });
454
+ describe('component registration', () => {
455
+ let app;
456
+ beforeEach(() => {
457
+ class AppModule {
458
+ }
459
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
460
+ app = new hazel_app_1.HazelApp(AppModule);
461
+ });
462
+ it('should register component', () => {
463
+ class TestComponent {
464
+ getValue() {
465
+ return 'test';
466
+ }
467
+ }
468
+ const result = app.register(TestComponent);
469
+ expect(result).toBe(app);
470
+ });
471
+ it('should register multiple components', () => {
472
+ class Component1 {
473
+ }
474
+ class Component2 {
475
+ }
476
+ class Component3 {
477
+ }
478
+ app.register(Component1).register(Component2).register(Component3);
479
+ expect(app).toBeDefined();
480
+ });
481
+ });
482
+ describe('HttpResponse class', () => {
483
+ it('should handle status method', () => {
484
+ // Create a simple test to verify HttpResponse behavior
485
+ class AppModule {
486
+ }
487
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
488
+ const app = new hazel_app_1.HazelApp(AppModule);
489
+ expect(app).toBeDefined();
490
+ });
491
+ it('should handle json method', () => {
492
+ class AppModule {
493
+ }
494
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
495
+ const app = new hazel_app_1.HazelApp(AppModule);
496
+ expect(app).toBeDefined();
497
+ });
498
+ it('should handle send method', () => {
499
+ class AppModule {
500
+ }
501
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
502
+ const app = new hazel_app_1.HazelApp(AppModule);
503
+ expect(app).toBeDefined();
504
+ });
505
+ it('should handle end method', () => {
506
+ class AppModule {
507
+ }
508
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
509
+ const app = new hazel_app_1.HazelApp(AppModule);
510
+ expect(app).toBeDefined();
511
+ });
512
+ it('should handle setHeader method', () => {
513
+ class AppModule {
514
+ }
515
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
516
+ const app = new hazel_app_1.HazelApp(AppModule);
517
+ expect(app).toBeDefined();
518
+ });
519
+ it('should prevent duplicate header sends', () => {
520
+ class AppModule {
521
+ }
522
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
523
+ const app = new hazel_app_1.HazelApp(AppModule);
524
+ expect(app).toBeDefined();
525
+ });
526
+ });
527
+ describe('module imports', () => {
528
+ it('should register controllers from imported modules', () => {
529
+ class ImportedController {
530
+ getTest() {
531
+ return { message: 'imported' };
532
+ }
533
+ }
534
+ Reflect.defineMetadata('hazel:controller', { path: '/imported' }, ImportedController);
535
+ Reflect.defineMetadata('hazel:routes', [{ method: 'GET', path: '/', propertyKey: 'getTest' }], ImportedController);
536
+ Reflect.defineMetadata('hazel:inject', [], ImportedController, 'getTest');
537
+ class ImportedModule {
538
+ }
539
+ Reflect.defineMetadata('hazel:module', {
540
+ controllers: [ImportedController],
541
+ }, ImportedModule);
542
+ class AppModule {
543
+ }
544
+ Reflect.defineMetadata('hazel:module', {
545
+ imports: [ImportedModule],
546
+ }, AppModule);
547
+ const app = new hazel_app_1.HazelApp(AppModule);
548
+ expect(app).toBeDefined();
549
+ });
550
+ it('should handle imported modules without controllers', () => {
551
+ class ImportedModule {
552
+ }
553
+ Reflect.defineMetadata('hazel:module', {}, ImportedModule);
554
+ class AppModule {
555
+ }
556
+ Reflect.defineMetadata('hazel:module', {
557
+ imports: [ImportedModule],
558
+ }, AppModule);
559
+ const app = new hazel_app_1.HazelApp(AppModule);
560
+ expect(app).toBeDefined();
561
+ });
562
+ it('should handle nested imports', () => {
563
+ class Level3Module {
564
+ }
565
+ Reflect.defineMetadata('hazel:module', {}, Level3Module);
566
+ class Level2Module {
567
+ }
568
+ Reflect.defineMetadata('hazel:module', {
569
+ imports: [Level3Module],
570
+ }, Level2Module);
571
+ class Level1Module {
572
+ }
573
+ Reflect.defineMetadata('hazel:module', {
574
+ imports: [Level2Module],
575
+ }, Level1Module);
576
+ const app = new hazel_app_1.HazelApp(Level1Module);
577
+ expect(app).toBeDefined();
578
+ });
579
+ });
580
+ describe('initialization edge cases', () => {
581
+ it('should handle module with all empty arrays', () => {
582
+ class AppModule {
583
+ }
584
+ Reflect.defineMetadata('hazel:module', {
585
+ imports: [],
586
+ controllers: [],
587
+ providers: [],
588
+ exports: [],
589
+ }, AppModule);
590
+ const app = new hazel_app_1.HazelApp(AppModule);
591
+ expect(app).toBeDefined();
592
+ });
593
+ it('should initialize health checks', () => {
594
+ class AppModule {
595
+ }
596
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
597
+ const app = new hazel_app_1.HazelApp(AppModule);
598
+ const healthManager = app.getHealthManager();
599
+ expect(healthManager).toBeDefined();
600
+ });
601
+ it('should initialize shutdown manager', () => {
602
+ class AppModule {
603
+ }
604
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
605
+ const app = new hazel_app_1.HazelApp(AppModule);
606
+ const shutdownManager = app.getShutdownManager();
607
+ expect(shutdownManager).toBeDefined();
608
+ });
609
+ });
610
+ describe('request timeout configuration', () => {
611
+ let app;
612
+ beforeEach(() => {
613
+ class AppModule {
614
+ }
615
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
616
+ app = new hazel_app_1.HazelApp(AppModule);
617
+ });
618
+ it('should set timeout with number', () => {
619
+ app.setRequestTimeout(10000);
620
+ expect(app).toBeDefined();
621
+ });
622
+ it('should set timeout with options object', () => {
623
+ app.setRequestTimeout(10000, {
624
+ message: 'Request timeout',
625
+ });
626
+ expect(app).toBeDefined();
627
+ });
628
+ it('should set timeout with callback', () => {
629
+ const callback = jest.fn();
630
+ app.setRequestTimeout(10000, {
631
+ onTimeout: callback,
632
+ });
633
+ expect(app).toBeDefined();
634
+ });
635
+ });
636
+ describe('CORS configuration variations', () => {
637
+ let app;
638
+ beforeEach(() => {
639
+ class AppModule {
640
+ }
641
+ Reflect.defineMetadata('hazel:module', {}, AppModule);
642
+ app = new hazel_app_1.HazelApp(AppModule);
643
+ });
644
+ it('should enable CORS with origin string', () => {
645
+ app.enableCors({ origin: 'https://example.com' });
646
+ expect(app).toBeDefined();
647
+ });
648
+ it('should enable CORS with origin array', () => {
649
+ app.enableCors({ origin: ['https://example.com', 'https://test.com'] });
650
+ expect(app).toBeDefined();
651
+ });
652
+ it('should enable CORS with credentials', () => {
653
+ app.enableCors({ credentials: true });
654
+ expect(app).toBeDefined();
655
+ });
656
+ it('should enable CORS with custom methods', () => {
657
+ app.enableCors({ methods: ['GET', 'POST', 'PATCH'] });
658
+ expect(app).toBeDefined();
659
+ });
660
+ it('should enable CORS with custom headers', () => {
661
+ app.enableCors({ allowedHeaders: ['Content-Type', 'X-Custom-Header'] });
662
+ expect(app).toBeDefined();
663
+ });
664
+ it('should enable CORS with all options', () => {
665
+ app.enableCors({
666
+ origin: 'https://example.com',
667
+ credentials: true,
668
+ methods: ['GET', 'POST'],
669
+ allowedHeaders: ['Content-Type'],
670
+ exposedHeaders: ['X-Total-Count'],
671
+ maxAge: 3600,
672
+ });
673
+ expect(app).toBeDefined();
674
+ });
675
+ it('should toggle CORS on and off', () => {
676
+ app.enableCors();
677
+ app.disableCors();
678
+ app.enableCors({ origin: '*' });
679
+ expect(app).toBeDefined();
680
+ });
681
+ });
682
+ });
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ //# sourceMappingURL=hazel-module.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazel-module.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hazel-module.test.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC"}