@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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=http.error.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.error.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/errors/http.error.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const http_error_1 = require("../../errors/http.error");
4
+ describe('HTTP Errors', () => {
5
+ describe('HttpError', () => {
6
+ it('should create error with status code and message', () => {
7
+ const error = new http_error_1.HttpError(418, "I'm a teapot");
8
+ expect(error).toBeInstanceOf(Error);
9
+ expect(error.statusCode).toBe(418);
10
+ expect(error.message).toBe("I'm a teapot");
11
+ expect(error.name).toBe('HttpError');
12
+ });
13
+ it('should include validation errors', () => {
14
+ const validationErrors = ['Field1 is required', 'Field2 is invalid'];
15
+ const error = new http_error_1.HttpError(400, 'Validation failed', validationErrors);
16
+ expect(error.errors).toEqual(validationErrors);
17
+ });
18
+ it('should work without validation errors', () => {
19
+ const error = new http_error_1.HttpError(500, 'Server error');
20
+ expect(error.errors).toBeUndefined();
21
+ });
22
+ });
23
+ describe('BadRequestError', () => {
24
+ it('should create 400 error', () => {
25
+ const error = new http_error_1.BadRequestError('Invalid input');
26
+ expect(error).toBeInstanceOf(http_error_1.HttpError);
27
+ expect(error.statusCode).toBe(400);
28
+ expect(error.message).toBe('Invalid input');
29
+ expect(error.name).toBe('BadRequestError');
30
+ });
31
+ it('should include validation errors', () => {
32
+ const validationErrors = ['Email is required'];
33
+ const error = new http_error_1.BadRequestError('Validation failed', validationErrors);
34
+ expect(error.errors).toEqual(validationErrors);
35
+ });
36
+ });
37
+ describe('UnauthorizedError', () => {
38
+ it('should create 401 error with default message', () => {
39
+ const error = new http_error_1.UnauthorizedError();
40
+ expect(error).toBeInstanceOf(http_error_1.HttpError);
41
+ expect(error.statusCode).toBe(401);
42
+ expect(error.message).toBe('Unauthorized');
43
+ expect(error.name).toBe('UnauthorizedError');
44
+ });
45
+ it('should create 401 error with custom message', () => {
46
+ const error = new http_error_1.UnauthorizedError('Invalid token');
47
+ expect(error.statusCode).toBe(401);
48
+ expect(error.message).toBe('Invalid token');
49
+ });
50
+ });
51
+ describe('ForbiddenError', () => {
52
+ it('should create 403 error with default message', () => {
53
+ const error = new http_error_1.ForbiddenError();
54
+ expect(error).toBeInstanceOf(http_error_1.HttpError);
55
+ expect(error.statusCode).toBe(403);
56
+ expect(error.message).toBe('Forbidden');
57
+ expect(error.name).toBe('ForbiddenError');
58
+ });
59
+ it('should create 403 error with custom message', () => {
60
+ const error = new http_error_1.ForbiddenError('Access denied');
61
+ expect(error.statusCode).toBe(403);
62
+ expect(error.message).toBe('Access denied');
63
+ });
64
+ });
65
+ describe('NotFoundError', () => {
66
+ it('should create 404 error with default message', () => {
67
+ const error = new http_error_1.NotFoundError();
68
+ expect(error).toBeInstanceOf(http_error_1.HttpError);
69
+ expect(error.statusCode).toBe(404);
70
+ expect(error.message).toBe('Not Found');
71
+ expect(error.name).toBe('NotFoundError');
72
+ });
73
+ it('should create 404 error with custom message', () => {
74
+ const error = new http_error_1.NotFoundError('User not found');
75
+ expect(error.statusCode).toBe(404);
76
+ expect(error.message).toBe('User not found');
77
+ });
78
+ });
79
+ describe('ConflictError', () => {
80
+ it('should create 409 error', () => {
81
+ const error = new http_error_1.ConflictError('Resource already exists');
82
+ expect(error).toBeInstanceOf(http_error_1.HttpError);
83
+ expect(error.statusCode).toBe(409);
84
+ expect(error.message).toBe('Resource already exists');
85
+ expect(error.name).toBe('ConflictError');
86
+ });
87
+ });
88
+ describe('InternalServerError', () => {
89
+ it('should create 500 error with default message', () => {
90
+ const error = new http_error_1.InternalServerError();
91
+ expect(error).toBeInstanceOf(http_error_1.HttpError);
92
+ expect(error.statusCode).toBe(500);
93
+ expect(error.message).toBe('Internal Server Error');
94
+ expect(error.name).toBe('InternalServerError');
95
+ });
96
+ it('should create 500 error with custom message', () => {
97
+ const error = new http_error_1.InternalServerError('Database connection failed');
98
+ expect(error.statusCode).toBe(500);
99
+ expect(error.message).toBe('Database connection failed');
100
+ });
101
+ });
102
+ describe('Error inheritance', () => {
103
+ it('should be catchable as Error', () => {
104
+ const error = new http_error_1.BadRequestError('test');
105
+ expect(error instanceof Error).toBe(true);
106
+ });
107
+ it('should be catchable as HttpError', () => {
108
+ const error = new http_error_1.NotFoundError('test');
109
+ expect(error instanceof http_error_1.HttpError).toBe(true);
110
+ });
111
+ it('should have proper stack trace', () => {
112
+ const error = new http_error_1.InternalServerError('test');
113
+ expect(error.stack).toBeDefined();
114
+ expect(error.stack).toContain('InternalServerError');
115
+ });
116
+ });
117
+ });
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ //# sourceMappingURL=exception-filter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exception-filter.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/filters/exception-filter.test.ts"],"names":[],"mappings":"AAMA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const exception_filter_1 = require("../../filters/exception-filter");
10
+ require("reflect-metadata");
11
+ describe('Exception Filters', () => {
12
+ let mockReq;
13
+ let mockRes;
14
+ beforeEach(() => {
15
+ mockReq = {
16
+ method: 'GET',
17
+ url: '/test',
18
+ headers: {},
19
+ };
20
+ mockRes = {
21
+ status: jest.fn().mockReturnThis(),
22
+ json: jest.fn(),
23
+ setHeader: jest.fn(),
24
+ };
25
+ });
26
+ describe('ArgumentsHostImpl', () => {
27
+ it('should create arguments host', () => {
28
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
29
+ expect(host).toBeDefined();
30
+ });
31
+ it('should switch to HTTP context', () => {
32
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
33
+ const http = host.switchToHttp();
34
+ expect(http).toBeDefined();
35
+ expect(typeof http.getRequest).toBe('function');
36
+ expect(typeof http.getResponse).toBe('function');
37
+ });
38
+ it('should get request from HTTP context', () => {
39
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
40
+ const http = host.switchToHttp();
41
+ const request = http.getRequest();
42
+ expect(request).toBe(mockReq);
43
+ });
44
+ it('should get response from HTTP context', () => {
45
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
46
+ const http = host.switchToHttp();
47
+ const response = http.getResponse();
48
+ expect(response).toBe(mockRes);
49
+ });
50
+ it('should return http type', () => {
51
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
52
+ expect(host.getType()).toBe('http');
53
+ });
54
+ it('should support generic types', () => {
55
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
56
+ const http = host.switchToHttp();
57
+ const request = http.getRequest();
58
+ const response = http.getResponse();
59
+ expect(request).toBe(mockReq);
60
+ expect(response).toBe(mockRes);
61
+ });
62
+ });
63
+ describe('Catch decorator', () => {
64
+ it('should mark class with exception metadata', () => {
65
+ class CustomError extends Error {
66
+ }
67
+ let TestFilter = class TestFilter {
68
+ };
69
+ TestFilter = __decorate([
70
+ (0, exception_filter_1.Catch)(CustomError)
71
+ ], TestFilter);
72
+ const metadata = Reflect.getMetadata('hazel:exception-filter', TestFilter);
73
+ expect(metadata).toEqual([CustomError]);
74
+ });
75
+ it('should support multiple exception types', () => {
76
+ class ErrorA extends Error {
77
+ }
78
+ class ErrorB extends Error {
79
+ }
80
+ let TestFilter = class TestFilter {
81
+ };
82
+ TestFilter = __decorate([
83
+ (0, exception_filter_1.Catch)(ErrorA, ErrorB)
84
+ ], TestFilter);
85
+ const metadata = Reflect.getMetadata('hazel:exception-filter', TestFilter);
86
+ expect(metadata).toEqual([ErrorA, ErrorB]);
87
+ });
88
+ it('should work with no exceptions', () => {
89
+ let TestFilter = class TestFilter {
90
+ };
91
+ TestFilter = __decorate([
92
+ (0, exception_filter_1.Catch)()
93
+ ], TestFilter);
94
+ const metadata = Reflect.getMetadata('hazel:exception-filter', TestFilter);
95
+ expect(metadata).toEqual([]);
96
+ });
97
+ });
98
+ describe('getFilterExceptions', () => {
99
+ it('should get exceptions from filter', () => {
100
+ class CustomError extends Error {
101
+ }
102
+ let TestFilter = class TestFilter {
103
+ };
104
+ TestFilter = __decorate([
105
+ (0, exception_filter_1.Catch)(CustomError)
106
+ ], TestFilter);
107
+ const filter = new TestFilter();
108
+ const exceptions = (0, exception_filter_1.getFilterExceptions)(filter);
109
+ expect(exceptions).toEqual([CustomError]);
110
+ });
111
+ it('should return empty array if no metadata', () => {
112
+ class TestFilter {
113
+ }
114
+ const filter = new TestFilter();
115
+ const exceptions = (0, exception_filter_1.getFilterExceptions)(filter);
116
+ expect(exceptions).toEqual([]);
117
+ });
118
+ it('should get multiple exceptions', () => {
119
+ class ErrorA extends Error {
120
+ }
121
+ class ErrorB extends Error {
122
+ }
123
+ class ErrorC extends Error {
124
+ }
125
+ let TestFilter = class TestFilter {
126
+ };
127
+ TestFilter = __decorate([
128
+ (0, exception_filter_1.Catch)(ErrorA, ErrorB, ErrorC)
129
+ ], TestFilter);
130
+ const filter = new TestFilter();
131
+ const exceptions = (0, exception_filter_1.getFilterExceptions)(filter);
132
+ expect(exceptions).toEqual([ErrorA, ErrorB, ErrorC]);
133
+ });
134
+ });
135
+ });
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ //# sourceMappingURL=http-exception.filter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-exception.filter.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/filters/http-exception.filter.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("reflect-metadata");
4
+ const http_exception_filter_1 = require("../../filters/http-exception.filter");
5
+ const exception_filter_1 = require("../../filters/exception-filter");
6
+ const http_error_1 = require("../../errors/http.error");
7
+ // Mock logger
8
+ jest.mock('../../logger', () => ({
9
+ error: jest.fn(),
10
+ debug: jest.fn(),
11
+ }));
12
+ describe('HttpExceptionFilter', () => {
13
+ let filter;
14
+ let mockReq;
15
+ let mockRes;
16
+ beforeEach(() => {
17
+ filter = new http_exception_filter_1.HttpExceptionFilter();
18
+ mockReq = {
19
+ method: 'GET',
20
+ url: '/test',
21
+ headers: {},
22
+ };
23
+ mockRes = {
24
+ status: jest.fn().mockReturnThis(),
25
+ json: jest.fn(),
26
+ setHeader: jest.fn(),
27
+ };
28
+ });
29
+ it('should catch HttpError and send response', () => {
30
+ const error = new http_error_1.HttpError(400, 'Bad request');
31
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
32
+ filter.catch(error, host);
33
+ expect(mockRes.status).toHaveBeenCalledWith(400);
34
+ expect(mockRes.json).toHaveBeenCalledWith({
35
+ statusCode: 400,
36
+ message: 'Bad request',
37
+ timestamp: expect.any(String),
38
+ path: '/test',
39
+ });
40
+ });
41
+ it('should handle BadRequestError', () => {
42
+ const error = new http_error_1.BadRequestError('Invalid input');
43
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
44
+ filter.catch(error, host);
45
+ expect(mockRes.status).toHaveBeenCalledWith(400);
46
+ expect(mockRes.json).toHaveBeenCalledWith({
47
+ statusCode: 400,
48
+ message: 'Invalid input',
49
+ timestamp: expect.any(String),
50
+ path: '/test',
51
+ });
52
+ });
53
+ it('should handle NotFoundError', () => {
54
+ const error = new http_error_1.NotFoundError('Resource not found');
55
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
56
+ filter.catch(error, host);
57
+ expect(mockRes.status).toHaveBeenCalledWith(404);
58
+ expect(mockRes.json).toHaveBeenCalledWith({
59
+ statusCode: 404,
60
+ message: 'Resource not found',
61
+ timestamp: expect.any(String),
62
+ path: '/test',
63
+ });
64
+ });
65
+ it('should include validation errors if present', () => {
66
+ const validationErrors = ['Field1 is required', 'Field2 is invalid'];
67
+ const error = new http_error_1.HttpError(400, 'Validation failed', validationErrors);
68
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
69
+ filter.catch(error, host);
70
+ expect(mockRes.json).toHaveBeenCalledWith({
71
+ statusCode: 400,
72
+ message: 'Validation failed',
73
+ timestamp: expect.any(String),
74
+ path: '/test',
75
+ errors: validationErrors,
76
+ });
77
+ });
78
+ it('should use 500 status code if not provided', () => {
79
+ const error = new http_error_1.HttpError(0, 'Unknown error');
80
+ error.statusCode = undefined;
81
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
82
+ filter.catch(error, host);
83
+ expect(mockRes.status).toHaveBeenCalledWith(500);
84
+ });
85
+ it('should use default message if not provided', () => {
86
+ const error = new http_error_1.HttpError(500, '');
87
+ error.message = undefined;
88
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
89
+ filter.catch(error, host);
90
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
91
+ message: 'Internal server error',
92
+ }));
93
+ });
94
+ it('should include timestamp in ISO format', () => {
95
+ const error = new http_error_1.HttpError(400, 'Test error');
96
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
97
+ filter.catch(error, host);
98
+ const callArgs = mockRes.json.mock.calls[0][0];
99
+ const timestamp = new Date(callArgs.timestamp);
100
+ expect(timestamp.toISOString()).toBe(callArgs.timestamp);
101
+ });
102
+ it('should include request path', () => {
103
+ mockReq.url = '/api/users/123';
104
+ const error = new http_error_1.HttpError(404, 'User not found');
105
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
106
+ filter.catch(error, host);
107
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
108
+ path: '/api/users/123',
109
+ }));
110
+ });
111
+ it('should handle POST requests', () => {
112
+ mockReq.method = 'POST';
113
+ mockReq.url = '/api/users';
114
+ const error = new http_error_1.BadRequestError('Invalid data');
115
+ const host = new exception_filter_1.ArgumentsHostImpl(mockReq, mockRes);
116
+ filter.catch(error, host);
117
+ expect(mockRes.status).toHaveBeenCalledWith(400);
118
+ });
119
+ });
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ //# sourceMappingURL=hazel-app.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazel-app.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hazel-app.test.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC"}