diff --git a/ketcher-autotests/package.json b/ketcher-autotests/package.json index bdeac19ab2..7fed4b36b6 100644 --- a/ketcher-autotests/package.json +++ b/ketcher-autotests/package.json @@ -24,7 +24,7 @@ "author": "Nitvex", "license": "ISC", "devDependencies": { - "@playwright/test": "1.37.0", + "@playwright/test": "^1.37.0", "eslint": "^8.44.0", "lint-staged": "^13.1.2", "prettier": "2.8.4" diff --git a/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Erase-Tool/erase-tool.spec.ts b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Erase-Tool/erase-tool.spec.ts index 60b851ba7f..0742dae422 100644 --- a/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Erase-Tool/erase-tool.spec.ts +++ b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Erase-Tool/erase-tool.spec.ts @@ -1,5 +1,10 @@ import { expect, test } from '@playwright/test'; -import { selectAction, selectTool, takeEditorScreenshot } from '@utils/canvas'; +import { + selectAction, + selectTool, + takeEditorScreenshot, + takeLeftToolbarScreenshot, +} from '@utils/canvas'; import { getLeftAtomByAttributes } from '@utils/canvas/atoms'; import { getLeftBondByAttributes } from '@utils/canvas/bonds'; import { BondType } from '@utils/canvas/types'; @@ -145,3 +150,24 @@ test.describe('Erase Tool', () => { expect(arrowOnCanvas).toEqual(reactionArrow); }); }); + +test.describe('Erase Tool', () => { + test.beforeEach(async ({ page }) => { + await waitForPageInit(page); + }); + + test.afterEach(async ({ page }) => { + await takeLeftToolbarScreenshot(page); + }); + + test('Toolbar icon verification', async ({ page }) => { + /* + Test case: EPMLSOPKET-1362 + Description: The appropriate icon presents at the Toolbar for Erase tool. + */ + await openFileAndAddToCanvas( + 'Rxn-V2000/benzene-bromobutane-reaction.rxn', + page, + ); + }); +}); diff --git a/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Erase-Tool/erase-tool.spec.ts-snapshots/Erase-Tool-Toolbar-icon-verification-1-chromium-linux.png b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Erase-Tool/erase-tool.spec.ts-snapshots/Erase-Tool-Toolbar-icon-verification-1-chromium-linux.png new file mode 100644 index 0000000000..1c662d7878 Binary files /dev/null and b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Erase-Tool/erase-tool.spec.ts-snapshots/Erase-Tool-Toolbar-icon-verification-1-chromium-linux.png differ diff --git a/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts new file mode 100644 index 0000000000..48b19e6aa7 --- /dev/null +++ b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts @@ -0,0 +1,54 @@ +import { test } from '@playwright/test'; +import { + selectTopPanelButton, + openFileAndAddToCanvas, + TopPanelButton, + takeEditorScreenshot, + waitForPageInit, +} from '@utils'; + +test.describe('Layout', () => { + test.beforeEach(async ({ page }) => { + await waitForPageInit(page); + }); + + test.afterEach(async ({ page }) => { + await takeEditorScreenshot(page); + }); + + test('Structures are displayed in the middle of the screen after clicks "Layout" button', async ({ + page, + }) => { + /* + Test case: EPMLSOPKET-16884 + Description: The structures are displayed orderly in the middle of the screen + */ + await openFileAndAddToCanvas('KET/calculated-values-chain.ket', page); + await selectTopPanelButton(TopPanelButton.Layout, page); + }); + + test('Molecular structures are displayed in the middle of the screen after clicks "Ctrl+L"', async ({ + page, + }) => { + /* + Test case: EPMLSOPKET-16885 + Description: The structures are displayed orderly in the middle of the screen + */ + await openFileAndAddToCanvas('KET/two-atoms-and-bond.ket', page); + await page.keyboard.press('Control+l'); + }); + + test('The reaction is displayed in the middle of the screen after clicks "Layout" button', async ({ + page, + }) => { + /* + Test case: EPMLSOPKET-16886 + Description: The structures are displayed orderly in the middle of the screen + */ + await openFileAndAddToCanvas( + 'KET/two-templates-rings-and-functional-groups.ket', + page, + ); + await selectTopPanelButton(TopPanelButton.Layout, page); + }); +}); diff --git a/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts-snapshots/Layout-Molecular-structures-are-displayed-in-the-middle-of-the-screen-after-clicks-Ctrl-L-1-chromium-linux.png b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts-snapshots/Layout-Molecular-structures-are-displayed-in-the-middle-of-the-screen-after-clicks-Ctrl-L-1-chromium-linux.png new file mode 100644 index 0000000000..b92fe0569e Binary files /dev/null and b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts-snapshots/Layout-Molecular-structures-are-displayed-in-the-middle-of-the-screen-after-clicks-Ctrl-L-1-chromium-linux.png differ diff --git a/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts-snapshots/Layout-Structures-are-displayed-in-the-middle-of-the-screen-after-clicks-Layout-button-1-chromium-linux.png b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts-snapshots/Layout-Structures-are-displayed-in-the-middle-of-the-screen-after-clicks-Layout-button-1-chromium-linux.png new file mode 100644 index 0000000000..cabd7b1b37 Binary files /dev/null and b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts-snapshots/Layout-Structures-are-displayed-in-the-middle-of-the-screen-after-clicks-Layout-button-1-chromium-linux.png differ diff --git a/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts-snapshots/Layout-The-reaction-is-displayed-in-the-middle-of-the-screen-after-clicks-Layout-button-1-chromium-linux.png b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts-snapshots/Layout-The-reaction-is-displayed-in-the-middle-of-the-screen-after-clicks-Layout-button-1-chromium-linux.png new file mode 100644 index 0000000000..198dde4e72 Binary files /dev/null and b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Layout/layout-tool.spec.ts-snapshots/Layout-The-reaction-is-displayed-in-the-middle-of-the-screen-after-clicks-Layout-button-1-chromium-linux.png differ diff --git a/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Track-Changes/track-changes.spec.ts b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Track-Changes/track-changes.spec.ts new file mode 100644 index 0000000000..f7d89f2cab --- /dev/null +++ b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Track-Changes/track-changes.spec.ts @@ -0,0 +1,56 @@ +import { test } from '@playwright/test'; +import { + selectTopPanelButton, + TopPanelButton, + takeEditorScreenshot, + waitForPageInit, + selectAtomInToolbar, + AtomButton, +} from '@utils'; + +test.describe('Track Changes', () => { + test.beforeEach(async ({ page }) => { + await waitForPageInit(page); + }); + + test('Track 32 steps (Undo,Redo action)', async ({ page }) => { + /* + Test case: EPMLSOPKET-1989 + Description: Add Nitrogen atom to canvas 35 times and then press Undo 32 times + */ + + const atomType = AtomButton.Nitrogen; + + const addAtom = async (x: number, y: number) => { + await selectAtomInToolbar(atomType, page); + await page.mouse.click(x, y); + }; + + const numberOfRows = 6; + const numberOfColumns = 8; + const step = 100; + const coordinates = []; + + for (let row = 0; row < numberOfRows; row++) { + for (let column = 0; column < numberOfColumns; column++) { + coordinates.push({ x: column * step, y: row * step }); + } + } + + for (const { x, y } of coordinates) { + await addAtom(x, y); + } + + const maxUndoHistorySize = 32; + for (let i = 0; i < maxUndoHistorySize; i++) { + await selectTopPanelButton(TopPanelButton.Undo, page); + } + await takeEditorScreenshot(page); + + const maxRedoHistorySize = 32; + for (let i = 0; i < maxRedoHistorySize; i++) { + await selectTopPanelButton(TopPanelButton.Redo, page); + } + await takeEditorScreenshot(page); + }); +}); diff --git a/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Track-Changes/track-changes.spec.ts-snapshots/Track-Changes-Track-32-steps-Undo-Redo-action-1-chromium-linux.png b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Track-Changes/track-changes.spec.ts-snapshots/Track-Changes-Track-32-steps-Undo-Redo-action-1-chromium-linux.png new file mode 100644 index 0000000000..1a4dc5e8e3 Binary files /dev/null and b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Track-Changes/track-changes.spec.ts-snapshots/Track-Changes-Track-32-steps-Undo-Redo-action-1-chromium-linux.png differ diff --git a/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Track-Changes/track-changes.spec.ts-snapshots/Track-Changes-Track-32-steps-Undo-Redo-action-2-chromium-linux.png b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Track-Changes/track-changes.spec.ts-snapshots/Track-Changes-Track-32-steps-Undo-Redo-action-2-chromium-linux.png new file mode 100644 index 0000000000..5d98a9e339 Binary files /dev/null and b/ketcher-autotests/tests/Structure-Creating-&-Editing/Actions-With-Structures/Track-Changes/track-changes.spec.ts-snapshots/Track-Changes-Track-32-steps-Undo-Redo-action-2-chromium-linux.png differ diff --git a/ketcher-autotests/tests/test-data/KET/two-atoms-and-bond.ket b/ketcher-autotests/tests/test-data/KET/two-atoms-and-bond.ket new file mode 100644 index 0000000000..6a9a98d9bb --- /dev/null +++ b/ketcher-autotests/tests/test-data/KET/two-atoms-and-bond.ket @@ -0,0 +1,71 @@ +{ + "root": { + "nodes": [ + { + "$ref": "mol0" + }, + { + "$ref": "mol1" + }, + { + "$ref": "mol2" + } + ] + }, + "mol0": { + "type": "molecule", + "atoms": [ + { + "label": "N", + "location": [ + 1.4500000000000002, + -2.0500000000000003, + 0 + ] + } + ] + }, + "mol1": { + "type": "molecule", + "atoms": [ + { + "label": "O", + "location": [ + 22, + -7.875, + 0 + ] + } + ] + }, + "mol2": { + "type": "molecule", + "atoms": [ + { + "label": "C", + "location": [ + 3.266987298107781, + -13.5, + 0 + ] + }, + { + "label": "C", + "location": [ + 4.13301270189222, + -13, + 0 + ] + } + ], + "bonds": [ + { + "type": 1, + "atoms": [ + 0, + 1 + ] + } + ] + } +} \ No newline at end of file diff --git a/ketcher-autotests/tests/test-data/KET/two-templates-rings-and-functional-groups.ket b/ketcher-autotests/tests/test-data/KET/two-templates-rings-and-functional-groups.ket new file mode 100644 index 0000000000..e1256f94a1 --- /dev/null +++ b/ketcher-autotests/tests/test-data/KET/two-templates-rings-and-functional-groups.ket @@ -0,0 +1,538 @@ +{ + "root": { + "nodes": [ + { + "$ref": "mol0" + }, + { + "$ref": "mol1" + }, + { + "$ref": "mol2" + }, + { + "$ref": "mol3" + }, + { + "$ref": "mol4" + }, + { + "$ref": "mol5" + }, + { + "type": "arrow", + "data": { + "mode": "open-angle", + "pos": [ + { + "x": 4.375, + "y": -13.175, + "z": 0 + }, + { + "x": 7.82943555447196, + "y": -13.175, + "z": 0 + } + ] + } + } + ] + }, + "mol0": { + "type": "molecule", + "atoms": [ + { + "label": "C", + "location": [ + 1.8348491521285664, + -12.675074417174608, + 0 + ] + }, + { + "label": "C", + "location": [ + 3.5651508478714344, + -12.674589229177204, + 0 + ] + }, + { + "label": "C", + "location": [ + 2.7016375094912393, + -12.174966888850188, + 0 + ] + }, + { + "label": "C", + "location": [ + 3.5651508478714344, + -13.675532067822148, + 0 + ] + }, + { + "label": "C", + "location": [ + 1.8348491521285664, + -13.680020056798138, + 0 + ] + }, + { + "label": "C", + "location": [ + 2.7038208554795586, + -14.175033111149814, + 0 + ] + } + ], + "bonds": [ + { + "type": 2, + "atoms": [ + 2, + 0 + ] + }, + { + "type": 2, + "atoms": [ + 3, + 1 + ] + }, + { + "type": 1, + "atoms": [ + 0, + 4 + ] + }, + { + "type": 1, + "atoms": [ + 1, + 2 + ] + }, + { + "type": 2, + "atoms": [ + 4, + 5 + ] + }, + { + "type": 1, + "atoms": [ + 5, + 3 + ] + } + ] + }, + "mol1": { + "type": "molecule", + "atoms": [ + { + "label": "C", + "location": [ + 20.17505003874321, + -1.7049537807495008, + 0 + ] + }, + { + "label": "C", + "location": [ + 20.67543747083789, + -3.2450462192504994, + 0 + ] + }, + { + "label": "C", + "location": [ + 20.984676903872398, + -2.2988135851594644, + 0 + ] + }, + { + "label": "C", + "location": [ + 19.674662606648532, + -3.2450462192504994, + 0 + ] + }, + { + "label": "C", + "location": [ + 19.365323096127604, + -2.2988135851594644, + 0 + ] + } + ], + "bonds": [ + { + "type": 1, + "atoms": [ + 0, + 4 + ] + }, + { + "type": 2, + "atoms": [ + 1, + 2 + ] + }, + { + "type": 1, + "atoms": [ + 2, + 0 + ] + }, + { + "type": 1, + "atoms": [ + 3, + 1 + ] + }, + { + "type": 2, + "atoms": [ + 4, + 3 + ] + } + ] + }, + "mol2": { + "type": "molecule", + "atoms": [ + { + "label": "C", + "location": [ + 8.534849152128567, + -12.675074417174608, + 0 + ] + }, + { + "label": "C", + "location": [ + 10.265150847871434, + -12.674589229177204, + 0 + ] + }, + { + "label": "C", + "location": [ + 9.40163750949124, + -12.174966888850188, + 0 + ] + }, + { + "label": "C", + "location": [ + 10.265150847871434, + -13.675532067822148, + 0 + ] + }, + { + "label": "C", + "location": [ + 8.534849152128567, + -13.680020056798138, + 0 + ] + }, + { + "label": "C", + "location": [ + 9.403820855479559, + -14.175033111149812, + 0 + ] + } + ], + "bonds": [ + { + "type": 2, + "atoms": [ + 2, + 0 + ] + }, + { + "type": 2, + "atoms": [ + 3, + 1 + ] + }, + { + "type": 1, + "atoms": [ + 0, + 4 + ] + }, + { + "type": 1, + "atoms": [ + 1, + 2 + ] + }, + { + "type": 2, + "atoms": [ + 4, + 5 + ] + }, + { + "type": 1, + "atoms": [ + 5, + 3 + ] + } + ] + }, + "mol3": { + "type": "molecule", + "atoms": [ + { + "label": "N", + "location": [ + 6.125, + -12.700000000000001, + 0 + ] + } + ] + }, + "mol4": { + "type": "molecule", + "atoms": [ + { + "label": "C", + "location": [ + 1.925, + -1.975, + 0 + ] + }, + { + "label": "O", + "location": [ + 2.4250036667338906, + -1.108993649216902, + 0 + ] + }, + { + "label": "O", + "location": [ + 2.4250036667338906, + -2.8410063507830983, + 0 + ] + }, + { + "label": "C", + "location": [ + 3.425011000201671, + -1.108993649216902, + 0 + ] + }, + { + "label": "C", + "location": [ + 4.425018333669453, + -1.108993649216902, + 0 + ] + }, + { + "label": "C", + "location": [ + 3.425011000201671, + -0.10898631574912088, + 0 + ] + }, + { + "label": "C", + "location": [ + 3.425011000201671, + -2.109000982684683, + 0 + ] + } + ], + "bonds": [ + { + "type": 1, + "atoms": [ + 0, + 1 + ] + }, + { + "type": 2, + "atoms": [ + 0, + 2 + ] + }, + { + "type": 1, + "atoms": [ + 1, + 3 + ] + }, + { + "type": 1, + "atoms": [ + 3, + 4 + ] + }, + { + "type": 1, + "atoms": [ + 3, + 5 + ] + }, + { + "type": 1, + "atoms": [ + 3, + 6 + ] + } + ], + "sgroups": [ + { + "type": "SUP", + "atoms": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ], + "name": "Boc", + "id": 0, + "attachmentPoints": [ + { + "attachmentAtom": 0, + "attachmentId": "" + } + ] + } + ] + }, + "mol5": { + "type": "molecule", + "atoms": [ + { + "label": "C", + "location": [ + 18.275000000000002, + -13.205000019073488, + 0 + ] + }, + { + "label": "Cl", + "location": [ + 18.275000000000002, + -12.281100491592762, + 0 + ] + }, + { + "label": "Cl", + "location": [ + 19.322749316090526, + -13.205000019073488, + 0 + ] + }, + { + "label": "Cl", + "location": [ + 17.246648843571254, + -13.205000019073488, + 0 + ] + } + ], + "bonds": [ + { + "type": 1, + "atoms": [ + 0, + 1 + ] + }, + { + "type": 1, + "atoms": [ + 0, + 2 + ] + }, + { + "type": 1, + "atoms": [ + 0, + 3 + ] + } + ], + "sgroups": [ + { + "type": "SUP", + "atoms": [ + 0, + 1, + 2, + 3 + ], + "name": "CCl3", + "expanded": true, + "id": 0, + "attachmentPoints": [ + { + "attachmentAtom": 0, + "attachmentId": "" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/ketcher-autotests/tests/utils/formats/formats.ts b/ketcher-autotests/tests/utils/formats/formats.ts index d082f2b9f7..8d4fa3b6ee 100644 --- a/ketcher-autotests/tests/utils/formats/formats.ts +++ b/ketcher-autotests/tests/utils/formats/formats.ts @@ -1,23 +1,23 @@ import { Page } from '@playwright/test'; import { MolfileFormat } from 'ketcher-core'; -export async function getKet(page: Page) { +export async function getKet(page: Page): Promise { return await page.evaluate(() => window.ketcher.getKet()); } -export async function getCml(page: Page) { +export async function getCml(page: Page): Promise { return await page.evaluate(() => window.ketcher.getCml()); } -export async function getCdxml(page: Page) { +export async function getCdxml(page: Page): Promise { return await page.evaluate(() => window.ketcher.getCDXml()); } -export async function getSmiles(page: Page) { +export async function getSmiles(page: Page): Promise { return await page.evaluate(() => window.ketcher.getSmiles()); } -export async function getInchi(page: Page) { +export async function getInchi(page: Page): Promise { return await page.evaluate(() => window.ketcher.getInchi()); } @@ -25,56 +25,71 @@ export async function getInChIKey(page: Page) { return await page.evaluate(() => window.ketcher.getInChIKey()); } -export async function getExtendedSmiles(page: Page) { +export async function getExtendedSmiles(page: Page): Promise { return await page.evaluate(() => window.ketcher.getSmiles(true)); } -export async function getMolfile(page: Page, fileFormat?: MolfileFormat) { +export async function getMolfile( + page: Page, + fileFormat?: MolfileFormat, +): Promise { return await page.evaluate( (fileFormat) => window.ketcher.getMolfile(fileFormat), fileFormat, ); } -export async function getRxn(page: Page, fileFormat?: MolfileFormat) { +export async function getRxn( + page: Page, + fileFormat?: MolfileFormat, +): Promise { return await page.evaluate( (fileFormat) => window.ketcher.getRxn(fileFormat), fileFormat, ); } -export async function getSmarts(page: Page) { +export async function getSmarts(page: Page): Promise { return await page.evaluate(() => window.ketcher.getSmarts()); } -export async function getSdf(page: Page, fileFormat: MolfileFormat = 'v2000') { +export async function getSdf( + page: Page, + fileFormat: MolfileFormat = 'v2000', +): Promise { return await page.evaluate( (fileFormat) => window.ketcher.getSdf(fileFormat), fileFormat, ); } -export async function setMolecule(page: Page, structStr: string) { +export async function setMolecule( + page: Page, + structStr: string, +): Promise { return await page.evaluate( (structStr) => window.ketcher.setMolecule(structStr), structStr, ); } -export async function addFragment(page: Page, structStr: string) { +export async function addFragment( + page: Page, + structStr: string, +): Promise { return await page.evaluate( (structStr) => window.ketcher.setMolecule(structStr), structStr, ); } -export async function enableDearomatizeOnLoad(page: Page) { +export async function enableDearomatizeOnLoad(page: Page): Promise { return await page.evaluate(() => window.ketcher.setSettings({ 'general.dearomatize-on-load': 'true' }), ); } -export async function disableQueryElements(page: Page) { +export async function disableQueryElements(page: Page): Promise { return await page.evaluate(() => { return window.ketcher.setSettings({ // TODO fix types for setSettings in Ketcher-core diff --git a/package-lock.json b/package-lock.json index 0165bf3b66..48f6cdc431 100644 --- a/package-lock.json +++ b/package-lock.json @@ -803,31 +803,12 @@ "ketcher-core": "*" }, "devDependencies": { - "@playwright/test": "1.37.0", + "@playwright/test": "^1.37.0", "eslint": "^8.44.0", "lint-staged": "^13.1.2", "prettier": "2.8.4" } }, - "ketcher-autotests/node_modules/@playwright/test": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.0.tgz", - "integrity": "sha512-181WBLk4SRUyH1Q96VZl7BP6HcK0b7lbdeKisn3N/vnjitk+9HbdlFz/L5fey05vxaAhldIDnzo8KUoy8S3mmQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "playwright-core": "1.37.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, "ketcher-autotests/node_modules/chalk": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", @@ -1052,18 +1033,6 @@ "node": ">=0.10" } }, - "ketcher-autotests/node_modules/playwright-core": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.0.tgz", - "integrity": "sha512-1c46jhTH/myQw6sesrcuHVtLoSNfJv8Pfy9t3rs6subY7kARv0HRw5PpyfPYPpPtQvBOmgbE6K+qgYUpj81LAA==", - "dev": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, "ketcher-autotests/node_modules/prettier": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", @@ -4608,6 +4577,25 @@ "node": ">= 8" } }, + "node_modules/@playwright/test": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.0.tgz", + "integrity": "sha512-181WBLk4SRUyH1Q96VZl7BP6HcK0b7lbdeKisn3N/vnjitk+9HbdlFz/L5fey05vxaAhldIDnzo8KUoy8S3mmQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "playwright-core": "1.37.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.4", "license": "MIT", @@ -17881,6 +17869,18 @@ "node": ">=4" } }, + "node_modules/playwright-core": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.0.tgz", + "integrity": "sha512-1c46jhTH/myQw6sesrcuHVtLoSNfJv8Pfy9t3rs6subY7kARv0HRw5PpyfPYPpPtQvBOmgbE6K+qgYUpj81LAA==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/playwright-testing": { "resolved": "ketcher-autotests", "link": true