@venok/http 1.0.1-canary.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 (254) hide show
  1. package/adapter/adapter.d.ts +57 -0
  2. package/adapter/adapter.js +58 -0
  3. package/adapter/host.d.ts +27 -0
  4. package/adapter/host.js +33 -0
  5. package/application/application.d.ts +18 -0
  6. package/application/application.js +51 -0
  7. package/application/config.d.ts +16 -0
  8. package/application/config.js +47 -0
  9. package/application/http.module-defenition.d.ts +8 -0
  10. package/application/http.module-defenition.js +6 -0
  11. package/application/http.module.d.ts +3 -0
  12. package/application/http.module.js +21 -0
  13. package/application/http.service.d.ts +11 -0
  14. package/application/http.service.js +43 -0
  15. package/application/starter.d.ts +41 -0
  16. package/application/starter.js +140 -0
  17. package/constants.d.ts +12 -0
  18. package/constants.js +15 -0
  19. package/context/context.d.ts +56 -0
  20. package/context/context.js +102 -0
  21. package/context/response.controller.d.ts +30 -0
  22. package/context/response.controller.js +86 -0
  23. package/decorators/controller.decorator.d.ts +82 -0
  24. package/decorators/controller.decorator.js +53 -0
  25. package/decorators/header.decorator.d.ts +12 -0
  26. package/decorators/header.decorator.js +23 -0
  27. package/decorators/http-code.decorator.d.ts +9 -0
  28. package/decorators/http-code.decorator.js +19 -0
  29. package/decorators/index.d.ts +9 -0
  30. package/decorators/index.js +25 -0
  31. package/decorators/redirect.decorator.d.ts +6 -0
  32. package/decorators/redirect.decorator.js +16 -0
  33. package/decorators/render.decorator.d.ts +10 -0
  34. package/decorators/render.decorator.js +20 -0
  35. package/decorators/request-mapping.decorator.d.ts +78 -0
  36. package/decorators/request-mapping.decorator.js +98 -0
  37. package/decorators/route-params.decorator.d.ts +378 -0
  38. package/decorators/route-params.decorator.js +227 -0
  39. package/decorators/sse.decorator.d.ts +6 -0
  40. package/decorators/sse.decorator.js +20 -0
  41. package/decorators/version.decorator.d.ts +7 -0
  42. package/decorators/version.decorator.js +20 -0
  43. package/enums/http-status.enum.d.ts +53 -0
  44. package/enums/http-status.enum.js +57 -0
  45. package/enums/index.d.ts +4 -0
  46. package/enums/index.js +20 -0
  47. package/enums/request-method.enum.d.ts +11 -0
  48. package/enums/request-method.enum.js +15 -0
  49. package/enums/route-paramtypes.enum.d.ts +14 -0
  50. package/enums/route-paramtypes.enum.js +18 -0
  51. package/enums/version-type.enum.d.ts +9 -0
  52. package/enums/version-type.enum.js +13 -0
  53. package/errors/bad-gateway.exception.d.ts +33 -0
  54. package/errors/bad-gateway.exception.js +41 -0
  55. package/errors/bad-request.exception.d.ts +33 -0
  56. package/errors/bad-request.exception.js +41 -0
  57. package/errors/conflict.exception.d.ts +33 -0
  58. package/errors/conflict.exception.js +41 -0
  59. package/errors/forbidden.exception.d.ts +33 -0
  60. package/errors/forbidden.exception.js +41 -0
  61. package/errors/gateway-timeout.exception.d.ts +33 -0
  62. package/errors/gateway-timeout.exception.js +41 -0
  63. package/errors/gone.exception.d.ts +33 -0
  64. package/errors/gone.exception.js +41 -0
  65. package/errors/http-version-not-supported.exception.d.ts +33 -0
  66. package/errors/http-version-not-supported.exception.js +41 -0
  67. package/errors/http.exception.d.ts +79 -0
  68. package/errors/http.exception.js +123 -0
  69. package/errors/im-a-teapot.exception.d.ts +36 -0
  70. package/errors/im-a-teapot.exception.js +44 -0
  71. package/errors/index.d.ts +11 -0
  72. package/errors/index.js +27 -0
  73. package/errors/internal-server-error.exception.d.ts +33 -0
  74. package/errors/internal-server-error.exception.js +41 -0
  75. package/errors/invalid-middleware-configuration.exception.d.ts +4 -0
  76. package/errors/invalid-middleware-configuration.exception.js +11 -0
  77. package/errors/invalid-middleware.exception.d.ts +4 -0
  78. package/errors/invalid-middleware.exception.js +11 -0
  79. package/errors/not-found.exception.d.ts +33 -0
  80. package/errors/not-found.exception.js +41 -0
  81. package/errors/unknown-request-mapping.exception.d.ts +5 -0
  82. package/errors/unknown-request-mapping.exception.js +11 -0
  83. package/exceptions/messages.d.ts +4 -0
  84. package/exceptions/messages.js +13 -0
  85. package/explorers/path.explorer.d.ts +8 -0
  86. package/explorers/path.explorer.js +38 -0
  87. package/explorers/router.explorer.d.ts +51 -0
  88. package/explorers/router.explorer.js +195 -0
  89. package/factory/context-id.factory.d.ts +41 -0
  90. package/factory/context-id.factory.js +52 -0
  91. package/factory/index.d.ts +4 -0
  92. package/factory/index.js +20 -0
  93. package/factory/method.factory.d.ts +5 -0
  94. package/factory/method.factory.js +30 -0
  95. package/factory/params.factory.d.ts +5 -0
  96. package/factory/params.factory.js +39 -0
  97. package/factory/path.factory.d.ts +13 -0
  98. package/factory/path.factory.js +95 -0
  99. package/filters/context.d.ts +9 -0
  100. package/filters/context.js +15 -0
  101. package/filters/filter.d.ts +22 -0
  102. package/filters/filter.js +78 -0
  103. package/helpers/adapter.helper.d.ts +27 -0
  104. package/helpers/adapter.helper.js +37 -0
  105. package/helpers/exclude-route.helper.d.ts +4 -0
  106. package/helpers/exclude-route.helper.js +18 -0
  107. package/helpers/flatten-routes.helper.d.ts +5 -0
  108. package/helpers/flatten-routes.helper.js +27 -0
  109. package/helpers/index.d.ts +6 -0
  110. package/helpers/index.js +22 -0
  111. package/helpers/messages.helper.d.ts +6 -0
  112. package/helpers/messages.helper.js +25 -0
  113. package/helpers/path.helper.d.ts +3 -0
  114. package/helpers/path.helper.js +13 -0
  115. package/helpers/sse.helper.d.ts +45 -0
  116. package/helpers/sse.helper.js +83 -0
  117. package/index.d.ts +1 -0
  118. package/index.js +3 -0
  119. package/interfaces/http/cors.interface.d.ts +58 -0
  120. package/interfaces/http/cors.interface.js +2 -0
  121. package/interfaces/http/exception.interface.d.ts +6 -0
  122. package/interfaces/http/exception.interface.js +2 -0
  123. package/interfaces/http/exclude-route.interface.d.ts +15 -0
  124. package/interfaces/http/exclude-route.interface.js +2 -0
  125. package/interfaces/http/index.d.ts +10 -0
  126. package/interfaces/http/index.js +26 -0
  127. package/interfaces/http/message-event.interface.d.ts +6 -0
  128. package/interfaces/http/message-event.interface.js +2 -0
  129. package/interfaces/http/module.inteface.d.ts +5 -0
  130. package/interfaces/http/module.inteface.js +2 -0
  131. package/interfaces/http/options.interface.d.ts +127 -0
  132. package/interfaces/http/options.interface.js +2 -0
  133. package/interfaces/http/path-metadata.interface.d.ts +31 -0
  134. package/interfaces/http/path-metadata.interface.js +2 -0
  135. package/interfaces/http/prefix-options.interface.d.ts +7 -0
  136. package/interfaces/http/prefix-options.interface.js +2 -0
  137. package/interfaces/http/raw-request.d.ts +4 -0
  138. package/interfaces/http/raw-request.js +2 -0
  139. package/interfaces/http/routes.interface.d.ts +7 -0
  140. package/interfaces/http/routes.interface.js +2 -0
  141. package/interfaces/http/server.interface.d.ts +54 -0
  142. package/interfaces/http/server.interface.js +2 -0
  143. package/interfaces/index.d.ts +3 -0
  144. package/interfaces/index.js +19 -0
  145. package/interfaces/middleware/config-proxy.interface.d.ts +23 -0
  146. package/interfaces/middleware/config-proxy.interface.js +2 -0
  147. package/interfaces/middleware/configuration.interface.d.ts +12 -0
  148. package/interfaces/middleware/configuration.interface.js +2 -0
  149. package/interfaces/middleware/consumer.interface.d.ts +16 -0
  150. package/interfaces/middleware/consumer.interface.js +2 -0
  151. package/interfaces/middleware/index.d.ts +4 -0
  152. package/interfaces/middleware/index.js +20 -0
  153. package/interfaces/middleware/middleware.interface.d.ts +7 -0
  154. package/interfaces/middleware/middleware.interface.js +2 -0
  155. package/interfaces/router/callback-paramtypes.interface.d.ts +1 -0
  156. package/interfaces/router/callback-paramtypes.interface.js +2 -0
  157. package/interfaces/router/definition.interface.d.ts +10 -0
  158. package/interfaces/router/definition.interface.js +2 -0
  159. package/interfaces/router/index.d.ts +3 -0
  160. package/interfaces/router/index.js +19 -0
  161. package/interfaces/router/version-options.interface.d.ts +92 -0
  162. package/interfaces/router/version-options.interface.js +9 -0
  163. package/middleware/builder.d.ts +15 -0
  164. package/middleware/builder.js +78 -0
  165. package/middleware/container.d.ts +13 -0
  166. package/middleware/container.js +50 -0
  167. package/middleware/extractor.d.ts +15 -0
  168. package/middleware/extractor.js +50 -0
  169. package/middleware/index.d.ts +1 -0
  170. package/middleware/index.js +17 -0
  171. package/middleware/module.d.ts +33 -0
  172. package/middleware/module.js +180 -0
  173. package/middleware/resolver.d.ts +10 -0
  174. package/middleware/resolver.js +27 -0
  175. package/middleware/routes-mapper.d.ts +19 -0
  176. package/middleware/routes-mapper.js +111 -0
  177. package/middleware/utils.d.ts +8 -0
  178. package/middleware/utils.js +86 -0
  179. package/package.json +41 -0
  180. package/router/module.d.ts +18 -0
  181. package/router/module.js +88 -0
  182. package/router/resolver.d.ts +31 -0
  183. package/router/resolver.js +128 -0
  184. package/storage/http-instance.storage.d.ts +9 -0
  185. package/storage/http-instance.storage.js +19 -0
  186. package/stream/index.d.ts +1 -0
  187. package/stream/index.js +17 -0
  188. package/stream/interfaces/index.d.ts +2 -0
  189. package/stream/interfaces/index.js +18 -0
  190. package/stream/interfaces/streamable-handler-response.interface.d.ts +12 -0
  191. package/stream/interfaces/streamable-handler-response.interface.js +2 -0
  192. package/stream/interfaces/streamable-options.interface.d.ts +10 -0
  193. package/stream/interfaces/streamable-options.interface.js +2 -0
  194. package/stream/streamable-file.d.ts +22 -0
  195. package/stream/streamable-file.js +55 -0
  196. package/test/context/response.controller.spec.d.ts +1 -0
  197. package/test/context/response.controller.spec.js +328 -0
  198. package/test/decorators/controller.decorator.spec.d.ts +1 -0
  199. package/test/decorators/controller.decorator.spec.js +113 -0
  200. package/test/decorators/header.decorator.spec.d.ts +1 -0
  201. package/test/decorators/header.decorator.spec.js +33 -0
  202. package/test/decorators/http-code.decorator.spec.d.ts +1 -0
  203. package/test/decorators/http-code.decorator.spec.js +30 -0
  204. package/test/decorators/redirect.decorator.spec.d.ts +1 -0
  205. package/test/decorators/redirect.decorator.spec.js +36 -0
  206. package/test/decorators/render.decorator.spec.d.ts +1 -0
  207. package/test/decorators/render.decorator.spec.js +30 -0
  208. package/test/decorators/request-mapping.decorator.spec.d.ts +1 -0
  209. package/test/decorators/request-mapping.decorator.spec.js +85 -0
  210. package/test/decorators/route-params.decorator.spec.d.ts +1 -0
  211. package/test/decorators/route-params.decorator.spec.js +493 -0
  212. package/test/decorators/sse.decorator.spec.d.ts +1 -0
  213. package/test/decorators/sse.decorator.spec.js +35 -0
  214. package/test/decorators/version.decorator.spec.d.ts +1 -0
  215. package/test/decorators/version.decorator.spec.js +43 -0
  216. package/test/exceptions/handler.spec.d.ts +1 -0
  217. package/test/exceptions/handler.spec.js +145 -0
  218. package/test/exceptions/proxy.spec.d.ts +1 -0
  219. package/test/exceptions/proxy.spec.js +74 -0
  220. package/test/explorers/path.explorer.spec.d.ts +1 -0
  221. package/test/explorers/path.explorer.spec.js +190 -0
  222. package/test/explorers/router.explorer.spec.d.ts +1 -0
  223. package/test/explorers/router.explorer.spec.js +206 -0
  224. package/test/factory/method.factory.spec.d.ts +1 -0
  225. package/test/factory/method.factory.spec.js +33 -0
  226. package/test/factory/params.factory.spec.d.ts +1 -0
  227. package/test/factory/params.factory.spec.js +104 -0
  228. package/test/factory/path.factory.spec.d.ts +1 -0
  229. package/test/factory/path.factory.spec.js +260 -0
  230. package/test/filters/context.spec.d.ts +1 -0
  231. package/test/filters/context.spec.js +96 -0
  232. package/test/filters/filter.spec.d.ts +1 -0
  233. package/test/filters/filter.spec.js +96 -0
  234. package/test/helpers/flatten-routes.helper.spec.d.ts +1 -0
  235. package/test/helpers/flatten-routes.helper.spec.js +131 -0
  236. package/test/helpers/sse.helper.spec.d.ts +1 -0
  237. package/test/helpers/sse.helper.spec.js +132 -0
  238. package/test/middleware/builder.spec.d.ts +1 -0
  239. package/test/middleware/builder.spec.js +235 -0
  240. package/test/middleware/container.spec.d.ts +1 -0
  241. package/test/middleware/container.spec.js +81 -0
  242. package/test/middleware/module.spec.d.ts +1 -0
  243. package/test/middleware/module.spec.js +206 -0
  244. package/test/middleware/route-info-path-extractor.spec.d.ts +1 -0
  245. package/test/middleware/route-info-path-extractor.spec.js +123 -0
  246. package/test/middleware/routes-mapper.spec.d.ts +1 -0
  247. package/test/middleware/routes-mapper.spec.js +162 -0
  248. package/test/middleware/utils.spec.d.ts +1 -0
  249. package/test/middleware/utils.spec.js +132 -0
  250. package/test/router/module.spec.d.ts +1 -0
  251. package/test/router/module.spec.js +40 -0
  252. package/test/router/resolver.spec.d.ts +1 -0
  253. package/test/router/resolver.spec.js +326 -0
  254. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const chai_1 = require("chai");
7
+ const rxjs_1 = require("rxjs");
8
+ const sinon_1 = __importDefault(require("sinon"));
9
+ const stream_1 = require("../../../../../../../stream");
10
+ const response_controller_1 = require("@venok/http/context/response.controller");
11
+ const adapter_helper_1 = require("@venok/http/helpers/adapter.helper");
12
+ const shared_helper_1 = require("../../../core/helpers/shared.helper");
13
+ const enums_1 = require("@venok/http/enums");
14
+ describe("RouterResponseController", () => {
15
+ let adapter;
16
+ let routerResponseController;
17
+ beforeEach(() => {
18
+ adapter = new adapter_helper_1.NoopHttpAdapter({});
19
+ routerResponseController = new response_controller_1.RouterResponseController(adapter);
20
+ });
21
+ describe("apply", () => {
22
+ let response;
23
+ beforeEach(() => {
24
+ response = { send: sinon_1.default.spy(), json: sinon_1.default.spy(), status: sinon_1.default.spy() };
25
+ });
26
+ describe("when result is", () => {
27
+ beforeEach(() => {
28
+ sinon_1.default.stub(adapter, "reply").callsFake((responseRef, body, statusCode) => {
29
+ if (statusCode) {
30
+ responseRef.status(statusCode);
31
+ }
32
+ if ((0, shared_helper_1.isNull)(body)) {
33
+ return responseRef.send();
34
+ }
35
+ return (0, shared_helper_1.isObject)(body) ? responseRef.json(body) : responseRef.send(String(body));
36
+ });
37
+ });
38
+ describe("nil", () => {
39
+ it("should call send()", async () => {
40
+ const value = null;
41
+ await routerResponseController.apply(value, response, 200);
42
+ (0, chai_1.expect)(response.send.called).to.be.true;
43
+ });
44
+ });
45
+ describe("string", () => {
46
+ it("should call send(value)", async () => {
47
+ const value = "string";
48
+ await routerResponseController.apply(value, response, 200);
49
+ (0, chai_1.expect)(response.send.called).to.be.true;
50
+ (0, chai_1.expect)(response.send.calledWith(String(value))).to.be.true;
51
+ });
52
+ });
53
+ describe("object", () => {
54
+ it("should call json(value)", async () => {
55
+ const value = { test: "test" };
56
+ await routerResponseController.apply(value, response, 200);
57
+ (0, chai_1.expect)(response.json.called).to.be.true;
58
+ (0, chai_1.expect)(response.json.calledWith(value)).to.be.true;
59
+ });
60
+ });
61
+ });
62
+ });
63
+ describe("transformToResult", () => {
64
+ describe("when resultOrDeferred", () => {
65
+ describe("is Promise", () => {
66
+ it("should return Promise that resolves to the value resolved by the input Promise", async () => {
67
+ const value = 100;
68
+ (0, chai_1.expect)(await routerResponseController.transformToResult(Promise.resolve(value))).to.be.eq(value);
69
+ });
70
+ });
71
+ describe("is Observable", () => {
72
+ it("should return toPromise", async () => {
73
+ const lastValue = 100;
74
+ (0, chai_1.expect)(await routerResponseController.transformToResult((0, rxjs_1.of)(1, 2, 3, lastValue))).to.be.eq(lastValue);
75
+ });
76
+ });
77
+ describe("is an object that has the method `subscribe`", () => {
78
+ it("should return a Promise that resolves to the input value", async () => {
79
+ const value = { subscribe() { } };
80
+ (0, chai_1.expect)(await routerResponseController.transformToResult(value)).to.equal(value);
81
+ });
82
+ });
83
+ describe("is an ordinary value", () => {
84
+ it("should return a Promise that resolves to the input value", async () => {
85
+ const value = 100;
86
+ (0, chai_1.expect)(await routerResponseController.transformToResult(value)).to.be.eq(value);
87
+ });
88
+ });
89
+ });
90
+ });
91
+ describe("getStatusByMethod", () => {
92
+ describe("when RequestMethod is POST", () => {
93
+ it("should return 201", () => {
94
+ (0, chai_1.expect)(routerResponseController.getStatusByMethod(enums_1.RequestMethod.POST)).to.be.eql(201);
95
+ });
96
+ });
97
+ describe("when RequestMethod is not POST", () => {
98
+ it("should return 200", () => {
99
+ (0, chai_1.expect)(routerResponseController.getStatusByMethod(enums_1.RequestMethod.GET)).to.be.eql(200);
100
+ });
101
+ });
102
+ });
103
+ describe("render", () => {
104
+ beforeEach(() => {
105
+ sinon_1.default.stub(adapter, "render").callsFake((response, view, options) => {
106
+ return response.render(view, options);
107
+ });
108
+ });
109
+ it('should call "res.render()" with expected args', async () => {
110
+ const template = "template";
111
+ const value = "test";
112
+ const result = Promise.resolve(value);
113
+ const response = { render: sinon_1.default.spy() };
114
+ await routerResponseController.render(result, response, template);
115
+ (0, chai_1.expect)(response.render.calledWith(template, value)).to.be.true;
116
+ });
117
+ });
118
+ describe("setHeaders", () => {
119
+ let setHeaderStub;
120
+ beforeEach(() => {
121
+ setHeaderStub = sinon_1.default.stub(adapter, "setHeader").callsFake(() => ({}));
122
+ });
123
+ it("should set all custom headers", () => {
124
+ const response = {};
125
+ const headers = [{ name: "test", value: "test_value" }];
126
+ routerResponseController.setHeaders(response, headers);
127
+ (0, chai_1.expect)(setHeaderStub.calledWith(response, headers[0].name, headers[0].value)).to.be.true;
128
+ });
129
+ });
130
+ describe("status", () => {
131
+ let statusStub;
132
+ beforeEach(() => {
133
+ statusStub = sinon_1.default.stub(adapter, "status").callsFake(() => ({}));
134
+ });
135
+ it("should set status", () => {
136
+ const response = {};
137
+ const statusCode = 400;
138
+ routerResponseController.setStatus(response, statusCode);
139
+ (0, chai_1.expect)(statusStub.calledWith(response, statusCode)).to.be.true;
140
+ });
141
+ });
142
+ describe("redirect should HttpServer.redirect", () => {
143
+ it("should transformToResult", async () => {
144
+ const transformToResultSpy = sinon_1.default
145
+ .stub(routerResponseController, "transformToResult")
146
+ .returns(Promise.resolve({ statusCode: 123, url: "redirect url" }));
147
+ const result = {};
148
+ await routerResponseController.redirect(result, null, null);
149
+ (0, chai_1.expect)(transformToResultSpy.firstCall.args[0]).to.be.equal(result);
150
+ });
151
+ it("should pass the response to redirect", async () => {
152
+ sinon_1.default
153
+ .stub(routerResponseController, "transformToResult")
154
+ .returns(Promise.resolve({ statusCode: 123, url: "redirect url" }));
155
+ const redirectSpy = sinon_1.default.spy(adapter, "redirect");
156
+ const response = {};
157
+ await routerResponseController.redirect(null, response, null);
158
+ (0, chai_1.expect)(redirectSpy.firstCall.args[0]).to.be.equal(response);
159
+ });
160
+ describe("status code", () => {
161
+ it("should come from the transformed result if present", async () => {
162
+ sinon_1.default
163
+ .stub(routerResponseController, "transformToResult")
164
+ .returns(Promise.resolve({ statusCode: 123, url: "redirect url" }));
165
+ const redirectSpy = sinon_1.default.spy(adapter, "redirect");
166
+ await routerResponseController.redirect(null, null, {
167
+ statusCode: 999,
168
+ url: "not form here",
169
+ });
170
+ (0, chai_1.expect)(redirectSpy.firstCall.args[1]).to.be.eql(123);
171
+ });
172
+ it("should come from the redirectResponse if not on the transformed result", async () => {
173
+ sinon_1.default.stub(routerResponseController, "transformToResult").returns(Promise.resolve({}));
174
+ const redirectSpy = sinon_1.default.spy(adapter, "redirect");
175
+ await routerResponseController.redirect(null, null, {
176
+ statusCode: 123,
177
+ url: "redirect url",
178
+ });
179
+ (0, chai_1.expect)(redirectSpy.firstCall.args[1]).to.be.eql(123);
180
+ });
181
+ it("should default to HttpStatus.FOUND", async () => {
182
+ sinon_1.default.stub(routerResponseController, "transformToResult").returns(Promise.resolve({}));
183
+ const redirectSpy = sinon_1.default.spy(adapter, "redirect");
184
+ await routerResponseController.redirect(null, null, {
185
+ url: "redirect url",
186
+ });
187
+ (0, chai_1.expect)(redirectSpy.firstCall.args[1]).to.be.eql(enums_1.HttpStatus.FOUND);
188
+ });
189
+ });
190
+ describe("url", () => {
191
+ it("should come from the transformed result if present", async () => {
192
+ sinon_1.default
193
+ .stub(routerResponseController, "transformToResult")
194
+ .returns(Promise.resolve({ statusCode: 123, url: "redirect url" }));
195
+ const redirectSpy = sinon_1.default.spy(adapter, "redirect");
196
+ await routerResponseController.redirect(null, null, {
197
+ url: "not from here",
198
+ });
199
+ (0, chai_1.expect)(redirectSpy.firstCall.args[2]).to.be.eql("redirect url");
200
+ });
201
+ it("should come from the redirectResponse if not on the transformed result", async () => {
202
+ sinon_1.default.stub(routerResponseController, "transformToResult").returns(Promise.resolve({}));
203
+ const redirectSpy = sinon_1.default.spy(adapter, "redirect");
204
+ await routerResponseController.redirect(null, null, {
205
+ statusCode: 123,
206
+ url: "redirect url",
207
+ });
208
+ (0, chai_1.expect)(redirectSpy.firstCall.args[2]).to.be.eql("redirect url");
209
+ });
210
+ });
211
+ });
212
+ describe("Server-Sent-Events", () => {
213
+ it("should accept only observables", async () => {
214
+ const result = Promise.resolve("test");
215
+ try {
216
+ await routerResponseController.sse(result, {}, {});
217
+ }
218
+ catch (e) {
219
+ (0, chai_1.expect)(e.message).to.eql("You must return an Observable stream to use Server-Sent Events (SSE).");
220
+ }
221
+ });
222
+ it("should write string", async () => {
223
+ class Sink extends stream_1.Writable {
224
+ constructor() {
225
+ super(...arguments);
226
+ this.chunks = [];
227
+ }
228
+ _write(chunk, encoding, callback) {
229
+ this.chunks.push(chunk);
230
+ callback();
231
+ }
232
+ get content() {
233
+ return this.chunks.join("");
234
+ }
235
+ }
236
+ const written = (stream) => new Promise((resolve, reject) => stream.on("error", reject).on("finish", resolve));
237
+ const result = (0, rxjs_1.of)("test");
238
+ const response = new Sink();
239
+ const request = new stream_1.PassThrough();
240
+ routerResponseController.sse(result, response, request);
241
+ request.destroy();
242
+ await written(response);
243
+ (0, chai_1.expect)(response.content).to.eql(`
244
+ id: 1
245
+ data: test
246
+
247
+ `);
248
+ });
249
+ it("should close on request close", (done) => {
250
+ const result = (0, rxjs_1.of)("test");
251
+ const response = new stream_1.Writable();
252
+ response.end = () => done();
253
+ response._write = () => { };
254
+ const request = new stream_1.Writable();
255
+ request._write = () => { };
256
+ routerResponseController.sse(result, response, request);
257
+ request.emit("close");
258
+ });
259
+ it("should close the request when observable completes", (done) => {
260
+ const result = (0, rxjs_1.of)("test");
261
+ const response = new stream_1.Writable();
262
+ response.end = done;
263
+ response._write = () => { };
264
+ const request = new stream_1.Writable();
265
+ request._write = () => { };
266
+ routerResponseController.sse(result, response, request);
267
+ });
268
+ it("should allow to intercept the response", (done) => {
269
+ const result = sinon_1.default.spy();
270
+ const response = new stream_1.Writable();
271
+ response.end();
272
+ response._write = () => { };
273
+ const request = new stream_1.Writable();
274
+ request._write = () => { };
275
+ try {
276
+ routerResponseController.sse(result, response, request);
277
+ }
278
+ catch {
279
+ // Whether an error is thrown or not
280
+ // is not relevant, so long as
281
+ // result is not called
282
+ }
283
+ sinon_1.default.assert.notCalled(result);
284
+ done();
285
+ });
286
+ describe("when there is an error", () => {
287
+ it("should close the request", (done) => {
288
+ const result = new rxjs_1.Subject();
289
+ const response = new stream_1.Writable();
290
+ response.end = done;
291
+ response._write = () => { };
292
+ const request = new stream_1.Writable();
293
+ request._write = () => { };
294
+ routerResponseController.sse(result, response, request);
295
+ result.error(new Error("Some error"));
296
+ });
297
+ it("should write the error message to the stream", async () => {
298
+ class Sink extends stream_1.Writable {
299
+ constructor() {
300
+ super(...arguments);
301
+ this.chunks = [];
302
+ }
303
+ _write(chunk, encoding, callback) {
304
+ this.chunks.push(chunk);
305
+ callback();
306
+ }
307
+ get content() {
308
+ return this.chunks.join("");
309
+ }
310
+ }
311
+ const written = (stream) => new Promise((resolve, reject) => stream.on("error", reject).on("finish", resolve));
312
+ const result = new rxjs_1.Subject();
313
+ const response = new Sink();
314
+ const request = new stream_1.PassThrough();
315
+ routerResponseController.sse(result, response, request);
316
+ result.error(new Error("Some error"));
317
+ request.destroy();
318
+ await written(response);
319
+ (0, chai_1.expect)(response.content).to.eql(`
320
+ event: error
321
+ id: 1
322
+ data: Some error
323
+
324
+ `);
325
+ });
326
+ });
327
+ });
328
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,113 @@
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 chai_1 = require("chai");
10
+ const decorators_1 = require("@venok/http/decorators");
11
+ const constants_1 = require("@venok/http/constants");
12
+ describe("@Controller", () => {
13
+ const reflectedPath = "test";
14
+ const reflectedHost = "api.example.com";
15
+ const reflectedHostArray = ["api1.example.com", "api2.example.com"];
16
+ const reflectedVersion = "1";
17
+ const reflectedVersionWithDuplicates = ["1", "2", "2", "1", "2", "1"];
18
+ const reflectedVersionWithoutDuplicates = ["1", "2"];
19
+ let EmptyDecorator = class EmptyDecorator {
20
+ };
21
+ EmptyDecorator = __decorate([
22
+ (0, decorators_1.Controller)()
23
+ ], EmptyDecorator);
24
+ let Test = class Test {
25
+ };
26
+ Test = __decorate([
27
+ (0, decorators_1.Controller)(reflectedPath)
28
+ ], Test);
29
+ let PathAndHostDecorator = class PathAndHostDecorator {
30
+ };
31
+ PathAndHostDecorator = __decorate([
32
+ (0, decorators_1.Controller)({ path: reflectedPath, host: reflectedHost })
33
+ ], PathAndHostDecorator);
34
+ let PathAndHostArrayDecorator = class PathAndHostArrayDecorator {
35
+ };
36
+ PathAndHostArrayDecorator = __decorate([
37
+ (0, decorators_1.Controller)({ path: reflectedPath, host: reflectedHostArray })
38
+ ], PathAndHostArrayDecorator);
39
+ let HostOnlyDecorator = class HostOnlyDecorator {
40
+ };
41
+ HostOnlyDecorator = __decorate([
42
+ (0, decorators_1.Controller)({ host: reflectedHost })
43
+ ], HostOnlyDecorator);
44
+ let PathAndHostAndVersionDecorator = class PathAndHostAndVersionDecorator {
45
+ };
46
+ PathAndHostAndVersionDecorator = __decorate([
47
+ (0, decorators_1.Controller)({
48
+ path: reflectedPath,
49
+ host: reflectedHost,
50
+ version: reflectedVersion,
51
+ })
52
+ ], PathAndHostAndVersionDecorator);
53
+ let VersionOnlyDecorator = class VersionOnlyDecorator {
54
+ };
55
+ VersionOnlyDecorator = __decorate([
56
+ (0, decorators_1.Controller)({ version: reflectedVersion })
57
+ ], VersionOnlyDecorator);
58
+ let VersionOnlyArrayDecorator = class VersionOnlyArrayDecorator {
59
+ };
60
+ VersionOnlyArrayDecorator = __decorate([
61
+ (0, decorators_1.Controller)({ version: reflectedVersionWithDuplicates })
62
+ ], VersionOnlyArrayDecorator);
63
+ it(`should enhance component with "${constants_1.CONTROLLER_WATERMARK}" metadata`, () => {
64
+ const controllerWatermark = Reflect.getMetadata(constants_1.CONTROLLER_WATERMARK, EmptyDecorator);
65
+ (0, chai_1.expect)(controllerWatermark).to.be.true;
66
+ });
67
+ it("should enhance controller with expected path metadata", () => {
68
+ const path = Reflect.getMetadata("path", Test);
69
+ (0, chai_1.expect)(path).to.be.eql(reflectedPath);
70
+ const path2 = Reflect.getMetadata("path", PathAndHostDecorator);
71
+ (0, chai_1.expect)(path2).to.be.eql(reflectedPath);
72
+ const path3 = Reflect.getMetadata("path", PathAndHostAndVersionDecorator);
73
+ (0, chai_1.expect)(path3).to.be.eql(reflectedPath);
74
+ });
75
+ it("should enhance controller with expected host metadata", () => {
76
+ const host = Reflect.getMetadata("host", PathAndHostDecorator);
77
+ (0, chai_1.expect)(host).to.be.eql(reflectedHost);
78
+ const host2 = Reflect.getMetadata("host", HostOnlyDecorator);
79
+ (0, chai_1.expect)(host2).to.be.eql(reflectedHost);
80
+ const host3 = Reflect.getMetadata("host", PathAndHostArrayDecorator);
81
+ (0, chai_1.expect)(host3).to.be.eql(reflectedHostArray);
82
+ const host4 = Reflect.getMetadata("host", PathAndHostAndVersionDecorator);
83
+ (0, chai_1.expect)(host4).to.be.eql(reflectedHost);
84
+ });
85
+ it("should enhance controller with expected version metadata", () => {
86
+ const version = Reflect.getMetadata(constants_1.VERSION_METADATA, PathAndHostAndVersionDecorator);
87
+ (0, chai_1.expect)(version).to.be.eql(reflectedVersion);
88
+ const version2 = Reflect.getMetadata(constants_1.VERSION_METADATA, VersionOnlyDecorator);
89
+ (0, chai_1.expect)(version2).to.be.eql(reflectedVersion);
90
+ const version3 = Reflect.getMetadata(constants_1.VERSION_METADATA, VersionOnlyArrayDecorator);
91
+ (0, chai_1.expect)(version3).to.be.eql(reflectedVersionWithoutDuplicates);
92
+ });
93
+ it("should set default path when no object passed as param", () => {
94
+ const path = Reflect.getMetadata("path", EmptyDecorator);
95
+ (0, chai_1.expect)(path).to.be.eql("/");
96
+ const path2 = Reflect.getMetadata("path", HostOnlyDecorator);
97
+ (0, chai_1.expect)(path2).to.be.eql("/");
98
+ const path3 = Reflect.getMetadata("path", VersionOnlyDecorator);
99
+ (0, chai_1.expect)(path3).to.be.eql("/");
100
+ });
101
+ it("should not set host when no host passed as param", () => {
102
+ const host = Reflect.getMetadata("host", Test);
103
+ (0, chai_1.expect)(host).to.be.undefined;
104
+ const host2 = Reflect.getMetadata("host", EmptyDecorator);
105
+ (0, chai_1.expect)(host2).to.be.undefined;
106
+ });
107
+ it("should not set version when no version passed as param", () => {
108
+ const version = Reflect.getMetadata(constants_1.VERSION_METADATA, Test);
109
+ (0, chai_1.expect)(version).to.be.undefined;
110
+ const version2 = Reflect.getMetadata(constants_1.VERSION_METADATA, EmptyDecorator);
111
+ (0, chai_1.expect)(version2).to.be.undefined;
112
+ });
113
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const chai_1 = require("chai");
13
+ const decorators_1 = require("@venok/http/decorators");
14
+ const constants_1 = require("@venok/http/constants");
15
+ describe("@Header", () => {
16
+ class Test {
17
+ static test() { }
18
+ }
19
+ __decorate([
20
+ (0, decorators_1.Header)("Content-Type", "Test"),
21
+ (0, decorators_1.Header)("Authorization", "JWT"),
22
+ __metadata("design:type", Function),
23
+ __metadata("design:paramtypes", []),
24
+ __metadata("design:returntype", void 0)
25
+ ], Test, "test", null);
26
+ it("should enhance method with expected template string", () => {
27
+ const metadata = Reflect.getMetadata(constants_1.HEADERS_METADATA, Test.test);
28
+ (0, chai_1.expect)(metadata).to.be.eql([
29
+ { name: "Authorization", value: "JWT" },
30
+ { name: "Content-Type", value: "Test" },
31
+ ]);
32
+ });
33
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const chai_1 = require("chai");
13
+ const decorators_1 = require("@venok/http/decorators");
14
+ const constants_1 = require("@venok/http/constants");
15
+ describe("@HttpCode", () => {
16
+ const httpCode = 200;
17
+ class Test {
18
+ static test() { }
19
+ }
20
+ __decorate([
21
+ (0, decorators_1.HttpCode)(httpCode),
22
+ __metadata("design:type", Function),
23
+ __metadata("design:paramtypes", []),
24
+ __metadata("design:returntype", void 0)
25
+ ], Test, "test", null);
26
+ it("should enhance method with expected http status code", () => {
27
+ const metadata = Reflect.getMetadata(constants_1.HTTP_CODE_METADATA, Test.test);
28
+ (0, chai_1.expect)(metadata).to.be.eql(httpCode);
29
+ });
30
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,36 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const chai_1 = require("chai");
13
+ const enums_1 = require("@venok/http/enums");
14
+ const decorators_1 = require("@venok/http/decorators");
15
+ const constants_1 = require("@venok/http/constants");
16
+ describe("@Redirect", () => {
17
+ const url = "https://test.com";
18
+ const statusCode = enums_1.HttpStatus.FOUND;
19
+ class Test {
20
+ static test() { }
21
+ }
22
+ __decorate([
23
+ (0, decorators_1.Redirect)(url, statusCode),
24
+ __metadata("design:type", Function),
25
+ __metadata("design:paramtypes", []),
26
+ __metadata("design:returntype", void 0)
27
+ ], Test, "test", null);
28
+ it("should enhance method with expected redirect url string", () => {
29
+ const metadata = Reflect.getMetadata(constants_1.REDIRECT_METADATA, Test.test);
30
+ (0, chai_1.expect)(metadata.url).to.be.eql(url);
31
+ });
32
+ it("should enhance method with expected response code", () => {
33
+ const metadata = Reflect.getMetadata(constants_1.REDIRECT_METADATA, Test.test);
34
+ (0, chai_1.expect)(metadata.statusCode).to.be.eql(statusCode);
35
+ });
36
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const chai_1 = require("chai");
13
+ const decorators_1 = require("@venok/http/decorators");
14
+ const constants_1 = require("@venok/http/constants");
15
+ describe("@Render", () => {
16
+ const template = "template";
17
+ class Test {
18
+ static test() { }
19
+ }
20
+ __decorate([
21
+ (0, decorators_1.Render)("template"),
22
+ __metadata("design:type", Function),
23
+ __metadata("design:paramtypes", []),
24
+ __metadata("design:returntype", void 0)
25
+ ], Test, "test", null);
26
+ it("should enhance method with expected template string", () => {
27
+ const metadata = Reflect.getMetadata(constants_1.RENDER_METADATA, Test.test);
28
+ (0, chai_1.expect)(metadata).to.be.eql(template);
29
+ });
30
+ });