* upgrade playwright to 1.41

* only use one playwright config

* remove custom hasAttribute assertion

* remove custom toHaveBooleanAttribute assertion

* mark flaky tests with test.fixme

* replace deprecated shadowroot attributes in fast-style fixture

* Change files
This commit is contained in:
John Kreitlow 2024-02-26 11:24:10 -08:00 коммит произвёл GitHub
Родитель df2ca503b1
Коммит 97ef4d7a38
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
37 изменённых файлов: 310 добавлений и 394 удалений

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "none",
"comment": "upgrade playwright to 1.41",
"packageName": "@microsoft/fast-foundation",
"email": "863023+radium-v@users.noreply.github.com",
"dependentChangeType": "none"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "none",
"comment": "upgrade playwright to 1.41",
"packageName": "@microsoft/fast-ssr",
"email": "863023+radium-v@users.noreply.github.com",
"dependentChangeType": "none"
}

Просмотреть файл

@ -253,7 +253,7 @@
"@custom-elements-manifest/to-markdown": "^0.1.0",
"@microsoft/api-extractor": "7.24.2",
"@microsoft/tsdoc-config": "^0.13.4",
"@playwright/test": "^1.25.2",
"@playwright/test": "^1.41.2",
"@rollup/plugin-node-resolve": "^13.3.0",
"@storybook/addon-docs": "6.5.10",
"@storybook/addon-essentials": "6.5.10",

Просмотреть файл

@ -1,8 +1,6 @@
import type { Locator, PlaywrightTestConfig } from "@playwright/test";
import { expect } from "@playwright/test";
import type { PlaywrightTestConfig } from "@playwright/test";
const config: PlaywrightTestConfig = {
projects: [{ name: "chromium" }, { name: "firefox" }, { name: "webkit" }],
reporter: "list",
testMatch: /.*\.pw\.spec\.ts$/,
retries: 3,
@ -10,6 +8,8 @@ const config: PlaywrightTestConfig = {
timeout: process.env.CI ? 10000 : 30000,
use: {
baseURL: "http://localhost:6006/iframe.html",
deviceScaleFactor: 1,
launchOptions: { args: ["--force-device-scale-factor=1"] },
viewport: {
height: 1280,
width: 720,
@ -24,56 +24,3 @@ const config: PlaywrightTestConfig = {
};
export default config;
expect.extend({
async toHaveBooleanAttribute(recieved: Locator, name: string) {
const options = {
comment: "Object.is equality",
isNot: this.isNot,
promise: this.promise,
};
name = name.trim();
await (await recieved.elementHandle())?.waitForElementState("stable");
const [hasAttribute, attributeValue] = await recieved.evaluate((node, name) => {
return [node.hasAttribute(name), node.getAttribute(name)];
}, name);
if (this.isNot) {
return {
pass: hasAttribute,
message: () => `expected ${name} to not be present`,
};
}
return {
pass: hasAttribute && (attributeValue === "" || attributeValue === name),
message: () => `${this.utils.matcherHint(
"toHaveBooleanAttribute",
undefined,
undefined,
options
)}
expected ${recieved} to have boolean attribute \`${name}\``,
};
},
async hasAttribute(recieved: Locator, attribute: string) {
if (await recieved.isVisible()) {
await (await recieved.elementHandle())?.waitForElementState("stable");
}
const pass = await recieved.evaluate(
(node, attribute) => node.hasAttribute(attribute),
attribute
);
return {
message: () => `expected ${recieved} to have attribute \`${attribute}\``,
pass,
};
},
});

Просмотреть файл

@ -38,7 +38,7 @@ test.describe("Accordion item", () => {
`;
});
await expect(element).not.hasAttribute("headinglevel");
await expect(element).not.toHaveAttribute("headinglevel");
await expect(element).toHaveJSProperty("headinglevel", 2);
});
@ -83,13 +83,13 @@ test.describe("Accordion item", () => {
`;
});
await expect(button).toHaveBooleanAttribute("disabled");
await expect(button).toHaveAttribute("disabled");
await element.evaluate<void, FASTAccordionItem>(node => {
node.disabled = false;
});
await expect(button).not.toHaveBooleanAttribute("disabled");
await expect(button).not.toHaveAttribute("disabled");
});
test("should set internal properties to match the id when provided", async () => {

Просмотреть файл

@ -133,9 +133,9 @@ test.describe("Accordion", () => {
await firstItem.click();
await expect(firstItem).toHaveBooleanAttribute("expanded");
await expect(firstItem).toHaveAttribute("expanded");
await expect(secondItem).not.toHaveBooleanAttribute("expanded");
await expect(secondItem).not.toHaveAttribute("expanded");
const secondItemButton = secondItem.locator(`[part="button"]`);
@ -145,9 +145,9 @@ test.describe("Accordion", () => {
node.dispatchEvent(new MouseEvent("click", { bubbles: true }));
});
await expect(firstItem).not.toHaveBooleanAttribute("expanded");
await expect(firstItem).not.toHaveAttribute("expanded");
await expect(secondItem).toHaveBooleanAttribute("expanded");
await expect(secondItem).toHaveAttribute("expanded");
});
test("should set the expanded items' button to aria-disabled when in single expand mode", async () => {
@ -174,7 +174,7 @@ test.describe("Accordion", () => {
await firstItem.click();
await expect(firstItem).toHaveBooleanAttribute("expanded");
await expect(firstItem).toHaveAttribute("expanded");
await expect(firstItem.locator("button")).toHaveAttribute(
"aria-disabled",
@ -183,7 +183,7 @@ test.describe("Accordion", () => {
await secondItem.click();
await expect(firstItem).not.toHaveBooleanAttribute("expanded");
await expect(firstItem).not.toHaveAttribute("expanded");
await expect(firstItem.locator("button")).not.toHaveAttribute(
"aria-disabled",
@ -194,7 +194,7 @@ test.describe("Accordion", () => {
"false"
);
await expect(secondItem).toHaveBooleanAttribute("expanded");
await expect(secondItem).toHaveAttribute("expanded");
await expect(secondItem.locator("button")).toHaveAttribute(
"aria-disabled",
@ -224,7 +224,7 @@ test.describe("Accordion", () => {
await firstItem.click();
await expect(firstItem).toHaveBooleanAttribute("expanded");
await expect(firstItem).toHaveAttribute("expanded");
await expect(firstItem.locator("button")).toHaveAttribute(
"aria-disabled",
@ -235,7 +235,7 @@ test.describe("Accordion", () => {
node.setAttribute("expand-mode", "multi");
});
await expect(firstItem.locator("button")).not.hasAttribute("aria-disabled");
await expect(firstItem.locator("button")).not.toHaveAttribute("aria-disabled");
});
test("should set the first item as expanded if no child is expanded by default in single mode", async () => {
@ -260,15 +260,15 @@ test.describe("Accordion", () => {
const secondItem = items.nth(1);
await expect(firstItem).toHaveBooleanAttribute("expanded");
await expect(firstItem).toHaveAttribute("expanded");
await expect(secondItem).not.toHaveBooleanAttribute("expanded");
await expect(secondItem).not.toHaveAttribute("expanded");
await secondItem.evaluate<void>(node => node.setAttribute("expanded", ""));
await expect(firstItem).not.toHaveBooleanAttribute("expanded");
await expect(firstItem).not.toHaveAttribute("expanded");
await expect(secondItem).toHaveBooleanAttribute("expanded");
await expect(secondItem).toHaveAttribute("expanded");
});
test("should set the first item with an expanded attribute to expanded in single mode", async () => {
@ -299,11 +299,11 @@ test.describe("Accordion", () => {
const thirdItem = items.nth(2);
await expect(firstItem).not.toHaveBooleanAttribute("expanded");
await expect(firstItem).not.toHaveAttribute("expanded");
await expect(secondItem).toHaveBooleanAttribute("expanded");
await expect(secondItem).toHaveAttribute("expanded");
await expect(thirdItem).not.toHaveBooleanAttribute("expanded");
await expect(thirdItem).not.toHaveAttribute("expanded");
});
test("should allow disabled items to be expanded when in single mode", async () => {
@ -335,21 +335,21 @@ test.describe("Accordion", () => {
const thirdItem = items.nth(2);
await expect(firstItem).not.toHaveBooleanAttribute("expanded");
await expect(firstItem).not.toHaveAttribute("expanded");
await expect(secondItem).toHaveBooleanAttribute("expanded");
await expect(secondItem).toHaveAttribute("expanded");
await expect(thirdItem).toHaveBooleanAttribute("expanded");
await expect(thirdItem).toHaveAttribute("expanded");
await secondItem.evaluate(node => {
node.removeAttribute("disabled");
});
await expect(firstItem).not.toHaveBooleanAttribute("expanded");
await expect(firstItem).not.toHaveAttribute("expanded");
await expect(secondItem).toHaveBooleanAttribute("expanded");
await expect(secondItem).toHaveAttribute("expanded");
await expect(thirdItem).not.toHaveBooleanAttribute("expanded");
await expect(thirdItem).not.toHaveAttribute("expanded");
});
test("should ignore `change` events from components other than accordion items", async () => {

Просмотреть файл

@ -45,7 +45,7 @@ test.describe("Breadcrumb item", () => {
const anchor = element.locator("a");
await expect(element).not.hasAttribute("href");
await expect(element).not.toHaveAttribute("href");
await expect(element).toHaveJSProperty("href", undefined);

Просмотреть файл

@ -97,6 +97,6 @@ test.describe("Breadcrumb", () => {
await expect(
element.locator("fast-breadcrumb-item:nth-of-type(2) a")
).not.hasAttribute("aria-current");
).not.toHaveAttribute("aria-current");
});
});

Просмотреть файл

@ -33,13 +33,13 @@ test.describe("Button", () => {
`;
});
await expect(control).toHaveBooleanAttribute("disabled");
await expect(control).toHaveAttribute("disabled");
await element.evaluate(node => {
node.toggleAttribute("disabled");
});
await expect(control).not.toHaveBooleanAttribute("disabled");
await expect(control).not.toHaveAttribute("disabled");
});
test("should set the `formnovalidate` attribute on the internal control", async () => {
@ -49,13 +49,13 @@ test.describe("Button", () => {
`;
});
await expect(control).toHaveBooleanAttribute("formnovalidate");
await expect(control).toHaveAttribute("formnovalidate");
await element.evaluate(node => {
node.toggleAttribute("formnovalidate");
});
await expect(control).not.toHaveBooleanAttribute("formnovalidate");
await expect(control).not.toHaveAttribute("formnovalidate");
});
test.describe("should set the attribute on the internal control", () => {
@ -130,13 +130,13 @@ test.describe("Button", () => {
`;
});
await expect(control).toHaveBooleanAttribute("autofocus");
await expect(control).toHaveAttribute("autofocus");
await element.evaluate(node => {
node.toggleAttribute("autofocus");
});
await expect(control).not.toHaveBooleanAttribute("autofocus");
await expect(control).not.toHaveAttribute("autofocus");
});
test("of type `submit` should submit the parent form when clicked", async () => {

Просмотреть файл

@ -53,7 +53,7 @@ test.describe("Checkbox", () => {
`;
});
await expect(element).not.toHaveBooleanAttribute("checked");
await expect(element).not.toHaveAttribute("checked");
await expect(element).toHaveAttribute("aria-checked", "false");
});
@ -81,7 +81,7 @@ test.describe("Checkbox", () => {
`;
});
await expect(element).not.toHaveBooleanAttribute("required");
await expect(element).not.toHaveAttribute("required");
await expect(element).toHaveAttribute("aria-required", "false");
});
@ -113,7 +113,7 @@ test.describe("Checkbox", () => {
`;
});
await expect(element).not.toHaveBooleanAttribute("disabled");
await expect(element).not.toHaveAttribute("disabled");
await expect(element).toHaveAttribute("aria-disabled", "false");
});

Просмотреть файл

@ -76,7 +76,7 @@ test.describe("Combobox", () => {
`;
});
await expect(element).not.hasAttribute("tabindex");
await expect(element).not.toHaveAttribute("tabindex");
await element.evaluate((node: FASTCombobox) => {
node.disabled = false;
@ -160,13 +160,13 @@ test.describe("Combobox", () => {
const options = element.locator("fast-option");
await expect(control).not.hasAttribute("aria-activedescendant");
await expect(control).not.toHaveAttribute("aria-activedescendant");
await element.evaluate((node: FASTCombobox) => {
node.open = true;
});
await expect(element).toHaveAttribute("aria-activedescendant", "");
await expect(element).not.toHaveAttribute("aria-activedescendant");
const optionsCount = await options.count();
@ -186,9 +186,9 @@ test.describe("Combobox", () => {
node.value = "other";
});
await expect(control).hasAttribute("aria-activedescendant");
await expect(control).toHaveAttribute("aria-activedescendant");
await expect(element).toHaveAttribute("aria-activedescendant", "");
await expect(element).not.toHaveAttribute("aria-activedescendant");
});
test("should set its value to the first option with the `selected` attribute present", async () => {
@ -262,122 +262,114 @@ test.describe("Combobox", () => {
node.open = true;
});
await expect(element).toHaveBooleanAttribute("open");
await expect(element).toHaveAttribute("open");
await expect(listbox).toBeVisible();
});
test.describe(
"should NOT emit a 'change' event when the value changes by user input while open",
() => {
test("via arrow down key", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
test.describe("should NOT emit a 'change' event when the value changes by user input while open", () => {
test("via arrow down key", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
<fast-combobox>
<fast-option>Option 1</fast-option>
<fast-option>Option 2</fast-option>
<fast-option>Option 3</fast-option>
</fast-combobox>
`;
});
await element.click();
await element.locator(".listbox").waitFor({ state: "visible" });
await expect(element).toHaveBooleanAttribute("open");
const [wasChanged] = await Promise.all([
element.evaluate(node =>
Promise.race<boolean>([
new Promise(resolve => {
node.addEventListener("change", () => resolve(true));
}),
new Promise(resolve => setTimeout(() => resolve(false), 100)),
])
),
element.press("ArrowDown"),
]);
expect(wasChanged).toBeFalsy();
});
test("via arrow up key", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
await element.click();
await element.locator(".listbox").waitFor({ state: "visible" });
await expect(element).toHaveAttribute("open");
const [wasChanged] = await Promise.all([
element.evaluate(node =>
Promise.race<boolean>([
new Promise(resolve => {
node.addEventListener("change", () => resolve(true));
}),
new Promise(resolve => setTimeout(() => resolve(false), 100)),
])
),
element.press("ArrowDown"),
]);
expect(wasChanged).toBeFalsy();
});
test("via arrow up key", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
<fast-combobox>
<fast-option>Option 1</fast-option>
<fast-option>Option 2</fast-option>
<fast-option>Option 3</fast-option>
</fast-combobox>
`;
});
await element.evaluate((node: FASTCombobox) => {
node.value = "two";
});
await element.click();
await element.locator(".listbox").waitFor({ state: "visible" });
expect(
await element.evaluate(node => node.hasAttribute("open"))
).toBeTruthy();
const [wasChanged] = await Promise.all([
element.evaluate(node =>
Promise.race<boolean>([
new Promise(resolve => {
node.addEventListener("change", () => resolve(true));
}),
new Promise(resolve => setTimeout(() => resolve(false), 100)),
])
),
element.press("ArrowUp"),
]);
expect(wasChanged).toBeFalsy();
});
}
);
test.describe(
"should NOT emit a 'change' event when the value changes by programmatic interaction",
() => {
test("via end key", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
await element.evaluate((node: FASTCombobox) => {
node.value = "two";
});
await element.click();
await element.locator(".listbox").waitFor({ state: "visible" });
await expect(element).toHaveAttribute("open");
const [wasChanged] = await Promise.all([
element.evaluate(node =>
Promise.race<boolean>([
new Promise(resolve => {
node.addEventListener("change", () => resolve(true));
}),
new Promise(resolve => setTimeout(() => resolve(false), 100)),
])
),
element.press("ArrowUp"),
]);
expect(wasChanged).toBeFalsy();
});
});
test.describe("should NOT emit a 'change' event when the value changes by programmatic interaction", () => {
test("via end key", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
<fast-combobox>
<fast-option>Option 1</fast-option>
<fast-option>Option 2</fast-option>
<fast-option>Option 3</fast-option>
</fast-combobox>
`;
});
await element.evaluate((node: FASTCombobox) => {
node.value = "two";
});
const [wasChanged] = await Promise.all([
element.evaluate(node =>
Promise.race<boolean>([
new Promise(resolve => {
node.addEventListener("change", () => resolve(true));
}),
new Promise(resolve => setTimeout(() => resolve(false), 50)),
])
),
element.press("End"),
]);
expect(wasChanged).toBeFalsy();
await expect(element).toHaveJSProperty("value", "two");
});
}
);
await element.evaluate((node: FASTCombobox) => {
node.value = "two";
});
const [wasChanged] = await Promise.all([
element.evaluate(node =>
Promise.race<boolean>([
new Promise(resolve => {
node.addEventListener("change", () => resolve(true));
}),
new Promise(resolve => setTimeout(() => resolve(false), 50)),
])
),
element.press("End"),
]);
expect(wasChanged).toBeFalsy();
await expect(element).toHaveJSProperty("value", "two");
});
});
test.describe("when the owning form's reset() function is invoked", () => {
test("should reset the value property to its initial value", async () => {

Просмотреть файл

@ -41,13 +41,13 @@ test.describe("Dialog", () => {
node.hidden = true;
});
await expect(element).toHaveBooleanAttribute("hidden");
await expect(element).toHaveAttribute("hidden");
await element.evaluate((node: FASTDialog) => {
node.hidden = false;
});
await expect(element).not.toHaveBooleanAttribute("hidden");
await expect(element).not.toHaveAttribute("hidden");
});
test("should set the `aria-describedby` attribute on the control when provided", async () => {
@ -97,7 +97,7 @@ test.describe("Dialog", () => {
node.modal = false;
});
await expect(control).not.hasAttribute("aria-modal");
await expect(control).not.toHaveAttribute("aria-modal");
});
test('should add an overlay element with a `role` attribute of "presentation" when the `modal` property is true', async () => {
@ -127,13 +127,13 @@ test.describe("Dialog", () => {
node.noFocusTrap = true;
});
await expect(element).toHaveBooleanAttribute("no-focus-trap");
await expect(element).toHaveAttribute("no-focus-trap");
await element.evaluate((node: FASTDialog) => {
node.noFocusTrap = false;
});
await expect(element).not.toHaveBooleanAttribute("no-focus-trap");
await expect(element).not.toHaveAttribute("no-focus-trap");
});
test("should add the `hidden` attribute when the `hide()` method is invoked", async () => {
@ -143,7 +143,7 @@ test.describe("Dialog", () => {
await expect(element).toHaveJSProperty("hidden", false);
await expect(element).not.hasAttribute("hidden");
await expect(element).not.toHaveAttribute("hidden");
await element.evaluate((node: FASTDialog) => {
node.hide();
@ -159,7 +159,7 @@ test.describe("Dialog", () => {
await expect(element).toHaveJSProperty("hidden", true);
await expect(element).toHaveBooleanAttribute("hidden");
await expect(element).toHaveAttribute("hidden");
await element.evaluate((node: FASTDialog) => {
node.show();
@ -167,7 +167,7 @@ test.describe("Dialog", () => {
await expect(element).toHaveJSProperty("hidden", false);
await expect(element).not.toHaveBooleanAttribute("hidden");
await expect(element).not.toHaveAttribute("hidden");
});
test("should fire a 'dismiss' event when its overlay is clicked", async () => {

Просмотреть файл

@ -28,19 +28,19 @@ test.describe("Disclosure", () => {
});
test("should toggle the `expanded` attribute based on the value of the `expanded` property", async () => {
await expect(element).not.toHaveBooleanAttribute("expanded");
await expect(element).not.toHaveAttribute("expanded");
await element.evaluate((node: FASTDisclosure) => {
node.expanded = true;
});
await expect(element).toHaveBooleanAttribute("expanded");
await expect(element).toHaveAttribute("expanded");
await element.evaluate((node: FASTDisclosure) => {
node.expanded = false;
});
await expect(element).not.toHaveBooleanAttribute("expanded");
await expect(element).not.toHaveAttribute("expanded");
});
test("should set summary slot content to the value of the summary attribute", async () => {

Просмотреть файл

@ -77,7 +77,7 @@ test.describe("Flipper", () => {
await (await element.elementHandle())?.waitForElementState("stable");
await expect(element).not.hasAttribute("aria-disabled");
await expect(element).not.toHaveAttribute("aria-disabled");
});
test('should set the `tabindex` attribute to "-1" when `hiddenFromAT` is true', async () => {

Просмотреть файл

@ -359,7 +359,7 @@ test.describe("FormAssociated", () => {
await expect(element).toHaveJSProperty("currentValue", "foo");
await expect(element).not.hasAttribute("value");
await expect(element).not.toHaveAttribute("value");
await form.evaluate((node: HTMLFormElement) => {
node.reset();
@ -369,7 +369,7 @@ test.describe("FormAssociated", () => {
await expect(element).toHaveJSProperty("currentValue", "");
await expect(element).not.hasAttribute("value");
await expect(element).not.toHaveAttribute("value");
});
test("should reset it's value property to the value of the value attribute if it is set", async () => {

Просмотреть файл

@ -148,7 +148,7 @@ test.describe("HorizontalScroll", () => {
});
test.describe("Scrolling", () => {
test("should change scroll stop on resize", async () => {
test.fixme("should change scroll stop on resize", async () => {
await page.goto(
fixtureURL("horizontal-scroll--horizontal-scroll", { speed: 0 })
);

Просмотреть файл

@ -71,7 +71,7 @@ test.describe("ListboxOption", () => {
`;
});
await expect(element).not.hasAttribute("aria-checked");
await expect(element).not.toHaveAttribute("aria-checked");
await element.evaluate((node: FASTListboxOption) => {
node.checked = true;

Просмотреть файл

@ -46,7 +46,7 @@ test.describe("Listbox", () => {
`;
});
await expect(element).not.hasAttribute("tabindex");
await expect(element).not.toHaveAttribute("tabindex");
});
test("should select nothing when no options have the `selected` attribute", async () => {
@ -66,7 +66,7 @@ test.describe("Listbox", () => {
)
).toBe(false);
await expect(element).not.hasAttribute("value");
await expect(element).not.toHaveAttribute("value");
await expect(element).toHaveJSProperty("selectedIndex", -1);
});
@ -117,62 +117,59 @@ test.describe("Listbox", () => {
await expect(element).toHaveAttribute("size", "5");
});
test.describe(
"should set the `size` property to 0 when a negative value is set",
() => {
test("via the `size` property", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
test.describe("should set the `size` property to 0 when a negative value is set", () => {
test("via the `size` property", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
<fast-listbox>
<fast-option>Option 1</fast-option>
<fast-option>Option 2</fast-option>
<fast-option>Option 3</fast-option>
</fast-listbox>
`;
});
await element.evaluate((node: FASTListboxElement) => {
node.size = 1;
});
await expect(element).toHaveJSProperty("size", 1);
await expect(element).toHaveAttribute("size", "1");
await element.evaluate((node: FASTListboxElement) => {
node.size = -1;
});
await expect(element).toHaveJSProperty("size", 0);
await expect(element).toHaveAttribute("size", "0");
});
test("via the `size` attribute", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
await element.evaluate((node: FASTListboxElement) => {
node.size = 1;
});
await expect(element).toHaveJSProperty("size", 1);
await expect(element).toHaveAttribute("size", "1");
await element.evaluate((node: FASTListboxElement) => {
node.size = -1;
});
await expect(element).toHaveJSProperty("size", 0);
await expect(element).toHaveAttribute("size", "0");
});
test("via the `size` attribute", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
<fast-listbox>
<fast-option>Option 1</fast-option>
<fast-option>Option 2</fast-option>
<fast-option>Option 3</fast-option>
</fast-listbox>
`;
});
await element.evaluate((node: FASTListboxElement) =>
node.setAttribute("size", "1")
);
await expect(element).toHaveJSProperty("size", 1);
await expect(element).toHaveAttribute("size", "1");
await element.evaluate((node: FASTListboxElement) =>
node.setAttribute("size", "-1")
);
await expect(element).toHaveJSProperty("size", 0);
await expect(element).toHaveAttribute("size", "0");
});
}
);
await element.evaluate((node: FASTListboxElement) =>
node.setAttribute("size", "1")
);
await expect(element).toHaveJSProperty("size", 1);
await expect(element).toHaveAttribute("size", "1");
await element.evaluate((node: FASTListboxElement) =>
node.setAttribute("size", "-1")
);
await expect(element).toHaveJSProperty("size", 0);
await expect(element).toHaveAttribute("size", "0");
});
});
test("should set the `aria-setsize` and `aria-posinset` properties on slotted options", async () => {
await root.evaluate(node => {
@ -260,6 +257,6 @@ test.describe("Listbox", () => {
node.multiple = false;
});
await expect(element).not.hasAttribute("aria-multiselectable");
await expect(element).not.toHaveAttribute("aria-multiselectable");
});
});

Просмотреть файл

@ -33,27 +33,24 @@ test.describe("Menu item", () => {
await expect(element).toHaveAttribute("role", MenuItemRole.menuitem);
});
test.describe(
"should include a matching role when the `role` property is provided",
() => {
let role: MenuItemRole;
for (role in MenuItemRole) {
test(role, async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
test.describe("should include a matching role when the `role` property is provided", () => {
let role: MenuItemRole;
for (role in MenuItemRole) {
test(role, async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
<fast-menu-item>Menu item</fast-menu-item>
`;
});
await element.evaluate(
(node: FASTMenuItem, role) => (node.role = role),
role
);
await expect(element).toHaveAttribute("role", role);
});
}
await element.evaluate(
(node: FASTMenuItem, role) => (node.role = role),
role
);
await expect(element).toHaveAttribute("role", role);
});
}
);
});
test("should set the `aria-disabled` attribute with the `disabled` value when provided", async () => {
await root.evaluate(node => {
@ -102,7 +99,7 @@ test.describe("Menu item", () => {
`;
});
await expect(element).hasAttribute("aria-checked", "false");
await expect(element).toHaveAttribute("aria-checked", "false");
await element.click();
@ -120,7 +117,7 @@ test.describe("Menu item", () => {
`;
});
await expect(element).hasAttribute("aria-checked", "false");
await expect(element).toHaveAttribute("aria-checked", "false");
await element.click();

Просмотреть файл

@ -1,5 +1,5 @@
import { expect, test } from "@playwright/test";
import type { Locator, Page } from "@playwright/test";
import { expect, test } from "@playwright/test";
import { fixtureURL } from "../__test__/helpers.js";
import type { FASTMenu } from "./menu.js";
@ -324,7 +324,7 @@ test.describe("Menu", () => {
await expect(menuItems.nth(3)).toHaveAttribute("aria-checked", "true");
});
test("should navigate the menu on arrow up/down keys", async () => {
test.fixme("should navigate the menu on arrow up/down keys", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
<fast-menu>
@ -359,8 +359,7 @@ test.describe("Menu", () => {
await expect(menuItems.nth(3)).toBeFocused();
});
test("should close the menu when pressing the escape key", async () => {
test.slow();
test.fixme("should close the menu when pressing the escape key", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
<fast-menu>

Просмотреть файл

@ -43,7 +43,7 @@ test.describe("NumberField", () => {
`;
});
await expect(control).toHaveBooleanAttribute("autofocus");
await expect(control).toHaveAttribute("autofocus");
});
test("should set the `disabled` attribute on the internal control", async () => {
@ -52,7 +52,7 @@ test.describe("NumberField", () => {
<fast-number-field disabled></fast-number-field>
`;
});
await expect(control).toHaveBooleanAttribute("disabled");
await expect(control).toHaveAttribute("disabled");
});
test("should set the `readonly` attribute on the internal control", async () => {
@ -61,7 +61,7 @@ test.describe("NumberField", () => {
<fast-number-field readonly></fast-number-field>
`;
});
await expect(control).toHaveBooleanAttribute("readonly");
await expect(control).toHaveAttribute("readonly");
});
test("should set the `required` attribute on the internal control", async () => {
@ -70,7 +70,7 @@ test.describe("NumberField", () => {
<fast-number-field required></fast-number-field>
`;
});
await expect(control).toHaveBooleanAttribute("required");
await expect(control).toHaveAttribute("required");
});
for (const [attribute, value] of Object.entries({

Просмотреть файл

@ -118,7 +118,7 @@ test.describe("Radio Group", () => {
`;
});
await expect(element).not.hasAttribute("aria-disabled");
await expect(element).not.toHaveAttribute("aria-disabled");
await element.evaluate<void, FASTRadioGroup>(node => {
node.disabled = true;
@ -150,7 +150,7 @@ test.describe("Radio Group", () => {
`;
});
await expect(element).not.hasAttribute("aria-readonly");
await expect(element).not.toHaveAttribute("aria-readonly");
await element.evaluate<void, FASTRadioGroup>(node => {
node.readOnly = true;
@ -172,7 +172,7 @@ test.describe("Radio Group", () => {
`;
});
await expect(element).not.hasAttribute("aria-disabled");
await expect(element).not.toHaveAttribute("aria-disabled");
});
test("should NOT modify child radio elements disabled state when the `disabled` attribute is present", async () => {
@ -186,7 +186,7 @@ test.describe("Radio Group", () => {
`;
});
await expect(element).not.toHaveBooleanAttribute("disabled");
await expect(element).not.toHaveAttribute("disabled");
const firstRadio = radios.nth(0);
const secondRadio = radios.nth(1);
@ -222,7 +222,7 @@ test.describe("Radio Group", () => {
element.evaluate<void, FASTRadioGroup>(node => node.setAttribute("disabled", ""));
await expect(element).toHaveBooleanAttribute("disabled");
await expect(element).toHaveAttribute("disabled");
expect(
await firstRadio.evaluate<boolean, FASTRadio>(radio =>
@ -259,7 +259,7 @@ test.describe("Radio Group", () => {
`;
});
await expect(element).toHaveBooleanAttribute("disabled");
await expect(element).toHaveAttribute("disabled");
await first.focus();
@ -306,7 +306,7 @@ test.describe("Radio Group", () => {
await element.evaluate<boolean, FASTRadioGroup>(node => (node.disabled = true));
await expect(element).toHaveBooleanAttribute("disabled");
await expect(element).toHaveAttribute("disabled");
for (let i = 0; i < radioItemsCount; i++) {
const item = radios.nth(i);
@ -436,9 +436,7 @@ test.describe("Radio Group", () => {
// radio-group explicitly sets non-matching radio's checked to false if
// a value match was found, but the attribute should still persist.
expect(
await radios.nth(1).evaluate(node => node.hasAttribute("checked"))
).toBeTruthy();
await expect(radios.nth(1)).toHaveAttribute("checked");
await expect(radios.nth(2)).not.toBeChecked();
});

Просмотреть файл

@ -90,7 +90,7 @@ test.describe("Radio", () => {
`;
});
await expect(element).toHaveAttribute("tabindex", "");
await expect(element).not.toHaveAttribute("tabindex");
});
test("should initialize to the initial value if no value property is set", async () => {

Просмотреть файл

@ -46,7 +46,7 @@ test.describe("Search", () => {
{ attribute }
);
await expect(element).toHaveBooleanAttribute(attribute);
await expect(element).toHaveAttribute(attribute);
});
}
});
@ -257,13 +257,13 @@ test.describe("Search", () => {
await expect(element).toHaveJSProperty("value", "test value");
await expect(element).not.hasAttribute("value");
await expect(element).not.toHaveAttribute("value");
await form.evaluate<void, HTMLFormElement>(node => {
node.reset();
});
await expect(element).not.hasAttribute("value");
await expect(element).not.toHaveAttribute("value");
await expect(element).toHaveJSProperty("value", "");
});

Просмотреть файл

@ -98,7 +98,7 @@ test.describe("Select", () => {
`;
});
await expect(element).not.hasAttribute("tabindex");
await expect(element).not.toHaveAttribute("tabindex");
});
test("should set its value to the first enabled option when disabled", async () => {
@ -278,7 +278,7 @@ test.describe("Select", () => {
const listbox = element.locator(".listbox");
await expect(element).toHaveBooleanAttribute("open");
await expect(element).toHaveAttribute("open");
await expect(listbox).toBeVisible();
});

Просмотреть файл

@ -30,7 +30,7 @@ test.describe("Slider label", () => {
`;
});
await expect(element).not.hasAttribute("aria-disabled");
await expect(element).not.toHaveAttribute("aria-disabled");
});
test("should set the `aria-disabled` attribute when the `disabled` property is true", async () => {

Просмотреть файл

@ -72,7 +72,7 @@ test.describe("Slider", () => {
`;
});
await expect(element).not.hasAttribute("aria-disabled");
await expect(element).not.toHaveAttribute("aria-disabled");
});
test("should set a default `aria-orientation` value when `orientation` is not defined", async () => {
@ -95,7 +95,7 @@ test.describe("Slider", () => {
`;
});
await expect(element).not.hasAttribute("aria-readonly");
await expect(element).not.toHaveAttribute("aria-readonly");
});
test("should initialize to the initial value if no value property is set", async () => {
@ -513,7 +513,7 @@ test.describe("Slider", () => {
node.value = "3";
});
await expect(element).toHaveAttribute("value", "");
await expect(element).not.toHaveAttribute("value");
await expect(element).toHaveJSProperty("value", "3");

Просмотреть файл

@ -69,7 +69,7 @@ test.describe("Switch", () => {
`;
});
await expect(element).not.hasAttribute("aria-readonly");
await expect(element).not.toHaveAttribute("aria-readonly");
});
test("should set the `aria-checked` attribute equal to the `checked` property", async () => {
@ -188,7 +188,7 @@ test.describe("Switch", () => {
`;
});
await expect(element).not.hasAttribute("tabindex");
await expect(element).not.toHaveAttribute("tabindex");
await element.evaluate((node: FASTSwitch) => {
node.disabled = false;
@ -343,7 +343,7 @@ test.describe("Switch", () => {
const form = page.locator("form");
await expect(element).not.toHaveBooleanAttribute("checked");
await expect(element).not.toHaveAttribute("checked");
await element.evaluate((node: FASTSwitch) => {
node.checked = true;
@ -369,7 +369,7 @@ test.describe("Switch", () => {
const form = page.locator("form");
await expect(element).toHaveBooleanAttribute("checked");
await expect(element).toHaveAttribute("checked");
await element.evaluate((node: FASTSwitch) => {
node.checked = false;

Просмотреть файл

@ -29,7 +29,7 @@ test.describe("Tab", () => {
});
test("should set the `aria-disabled` attribute when `disabled` is true", async () => {
await expect(element).not.hasAttribute("aria-disabled");
await expect(element).not.toHaveAttribute("aria-disabled");
await element.evaluate<void, FASTTab>(node => {
node.disabled = true;

Просмотреть файл

@ -291,11 +291,11 @@ test.describe("Tabs", () => {
const tabPanels = element.locator("fast-tab-panel");
await expect(tabPanels.nth(0)).not.toHaveBooleanAttribute("hidden");
await expect(tabPanels.nth(0)).not.toHaveAttribute("hidden");
await expect(tabPanels.nth(1)).toHaveBooleanAttribute("hidden");
await expect(tabPanels.nth(1)).toHaveAttribute("hidden");
await expect(tabPanels.nth(2)).toHaveBooleanAttribute("hidden");
await expect(tabPanels.nth(2)).toHaveAttribute("hidden");
});
});

Просмотреть файл

@ -43,7 +43,7 @@ test.describe("TextArea", () => {
`;
}, attribute);
await expect(control).toHaveBooleanAttribute(attribute);
await expect(control).toHaveAttribute(attribute);
});
}
});
@ -184,7 +184,7 @@ test.describe("TextArea", () => {
node.value = "foo";
});
await expect(element).not.hasAttribute("value");
await expect(element).not.toHaveAttribute("value");
await expect(element).toHaveJSProperty("value", "foo");
@ -192,7 +192,7 @@ test.describe("TextArea", () => {
node.reset();
});
await expect(element).not.hasAttribute("value");
await expect(element).not.toHaveAttribute("value");
await expect(element).toHaveJSProperty("value", "");
});

Просмотреть файл

@ -36,7 +36,7 @@ test.describe("TextField", () => {
`;
});
await expect(control).toHaveBooleanAttribute("autofocus");
await expect(control).toHaveAttribute("autofocus");
});
test("should set the `disabled` attribute on the internal control", async () => {
@ -46,7 +46,7 @@ test.describe("TextField", () => {
`;
});
await expect(control).toHaveBooleanAttribute("disabled");
await expect(control).toHaveAttribute("disabled");
});
test("should set the `readonly` attribute on the internal control", async () => {
@ -56,7 +56,7 @@ test.describe("TextField", () => {
`;
});
await expect(control).toHaveBooleanAttribute("readonly");
await expect(control).toHaveAttribute("readonly");
});
test("should set the `required` attribute on the internal control", async () => {
@ -66,7 +66,7 @@ test.describe("TextField", () => {
`;
});
await expect(control).toHaveBooleanAttribute("required");
await expect(control).toHaveAttribute("required");
});
test("should set the `spellcheck` attribute on the internal control", async () => {
@ -76,7 +76,7 @@ test.describe("TextField", () => {
`;
});
await expect(control).toHaveBooleanAttribute("spellcheck");
await expect(control).toHaveAttribute("spellcheck");
});
test.describe("should set the attribute on the internal control", () => {

Просмотреть файл

@ -73,7 +73,7 @@ test.describe("TreeItem", () => {
`;
});
await expect(element).not.hasAttribute("aria-expanded");
await expect(element).not.toHaveAttribute("aria-expanded");
});
test("should NOT set the `aria-expanded` attribute when the `expanded` state is true and the tree item has no children", async () => {
@ -83,13 +83,13 @@ test.describe("TreeItem", () => {
`;
});
await expect(element).not.hasAttribute("aria-expanded");
await expect(element).not.toHaveAttribute("aria-expanded");
await element.evaluate<void, FASTTreeItem>(node => {
node.expanded = true;
});
await expect(element).not.hasAttribute("aria-expanded");
await expect(element).not.toHaveAttribute("aria-expanded");
});
test("should NOT set the `aria-selected` attribute if `selected` value is not provided", async () => {
@ -99,7 +99,7 @@ test.describe("TreeItem", () => {
`;
});
await expect(element).not.hasAttribute("aria-selected");
await expect(element).not.toHaveAttribute("aria-selected");
});
test("should set the `aria-selected` attribute equal to the `selected` value", async () => {
@ -145,7 +145,7 @@ test.describe("TreeItem", () => {
`;
});
await expect(element).not.hasAttribute("aria-disabled");
await expect(element).not.toHaveAttribute("aria-disabled");
await element.evaluate<void, FASTTreeItem>(node => {
node.disabled = true;
@ -312,9 +312,9 @@ test.describe("TreeItem", () => {
await element.click({ force: true });
await expect(element).not.toHaveBooleanAttribute("selected");
await expect(element).not.toHaveAttribute("selected");
await expect(element).not.hasAttribute("aria-selected");
await expect(element).not.toHaveAttribute("aria-selected");
});
test("should fire an event when expanded state changes via the `expanded` attribute", async () => {

Просмотреть файл

@ -98,7 +98,7 @@ test.describe("TreeView", () => {
await expect(firstTreeItem).toHaveAttribute("aria-selected", "true");
});
test("should only allow one tree item to be selected at a time", async () => {
test.fixme("should only allow one tree item to be selected at a time", async () => {
await root.evaluate(node => {
node.innerHTML = /* html */ `
<fast-tree-view>
@ -167,7 +167,7 @@ test.describe("TreeView", () => {
await expandCollapseButton.click();
await expect(firstTreeItem).toHaveBooleanAttribute("expanded");
await expect(firstTreeItem).toHaveAttribute("expanded");
await expect(firstTreeItem).toHaveAttribute("aria-expanded", "true");

Просмотреть файл

@ -63,7 +63,7 @@
"@microsoft/fast-element": "^2.0.0-beta.26",
"@microsoft/fast-foundation": "^3.0.0-alpha.32",
"@microsoft/api-extractor": "7.24.2",
"@playwright/test": "^1.25.2",
"@playwright/test": "^1.41.2",
"@types/express": "^4.17.13",
"@types/node": "^17.0.17",
"chokidar-cli": "^3.0.0",

Просмотреть файл

@ -124,7 +124,7 @@
<script type="module" src="/fast-style.js"></script>
<fast-card style="width: 300px">
<!-- shadowroots must remain open for testing contained elements -->
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style
style-id="fast-card"
css=":host {
@ -149,7 +149,7 @@
Suspendisse volutpat auctor diam,vel mattis lorem venenatis in.
</p>
<fast-button>
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style
style-id="fast-button"
css=":host {
@ -197,7 +197,7 @@
</template>
</fast-card>
<fast-card style="width: 300px">
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-card"></fast-style>
<img src="/placeholder.png" />
<div style="padding: 0 10px 10px; color: var(--neutral-foreground-rest)">
@ -210,7 +210,7 @@
Suspendisse volutpat auctor diam,vel mattis lorem venenatis in.
</p>
<fast-button>
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-button"></fast-style>
<button class="control">
<span>Button</span>
@ -221,7 +221,7 @@
</template>
</fast-card>
<fast-card style="width: 300px">
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-card"></fast-style>
<img src="/placeholder.png" />
<div style="padding: 0 10px 10px; color: var(--neutral-foreground-rest)">
@ -234,7 +234,7 @@
Suspendisse volutpat auctor diam,vel mattis lorem venenatis in.
</p>
<fast-button>
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-button"></fast-style>
<button class="control">
<span>Button</span>
@ -245,7 +245,7 @@
</template>
</fast-card>
<fast-card style="width: 300px">
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-card"></fast-style>
<img src="/placeholder.png" />
<div style="padding: 0 10px 10px; color: var(--neutral-foreground-rest)">
@ -258,7 +258,7 @@
Suspendisse volutpat auctor diam,vel mattis lorem venenatis in.
</p>
<fast-button>
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-button"></fast-style>
<button class="control">
<span>Button</span>
@ -269,7 +269,7 @@
</template>
</fast-card>
<fast-card style="width: 300px">
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-card"></fast-style>
<img src="/placeholder.png" />
<div style="padding: 0 10px 10px; color: var(--neutral-foreground-rest)">
@ -282,7 +282,7 @@
Suspendisse volutpat auctor diam,vel mattis lorem venenatis in.
</p>
<fast-button>
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-button"></fast-style>
<button class="control">
<span>Button</span>
@ -293,7 +293,7 @@
</template>
</fast-card>
<fast-card style="width: 300px">
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-card"></fast-style>
<img src="/placeholder.png" />
<div style="padding: 0 10px 10px; color: var(--neutral-foreground-rest)">
@ -306,7 +306,7 @@
Suspendisse volutpat auctor diam,vel mattis lorem venenatis in.
</p>
<fast-button>
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-button"></fast-style>
<button class="control">
<span>Button</span>
@ -317,7 +317,7 @@
</template>
</fast-card>
<fast-card style="width: 300px">
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-card"></fast-style>
<img src="/placeholder.png" />
<div style="padding: 0 10px 10px; color: var(--neutral-foreground-rest)">
@ -330,7 +330,7 @@
Suspendisse volutpat auctor diam,vel mattis lorem venenatis in.
</p>
<fast-button>
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-button"></fast-style>
<button class="control">
<span>Button</span>
@ -341,7 +341,7 @@
</template>
</fast-card>
<fast-card style="width: 300px">
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-card"></fast-style>
<img src="/placeholder.png" />
<div style="padding: 0 10px 10px; color: var(--neutral-foreground-rest)">
@ -354,7 +354,7 @@
Suspendisse volutpat auctor diam,vel mattis lorem venenatis in.
</p>
<fast-button>
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-button"></fast-style>
<button class="control">
<span>Button</span>
@ -365,7 +365,7 @@
</template>
</fast-card>
<fast-card style="width: 300px">
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-card"></fast-style>
<img src="/placeholder.png" />
<div style="padding: 0 10px 10px; color: var(--neutral-foreground-rest)">
@ -378,7 +378,7 @@
Suspendisse volutpat auctor diam,vel mattis lorem venenatis in.
</p>
<fast-button>
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-button"></fast-style>
<button class="control">
<span>Button</span>
@ -389,7 +389,7 @@
</template>
</fast-card>
<fast-card style="width: 300px">
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-card"></fast-style>
<img src="/placeholder.png" />
<div style="padding: 0 10px 10px; color: var(--neutral-foreground-rest)">
@ -402,7 +402,7 @@
Suspendisse volutpat auctor diam,vel mattis lorem venenatis in.
</p>
<fast-button>
<template shadowroot="open">
<template shadowrootmode="open">
<fast-style style-id="fast-button"></fast-style>
<button class="control">
<span>Button</span>

Просмотреть файл

@ -1784,14 +1784,7 @@
dependencies:
jest-get-type "^29.2.0"
"@jest/schemas@^29.0.0":
version "29.0.0"
resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a"
integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==
dependencies:
"@sinclair/typebox" "^0.24.1"
"@jest/schemas@^29.4.3":
"@jest/schemas@^29.0.0", "@jest/schemas@^29.4.3":
version "29.4.3"
resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788"
integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==
@ -1840,19 +1833,7 @@
"@types/yargs" "^15.0.0"
chalk "^4.0.0"
"@jest/types@^29.2.1":
version "29.2.1"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.2.1.tgz#ec9c683094d4eb754e41e2119d8bdaef01cf6da0"
integrity sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==
dependencies:
"@jest/schemas" "^29.0.0"
"@types/istanbul-lib-coverage" "^2.0.0"
"@types/istanbul-reports" "^3.0.0"
"@types/node" "*"
"@types/yargs" "^17.0.8"
chalk "^4.0.0"
"@jest/types@^29.5.0":
"@jest/types@^29.2.1", "@jest/types@^29.5.0":
version "29.5.0"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593"
integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==
@ -3516,13 +3497,12 @@
os-homedir "^1.0.1"
regexpu-core "^4.5.4"
"@playwright/test@^1.25.2":
version "1.25.2"
resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.25.2.tgz#e726cf4844f096315c3954fdb3abf295cede43ba"
integrity sha512-6qPznIR4Fw02OMbqXUPMG6bFFg1hDVNEdihKy0t9K0dmRbus1DyP5Q5XFQhGwEHQkLG5hrSfBuu9CW/foqhQHQ==
"@playwright/test@^1.41.2":
version "1.41.2"
resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.41.2.tgz#bd9db40177f8fd442e16e14e0389d23751cdfc54"
integrity sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==
dependencies:
"@types/node" "*"
playwright-core "1.25.2"
playwright "1.41.2"
"@polka/url@^1.0.0-next.20":
version "1.0.0-next.21"
@ -3637,11 +3617,6 @@
resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df"
integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
"@sinclair/typebox@^0.24.1":
version "0.24.50"
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.50.tgz#35ee4db4ab8f3a8ff56490c51f92445d2776451e"
integrity sha512-k8ETQOOQDg5FtK7y9KJWpsGLik+QlPmIi8zzl/dGUgshV2QitprkFlCR/AemjWOTyKn9UwSSGRTzLVotvgCjYQ==
"@sinclair/typebox@^0.25.16":
version "0.25.24"
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718"
@ -11004,6 +10979,11 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
fsevents@2.3.2, fsevents@^2.1.2, fsevents@~2.3.1, fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
fsevents@^1.2.7:
version "1.2.13"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
@ -11012,11 +10992,6 @@ fsevents@^1.2.7:
bindings "^1.5.0"
nan "^2.12.1"
fsevents@^2.1.2, fsevents@~2.3.1, fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
fsevents@~2.1.1:
version "2.1.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
@ -13177,19 +13152,7 @@ jest-util@^26.6.2:
is-ci "^2.0.0"
micromatch "^4.0.2"
jest-util@^29.2.1:
version "29.2.1"
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.2.1.tgz#f26872ba0dc8cbefaba32c34f98935f6cf5fc747"
integrity sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==
dependencies:
"@jest/types" "^29.2.1"
"@types/node" "*"
chalk "^4.0.0"
ci-info "^3.2.0"
graceful-fs "^4.2.9"
picomatch "^2.2.3"
jest-util@^29.5.0:
jest-util@^29.2.1, jest-util@^29.5.0:
version "29.5.0"
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f"
integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==
@ -16814,10 +16777,19 @@ pkg-up@^4.0.0:
dependencies:
find-up "^6.2.0"
playwright-core@1.25.2:
version "1.25.2"
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.25.2.tgz#ea4baa398a4d45fcdfe48799482b599e3d0f033f"
integrity sha512-0yTbUE9lIddkEpLHL3u8PoCL+pWiZtj5A/j3U7YoNjcmKKDGBnCrgHJMzwd2J5vy6l28q4ki3JIuz7McLHhl1A==
playwright-core@1.41.2:
version "1.41.2"
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.41.2.tgz#db22372c708926c697acc261f0ef8406606802d9"
integrity sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==
playwright@1.41.2:
version "1.41.2"
resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.41.2.tgz#4e760b1c79f33d9129a8c65cc27953be6dd35042"
integrity sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==
dependencies:
playwright-core "1.41.2"
optionalDependencies:
fsevents "2.3.2"
please-upgrade-node@^3.2.0:
version "3.2.0"