diff --git a/e2e/account.spec.ts b/e2e/account.spec.ts index b9c95faf3d..1d42ee7b8f 100644 --- a/e2e/account.spec.ts +++ b/e2e/account.spec.ts @@ -1,8 +1,8 @@ -import { expect, test } from '@playwright/test' +import { expect } from '@playwright/test' import { testAuth } from './fixtures/authenticatedUserPages' import { goToDashboard } from './helpers/testUser' -test.describe('Account Settings', () => { +testAuth.describe('Account Settings', () => { testAuth('should show certification status', async ({ userPage }) => { await goToDashboard(userPage) diff --git a/e2e/discussions.spec.ts b/e2e/discussions.spec.ts index f24dc07d24..bd5f1840fc 100644 --- a/e2e/discussions.spec.ts +++ b/e2e/discussions.spec.ts @@ -1,4 +1,4 @@ -import { Page, expect, test } from '@playwright/test' +import { Page, expect } from '@playwright/test' import { defaultExpectTimeout } from '../playwright.config' import { testAuth } from './fixtures/authenticatedUserPages' import { @@ -109,7 +109,7 @@ const getDiscussionReplyActionButtons = (page: Page, threadReply: string) => { let userProject: Project const fileHandleIds: string[] = [] -test.describe('Discussions', () => { +testAuth.describe('Discussions', () => { testAuth.beforeAll(async ({ browser, storageStatePaths }) => { userProject = await setupProjectWithPermissions( browser, @@ -120,7 +120,7 @@ test.describe('Discussions', () => { }) testAuth.afterAll(async ({ browser }) => { - test.slow() + testAuth.slow() if (userProject.id) { await teardownProjectsAndFileHandles( browser, @@ -133,7 +133,7 @@ test.describe('Discussions', () => { testAuth( 'should allow discussion and reply CRUD', async ({ userPage, validatedUserPage }) => { - test.slow() + testAuth.slow() const threadTitle = 'The Title of the Thread' const threadBody = 'The body of the Thread' diff --git a/e2e/favorites.spec.ts b/e2e/favorites.spec.ts index a6754d59d6..ee51ff5813 100644 --- a/e2e/favorites.spec.ts +++ b/e2e/favorites.spec.ts @@ -1,4 +1,4 @@ -import { Page, expect, test } from '@playwright/test' +import { Page, expect } from '@playwright/test' import { testAuth } from './fixtures/authenticatedUserPages' import { entityUrlPathname } from './helpers/entities' import { @@ -41,7 +41,7 @@ function getFavoriteStarSpiner(page: Page) { return page.locator('.pageHeader').locator('.spinner:visible') } -test.describe('Favorites', () => { +testAuth.describe('Favorites', () => { testAuth('should be visible', async ({ userPage }) => { await goToDashboard(userPage) await goToFavorites(userPage) diff --git a/e2e/files.spec.ts b/e2e/files.spec.ts index 41c2697f77..6b09cb7d97 100644 --- a/e2e/files.spec.ts +++ b/e2e/files.spec.ts @@ -1,4 +1,4 @@ -import { Page, expect, test } from '@playwright/test' +import { Page, expect } from '@playwright/test' import path from 'path' import { defaultExpectTimeout } from '../playwright.config' import { testAuth } from './fixtures/authenticatedUserPages' @@ -178,13 +178,13 @@ const getFileMD5 = async (page: Page) => { let userProject: Project const fileHandleIds: string[] = [] -test.describe('Files', () => { +testAuth.describe('Files', () => { testAuth.beforeAll(async ({ browser, storageStatePaths }) => { userProject = await setupProject(browser, 'swc-e2e-user', storageStatePaths) }) testAuth.afterAll(async ({ browser }) => { - test.slow() + testAuth.slow() if (userProject.id) { await teardownProjectsAndFileHandles( browser, @@ -201,7 +201,7 @@ test.describe('Files', () => { // when there is a test timeout. Since test timeouts are expensive, // Playwright recommends skipping the test entirely with test.fixme. // See: https://github.com/microsoft/playwright/issues/16317 - test.fixme( + testAuth.fixme( browserName === 'webkit' && !!process.env.CI, `Very slow in webkit in CI only (passes after 6min in macos-latest runner, times out after 10min in Sage ubuntu-22.04-4core-16GBRAM-150GBSSD runner). @@ -345,7 +345,7 @@ test.describe('Files', () => { ) testAuth('should create and delete a file', async ({ userPage }) => { - test.slow() + testAuth.slow() const fileName = 'test_file.csv' const filePath = `data/${fileName}` diff --git a/e2e/homepage.spec.ts b/e2e/homepage.spec.ts index 052241f8bb..e8a5892e9c 100644 --- a/e2e/homepage.spec.ts +++ b/e2e/homepage.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from '@playwright/test' import { testAuth } from './fixtures/authenticatedUserPages' import { waitForInitialPageLoad } from './helpers/utils' -test.describe('Homepage', () => { +test.describe('Homepage - Unauthenticated', () => { test('should show Log In To Synapse button when logged out', async ({ page, }) => { @@ -16,7 +16,9 @@ test.describe('Homepage', () => { page.getByRole('link', { name: 'View Your Dashboard' }), ).toHaveCount(0) }) +}) +testAuth.describe('Homepage - Authenticated', () => { testAuth( 'should show View Your Dashboard button when logged in', async ({ userPage }) => { diff --git a/e2e/projects.spec.ts b/e2e/projects.spec.ts index d8d289aa22..8fd9e342cb 100644 --- a/e2e/projects.spec.ts +++ b/e2e/projects.spec.ts @@ -1,4 +1,4 @@ -import { Page, expect, test } from '@playwright/test' +import { Page, expect } from '@playwright/test' import { v4 as uuidv4 } from 'uuid' import { testAuth } from './fixtures/authenticatedUserPages' import { deleteProject, getEntityIdFromPathname } from './helpers/entities' @@ -21,9 +21,9 @@ async function createProject(page: Page, projectName: string) { // Run multiple describes in parallel, but run tests inside each describe in order // ...tests within describe expect afterAll to be run with the same users, i.e. on the same worker // https://playwright.dev/docs/api/class-test#test-describe-configure -test.describe.configure({ mode: 'serial' }) +testAuth.describe.configure({ mode: 'serial' }) -test.describe('Projects', () => { +testAuth.describe('Projects', () => { testAuth('should create a project', async ({ userPage }) => { await testAuth.step( 'should create a project with a unique name', @@ -80,7 +80,7 @@ test.describe('Projects', () => { }) testAuth.afterAll(async ({ browser }) => { - test.slow() + testAuth.slow() // if test failed before project was deleted, then delete project here if (projectId) { const context = await browser.newContext() diff --git a/e2e/tables.spec.ts b/e2e/tables.spec.ts index 915d6ecb2f..d7d2f2590d 100644 --- a/e2e/tables.spec.ts +++ b/e2e/tables.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test' +import { expect } from '@playwright/test' import { testAuth } from './fixtures/authenticatedUserPages' import { deleteEntity, generateEntityName } from './helpers/entities' import { @@ -44,13 +44,13 @@ let tableEntityId: string | undefined = undefined const noTablesText = 'There are no Tables associated with this project. Any Tables you create in this project will appear here' -test.describe('Tables', () => { +testAuth.describe('Tables', () => { testAuth.beforeAll(async ({ browser, storageStatePaths }) => { userProject = await setupProject(browser, 'swc-e2e-user', storageStatePaths) }) testAuth.afterAll(async ({ browser }) => { - test.slow() + testAuth.slow() if (tableEntityId) { const page = await browser.newPage() await deleteEntity(tableEntityId, true, getAdminPAT(), page) @@ -66,7 +66,7 @@ test.describe('Tables', () => { }) testAuth('should allow table CRUD', async ({ userPage }) => { - test.slow() + testAuth.slow() const tableName = generateEntityName('table') const tableDescription = 'table test description' @@ -129,21 +129,24 @@ test.describe('Tables', () => { reorder_quantity: '25', })) - await test.step('User goes to tables page', async () => { + await testAuth.step('User goes to tables page', async () => { await goToDashboardPage(userPage, getTablesPath(userProject.id)) await expectTablesPageLoaded(userPage, userProject.id) await expect(userPage.getByText(noTablesText)).toBeVisible() }) // TODO: remove this step after table descriptions are visible outide of experimental mode - await test.step('Toggle into Experimental Mode to use react-based table column schema editor', async () => { - await toggleIntoExperimentalMode(userPage) - await expectTablesPageLoaded(userPage, userProject.id) - await expect(userPage.getByText(noTablesText)).toBeVisible() - }) + await testAuth.step( + 'Toggle into Experimental Mode to use react-based table column schema editor', + async () => { + await toggleIntoExperimentalMode(userPage) + await expectTablesPageLoaded(userPage, userProject.id) + await expect(userPage.getByText(noTablesText)).toBeVisible() + }, + ) - await test.step('User creates a table', async () => { - await test.step('open table creation modal', async () => { + await testAuth.step('User creates a table', async () => { + await testAuth.step('open table creation modal', async () => { await userPage .getByRole('button', { name: 'Add Table or View' }) .click() @@ -157,7 +160,7 @@ test.describe('Tables', () => { .click() }) - await test.step('create table schema', async () => { + await testAuth.step('create table schema', async () => { await addColumnsFromColumnSchemaConfig( userPage, initialColumnsSchemaConfig, @@ -165,40 +168,43 @@ test.describe('Tables', () => { await userPage.getByRole('button', { name: 'Next' }).click() }) - await test.step('enter table name and description', async () => { + await testAuth.step('enter table name and description', async () => { await userPage.getByLabel('Name').fill(tableName) await userPage.getByLabel('Description').fill(tableDescription) await userPage.getByRole('button', { name: 'Finish' }).click() }) }) - await test.step('Table has been created with expected schema', async () => { - await expectTablePageLoaded(userPage, tableName, tableDescription) + await testAuth.step( + 'Table has been created with expected schema', + async () => { + await expectTablePageLoaded(userPage, tableName, tableDescription) - await test.step('get table entity id', async () => { - tableEntityId = - (await userPage - .getByRole('row') - .filter({ hasText: 'SynId' }) - .getByRole('cell') - .nth(1) - .textContent()) || undefined - expect(tableEntityId).not.toBeUndefined() - }) + await testAuth.step('get table entity id', async () => { + tableEntityId = + (await userPage + .getByRole('row') + .filter({ hasText: 'SynId' }) + .getByRole('cell') + .nth(1) + .textContent()) || undefined + expect(tableEntityId).not.toBeUndefined() + }) - await test.step('table is currently empty', async () => { - await expect( - userPage.getByRole('heading', { name: 'Items (0)' }), - ).toBeVisible() - await expect( - userPage.getByText('This table is currently empty'), - ).toBeVisible() - }) + await testAuth.step('table is currently empty', async () => { + await expect( + userPage.getByRole('heading', { name: 'Items (0)' }), + ).toBeVisible() + await expect( + userPage.getByText('This table is currently empty'), + ).toBeVisible() + }) - await expectTableSchemaCorrect(userPage, initialColumnsSchemaConfig) - }) + await expectTableSchemaCorrect(userPage, initialColumnsSchemaConfig) + }, + ) - await test.step('User adds data to the table', async () => { + await testAuth.step('User adds data to the table', async () => { await openTableEditor(userPage) await enterTableData( @@ -207,14 +213,15 @@ test.describe('Tables', () => { initialTableData, ) - await test.step('column type is enforced', async () => { + await testAuth.step('column type is enforced', async () => { const rowIndex = 2 const columnIndex = initialColumnsSchemaConfig.findIndex( config => config.name === 'quantity', ) - const cell = - await test.step('change value to the incorrect type', async () => { + const cell = await testAuth.step( + 'change value to the incorrect type', + async () => { const tableRows = getTableEditorRows(userPage) const cell = tableRows .nth(rowIndex + 1) // shift down for column headers @@ -222,9 +229,10 @@ test.describe('Tables', () => { .nth(columnIndex + 1) // shift right for checkboxes await enterTableValue(cell, 'STRING') return cell - }) + }, + ) - await test.step('saving table triggers an error', async () => { + await testAuth.step('saving table triggers an error', async () => { await userPage.getByRole('button', { name: 'Save' }).click() await expect(cell).toHaveText('Value must be an integer.') await expect( @@ -232,7 +240,7 @@ test.describe('Tables', () => { ).toBeVisible() }) - await test.step('fix error', async () => { + await testAuth.step('fix error', async () => { await enterTableValue(cell, initialTableData[rowIndex].quantity) }) }) @@ -249,19 +257,21 @@ test.describe('Tables', () => { ) }) - await test.step('User edits table schema', async () => { + await testAuth.step('User edits table schema', async () => { await openTableColumnSchema(userPage) - const tableSchemaEditorHeader = - await test.step('open table column schema editor modal', async () => { + const tableSchemaEditorHeader = await testAuth.step( + 'open table column schema editor modal', + async () => { await userPage.getByRole('button', { name: 'Edit Schema' }).click() const tableSchemaEditorHeader = userPage.getByRole('heading', { name: 'Edit Columns', }) await expect(tableSchemaEditorHeader).toBeVisible() return tableSchemaEditorHeader - }) + }, + ) - await test.step('add new columns', async () => { + await testAuth.step('add new columns', async () => { // wait for previously entered column schemas to appear // ...so addColumnsFromColumnSchemaConfig calculates correct starting column index await expect( @@ -275,7 +285,7 @@ test.describe('Tables', () => { ) }) - await test.step('save changes to table column schema', async () => { + await testAuth.step('save changes to table column schema', async () => { await userPage.getByRole('button', { name: 'Save' }).click() await expect(userPage.getByText('Saving...')).toBeVisible() @@ -292,30 +302,33 @@ test.describe('Tables', () => { await expectTableSchemaCorrect(userPage, updatedColumnsSchemaConfig) - await test.step('default value is automatically populated in newly created column', async () => { - await expectTableItemNumberCorrect(userPage, updatedTableData) - await expectTableDataCorrect( - userPage, - updatedColumnsSchemaConfig, - updatedTableData, - ) - }) + await testAuth.step( + 'default value is automatically populated in newly created column', + async () => { + await expectTableItemNumberCorrect(userPage, updatedTableData) + await expectTableDataCorrect( + userPage, + updatedColumnsSchemaConfig, + updatedTableData, + ) + }, + ) }) - await test.step('User queries the table', async () => { + await testAuth.step('User queries the table', async () => { const defaultQuery = getDefaultQuery(tableEntityId!) await toggleQueryEditor(userPage) - await test.step('current query matches table', async () => { + await testAuth.step('current query matches table', async () => { const queryInput = userPage.getByPlaceholder('Enter Query') await expect(queryInput).toHaveValue(defaultQuery) }) - await test.step('query table to select a single column', async () => { + await testAuth.step('query table to select a single column', async () => { const column = updatedColumnsSchemaConfig[0].name await runQuery(userPage, `SELECT ${column} FROM ${tableEntityId}`) - await test.step('confirm query results', async () => { + await testAuth.step('confirm query results', async () => { await confirmTableDataDimensions(userPage, updatedTableData.length, 1) await expectTableDataCorrect( userPage, @@ -327,32 +340,35 @@ test.describe('Tables', () => { }) }) - await test.step('query table to select rows where column greater than a value', async () => { - const value = 200 - const column = 'quantity' - await runQuery( - userPage, - `SELECT * FROM ${tableEntityId} WHERE ${column} > ${value}`, - ) - - await test.step('confirm query results', async () => { - const expectedData = updatedTableData.filter( - data => (data[column] as number) > value, - ) - await confirmTableDataDimensions( - userPage, - expectedData.length, - updatedColumnsSchemaConfig.length, - ) - await expectTableDataCorrect( + await testAuth.step( + 'query table to select rows where column greater than a value', + async () => { + const value = 200 + const column = 'quantity' + await runQuery( userPage, - updatedColumnsSchemaConfig, - expectedData, + `SELECT * FROM ${tableEntityId} WHERE ${column} > ${value}`, ) - }) - }) - await test.step('return table to default setup', async () => { + await testAuth.step('confirm query results', async () => { + const expectedData = updatedTableData.filter( + data => (data[column] as number) > value, + ) + await confirmTableDataDimensions( + userPage, + expectedData.length, + updatedColumnsSchemaConfig.length, + ) + await expectTableDataCorrect( + userPage, + updatedColumnsSchemaConfig, + expectedData, + ) + }) + }, + ) + + await testAuth.step('return table to default setup', async () => { await runQuery(userPage, defaultQuery, true) await expectTableDataCorrect( userPage, @@ -363,7 +379,7 @@ test.describe('Tables', () => { }) }) - await test.step('User updates data in the table', async () => { + await testAuth.step('User updates data in the table', async () => { const columnName = 'quantity' const rowIndex = updatedTableData.length - 1 const columnIndex = updatedColumnsSchemaConfig.findIndex( @@ -373,7 +389,7 @@ test.describe('Tables', () => { await openTableEditor(userPage) - await test.step('edit row value', async () => { + await testAuth.step('edit row value', async () => { const tableRows = getTableEditorRows(userPage) const cell = tableRows .nth(rowIndex + 1) // shift down for headers @@ -385,7 +401,7 @@ test.describe('Tables', () => { await saveTableDataChanges(userPage) await expectTablePageLoaded(userPage, tableName, tableDescription) - await test.step('updated data is displayed', async () => { + await testAuth.step('updated data is displayed', async () => { updatedTableData[rowIndex][columnName] = newValue await expectTableItemNumberCorrect(userPage, updatedTableData) await expectTableDataCorrect( @@ -396,13 +412,13 @@ test.describe('Tables', () => { }) }) - await test.step('User deletes the table', async () => { - await test.step('delete table', async () => { + await testAuth.step('User deletes the table', async () => { + await testAuth.step('delete table', async () => { await userPage.getByRole('button', { name: 'Table Tools' }).click() await userPage.getByRole('menuitem', { name: 'Delete Table' }).click() }) - await test.step('confirm deletion', async () => { + await testAuth.step('confirm deletion', async () => { await expect( userPage.getByRole('heading', { name: 'Confirm Deletion' }), ).toBeVisible() @@ -415,7 +431,7 @@ test.describe('Tables', () => { await dismissAlert(userPage, 'The Table was successfully deleted') }) - await test.step('no tables are shown on Tables tab', async () => { + await testAuth.step('no tables are shown on Tables tab', async () => { await userPage.waitForURL(getTablesPath(userProject.id)) await expect(userPage.getByText(noTablesText)).toBeVisible() }) diff --git a/e2e/teams.spec.ts b/e2e/teams.spec.ts index 8e9b70d894..bbc5085a55 100644 --- a/e2e/teams.spec.ts +++ b/e2e/teams.spec.ts @@ -1,4 +1,4 @@ -import { Page, expect, test } from '@playwright/test' +import { Page, expect } from '@playwright/test' import { v4 as uuidv4 } from 'uuid' import { defaultExpectTimeout } from '../playwright.config' import { testAuth } from './fixtures/authenticatedUserPages' @@ -52,9 +52,9 @@ let teamId: string | undefined = undefined // Run multiple describes in parallel, but run tests inside each describe in order // ...tests within describe expect afterAll to be run with the same users, i.e. on the same worker // https://playwright.dev/docs/api/class-test#test-describe-configure -test.describe.configure({ mode: 'serial' }) +testAuth.describe.configure({ mode: 'serial' }) -test.describe('Teams', () => { +testAuth.describe('Teams', () => { testAuth( 'should exercise team lifecycle', async ({ userPage, validatedUserPage }) => { @@ -123,7 +123,7 @@ test.describe('Teams', () => { }, ) - await test.step('user should view pending invitations', async () => { + await testAuth.step('user should view pending invitations', async () => { await expect(userPage.getByText('Pending Invitations')).toBeVisible({ timeout: defaultExpectTimeout * 3, // add extra timeout, so backend can finish sending request }) @@ -132,21 +132,26 @@ test.describe('Teams', () => { await expect(row.getByText(INVITATION_MESSAGE)).toBeVisible() }) - await test.step('validated user should accept team invitation', async () => { - await goToDashboard(validatedUserPage) + await testAuth.step( + 'validated user should accept team invitation', + async () => { + await goToDashboard(validatedUserPage) - await validatedUserPage.getByLabel('Teams').click() - await expectMyTeamsPageLoaded(validatedUserPage) + await validatedUserPage.getByLabel('Teams').click() + await expectMyTeamsPageLoaded(validatedUserPage) - // get row for this invitation - // ...in case multiple tests have invited validated user at the same time - const row = validatedUserPage.getByRole('row', { name: TEAM_NAME }) - await expect(row.getByText(INVITATION_MESSAGE)).toBeVisible() - await expect(row.getByRole('button', { name: 'Cancel' })).toBeVisible() + // get row for this invitation + // ...in case multiple tests have invited validated user at the same time + const row = validatedUserPage.getByRole('row', { name: TEAM_NAME }) + await expect(row.getByText(INVITATION_MESSAGE)).toBeVisible() + await expect( + row.getByRole('button', { name: 'Cancel' }), + ).toBeVisible() - await row.getByRole('button', { name: 'Join' }).click() - await expect(row).not.toBeVisible() - }) + await row.getByRole('button', { name: 'Join' }).click() + await expect(row).not.toBeVisible() + }, + ) await testAuth.step('validated user should view team page', async () => { const teamLink = validatedUserPage.getByRole('link', { @@ -218,15 +223,14 @@ test.describe('Teams', () => { ) testAuth.afterAll(async ({ userPage, validatedUserPage }) => { - test.slow() + testAuth.slow() // get credentials const adminPAT = getAdminPAT() const validatedUserId = await getUserIdFromLocalStorage(validatedUserPage) - const validatedUserAccessToken = await getAccessTokenFromCookie( - validatedUserPage, - ) + const validatedUserAccessToken = + await getAccessTokenFromCookie(validatedUserPage) const userUserId = await getUserIdFromLocalStorage(userPage) const userAccessToken = await getAccessTokenFromCookie(userPage) diff --git a/package.json b/package.json index 3d6eb4707c..ca0990c581 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "papaparse": "^5.4.1" }, "devDependencies": { - "@playwright/test": "^1.40.1", + "@playwright/test": "^1.42.1", "@prettier/plugin-xml": "^3.1.0", "@sage-bionetworks/synapse-types": "^0.0.2", "@types/node": "18.6.5", diff --git a/yarn.lock b/yarn.lock index 654981e221..f40c5b4311 100644 --- a/yarn.lock +++ b/yarn.lock @@ -507,12 +507,12 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@playwright/test@^1.40.1": - version "1.42.0" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.42.0.tgz#f65a7dcb92f202f376a7538e71855d873d1e6aa2" - integrity sha512-2k1HzC28Fs+HiwbJOQDUwrWMttqSLUVdjCqitBOjdCD0svWOMQUVqrXX6iFD7POps6xXAojsX/dGBpKnjZctLA== +"@playwright/test@^1.42.1": + version "1.42.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.42.1.tgz#9eff7417bcaa770e9e9a00439e078284b301f31c" + integrity sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ== dependencies: - playwright "1.42.0" + playwright "1.42.1" "@plotly/d3-sankey-circular@0.33.1": version "0.33.1" @@ -3933,17 +3933,17 @@ pidtree@0.6.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== -playwright-core@1.42.0: - version "1.42.0" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.42.0.tgz#bc6525268b13b8bed5fbead761a1a886984555c4" - integrity sha512-0HD9y8qEVlcbsAjdpBaFjmaTHf+1FeIddy8VJLeiqwhcNqGCBe4Wp2e8knpqiYbzxtxarxiXyNDw2cG8sCaNMQ== +playwright-core@1.42.1: + version "1.42.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.42.1.tgz#13c150b93c940a3280ab1d3fbc945bc855c9459e" + integrity sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA== -playwright@1.42.0: - version "1.42.0" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.42.0.tgz#6d4265b124d2b87432083aa7af30c46aaec5e703" - integrity sha512-Ko7YRUgj5xBHbntrgt4EIw/nE//XBHOKVKnBjO1KuZkmkhlbgyggTe5s9hjqQ1LpN+Xg+kHsQyt5Pa0Bw5XpvQ== +playwright@1.42.1: + version "1.42.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.42.1.tgz#79c828b51fe3830211137550542426111dc8239f" + integrity sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg== dependencies: - playwright-core "1.42.0" + playwright-core "1.42.1" optionalDependencies: fsevents "2.3.2"