@n1k1t/mock-server 0.1.59 → 0.1.61

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 (583) hide show
  1. package/bin/index.ts +33 -0
  2. package/coverage/clover.xml +1372 -0
  3. package/coverage/cobertura-coverage.xml +3466 -0
  4. package/coverage/coverage-final.json +76 -0
  5. package/coverage/lcov-report/base.css +224 -0
  6. package/coverage/lcov-report/block-navigation.js +87 -0
  7. package/coverage/lcov-report/client/errors/connection.error.ts.html +106 -0
  8. package/coverage/lcov-report/client/errors/index.html +161 -0
  9. package/coverage/lcov-report/client/errors/index.ts.html +97 -0
  10. package/coverage/lcov-report/client/errors/internal-server.error.ts.html +115 -0
  11. package/coverage/lcov-report/client/errors/validation.error.ts.html +115 -0
  12. package/coverage/lcov-report/client/helpers/expectations.ts.html +766 -0
  13. package/coverage/lcov-report/client/helpers/index.html +131 -0
  14. package/coverage/lcov-report/client/helpers/index.ts.html +88 -0
  15. package/coverage/lcov-report/client/index.html +161 -0
  16. package/coverage/lcov-report/client/index.ts.html +100 -0
  17. package/coverage/lcov-report/client/methods/expectations-group.update.method.ts.html +193 -0
  18. package/coverage/lcov-report/client/methods/expectations.create.method.ts.html +202 -0
  19. package/coverage/lcov-report/client/methods/expectations.delete.method.ts.html +184 -0
  20. package/coverage/lcov-report/client/methods/expectations.update.method.ts.html +241 -0
  21. package/coverage/lcov-report/client/methods/index.html +191 -0
  22. package/coverage/lcov-report/client/methods/index.ts.html +103 -0
  23. package/coverage/lcov-report/client/methods/ping.method.ts.html +160 -0
  24. package/coverage/lcov-report/client/models/client.ts.html +340 -0
  25. package/coverage/lcov-report/client/models/index.html +146 -0
  26. package/coverage/lcov-report/client/models/index.ts.html +91 -0
  27. package/coverage/lcov-report/client/models/method.ts.html +235 -0
  28. package/coverage/lcov-report/client/onsite.ts.html +172 -0
  29. package/coverage/lcov-report/client/remote.ts.html +187 -0
  30. package/coverage/lcov-report/client/utils.ts.html +211 -0
  31. package/coverage/lcov-report/config/index.html +131 -0
  32. package/coverage/lcov-report/config/index.ts.html +97 -0
  33. package/coverage/lcov-report/config/model.ts.html +226 -0
  34. package/coverage/lcov-report/expectations/__utils__/index.html +116 -0
  35. package/coverage/lcov-report/expectations/__utils__/index.ts.html +268 -0
  36. package/coverage/lcov-report/expectations/index.html +146 -0
  37. package/coverage/lcov-report/expectations/index.ts.html +94 -0
  38. package/coverage/lcov-report/expectations/models/expectation.ts.html +373 -0
  39. package/coverage/lcov-report/expectations/models/index.html +161 -0
  40. package/coverage/lcov-report/expectations/models/index.ts.html +94 -0
  41. package/coverage/lcov-report/expectations/models/operator.ts.html +352 -0
  42. package/coverage/lcov-report/expectations/models/storage.ts.html +211 -0
  43. package/coverage/lcov-report/expectations/operators/and.operator.ts.html +196 -0
  44. package/coverage/lcov-report/expectations/operators/exec.operator.ts.html +160 -0
  45. package/coverage/lcov-report/expectations/operators/has.operator.ts.html +778 -0
  46. package/coverage/lcov-report/expectations/operators/if.operator.ts.html +316 -0
  47. package/coverage/lcov-report/expectations/operators/index.html +281 -0
  48. package/coverage/lcov-report/expectations/operators/index.ts.html +118 -0
  49. package/coverage/lcov-report/expectations/operators/merge.operator.ts.html +379 -0
  50. package/coverage/lcov-report/expectations/operators/not.operator.ts.html +199 -0
  51. package/coverage/lcov-report/expectations/operators/or.operator.ts.html +196 -0
  52. package/coverage/lcov-report/expectations/operators/remove.operator.ts.html +238 -0
  53. package/coverage/lcov-report/expectations/operators/root.operator.ts.html +238 -0
  54. package/coverage/lcov-report/expectations/operators/set.operator.ts.html +436 -0
  55. package/coverage/lcov-report/expectations/operators/switch.operator.ts.html +463 -0
  56. package/coverage/lcov-report/expectations/types.ts.html +766 -0
  57. package/coverage/lcov-report/expectations/utils.ts.html +802 -0
  58. package/coverage/lcov-report/favicon.png +0 -0
  59. package/coverage/lcov-report/index.html +431 -0
  60. package/coverage/lcov-report/logger/index.html +131 -0
  61. package/coverage/lcov-report/logger/index.ts.html +325 -0
  62. package/coverage/lcov-report/logger/utils.ts.html +160 -0
  63. package/coverage/lcov-report/meta/index.html +146 -0
  64. package/coverage/lcov-report/meta/index.ts.html +103 -0
  65. package/coverage/lcov-report/meta/model.ts.html +172 -0
  66. package/coverage/lcov-report/meta/storage.ts.html +145 -0
  67. package/coverage/lcov-report/prettify.css +1 -0
  68. package/coverage/lcov-report/prettify.js +2 -0
  69. package/coverage/lcov-report/server/expectations/__utils__/index.html +116 -0
  70. package/coverage/lcov-report/server/expectations/__utils__/index.ts.html +199 -0
  71. package/coverage/lcov-report/server/expectations/index.html +131 -0
  72. package/coverage/lcov-report/server/expectations/operators/and.operator.ts.html +103 -0
  73. package/coverage/lcov-report/server/expectations/operators/exec.operator.ts.html +139 -0
  74. package/coverage/lcov-report/server/expectations/operators/has.operator.ts.html +358 -0
  75. package/coverage/lcov-report/server/expectations/operators/if.operator.ts.html +130 -0
  76. package/coverage/lcov-report/server/expectations/operators/index.html +266 -0
  77. package/coverage/lcov-report/server/expectations/operators/index.ts.html +112 -0
  78. package/coverage/lcov-report/server/expectations/operators/merge.operator.ts.html +193 -0
  79. package/coverage/lcov-report/server/expectations/operators/not.operator.ts.html +100 -0
  80. package/coverage/lcov-report/server/expectations/operators/or.operator.ts.html +115 -0
  81. package/coverage/lcov-report/server/expectations/operators/remove.operator.ts.html +169 -0
  82. package/coverage/lcov-report/server/expectations/operators/set.operator.ts.html +208 -0
  83. package/coverage/lcov-report/server/expectations/operators/utils.ts.html +346 -0
  84. package/coverage/lcov-report/server/expectations/types.ts.html +517 -0
  85. package/coverage/lcov-report/server/expectations/utils.ts.html +358 -0
  86. package/coverage/lcov-report/server/models/containers/index.html +161 -0
  87. package/coverage/lcov-report/server/models/containers/index.ts.html +91 -0
  88. package/coverage/lcov-report/server/models/containers/model.ts.html +328 -0
  89. package/coverage/lcov-report/server/models/containers/storage.ts.html +256 -0
  90. package/coverage/lcov-report/server/models/containers/utils.ts.html +97 -0
  91. package/coverage/lcov-report/server/models/context/index.html +146 -0
  92. package/coverage/lcov-report/server/models/context/index.ts.html +514 -0
  93. package/coverage/lcov-report/server/models/context/snapshot.ts.html +529 -0
  94. package/coverage/lcov-report/server/models/context/utils.ts.html +382 -0
  95. package/coverage/lcov-report/server/models/endpoint.ts.html +304 -0
  96. package/coverage/lcov-report/server/models/exchanges/index.html +131 -0
  97. package/coverage/lcov-report/server/models/exchanges/index.ts.html +88 -0
  98. package/coverage/lcov-report/server/models/exchanges/socket-io.ts.html +154 -0
  99. package/coverage/lcov-report/server/models/executor/errors/index.html +116 -0
  100. package/coverage/lcov-report/server/models/executor/errors/index.ts.html +130 -0
  101. package/coverage/lcov-report/server/models/executor/index.html +116 -0
  102. package/coverage/lcov-report/server/models/executor/index.ts.html +1018 -0
  103. package/coverage/lcov-report/server/models/history/index.html +146 -0
  104. package/coverage/lcov-report/server/models/history/index.ts.html +91 -0
  105. package/coverage/lcov-report/server/models/history/model.ts.html +331 -0
  106. package/coverage/lcov-report/server/models/history/storage.ts.html +184 -0
  107. package/coverage/lcov-report/server/models/index.html +161 -0
  108. package/coverage/lcov-report/server/models/index.ts.html +115 -0
  109. package/coverage/lcov-report/server/models/providers/index.html +146 -0
  110. package/coverage/lcov-report/server/models/providers/index.ts.html +91 -0
  111. package/coverage/lcov-report/server/models/providers/model.ts.html +211 -0
  112. package/coverage/lcov-report/server/models/providers/storage.ts.html +172 -0
  113. package/coverage/lcov-report/server/models/reply.ts.html +115 -0
  114. package/coverage/lcov-report/server/models/router.ts.html +313 -0
  115. package/coverage/lcov-report/server/models/transports/index.html +146 -0
  116. package/coverage/lcov-report/server/models/transports/index.ts.html +91 -0
  117. package/coverage/lcov-report/server/models/transports/model.ts.html +112 -0
  118. package/coverage/lcov-report/server/models/transports/storage.ts.html +124 -0
  119. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  120. package/coverage/lcov-report/sorter.js +196 -0
  121. package/coverage/lcov-report/utils/common.ts.html +187 -0
  122. package/coverage/lcov-report/utils/index.html +176 -0
  123. package/coverage/lcov-report/utils/index.ts.html +97 -0
  124. package/coverage/lcov-report/utils/json.ts.html +193 -0
  125. package/coverage/lcov-report/utils/regexp.ts.html +97 -0
  126. package/coverage/lcov-report/utils/validation.ts.html +190 -0
  127. package/coverage/lcov.info +3012 -0
  128. package/discardedTests.txt +35606 -0
  129. package/images/preview.png +0 -0
  130. package/images/strategy.png +0 -0
  131. package/keploy.yml +64 -0
  132. package/lib/package.json +1 -1
  133. package/lib/src/client/errors/connection.error.spec.d.ts +2 -0
  134. package/lib/src/client/errors/connection.error.spec.d.ts.map +1 -0
  135. package/lib/src/client/errors/connection.error.spec.js +12 -0
  136. package/lib/src/client/errors/connection.error.spec.js.map +1 -0
  137. package/lib/src/client/errors/internal-server.error.spec.d.ts +2 -0
  138. package/lib/src/client/errors/internal-server.error.spec.d.ts.map +1 -0
  139. package/lib/src/client/errors/internal-server.error.spec.js +12 -0
  140. package/lib/src/client/errors/internal-server.error.spec.js.map +1 -0
  141. package/lib/src/client/errors/validation.error.spec.d.ts +2 -0
  142. package/lib/src/client/errors/validation.error.spec.d.ts.map +1 -0
  143. package/lib/src/client/errors/validation.error.spec.js +10 -0
  144. package/lib/src/client/errors/validation.error.spec.js.map +1 -0
  145. package/lib/src/client/models/client.spec.d.ts +2 -0
  146. package/lib/src/client/models/client.spec.d.ts.map +1 -0
  147. package/lib/src/client/models/client.spec.js +244 -0
  148. package/lib/src/client/models/client.spec.js.map +1 -0
  149. package/lib/src/client/onsite.spec.d.ts +2 -0
  150. package/lib/src/client/onsite.spec.d.ts.map +1 -0
  151. package/lib/src/client/onsite.spec.js +23 -0
  152. package/lib/src/client/onsite.spec.js.map +1 -0
  153. package/lib/src/client/remote.spec.d.ts +2 -0
  154. package/lib/src/client/remote.spec.d.ts.map +1 -0
  155. package/lib/src/client/remote.spec.js +16 -0
  156. package/lib/src/client/remote.spec.js.map +1 -0
  157. package/lib/src/client/utils.spec.d.ts +2 -0
  158. package/lib/src/client/utils.spec.d.ts.map +1 -0
  159. package/lib/src/client/utils.spec.js +57 -0
  160. package/lib/src/client/utils.spec.js.map +1 -0
  161. package/lib/src/expectations/models/storage.spec.d.ts +2 -0
  162. package/lib/src/expectations/models/storage.spec.d.ts.map +1 -0
  163. package/lib/src/expectations/models/storage.spec.js +57 -0
  164. package/lib/src/expectations/models/storage.spec.js.map +1 -0
  165. package/lib/src/expectations/operators/and.operator.spec.d.ts +2 -0
  166. package/lib/src/expectations/operators/and.operator.spec.d.ts.map +1 -0
  167. package/lib/src/expectations/operators/and.operator.spec.js +83 -0
  168. package/lib/src/expectations/operators/and.operator.spec.js.map +1 -0
  169. package/lib/src/expectations/operators/exec.operator.spec.d.ts +2 -0
  170. package/lib/src/expectations/operators/exec.operator.spec.d.ts.map +1 -0
  171. package/lib/src/expectations/operators/exec.operator.spec.js +68 -0
  172. package/lib/src/expectations/operators/exec.operator.spec.js.map +1 -0
  173. package/lib/src/expectations/operators/has.operator.spec.d.ts +2 -0
  174. package/lib/src/expectations/operators/has.operator.spec.d.ts.map +1 -0
  175. package/lib/src/expectations/operators/has.operator.spec.js +444 -0
  176. package/lib/src/expectations/operators/has.operator.spec.js.map +1 -0
  177. package/lib/src/expectations/operators/if.operator.spec.d.ts +2 -0
  178. package/lib/src/expectations/operators/if.operator.spec.d.ts.map +1 -0
  179. package/lib/src/expectations/operators/if.operator.spec.js +132 -0
  180. package/lib/src/expectations/operators/if.operator.spec.js.map +1 -0
  181. package/lib/src/expectations/operators/merge.operator.spec.d.ts +2 -0
  182. package/lib/src/expectations/operators/merge.operator.spec.d.ts.map +1 -0
  183. package/lib/src/expectations/operators/merge.operator.spec.js +75 -0
  184. package/lib/src/expectations/operators/merge.operator.spec.js.map +1 -0
  185. package/lib/src/expectations/operators/not.operator.spec.d.ts +2 -0
  186. package/lib/src/expectations/operators/not.operator.spec.d.ts.map +1 -0
  187. package/lib/src/expectations/operators/not.operator.spec.js +46 -0
  188. package/lib/src/expectations/operators/not.operator.spec.js.map +1 -0
  189. package/lib/src/expectations/operators/or.operator.spec.d.ts +2 -0
  190. package/lib/src/expectations/operators/or.operator.spec.d.ts.map +1 -0
  191. package/lib/src/expectations/operators/or.operator.spec.js +84 -0
  192. package/lib/src/expectations/operators/or.operator.spec.js.map +1 -0
  193. package/lib/src/expectations/operators/remove.operator.spec.d.ts +2 -0
  194. package/lib/src/expectations/operators/remove.operator.spec.d.ts.map +1 -0
  195. package/lib/src/expectations/operators/remove.operator.spec.js +67 -0
  196. package/lib/src/expectations/operators/remove.operator.spec.js.map +1 -0
  197. package/lib/src/expectations/operators/root.operator.spec.d.ts +2 -0
  198. package/lib/src/expectations/operators/root.operator.spec.d.ts.map +1 -0
  199. package/lib/src/expectations/operators/root.operator.spec.js +29 -0
  200. package/lib/src/expectations/operators/root.operator.spec.js.map +1 -0
  201. package/lib/src/expectations/operators/set.operator.spec.d.ts +2 -0
  202. package/lib/src/expectations/operators/set.operator.spec.d.ts.map +1 -0
  203. package/lib/src/expectations/operators/set.operator.spec.js +111 -0
  204. package/lib/src/expectations/operators/set.operator.spec.js.map +1 -0
  205. package/lib/src/expectations/operators/switch.operator.spec.d.ts +2 -0
  206. package/lib/src/expectations/operators/switch.operator.spec.d.ts.map +1 -0
  207. package/lib/src/expectations/operators/switch.operator.spec.js +139 -0
  208. package/lib/src/expectations/operators/switch.operator.spec.js.map +1 -0
  209. package/lib/src/expectations/utils/location.spec.d.ts +2 -0
  210. package/lib/src/expectations/utils/location.spec.d.ts.map +1 -0
  211. package/lib/src/expectations/utils/location.spec.js +62 -0
  212. package/lib/src/expectations/utils/location.spec.js.map +1 -0
  213. package/lib/src/expectations/utils/schema.spec.d.ts +2 -0
  214. package/lib/src/expectations/utils/schema.spec.d.ts.map +1 -0
  215. package/lib/src/expectations/utils/schema.spec.js +19 -0
  216. package/lib/src/expectations/utils/schema.spec.js.map +1 -0
  217. package/lib/src/gui/app/types/dev.d.ts +7 -0
  218. package/lib/src/gui/app/types/dev.d.ts.map +1 -0
  219. package/lib/src/gui/app/types/dev.js +3 -0
  220. package/lib/src/gui/app/types/dev.js.map +1 -0
  221. package/lib/src/gui/app/types/index.d.ts +2 -0
  222. package/lib/src/gui/app/types/index.d.ts.map +1 -0
  223. package/lib/src/gui/app/types/index.js +18 -0
  224. package/lib/src/gui/app/types/index.js.map +1 -0
  225. package/lib/src/index.d.ts +1 -1
  226. package/lib/src/index.d.ts.map +1 -1
  227. package/lib/src/index.js +1 -1
  228. package/lib/src/index.js.map +1 -1
  229. package/lib/src/meta/model.spec.d.ts +2 -0
  230. package/lib/src/meta/model.spec.d.ts.map +1 -0
  231. package/lib/src/meta/model.spec.js +28 -0
  232. package/lib/src/meta/model.spec.js.map +1 -0
  233. package/lib/src/meta/storage.spec.d.ts +2 -0
  234. package/lib/src/meta/storage.spec.d.ts.map +1 -0
  235. package/lib/src/meta/storage.spec.js +19 -0
  236. package/lib/src/meta/storage.spec.js.map +1 -0
  237. package/lib/src/server/models/containers/model.spec.d.ts +2 -0
  238. package/lib/src/server/models/containers/model.spec.d.ts.map +1 -0
  239. package/lib/src/server/models/containers/model.spec.js +79 -0
  240. package/lib/src/server/models/containers/model.spec.js.map +1 -0
  241. package/lib/src/server/models/containers/storage.spec.d.ts +2 -0
  242. package/lib/src/server/models/containers/storage.spec.d.ts.map +1 -0
  243. package/lib/src/server/models/containers/storage.spec.js +39 -0
  244. package/lib/src/server/models/containers/storage.spec.js.map +1 -0
  245. package/lib/src/server/models/context/index.spec.d.ts +2 -0
  246. package/lib/src/server/models/context/index.spec.d.ts.map +1 -0
  247. package/lib/src/server/models/context/index.spec.js +143 -0
  248. package/lib/src/server/models/context/index.spec.js.map +1 -0
  249. package/lib/src/server/models/context/snapshot.spec.d.ts +2 -0
  250. package/lib/src/server/models/context/snapshot.spec.d.ts.map +1 -0
  251. package/lib/src/server/models/context/snapshot.spec.js +75 -0
  252. package/lib/src/server/models/context/snapshot.spec.js.map +1 -0
  253. package/lib/src/server/models/context/utils.spec.d.ts +2 -0
  254. package/lib/src/server/models/context/utils.spec.d.ts.map +1 -0
  255. package/lib/src/server/models/context/utils.spec.js +69 -0
  256. package/lib/src/server/models/context/utils.spec.js.map +1 -0
  257. package/lib/src/server/models/endpoint.spec.d.ts +2 -0
  258. package/lib/src/server/models/endpoint.spec.d.ts.map +1 -0
  259. package/lib/src/server/models/endpoint.spec.js +28 -0
  260. package/lib/src/server/models/endpoint.spec.js.map +1 -0
  261. package/lib/src/server/models/exchanges/socket-io.spec.d.ts +2 -0
  262. package/lib/src/server/models/exchanges/socket-io.spec.d.ts.map +1 -0
  263. package/lib/src/server/models/exchanges/socket-io.spec.js +12 -0
  264. package/lib/src/server/models/exchanges/socket-io.spec.js.map +1 -0
  265. package/lib/src/server/models/executor/errors/index.spec.d.ts +2 -0
  266. package/lib/src/server/models/executor/errors/index.spec.d.ts.map +1 -0
  267. package/lib/src/server/models/executor/errors/index.spec.js +23 -0
  268. package/lib/src/server/models/executor/errors/index.spec.js.map +1 -0
  269. package/lib/src/server/models/executor/index.spec.d.ts +2 -0
  270. package/lib/src/server/models/executor/index.spec.d.ts.map +1 -0
  271. package/lib/src/server/models/executor/index.spec.js +137 -0
  272. package/lib/src/server/models/executor/index.spec.js.map +1 -0
  273. package/lib/src/server/models/history/model.spec.d.ts +2 -0
  274. package/lib/src/server/models/history/model.spec.d.ts.map +1 -0
  275. package/lib/src/server/models/history/model.spec.js +30 -0
  276. package/lib/src/server/models/history/model.spec.js.map +1 -0
  277. package/lib/src/server/models/history/storage.spec.d.ts +2 -0
  278. package/lib/src/server/models/history/storage.spec.d.ts.map +1 -0
  279. package/lib/src/server/models/history/storage.spec.js +42 -0
  280. package/lib/src/server/models/history/storage.spec.js.map +1 -0
  281. package/lib/src/server/models/providers/model.spec.d.ts +2 -0
  282. package/lib/src/server/models/providers/model.spec.d.ts.map +1 -0
  283. package/lib/src/server/models/providers/model.spec.js +13 -0
  284. package/lib/src/server/models/providers/model.spec.js.map +1 -0
  285. package/lib/src/server/models/providers/storage.spec.d.ts +2 -0
  286. package/lib/src/server/models/providers/storage.spec.d.ts.map +1 -0
  287. package/lib/src/server/models/providers/storage.spec.js +19 -0
  288. package/lib/src/server/models/providers/storage.spec.js.map +1 -0
  289. package/lib/src/server/models/reply.spec.d.ts +2 -0
  290. package/lib/src/server/models/reply.spec.d.ts.map +1 -0
  291. package/lib/src/server/models/reply.spec.js +20 -0
  292. package/lib/src/server/models/reply.spec.js.map +1 -0
  293. package/lib/src/server/models/router.spec.d.ts +2 -0
  294. package/lib/src/server/models/router.spec.d.ts.map +1 -0
  295. package/lib/src/server/models/router.spec.js +46 -0
  296. package/lib/src/server/models/router.spec.js.map +1 -0
  297. package/lib/src/server/models/transports/storage.spec.d.ts +2 -0
  298. package/lib/src/server/models/transports/storage.spec.d.ts.map +1 -0
  299. package/lib/src/server/models/transports/storage.spec.js +13 -0
  300. package/lib/src/server/models/transports/storage.spec.js.map +1 -0
  301. package/lib/src/server/services/analytics.service.spec.d.ts +2 -0
  302. package/lib/src/server/services/analytics.service.spec.d.ts.map +1 -0
  303. package/lib/src/server/services/analytics.service.spec.js +35 -0
  304. package/lib/src/server/services/analytics.service.spec.js.map +1 -0
  305. package/lib/src/server/services/metrics.service.spec.d.ts +2 -0
  306. package/lib/src/server/services/metrics.service.spec.d.ts.map +1 -0
  307. package/lib/src/server/services/metrics.service.spec.js +35 -0
  308. package/lib/src/server/services/metrics.service.spec.js.map +1 -0
  309. package/lib/src/server/types/index.d.ts +27 -0
  310. package/lib/src/server/types/index.d.ts.map +1 -0
  311. package/lib/src/server/types/index.js +3 -0
  312. package/lib/src/server/types/index.js.map +1 -0
  313. package/lib/src/utils/index.spec.d.ts +2 -0
  314. package/lib/src/utils/index.spec.d.ts.map +1 -0
  315. package/lib/src/utils/index.spec.js +30 -0
  316. package/lib/src/utils/index.spec.js.map +1 -0
  317. package/lib/tsconfig.tsbuildinfo +1 -0
  318. package/lib/types/common.d.ts +73 -0
  319. package/lib/types/common.d.ts.map +1 -0
  320. package/lib/types/common.js +3 -0
  321. package/lib/types/common.js.map +1 -0
  322. package/lib/types/index.d.ts +2 -0
  323. package/lib/types/index.d.ts.map +1 -0
  324. package/lib/types/index.js +18 -0
  325. package/lib/types/index.js.map +1 -0
  326. package/lib/vite.config.d.ts +3 -0
  327. package/lib/vite.config.d.ts.map +1 -0
  328. package/lib/vite.config.js +57 -0
  329. package/lib/vite.config.js.map +1 -0
  330. package/package.json +1 -1
  331. package/src/client/errors/connection.error.spec.ts +10 -0
  332. package/src/client/errors/connection.error.ts +7 -0
  333. package/src/client/errors/index.ts +4 -0
  334. package/src/client/errors/internal-server.error.spec.ts +12 -0
  335. package/src/client/errors/internal-server.error.ts +10 -0
  336. package/src/client/errors/types.ts +3 -0
  337. package/src/client/errors/validation.error.spec.ts +9 -0
  338. package/src/client/errors/validation.error.ts +10 -0
  339. package/src/client/helpers/expectations.ts +227 -0
  340. package/src/client/helpers/index.ts +1 -0
  341. package/src/client/index.ts +5 -0
  342. package/src/client/methods/expectations-group.update.method.ts +36 -0
  343. package/src/client/methods/expectations.create.method.ts +39 -0
  344. package/src/client/methods/expectations.delete.method.ts +33 -0
  345. package/src/client/methods/expectations.update.method.ts +58 -0
  346. package/src/client/methods/index.ts +6 -0
  347. package/src/client/methods/ping.method.ts +25 -0
  348. package/src/client/models/__snapshots__/client.spec.ts.snap +1294 -0
  349. package/src/client/models/client.spec.ts +316 -0
  350. package/src/client/models/client.ts +85 -0
  351. package/src/client/models/index.ts +2 -0
  352. package/src/client/models/method.ts +50 -0
  353. package/src/client/onsite.spec.ts +23 -0
  354. package/src/client/onsite.ts +29 -0
  355. package/src/client/remote.spec.ts +15 -0
  356. package/src/client/remote.ts +34 -0
  357. package/src/client/types.ts +31 -0
  358. package/src/client/utils.spec.ts +60 -0
  359. package/src/client/utils.ts +41 -0
  360. package/src/config/index.ts +34 -0
  361. package/src/config/model.ts +24 -0
  362. package/src/expectations/__utils__/index.ts +61 -0
  363. package/src/expectations/errors/index.ts +7 -0
  364. package/src/expectations/index.ts +3 -0
  365. package/src/expectations/models/expectation.ts +96 -0
  366. package/src/expectations/models/index.ts +3 -0
  367. package/src/expectations/models/operator.ts +89 -0
  368. package/src/expectations/models/storage.spec.ts +70 -0
  369. package/src/expectations/models/storage.ts +42 -0
  370. package/src/expectations/operators/and.operator.spec.ts +59 -0
  371. package/src/expectations/operators/and.operator.ts +37 -0
  372. package/src/expectations/operators/exec.operator.spec.ts +47 -0
  373. package/src/expectations/operators/exec.operator.ts +25 -0
  374. package/src/expectations/operators/has.operator.spec.ts +514 -0
  375. package/src/expectations/operators/has.operator.ts +230 -0
  376. package/src/expectations/operators/if.operator.spec.ts +116 -0
  377. package/src/expectations/operators/if.operator.ts +77 -0
  378. package/src/expectations/operators/index.ts +11 -0
  379. package/src/expectations/operators/merge.operator.spec.ts +48 -0
  380. package/src/expectations/operators/merge.operator.ts +97 -0
  381. package/src/expectations/operators/not.operator.spec.ts +12 -0
  382. package/src/expectations/operators/not.operator.ts +38 -0
  383. package/src/expectations/operators/or.operator.spec.ts +60 -0
  384. package/src/expectations/operators/or.operator.ts +37 -0
  385. package/src/expectations/operators/remove.operator.spec.ts +40 -0
  386. package/src/expectations/operators/remove.operator.ts +50 -0
  387. package/src/expectations/operators/root.operator.spec.ts +26 -0
  388. package/src/expectations/operators/root.operator.ts +51 -0
  389. package/src/expectations/operators/set.operator.spec.ts +96 -0
  390. package/src/expectations/operators/set.operator.ts +116 -0
  391. package/src/expectations/operators/switch.operator.spec.ts +157 -0
  392. package/src/expectations/operators/switch.operator.ts +126 -0
  393. package/src/expectations/types.ts +225 -0
  394. package/src/expectations/utils/index.ts +3 -0
  395. package/src/expectations/utils/json.ts +22 -0
  396. package/src/expectations/utils/location.spec.ts +64 -0
  397. package/src/expectations/utils/location.ts +180 -0
  398. package/src/expectations/utils/schema.spec.ts +17 -0
  399. package/src/expectations/utils/schema.ts +60 -0
  400. package/src/gui/app/components/chart.component/index.ts +173 -0
  401. package/src/gui/app/components/chart.component/style.scss +4 -0
  402. package/src/gui/app/components/checkbox-area.component/index.ts +101 -0
  403. package/src/gui/app/components/checkbox-area.component/item.component.ts +72 -0
  404. package/src/gui/app/components/checkbox-area.component/style.scss +19 -0
  405. package/src/gui/app/components/checkbox-area.component/template.hbs +3 -0
  406. package/src/gui/app/components/curtain.component/index.ts +19 -0
  407. package/src/gui/app/components/curtain.component/style.scss +14 -0
  408. package/src/gui/app/components/empty.component/index.ts +10 -0
  409. package/src/gui/app/components/empty.component/style.scss +34 -0
  410. package/src/gui/app/components/empty.component/template.hbs +6 -0
  411. package/src/gui/app/components/expectation.component/index.ts +60 -0
  412. package/src/gui/app/components/expectation.component/style.scss +5 -0
  413. package/src/gui/app/components/expectation.component/template.hbs +5 -0
  414. package/src/gui/app/components/header.component/index.ts +81 -0
  415. package/src/gui/app/components/header.component/style.scss +46 -0
  416. package/src/gui/app/components/header.component/template.hbs +15 -0
  417. package/src/gui/app/components/history.component/index.ts +86 -0
  418. package/src/gui/app/components/history.component/style.scss +5 -0
  419. package/src/gui/app/components/history.component/template.hbs +62 -0
  420. package/src/gui/app/components/index.ts +11 -0
  421. package/src/gui/app/components/loader.component/index.ts +12 -0
  422. package/src/gui/app/components/loader.component/style.scss +39 -0
  423. package/src/gui/app/components/panel.component/index.ts +52 -0
  424. package/src/gui/app/components/panel.component/style.scss +60 -0
  425. package/src/gui/app/components/panel.component/template.hbs +13 -0
  426. package/src/gui/app/components/popups.component/index.ts +26 -0
  427. package/src/gui/app/components/popups.component/style.scss +51 -0
  428. package/src/gui/app/components/popups.component/template.hbs +9 -0
  429. package/src/gui/app/components/search.component/index.ts +67 -0
  430. package/src/gui/app/components/search.component/style.scss +43 -0
  431. package/src/gui/app/components/search.component/template.hbs +7 -0
  432. package/src/gui/app/components/viewer.component/index.ts +28 -0
  433. package/src/gui/app/components/viewer.component/style.scss +38 -0
  434. package/src/gui/app/components/viewer.component/template.hbs +3 -0
  435. package/src/gui/app/context.ts +76 -0
  436. package/src/gui/app/handlebars/helpers.ts +32 -0
  437. package/src/gui/app/handlebars/index.ts +11 -0
  438. package/src/gui/app/handlebars/partials/expectation-meta.hbs +53 -0
  439. package/src/gui/app/handlebars/partials/index.ts +2 -0
  440. package/src/gui/app/handlebars/partials/truncated.hbs +10 -0
  441. package/src/gui/app/handlebars/utils.ts +9 -0
  442. package/src/gui/app/main.ts +38 -0
  443. package/src/gui/app/models/button.ts +41 -0
  444. package/src/gui/app/models/client-storage.ts +21 -0
  445. package/src/gui/app/models/component.ts +79 -0
  446. package/src/gui/app/models/context.ts +14 -0
  447. package/src/gui/app/models/dynamic-storage.ts +36 -0
  448. package/src/gui/app/models/form.ts +75 -0
  449. package/src/gui/app/models/index.ts +7 -0
  450. package/src/gui/app/models/section.ts +82 -0
  451. package/src/gui/app/sections/analytics.section/index.ts +97 -0
  452. package/src/gui/app/sections/analytics.section/style.scss +1 -0
  453. package/src/gui/app/sections/analytics.section/template.hbs +6 -0
  454. package/src/gui/app/sections/expectations.section/index.ts +179 -0
  455. package/src/gui/app/sections/expectations.section/style.scss +1 -0
  456. package/src/gui/app/sections/expectations.section/template.hbs +15 -0
  457. package/src/gui/app/sections/history.section/index.ts +175 -0
  458. package/src/gui/app/sections/history.section/style.scss +10 -0
  459. package/src/gui/app/sections/history.section/templates/actions.hbs +5 -0
  460. package/src/gui/app/sections/history.section/templates/section.hbs +15 -0
  461. package/src/gui/app/sections/index.ts +4 -0
  462. package/src/gui/app/sections/settings.section/index.ts +63 -0
  463. package/src/gui/app/sections/settings.section/style.scss +24 -0
  464. package/src/gui/app/sections/settings.section/templates/cache.hbs +6 -0
  465. package/src/gui/app/sections/settings.section/templates/section.hbs +6 -0
  466. package/src/gui/app/sections/settings.section/templates/stats.hbs +6 -0
  467. package/src/gui/app/setup.ts +7 -0
  468. package/src/gui/app/tsconfig.json +20 -0
  469. package/src/gui/app/types/dev.ts +6 -0
  470. package/src/gui/app/types/index.ts +1 -0
  471. package/src/gui/app/types/window.global.ts +9 -0
  472. package/src/gui/app/utils.ts +15 -0
  473. package/src/gui/assets/fa-all.css +5 -0
  474. package/src/gui/assets/fa-regular-400.woff2 +0 -0
  475. package/src/gui/assets/fa-solid-900.woff2 +0 -0
  476. package/src/gui/assets/favicon.png +0 -0
  477. package/src/gui/index.html +18 -0
  478. package/src/gui/styles/_constants.scss +11 -0
  479. package/src/gui/styles/_elements.scss +216 -0
  480. package/src/gui/styles/_soon.scss +35 -0
  481. package/src/gui/styles/main.scss +245 -0
  482. package/src/index.ts +9 -0
  483. package/src/logger/index.ts +80 -0
  484. package/src/logger/types.ts +4 -0
  485. package/src/logger/utils.ts +25 -0
  486. package/src/meta/index.ts +6 -0
  487. package/src/meta/model.spec.ts +28 -0
  488. package/src/meta/model.ts +29 -0
  489. package/src/meta/storage.spec.ts +18 -0
  490. package/src/meta/storage.ts +20 -0
  491. package/src/server/endpoints/cache.delete.endpoint.ts +54 -0
  492. package/src/server/endpoints/cache.usage.get.endpoint.ts +12 -0
  493. package/src/server/endpoints/config.get.endpoint.ts +10 -0
  494. package/src/server/endpoints/expectations-group.update.endpoint.ts +32 -0
  495. package/src/server/endpoints/expectations.create.endpoint.ts +23 -0
  496. package/src/server/endpoints/expectations.delete.endpoint.ts +12 -0
  497. package/src/server/endpoints/expectations.get-list.endpoint.ts +15 -0
  498. package/src/server/endpoints/expectations.update.endpoint.ts +29 -0
  499. package/src/server/endpoints/gui.endpoint.ts +76 -0
  500. package/src/server/endpoints/history.delete.endpoint.ts +10 -0
  501. package/src/server/endpoints/history.get-list.endpoint.ts +15 -0
  502. package/src/server/endpoints/index.ts +18 -0
  503. package/src/server/endpoints/metrics.endpoint.ts +12 -0
  504. package/src/server/endpoints/ping.endpoint.ts +7 -0
  505. package/src/server/endpoints/stats.endpoint.ts +20 -0
  506. package/src/server/index.ts +182 -0
  507. package/src/server/models/containers/index.ts +2 -0
  508. package/src/server/models/containers/model.spec.ts +81 -0
  509. package/src/server/models/containers/model.ts +79 -0
  510. package/src/server/models/containers/storage.spec.ts +41 -0
  511. package/src/server/models/containers/storage.ts +59 -0
  512. package/src/server/models/containers/utils.ts +4 -0
  513. package/src/server/models/context/index.spec.ts +171 -0
  514. package/src/server/models/context/index.ts +136 -0
  515. package/src/server/models/context/snapshot.spec.ts +84 -0
  516. package/src/server/models/context/snapshot.ts +148 -0
  517. package/src/server/models/context/types.ts +65 -0
  518. package/src/server/models/context/utils.spec.ts +77 -0
  519. package/src/server/models/context/utils.ts +99 -0
  520. package/src/server/models/endpoint.spec.ts +28 -0
  521. package/src/server/models/endpoint.ts +69 -0
  522. package/src/server/models/exchanges/index.ts +1 -0
  523. package/src/server/models/exchanges/socket-io.spec.ts +13 -0
  524. package/src/server/models/exchanges/socket-io.ts +14 -0
  525. package/src/server/models/executor/errors/index.spec.ts +23 -0
  526. package/src/server/models/executor/errors/index.ts +15 -0
  527. package/src/server/models/executor/index.spec.ts +148 -0
  528. package/src/server/models/executor/index.ts +297 -0
  529. package/src/server/models/history/index.ts +2 -0
  530. package/src/server/models/history/model.spec.ts +35 -0
  531. package/src/server/models/history/model.ts +82 -0
  532. package/src/server/models/history/storage.spec.ts +41 -0
  533. package/src/server/models/history/storage.ts +38 -0
  534. package/src/server/models/index.ts +11 -0
  535. package/src/server/models/providers/index.ts +2 -0
  536. package/src/server/models/providers/model.spec.ts +11 -0
  537. package/src/server/models/providers/model.ts +33 -0
  538. package/src/server/models/providers/storage.spec.ts +21 -0
  539. package/src/server/models/providers/storage.ts +34 -0
  540. package/src/server/models/reply.spec.ts +17 -0
  541. package/src/server/models/reply.ts +10 -0
  542. package/src/server/models/router.spec.ts +50 -0
  543. package/src/server/models/router.ts +79 -0
  544. package/src/server/models/service.ts +5 -0
  545. package/src/server/models/transports/index.ts +2 -0
  546. package/src/server/models/transports/model.ts +9 -0
  547. package/src/server/models/transports/storage.spec.ts +14 -0
  548. package/src/server/models/transports/storage.ts +13 -0
  549. package/src/server/services/analytics.service.spec.ts +38 -0
  550. package/src/server/services/analytics.service.ts +58 -0
  551. package/src/server/services/index.ts +2 -0
  552. package/src/server/services/metrics.service.spec.ts +42 -0
  553. package/src/server/services/metrics.service.ts +46 -0
  554. package/src/server/transports/http.transport/context.ts +72 -0
  555. package/src/server/transports/http.transport/executor.ts +156 -0
  556. package/src/server/transports/http.transport/index.ts +53 -0
  557. package/src/server/transports/index.ts +3 -0
  558. package/src/server/transports/internal/http.transport/context.ts +50 -0
  559. package/src/server/transports/internal/http.transport/executor.ts +56 -0
  560. package/src/server/transports/internal/http.transport/index.ts +23 -0
  561. package/src/server/transports/internal/http.transport/reply.ts +82 -0
  562. package/src/server/transports/internal/index.ts +2 -0
  563. package/src/server/transports/internal/io.transport/context.ts +40 -0
  564. package/src/server/transports/internal/io.transport/executor.ts +27 -0
  565. package/src/server/transports/internal/io.transport/index.ts +36 -0
  566. package/src/server/transports/internal/io.transport/reply.ts +26 -0
  567. package/src/server/transports/internal/utils.ts +6 -0
  568. package/src/server/transports/ws.transport/context.ts +90 -0
  569. package/src/server/transports/ws.transport/executor.ts +64 -0
  570. package/src/server/transports/ws.transport/index.ts +105 -0
  571. package/src/server/types/index.ts +32 -0
  572. package/src/server/utils/index.ts +35 -0
  573. package/src/utils/index.spec.ts +31 -0
  574. package/src/utils/index.ts +51 -0
  575. package/test/index.ts +299 -0
  576. package/test/providers/index.ts +2 -0
  577. package/test/providers/root.ts +241 -0
  578. package/test/providers/statics.ts +37 -0
  579. package/tsconfig.json +108 -0
  580. package/tsconfig.tsbuildinfo +1 -0
  581. package/types/common.ts +127 -0
  582. package/types/index.ts +1 -0
  583. package/vite.config.ts +64 -0
@@ -0,0 +1,297 @@
1
+ import { gzip, ungzip } from 'node-gzip';
2
+ import { from } from 'rxjs';
3
+ import rfdc from 'rfdc';
4
+ import _ from 'lodash';
5
+
6
+ import type { Expectation, IExpectationSchemaForward } from '../../../expectations';
7
+
8
+ import { ExecutorManualError } from './errors';
9
+ import { cast, wait } from '../../../utils';
10
+ import { Logger } from '../../../logger';
11
+ import {
12
+ parsePayload,
13
+ RequestContext,
14
+ serializePayload,
15
+ extractPayloadType,
16
+ IRequestContextCache,
17
+ IRequestContextOutgoing,
18
+ IRequestContextIncoming,
19
+ IRequestContextForwarded,
20
+ } from '../context';
21
+
22
+ export * from './errors';
23
+
24
+ const clone = rfdc();
25
+ const logger = Logger.build('Server.Models.Executor');
26
+
27
+ export interface IExecutorExecOptions {
28
+ expectation?: Expectation<any>;
29
+ }
30
+
31
+ export abstract class Executor<TRequestContext extends RequestContext = RequestContext> {
32
+ public TRequestContext!: TRequestContext;
33
+ public TContext!: TRequestContext['TContext'];
34
+
35
+ /** Uses to handle request forwarding */
36
+ public abstract forward(
37
+ context: TRequestContext,
38
+ incoming: IRequestContextIncoming,
39
+ configuration: IExpectationSchemaForward,
40
+ ): Promise<IRequestContextForwarded | null>;
41
+
42
+ /** Uses to handle outgoing payload and reply */
43
+ public abstract reply(
44
+ context: TRequestContext,
45
+ outgoing: IRequestContextOutgoing
46
+ ): Promise<IRequestContextOutgoing | null>;
47
+
48
+ /** Matches expectation */
49
+ public async match(context: TRequestContext): Promise<Expectation<any> | null> {
50
+ return context.provider.storages.expectations.match(context.snapshot);
51
+ }
52
+
53
+ /** Prepares context right after expectation was manipulated */
54
+ public async prepare(context: TRequestContext): Promise<unknown> {
55
+ return context;
56
+ }
57
+
58
+ /** Uses to handle whole request */
59
+ public async exec(context: TRequestContext, options?: IExecutorExecOptions): Promise<TRequestContext> {
60
+ const expectation = options?.expectation ? options.expectation : await this.match(context).catch((error) => {
61
+ logger.error('Got error while execution [matchExpectation] method', error?.stack ?? error);
62
+ return null;
63
+ });
64
+
65
+ if (!expectation) {
66
+ if (!context.outgoing) {
67
+ context.provider.storages.history.unregister(context.history);
68
+ return context;
69
+ }
70
+
71
+ if (context.history?.hasStatus('registered')) {
72
+ context.history.switchStatus('pending');
73
+ }
74
+
75
+ return context;
76
+ }
77
+
78
+ context.assign({
79
+ snapshot: expectation.request.manipulate(context.snapshot),
80
+ expectation: expectation.increaseExecutionsCounter(),
81
+ });
82
+
83
+ await this
84
+ .prepare(context)
85
+ .catch((error) => logger.error('Got error while execution [prepare] method', error?.stack ?? error));
86
+
87
+ context.provider.server.exchanges.io.publish('expectation:updated', expectation.toPlain());
88
+ logger.info('Expectation has matched as', `"${expectation.name}" [${expectation.id}]`);
89
+
90
+ if (context.history?.hasStatus('registered')) {
91
+ context.history
92
+ .switchStatus('pending')
93
+ .actualizeSnapshot(context.snapshot)
94
+ .assign({ expectation: context.expectation });
95
+
96
+ context.provider.server.exchanges.io.publish('history:added', context.history.toPlain());
97
+ context.provider.server.services.metrics.register('rate', { count: 1 });
98
+ }
99
+
100
+ if (!context.hasStatuses(['handling'])) {
101
+ return context;
102
+ }
103
+
104
+ if (context.snapshot.incoming.delay) {
105
+ logger.info(`Has delayed over [${context.snapshot.incoming.delay}ms]`);
106
+ await wait(context.snapshot.incoming.delay);
107
+ }
108
+
109
+ if (context.snapshot.incoming.error) {
110
+ logger.info(`Has destroyed using [${context.snapshot.incoming.error}]`);
111
+
112
+ context.snapshot.assign({ error: { code: context.snapshot.incoming.error, isManual: true } });
113
+ throw ExecutorManualError.build(context.snapshot.incoming.error);
114
+ }
115
+
116
+ if (expectation.forward) {
117
+ const forwarded = await this.handleForwarding(context).catch((error) => {
118
+ logger.error('Got error while execution [handleForwarding] method', error?.stack ?? error);
119
+ return null;
120
+ });
121
+
122
+ if (forwarded) {
123
+ context.snapshot.assign({
124
+ outgoing: forwarded.outgoing ?? context.snapshot.outgoing,
125
+
126
+ forwarded: {
127
+ isCached: forwarded.isCached,
128
+ messages: clone(forwarded.messages),
129
+
130
+ incoming: Object.assign(
131
+ clone(_.omit(forwarded.incoming, ['stream'])),
132
+ _.pick(forwarded.incoming, ['stream'])
133
+ ),
134
+
135
+ ...(forwarded.outgoing && {
136
+ outgoing: Object.assign(
137
+ clone(_.omit(forwarded.outgoing, ['stream'])),
138
+ _.pick(forwarded.outgoing, ['stream'])
139
+ ),
140
+ }),
141
+ }
142
+ });
143
+ }
144
+
145
+ if (context.snapshot.forwarded && context.history?.hasStatus('pending')) {
146
+ context.history.snapshot.assign({
147
+ cache: context.snapshot.cache,
148
+
149
+ forwarded: {
150
+ isCached: context.snapshot.forwarded.isCached,
151
+ incoming: _.omit(context.snapshot.forwarded.incoming, ['stream']),
152
+
153
+ ...(context.snapshot.forwarded.outgoing && {
154
+ outgoing: _.omit(context.snapshot.forwarded.outgoing, ['stream'])
155
+ }),
156
+ },
157
+ });
158
+
159
+ context.provider.server.exchanges.io.publish('history:updated', context.history.toPlain());
160
+ }
161
+ }
162
+
163
+ if (!context.hasStatuses(['handling'])) {
164
+ return context;
165
+ }
166
+
167
+ const outgoing = await this.handleReplying(context).catch((error) => {
168
+ logger.error('Got error while execution [handleReplying] method', error?.stack ?? error);
169
+ return null;
170
+ });
171
+
172
+ return outgoing ? context.assign({ outgoing }) : context;
173
+ }
174
+
175
+ private async handleForwarding(context: TRequestContext): Promise<IRequestContextForwarded | null> {
176
+ if (!context.expectation?.forward) {
177
+ return context.snapshot;
178
+ }
179
+
180
+ const snapshot = context.snapshot.assign({ cache: context.compileCacheConfiguration() });
181
+
182
+ if (snapshot.cache.isEnabled) {
183
+ const cached = await context.provider.server.databases.redis!.get(snapshot.cache.key).catch((error) => {
184
+ logger.error('Got error while redis get', error?.stack ?? error);
185
+ return null;
186
+ });
187
+
188
+ const unziped = cached
189
+ ? await ungzip(Buffer.from(cached, 'base64')).catch((error) => {
190
+ logger.error('Got error while cache unzip', error?.stack ?? error);
191
+ return null;
192
+ })
193
+ : null;
194
+
195
+ const parsed = <IRequestContextCache | null>(unziped ? parsePayload('json', unziped) : null);
196
+ const dataRaw = parsed?.outgoing.dataRaw ? Buffer.from(parsed?.outgoing.dataRaw, 'base64') : undefined;
197
+
198
+ if (parsed) {
199
+ logger.info(`Got cache [${snapshot.cache.key}]`);
200
+
201
+ if (parsed.messages?.length) {
202
+ parsed.outgoing.stream = from(parsed.messages.map((message) => message.data) ?? []);
203
+ }
204
+
205
+ return Object.assign(snapshot.pick(['incoming']), {
206
+ isCached: true,
207
+ messages: parsed.messages,
208
+
209
+ outgoing: Object.assign(_.omit(parsed.outgoing, ['dataRaw']), {
210
+ data: dataRaw ? parsePayload(parsed.outgoing.type, dataRaw) : undefined,
211
+ dataRaw,
212
+ }),
213
+ });
214
+ }
215
+ }
216
+
217
+ const type = extractPayloadType(snapshot.incoming.headers) ?? 'plain';
218
+ const dataRaw = snapshot.incoming.data === undefined
219
+ ? snapshot.incoming.dataRaw
220
+ : typeof snapshot.incoming.data === 'object'
221
+ ? serializePayload(type, snapshot.incoming.data)
222
+ : Buffer.from(String(snapshot.incoming.data));
223
+
224
+ const forwarded = await this
225
+ .forward(context, Object.assign(snapshot.incoming, { type, dataRaw }), context.expectation.forward)
226
+ .catch((error) => {
227
+ logger.error('Got error while execution [forward] method', error?.stack ?? error);
228
+ return null;
229
+ });
230
+
231
+ if (forwarded) {
232
+ forwarded.messages = [];
233
+ forwarded.outgoing?.stream?.subscribe({
234
+ error: () => null,
235
+ next: (data) => forwarded.messages!.push({ data, location: 'outgoing' }),
236
+ });
237
+ }
238
+
239
+ return forwarded;
240
+ }
241
+
242
+ private async handleReplying(context: TRequestContext): Promise<IRequestContextOutgoing | null> {
243
+ const snapshot = context.expectation?.response
244
+ ? context.expectation.response.manipulate(context.snapshot)
245
+ : context.snapshot;
246
+
247
+ const type = extractPayloadType(snapshot.outgoing.headers) ?? snapshot.outgoing.type;
248
+ const dataRaw = snapshot.outgoing.data === undefined
249
+ ? snapshot.outgoing.dataRaw
250
+ : typeof snapshot.outgoing.data === 'object'
251
+ ? serializePayload(type, snapshot.outgoing.data)
252
+ : Buffer.from(String(snapshot.outgoing.data));
253
+
254
+ const outgoing = await this
255
+ .reply(context, Object.assign(snapshot.outgoing, { type, dataRaw }))
256
+ .catch((error) => {
257
+ logger.error('Got error while execution [reply] method', error?.stack ?? error);
258
+ return null;
259
+ });
260
+
261
+ const shouldBeCached = snapshot.cache.isEnabled
262
+ && snapshot.forwarded?.outgoing
263
+ && !snapshot.forwarded.isCached
264
+ && snapshot.cache.ttl
265
+ && typeof snapshot.cache.key === 'string';
266
+
267
+ if (shouldBeCached) {
268
+ const serialized = serializePayload('json', cast<IRequestContextCache>({
269
+ messages: snapshot.forwarded!.messages?.filter((message) => message.location === 'outgoing'),
270
+ outgoing: Object.assign(_.omit(snapshot.forwarded!.outgoing, ['data']), {
271
+ dataRaw: snapshot.forwarded!.outgoing?.dataRaw?.toString('base64'),
272
+ }),
273
+ }));
274
+
275
+ if (!serialized) {
276
+ return outgoing;
277
+ }
278
+
279
+ const zipped = await gzip(serialized).catch((error) => {
280
+ logger.error('Got error while zip payload', error?.stack ?? error);
281
+ return null;
282
+ });
283
+
284
+ if (zipped) {
285
+ await context.provider.server.databases.redis!.setex(
286
+ <string>snapshot.cache.key,
287
+ snapshot.cache.ttl!,
288
+ zipped.toString('base64')
289
+ )
290
+ .then(() => logger.info(`Wrote cache [${snapshot.cache.key}] for [${snapshot.cache.ttl}] seconds`))
291
+ .catch((error) => logger.error('Got error while redis set', error?.stack ?? error));
292
+ }
293
+ }
294
+
295
+ return outgoing;
296
+ }
297
+ }
@@ -0,0 +1,2 @@
1
+ export * from './storage';
2
+ export * from './model';
@@ -0,0 +1,35 @@
1
+ import { History } from './model';
2
+
3
+ // Test generated using Keploy
4
+ test('test_pushMessage_withValidData_messageAddedToSnapshot', () => {
5
+ const history = new History({ group: 'testGroup', snapshot: <any>{ messages: [] } });
6
+ const location = 'testLocation';
7
+ const data = { key: 'value' };
8
+
9
+ history.pushMessage(<any>location, data);
10
+
11
+ expect(history.snapshot.messages.length).toBe(1);
12
+ expect(history.snapshot.messages[0]).toEqual(
13
+ expect.objectContaining({
14
+ location: location,
15
+ data: data
16
+ })
17
+ );
18
+ });
19
+
20
+ // Test generated using Keploy
21
+ test('test_switchStatus_updatesStatus', () => {
22
+ const history = new History({ group: 'testGroup', snapshot: <any>{ messages: [] } });
23
+ history.switchStatus('completed');
24
+ expect(history.hasStatus('completed')).toBe(true);
25
+ });
26
+
27
+ // Test generated using Keploy
28
+ test('test_complete_marksStatusCompletedAndClonesContainer', () => {
29
+ const mockContainer = { clone: jest.fn() };
30
+ const history = new History({ group: 'testGroup', snapshot: <any>{ messages: [], container: mockContainer } });
31
+ history.complete();
32
+ expect(history.hasStatus('completed')).toBe(true);
33
+ expect(mockContainer.clone).toHaveBeenCalled();
34
+ });
35
+
@@ -0,0 +1,82 @@
1
+ import { v4 as genUid } from 'uuid';
2
+
3
+ import type { IRequestContextMessage, RequestContextSnapshot } from '../../models';
4
+ import type { SetRequiredKeys } from '../../../../types';
5
+ import type { Expectation } from '../../../expectations';
6
+
7
+ import { buildCounter, cast } from '../../../utils';
8
+
9
+ export class History {
10
+ public TPlain!: Pick<History, 'id' | 'status' | 'group' | 'timestamp' | 'duration'> & {
11
+ snapshot: RequestContextSnapshot['TPlain'];
12
+ expectation?: Expectation<any>['TPlain'];
13
+ };
14
+
15
+ public id: string = genUid();
16
+ public messagesCounter = buildCounter();
17
+
18
+ public group: string = this.configuration.group;
19
+ public snapshot: SetRequiredKeys<RequestContextSnapshot, 'messages'> = this.configuration.snapshot;
20
+
21
+ public status = cast<'unregistered' | 'registered' | 'pending' | 'completed'>('unregistered');
22
+ public expectation?: Expectation<any>;
23
+
24
+ public timestamp: number = this.configuration.timestamp ?? Date.now();
25
+ public duration: number = 0;
26
+
27
+ constructor(private configuration: Pick<History, 'group' | 'snapshot'> & Partial<Pick<History, 'timestamp'>>) {}
28
+
29
+ public pushMessage(location: IRequestContextMessage['location'], data: unknown): this {
30
+ this.snapshot.messages.push({ location, data, id: this.messagesCounter(), timestamp: Date.now() });
31
+ return this.mark();
32
+ }
33
+
34
+ public actualizeSnapshot(snapshot: RequestContextSnapshot): this {
35
+ this.snapshot.assign(snapshot.omit(['incoming', 'forwarded', 'messages']));
36
+ return this.mark();
37
+ }
38
+
39
+ public switchStatus(status: History['status']): this {
40
+ return Object.assign(this.mark(), { status });
41
+ }
42
+
43
+ public hasStatus(status: History['status']): boolean {
44
+ return this.status === status;
45
+ }
46
+
47
+ public complete(): this {
48
+ if (this.snapshot.container) {
49
+ this.snapshot.container = this.snapshot.container.clone();
50
+ }
51
+
52
+ return this.switchStatus('completed');
53
+ }
54
+
55
+ public assign<T extends Partial<Pick<History, 'expectation'>>>(payload: T) {
56
+ return Object.assign(this.mark(), payload);
57
+ }
58
+
59
+ /** Updates duration property base on timestamp */
60
+ public mark() {
61
+ return this.hasStatus('completed') ? this : Object.assign(this, { duration: Date.now() - this.timestamp });
62
+ }
63
+
64
+ public toPlain(): History['TPlain'] {
65
+ return {
66
+ id: this.id,
67
+
68
+ timestamp: this.timestamp,
69
+ duration: this.duration,
70
+
71
+ group: this.group,
72
+ status: this.status,
73
+
74
+ snapshot: this.snapshot.toPlain(),
75
+ expectation: this.expectation?.toPlain(),
76
+ };
77
+ }
78
+
79
+ static build(configuration: History['configuration']) {
80
+ return new History(configuration);
81
+ }
82
+ }
@@ -0,0 +1,41 @@
1
+ import { HistoryStorage } from './storage';
2
+ import { History } from './model';
3
+ import config from '../../../config';
4
+
5
+ // Test generated using Keploy
6
+ test('test_registerHistory_withoutExistingHistory_createsValidHistory', () => {
7
+ const storage = new HistoryStorage({ group: 'test-group' });
8
+ const historyData = { snapshot: {} };
9
+ const result = storage.register(<any>historyData);
10
+ expect(result).toBeInstanceOf(History);
11
+ expect(result.group).toBe('test-group');
12
+ expect(result.snapshot).toEqual(historyData.snapshot);
13
+ });
14
+
15
+ // Test generated using Keploy
16
+ test('test_unregisterHistory_removesHistoryFromStorage', () => {
17
+ const storage = new HistoryStorage({ group: 'test-group' });
18
+ const historyInstance = new History(<any>{ id: '1', snapshot: {} });
19
+ storage.register(historyInstance);
20
+ expect(storage.size).toBe(1);
21
+ storage.unregister(historyInstance);
22
+ expect(storage.size).toBe(0);
23
+ });
24
+
25
+ // Test generated using Keploy
26
+ test('test_registerHistory_exceedsLimit_removesOldestEntry', () => {
27
+ const mockConfig = { get: () => ({ limit: 2 }) };
28
+ jest.spyOn(config, 'get').mockImplementation(<any>mockConfig.get);
29
+
30
+ const storage = new HistoryStorage({ group: 'test-group' });
31
+ const history1 = new History(<any>{ id: '1', snapshot: {} });
32
+ const history2 = new History(<any>{ id: '2', snapshot: {} });
33
+ const history3 = new History(<any>{ id: '3', snapshot: {} });
34
+
35
+ storage.register(history1);
36
+ storage.register(history2);
37
+ expect(storage.size).toBe(2);
38
+ storage.register(history3);
39
+ expect(storage.size).toBe(2);
40
+ expect(storage.has('1')).toBe(false); // oldest entry should be removed
41
+ });
@@ -0,0 +1,38 @@
1
+ import { History } from './model';
2
+ import config from '../../../config';
3
+
4
+ export class HistoryStorage extends Map<string, History> {
5
+ private stack: string[] = [];
6
+
7
+ constructor(private configuration: Pick<History, 'group'>) {
8
+ super();
9
+ }
10
+
11
+ public register(predicate: History | Omit<History['configuration'], 'group'>): History {
12
+ const history = predicate instanceof History ? predicate : History.build({
13
+ group: this.configuration.group,
14
+ snapshot: predicate.snapshot,
15
+ });
16
+
17
+ this.set(history.id, history);
18
+
19
+ if (this.stack.push(history.id) > config.get('history').limit) {
20
+ this.delete(this.stack.shift()!);
21
+ }
22
+
23
+ return history.switchStatus('registered');
24
+ }
25
+
26
+ public unregister(history?: History): this {
27
+ if (history) {
28
+ this.delete(history.switchStatus('unregistered').id);
29
+ }
30
+
31
+ return this;
32
+ }
33
+
34
+ clear(): void {
35
+ this.stack = [];
36
+ super.clear();
37
+ }
38
+ }
@@ -0,0 +1,11 @@
1
+ export * from './containers';
2
+ export * from './transports';
3
+ export * from './providers';
4
+ export * from './exchanges';
5
+ export * from './executor';
6
+ export * from './endpoint';
7
+ export * from './service';
8
+ export * from './history';
9
+ export * from './context';
10
+ export * from './router';
11
+ export * from './reply';
@@ -0,0 +1,2 @@
1
+ export * from './storage';
2
+ export * from './model';
@@ -0,0 +1,11 @@
1
+ import { Provider } from './model';
2
+
3
+ // Test generated using Keploy
4
+ describe('Provider', () => {
5
+ it('should assign the server correctly', () => {
6
+ const provider = Provider.build({ group: 'test-group' });
7
+ const mockServer = {}; // Mock server object
8
+ provider.assign({ server: <any>mockServer });
9
+ expect(provider.server).toBe(mockServer);
10
+ });
11
+ });
@@ -0,0 +1,33 @@
1
+ import type { MockServer } from '../../index';
2
+
3
+ import { IServerContext, TDefaultServerContext } from '../../types';
4
+ import { ExpectationsStorage } from '../../../expectations';
5
+ import { ContainersStorage } from '../containers';
6
+ import { HistoryStorage } from '../history';
7
+ import { OnsiteClient } from '../../../client';
8
+
9
+ export class Provider<TContext extends IServerContext<any> = TDefaultServerContext> {
10
+ public TContext!: TContext;
11
+ public server!: MockServer;
12
+
13
+ public client = OnsiteClient.build<TContext>(this);
14
+ public group: string = this.provided.group;
15
+
16
+ public storages = {
17
+ expectations: new ExpectationsStorage(),
18
+ containers: new ContainersStorage(),
19
+ history: new HistoryStorage(this.provided),
20
+ };
21
+
22
+ constructor(private provided: Pick<Provider, 'group'>) {}
23
+
24
+ public assign(payload: Partial<Pick<Provider, 'server'>>): this {
25
+ return Object.assign(this, payload);
26
+ }
27
+
28
+ static build<TContext extends IServerContext<any> = TDefaultServerContext>(
29
+ provided: Provider['provided']
30
+ ): Provider<TContext> {
31
+ return new Provider<TContext>(provided);
32
+ }
33
+ }
@@ -0,0 +1,21 @@
1
+ import { ProvidersStorage } from './storage';
2
+ import { MockServer } from '../../index';
3
+ import { Provider } from './model';
4
+
5
+ // Test generated using Keploy
6
+ test('extract returns all providers including default', () => {
7
+ const mockServer = <MockServer<any, any>>{};
8
+ const storage = new ProvidersStorage(mockServer);
9
+ const provider1 = Provider.build({ group: 'group1' });
10
+ const provider2 = Provider.build({ group: 'group2' });
11
+
12
+ storage.register(provider1);
13
+ storage.register(provider2);
14
+
15
+ const result = storage.extract();
16
+
17
+ expect(result).toHaveLength(3); // Two registered + one default
18
+ expect(result).toContainEqual(provider1);
19
+ expect(result).toContainEqual(provider2);
20
+ expect(result).toContainEqual(storage.default);
21
+ });
@@ -0,0 +1,34 @@
1
+ import type { IServerContext } from '../../types';
2
+ import type { MockServer } from '../../index';
3
+
4
+ import { Provider } from './model';
5
+ import { Logger } from '../../../logger';
6
+
7
+ const logger = Logger.build('Server.Models.ProvidersStorage');
8
+
9
+ export class ProvidersStorage<TContext extends IServerContext<any>> extends Map<string, Provider<TContext>> {
10
+ public default = Provider.build<TContext>({ group: 'default' });
11
+
12
+ constructor(private server: MockServer<any, TContext>) {
13
+ super();
14
+ }
15
+
16
+ public extract(): Provider[] {
17
+ return [...this.values(), this.default];
18
+ }
19
+
20
+ public register(provider: Provider<TContext>): this {
21
+ provider.assign({ server: this.server });
22
+
23
+ if (this.default === provider) {
24
+ return this;
25
+ }
26
+ if (this.has(provider.group)) {
27
+ logger.info(`Provider group [${provider.group}] is already registered. Using existent...`);
28
+ return this;
29
+ }
30
+
31
+ logger.info(`Provider group [${provider.group}] has registered`);
32
+ return this.set(provider.group, provider);
33
+ }
34
+ }
@@ -0,0 +1,17 @@
1
+ import { RequestContext } from './context';
2
+ import { Reply } from './reply';
3
+
4
+ // Test generated using Keploy
5
+ test('test_okMethod_shouldReturnStructuredResponse', () => {
6
+ const mockContext = {} as RequestContext;
7
+ const reply = new class extends Reply<typeof mockContext> {
8
+ ok = (payload: unknown) => ({ status: 200, data: payload });
9
+ notFound = () => ({ status: 404 });
10
+ internalError = (message?: string) => ({ status: 500, message });
11
+ validationError = (reasons?: unknown[]) => ({ status: 400, errors: reasons });
12
+ }(mockContext);
13
+
14
+ const response = reply.ok({ message: 'success' });
15
+ expect(response).toEqual({ status: 200, data: { message: 'success' } });
16
+ expect(typeof response).toBe('object');
17
+ });
@@ -0,0 +1,10 @@
1
+ import type { RequestContext } from './context';
2
+
3
+ export abstract class Reply<TContext extends RequestContext, TOutgoing = unknown> {
4
+ constructor(public context: TContext) {}
5
+
6
+ public abstract ok(payload: TOutgoing): unknown;
7
+ public abstract notFound(): unknown;
8
+ public abstract internalError(message?: string): unknown;
9
+ public abstract validationError(reasons?: unknown[]): unknown;
10
+ }