@redrockswebdevelopment/formstack-form-testing 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +177 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +231 -0
- package/dist/index.js.map +1 -0
- package/package.json +38 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
export type FormstackFieldRef = string | number;
|
|
2
|
+
export interface PlaywrightLikeLocator {
|
|
3
|
+
locator(selector: string): PlaywrightLikeLocator;
|
|
4
|
+
first(): PlaywrightLikeLocator;
|
|
5
|
+
fill(value: string): Promise<void>;
|
|
6
|
+
click(): Promise<void>;
|
|
7
|
+
check(): Promise<void>;
|
|
8
|
+
uncheck(): Promise<void>;
|
|
9
|
+
selectOption(value: string | readonly string[]): Promise<void>;
|
|
10
|
+
setInputFiles(files: string | readonly string[]): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export type PlaywrightConsoleType = "debug" | "error" | "info" | "log" | "warning" | string;
|
|
13
|
+
export interface PlaywrightConsoleMessageLike {
|
|
14
|
+
type(): PlaywrightConsoleType;
|
|
15
|
+
text(): string;
|
|
16
|
+
}
|
|
17
|
+
export interface PlaywrightRequestFailureLike {
|
|
18
|
+
readonly errorText: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PlaywrightRequestLike {
|
|
21
|
+
url(): string;
|
|
22
|
+
method(): string;
|
|
23
|
+
failure(): PlaywrightRequestFailureLike | null;
|
|
24
|
+
}
|
|
25
|
+
export interface PlaywrightResponseLike {
|
|
26
|
+
url(): string;
|
|
27
|
+
status(): number;
|
|
28
|
+
request(): PlaywrightRequestLike;
|
|
29
|
+
}
|
|
30
|
+
export interface PlaywrightLikePage {
|
|
31
|
+
goto(url: string): Promise<unknown>;
|
|
32
|
+
locator(selector: string): PlaywrightLikeLocator;
|
|
33
|
+
on(event: "console", handler: (message: PlaywrightConsoleMessageLike) => void): void;
|
|
34
|
+
on(event: "pageerror", handler: (error: Error) => void): void;
|
|
35
|
+
on(event: "requestfailed", handler: (request: PlaywrightRequestLike) => void): void;
|
|
36
|
+
on(event: "response", handler: (response: PlaywrightResponseLike) => void): void;
|
|
37
|
+
off?(event: "console", handler: (message: PlaywrightConsoleMessageLike) => void): void;
|
|
38
|
+
off?(event: "pageerror", handler: (error: Error) => void): void;
|
|
39
|
+
off?(event: "requestfailed", handler: (request: PlaywrightRequestLike) => void): void;
|
|
40
|
+
off?(event: "response", handler: (response: PlaywrightResponseLike) => void): void;
|
|
41
|
+
waitForLoadState?(state?: "domcontentloaded" | "load" | "networkidle"): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
export interface ConsoleDiagnostic {
|
|
44
|
+
readonly kind: "console";
|
|
45
|
+
readonly level: PlaywrightConsoleType;
|
|
46
|
+
readonly message: string;
|
|
47
|
+
}
|
|
48
|
+
export interface PageErrorDiagnostic {
|
|
49
|
+
readonly kind: "pageerror";
|
|
50
|
+
readonly message: string;
|
|
51
|
+
readonly stack?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface RequestFailedDiagnostic {
|
|
54
|
+
readonly kind: "requestfailed";
|
|
55
|
+
readonly method: string;
|
|
56
|
+
readonly url: string;
|
|
57
|
+
readonly errorText: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ResponseStatusDiagnostic {
|
|
60
|
+
readonly kind: "response";
|
|
61
|
+
readonly method: string;
|
|
62
|
+
readonly url: string;
|
|
63
|
+
readonly status: number;
|
|
64
|
+
}
|
|
65
|
+
export type FormBrowserDiagnostic = ConsoleDiagnostic | PageErrorDiagnostic | RequestFailedDiagnostic | ResponseStatusDiagnostic;
|
|
66
|
+
export interface FormBrowserDiagnosticsOptions {
|
|
67
|
+
readonly failOnConsoleTypes?: readonly PlaywrightConsoleType[];
|
|
68
|
+
readonly failOnStatusCodes?: readonly number[];
|
|
69
|
+
readonly failOnStatusCodeAtOrAbove?: number;
|
|
70
|
+
readonly ignoreConsoleMessages?: readonly (string | RegExp)[];
|
|
71
|
+
readonly ignoreUrls?: readonly (string | RegExp)[];
|
|
72
|
+
}
|
|
73
|
+
export interface FormBrowserDiagnosticsReport {
|
|
74
|
+
readonly diagnostics: readonly FormBrowserDiagnostic[];
|
|
75
|
+
readonly hasErrors: boolean;
|
|
76
|
+
}
|
|
77
|
+
export declare class FormBrowserDiagnosticsError extends Error {
|
|
78
|
+
readonly diagnostics: readonly FormBrowserDiagnostic[];
|
|
79
|
+
constructor(diagnostics: readonly FormBrowserDiagnostic[]);
|
|
80
|
+
}
|
|
81
|
+
export interface FormTestHarnessOptions {
|
|
82
|
+
readonly formId?: string | number;
|
|
83
|
+
}
|
|
84
|
+
export interface NameFieldValue {
|
|
85
|
+
readonly prefix?: string;
|
|
86
|
+
readonly first?: string;
|
|
87
|
+
readonly middle?: string;
|
|
88
|
+
readonly last?: string;
|
|
89
|
+
readonly suffix?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface AddressFieldValue {
|
|
92
|
+
readonly address?: string;
|
|
93
|
+
readonly address2?: string;
|
|
94
|
+
readonly city?: string;
|
|
95
|
+
readonly state?: string;
|
|
96
|
+
readonly zip?: string;
|
|
97
|
+
readonly country?: string;
|
|
98
|
+
}
|
|
99
|
+
export interface DateTimeFieldValue {
|
|
100
|
+
readonly month?: string;
|
|
101
|
+
readonly day?: string;
|
|
102
|
+
readonly year?: string;
|
|
103
|
+
readonly hour?: string;
|
|
104
|
+
readonly minutes?: string;
|
|
105
|
+
readonly seconds?: string;
|
|
106
|
+
readonly ampm?: string;
|
|
107
|
+
}
|
|
108
|
+
export interface ProductFieldValue {
|
|
109
|
+
readonly fixedAmount?: string;
|
|
110
|
+
readonly quantity?: string;
|
|
111
|
+
}
|
|
112
|
+
export interface FormTestHarness {
|
|
113
|
+
readonly page: PlaywrightLikePage;
|
|
114
|
+
readonly options: FormTestHarnessOptions;
|
|
115
|
+
form(): PlaywrightLikeLocator;
|
|
116
|
+
visiblePage(): PlaywrightLikeLocator;
|
|
117
|
+
field(internalLabel: string): PlaywrightLikeLocator;
|
|
118
|
+
fieldById(fieldId: FormstackFieldRef): PlaywrightLikeLocator;
|
|
119
|
+
fieldInput(internalLabel: string): PlaywrightLikeLocator;
|
|
120
|
+
fieldInputById(fieldId: FormstackFieldRef): PlaywrightLikeLocator;
|
|
121
|
+
fieldError(internalLabel: string): PlaywrightLikeLocator;
|
|
122
|
+
fillText(internalLabel: string, value: string): Promise<void>;
|
|
123
|
+
fillTextById(fieldId: FormstackFieldRef, value: string): Promise<void>;
|
|
124
|
+
fillTextarea(internalLabel: string, value: string): Promise<void>;
|
|
125
|
+
fillEmail(internalLabel: string, value: string): Promise<void>;
|
|
126
|
+
fillNumber(internalLabel: string, value: string | number): Promise<void>;
|
|
127
|
+
fillPhone(internalLabel: string, value: string): Promise<void>;
|
|
128
|
+
fillName(internalLabel: string, value: NameFieldValue): Promise<void>;
|
|
129
|
+
fillAddress(internalLabel: string, value: AddressFieldValue): Promise<void>;
|
|
130
|
+
fillDateTime(internalLabel: string, value: DateTimeFieldValue): Promise<void>;
|
|
131
|
+
selectOption(internalLabel: string, value: string): Promise<void>;
|
|
132
|
+
chooseRadio(internalLabel: string, value: string | number): Promise<void>;
|
|
133
|
+
setCheckbox(internalLabel: string, value: string | number, checked: boolean): Promise<void>;
|
|
134
|
+
setCheckboxes(internalLabel: string, values: readonly (string | number)[]): Promise<void>;
|
|
135
|
+
selectMatrixCell(fieldId: FormstackFieldRef, row: number, column: number): Promise<void>;
|
|
136
|
+
setRating(fieldId: FormstackFieldRef, zeroBasedIndex: number): Promise<void>;
|
|
137
|
+
uploadFile(internalLabel: string, files: string | readonly string[]): Promise<void>;
|
|
138
|
+
clearSignature(internalLabel: string): Promise<void>;
|
|
139
|
+
fillProduct(internalLabel: string, value: ProductFieldValue): Promise<void>;
|
|
140
|
+
clickNext(): Promise<void>;
|
|
141
|
+
clickPrevious(): Promise<void>;
|
|
142
|
+
submit(): Promise<void>;
|
|
143
|
+
}
|
|
144
|
+
export type FormScenarioStepRun = (harness: FormTestHarness) => Promise<void> | void;
|
|
145
|
+
export interface FormScenarioStepObject {
|
|
146
|
+
readonly name: string;
|
|
147
|
+
readonly run: FormScenarioStepRun;
|
|
148
|
+
}
|
|
149
|
+
export type FormScenarioStep = FormScenarioStepRun | FormScenarioStepObject;
|
|
150
|
+
export interface FormTestScenario {
|
|
151
|
+
readonly name: string;
|
|
152
|
+
readonly url?: string;
|
|
153
|
+
readonly steps: readonly FormScenarioStep[];
|
|
154
|
+
readonly diagnostics?: FormBrowserDiagnosticsOptions;
|
|
155
|
+
}
|
|
156
|
+
export interface RunFormScenarioOptions extends FormTestHarnessOptions {
|
|
157
|
+
readonly diagnostics?: FormBrowserDiagnosticsOptions;
|
|
158
|
+
readonly throwOnDiagnostics?: boolean;
|
|
159
|
+
readonly waitForLoadState?: "domcontentloaded" | "load" | "networkidle";
|
|
160
|
+
}
|
|
161
|
+
export interface FormScenarioStepResult {
|
|
162
|
+
readonly name: string;
|
|
163
|
+
}
|
|
164
|
+
export interface FormScenarioResult {
|
|
165
|
+
readonly name: string;
|
|
166
|
+
readonly steps: readonly FormScenarioStepResult[];
|
|
167
|
+
readonly diagnostics: FormBrowserDiagnosticsReport;
|
|
168
|
+
}
|
|
169
|
+
export declare function createFormBrowserMonitor(page: PlaywrightLikePage, options?: FormBrowserDiagnosticsOptions): {
|
|
170
|
+
readonly report: () => FormBrowserDiagnosticsReport;
|
|
171
|
+
readonly assertNoErrors: () => void;
|
|
172
|
+
readonly detach: () => void;
|
|
173
|
+
};
|
|
174
|
+
export declare function createFormTestHarness(page: PlaywrightLikePage, options?: FormTestHarnessOptions): FormTestHarness;
|
|
175
|
+
export declare function runFormScenario(page: PlaywrightLikePage, scenario: FormTestScenario, options?: RunFormScenarioOptions): Promise<FormScenarioResult>;
|
|
176
|
+
export declare function defineFormScenario<const Scenario extends FormTestScenario>(scenario: Scenario): Scenario;
|
|
177
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACjD,KAAK,IAAI,qBAAqB,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5F,MAAM,WAAW,4BAA4B;IAC3C,IAAI,IAAI,qBAAqB,CAAC;IAC9B,IAAI,IAAI,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,IAAI,MAAM,CAAC;IACd,MAAM,IAAI,MAAM,CAAC;IACjB,OAAO,IAAI,4BAA4B,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,IAAI,MAAM,CAAC;IACd,MAAM,IAAI,MAAM,CAAC;IACjB,OAAO,IAAI,qBAAqB,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACjD,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,4BAA4B,KAAK,IAAI,GAAG,IAAI,CAAC;IACrF,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,GAAG,IAAI,CAAC;IACpF,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI,CAAC;IACjF,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,4BAA4B,KAAK,IAAI,GAAG,IAAI,CAAC;IACvF,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,GAAG,IAAI,CAAC;IACtF,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI,CAAC;IACnF,gBAAgB,CAAC,CAAC,KAAK,CAAC,EAAE,kBAAkB,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,qBAAqB,GAC7B,iBAAiB,GACjB,mBAAmB,GACnB,uBAAuB,GACvB,wBAAwB,CAAC;AAE7B,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC/D,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC9D,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACvD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,QAAQ,CAAC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;gBAE3C,WAAW,EAAE,SAAS,qBAAqB,EAAE;CAK1D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,IAAI,IAAI,qBAAqB,CAAC;IAC9B,WAAW,IAAI,qBAAqB,CAAC;IACrC,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACpD,SAAS,CAAC,OAAO,EAAE,iBAAiB,GAAG,qBAAqB,CAAC;IAC7D,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACzD,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,qBAAqB,CAAC;IAClE,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACzD,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF,SAAS,CAAC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAErF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;CACnC;AAED,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,GAAG,sBAAsB,CAAC;AAE5E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,6BAA6B,CAAC;CACtD;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IACpE,QAAQ,CAAC,WAAW,CAAC,EAAE,6BAA6B,CAAC;IACrD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,kBAAkB,GAAG,MAAM,GAAG,aAAa,CAAC;CACzE;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,4BAA4B,CAAC;CACpD;AA+BD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,kBAAkB,EACxB,OAAO,GAAE,6BAAkC,GAC1C;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,4BAA4B,CAAC;IACpD,QAAQ,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;CAC7B,CAkFA;AA0BD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,GAAE,sBAA2B,GAAG,eAAe,CAgErH;AAUD,wBAAsB,eAAe,CACnC,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,kBAAkB,CAAC,CAmC7B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,QAAQ,SAAS,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAExG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { formstackSelectors, } from "@redrockswebdevelopment/formstack-form-styling";
|
|
2
|
+
export class FormBrowserDiagnosticsError extends Error {
|
|
3
|
+
diagnostics;
|
|
4
|
+
constructor(diagnostics) {
|
|
5
|
+
super(formatDiagnostics(diagnostics));
|
|
6
|
+
this.name = "FormBrowserDiagnosticsError";
|
|
7
|
+
this.diagnostics = diagnostics;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function matchesPattern(value, pattern) {
|
|
11
|
+
return typeof pattern === "string" ? value.includes(pattern) : pattern.test(value);
|
|
12
|
+
}
|
|
13
|
+
function isIgnored(value, patterns) {
|
|
14
|
+
return patterns?.some((pattern) => matchesPattern(value, pattern)) ?? false;
|
|
15
|
+
}
|
|
16
|
+
function defaultDiagnosticsOptions(options = {}) {
|
|
17
|
+
return {
|
|
18
|
+
failOnConsoleTypes: options.failOnConsoleTypes ?? ["error"],
|
|
19
|
+
failOnStatusCodes: options.failOnStatusCodes ?? [],
|
|
20
|
+
failOnStatusCodeAtOrAbove: options.failOnStatusCodeAtOrAbove ?? 400,
|
|
21
|
+
ignoreConsoleMessages: options.ignoreConsoleMessages ?? [],
|
|
22
|
+
ignoreUrls: options.ignoreUrls ?? [],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function diagnosticLine(diagnostic) {
|
|
26
|
+
if (diagnostic.kind === "console")
|
|
27
|
+
return `console ${diagnostic.level}: ${diagnostic.message}`;
|
|
28
|
+
if (diagnostic.kind === "pageerror")
|
|
29
|
+
return `pageerror: ${diagnostic.message}`;
|
|
30
|
+
if (diagnostic.kind === "requestfailed")
|
|
31
|
+
return `request failed ${diagnostic.method} ${diagnostic.url}: ${diagnostic.errorText}`;
|
|
32
|
+
return `response ${diagnostic.status} ${diagnostic.method} ${diagnostic.url}`;
|
|
33
|
+
}
|
|
34
|
+
function formatDiagnostics(diagnostics) {
|
|
35
|
+
return ["Form browser diagnostics failed:", ...diagnostics.map((diagnostic) => `- ${diagnosticLine(diagnostic)}`)].join("\n");
|
|
36
|
+
}
|
|
37
|
+
export function createFormBrowserMonitor(page, options = {}) {
|
|
38
|
+
const config = defaultDiagnosticsOptions(options);
|
|
39
|
+
const diagnostics = [];
|
|
40
|
+
const onConsole = (message) => {
|
|
41
|
+
const level = message.type();
|
|
42
|
+
const text = message.text();
|
|
43
|
+
if (!config.failOnConsoleTypes.includes(level) || isIgnored(text, config.ignoreConsoleMessages)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
diagnostics.push({ kind: "console", level, message: text });
|
|
47
|
+
};
|
|
48
|
+
const onPageError = (error) => {
|
|
49
|
+
diagnostics.push({
|
|
50
|
+
kind: "pageerror",
|
|
51
|
+
message: error.message,
|
|
52
|
+
...(error.stack ? { stack: error.stack } : {}),
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
const onRequestFailed = (request) => {
|
|
56
|
+
const url = request.url();
|
|
57
|
+
if (isIgnored(url, config.ignoreUrls)) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
diagnostics.push({
|
|
61
|
+
kind: "requestfailed",
|
|
62
|
+
method: request.method(),
|
|
63
|
+
url,
|
|
64
|
+
errorText: request.failure()?.errorText ?? "unknown request failure",
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
const onResponse = (response) => {
|
|
68
|
+
const status = response.status();
|
|
69
|
+
const url = response.url();
|
|
70
|
+
if (isIgnored(url, config.ignoreUrls)) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (status < config.failOnStatusCodeAtOrAbove && !config.failOnStatusCodes.includes(status)) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
diagnostics.push({
|
|
77
|
+
kind: "response",
|
|
78
|
+
method: response.request().method(),
|
|
79
|
+
url,
|
|
80
|
+
status,
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
page.on("console", onConsole);
|
|
84
|
+
page.on("pageerror", onPageError);
|
|
85
|
+
page.on("requestfailed", onRequestFailed);
|
|
86
|
+
page.on("response", onResponse);
|
|
87
|
+
const report = () => ({
|
|
88
|
+
diagnostics,
|
|
89
|
+
hasErrors: diagnostics.length > 0,
|
|
90
|
+
});
|
|
91
|
+
return {
|
|
92
|
+
report,
|
|
93
|
+
assertNoErrors: () => {
|
|
94
|
+
if (diagnostics.length > 0) {
|
|
95
|
+
throw new FormBrowserDiagnosticsError(diagnostics);
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
detach: () => {
|
|
99
|
+
page.off?.("console", onConsole);
|
|
100
|
+
page.off?.("pageerror", onPageError);
|
|
101
|
+
page.off?.("requestfailed", onRequestFailed);
|
|
102
|
+
page.off?.("response", onResponse);
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async function setControlValue(locator, value) {
|
|
107
|
+
try {
|
|
108
|
+
await locator.fill(value);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
await locator.selectOption(value);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function fillIfDefined(locator, value) {
|
|
115
|
+
return value === undefined ? Promise.resolve() : setControlValue(locator, value);
|
|
116
|
+
}
|
|
117
|
+
function subfieldLocator(page, internalLabel, subfield) {
|
|
118
|
+
return page.locator(formstackSelectors.subfieldInput(internalLabel, subfield)).first();
|
|
119
|
+
}
|
|
120
|
+
function productPartLocator(page, internalLabel, part) {
|
|
121
|
+
return page.locator(formstackSelectors.productPart(internalLabel, part)).locator("input, textarea, select").first();
|
|
122
|
+
}
|
|
123
|
+
function productQuantityLocator(page, internalLabel) {
|
|
124
|
+
return page.locator(`${formstackSelectors.fieldByInternalLabel(internalLabel)} input[name$="[quantity]"], ${formstackSelectors.fieldByInternalLabel(internalLabel)} select[name$="[quantity]"]`).first();
|
|
125
|
+
}
|
|
126
|
+
export function createFormTestHarness(page, options = {}) {
|
|
127
|
+
return {
|
|
128
|
+
page,
|
|
129
|
+
options,
|
|
130
|
+
form: () => page.locator(options.formId == null ? formstackSelectors.form : formstackSelectors.formBodyById(options.formId)),
|
|
131
|
+
visiblePage: () => page.locator(formstackSelectors.visiblePage),
|
|
132
|
+
field: (internalLabel) => page.locator(formstackSelectors.fieldByInternalLabel(internalLabel)),
|
|
133
|
+
fieldById: (fieldId) => page.locator(formstackSelectors.fieldById(fieldId)),
|
|
134
|
+
fieldInput: (internalLabel) => page.locator(formstackSelectors.fieldInputByInternalLabel(internalLabel)).first(),
|
|
135
|
+
fieldInputById: (fieldId) => page.locator(formstackSelectors.fieldInputById(fieldId)).first(),
|
|
136
|
+
fieldError: (internalLabel) => page.locator(formstackSelectors.fieldErrorByInternalLabel(internalLabel)),
|
|
137
|
+
fillText: (internalLabel, value) => page.locator(formstackSelectors.fieldInputByInternalLabel(internalLabel)).first().fill(value),
|
|
138
|
+
fillTextById: (fieldId, value) => page.locator(formstackSelectors.fieldInputById(fieldId)).first().fill(value),
|
|
139
|
+
fillTextarea: (internalLabel, value) => page.locator(formstackSelectors.fieldInputByInternalLabel(internalLabel)).first().fill(value),
|
|
140
|
+
fillEmail: (internalLabel, value) => page.locator(formstackSelectors.fieldInputByInternalLabel(internalLabel)).first().fill(value),
|
|
141
|
+
fillNumber: (internalLabel, value) => page.locator(formstackSelectors.fieldInputByInternalLabel(internalLabel)).first().fill(String(value)),
|
|
142
|
+
fillPhone: (internalLabel, value) => page.locator(formstackSelectors.fieldInputByInternalLabel(internalLabel)).first().fill(value),
|
|
143
|
+
fillName: async (internalLabel, value) => {
|
|
144
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "prefix"), value.prefix);
|
|
145
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "first"), value.first);
|
|
146
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "middle"), value.middle);
|
|
147
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "last"), value.last);
|
|
148
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "suffix"), value.suffix);
|
|
149
|
+
},
|
|
150
|
+
fillAddress: async (internalLabel, value) => {
|
|
151
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "address"), value.address);
|
|
152
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "address2"), value.address2);
|
|
153
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "city"), value.city);
|
|
154
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "state"), value.state);
|
|
155
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "zip"), value.zip);
|
|
156
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "country"), value.country);
|
|
157
|
+
},
|
|
158
|
+
fillDateTime: async (internalLabel, value) => {
|
|
159
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "month"), value.month);
|
|
160
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "day"), value.day);
|
|
161
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "year"), value.year);
|
|
162
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "hour"), value.hour);
|
|
163
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "minutes"), value.minutes);
|
|
164
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "seconds"), value.seconds);
|
|
165
|
+
await fillIfDefined(subfieldLocator(page, internalLabel, "ampm"), value.ampm);
|
|
166
|
+
},
|
|
167
|
+
selectOption: (internalLabel, value) => page.locator(formstackSelectors.fieldInputByInternalLabel(internalLabel)).first().selectOption(value),
|
|
168
|
+
chooseRadio: (internalLabel, value) => page.locator(formstackSelectors.optionLabelByValue(internalLabel, "radio", value)).first().click(),
|
|
169
|
+
setCheckbox: (internalLabel, value, checked) => {
|
|
170
|
+
const locator = page.locator(formstackSelectors.optionLabelByValue(internalLabel, "checkbox", value)).first();
|
|
171
|
+
return checked ? locator.click() : locator.click();
|
|
172
|
+
},
|
|
173
|
+
setCheckboxes: async (internalLabel, values) => {
|
|
174
|
+
for (const value of values) {
|
|
175
|
+
await page.locator(formstackSelectors.optionLabelByValue(internalLabel, "checkbox", value)).first().click();
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
selectMatrixCell: (fieldId, row, column) => page.locator(formstackSelectors.matrixInputByPosition(fieldId, row, column)).first().check(),
|
|
179
|
+
setRating: (fieldId, zeroBasedIndex) => page.locator(formstackSelectors.ratingButtonByIndex(fieldId, zeroBasedIndex)).first().click(),
|
|
180
|
+
uploadFile: (internalLabel, files) => page.locator(formstackSelectors.fieldByInternalLabel(internalLabel)).locator("input[type=\"file\"]").first().setInputFiles(files),
|
|
181
|
+
clearSignature: (internalLabel) => page.locator(formstackSelectors.signatureClearButtonByInternalLabel(internalLabel)).first().click(),
|
|
182
|
+
fillProduct: async (internalLabel, value) => {
|
|
183
|
+
await fillIfDefined(productPartLocator(page, internalLabel, "fixedAmount"), value.fixedAmount);
|
|
184
|
+
await fillIfDefined(productQuantityLocator(page, internalLabel), value.quantity);
|
|
185
|
+
},
|
|
186
|
+
clickNext: () => page.locator(formstackSelectors.nextButton).first().click(),
|
|
187
|
+
clickPrevious: () => page.locator(formstackSelectors.previousButton).first().click(),
|
|
188
|
+
submit: () => page.locator(formstackSelectors.submitButton).first().click(),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function stepName(step, index) {
|
|
192
|
+
return typeof step === "function" ? `step ${index + 1}` : step.name;
|
|
193
|
+
}
|
|
194
|
+
function stepRunner(step) {
|
|
195
|
+
return typeof step === "function" ? step : step.run;
|
|
196
|
+
}
|
|
197
|
+
export async function runFormScenario(page, scenario, options = {}) {
|
|
198
|
+
const monitor = createFormBrowserMonitor(page, scenario.diagnostics ?? options.diagnostics);
|
|
199
|
+
const harness = createFormTestHarness(page, options);
|
|
200
|
+
const steps = [];
|
|
201
|
+
try {
|
|
202
|
+
if (scenario.url) {
|
|
203
|
+
await page.goto(scenario.url);
|
|
204
|
+
await page.waitForLoadState?.(options.waitForLoadState ?? "domcontentloaded");
|
|
205
|
+
}
|
|
206
|
+
for (let index = 0; index < scenario.steps.length; index += 1) {
|
|
207
|
+
const step = scenario.steps[index];
|
|
208
|
+
if (!step) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
await stepRunner(step)(harness);
|
|
212
|
+
steps.push({ name: stepName(step, index) });
|
|
213
|
+
}
|
|
214
|
+
const shouldThrow = options.throwOnDiagnostics ?? true;
|
|
215
|
+
if (shouldThrow) {
|
|
216
|
+
monitor.assertNoErrors();
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
name: scenario.name,
|
|
220
|
+
steps,
|
|
221
|
+
diagnostics: monitor.report(),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
monitor.detach();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
export function defineFormScenario(scenario) {
|
|
229
|
+
return scenario;
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@redrockswebdevelopment/formstack-form-testing",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Playwright-compatible testing utilities for Formstack forms.",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@redrockswebdevelopment/formstack-form-styling": "0.1.0"
|
|
19
|
+
},
|
|
20
|
+
"peerDependencies": {
|
|
21
|
+
"@playwright/test": ">=1.40.0"
|
|
22
|
+
},
|
|
23
|
+
"peerDependenciesMeta": {
|
|
24
|
+
"@playwright/test": {
|
|
25
|
+
"optional": true
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^25.7.0",
|
|
30
|
+
"typescript": "^5.9.0",
|
|
31
|
+
"vitest": "^4.1.6"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc -p tsconfig.json",
|
|
35
|
+
"typecheck": "pnpm --filter @redrockswebdevelopment/formstack-form-styling run build && tsc -p tsconfig.json --noEmit",
|
|
36
|
+
"test": "vitest run"
|
|
37
|
+
}
|
|
38
|
+
}
|