@sealcode/sealgen 0.8.42 → 0.8.44

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 (268) hide show
  1. package/.eslintrc.js +1 -1
  2. package/.mocharc.js +10 -0
  3. package/.nyc_output/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +1 -0
  4. package/.nyc_output/0190dc00-d309-48d0-a5db-e9484e3c7334.json +1 -0
  5. package/.nyc_output/04bfea78-9274-4d35-b7e4-d0bf42636911.json +1 -0
  6. package/.nyc_output/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +1 -0
  7. package/.nyc_output/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +1 -0
  8. package/.nyc_output/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +1 -0
  9. package/.nyc_output/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +1 -0
  10. package/.nyc_output/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +1 -0
  11. package/.nyc_output/4573bb03-90d4-4408-ba15-b6835c618b33.json +1 -0
  12. package/.nyc_output/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +1 -0
  13. package/.nyc_output/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +1 -0
  14. package/.nyc_output/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +1 -0
  15. package/.nyc_output/6934a9dd-6431-48aa-93f1-4eeef0095773.json +1 -0
  16. package/.nyc_output/70979008-f285-481b-bb09-ca48a1376f81.json +1 -0
  17. package/.nyc_output/817c9485-a0ef-486d-8dee-906456fe77fb.json +1 -0
  18. package/.nyc_output/9f725153-f783-4948-81d3-c4cc792738bf.json +1 -0
  19. package/.nyc_output/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +1 -0
  20. package/.nyc_output/ec3011f0-8180-492e-8d85-4d92484ccb44.json +1 -0
  21. package/.nyc_output/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +1 -0
  22. package/.nyc_output/processinfo/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +1 -0
  23. package/.nyc_output/processinfo/0190dc00-d309-48d0-a5db-e9484e3c7334.json +1 -0
  24. package/.nyc_output/processinfo/04bfea78-9274-4d35-b7e4-d0bf42636911.json +1 -0
  25. package/.nyc_output/processinfo/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +1 -0
  26. package/.nyc_output/processinfo/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +1 -0
  27. package/.nyc_output/processinfo/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +1 -0
  28. package/.nyc_output/processinfo/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +1 -0
  29. package/.nyc_output/processinfo/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +1 -0
  30. package/.nyc_output/processinfo/4573bb03-90d4-4408-ba15-b6835c618b33.json +1 -0
  31. package/.nyc_output/processinfo/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +1 -0
  32. package/.nyc_output/processinfo/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +1 -0
  33. package/.nyc_output/processinfo/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +1 -0
  34. package/.nyc_output/processinfo/6934a9dd-6431-48aa-93f1-4eeef0095773.json +1 -0
  35. package/.nyc_output/processinfo/70979008-f285-481b-bb09-ca48a1376f81.json +1 -0
  36. package/.nyc_output/processinfo/817c9485-a0ef-486d-8dee-906456fe77fb.json +1 -0
  37. package/.nyc_output/processinfo/9f725153-f783-4948-81d3-c4cc792738bf.json +1 -0
  38. package/.nyc_output/processinfo/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +1 -0
  39. package/.nyc_output/processinfo/ec3011f0-8180-492e-8d85-4d92484ccb44.json +1 -0
  40. package/.nyc_output/processinfo/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +1 -0
  41. package/.nyc_output/processinfo/index.json +1 -1
  42. package/.nycrc +6 -0
  43. package/.prettierrc +20 -13
  44. package/.xunit +45 -1
  45. package/@types/add-route.d.ts +3 -1
  46. package/@types/add-route.test.d.ts +1 -0
  47. package/@types/build.d.ts +3 -1
  48. package/@types/example.test.d.ts +0 -0
  49. package/@types/forms/fields/boolean.test.d.ts +1 -0
  50. package/@types/forms/fields/email.test.d.ts +1 -0
  51. package/@types/forms/fields/enum-multiple.test.d.ts +1 -0
  52. package/@types/forms/fields/enum.test.d.ts +1 -0
  53. package/@types/forms/fields/number.test.d.ts +1 -0
  54. package/@types/forms/fields/pick-from-list.test.d.ts +1 -0
  55. package/@types/forms/fields/regexp.test.d.ts +1 -0
  56. package/@types/forms/form.test.d.ts +6 -0
  57. package/@types/forms/multiform.test.d.ts +1 -0
  58. package/@types/mount.d.ts +1 -1
  59. package/@types/page/mountable-with-fields.d.ts +1 -1
  60. package/@types/test_utils/locator_is_visible.d.ts +2 -0
  61. package/@types/utils/assert-throws.d.ts +1 -0
  62. package/@types/utils/browser-creator.d.ts +1 -0
  63. package/@types/utils/utils.d.ts +1 -0
  64. package/coverage/clover.xml +2208 -47
  65. package/coverage/lcov-report/base.css +224 -0
  66. package/coverage/lcov-report/block-navigation.js +79 -0
  67. package/coverage/lcov-report/favicon.png +0 -0
  68. package/coverage/lcov-report/index.html +231 -0
  69. package/coverage/lcov-report/prettify.css +1 -0
  70. package/coverage/lcov-report/prettify.js +2 -0
  71. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  72. package/coverage/lcov-report/sorter.js +170 -0
  73. package/coverage/lcov-report/src/add-collection.ts.html +173 -0
  74. package/coverage/lcov-report/src/add-route.test.ts.html +254 -0
  75. package/coverage/lcov-report/src/add-route.ts.html +338 -0
  76. package/coverage/lcov-report/src/build.ts.html +359 -0
  77. package/coverage/lcov-report/src/cli.ts.html +188 -0
  78. package/coverage/lcov-report/src/components/components.ts.html +86 -0
  79. package/coverage/lcov-report/src/components/index.html +141 -0
  80. package/coverage/lcov-report/src/components/tabs.ts.html +365 -0
  81. package/coverage/lcov-report/src/components/toggle-modal.ts.html +236 -0
  82. package/coverage/lcov-report/src/example.test.ts.html +89 -0
  83. package/coverage/lcov-report/src/find-scss-includes.ts.html +176 -0
  84. package/coverage/lcov-report/src/forms/controls/array.ts.html +758 -0
  85. package/coverage/lcov-report/src/forms/controls/autocomplete.ts.html +179 -0
  86. package/coverage/lcov-report/src/forms/controls/big-radio-group.ts.html +224 -0
  87. package/coverage/lcov-report/src/forms/controls/checkbox-group.ts.html +293 -0
  88. package/coverage/lcov-report/src/forms/controls/checkbox.ts.html +182 -0
  89. package/coverage/lcov-report/src/forms/controls/checkboxed-list-input.ts.html +230 -0
  90. package/coverage/lcov-report/src/forms/controls/collapsible-checkbox-group.ts.html +164 -0
  91. package/coverage/lcov-report/src/forms/controls/collapsible-field-group.ts.html +362 -0
  92. package/coverage/lcov-report/src/forms/controls/controls.ts.html +170 -0
  93. package/coverage/lcov-report/src/forms/controls/derived-frame.ts.html +353 -0
  94. package/coverage/lcov-report/src/forms/controls/derived.ts.html +404 -0
  95. package/coverage/lcov-report/src/forms/controls/dropdown.ts.html +341 -0
  96. package/coverage/lcov-report/src/forms/controls/editable-collection-subset.ts.html +371 -0
  97. package/coverage/lcov-report/src/forms/controls/field-group.ts.html +287 -0
  98. package/coverage/lcov-report/src/forms/controls/file.ts.html +221 -0
  99. package/coverage/lcov-report/src/forms/controls/form-control.ts.html +152 -0
  100. package/coverage/lcov-report/src/forms/controls/form-field-control.ts.html +146 -0
  101. package/coverage/lcov-report/src/forms/controls/form-header.ts.html +137 -0
  102. package/coverage/lcov-report/src/forms/controls/form-paragraph.ts.html +113 -0
  103. package/coverage/lcov-report/src/forms/controls/frame.ts.html +158 -0
  104. package/coverage/lcov-report/src/forms/controls/hidden-input.ts.html +146 -0
  105. package/coverage/lcov-report/src/forms/controls/html.ts.html +194 -0
  106. package/coverage/lcov-report/src/forms/controls/index.html +561 -0
  107. package/coverage/lcov-report/src/forms/controls/multiple-files.ts.html +848 -0
  108. package/coverage/lcov-report/src/forms/controls/multiple-photos.ts.html +212 -0
  109. package/coverage/lcov-report/src/forms/controls/number.ts.html +194 -0
  110. package/coverage/lcov-report/src/forms/controls/photo.ts.html +302 -0
  111. package/coverage/lcov-report/src/forms/controls/radio.ts.html +209 -0
  112. package/coverage/lcov-report/src/forms/controls/reverse-single-reference.ts.html +230 -0
  113. package/coverage/lcov-report/src/forms/controls/simple-input.ts.html +524 -0
  114. package/coverage/lcov-report/src/forms/controls/textarea.ts.html +260 -0
  115. package/coverage/lcov-report/src/forms/controls/tickable.ts.html +461 -0
  116. package/coverage/lcov-report/src/forms/fields/boolean.test.ts.html +188 -0
  117. package/coverage/lcov-report/src/forms/fields/boolean.ts.html +269 -0
  118. package/coverage/lcov-report/src/forms/fields/checkboxed-list.ts.html +278 -0
  119. package/coverage/lcov-report/src/forms/fields/collection-field.ts.html +266 -0
  120. package/coverage/lcov-report/src/forms/fields/email.test.ts.html +152 -0
  121. package/coverage/lcov-report/src/forms/fields/email.ts.html +140 -0
  122. package/coverage/lcov-report/src/forms/fields/enum-multiple.test.ts.html +173 -0
  123. package/coverage/lcov-report/src/forms/fields/enum-multiple.ts.html +266 -0
  124. package/coverage/lcov-report/src/forms/fields/enum.test.ts.html +155 -0
  125. package/coverage/lcov-report/src/forms/fields/enum.ts.html +248 -0
  126. package/coverage/lcov-report/src/forms/fields/existing-sealious-value.ts.html +146 -0
  127. package/coverage/lcov-report/src/forms/fields/field.ts.html +596 -0
  128. package/coverage/lcov-report/src/forms/fields/file.ts.html +347 -0
  129. package/coverage/lcov-report/src/forms/fields/index.html +456 -0
  130. package/coverage/lcov-report/src/forms/fields/multiple-files.ts.html +140 -0
  131. package/coverage/lcov-report/src/forms/fields/number.test.ts.html +182 -0
  132. package/coverage/lcov-report/src/forms/fields/number.ts.html +290 -0
  133. package/coverage/lcov-report/src/forms/fields/pick-from-list.test.ts.html +137 -0
  134. package/coverage/lcov-report/src/forms/fields/pick-from-list.ts.html +236 -0
  135. package/coverage/lcov-report/src/forms/fields/proxy-field.ts.html +152 -0
  136. package/coverage/lcov-report/src/forms/fields/regexp.test.ts.html +155 -0
  137. package/coverage/lcov-report/src/forms/fields/regexp.ts.html +239 -0
  138. package/coverage/lcov-report/src/forms/fields/reverse-single-reference.ts.html +140 -0
  139. package/coverage/lcov-report/src/forms/fields/simple-form-field.ts.html +170 -0
  140. package/coverage/lcov-report/src/forms/fields/structured-array.ts.html +161 -0
  141. package/coverage/lcov-report/src/forms/form.test.ts.html +1133 -0
  142. package/coverage/lcov-report/src/forms/form.ts.html +962 -0
  143. package/coverage/lcov-report/src/forms/index.html +156 -0
  144. package/coverage/lcov-report/src/forms/multiform.test.ts.html +1700 -0
  145. package/coverage/lcov-report/src/forms/multiform.ts.html +788 -0
  146. package/coverage/lcov-report/src/generate-collections.ts.html +311 -0
  147. package/coverage/lcov-report/src/generate-routes.ts.html +440 -0
  148. package/coverage/lcov-report/src/index.html +321 -0
  149. package/coverage/lcov-report/src/index.ts.html +152 -0
  150. package/coverage/lcov-report/src/make-env.ts.html +125 -0
  151. package/coverage/lcov-report/src/make-hidden-inputs.ts.html +152 -0
  152. package/coverage/lcov-report/src/mount.ts.html +335 -0
  153. package/coverage/lcov-report/src/page/access-control.ts.html +134 -0
  154. package/coverage/lcov-report/src/page/index.html +186 -0
  155. package/coverage/lcov-report/src/page/list.ts.html +800 -0
  156. package/coverage/lcov-report/src/page/mountable-with-fields.ts.html +554 -0
  157. package/coverage/lcov-report/src/page/mountable.ts.html +119 -0
  158. package/coverage/lcov-report/src/page/page.ts.html +218 -0
  159. package/coverage/lcov-report/src/page/props-parser.ts.html +194 -0
  160. package/coverage/lcov-report/src/run.ts.html +80 -0
  161. package/coverage/lcov-report/src/sanitize.ts.html +107 -0
  162. package/coverage/lcov-report/src/templates/collection.ts.html +113 -0
  163. package/coverage/lcov-report/src/templates/form.ts.html +260 -0
  164. package/coverage/lcov-report/src/templates/index.html +216 -0
  165. package/coverage/lcov-report/src/templates/list.ts.html +305 -0
  166. package/coverage/lcov-report/src/templates/multiform.ts.html +254 -0
  167. package/coverage/lcov-report/src/templates/page.ts.html +155 -0
  168. package/coverage/lcov-report/src/templates/post.ts.html +143 -0
  169. package/coverage/lcov-report/src/templates/redirect.ts.html +146 -0
  170. package/coverage/lcov-report/src/templates/route-test.ts.html +161 -0
  171. package/coverage/lcov-report/src/test_utils/index.html +111 -0
  172. package/coverage/lcov-report/src/test_utils/locator_is_visible.ts.html +131 -0
  173. package/coverage/lcov-report/src/utils/assert-throws.ts.html +134 -0
  174. package/coverage/lcov-report/src/utils/browser-creator.js.html +110 -0
  175. package/coverage/lcov-report/src/utils/escape-url-params.ts.html +122 -0
  176. package/coverage/lcov-report/src/utils/exec.ts.html +170 -0
  177. package/coverage/lcov-report/src/utils/format-external-url.ts.html +119 -0
  178. package/coverage/lcov-report/src/utils/import-path.ts.html +155 -0
  179. package/coverage/lcov-report/src/utils/index.html +366 -0
  180. package/coverage/lcov-report/src/utils/input-wrapper.ts.html +143 -0
  181. package/coverage/lcov-report/src/utils/list-collections.ts.html +128 -0
  182. package/coverage/lcov-report/src/utils/make-slug.ts.html +95 -0
  183. package/coverage/lcov-report/src/utils/natural-numbers.ts.html +95 -0
  184. package/coverage/lcov-report/src/utils/prettier.ts.html +119 -0
  185. package/coverage/lcov-report/src/utils/question.ts.html +149 -0
  186. package/coverage/lcov-report/src/utils/render-attributes.ts.html +131 -0
  187. package/coverage/lcov-report/src/utils/sleep.ts.html +89 -0
  188. package/coverage/lcov-report/src/utils/translate.ts.html +119 -0
  189. package/coverage/lcov-report/src/utils/url-with-new-params.ts.html +107 -0
  190. package/coverage/lcov-report/src/utils/utils.ts.html +122 -0
  191. package/coverage/lcov-report/src/utils/walk.ts.html +140 -0
  192. package/coverage/lcov.info +4697 -0
  193. package/lib/add-route.js +31 -19
  194. package/lib/add-route.js.map +1 -1
  195. package/lib/add-route.test.js +55 -0
  196. package/lib/add-route.test.js.map +1 -0
  197. package/lib/build.js +3 -2
  198. package/lib/build.js.map +1 -1
  199. package/lib/cli.js +1 -1
  200. package/lib/cli.js.map +1 -1
  201. package/lib/example.test.js +4 -0
  202. package/lib/example.test.js.map +1 -0
  203. package/lib/forms/fields/boolean.test.js +37 -0
  204. package/lib/forms/fields/boolean.test.js.map +1 -0
  205. package/lib/forms/fields/email.test.js +25 -0
  206. package/lib/forms/fields/email.test.js.map +1 -0
  207. package/lib/forms/fields/enum-multiple.test.js +32 -0
  208. package/lib/forms/fields/enum-multiple.test.js.map +1 -0
  209. package/lib/forms/fields/enum.test.js +26 -0
  210. package/lib/forms/fields/enum.test.js.map +1 -0
  211. package/lib/forms/fields/number.js +0 -1
  212. package/lib/forms/fields/number.js.map +1 -1
  213. package/lib/forms/fields/number.test.js +35 -0
  214. package/lib/forms/fields/number.test.js.map +1 -0
  215. package/lib/forms/fields/pick-from-list.test.js +22 -0
  216. package/lib/forms/fields/pick-from-list.test.js.map +1 -0
  217. package/lib/forms/fields/regexp.test.js +26 -0
  218. package/lib/forms/fields/regexp.test.js.map +1 -0
  219. package/lib/forms/form.test.js +275 -0
  220. package/lib/forms/form.test.js.map +1 -0
  221. package/lib/forms/multiform.js +11 -2
  222. package/lib/forms/multiform.js.map +1 -1
  223. package/lib/forms/multiform.test.js +431 -0
  224. package/lib/forms/multiform.test.js.map +1 -0
  225. package/lib/mount.js +37 -2
  226. package/lib/mount.js.map +1 -1
  227. package/lib/test_utils/locator_is_visible.js +15 -0
  228. package/lib/test_utils/locator_is_visible.js.map +1 -0
  229. package/lib/utils/assert-throws.js +24 -0
  230. package/lib/utils/assert-throws.js.map +1 -0
  231. package/lib/utils/browser-creator.js +14 -0
  232. package/lib/utils/browser-creator.js.map +1 -0
  233. package/lib/utils/exec.js.map +1 -1
  234. package/lib/utils/question.js.map +1 -1
  235. package/lib/utils/utils.js +3 -1
  236. package/lib/utils/utils.js.map +1 -1
  237. package/mocha_root_hooks.js +6 -0
  238. package/package.json +18 -9
  239. package/src/add-route.test.ts +58 -0
  240. package/src/add-route.ts +37 -27
  241. package/src/build.ts +6 -3
  242. package/src/cli.ts +2 -2
  243. package/src/forms/fields/boolean.test.ts +36 -0
  244. package/src/forms/fields/email.test.ts +24 -0
  245. package/src/forms/fields/enum-multiple.test.ts +31 -0
  246. package/src/forms/fields/enum.test.ts +25 -0
  247. package/src/forms/fields/number.test.ts +34 -0
  248. package/src/forms/fields/number.ts +0 -1
  249. package/src/forms/fields/pick-from-list.test.ts +19 -0
  250. package/src/forms/fields/regexp.test.ts +25 -0
  251. package/src/forms/form.test.ts +351 -0
  252. package/src/forms/multiform.test.ts +540 -0
  253. package/src/forms/multiform.ts +12 -2
  254. package/src/mount.ts +42 -8
  255. package/src/page/mountable-with-fields.ts +1 -1
  256. package/src/test_utils/locator_is_visible.ts +17 -0
  257. package/src/utils/assert-throws.ts +18 -0
  258. package/src/utils/browser-creator.js +10 -0
  259. package/src/utils/exec.ts +8 -2
  260. package/src/utils/question.ts +4 -1
  261. package/src/utils/utils.ts +1 -0
  262. package/tsconfig.json +2 -2
  263. package/.nyc_output/1c5dff80-7861-427a-b1bb-d0686211f098.json +0 -1
  264. package/.nyc_output/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +0 -1
  265. package/.nyc_output/processinfo/1c5dff80-7861-427a-b1bb-d0686211f098.json +0 -1
  266. package/.nyc_output/processinfo/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +0 -1
  267. package/src/tests/manual/multiform.ts +0 -112
  268. package/test.js +0 -68
@@ -0,0 +1,351 @@
1
+ import Router from "@koa/router";
2
+ import axios from "axios";
3
+ import Koa, { BaseContext } from "koa";
4
+ import { Page } from "playwright";
5
+ import { Controls, Fields, Form, FormDataValue, Mountable } from "../index";
6
+ import { mount } from "../mount";
7
+ import { locator_is_visible } from "../test_utils/locator_is_visible";
8
+ import { getBrowser } from "../utils/browser-creator";
9
+ import { assertThrowsAsync } from "../utils/utils";
10
+
11
+ const fields = {
12
+ text: new Fields.SimpleFormField(true),
13
+ };
14
+
15
+ export function form_factory(canAccessFun?: Mountable["canAccess"]): Form<typeof fields, void> {
16
+ const result = new (class extends Form<typeof fields, void> {
17
+ fields = fields;
18
+ submitButtonText = "Submit";
19
+ controls = [
20
+ new Controls.SimpleInput(fields.text, {
21
+ label: "This is a test:",
22
+ type: "password",
23
+ }),
24
+ ];
25
+
26
+ async onSubmit() {
27
+ return;
28
+ }
29
+ })();
30
+ if (canAccessFun) result.canAccess = canAccessFun;
31
+ return result;
32
+ }
33
+
34
+ describe("form test", () => {
35
+ let page: Page;
36
+
37
+ before(async () => {
38
+ const browser = await getBrowser();
39
+ const context = await browser.newContext();
40
+ page = await context.newPage();
41
+ });
42
+
43
+ describe("basic tests", async () => {
44
+ let server: ReturnType<Koa["listen"]>;
45
+
46
+ before(async () => {
47
+ const app = new Koa();
48
+ const router = new Router();
49
+
50
+ mount(router, "/", form_factory(), true);
51
+ app.use(router.routes()).use(router.allowedMethods());
52
+ server = app.listen(8080);
53
+ await page.goto("http://localhost:8080");
54
+ });
55
+
56
+ after(async () => {
57
+ server.close();
58
+ });
59
+
60
+ it("does not allow to submit an empty form when there's a required field", async () => {
61
+ await page.getByRole("button", { name: "Submit", exact: true }).click();
62
+ await assertThrowsAsync(async () => {
63
+ return page.getByText("Done").click({ timeout: 500 });
64
+ });
65
+ });
66
+
67
+ it("allows to submit a form when all required fields have a value", async () => {
68
+ await page.getByPlaceholder("password").click();
69
+ await page.getByPlaceholder("password").fill("testpasswd");
70
+ await page.getByRole("button", { name: "Submit", exact: true }).click();
71
+ await page.getByText("Done").click();
72
+ });
73
+
74
+ it("does not allow submitting an empty form by circumventing HTML-based validation", async () => {
75
+ const res_axios = await axios.post(
76
+ "http://localhost:8080",
77
+ {
78
+ text: "",
79
+ },
80
+ {
81
+ validateStatus: (status: number) => {
82
+ if (status == 422) return true;
83
+ return false;
84
+ },
85
+ }
86
+ );
87
+ if (!res_axios.data.includes("Some fields are invalid")) {
88
+ throw new Error("when sending a empty request with axios, the error didnt appear");
89
+ }
90
+ });
91
+ });
92
+
93
+ describe("canAccess tests", async () => {
94
+ let server: ReturnType<Koa["listen"]>;
95
+
96
+ afterEach(async () => {
97
+ server.close();
98
+ });
99
+
100
+ it("allows visit when configured when canAccess returns true", async () => {
101
+ const app = new Koa();
102
+ const router = new Router();
103
+
104
+ mount(
105
+ router,
106
+ "/",
107
+ form_factory(
108
+ async (ctx: Koa.Context): Promise<{ canAccess: boolean; message: string }> => {
109
+ return { canAccess: true, message: "" };
110
+ }
111
+ ),
112
+ true
113
+ );
114
+ app.use(router.routes()).use(router.allowedMethods());
115
+ server = app.listen(8080);
116
+ const response = await page.goto("http://localhost:8080");
117
+ if (response?.status() != 200) {
118
+ throw new Error(`Should return 200 status and it returns ${response?.status()}`);
119
+ }
120
+ });
121
+
122
+ describe("declines access when canAccess returns false", async () => {
123
+ const app = new Koa();
124
+ const router = new Router();
125
+
126
+ before(async () => {
127
+ mount(
128
+ router,
129
+ "/",
130
+ form_factory(
131
+ async (
132
+ ctx: Koa.Context
133
+ ): Promise<{ canAccess: boolean; message: string }> => {
134
+ return { canAccess: false, message: "" };
135
+ }
136
+ ),
137
+ true
138
+ );
139
+ app.use(router.routes()).use(router.allowedMethods());
140
+ });
141
+
142
+ beforeEach(async () => {
143
+ server = app.listen(8080);
144
+ });
145
+
146
+ it("prevents the form from rendering", async () => {
147
+ const response = await page.goto("http://localhost:8080");
148
+ if (response?.status() != 403) {
149
+ throw new Error(
150
+ `Should return 403 status and it returns ${response?.status()}`
151
+ );
152
+ }
153
+ });
154
+
155
+ it("does not allow submitting of the form through axios", async () => {
156
+ await axios.post(
157
+ "http://localhost:8080",
158
+ {
159
+ text: "sample",
160
+ },
161
+ {
162
+ validateStatus: (status: number) => {
163
+ if (status == 403) return true;
164
+ return false;
165
+ },
166
+ }
167
+ );
168
+ });
169
+ });
170
+
171
+ it("passes the context to canAccess (false case)", async () => {
172
+ const app = new Koa();
173
+ const router = new Router();
174
+
175
+ mount(
176
+ router,
177
+ "/",
178
+ form_factory(
179
+ async (ctx: Koa.Context): Promise<{ canAccess: boolean; message: string }> => {
180
+ return ctx.$context && ctx.$context.user_id
181
+ ? { canAccess: true, message: "" }
182
+ : { canAccess: false, message: "" };
183
+ }
184
+ ),
185
+ true
186
+ );
187
+ app.use(router.routes()).use(router.allowedMethods());
188
+ server = app.listen(8080);
189
+ const response = await page.goto("http://localhost:8080");
190
+ if (response?.status() != 403) {
191
+ throw new Error(`Should return 403 status and it returns ${response?.status()}`);
192
+ }
193
+ });
194
+
195
+ it("passes the context to canAccess (true case)", async () => {
196
+ const app = new Koa();
197
+ const router = new Router();
198
+
199
+ router.use(async (ctx: BaseContext, next: any) => {
200
+ ctx.$context = {
201
+ user_id: "miguel",
202
+ } as any;
203
+ await next();
204
+ });
205
+ mount(
206
+ router,
207
+ "/",
208
+ form_factory(
209
+ async (ctx: Koa.Context): Promise<{ canAccess: boolean; message: string }> => {
210
+ return ctx.$context && ctx.$context.user_id
211
+ ? { canAccess: true, message: "" }
212
+ : { canAccess: false, message: "" };
213
+ }
214
+ ),
215
+ true
216
+ );
217
+ app.use(router.routes()).use(router.allowedMethods());
218
+ server = app.listen(8080);
219
+ const response = await page.goto("http://localhost:8080");
220
+ if (response?.status() != 200) {
221
+ throw new Error(`Should return 200 status and it returns ${response?.status()}`);
222
+ }
223
+ });
224
+ });
225
+
226
+ describe("validation e2e", async () => {
227
+ describe("validation message", async () => {
228
+ let server: ReturnType<Koa["listen"]>;
229
+
230
+ before(async () => {
231
+ const app = new Koa();
232
+ const router = new Router();
233
+
234
+ mount(
235
+ router,
236
+ "/",
237
+ new (class extends Form<typeof fields, void> {
238
+ fields = fields;
239
+ submitButtonText = "Submit";
240
+ controls = [
241
+ new Controls.SimpleInput(fields.text, {
242
+ label: "This is a test:",
243
+ type: "password",
244
+ }),
245
+ ];
246
+
247
+ async onSubmit() {
248
+ return;
249
+ }
250
+
251
+ async validateValues(
252
+ ctx: Koa.Context,
253
+ data: Record<string, FormDataValue>
254
+ ): Promise<{ valid: boolean; error: string }> {
255
+ if (data.text === "incorrect")
256
+ return {
257
+ valid: false,
258
+ error: "Incorrect input",
259
+ };
260
+ return { valid: true, error: "" };
261
+ }
262
+ })(),
263
+ true
264
+ );
265
+
266
+ app.use(router.routes()).use(router.allowedMethods());
267
+ server = app.listen(8080);
268
+ await page.goto("http://localhost:8080");
269
+ });
270
+
271
+ after(async () => {
272
+ server.close();
273
+ });
274
+
275
+ it("shows up when incorrect input is given", async () => {
276
+ await page.getByPlaceholder("password").click();
277
+ await page.getByPlaceholder("password").fill("incorrect");
278
+ await page.getByRole("button", { name: "Submit" }).click();
279
+ if (!(await locator_is_visible(page.getByText("Incorrect input"))))
280
+ throw new Error("validation message doens't show up when input is incorrect");
281
+ });
282
+
283
+ it("doesn't show when correct input is given", async () => {
284
+ await page.getByPlaceholder("password").click();
285
+ await page.getByPlaceholder("password").fill("correct");
286
+ await page.getByRole("button", { name: "Submit" }).click();
287
+ await assertThrowsAsync(async () => {
288
+ return page.getByText("Incorrect input").click({ timeout: 500 });
289
+ });
290
+ });
291
+ });
292
+
293
+ describe("field specific validation message", async () => {
294
+ let server: ReturnType<Koa["listen"]>;
295
+
296
+ before(async () => {
297
+ const app = new Koa();
298
+ const router = new Router();
299
+ const fields = {
300
+ text: new Fields.EmailField(true),
301
+ };
302
+
303
+ mount(
304
+ router,
305
+ "/",
306
+ new (class extends Form<typeof fields, void> {
307
+ fields = fields;
308
+ submitButtonText = "Submit";
309
+ controls = [
310
+ new Controls.SimpleInput(fields.text, {
311
+ label: "This is a test:",
312
+ type: "text",
313
+ }),
314
+ ];
315
+
316
+ async onSubmit() {
317
+ return;
318
+ }
319
+ })(),
320
+ true
321
+ );
322
+
323
+ app.use(router.routes()).use(router.allowedMethods());
324
+ server = app.listen(8080);
325
+ await page.goto("http://localhost:8080");
326
+ });
327
+
328
+ after(async () => {
329
+ server.close();
330
+ });
331
+
332
+ it("shows up when incorrect input is given", async () => {
333
+ await page.getByPlaceholder("text").click();
334
+ await page.getByPlaceholder("text").fill("notanemail");
335
+ await page.getByRole("button", { name: "Submit" }).click();
336
+ await page.getByText("Please enter a proper email address").click();
337
+ });
338
+
339
+ it("doesn't show up when correct input is given", async () => {
340
+ await page.getByPlaceholder("text").click();
341
+ await page.getByPlaceholder("text").fill("yes@an.email");
342
+ await page.getByRole("button", { name: "Submit" }).click();
343
+ assertThrowsAsync(async () => {
344
+ return page
345
+ .getByText("Please enter a proper email address")
346
+ .click({ timeout: 500 });
347
+ });
348
+ });
349
+ });
350
+ });
351
+ });