@augment-vir/test 31.53.0 → 31.54.1
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/augments/test-playwright.d.ts +1 -1
- package/dist/augments/test-playwright.js +0 -1
- package/dist/augments/test-web.d.ts +3 -0
- package/dist/augments/test-web.js +3 -0
- package/dist/test-web/click-element.js +1 -1
- package/dist/test-web/element-cases.d.ts +23 -0
- package/dist/test-web/element-cases.js +58 -0
- package/dist/test-web/render-element.d.ts +1 -1
- package/dist/test-web/render-element.js +1 -1
- package/dist/test-web/symlinked/element-text.d.ts +8 -0
- package/dist/test-web/symlinked/element-text.js +28 -0
- package/dist/test-web/type-into-element.js +2 -1
- package/package.json +3 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RuntimeEnvError } from '@augment-vir/core';
|
|
2
2
|
export { type MenuOptionOptions } from '../test-playwright/get-option.js';
|
|
3
|
-
export {
|
|
3
|
+
export { type NavOptions } from '../test-playwright/nav.js';
|
|
4
4
|
export { type LocatorScreenshotOptions, type SaveScreenshotOptions, type TakeScreenshotOptions, } from '../test-playwright/screenshot.js';
|
|
5
5
|
declare function importPlaywrightTestApi(this: void): Promise<RuntimeEnvError | {
|
|
6
6
|
navigation: {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { isInsidePlaywrightTest, RuntimeEnvError } from '@augment-vir/core';
|
|
2
|
-
export { playwrightTeatNameUrlParam } from '../test-playwright/nav.js';
|
|
3
2
|
async function importPlaywrightTestApi() {
|
|
4
3
|
if (!isInsidePlaywrightTest()) {
|
|
5
4
|
return new RuntimeEnvError("The 'testPlaywright' api cannot be used outside of a Playwright test context.");
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RuntimeEnvError } from '@augment-vir/core';
|
|
2
|
+
import { elementCases } from '../test-web/element-cases.js';
|
|
2
3
|
declare function importWebTestApi(this: void): Promise<RuntimeEnvError | {
|
|
3
4
|
/**
|
|
4
5
|
* Cleans up all rendered test HTML by removing the actual wrapper nodes. Common use case is
|
|
@@ -44,6 +45,8 @@ declare function importWebTestApi(this: void): Promise<RuntimeEnvError | {
|
|
|
44
45
|
* any element in particular, it'll go wherever the current focus is, if any.
|
|
45
46
|
*/
|
|
46
47
|
typeText: typeof import("../test-web/type-into-element").typeString;
|
|
48
|
+
/** Create multiple test cases for element testing. */
|
|
49
|
+
elementCases: typeof elementCases;
|
|
47
50
|
}>;
|
|
48
51
|
/**
|
|
49
52
|
* A suite of web test helpers. This is only accessible within a browser runtime. If accessed
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isRuntimeEnv, RuntimeEnv, RuntimeEnvError } from '@augment-vir/core';
|
|
2
|
+
import { elementCases } from '../test-web/element-cases.js';
|
|
2
3
|
async function importWebTestApi() {
|
|
3
4
|
if (!isRuntimeEnv(RuntimeEnv.Web)) {
|
|
4
5
|
return new RuntimeEnvError("The 'testWeb' api cannot be used outside of a browser context.");
|
|
@@ -53,6 +54,8 @@ async function importWebTestApi() {
|
|
|
53
54
|
* any element in particular, it'll go wherever the current focus is, if any.
|
|
54
55
|
*/
|
|
55
56
|
typeText: typeString,
|
|
57
|
+
/** Create multiple test cases for element testing. */
|
|
58
|
+
elementCases,
|
|
56
59
|
};
|
|
57
60
|
}
|
|
58
61
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { sendMouse } from '@web/test-runner-commands';
|
|
2
1
|
import { getCenterOfElement } from './symlinked/element-position.js';
|
|
3
2
|
async function sendMouseToMiddleOfElement(element, operationType) {
|
|
3
|
+
const { sendMouse } = await import('@web/test-runner-commands');
|
|
4
4
|
const center = getCenterOfElement(element);
|
|
5
5
|
await sendMouse({
|
|
6
6
|
position: [
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type MaybePromise, type PartialWithUndefined } from '@augment-vir/common';
|
|
2
|
+
import { type DeclarativeElementDefinition, type DefinedTypedEvent, type TypedEvent } from 'element-vir';
|
|
3
|
+
import { type EmptyObject, type IsAny } from 'type-fest';
|
|
4
|
+
import { type UniversalTestContext } from '../augments/universal-testing-suite/universal-test-context.js';
|
|
5
|
+
export type ElementTestCaseExpect = {
|
|
6
|
+
text: string | string[];
|
|
7
|
+
events: Map<TypedEvent | DefinedTypedEvent<any, any>, unknown[]>;
|
|
8
|
+
};
|
|
9
|
+
export type ElementTestCase<Definition extends Readonly<DeclarativeElementDefinition>> = {
|
|
10
|
+
it: string;
|
|
11
|
+
} & (IsAny<Definition> extends true ? {
|
|
12
|
+
createInputs?: ((testContext: Readonly<UniversalTestContext>) => MaybePromise<any>) | undefined;
|
|
13
|
+
} : Definition['InputsType'] extends EmptyObject ? {
|
|
14
|
+
createInputs?: never;
|
|
15
|
+
} : {
|
|
16
|
+
createInputs: (testContext: Readonly<UniversalTestContext>) => MaybePromise<Definition['InputsType']>;
|
|
17
|
+
}) & PartialWithUndefined<{
|
|
18
|
+
expect: PartialWithUndefined<ElementTestCaseExpect>;
|
|
19
|
+
act: (instance: Definition['InstanceType']) => MaybePromise<void>;
|
|
20
|
+
only: boolean;
|
|
21
|
+
skip: boolean;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function elementCases<const Definition extends Readonly<DeclarativeElementDefinition>>(elementDefinition: Readonly<Definition>, testCases: ReadonlyArray<Readonly<ElementTestCase<Definition>>>): void;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { assert, waitUntil } from '@augment-vir/assert';
|
|
2
|
+
import { ensureArray } from '@augment-vir/common';
|
|
3
|
+
import { itCasesWithContext, } from '../augments/universal-testing-suite/it-cases-with-context.js';
|
|
4
|
+
import { renderElement } from './render-element.js';
|
|
5
|
+
import { extractElementText } from './symlinked/element-text.js';
|
|
6
|
+
export function elementCases(elementDefinition, testCases) {
|
|
7
|
+
itCasesWithContext(testRenderElement, () => {
|
|
8
|
+
/** All assertions are done in the test callback. */
|
|
9
|
+
}, testCases.map((testCase) => {
|
|
10
|
+
return {
|
|
11
|
+
it: testCase.it,
|
|
12
|
+
inputs: [
|
|
13
|
+
elementDefinition,
|
|
14
|
+
testCase,
|
|
15
|
+
],
|
|
16
|
+
throws: undefined,
|
|
17
|
+
};
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
async function testRenderElement(testContext, elementDefinition, testCase) {
|
|
21
|
+
const eventKeys = Array.from(testCase.expect?.events?.keys() || []);
|
|
22
|
+
const events = new Map(eventKeys.map((key) => {
|
|
23
|
+
return [
|
|
24
|
+
key,
|
|
25
|
+
[],
|
|
26
|
+
];
|
|
27
|
+
}));
|
|
28
|
+
const inputs = await testCase.createInputs?.(testContext);
|
|
29
|
+
const instance = await renderElement(elementDefinition, inputs);
|
|
30
|
+
eventKeys.forEach((eventKey) => {
|
|
31
|
+
instance.addEventListener(eventKey.type, (event) => {
|
|
32
|
+
events.get(eventKey)?.push(event.detail);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
await testCase.act?.(instance);
|
|
36
|
+
await waitUntil.isTrue(() => {
|
|
37
|
+
const text = extractElementText(instance);
|
|
38
|
+
if (testCase.expect?.text) {
|
|
39
|
+
assert.hasValues(text, ensureArray(testCase.expect.text));
|
|
40
|
+
assert.hasValue(text, testCase.expect.text);
|
|
41
|
+
}
|
|
42
|
+
if (testCase.expect?.events) {
|
|
43
|
+
testCase.expect.events.forEach((expectedEvents, eventKey) => {
|
|
44
|
+
const actualEvents = events.get(eventKey);
|
|
45
|
+
assert.isDefined(actualEvents);
|
|
46
|
+
assert.deepEquals(actualEvents, expectedEvents);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}, {
|
|
51
|
+
interval: {
|
|
52
|
+
milliseconds: 100,
|
|
53
|
+
},
|
|
54
|
+
timeout: {
|
|
55
|
+
minutes: 1,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type DeclarativeElementDefinition } from 'element-vir';
|
|
2
2
|
import { type EmptyObject } from 'type-fest';
|
|
3
|
-
export declare function renderElement<const Definition extends DeclarativeElementDefinition
|
|
3
|
+
export declare function renderElement<const Definition extends Readonly<DeclarativeElementDefinition>>(elementDefinition: Definition, ...args: Definition['InputsType'] extends EmptyObject ? [] : [Definition['InputsType']]): Promise<Definition["InstanceType"]>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { fixture } from '@open-wc/testing-helpers';
|
|
2
1
|
import { html } from 'element-vir';
|
|
3
2
|
export async function renderElement(elementDefinition, ...args) {
|
|
3
|
+
const { fixture } = await import('@open-wc/testing-helpers');
|
|
4
4
|
const instance = await fixture(html `
|
|
5
5
|
<${elementDefinition.assign(args[0] || {})}></${elementDefinition}>
|
|
6
6
|
`);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the text content of the given element.
|
|
3
|
+
*
|
|
4
|
+
* @category Web : Elements
|
|
5
|
+
* @category Package : @augment-vir/web
|
|
6
|
+
* @package [`@augment-vir/web`](https://www.npmjs.com/package/@augment-vir/web)
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractElementText(element: Readonly<Element>): string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the text content of the given element.
|
|
3
|
+
*
|
|
4
|
+
* @category Web : Elements
|
|
5
|
+
* @category Package : @augment-vir/web
|
|
6
|
+
* @package [`@augment-vir/web`](https://www.npmjs.com/package/@augment-vir/web)
|
|
7
|
+
*/
|
|
8
|
+
export function extractElementText(element) {
|
|
9
|
+
return recursivelyExtractElementText(element).join('\n');
|
|
10
|
+
}
|
|
11
|
+
function recursivelyExtractElementText(node) {
|
|
12
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
13
|
+
const text = node.textContent?.trim();
|
|
14
|
+
return text ? [text] : [];
|
|
15
|
+
}
|
|
16
|
+
else if (node.nodeType === Node.ELEMENT_NODE) {
|
|
17
|
+
const element = node;
|
|
18
|
+
if (element.tagName.toLowerCase() === 'slot') {
|
|
19
|
+
const slotElement = element;
|
|
20
|
+
const assignedNodes = slotElement.assignedNodes();
|
|
21
|
+
return (assignedNodes.length ? assignedNodes : Array.from(element.childNodes)).flatMap((assignedNode) => recursivelyExtractElementText(assignedNode));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
return Array.from((element.shadowRoot || element).childNodes).flatMap((childNode) => recursivelyExtractElementText(childNode));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { sendKeys } from '@web/test-runner-commands';
|
|
2
1
|
import { focusElement } from './element-test-focus.js';
|
|
3
2
|
export async function typeString(text) {
|
|
3
|
+
const { sendKeys } = await import('@web/test-runner-commands');
|
|
4
4
|
return await sendKeys({
|
|
5
5
|
type: text,
|
|
6
6
|
});
|
|
@@ -10,6 +10,7 @@ export async function typeStringIntoElement(text, element) {
|
|
|
10
10
|
await typeString(text);
|
|
11
11
|
}
|
|
12
12
|
export async function deleteAllTextInInput(inputElement) {
|
|
13
|
+
const { sendKeys } = await import('@web/test-runner-commands');
|
|
13
14
|
const lastValue = inputElement.value;
|
|
14
15
|
if (lastValue) {
|
|
15
16
|
await focusElement(inputElement);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@augment-vir/test",
|
|
3
|
-
"version": "31.
|
|
3
|
+
"version": "31.54.1",
|
|
4
4
|
"description": "A universal testing suite that works with Mocha style test runners _and_ Node.js's built-in test runner.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"test",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"test:web": "virmator test --no-deps web 'src/test-web/**/*.test.ts' 'src/augments/universal-testing-suite/**/*.test.ts'"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@augment-vir/assert": "^31.
|
|
48
|
-
"@augment-vir/common": "^31.
|
|
47
|
+
"@augment-vir/assert": "^31.54.1",
|
|
48
|
+
"@augment-vir/common": "^31.54.1",
|
|
49
49
|
"@open-wc/testing-helpers": "^3.0.1",
|
|
50
50
|
"@virmator/test": "^14.3.0",
|
|
51
51
|
"type-fest": "^5.2.0"
|