temba 0.18.0 → 0.19.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 (225) hide show
  1. package/README.md +14 -2
  2. package/package.json +6 -8
  3. package/{config → src/config}/index.d.ts +7 -5
  4. package/src/config/index.d.ts.map +1 -0
  5. package/{config → src/config}/index.js +11 -39
  6. package/src/config/index.js.map +1 -0
  7. package/src/delay/delayMiddleware.d.ts +3 -0
  8. package/src/delay/delayMiddleware.d.ts.map +1 -0
  9. package/src/delay/delayMiddleware.js +13 -0
  10. package/src/delay/delayMiddleware.js.map +1 -0
  11. package/src/index.d.ts +6 -0
  12. package/src/index.d.ts.map +1 -0
  13. package/src/index.js +83 -0
  14. package/src/index.js.map +1 -0
  15. package/src/queries/in-memory.d.ts +3 -0
  16. package/src/queries/in-memory.d.ts.map +1 -0
  17. package/src/queries/in-memory.js +61 -0
  18. package/src/queries/in-memory.js.map +1 -0
  19. package/src/queries/mongo.d.ts +3 -0
  20. package/src/queries/mongo.d.ts.map +1 -0
  21. package/src/queries/mongo.js +75 -0
  22. package/src/queries/mongo.js.map +1 -0
  23. package/src/queries/queries.d.ts +2 -0
  24. package/src/queries/queries.d.ts.map +1 -0
  25. package/src/queries/queries.js +10 -0
  26. package/src/queries/queries.js.map +1 -0
  27. package/src/queries/types.d.ts +15 -0
  28. package/src/queries/types.d.ts.map +1 -0
  29. package/src/queries/types.js +2 -0
  30. package/{routes → src/queries}/types.js.map +1 -1
  31. package/src/requestBodyInterceptor/interceptRequestBody.d.ts +3 -0
  32. package/src/requestBodyInterceptor/interceptRequestBody.d.ts.map +1 -0
  33. package/src/requestBodyInterceptor/interceptRequestBody.js +14 -0
  34. package/src/requestBodyInterceptor/interceptRequestBody.js.map +1 -0
  35. package/src/requestBodyInterceptor/types.d.ts +12 -0
  36. package/src/requestBodyInterceptor/types.d.ts.map +1 -0
  37. package/src/requestBodyInterceptor/types.js +2 -0
  38. package/src/requestBodyInterceptor/types.js.map +1 -0
  39. package/src/requestHandlers/delete.d.ts +12 -0
  40. package/src/requestHandlers/delete.d.ts.map +1 -0
  41. package/src/requestHandlers/delete.js +22 -0
  42. package/src/requestHandlers/delete.js.map +1 -0
  43. package/src/requestHandlers/get.d.ts +22 -0
  44. package/src/requestHandlers/get.d.ts.map +1 -0
  45. package/src/requestHandlers/get.js +47 -0
  46. package/src/requestHandlers/get.js.map +1 -0
  47. package/src/requestHandlers/index.d.ts +54 -0
  48. package/src/requestHandlers/index.d.ts.map +1 -0
  49. package/src/requestHandlers/index.js +21 -0
  50. package/src/requestHandlers/index.js.map +1 -0
  51. package/src/requestHandlers/patch.d.ts +9 -0
  52. package/src/requestHandlers/patch.d.ts.map +1 -0
  53. package/src/requestHandlers/patch.js +35 -0
  54. package/src/requestHandlers/patch.js.map +1 -0
  55. package/src/requestHandlers/post.d.ts +18 -0
  56. package/src/requestHandlers/post.d.ts.map +1 -0
  57. package/src/requestHandlers/post.js +37 -0
  58. package/src/requestHandlers/post.js.map +1 -0
  59. package/src/requestHandlers/put.d.ts +9 -0
  60. package/src/requestHandlers/put.d.ts.map +1 -0
  61. package/src/requestHandlers/put.js +35 -0
  62. package/src/requestHandlers/put.js.map +1 -0
  63. package/src/requestHandlers/types.d.ts +38 -0
  64. package/src/requestHandlers/types.d.ts.map +1 -0
  65. package/src/requestHandlers/types.js +2 -0
  66. package/{schema → src/requestHandlers}/types.js.map +1 -1
  67. package/{routes → src/requestHandlers}/utils.d.ts +1 -0
  68. package/src/requestHandlers/utils.d.ts.map +1 -0
  69. package/src/requestHandlers/utils.js +6 -0
  70. package/src/requestHandlers/utils.js.map +1 -0
  71. package/src/resourceRouter.d.ts +5 -0
  72. package/src/resourceRouter.d.ts.map +1 -0
  73. package/src/resourceRouter.js +95 -0
  74. package/src/resourceRouter.js.map +1 -0
  75. package/src/responseBodyInterceptor/interceptResponseBody.d.ts +3 -0
  76. package/src/responseBodyInterceptor/interceptResponseBody.d.ts.map +1 -0
  77. package/src/responseBodyInterceptor/interceptResponseBody.js +7 -0
  78. package/src/responseBodyInterceptor/interceptResponseBody.js.map +1 -0
  79. package/src/responseBodyInterceptor/types.d.ts +11 -0
  80. package/src/responseBodyInterceptor/types.d.ts.map +1 -0
  81. package/src/responseBodyInterceptor/types.js +2 -0
  82. package/src/responseBodyInterceptor/types.js.map +1 -0
  83. package/src/schema/compile.d.ts +3 -0
  84. package/src/schema/compile.d.ts.map +1 -0
  85. package/src/schema/compile.js +26 -0
  86. package/src/schema/compile.js.map +1 -0
  87. package/{schema → src/schema}/types.d.ts +4 -14
  88. package/src/schema/types.d.ts.map +1 -0
  89. package/src/schema/types.js +2 -0
  90. package/{queries → src/schema}/types.js.map +1 -1
  91. package/{schema → src/schema}/validate.d.ts +1 -0
  92. package/src/schema/validate.d.ts.map +1 -0
  93. package/src/schema/validate.js +14 -0
  94. package/src/schema/validate.js.map +1 -0
  95. package/src/urls/urlParser.d.ts +5 -0
  96. package/src/urls/urlParser.d.ts.map +1 -0
  97. package/src/urls/urlParser.js +9 -0
  98. package/src/urls/urlParser.js.map +1 -0
  99. package/test/integration/api-prefix.test.d.ts +2 -0
  100. package/test/integration/api-prefix.test.d.ts.map +1 -0
  101. package/test/integration/api-prefix.test.js +69 -0
  102. package/test/integration/api-prefix.test.js.map +1 -0
  103. package/test/integration/createServer.d.ts +4 -0
  104. package/test/integration/createServer.d.ts.map +1 -0
  105. package/test/integration/createServer.js +4 -0
  106. package/test/integration/createServer.js.map +1 -0
  107. package/test/integration/crud.test.d.ts +2 -0
  108. package/test/integration/crud.test.d.ts.map +1 -0
  109. package/test/integration/crud.test.js +173 -0
  110. package/test/integration/crud.test.js.map +1 -0
  111. package/test/integration/custom-router.test.d.ts +2 -0
  112. package/test/integration/custom-router.test.d.ts.map +1 -0
  113. package/test/integration/custom-router.test.js +74 -0
  114. package/test/integration/custom-router.test.js.map +1 -0
  115. package/test/integration/head-method.test.d.ts +2 -0
  116. package/test/integration/head-method.test.d.ts.map +1 -0
  117. package/test/integration/head-method.test.js +38 -0
  118. package/test/integration/head-method.test.js.map +1 -0
  119. package/test/integration/options-method.test.d.ts +2 -0
  120. package/test/integration/options-method.test.d.ts.map +1 -0
  121. package/test/integration/options-method.test.js +30 -0
  122. package/test/integration/options-method.test.js.map +1 -0
  123. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-change-requestBody.test.d.ts +2 -0
  124. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-change-requestBody.test.d.ts.map +1 -0
  125. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-change-requestBody.test.js +76 -0
  126. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-change-requestBody.test.js.map +1 -0
  127. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-error-string.test.d.ts +2 -0
  128. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-error-string.test.d.ts.map +1 -0
  129. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-error-string.test.js +60 -0
  130. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-error-string.test.js.map +1 -0
  131. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-invalid-return-types.test.d.ts +2 -0
  132. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-invalid-return-types.test.d.ts.map +1 -0
  133. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-invalid-return-types.test.js +89 -0
  134. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-invalid-return-types.test.js.map +1 -0
  135. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-void.test.d.ts +2 -0
  136. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-void.test.d.ts.map +1 -0
  137. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-void.test.js +47 -0
  138. package/test/integration/requestBodyInterceptor/requestBodyInterceptor-void.test.js.map +1 -0
  139. package/test/integration/responseBodyInterceptor.test.d.ts +2 -0
  140. package/test/integration/responseBodyInterceptor.test.d.ts.map +1 -0
  141. package/test/integration/responseBodyInterceptor.test.js +107 -0
  142. package/test/integration/responseBodyInterceptor.test.js.map +1 -0
  143. package/test/integration/returnNullFields.test.d.ts +2 -0
  144. package/test/integration/returnNullFields.test.d.ts.map +1 -0
  145. package/test/integration/returnNullFields.test.js +51 -0
  146. package/test/integration/returnNullFields.test.js.map +1 -0
  147. package/test/integration/root-url.test.d.ts +2 -0
  148. package/test/integration/root-url.test.d.ts.map +1 -0
  149. package/test/integration/root-url.test.js +29 -0
  150. package/test/integration/root-url.test.js.map +1 -0
  151. package/test/integration/schema-validation.test.d.ts +2 -0
  152. package/test/integration/schema-validation.test.d.ts.map +1 -0
  153. package/test/integration/schema-validation.test.js +169 -0
  154. package/test/integration/schema-validation.test.js.map +1 -0
  155. package/test/unit/config/config.test.d.ts +2 -0
  156. package/test/unit/config/config.test.d.ts.map +1 -0
  157. package/test/unit/config/config.test.js +121 -0
  158. package/test/unit/config/config.test.js.map +1 -0
  159. package/test/unit/urls/urlParser.test.d.ts +2 -0
  160. package/test/unit/urls/urlParser.test.d.ts.map +1 -0
  161. package/test/unit/urls/urlParser.test.js +43 -0
  162. package/test/unit/urls/urlParser.test.js.map +1 -0
  163. package/tsconfig.tsbuildinfo +1 -0
  164. package/vitest.config.d.ts +3 -0
  165. package/vitest.config.d.ts.map +1 -0
  166. package/vitest.config.js +10 -0
  167. package/vitest.config.js.map +1 -0
  168. package/config/index.js.map +0 -1
  169. package/delay/delayMiddleware.d.ts +0 -2
  170. package/delay/delayMiddleware.js +0 -16
  171. package/delay/delayMiddleware.js.map +0 -1
  172. package/index.d.ts +0 -5
  173. package/index.js +0 -98
  174. package/index.js.map +0 -1
  175. package/queries/in-memory.d.ts +0 -20
  176. package/queries/in-memory.js +0 -88
  177. package/queries/in-memory.js.map +0 -1
  178. package/queries/mongo.d.ts +0 -19
  179. package/queries/mongo.js +0 -218
  180. package/queries/mongo.js.map +0 -1
  181. package/queries/queries.d.ts +0 -11
  182. package/queries/queries.js +0 -17
  183. package/queries/queries.js.map +0 -1
  184. package/queries/types.d.ts +0 -14
  185. package/queries/types.js +0 -3
  186. package/routes/delete.d.ts +0 -7
  187. package/routes/delete.js +0 -77
  188. package/routes/delete.js.map +0 -1
  189. package/routes/get.d.ts +0 -7
  190. package/routes/get.js +0 -115
  191. package/routes/get.js.map +0 -1
  192. package/routes/interceptRequestBody.d.ts +0 -3
  193. package/routes/interceptRequestBody.js +0 -19
  194. package/routes/interceptRequestBody.js.map +0 -1
  195. package/routes/patch.d.ts +0 -8
  196. package/routes/patch.js +0 -102
  197. package/routes/patch.js.map +0 -1
  198. package/routes/post.d.ts +0 -8
  199. package/routes/post.js +0 -87
  200. package/routes/post.js.map +0 -1
  201. package/routes/put.d.ts +0 -8
  202. package/routes/put.js +0 -102
  203. package/routes/put.js.map +0 -1
  204. package/routes/routes.d.ts +0 -8
  205. package/routes/routes.js +0 -90
  206. package/routes/routes.js.map +0 -1
  207. package/routes/types.d.ts +0 -23
  208. package/routes/types.js +0 -3
  209. package/routes/utils.js +0 -13
  210. package/routes/utils.js.map +0 -1
  211. package/schema/compile.d.ts +0 -2
  212. package/schema/compile.js +0 -41
  213. package/schema/compile.js.map +0 -1
  214. package/schema/transformConfig.d.ts +0 -2
  215. package/schema/transformConfig.js +0 -17
  216. package/schema/transformConfig.js.map +0 -1
  217. package/schema/types.js +0 -3
  218. package/schema/validate.js +0 -19
  219. package/schema/validate.js.map +0 -1
  220. package/urls/urlMiddleware.d.ts +0 -5
  221. package/urls/urlMiddleware.js +0 -41
  222. package/urls/urlMiddleware.js.map +0 -1
  223. package/urls/urlParser.d.ts +0 -5
  224. package/urls/urlParser.js +0 -13
  225. package/urls/urlParser.js.map +0 -1
@@ -0,0 +1,30 @@
1
+ import { test, expect } from 'vitest';
2
+ import request from 'supertest';
3
+ import createServer from './createServer';
4
+ import express from 'express';
5
+ /*
6
+ Tests for OPTIONS requests
7
+ */
8
+ const tembaServer = createServer();
9
+ const customRouter = express.Router();
10
+ customRouter.get('/hello', async (_, res) => {
11
+ return res.send('Hello, World!');
12
+ });
13
+ // The bottom line of Express' behavior for OPTIONS requests
14
+ // is that it always returns the same methods, unless you implement
15
+ // your own OPTIONS handler.
16
+ //
17
+ // So for Temba this means the OPTIONS request is not "supported",
18
+ // looking at allowed methods. For CORS purposes, Express' default
19
+ // seems sufficient though.
20
+ test('OPTIONS', async () => {
21
+ const optionsRootResponse = await request(tembaServer).options('/');
22
+ expect(optionsRootResponse.status).toBe(204);
23
+ expect(optionsRootResponse.header['access-control-allow-methods']).toBe('GET,HEAD,PUT,PATCH,POST,DELETE');
24
+ // Even though we only have a GET route for /hello, the OPTIONS response
25
+ // returns all methods that exists, because that's Express' default behavior.
26
+ const optionsHelloResponse = await request(tembaServer).options('/hello');
27
+ expect(optionsHelloResponse.status).toBe(204);
28
+ expect(optionsHelloResponse.header['access-control-allow-methods']).toBe('GET,HEAD,PUT,PATCH,POST,DELETE');
29
+ });
30
+ //# sourceMappingURL=options-method.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options-method.test.js","sourceRoot":"","sources":["../../../test/integration/options-method.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,OAAO,MAAM,WAAW,CAAA;AAC/B,OAAO,YAAY,MAAM,gBAAgB,CAAA;AACzC,OAAO,OAAO,MAAM,SAAS,CAAA;AAE7B;;EAEE;AAEF,MAAM,WAAW,GAAG,YAAY,EAAE,CAAA;AAElC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;AACrC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE;IAC1C,OAAO,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;AAClC,CAAC,CAAC,CAAA;AAEF,4DAA4D;AAC5D,mEAAmE;AACnE,4BAA4B;AAC5B,EAAE;AACF,kEAAkE;AAClE,kEAAkE;AAClE,2BAA2B;AAE3B,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IACzB,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACnE,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5C,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CACrE,gCAAgC,CACjC,CAAA;IAED,wEAAwE;IACxE,6EAA6E;IAC7E,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACzE,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7C,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CACtE,gCAAgC,CACjC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=requestBodyInterceptor-change-requestBody.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestBodyInterceptor-change-requestBody.test.d.ts","sourceRoot":"","sources":["../../../../test/integration/requestBodyInterceptor/requestBodyInterceptor-change-requestBody.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import request from 'supertest';
3
+ import createServer from '../createServer';
4
+ describe('requestBodyInterceptors that return a (new or changed) request body object', () => {
5
+ const requestBodyInterceptor = {
6
+ post: ({ resource }) => {
7
+ if (resource === 'movies')
8
+ return { title: 'The Matrix' };
9
+ },
10
+ put: ({ body }) => {
11
+ return { ...body, replaced: true };
12
+ },
13
+ patch: ({ body }) => {
14
+ return { ...body, updated: true };
15
+ },
16
+ };
17
+ const tembaServer = createServer({ requestBodyInterceptor });
18
+ test('POST with a requestBodyInterceptor that returns a request body', async () => {
19
+ const resourceUrl = '/movies';
20
+ // Send a POST request.
21
+ const response = await request(tembaServer)
22
+ .post(resourceUrl)
23
+ .send({ title: 'Star Wars' })
24
+ .set('Content-Type', 'application/json');
25
+ expect(response.statusCode).toEqual(201);
26
+ expect(response.body.title).toEqual('The Matrix');
27
+ const id = response.header.location?.split('/').pop();
28
+ const getResponse = await request(tembaServer).get(`${resourceUrl}/${id}`);
29
+ expect(getResponse.statusCode).toEqual(200);
30
+ expect(getResponse.body.id).toEqual(id);
31
+ expect(getResponse.body.title).toEqual('The Matrix');
32
+ });
33
+ test('PUT with a requestBodyInterceptor that returns a request body', async () => {
34
+ const resourceUrl = '/pokemons';
35
+ // First create a resource, so we have an id to PUT to.
36
+ const postResponse = await request(tembaServer)
37
+ .post(resourceUrl)
38
+ .send({ name: 'Pikachu' })
39
+ .set('Content-Type', 'application/json');
40
+ expect(postResponse.statusCode).toEqual(201);
41
+ expect(postResponse.body.name).toEqual('Pikachu');
42
+ expect(postResponse.body.replaced).toBeUndefined();
43
+ const id = postResponse.header.location?.split('/').pop();
44
+ // Send a PUT request to the id.
45
+ const response = await request(tembaServer)
46
+ .put(`${resourceUrl}/${id}`)
47
+ .send({ name: 'Mew' })
48
+ .set('Content-Type', 'application/json');
49
+ expect(response.statusCode).toEqual(200);
50
+ expect(response.body.id).toEqual(id);
51
+ expect(response.body.name).toEqual('Mew');
52
+ expect(response.body.replaced).toEqual(true);
53
+ });
54
+ test('PATCH with a requestBodyInterceptor that returns a request body', async () => {
55
+ const resourceUrl = '/pokemons';
56
+ // First create a resource, so we have an id to PUT to.
57
+ const postResponse = await request(tembaServer)
58
+ .post(resourceUrl)
59
+ .send({ name: 'Pikachu' })
60
+ .set('Content-Type', 'application/json');
61
+ expect(postResponse.statusCode).toEqual(201);
62
+ expect(postResponse.body.name).toEqual('Pikachu');
63
+ expect(postResponse.body.updated).toBeUndefined();
64
+ const id = postResponse.header.location?.split('/').pop();
65
+ // Send a PATCH request to the id.
66
+ const response = await request(tembaServer)
67
+ .patch(`${resourceUrl}/${id}`)
68
+ .send({ name: 'Mew' })
69
+ .set('Content-Type', 'application/json');
70
+ expect(response.statusCode).toEqual(200);
71
+ expect(response.body.id).toEqual(id);
72
+ expect(response.body.name).toEqual('Mew');
73
+ expect(response.body.updated).toEqual(true);
74
+ });
75
+ });
76
+ //# sourceMappingURL=requestBodyInterceptor-change-requestBody.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestBodyInterceptor-change-requestBody.test.js","sourceRoot":"","sources":["../../../../test/integration/requestBodyInterceptor/requestBodyInterceptor-change-requestBody.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,OAAO,MAAM,WAAW,CAAA;AAE/B,OAAO,YAAY,MAAM,iBAAiB,CAAA;AAG1C,QAAQ,CAAC,4EAA4E,EAAE,GAAG,EAAE;IAC1F,MAAM,sBAAsB,GAA2B;QACrD,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YACrB,IAAI,QAAQ,KAAK,QAAQ;gBAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAA;QAC3D,CAAC;QACD,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAChB,OAAO,EAAE,GAAI,IAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;QAChD,CAAC;QACD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAClB,OAAO,EAAE,GAAI,IAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QAC/C,CAAC;KACF,CAAA;IAED,MAAM,WAAW,GAAG,YAAY,CAAC,EAAE,sBAAsB,EAAuB,CAAC,CAAA;IAEjF,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,WAAW,GAAG,SAAS,CAAA;QAE7B,uBAAuB;QACvB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;aACxC,IAAI,CAAC,WAAW,CAAC;aACjB,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;aAC5B,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QAE1C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QAEjD,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;QAErD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC,CAAA;QAC1E,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,WAAW,GAAG,WAAW,CAAA;QAE/B,uDAAuD;QACvD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;aAC5C,IAAI,CAAC,WAAW,CAAC;aACjB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aACzB,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QAC1C,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACjD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAA;QAElD,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;QAEzD,gCAAgC;QAChC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;aACxC,GAAG,CAAC,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC;aAC3B,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;aACrB,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QAE1C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,WAAW,GAAG,WAAW,CAAA;QAE/B,uDAAuD;QACvD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;aAC5C,IAAI,CAAC,WAAW,CAAC;aACjB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aACzB,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QAC1C,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACjD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAA;QAEjD,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;QAEzD,kCAAkC;QAClC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;aACxC,KAAK,CAAC,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC;aAC7B,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;aACrB,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QAE1C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=requestBodyInterceptor-error-string.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestBodyInterceptor-error-string.test.d.ts","sourceRoot":"","sources":["../../../../test/integration/requestBodyInterceptor/requestBodyInterceptor-error-string.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import request from 'supertest';
3
+ import createServer from '../createServer';
4
+ describe('requestBodyInterceptors that return a string to indicate a 400 Bad Request should be returned', () => {
5
+ const requestBodyInterceptor = {
6
+ post: ({ resource }) => {
7
+ if (resource === 'movies')
8
+ return '400 Bad Request error from POST';
9
+ },
10
+ put: () => {
11
+ return '400 Bad Request error from PUT';
12
+ },
13
+ patch: () => {
14
+ return '400 Bad Request error from PATCH';
15
+ },
16
+ };
17
+ const tembaServer = createServer({ requestBodyInterceptor });
18
+ test('POST with a requestBodyInterceptor that returns an error string should result in 400 Bad Request', async () => {
19
+ const expectedResource = 'movies';
20
+ const resourceUrl = '/' + expectedResource;
21
+ // Send a POST request.
22
+ // The request body is empty because that's not important for this test.
23
+ const response = await request(tembaServer).post(resourceUrl);
24
+ expect(response.statusCode).toEqual(400);
25
+ expect(response.body.message).toEqual('400 Bad Request error from POST');
26
+ });
27
+ test('PUT with a requestBodyInterceptor that returns an error string should result in 400 Bad Request', async () => {
28
+ const expectedResource = 'pokemons';
29
+ const resourceUrl = '/' + expectedResource;
30
+ // First create a resource, so we have an id to PUT to.
31
+ const postResponse = await request(tembaServer)
32
+ .post(resourceUrl)
33
+ .send({ name: 'Pikachu' })
34
+ .set('Content-Type', 'application/json');
35
+ expect(postResponse.statusCode).toEqual(201);
36
+ const id = postResponse.header.location?.split('/').pop();
37
+ // Send a PUT request to the id.
38
+ // The request body is empty because that's not important for this test.
39
+ const response = await request(tembaServer).put(`${resourceUrl}/${id}`);
40
+ expect(response.statusCode).toEqual(400);
41
+ expect(response.body.message).toEqual('400 Bad Request error from PUT');
42
+ });
43
+ test('PATCH with a requestBodyInterceptor that returns an error string should result in 400 Bad Request', async () => {
44
+ const expectedResource = 'pokemons';
45
+ const resourceUrl = '/' + expectedResource;
46
+ // First create a resource, so we have an id to PUT to.
47
+ const postResponse = await request(tembaServer)
48
+ .post(resourceUrl)
49
+ .send({ name: 'Pikachu' })
50
+ .set('Content-Type', 'application/json');
51
+ expect(postResponse.statusCode).toEqual(201);
52
+ const id = postResponse.header.location?.split('/').pop();
53
+ // Send a PATCH request to the id.
54
+ // The request body is empty because that's not important for this test.
55
+ const response = await request(tembaServer).patch(`${resourceUrl}/${id}`);
56
+ expect(response.statusCode).toEqual(400);
57
+ expect(response.body.message).toEqual('400 Bad Request error from PATCH');
58
+ });
59
+ });
60
+ //# sourceMappingURL=requestBodyInterceptor-error-string.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestBodyInterceptor-error-string.test.js","sourceRoot":"","sources":["../../../../test/integration/requestBodyInterceptor/requestBodyInterceptor-error-string.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=requestBodyInterceptor-invalid-return-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestBodyInterceptor-invalid-return-types.test.d.ts","sourceRoot":"","sources":["../../../../test/integration/requestBodyInterceptor/requestBodyInterceptor-invalid-return-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import request from 'supertest';
3
+ import createServer from '../createServer';
4
+ describe('requestBodyInterceptors does not return an object', () => {
5
+ const getResponse = (resource) => {
6
+ if (resource === 'return-number')
7
+ return 1;
8
+ if (resource === 'return-array')
9
+ return [1, 2, 3];
10
+ if (resource === 'return-boolean')
11
+ return true;
12
+ return {};
13
+ };
14
+ const requestBodyInterceptor = {
15
+ post: ({ resource }) => {
16
+ return getResponse(resource);
17
+ },
18
+ put: ({ resource }) => {
19
+ return getResponse(resource);
20
+ },
21
+ patch: ({ resource }) => {
22
+ return getResponse(resource);
23
+ },
24
+ };
25
+ const tembaServer = createServer({ requestBodyInterceptor });
26
+ test('requestBodyInterceptor returns the original request body when something else than an object or string is returned', async () => {
27
+ // Send POST requests.
28
+ let response = await request(tembaServer)
29
+ .post('/return-number')
30
+ .send({ name: 'Jane' })
31
+ .set('Content-Type', 'application/json');
32
+ expect(response.statusCode).toEqual(201);
33
+ expect(response.body.name).toEqual('Jane');
34
+ const numberId = response.header.location?.split('/').pop();
35
+ response = await request(tembaServer)
36
+ .post('/return-array')
37
+ .send({ name: 'Jane' })
38
+ .set('Content-Type', 'application/json');
39
+ expect(response.statusCode).toEqual(201);
40
+ expect(response.body.name).toEqual('Jane');
41
+ const arrayId = response.header.location?.split('/').pop();
42
+ response = await request(tembaServer)
43
+ .post('/return-boolean')
44
+ .send({ name: 'Jane' })
45
+ .set('Content-Type', 'application/json');
46
+ expect(response.statusCode).toEqual(201);
47
+ expect(response.body.name).toEqual('Jane');
48
+ const booleanId = response.header.location?.split('/').pop();
49
+ // Send PUT requests.
50
+ response = await request(tembaServer)
51
+ .put('/return-number/' + numberId)
52
+ .send({ name: 'Jane' })
53
+ .set('Content-Type', 'application/json');
54
+ expect(response.statusCode).toEqual(200);
55
+ expect(response.body.name).toEqual('Jane');
56
+ response = await request(tembaServer)
57
+ .put('/return-array/' + arrayId)
58
+ .send({ name: 'Jane' })
59
+ .set('Content-Type', 'application/json');
60
+ expect(response.statusCode).toEqual(200);
61
+ expect(response.body.name).toEqual('Jane');
62
+ response = await request(tembaServer)
63
+ .put('/return-boolean/' + booleanId)
64
+ .send({ name: 'Jane' })
65
+ .set('Content-Type', 'application/json');
66
+ expect(response.statusCode).toEqual(200);
67
+ expect(response.body.name).toEqual('Jane');
68
+ // Send PATCH requests.
69
+ response = await request(tembaServer)
70
+ .patch('/return-number/' + numberId)
71
+ .send({ name: 'Jane' })
72
+ .set('Content-Type', 'application/json');
73
+ expect(response.statusCode).toEqual(200);
74
+ expect(response.body.name).toEqual('Jane');
75
+ response = await request(tembaServer)
76
+ .patch('/return-array/' + arrayId)
77
+ .send({ name: 'Jane' })
78
+ .set('Content-Type', 'application/json');
79
+ expect(response.statusCode).toEqual(200);
80
+ expect(response.body.name).toEqual('Jane');
81
+ response = await request(tembaServer)
82
+ .patch('/return-boolean/' + booleanId)
83
+ .send({ name: 'Jane' })
84
+ .set('Content-Type', 'application/json');
85
+ expect(response.statusCode).toEqual(200);
86
+ expect(response.body.name).toEqual('Jane');
87
+ });
88
+ });
89
+ //# sourceMappingURL=requestBodyInterceptor-invalid-return-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestBodyInterceptor-invalid-return-types.test.js","sourceRoot":"","sources":["../../../../test/integration/requestBodyInterceptor/requestBodyInterceptor-invalid-return-types.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=requestBodyInterceptor-void.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestBodyInterceptor-void.test.d.ts","sourceRoot":"","sources":["../../../../test/integration/requestBodyInterceptor/requestBodyInterceptor-void.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import request from 'supertest';
3
+ import createServer from '../createServer';
4
+ describe('requestBodyInterceptors that return nothing (void) to indicate nothing should be done', () => {
5
+ const requestBodyInterceptor = {
6
+ post: () => { },
7
+ put: () => { },
8
+ patch: () => { },
9
+ };
10
+ const tembaServer = createServer({ requestBodyInterceptor });
11
+ test('POST with a requestBodyInterceptor that returns void', async () => {
12
+ const resourceUrl = '/movies';
13
+ // Send a POST request.
14
+ // The request body is empty because that's not important for this test.
15
+ const response = await request(tembaServer).post(resourceUrl);
16
+ expect(response.statusCode).toEqual(201);
17
+ });
18
+ test('PUT with a requestBodyInterceptor that returns void', async () => {
19
+ const resourceUrl = '/pokemons';
20
+ // First create a resource, so we have an id to PUT to.
21
+ const postResponse = await request(tembaServer)
22
+ .post(resourceUrl)
23
+ .send({ name: 'Pikachu' })
24
+ .set('Content-Type', 'application/json');
25
+ expect(postResponse.statusCode).toEqual(201);
26
+ const id = postResponse.header.location?.split('/').pop();
27
+ // Send a PUT request to the id.
28
+ // The request body is empty because that's not important for this test.
29
+ const response = await request(tembaServer).put(`${resourceUrl}/${id}`);
30
+ expect(response.statusCode).toEqual(200);
31
+ });
32
+ test('PATCH with a requestBodyInterceptor that returns void', async () => {
33
+ const resourceUrl = '/pokemons';
34
+ // First create a resource, so we have an id to PUT to.
35
+ const postResponse = await request(tembaServer)
36
+ .post(resourceUrl)
37
+ .send({ name: 'Pikachu' })
38
+ .set('Content-Type', 'application/json');
39
+ expect(postResponse.statusCode).toEqual(201);
40
+ const id = postResponse.header.location?.split('/').pop();
41
+ // Send a PATCH request to the id.
42
+ // The request body is empty because that's not important for this test.
43
+ const response = await request(tembaServer).patch(`${resourceUrl}/${id}`);
44
+ expect(response.statusCode).toEqual(200);
45
+ });
46
+ });
47
+ //# sourceMappingURL=requestBodyInterceptor-void.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestBodyInterceptor-void.test.js","sourceRoot":"","sources":["../../../../test/integration/requestBodyInterceptor/requestBodyInterceptor-void.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,OAAO,MAAM,WAAW,CAAA;AAE/B,OAAO,YAAY,MAAM,iBAAiB,CAAA;AAE1C,QAAQ,CAAC,uFAAuF,EAAE,GAAG,EAAE;IACrG,MAAM,sBAAsB,GAAG;QAC7B,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;QACd,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;QACb,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;KAChB,CAAA;IAED,MAAM,WAAW,GAAG,YAAY,CAAC,EAAE,sBAAsB,EAAuB,CAAC,CAAA;IAEjF,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,WAAW,GAAG,SAAS,CAAA;QAE7B,uBAAuB;QACvB,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAE7D,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,WAAW,GAAG,WAAW,CAAA;QAE/B,uDAAuD;QACvD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;aAC5C,IAAI,CAAC,WAAW,CAAC;aACjB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aACzB,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QAC1C,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5C,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;QAEzD,gCAAgC;QAChC,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC,CAAA;QAEvE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,WAAW,GAAG,WAAW,CAAA;QAE/B,uDAAuD;QACvD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;aAC5C,IAAI,CAAC,WAAW,CAAC;aACjB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aACzB,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QAC1C,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5C,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;QAEzD,kCAAkC;QAClC,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC,CAAA;QAEzE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=responseBodyInterceptor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseBodyInterceptor.test.d.ts","sourceRoot":"","sources":["../../../test/integration/responseBodyInterceptor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,107 @@
1
+ import { describe, beforeEach, test, expect } from 'vitest';
2
+ import request from 'supertest';
3
+ import createServer from './createServer';
4
+ describe('responseBodyInterceptor unusual (but allowed) implementations', () => {
5
+ const noReturnValues = [undefined, null];
6
+ test.each(noReturnValues)('When responseBodyInterceptor returns nothing, return original response body', async (returnValue) => {
7
+ const tembaServer = createServer({
8
+ responseBodyInterceptor: () => {
9
+ //do not return anything when returnValue is undefined
10
+ if (typeof returnValue !== 'undefined')
11
+ return returnValue;
12
+ },
13
+ });
14
+ // Delete all items.
15
+ await request(tembaServer).delete('/stuff');
16
+ // As the responseBodyInterceptor returns nothing, the response body should be the same
17
+ // as it would be without the responseBodyInterceptor.
18
+ const response = await request(tembaServer).get('/stuff');
19
+ expect(response.statusCode).toEqual(200);
20
+ expect(response.text).toEqual('[]');
21
+ // Create an item
22
+ const { body: { id: newId }, } = await request(tembaServer).post('/stuff').send({ name: 'newItem' });
23
+ // As the responseBodyInterceptor returns nothing, the response body should be the same
24
+ // as it would be without the responseBodyInterceptor.
25
+ const response2 = await request(tembaServer).get('/stuff');
26
+ expect(response2.body.length).toBe(1);
27
+ expect(response2.body[0].name).toBe('newItem');
28
+ // Now get the item by its id, which should also just return the same item.
29
+ const response3 = await request(tembaServer).get('/stuff/' + newId);
30
+ expect(response3.body.name).toEqual('newItem');
31
+ });
32
+ test('When responseBodyInterceptor throws an exception, return a 500 status with error details', async () => {
33
+ const tembaServer = createServer({
34
+ responseBodyInterceptor: () => {
35
+ throw new Error('Something went wrong');
36
+ },
37
+ });
38
+ const response = await request(tembaServer).get('/stuff');
39
+ expect(response.statusCode).toEqual(500);
40
+ expect(response.body.message).toEqual(`Something went wrong`);
41
+ });
42
+ test('When responseBodyInterceptor does not return an object or array, still return the intercepted value', async () => {
43
+ const tembaServer = createServer({
44
+ responseBodyInterceptor: (info) => {
45
+ if ('id' in info) {
46
+ return 'A string, instead of an object';
47
+ }
48
+ else {
49
+ return 'A string, instead of an array';
50
+ }
51
+ },
52
+ });
53
+ const { body: { id }, } = await request(tembaServer).post('/stuff').send({ name: 'newItem' });
54
+ const response = await request(tembaServer).get('/stuff');
55
+ expect(response.statusCode).toEqual(200);
56
+ expect(response.body).toEqual('A string, instead of an array');
57
+ const response2 = await request(tembaServer).get('/stuff/' + id);
58
+ expect(response2.statusCode).toEqual(200);
59
+ expect(response2.body).toEqual('A string, instead of an object');
60
+ });
61
+ });
62
+ describe('responseBodyInterceptor returns an updated response', () => {
63
+ const tembaServer = createServer({
64
+ responseBodyInterceptor: (info) => {
65
+ if (info.resource === 'stuff') {
66
+ if ('id' in info) {
67
+ return { ...info.body, extra: 'stuff' };
68
+ }
69
+ else {
70
+ return info.body.map((item, index) => ({
71
+ ...item,
72
+ extra: 'stuff ' + index,
73
+ }));
74
+ }
75
+ }
76
+ },
77
+ });
78
+ beforeEach(async () => {
79
+ // Delete all items
80
+ await request(tembaServer).delete('/stuff');
81
+ });
82
+ test('GET a collection just returns the same collection', async () => {
83
+ // Create 2 items
84
+ await request(tembaServer).post('/stuff').send({ name: 'newItem1' });
85
+ await request(tembaServer).post('/stuff').send({ name: 'newItem2' });
86
+ // Now get the collection, which should have extra stuff
87
+ const getAllResponse = await request(tembaServer).get('/stuff');
88
+ expect(getAllResponse.status).toBe(200);
89
+ expect(getAllResponse.body.length).toBe(2);
90
+ expect(getAllResponse.body[0].name).toBe('newItem1');
91
+ expect(getAllResponse.body[0].extra).toBe('stuff 0');
92
+ expect(getAllResponse.body[1].name).toBe('newItem2');
93
+ expect(getAllResponse.body[1].extra).toBe('stuff 1');
94
+ });
95
+ test('GET an item just returns the same item', async () => {
96
+ // Create an item
97
+ const newItem = { name: 'newItem' };
98
+ const { body: { id }, } = await request(tembaServer).post('/stuff').send(newItem);
99
+ // Now get the item, which should just return the same item.
100
+ const response = await request(tembaServer).get('/stuff/' + id);
101
+ expect(response.statusCode).toEqual(200);
102
+ expect(response.body.name).toEqual('newItem');
103
+ expect(response.body.id).toEqual(id);
104
+ expect(response.body.extra).toEqual('stuff');
105
+ });
106
+ });
107
+ //# sourceMappingURL=responseBodyInterceptor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseBodyInterceptor.test.js","sourceRoot":"","sources":["../../../test/integration/responseBodyInterceptor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=returnNullFields.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"returnNullFields.test.d.ts","sourceRoot":"","sources":["../../../test/integration/returnNullFields.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { test, expect } from 'vitest';
2
+ import request from 'supertest';
3
+ import createServer from './createServer';
4
+ /*
5
+ Tests when configuring returnNullFields.
6
+ */
7
+ test.each([true, false])('returnNullFields setting is %s', async (returnNullFields) => {
8
+ const tembaServer = createServer({ returnNullFields });
9
+ // Create a car
10
+ const createResponse = await request(tembaServer)
11
+ .post('/cars')
12
+ .send({ brand: 'Mercedes-Benz', color: null });
13
+ expect(createResponse.body.brand).toBe('Mercedes-Benz');
14
+ if (returnNullFields)
15
+ expect(createResponse.body.color).toBeNull();
16
+ else
17
+ expect(createResponse.body.color).toBeUndefined();
18
+ // Fetch all cars
19
+ const getAllResponse = await request(tembaServer).get('/cars');
20
+ expect(getAllResponse.body[0].brand).toBe('Mercedes-Benz');
21
+ if (returnNullFields)
22
+ expect(getAllResponse.body[0].color).toBeNull();
23
+ else
24
+ expect(getAllResponse.body[0].color).toBeUndefined();
25
+ // Fetch one car
26
+ const getOneResponse = await request(tembaServer).get('/cars/' + createResponse.body.id);
27
+ expect(getOneResponse.body.brand).toBe('Mercedes-Benz');
28
+ if (returnNullFields)
29
+ expect(getOneResponse.body.color).toBeNull();
30
+ else
31
+ expect(getOneResponse.body.color).toBeUndefined();
32
+ // Replace one car
33
+ const replaceResponse = await request(tembaServer)
34
+ .put('/cars/' + createResponse.body.id)
35
+ .send({ brand: 'Mercedes-Benz', color: null });
36
+ expect(replaceResponse.body.brand).toBe('Mercedes-Benz');
37
+ if (returnNullFields)
38
+ expect(replaceResponse.body.color).toBeNull();
39
+ else
40
+ expect(replaceResponse.body.color).toBeUndefined();
41
+ // Update one car
42
+ const updateResponse = await request(tembaServer)
43
+ .patch('/cars/' + createResponse.body.id)
44
+ .send({ brand: 'Mercedes-Benz', color: null });
45
+ expect(updateResponse.body.brand).toBe('Mercedes-Benz');
46
+ if (returnNullFields)
47
+ expect(updateResponse.body.color).toBeNull();
48
+ else
49
+ expect(updateResponse.body.color).toBeUndefined();
50
+ });
51
+ //# sourceMappingURL=returnNullFields.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"returnNullFields.test.js","sourceRoot":"","sources":["../../../test/integration/returnNullFields.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=root-url.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-url.test.d.ts","sourceRoot":"","sources":["../../../test/integration/root-url.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { test, expect } from 'vitest';
2
+ import request from 'supertest';
3
+ import createServer from './createServer';
4
+ /*
5
+ Tests on the root URL: "/"
6
+ */
7
+ // This Temba server is created with the default configuration, i.e. no config object is supplied.
8
+ const tembaServer = createServer();
9
+ test('GET on root URL returns welcome text', async () => {
10
+ const response = await request(tembaServer).get('/');
11
+ expect(response.statusCode).toEqual(200);
12
+ expect(response.text).toEqual('It works! ツ');
13
+ });
14
+ test('POST on root URL returns Method Not Allowed error', async () => {
15
+ const response = await request(tembaServer).post('/');
16
+ expect(response.statusCode).toEqual(405);
17
+ expect(response.body.message).toEqual('Method Not Allowed');
18
+ });
19
+ test('PUT on root URL returns Method Not Allowed error', async () => {
20
+ const response = await request(tembaServer).put('/');
21
+ expect(response.statusCode).toEqual(405);
22
+ expect(response.body.message).toEqual('Method Not Allowed');
23
+ });
24
+ test('DELETE on root URL returns Method Not Allowed error', async () => {
25
+ const response = await request(tembaServer).delete('/');
26
+ expect(response.statusCode).toEqual(405);
27
+ expect(response.body.message).toEqual('Method Not Allowed');
28
+ });
29
+ //# sourceMappingURL=root-url.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-url.test.js","sourceRoot":"","sources":["../../../test/integration/root-url.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,OAAO,MAAM,WAAW,CAAA;AAC/B,OAAO,YAAY,MAAM,gBAAgB,CAAA;AAEzC;;EAEE;AAEF,kGAAkG;AAClG,MAAM,WAAW,GAAG,YAAY,EAAE,CAAA;AAElC,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;IACtD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAEpD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;AAC9C,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;IACnE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAErD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAC7D,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;IAClE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAEpD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAC7D,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;IACrE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAEvD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAC7D,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema-validation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validation.test.d.ts","sourceRoot":"","sources":["../../../test/integration/schema-validation.test.ts"],"names":[],"mappings":""}