@owlmeans/test-ui 0.1.18-rc.39 → 0.1.18-rc.40
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/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/testing-ui/SKILL.md +1 -1
- package/build/marketing-consent.d.ts +5 -4
- package/build/marketing-consent.d.ts.map +1 -1
- package/build/marketing-consent.js +17 -3
- package/build/marketing-consent.js.map +1 -1
- package/package.json +1 -1
- package/src/marketing-consent.ts +21 -7
package/agent-meta/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"package": "@owlmeans/test-ui",
|
|
4
|
-
"version": "0.1.18-rc.
|
|
5
|
-
"generatedAt": "2026-09-
|
|
4
|
+
"version": "0.1.18-rc.40",
|
|
5
|
+
"generatedAt": "2026-09-25T12:22:06.188Z",
|
|
6
6
|
"canonicalRepo": "https://github.com/owlmeans/common",
|
|
7
7
|
"entries": [
|
|
8
8
|
{
|
|
@@ -6,7 +6,7 @@ description: Category-D component-level acceptance tests for OwlMeans Common UI
|
|
|
6
6
|
|
|
7
7
|
# UI Acceptance Tests — Category D (bun test + Playwright as a library)
|
|
8
8
|
|
|
9
|
-
**Install:** `"@owlmeans/test-ui": "^0.1.18-rc.
|
|
9
|
+
**Install:** `"@owlmeans/test-ui": "^0.1.18-rc.40"` in `devDependencies`
|
|
10
10
|
|
|
11
11
|
`@owlmeans/test-ui` depends on `playwright`, so the browser library arrives with it; add
|
|
12
12
|
`playwright` to `devDependencies` as well when a spec imports a launcher itself. The Vite harness
|
|
@@ -2,15 +2,16 @@ import type { Page } from 'playwright';
|
|
|
2
2
|
export interface AnswerMarketingConsentOptions {
|
|
3
3
|
/**
|
|
4
4
|
* Which choice to save when the step is shown. `'all'` (the default) ticks the "select all"
|
|
5
|
-
* checkbox
|
|
5
|
+
* checkbox (every consent, and the Terms row while it is up — see {@link terms} for what is left
|
|
6
|
+
* of that) before saving; `'none'` saves with every item left unchecked, which is a valid,
|
|
6
7
|
* fully-compliant state on its own; `'skip'` clicks "Skip for now" instead of saving anything —
|
|
7
8
|
* only valid when a Terms box is not on screen (nothing calls it there; see {@link terms}).
|
|
8
9
|
*/
|
|
9
10
|
accept?: 'none' | 'all' | 'skip';
|
|
10
11
|
/**
|
|
11
|
-
* When a Terms
|
|
12
|
-
* default)
|
|
13
|
-
* the blocked state itself; the confirm click below still fires (with `{ force: true }`, since
|
|
12
|
+
* When a Terms row is on screen (`appendMarketingConsent({ terms: 'step' })`), `'accept'` (the
|
|
13
|
+
* default) ends with it ticked. `'leave'` ends with it unticked, even after a select-all — for a
|
|
14
|
+
* spec that means to drive the blocked state itself; the confirm click below still fires (with `{ force: true }`, since
|
|
14
15
|
* the control is never truly `disabled`), and this helper then EXPECTS the box to still be up
|
|
15
16
|
* afterward rather than treating that as a failure.
|
|
16
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketing-consent.d.ts","sourceRoot":"","sources":["../src/marketing-consent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC,MAAM,WAAW,6BAA6B;IAC5C
|
|
1
|
+
{"version":3,"file":"marketing-consent.d.ts","sourceRoot":"","sources":["../src/marketing-consent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC,MAAM,WAAW,6BAA6B;IAC5C;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;IAChC;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,sBAAsB,SAC3B,IAAI,SAAS,6BAA6B,KAC/C,OAAO,CAAC,OAAO,CA2FjB,CAAA"}
|
|
@@ -45,21 +45,35 @@ export const answerMarketingConsent = async (page, opts) => {
|
|
|
45
45
|
return true;
|
|
46
46
|
const terms = page.locator('[data-marketing-consent-terms]');
|
|
47
47
|
const hasTerms = await terms.count() > 0;
|
|
48
|
-
if (hasTerms && (opts?.terms ?? 'accept') === 'accept') {
|
|
49
|
-
await terms.check();
|
|
50
|
-
}
|
|
51
48
|
if (!hasTerms && opts?.accept === 'skip') {
|
|
52
49
|
await page.locator('[data-marketing-consent-skip]').click();
|
|
53
50
|
await step.waitFor({ state: 'detached', timeout });
|
|
54
51
|
return true;
|
|
55
52
|
}
|
|
56
53
|
if ((opts?.accept ?? 'all') === 'all') {
|
|
54
|
+
// The step draws "Select all" only when there is more than one row to select; a lone consent
|
|
55
|
+
// is ticked itself. Select all speaks for the Terms row too while it is up, which the choice
|
|
56
|
+
// below then settles either way.
|
|
57
57
|
const all = page.locator('[data-marketing-consent-all]');
|
|
58
58
|
if (await all.count() > 0) {
|
|
59
59
|
await all.click();
|
|
60
60
|
}
|
|
61
|
+
else {
|
|
62
|
+
for (const item of await page.locator('[data-marketing-consent-item]').all()) {
|
|
63
|
+
await item.check();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
61
66
|
}
|
|
62
67
|
// 'none' leaves every item unchecked and clicks nothing else before saving.
|
|
68
|
+
if (hasTerms) {
|
|
69
|
+
const wanted = (opts?.terms ?? 'accept') === 'accept';
|
|
70
|
+
if (wanted && !(await terms.isChecked())) {
|
|
71
|
+
await terms.check();
|
|
72
|
+
}
|
|
73
|
+
else if (!wanted && await terms.isChecked()) {
|
|
74
|
+
await terms.uncheck();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
63
77
|
// `{ force: true }`: the confirm is never the native `disabled` — only `aria-disabled` while a
|
|
64
78
|
// Terms box is unticked, or merely styled muted with nothing changed yet — and Playwright's own
|
|
65
79
|
// actionability check honours `aria-disabled`, which this helper deliberately does not.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketing-consent.js","sourceRoot":"","sources":["../src/marketing-consent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"marketing-consent.js","sourceRoot":"","sources":["../src/marketing-consent.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/marketing-consent.ts
CHANGED
|
@@ -3,15 +3,16 @@ import type { Page } from 'playwright'
|
|
|
3
3
|
export interface AnswerMarketingConsentOptions {
|
|
4
4
|
/**
|
|
5
5
|
* Which choice to save when the step is shown. `'all'` (the default) ticks the "select all"
|
|
6
|
-
* checkbox
|
|
6
|
+
* checkbox (every consent, and the Terms row while it is up — see {@link terms} for what is left
|
|
7
|
+
* of that) before saving; `'none'` saves with every item left unchecked, which is a valid,
|
|
7
8
|
* fully-compliant state on its own; `'skip'` clicks "Skip for now" instead of saving anything —
|
|
8
9
|
* only valid when a Terms box is not on screen (nothing calls it there; see {@link terms}).
|
|
9
10
|
*/
|
|
10
11
|
accept?: 'none' | 'all' | 'skip'
|
|
11
12
|
/**
|
|
12
|
-
* When a Terms
|
|
13
|
-
* default)
|
|
14
|
-
* the blocked state itself; the confirm click below still fires (with `{ force: true }`, since
|
|
13
|
+
* When a Terms row is on screen (`appendMarketingConsent({ terms: 'step' })`), `'accept'` (the
|
|
14
|
+
* default) ends with it ticked. `'leave'` ends with it unticked, even after a select-all — for a
|
|
15
|
+
* spec that means to drive the blocked state itself; the confirm click below still fires (with `{ force: true }`, since
|
|
15
16
|
* the control is never truly `disabled`), and this helper then EXPECTS the box to still be up
|
|
16
17
|
* afterward rather than treating that as a failure.
|
|
17
18
|
*/
|
|
@@ -71,9 +72,6 @@ export const answerMarketingConsent = async (
|
|
|
71
72
|
|
|
72
73
|
const terms = page.locator('[data-marketing-consent-terms]')
|
|
73
74
|
const hasTerms = await terms.count() > 0
|
|
74
|
-
if (hasTerms && (opts?.terms ?? 'accept') === 'accept') {
|
|
75
|
-
await terms.check()
|
|
76
|
-
}
|
|
77
75
|
|
|
78
76
|
if (!hasTerms && opts?.accept === 'skip') {
|
|
79
77
|
await page.locator('[data-marketing-consent-skip]').click()
|
|
@@ -83,13 +81,29 @@ export const answerMarketingConsent = async (
|
|
|
83
81
|
}
|
|
84
82
|
|
|
85
83
|
if ((opts?.accept ?? 'all') === 'all') {
|
|
84
|
+
// The step draws "Select all" only when there is more than one row to select; a lone consent
|
|
85
|
+
// is ticked itself. Select all speaks for the Terms row too while it is up, which the choice
|
|
86
|
+
// below then settles either way.
|
|
86
87
|
const all = page.locator('[data-marketing-consent-all]')
|
|
87
88
|
if (await all.count() > 0) {
|
|
88
89
|
await all.click()
|
|
90
|
+
} else {
|
|
91
|
+
for (const item of await page.locator('[data-marketing-consent-item]').all()) {
|
|
92
|
+
await item.check()
|
|
93
|
+
}
|
|
89
94
|
}
|
|
90
95
|
}
|
|
91
96
|
// 'none' leaves every item unchecked and clicks nothing else before saving.
|
|
92
97
|
|
|
98
|
+
if (hasTerms) {
|
|
99
|
+
const wanted = (opts?.terms ?? 'accept') === 'accept'
|
|
100
|
+
if (wanted && !(await terms.isChecked())) {
|
|
101
|
+
await terms.check()
|
|
102
|
+
} else if (!wanted && await terms.isChecked()) {
|
|
103
|
+
await terms.uncheck()
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
93
107
|
// `{ force: true }`: the confirm is never the native `disabled` — only `aria-disabled` while a
|
|
94
108
|
// Terms box is unticked, or merely styled muted with nothing changed yet — and Playwright's own
|
|
95
109
|
// actionability check honours `aria-disabled`, which this helper deliberately does not.
|