@sealcode/sealgen 0.8.43 → 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.
- package/.eslintrc.js +1 -1
- package/.mocharc.js +10 -0
- package/.nyc_output/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +1 -0
- package/.nyc_output/0190dc00-d309-48d0-a5db-e9484e3c7334.json +1 -0
- package/.nyc_output/04bfea78-9274-4d35-b7e4-d0bf42636911.json +1 -0
- package/.nyc_output/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +1 -0
- package/.nyc_output/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +1 -0
- package/.nyc_output/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +1 -0
- package/.nyc_output/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +1 -0
- package/.nyc_output/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +1 -0
- package/.nyc_output/4573bb03-90d4-4408-ba15-b6835c618b33.json +1 -0
- package/.nyc_output/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +1 -0
- package/.nyc_output/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +1 -0
- package/.nyc_output/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +1 -0
- package/.nyc_output/6934a9dd-6431-48aa-93f1-4eeef0095773.json +1 -0
- package/.nyc_output/70979008-f285-481b-bb09-ca48a1376f81.json +1 -0
- package/.nyc_output/817c9485-a0ef-486d-8dee-906456fe77fb.json +1 -0
- package/.nyc_output/9f725153-f783-4948-81d3-c4cc792738bf.json +1 -0
- package/.nyc_output/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +1 -0
- package/.nyc_output/ec3011f0-8180-492e-8d85-4d92484ccb44.json +1 -0
- package/.nyc_output/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +1 -0
- package/.nyc_output/processinfo/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +1 -0
- package/.nyc_output/processinfo/0190dc00-d309-48d0-a5db-e9484e3c7334.json +1 -0
- package/.nyc_output/processinfo/04bfea78-9274-4d35-b7e4-d0bf42636911.json +1 -0
- package/.nyc_output/processinfo/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +1 -0
- package/.nyc_output/processinfo/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +1 -0
- package/.nyc_output/processinfo/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +1 -0
- package/.nyc_output/processinfo/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +1 -0
- package/.nyc_output/processinfo/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +1 -0
- package/.nyc_output/processinfo/4573bb03-90d4-4408-ba15-b6835c618b33.json +1 -0
- package/.nyc_output/processinfo/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +1 -0
- package/.nyc_output/processinfo/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +1 -0
- package/.nyc_output/processinfo/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +1 -0
- package/.nyc_output/processinfo/6934a9dd-6431-48aa-93f1-4eeef0095773.json +1 -0
- package/.nyc_output/processinfo/70979008-f285-481b-bb09-ca48a1376f81.json +1 -0
- package/.nyc_output/processinfo/817c9485-a0ef-486d-8dee-906456fe77fb.json +1 -0
- package/.nyc_output/processinfo/9f725153-f783-4948-81d3-c4cc792738bf.json +1 -0
- package/.nyc_output/processinfo/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +1 -0
- package/.nyc_output/processinfo/ec3011f0-8180-492e-8d85-4d92484ccb44.json +1 -0
- package/.nyc_output/processinfo/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -1
- package/.nycrc +6 -0
- package/.prettierrc +20 -13
- package/.xunit +45 -1
- package/@types/add-route.d.ts +3 -1
- package/@types/add-route.test.d.ts +1 -0
- package/@types/build.d.ts +3 -1
- package/@types/example.test.d.ts +0 -0
- package/@types/forms/fields/boolean.test.d.ts +1 -0
- package/@types/forms/fields/email.test.d.ts +1 -0
- package/@types/forms/fields/enum-multiple.test.d.ts +1 -0
- package/@types/forms/fields/enum.test.d.ts +1 -0
- package/@types/forms/fields/number.test.d.ts +1 -0
- package/@types/forms/fields/pick-from-list.test.d.ts +1 -0
- package/@types/forms/fields/regexp.test.d.ts +1 -0
- package/@types/forms/form.test.d.ts +6 -0
- package/@types/forms/multiform.test.d.ts +1 -0
- package/@types/mount.d.ts +1 -1
- package/@types/page/mountable-with-fields.d.ts +1 -1
- package/@types/test_utils/locator_is_visible.d.ts +2 -0
- package/@types/utils/assert-throws.d.ts +1 -0
- package/@types/utils/browser-creator.d.ts +1 -0
- package/@types/utils/utils.d.ts +1 -0
- package/coverage/clover.xml +2208 -47
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +79 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +231 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +170 -0
- package/coverage/lcov-report/src/add-collection.ts.html +173 -0
- package/coverage/lcov-report/src/add-route.test.ts.html +254 -0
- package/coverage/lcov-report/src/add-route.ts.html +338 -0
- package/coverage/lcov-report/src/build.ts.html +359 -0
- package/coverage/lcov-report/src/cli.ts.html +188 -0
- package/coverage/lcov-report/src/components/components.ts.html +86 -0
- package/coverage/lcov-report/src/components/index.html +141 -0
- package/coverage/lcov-report/src/components/tabs.ts.html +365 -0
- package/coverage/lcov-report/src/components/toggle-modal.ts.html +236 -0
- package/coverage/lcov-report/src/example.test.ts.html +89 -0
- package/coverage/lcov-report/src/find-scss-includes.ts.html +176 -0
- package/coverage/lcov-report/src/forms/controls/array.ts.html +758 -0
- package/coverage/lcov-report/src/forms/controls/autocomplete.ts.html +179 -0
- package/coverage/lcov-report/src/forms/controls/big-radio-group.ts.html +224 -0
- package/coverage/lcov-report/src/forms/controls/checkbox-group.ts.html +293 -0
- package/coverage/lcov-report/src/forms/controls/checkbox.ts.html +182 -0
- package/coverage/lcov-report/src/forms/controls/checkboxed-list-input.ts.html +230 -0
- package/coverage/lcov-report/src/forms/controls/collapsible-checkbox-group.ts.html +164 -0
- package/coverage/lcov-report/src/forms/controls/collapsible-field-group.ts.html +362 -0
- package/coverage/lcov-report/src/forms/controls/controls.ts.html +170 -0
- package/coverage/lcov-report/src/forms/controls/derived-frame.ts.html +353 -0
- package/coverage/lcov-report/src/forms/controls/derived.ts.html +404 -0
- package/coverage/lcov-report/src/forms/controls/dropdown.ts.html +341 -0
- package/coverage/lcov-report/src/forms/controls/editable-collection-subset.ts.html +371 -0
- package/coverage/lcov-report/src/forms/controls/field-group.ts.html +287 -0
- package/coverage/lcov-report/src/forms/controls/file.ts.html +221 -0
- package/coverage/lcov-report/src/forms/controls/form-control.ts.html +152 -0
- package/coverage/lcov-report/src/forms/controls/form-field-control.ts.html +146 -0
- package/coverage/lcov-report/src/forms/controls/form-header.ts.html +137 -0
- package/coverage/lcov-report/src/forms/controls/form-paragraph.ts.html +113 -0
- package/coverage/lcov-report/src/forms/controls/frame.ts.html +158 -0
- package/coverage/lcov-report/src/forms/controls/hidden-input.ts.html +146 -0
- package/coverage/lcov-report/src/forms/controls/html.ts.html +194 -0
- package/coverage/lcov-report/src/forms/controls/index.html +561 -0
- package/coverage/lcov-report/src/forms/controls/multiple-files.ts.html +848 -0
- package/coverage/lcov-report/src/forms/controls/multiple-photos.ts.html +212 -0
- package/coverage/lcov-report/src/forms/controls/number.ts.html +194 -0
- package/coverage/lcov-report/src/forms/controls/photo.ts.html +302 -0
- package/coverage/lcov-report/src/forms/controls/radio.ts.html +209 -0
- package/coverage/lcov-report/src/forms/controls/reverse-single-reference.ts.html +230 -0
- package/coverage/lcov-report/src/forms/controls/simple-input.ts.html +524 -0
- package/coverage/lcov-report/src/forms/controls/textarea.ts.html +260 -0
- package/coverage/lcov-report/src/forms/controls/tickable.ts.html +461 -0
- package/coverage/lcov-report/src/forms/fields/boolean.test.ts.html +188 -0
- package/coverage/lcov-report/src/forms/fields/boolean.ts.html +269 -0
- package/coverage/lcov-report/src/forms/fields/checkboxed-list.ts.html +278 -0
- package/coverage/lcov-report/src/forms/fields/collection-field.ts.html +266 -0
- package/coverage/lcov-report/src/forms/fields/email.test.ts.html +152 -0
- package/coverage/lcov-report/src/forms/fields/email.ts.html +140 -0
- package/coverage/lcov-report/src/forms/fields/enum-multiple.test.ts.html +173 -0
- package/coverage/lcov-report/src/forms/fields/enum-multiple.ts.html +266 -0
- package/coverage/lcov-report/src/forms/fields/enum.test.ts.html +155 -0
- package/coverage/lcov-report/src/forms/fields/enum.ts.html +248 -0
- package/coverage/lcov-report/src/forms/fields/existing-sealious-value.ts.html +146 -0
- package/coverage/lcov-report/src/forms/fields/field.ts.html +596 -0
- package/coverage/lcov-report/src/forms/fields/file.ts.html +347 -0
- package/coverage/lcov-report/src/forms/fields/index.html +456 -0
- package/coverage/lcov-report/src/forms/fields/multiple-files.ts.html +140 -0
- package/coverage/lcov-report/src/forms/fields/number.test.ts.html +182 -0
- package/coverage/lcov-report/src/forms/fields/number.ts.html +290 -0
- package/coverage/lcov-report/src/forms/fields/pick-from-list.test.ts.html +137 -0
- package/coverage/lcov-report/src/forms/fields/pick-from-list.ts.html +236 -0
- package/coverage/lcov-report/src/forms/fields/proxy-field.ts.html +152 -0
- package/coverage/lcov-report/src/forms/fields/regexp.test.ts.html +155 -0
- package/coverage/lcov-report/src/forms/fields/regexp.ts.html +239 -0
- package/coverage/lcov-report/src/forms/fields/reverse-single-reference.ts.html +140 -0
- package/coverage/lcov-report/src/forms/fields/simple-form-field.ts.html +170 -0
- package/coverage/lcov-report/src/forms/fields/structured-array.ts.html +161 -0
- package/coverage/lcov-report/src/forms/form.test.ts.html +1133 -0
- package/coverage/lcov-report/src/forms/form.ts.html +962 -0
- package/coverage/lcov-report/src/forms/index.html +156 -0
- package/coverage/lcov-report/src/forms/multiform.test.ts.html +1700 -0
- package/coverage/lcov-report/src/forms/multiform.ts.html +788 -0
- package/coverage/lcov-report/src/generate-collections.ts.html +311 -0
- package/coverage/lcov-report/src/generate-routes.ts.html +440 -0
- package/coverage/lcov-report/src/index.html +321 -0
- package/coverage/lcov-report/src/index.ts.html +152 -0
- package/coverage/lcov-report/src/make-env.ts.html +125 -0
- package/coverage/lcov-report/src/make-hidden-inputs.ts.html +152 -0
- package/coverage/lcov-report/src/mount.ts.html +335 -0
- package/coverage/lcov-report/src/page/access-control.ts.html +134 -0
- package/coverage/lcov-report/src/page/index.html +186 -0
- package/coverage/lcov-report/src/page/list.ts.html +800 -0
- package/coverage/lcov-report/src/page/mountable-with-fields.ts.html +554 -0
- package/coverage/lcov-report/src/page/mountable.ts.html +119 -0
- package/coverage/lcov-report/src/page/page.ts.html +218 -0
- package/coverage/lcov-report/src/page/props-parser.ts.html +194 -0
- package/coverage/lcov-report/src/run.ts.html +80 -0
- package/coverage/lcov-report/src/sanitize.ts.html +107 -0
- package/coverage/lcov-report/src/templates/collection.ts.html +113 -0
- package/coverage/lcov-report/src/templates/form.ts.html +260 -0
- package/coverage/lcov-report/src/templates/index.html +216 -0
- package/coverage/lcov-report/src/templates/list.ts.html +305 -0
- package/coverage/lcov-report/src/templates/multiform.ts.html +254 -0
- package/coverage/lcov-report/src/templates/page.ts.html +155 -0
- package/coverage/lcov-report/src/templates/post.ts.html +143 -0
- package/coverage/lcov-report/src/templates/redirect.ts.html +146 -0
- package/coverage/lcov-report/src/templates/route-test.ts.html +161 -0
- package/coverage/lcov-report/src/test_utils/index.html +111 -0
- package/coverage/lcov-report/src/test_utils/locator_is_visible.ts.html +131 -0
- package/coverage/lcov-report/src/utils/assert-throws.ts.html +134 -0
- package/coverage/lcov-report/src/utils/browser-creator.js.html +110 -0
- package/coverage/lcov-report/src/utils/escape-url-params.ts.html +122 -0
- package/coverage/lcov-report/src/utils/exec.ts.html +170 -0
- package/coverage/lcov-report/src/utils/format-external-url.ts.html +119 -0
- package/coverage/lcov-report/src/utils/import-path.ts.html +155 -0
- package/coverage/lcov-report/src/utils/index.html +366 -0
- package/coverage/lcov-report/src/utils/input-wrapper.ts.html +143 -0
- package/coverage/lcov-report/src/utils/list-collections.ts.html +128 -0
- package/coverage/lcov-report/src/utils/make-slug.ts.html +95 -0
- package/coverage/lcov-report/src/utils/natural-numbers.ts.html +95 -0
- package/coverage/lcov-report/src/utils/prettier.ts.html +119 -0
- package/coverage/lcov-report/src/utils/question.ts.html +149 -0
- package/coverage/lcov-report/src/utils/render-attributes.ts.html +131 -0
- package/coverage/lcov-report/src/utils/sleep.ts.html +89 -0
- package/coverage/lcov-report/src/utils/translate.ts.html +119 -0
- package/coverage/lcov-report/src/utils/url-with-new-params.ts.html +107 -0
- package/coverage/lcov-report/src/utils/utils.ts.html +122 -0
- package/coverage/lcov-report/src/utils/walk.ts.html +140 -0
- package/coverage/lcov.info +4697 -0
- package/lib/add-route.js +3 -3
- package/lib/add-route.js.map +1 -1
- package/lib/add-route.test.js +55 -0
- package/lib/add-route.test.js.map +1 -0
- package/lib/build.js +3 -2
- package/lib/build.js.map +1 -1
- package/lib/cli.js +1 -1
- package/lib/cli.js.map +1 -1
- package/lib/example.test.js +4 -0
- package/lib/example.test.js.map +1 -0
- package/lib/forms/fields/boolean.test.js +37 -0
- package/lib/forms/fields/boolean.test.js.map +1 -0
- package/lib/forms/fields/email.test.js +25 -0
- package/lib/forms/fields/email.test.js.map +1 -0
- package/lib/forms/fields/enum-multiple.test.js +32 -0
- package/lib/forms/fields/enum-multiple.test.js.map +1 -0
- package/lib/forms/fields/enum.test.js +26 -0
- package/lib/forms/fields/enum.test.js.map +1 -0
- package/lib/forms/fields/number.js +0 -1
- package/lib/forms/fields/number.js.map +1 -1
- package/lib/forms/fields/number.test.js +35 -0
- package/lib/forms/fields/number.test.js.map +1 -0
- package/lib/forms/fields/pick-from-list.test.js +22 -0
- package/lib/forms/fields/pick-from-list.test.js.map +1 -0
- package/lib/forms/fields/regexp.test.js +26 -0
- package/lib/forms/fields/regexp.test.js.map +1 -0
- package/lib/forms/form.test.js +275 -0
- package/lib/forms/form.test.js.map +1 -0
- package/lib/forms/multiform.js +11 -2
- package/lib/forms/multiform.js.map +1 -1
- package/lib/forms/multiform.test.js +431 -0
- package/lib/forms/multiform.test.js.map +1 -0
- package/lib/mount.js +37 -2
- package/lib/mount.js.map +1 -1
- package/lib/test_utils/locator_is_visible.js +15 -0
- package/lib/test_utils/locator_is_visible.js.map +1 -0
- package/lib/utils/assert-throws.js +24 -0
- package/lib/utils/assert-throws.js.map +1 -0
- package/lib/utils/browser-creator.js +14 -0
- package/lib/utils/browser-creator.js.map +1 -0
- package/lib/utils/exec.js.map +1 -1
- package/lib/utils/question.js.map +1 -1
- package/lib/utils/utils.js +3 -1
- package/lib/utils/utils.js.map +1 -1
- package/mocha_root_hooks.js +6 -0
- package/package.json +16 -8
- package/src/add-route.test.ts +58 -0
- package/src/add-route.ts +6 -5
- package/src/build.ts +6 -3
- package/src/cli.ts +2 -2
- package/src/forms/fields/boolean.test.ts +36 -0
- package/src/forms/fields/email.test.ts +24 -0
- package/src/forms/fields/enum-multiple.test.ts +31 -0
- package/src/forms/fields/enum.test.ts +25 -0
- package/src/forms/fields/number.test.ts +34 -0
- package/src/forms/fields/number.ts +0 -1
- package/src/forms/fields/pick-from-list.test.ts +19 -0
- package/src/forms/fields/regexp.test.ts +25 -0
- package/src/forms/form.test.ts +351 -0
- package/src/forms/multiform.test.ts +540 -0
- package/src/forms/multiform.ts +12 -2
- package/src/mount.ts +42 -8
- package/src/page/mountable-with-fields.ts +1 -1
- package/src/test_utils/locator_is_visible.ts +17 -0
- package/src/utils/assert-throws.ts +18 -0
- package/src/utils/browser-creator.js +10 -0
- package/src/utils/exec.ts +8 -2
- package/src/utils/question.ts +4 -1
- package/src/utils/utils.ts +1 -0
- package/tsconfig.json +2 -2
- package/.nyc_output/1c5dff80-7861-427a-b1bb-d0686211f098.json +0 -1
- package/.nyc_output/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +0 -1
- package/.nyc_output/processinfo/1c5dff80-7861-427a-b1bb-d0686211f098.json +0 -1
- package/.nyc_output/processinfo/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +0 -1
- package/src/tests/manual/multiform.ts +0 -112
- 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
|
+
});
|