diff --git a/.eslintrc.json b/.eslintrc.json index 9c44ada55..493880d86 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -53,14 +53,6 @@ { "name": "xdescribe", "message": "Calls to xdescribe is not allowed" - }, - { - "name": ["test", "only"], - "message": "Calls to test.only is not allowed" - }, - { - "name": ["describe", "only"], - "message": "Calls to describe.only is not allowed" } ], "license-header/header": [ @@ -327,12 +319,45 @@ } }, { - "files": ["*.spec.ts", "*.test.ts"], + "files": ["*.spec.ts", "*.test.ts", "*.e2e.ts"], "rules": { "@typescript-eslint/no-floating-promises": "warn", "@typescript-eslint/no-misused-promises": "warn", "max-lines": "off" } + }, + { + "files": ["*.e2e.ts"], + "extends": ["plugin:playwright/playwright-test"], + "rules": { + "no-empty-pattern": "off", + "playwright/expect-expect": "off", + "playwright/max-nested-describe": "off", + "playwright/missing-playwright-await": "error", + "playwright/no-conditional-expect": "off", + "playwright/no-conditional-in-test": "off", + "playwright/no-duplicate-hooks": "error", + "playwright/no-element-handle": "warn", + "playwright/no-eval": "warn", + "playwright/no-focused-test": "error", + "playwright/no-force-option": "warn", + "playwright/no-nested-step": "warn", + "playwright/no-networkidle": "error", + "playwright/no-page-pause": "warn", + "playwright/no-raw-locators": "warn", + "playwright/no-skipped-test": "error", + "playwright/no-standalone-expect": "error", + "playwright/no-unsafe-references": "error", + "playwright/no-useless-await": "warn", + "playwright/no-useless-not": "warn", + "playwright/no-wait-for-selector": "warn", + "playwright/no-wait-for-timeout": "off", + "playwright/prefer-web-first-assertions": "warn", + "playwright/valid-describe-callback": "error", + "playwright/valid-expect": "off", + "playwright/valid-expect-in-promise": "off", + "playwright/valid-title": "off" + } } ] } diff --git a/e2e/playwright/authentication/src/tests/general.e2e.ts b/e2e/playwright/authentication/src/tests/general.e2e.ts index 8bb2367c6..9193dad8e 100644 --- a/e2e/playwright/authentication/src/tests/general.e2e.ts +++ b/e2e/playwright/authentication/src/tests/general.e2e.ts @@ -53,9 +53,9 @@ test.describe('Create folders', () => { await folderDialog.createButton.click(); await personalFiles.page.keyboard.press('Escape'); await personalFiles.snackBar.message.waitFor({ state: 'attached' }); - expect(await personalFiles.snackBar.message.innerText()).toEqual('The action was unsuccessful. Try again or contact your IT Team.'); + await expect(personalFiles.snackBar.message).toHaveText('The action was unsuccessful. Try again or contact your IT Team.'); expect(await personalFiles.page.title()).toContain('Sign in'); await personalFiles.snackBar.message.waitFor({ state: 'detached' }); - expect(await personalFiles.snackBar.message.isVisible(), 'dialog should not be visible').toBe(false); + await expect(personalFiles.snackBar.message, 'dialog should not be visible').toBeHidden(); }); }); diff --git a/e2e/playwright/authentication/src/tests/login.e2e.ts b/e2e/playwright/authentication/src/tests/login.e2e.ts index 53f425316..1ea058d1d 100644 --- a/e2e/playwright/authentication/src/tests/login.e2e.ts +++ b/e2e/playwright/authentication/src/tests/login.e2e.ts @@ -61,9 +61,9 @@ test.describe('viewer file', () => { test.describe('general tests', () => { test('[C213089] login page layout', async ({ loginPage }) => { await loginPage.navigate(); - expect(await loginPage.username.isEnabled(), 'username input is not enabled').toBe(true); - expect(await loginPage.password.isEnabled(), 'password input is not enabled').toBe(true); - expect(await loginPage.submitButton.isEnabled(), 'SIGN IN button is enabled').toBe(false); + await expect(loginPage.username, 'username input is not enabled').toBeEnabled(); + await expect(loginPage.password, 'password input is not enabled').toBeEnabled(); + await expect(loginPage.submitButton, 'SIGN IN button is enabled').toBeDisabled(); await loginPage.password.fill('text'); expect(await loginPage.isPasswordDisplayed(), 'Password is not hidden by default').toBe(false); await loginPage.passwordVisibility.click(); @@ -82,7 +82,7 @@ test.describe('viewer file', () => { test('[C213097] logs in with user with non-latin characters', async ({ loginPage }) => { await loginPage.navigate(); await loginPage.loginUser({ username: otherLanguageUser.username, password: otherLanguageUser.password }); - expect(await loginPage.page.url()).toContain('personal-files'); + expect(loginPage.page.url()).toContain('personal-files'); }); test('[C213107] redirects to Home Page when navigating to the Login page while already logged in', async ({ loginPage }) => { diff --git a/e2e/playwright/copy-move-actions/src/tests/destination-picker-dialog.e2e.ts b/e2e/playwright/copy-move-actions/src/tests/destination-picker-dialog.e2e.ts index c5dcbe561..ee93d2c95 100644 --- a/e2e/playwright/copy-move-actions/src/tests/destination-picker-dialog.e2e.ts +++ b/e2e/playwright/copy-move-actions/src/tests/destination-picker-dialog.e2e.ts @@ -83,20 +83,20 @@ test.describe('Copy Move actions', () => { await loginPage.loginUser({ username: consumerUser, password: consumerUser }, { withNavigation: true, waitForLoading: true }); await myLibrariesPage.navigate(); await copyContentInMyLibraries(myLibrariesPage); - expect(await myLibrariesPage.contentNodeSelector.actionButton.isEnabled()).toBe(false); + await expect(myLibrariesPage.contentNodeSelector.actionButton).toBeDisabled(); }); test('[C263877] Contributor user can select the folder as destination', async ({ loginPage, myLibrariesPage }) => { await loginPage.loginUser({ username: contributorUser, password: contributorUser }, { withNavigation: true, waitForLoading: true }); await myLibrariesPage.navigate(); await copyContentInMyLibraries(myLibrariesPage); - expect(await myLibrariesPage.contentNodeSelector.actionButton.isEnabled()).toBe(true); + await expect(myLibrariesPage.contentNodeSelector.actionButton).toBeEnabled(); }); test('[C263878] Collaborator user can select the folder as destination', async ({ loginPage, myLibrariesPage }) => { await loginPage.loginUser({ username: collaboratorUser, password: collaboratorUser }, { withNavigation: true, waitForLoading: true }); await myLibrariesPage.navigate(); await copyContentInMyLibraries(myLibrariesPage); - expect(await myLibrariesPage.contentNodeSelector.actionButton.isEnabled()).toBe(true); + await expect(myLibrariesPage.contentNodeSelector.actionButton).toBeEnabled(); }); }); diff --git a/e2e/playwright/create-actions/src/tests/create-file-from-template.e2e.ts b/e2e/playwright/create-actions/src/tests/create-file-from-template.e2e.ts index 387c86caa..1c66e8739 100644 --- a/e2e/playwright/create-actions/src/tests/create-file-from-template.e2e.ts +++ b/e2e/playwright/create-actions/src/tests/create-file-from-template.e2e.ts @@ -151,8 +151,8 @@ test.describe('Create file from template', () => { test(`[C325044] Templates don't appear if user doesn't have permissions to see them`, async () => { await expect(selectFileTemplateDialog.getDialogTitle(selectDialogTitle)).toBeVisible(); - await expect(dataTable.getRowByName(restrictedTemplateFolder)).not.toBeVisible(); - await expect(dataTable.getRowByName(templateInRestrictedFolder)).not.toBeVisible(); + await expect(dataTable.getRowByName(restrictedTemplateFolder)).toBeHidden(); + await expect(dataTable.getRowByName(templateInRestrictedFolder)).toBeHidden(); }); test(`[C325045] Navigate through the templates list with folder hierarchy`, async () => { @@ -191,7 +191,7 @@ test.describe('Create file from template', () => { test('[C325050] Links to files are not displayed', async () => { await expect(dataTable.getRowByName(template1InRoot)).toBeVisible(); await expect(dataTable.getRowByName(template2InRoot)).toBeVisible(); - await expect(dataTable.getRowByName(fileLink)).not.toBeVisible(); + await expect(dataTable.getRowByName(fileLink)).toBeHidden(); }); test('[C325048] Cancel the Select template dialog', async () => { @@ -324,7 +324,7 @@ test.describe('Create file from template', () => { test('[C325027] Cancel file creation', async () => { await expect(createFileFromTemplateDialog.getDialogTitle(createDialogTitle)).toBeVisible(); await createFileFromTemplateDialog.cancelButton.click(); - await expect(createFileFromTemplateDialog.getDialogTitle(createDialogTitle)).not.toBeVisible(); + await expect(createFileFromTemplateDialog.getDialogTitle(createDialogTitle)).toBeHidden(); }); }); @@ -406,8 +406,8 @@ test.describe('Create file from template', () => { test('[C325024] Cancel file creation in a library', async () => { await expect(createFileFromTemplateDialog.getDialogTitle(createDialogTitle)).toBeVisible(); await createFileFromTemplateDialog.cancelButton.click(); - await expect(createFileFromTemplateDialog.getDialogTitle(createDialogTitle)).not.toBeVisible(); - await expect(dataTable.getRowByName(randomFileName)).not.toBeVisible(); + await expect(createFileFromTemplateDialog.getDialogTitle(createDialogTitle)).toBeHidden(); + await expect(dataTable.getRowByName(randomFileName)).toBeHidden(); }); test('[C325025] Create a file with a duplicate name in a library', async ({ myLibrariesPage }) => { diff --git a/e2e/playwright/create-actions/src/tests/create-folder-from-template.e2e.ts b/e2e/playwright/create-actions/src/tests/create-folder-from-template.e2e.ts index d686e91a2..294334182 100644 --- a/e2e/playwright/create-actions/src/tests/create-folder-from-template.e2e.ts +++ b/e2e/playwright/create-actions/src/tests/create-folder-from-template.e2e.ts @@ -178,7 +178,7 @@ test.describe('Create folder from template', () => { test(`[C325148] Templates don't appear if user doesn't have permissions to see them`, async () => { await expect(selectFolderTemplateDialog.getDialogTitle(selectDialogTitle)).toBeVisible(); - await expect(dataTable.getRowByName(restrictedTemplateFolder)).not.toBeVisible(); + await expect(dataTable.getRowByName(restrictedTemplateFolder)).toBeHidden(); }); test(`[C325149] Navigate through the templates list with folder hierarchy`, async () => { @@ -214,7 +214,7 @@ test.describe('Create folder from template', () => { test('[C325153] Links to folders are not displayed', async () => { await expect(dataTable.getRowByName(templateFolder1)).toBeVisible(); - await expect(dataTable.getRowByName(folderLink)).not.toBeVisible(); + await expect(dataTable.getRowByName(folderLink)).toBeHidden(); }); test('[C325151] Cancel the Select template dialog', async () => { @@ -351,7 +351,7 @@ test.describe('Create folder from template', () => { test('[C325155] Cancel folder creation', async () => { await expect(createFolderFromTemplateDialog.getDialogTitle(createDialogTitle)).toBeVisible(); await createFolderFromTemplateDialog.cancelButton.click(); - await expect(createFolderFromTemplateDialog.getDialogTitle(createDialogTitle)).not.toBeVisible(); + await expect(createFolderFromTemplateDialog.getDialogTitle(createDialogTitle)).toBeHidden(); }); }); @@ -452,8 +452,8 @@ test.describe('Create folder from template', () => { test('[C325162] Cancel folder creation in a library', async () => { await expect(createFolderFromTemplateDialog.getDialogTitle(createDialogTitle)).toBeVisible(); await createFolderFromTemplateDialog.cancelButton.click(); - await expect(createFolderFromTemplateDialog.getDialogTitle(createDialogTitle)).not.toBeVisible(); - await expect(dataTable.getRowByName(randomFolderName)).not.toBeVisible(); + await expect(createFolderFromTemplateDialog.getDialogTitle(createDialogTitle)).toBeHidden(); + await expect(dataTable.getRowByName(randomFolderName)).toBeHidden(); }); test('[C325163] Create a folder with a duplicate name in a library', async ({ myLibrariesPage }) => { diff --git a/e2e/playwright/create-actions/src/tests/create-library.e2e.ts b/e2e/playwright/create-actions/src/tests/create-library.e2e.ts index 3d1c0dc76..ea328432d 100644 --- a/e2e/playwright/create-actions/src/tests/create-library.e2e.ts +++ b/e2e/playwright/create-actions/src/tests/create-library.e2e.ts @@ -157,10 +157,10 @@ test.describe('Create Libraries ', () => { await expect(libraryTable.getCellLinkByName(randomLibraryName).and(myLibrariesPage.page.getByTitle(randomLibraryDescription))).toBeVisible(); await libraryTable.getRowByName(randomLibraryName).click(); await libraryViewDetails.click(); - expect(await libraryDetails.getNameField('Name').locator('input').inputValue()).toBe(randomLibraryName); - expect(await libraryDetails.getIdField('Library ID').locator('input').inputValue()).toBe(randomLibraryId); + await expect(libraryDetails.getNameField('Name').locator('input')).toHaveValue(randomLibraryName); + await expect(libraryDetails.getIdField('Library ID').locator('input')).toHaveValue(randomLibraryId); await expect(libraryDetails.getVisibilityField('Visibility').locator('.mat-select-value').getByText(publicVisibility)).toBeVisible(); - expect(await libraryDetails.getDescriptionField.inputValue()).toBe(randomLibraryDescription); + await expect(libraryDetails.getDescriptionField).toHaveValue(randomLibraryDescription); createdLibrariesIds.push(randomLibraryId); }); diff --git a/e2e/playwright/info-drawer/src/tests/comments.e2e.ts b/e2e/playwright/info-drawer/src/tests/comments.e2e.ts index 3159d6c4a..4303783ab 100755 --- a/e2e/playwright/info-drawer/src/tests/comments.e2e.ts +++ b/e2e/playwright/info-drawer/src/tests/comments.e2e.ts @@ -105,8 +105,8 @@ test.describe('Info Drawer - Comments', () => { await sharedPage.infoDrawer.commentsTab.click(); await sharedPage.infoDrawer.waitForComments(); expect(await sharedPage.infoDrawer.checkCommentsHeaderCount()).toEqual(2); - expect(await sharedPage.infoDrawer.commentTextContent.nth(0).textContent()).toEqual(e2eCommentSecond); - expect(await sharedPage.infoDrawer.commentTextContent.nth(1).textContent()).toEqual(e2eCommentFirst); + await expect(sharedPage.infoDrawer.commentTextContent.nth(0)).toHaveText(e2eCommentSecond); + await expect(sharedPage.infoDrawer.commentTextContent.nth(1)).toHaveText(e2eCommentFirst); }); test('[C299195] from Recent Files - Add a comment on a file', async ({ recentFilesPage }) => { @@ -140,8 +140,8 @@ test.describe('Info Drawer - Comments', () => { await favoritePage.infoDrawer.commentsTab.click(); await favoritePage.infoDrawer.waitForComments(); expect(await favoritePage.infoDrawer.checkCommentsHeaderCount()).toEqual(1); - expect(await favoritePage.infoDrawer.commentTextContent.nth(0).textContent()).toEqual(e2eCommentFirst); - expect(await favoritePage.infoDrawer.commentTimestamp.nth(0).textContent()).toEqual('less than a minute ago'); - expect(await favoritePage.infoDrawer.commentUsername.nth(0).textContent()).toEqual('Administrator'); + await expect(favoritePage.infoDrawer.commentTextContent.nth(0)).toHaveText(e2eCommentFirst); + await expect(favoritePage.infoDrawer.commentTimestamp.nth(0)).toHaveText('less than a minute ago'); + await expect(favoritePage.infoDrawer.commentUsername.nth(0)).toHaveText('Administrator'); }); }); diff --git a/e2e/playwright/info-drawer/src/tests/general.e2e.ts b/e2e/playwright/info-drawer/src/tests/general.e2e.ts index d50559045..ea201c8b8 100644 --- a/e2e/playwright/info-drawer/src/tests/general.e2e.ts +++ b/e2e/playwright/info-drawer/src/tests/general.e2e.ts @@ -71,12 +71,12 @@ test.describe('Info Drawer - General', () => { await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible(); await personalFiles.reload({ waitUntil: 'load' }); - await expect(personalFiles.infoDrawer.infoDrawerPanel).not.toBeVisible(); + await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeHidden(); await personalFiles.dataTable.selectItem(file1); await personalFiles.acaHeader.viewDetails.click(); await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible(); await personalFiles.reload({ waitUntil: 'load' }); - await expect(personalFiles.infoDrawer.infoDrawerPanel).not.toBeVisible(); + await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeHidden(); }); }); diff --git a/e2e/playwright/info-drawer/src/tests/library-properties.e2e.ts b/e2e/playwright/info-drawer/src/tests/library-properties.e2e.ts index 9be7bc799..f876b5018 100644 --- a/e2e/playwright/info-drawer/src/tests/library-properties.e2e.ts +++ b/e2e/playwright/info-drawer/src/tests/library-properties.e2e.ts @@ -73,17 +73,17 @@ test.describe('Library properties', () => { await myLibrariesPage.acaHeader.viewDetails.click(); await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); - expect(await myLibrariesPage.libraryDetails.headerTitle.textContent()).toEqual(site.name); + await expect(myLibrariesPage.libraryDetails.headerTitle).toHaveText(site.name); await expect(myLibrariesPage.libraryDetails.propertiesTab).toBeVisible(); await expect(myLibrariesPage.libraryDetails.nameField).toBeVisible(); await expect(myLibrariesPage.libraryDetails.idField).toBeVisible(); await expect(myLibrariesPage.libraryDetails.visibilityField).toBeVisible(); await expect(myLibrariesPage.libraryDetails.descriptionField).toBeVisible(); - expect(await myLibrariesPage.libraryDetails.nameField.inputValue()).toEqual(site.name); - expect(await myLibrariesPage.libraryDetails.idField.inputValue()).toEqual(site.id); + await expect(myLibrariesPage.libraryDetails.nameField).toHaveValue(site.name); + await expect(myLibrariesPage.libraryDetails.idField).toHaveValue(site.id); expect((await myLibrariesPage.libraryDetails.visibilityField.textContent()).toUpperCase()).toEqual(site.visibility); - expect(await myLibrariesPage.libraryDetails.descriptionField.inputValue()).toEqual(site.description); + await expect(myLibrariesPage.libraryDetails.descriptionField).toHaveValue(site.description); await expect(myLibrariesPage.libraryDetails.editButton).toBeVisible(); }); @@ -124,9 +124,9 @@ test.describe('Library properties', () => { await expect(myLibrariesPage.libraryDetails.updateButton).toBeEnabled(); await myLibrariesPage.libraryDetails.updateButton.click(); - expect(await myLibrariesPage.snackBar.message.innerText()).toEqual('Library properties updated'); + await expect(myLibrariesPage.snackBar.message).toHaveText('Library properties updated'); expect(await myLibrariesPage.dataTable.isItemPresent(siteUpdated.name)).toBe(true); - await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).not.toBeVisible(); + await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeHidden(); expect((await sitesApi.getSite(siteForUpdate.id)).entry.title).toEqual(siteUpdated.name); expect((await sitesApi.getSite(siteForUpdate.id)).entry.description).toEqual(siteUpdated.description); expect((await sitesApi.getSite(siteForUpdate.id)).entry.visibility).toEqual(siteUpdated.visibility); @@ -166,7 +166,7 @@ test.describe('Library properties', () => { await myLibrariesPage.libraryDetails.editButton.click(); await myLibrariesPage.libraryDetails.nameField.fill(site.name); await expect(myLibrariesPage.libraryDetails.hintMessage).toBeVisible(); - expect(await myLibrariesPage.libraryDetails.hintMessage.textContent()).toEqual('Library name already in use'); + await expect(myLibrariesPage.libraryDetails.hintMessage).toHaveText('Library name already in use'); }); test('[C289342] Site name too long', async ({ myLibrariesPage }) => { @@ -234,7 +234,7 @@ test.describe('Non manager', () => { await myLibrariesPage.navigate(); await myLibrariesPage.dataTable.getRowByName(site.name).click(); - await expect(myLibrariesPage.acaHeader.viewDetails).not.toBeVisible(); + await expect(myLibrariesPage.acaHeader.viewDetails).toBeHidden(); }); test('[C289344] Error notification when editing with no rights', async ({ loginPage, myLibrariesPage }) => { @@ -248,6 +248,6 @@ test.describe('Non manager', () => { await myLibrariesPage.libraryDetails.descriptionField.fill('new description'); await myLibrariesPage.libraryDetails.updateButton.click(); - expect(await myLibrariesPage.snackBar.message.textContent()).toEqual('There was an error updating library properties'); + await expect(myLibrariesPage.snackBar.message).toHaveText('There was an error updating library properties'); }); }); diff --git a/e2e/playwright/library-actions/src/tests/library-actions.e2e.ts b/e2e/playwright/library-actions/src/tests/library-actions.e2e.ts index 31522f9bb..60a03d4df 100644 --- a/e2e/playwright/library-actions/src/tests/library-actions.e2e.ts +++ b/e2e/playwright/library-actions/src/tests/library-actions.e2e.ts @@ -184,7 +184,7 @@ test.describe('Library actions ', () => { await expect.soft(confirmDialog.cancelButton).toBeVisible(); await confirmDialog.okButton.click(); await expect.soft(snackBar.getByMessageLocator(leftMessage)).toBeVisible(); - await expect(libraryTable.getRowByName(user1Library1)).not.toBeVisible(); + await expect(libraryTable.getRowByName(user1Library1)).toBeHidden(); }); test('[C290111] Cancel Leave Library', async ({ myLibrariesPage }) => { @@ -235,7 +235,7 @@ test.describe('Library actions ', () => { await myLibrariesHeader.clickMoreActions(); await libraryMenu.clickMenuItem(deleteButton); await expect.soft(snackBar.getByMessageLocator(libraryDeletedMessage)).toBeVisible(); - await expect(libraryTable.getRowByName(user2Library5Delete)).not.toBeVisible(); + await expect(libraryTable.getRowByName(user2Library5Delete)).toBeHidden(); await trashPage.navigate({ waitUntil: loadString }); await expect(trashTable.getRowByName(user2Library5Delete)).toBeVisible(); }); @@ -313,7 +313,7 @@ test.describe('Library actions ', () => { await libraryTable.getRowByName(user2Library3).click(); await myLibrariesHeader.clickMoreActions(); await libraryMenu.clickMenuItem(removeFavoriteButton); - await expect(libraryTable.getRowByName(user2Library3)).not.toBeVisible(); + await expect(libraryTable.getRowByName(user2Library3)).toBeHidden(); }); test('[C289991] Delete a library from Favorite Libraries', async ({ favoriteLibrariesPage, trashPage }) => { @@ -328,7 +328,7 @@ test.describe('Library actions ', () => { await myLibrariesHeader.clickMoreActions(); await libraryMenu.clickMenuItem(deleteButton); await expect.soft(snackBar.getByMessageLocator(libraryDeletedMessage)).toBeVisible(); - await expect(libraryTable.getRowByName(user2Library6Delete)).not.toBeVisible(); + await expect(libraryTable.getRowByName(user2Library6Delete)).toBeHidden(); await trashPage.navigate({ waitUntil: loadString }); await expect(trashTable.getRowByName(user2Library6Delete)).toBeVisible(); }); @@ -442,7 +442,7 @@ test.describe('Library actions ', () => { await searchHeader.clickMoreActions(); await libraryMenu.clickMenuItem(deleteButton); await expect.soft(snackBar.getByMessageLocator(libraryDeletedMessage)).toBeVisible(); - await expect(libraryTable.getRowByName(user2Library7Delete)).not.toBeVisible(); + await expect(libraryTable.getRowByName(user2Library7Delete)).toBeHidden(); await trashPage.navigate({ waitUntil: loadString }); await expect(trashTable.getRowByName(user2Library7Delete)).toBeVisible(); }); diff --git a/e2e/playwright/list-views/src/tests/favorites.e2e.ts b/e2e/playwright/list-views/src/tests/favorites.e2e.ts index f1c21370a..9e3155b34 100644 --- a/e2e/playwright/list-views/src/tests/favorites.e2e.ts +++ b/e2e/playwright/list-views/src/tests/favorites.e2e.ts @@ -135,7 +135,7 @@ test.describe('Favorites Files', () => { test('[C213230] Navigate into folder from Favorites', async ({ favoritePage }) => { await favoritePage.dataTable.performClickFolderOrFileToOpen(favFolderName); await favoritePage.dataTable.spinnerWaitForReload(); - expect(await favoritePage.breadcrumb.currentItem.innerText()).toBe(favFolderName); + await expect(favoritePage.breadcrumb.currentItem).toHaveText(favFolderName); }); }); }); diff --git a/e2e/playwright/list-views/src/tests/generic-errors.e2e.ts b/e2e/playwright/list-views/src/tests/generic-errors.e2e.ts index 28b7f2894..d97383e44 100755 --- a/e2e/playwright/list-views/src/tests/generic-errors.e2e.ts +++ b/e2e/playwright/list-views/src/tests/generic-errors.e2e.ts @@ -67,7 +67,7 @@ test.describe('Generic errors', () => { await actionUser.deleteNodeById(file1Id, false); await personalFiles.navigate({ remoteUrl: `#/personal-files/${file1Id}` }); - expect(await personalFiles.errorDialog.genericError.isVisible(), 'Generic error page not displayed').toBe(true); + await expect(personalFiles.errorDialog.genericError, 'Generic error page not displayed').toBeVisible(); expect(await personalFiles.errorDialog.genericErrorTitle.innerText()).toContain( `This item no longer exists or you don't have permission to view it.` ); @@ -84,7 +84,7 @@ test.describe('Generic errors', () => { ); await personalFiles.navigate({ remoteUrl: `#/personal-files/${file2Id}` }); - expect(await personalFiles.errorDialog.genericError.isVisible(), 'Generic error page not displayed').toBe(true); + await expect(personalFiles.errorDialog.genericError, 'Generic error page not displayed').toBeVisible(); expect(await personalFiles.errorDialog.genericErrorTitle.innerText()).toContain( `This item no longer exists or you don't have permission to view it.` ); diff --git a/e2e/playwright/navigation/src/tests/breadcrumb.e2e.ts b/e2e/playwright/navigation/src/tests/breadcrumb.e2e.ts index 72ff5d06e..ee039f221 100644 --- a/e2e/playwright/navigation/src/tests/breadcrumb.e2e.ts +++ b/e2e/playwright/navigation/src/tests/breadcrumb.e2e.ts @@ -91,7 +91,7 @@ test.describe('viewer action file', () => { test('[C260964] Personal Files breadcrumb main node', async ({ personalFiles }) => { await personalFiles.navigate({ remoteUrl: `#/personal-files/` }); expect(await personalFiles.breadcrumb.items.count(), 'Breadcrumb has incorrect number of items').toEqual(1); - expect(await personalFiles.breadcrumb.currentItem.innerText()).toBe('Personal Files'); + await expect(personalFiles.breadcrumb.currentItem).toHaveText('Personal Files'); }); test('[C260965] Personal Files breadcrumb for a folder hierarchy', async ({ personalFiles }) => { @@ -126,7 +126,7 @@ test.describe('viewer action file', () => { await personalFiles.navigate({ remoteUrl: `#/personal-files/${folder1Id}` }); await personalFiles.page.reload(); await personalFiles.dataTable.spinnerWaitForReload(); - expect(await personalFiles.breadcrumb.currentItem.innerText()).toEqual(folder1Renamed); + await expect(personalFiles.breadcrumb.currentItem).toHaveText(folder1Renamed); }); test('[C213240] Browser back navigates to previous location regardless of breadcrumb steps', async ({ personalFiles, trashPage }) => { diff --git a/e2e/playwright/navigation/src/tests/single-click.e2e.ts b/e2e/playwright/navigation/src/tests/single-click.e2e.ts index f59c3e481..2f58ae3e2 100644 --- a/e2e/playwright/navigation/src/tests/single-click.e2e.ts +++ b/e2e/playwright/navigation/src/tests/single-click.e2e.ts @@ -65,8 +65,8 @@ test.describe('Single click on item name', () => { test('[C284899] Hyperlink does not appear for items in the Trash', async ({ trashPage }) => { await trashPage.navigate(); - expect(await trashPage.dataTable.getCellLinkByName(deletedFile1).isVisible(), 'Link on name is present').toBe(false); - expect(await trashPage.dataTable.getCellLinkByName(deletedFolder1).isVisible(), 'Link on name is present').toBe(false); + await expect(trashPage.dataTable.getCellLinkByName(deletedFile1), 'Link on name is present').toBeHidden(); + await expect(trashPage.dataTable.getCellLinkByName(deletedFolder1), 'Link on name is present').toBeHidden(); }); test('[C280034] Navigate inside the folder when clicking the hyperlink on Personal Files', async ({ personalFiles }) => { @@ -77,7 +77,7 @@ test.describe('Single click on item name', () => { while ((await personalFiles.breadcrumb.currentItem.innerText()) === 'Personal Files') { await personalFiles.breadcrumb.currentItem.innerText(); } - expect(await personalFiles.breadcrumb.currentItem.innerText()).toBe(folder1); + await expect(personalFiles.breadcrumb.currentItem).toHaveText(folder1); }); test('[C284902] Navigate inside the library when clicking the hyperlink on File Libraries', async ({ myLibrariesPage }) => { @@ -85,7 +85,7 @@ test.describe('Single click on item name', () => { await myLibrariesPage.dataTable.goThroughPagesLookingForRowWithName(siteName); await myLibrariesPage.dataTable.getCellLinkByName(siteName).click(); await myLibrariesPage.dataTable.spinnerWaitForReload(); - expect(await myLibrariesPage.breadcrumb.currentItem.innerText()).toBe(siteName); - expect(await myLibrariesPage.dataTable.getCellLinkByName(fileSite).isVisible(), `${fileSite} not displayed`).toBe(true); + await expect(myLibrariesPage.breadcrumb.currentItem).toHaveText(siteName); + await expect(myLibrariesPage.dataTable.getCellLinkByName(fileSite), `${fileSite} not displayed`).toBeVisible(); }); }); diff --git a/e2e/playwright/search/src/tests/search-input.e2e.ts b/e2e/playwright/search/src/tests/search-input.e2e.ts index e89e91916..32ee5e199 100644 --- a/e2e/playwright/search/src/tests/search-input.e2e.ts +++ b/e2e/playwright/search/src/tests/search-input.e2e.ts @@ -68,7 +68,7 @@ test.describe('Search - Input', () => { await searchPage.searchOverlay.searchFilesOption.click(); await expect(searchPage.searchOverlay.searchFoldersOption).toBeEnabled(); - await expect(searchPage.searchOverlay.searchLibrariesOption).not.toBeEnabled(); + await expect(searchPage.searchOverlay.searchLibrariesOption).toBeDisabled(); await searchPage.searchOverlay.searchFilesOption.click(); await expect(searchPage.searchOverlay.searchFoldersOption).toBeEnabled(); @@ -76,15 +76,15 @@ test.describe('Search - Input', () => { await searchPage.searchOverlay.searchFoldersOption.click(); await expect(searchPage.searchOverlay.searchFilesOption).toBeEnabled(); - await expect(searchPage.searchOverlay.searchLibrariesOption).not.toBeEnabled(); + await expect(searchPage.searchOverlay.searchLibrariesOption).toBeDisabled(); await searchPage.searchOverlay.searchFoldersOption.click(); await expect(searchPage.searchOverlay.searchFilesOption).toBeEnabled(); await expect(searchPage.searchOverlay.searchLibrariesOption).toBeEnabled(); await searchPage.searchOverlay.searchLibrariesOption.click(); - await expect(searchPage.searchOverlay.searchFilesOption).not.toBeEnabled(); - await expect(searchPage.searchOverlay.searchFoldersOption).not.toBeEnabled(); + await expect(searchPage.searchOverlay.searchFilesOption).toBeDisabled(); + await expect(searchPage.searchOverlay.searchFoldersOption).toBeDisabled(); await searchPage.searchOverlay.searchLibrariesOption.click(); await expect(searchPage.searchOverlay.searchFilesOption).toBeEnabled(); diff --git a/e2e/playwright/share-action/src/tests/share/unshare-file-search-results.e2e.ts b/e2e/playwright/share-action/src/tests/share/unshare-file-search-results.e2e.ts index 49d9e572e..fd9d24386 100755 --- a/e2e/playwright/share-action/src/tests/share/unshare-file-search-results.e2e.ts +++ b/e2e/playwright/share-action/src/tests/share/unshare-file-search-results.e2e.ts @@ -112,12 +112,12 @@ test.describe('Unshare a file from Search Results', () => { expect(await personalFiles.shareDialog.isShareToggleChecked()).toBe(true); await personalFiles.shareDialog.shareToggle.click(); - expect(personalFiles.confirmDialog.getDialogTitle('Remove this shared link')).toBeVisible(); - expect( + await expect(personalFiles.confirmDialog.getDialogTitle('Remove this shared link')).toBeVisible(); + await expect( personalFiles.confirmDialog.getDialogContent('This link will be deleted and a new link will be created next time this file is shared') ).toBeVisible(); - expect(personalFiles.confirmDialog.okButton).toBeEnabled(); - expect(personalFiles.confirmDialog.cancelButton).toBeEnabled(); + await expect(personalFiles.confirmDialog.okButton).toBeEnabled(); + await expect(personalFiles.confirmDialog.cancelButton).toBeEnabled(); }); test('[C306996] Unshare a file', async ({ personalFiles, searchPage, nodesApiAction, page }) => { @@ -135,7 +135,7 @@ test.describe('Unshare a file from Search Results', () => { await page.goto(url); await personalFiles.viewer.waitForViewerToOpen(); - expect(await personalFiles.viewer.fileTitleButtonLocator.innerText()).not.toEqual(file2); + await expect(personalFiles.viewer.fileTitleButtonLocator).not.toHaveText(file2); expect(await nodesApiAction.isFileShared(file2Id)).toBe(false); }); diff --git a/e2e/playwright/viewer/src/tests/viewer-action.e2e.ts b/e2e/playwright/viewer/src/tests/viewer-action.e2e.ts index 8b8aabe6a..3f73a3b09 100644 --- a/e2e/playwright/viewer/src/tests/viewer-action.e2e.ts +++ b/e2e/playwright/viewer/src/tests/viewer-action.e2e.ts @@ -100,7 +100,7 @@ test.describe('viewer action file', () => { const deleteName = await personalFiles.snackBar.getByMessageLocator(randomDocxDelete).innerText(); expect(deleteName).toContain(`${randomDocxDelete} deleted`); await personalFiles.dataTable.getCellLinkByName(randomDocxName).waitFor({ state: 'attached' }); - expect(await personalFiles.dataTable.getCellLinkByName(randomDocxDelete).isVisible(), 'file should not visible').toBe(false); + await expect(personalFiles.dataTable.getCellLinkByName(randomDocxDelete), 'file should not visible').toBeHidden(); await trashPage.navigate({ waitUntil: 'domcontentloaded' }); expect(await trashPage.dataTable.isItemPresent(randomDocxDelete), 'Item should be present in Trash').toBe(true); }); @@ -160,7 +160,7 @@ test.describe('viewer action file', () => { await sharedPage.acaHeader.clickViewerMoreActions(); await favoritePage.viewerDialog.removeFavoriteMenuButton.waitFor({ state: 'attached', timeout: timeouts.normal }); - expect(await sharedPage.viewerDialog.removeFavoriteMenuButton.isVisible(), 'Item should be remove favorite').toBe(true); + await expect(sharedPage.viewerDialog.removeFavoriteMenuButton, 'Item should be remove favorite').toBeVisible(); await sharedPage.page.keyboard.press('Escape'); await favoritePage.navigate({ waitUntil: 'domcontentloaded' }); expect(await favoritePage.dataTable.isItemPresent(randomDocxNameShare), 'Item is not present in Favorites list').toBe(true); @@ -173,10 +173,10 @@ test.describe('viewer action file', () => { await favoritePage.viewer.shareButton.waitFor({ state: 'attached', timeout: timeouts.normal }); await favoritePage.viewer.shareButton.click(); await favoritePage.viewerDialog.shareDialogTitle.waitFor({ state: 'attached', timeout: timeouts.normal }); - expect(await favoritePage.viewerDialog.shareDialogTitle.isVisible(), 'Share dialog should be open').toBe(true); + await expect(favoritePage.viewerDialog.shareDialogTitle, 'Share dialog should be open').toBeVisible(); await favoritePage.viewerDialog.shareDialogClose.click(); await favoritePage.viewerDialog.shareDialogClose.waitFor({ state: 'detached', timeout: timeouts.large }); - expect(await favoritePage.viewerDialog.shareDialogTitle.isVisible(), 'Share dialog should be open').toBe(false); + await expect(favoritePage.viewerDialog.shareDialogTitle, 'Share dialog should be open').toBeHidden(); }); test('[C297586] Upload new version action', async ({ personalFiles, nodesApiAction }) => { @@ -208,8 +208,8 @@ test.describe('viewer action file', () => { expect(await personalFiles.viewer.fileTitleButtonLocator.innerText()).toContain(docxFile); await personalFiles.acaHeader.clickViewerMoreActions(); - expect(await personalFiles.matMenu.cancelEditingAction.isVisible(), `'Cancel Editing' button shouldn't be shown`).toBe(false); - expect(await personalFiles.matMenu.editOfflineAction.isVisible(), `'Edit Offline' should be shown`).toBe(true); + await expect(personalFiles.matMenu.cancelEditingAction, `'Cancel Editing' button shouldn't be shown`).toBeHidden(); + await expect(personalFiles.matMenu.editOfflineAction, `'Edit Offline' should be shown`).toBeVisible(); }); test('[C286384] Copy action from Recent Files', async ({ recentFilesPage, personalFiles }) => { @@ -219,7 +219,7 @@ test.describe('viewer action file', () => { await recentFilesPage.acaHeader.clickViewerMoreActions(); await recentFilesPage.matMenu.clickMenuItem('Copy'); - expect(await recentFilesPage.contentNodeSelector.actionButton.isVisible(), 'Dialog is not open').toBe(true); + await expect(recentFilesPage.contentNodeSelector.actionButton, 'Dialog is not open').toBeVisible(); await recentFilesPage.contentNodeSelector.selectLocation('Personal Files'); await recentFilesPage.contentNodeSelector.selectDestination(destination); await recentFilesPage.contentNodeSelector.actionButton.click(); diff --git a/e2e/playwright/viewer/src/tests/viewer-protected.e2e.ts b/e2e/playwright/viewer/src/tests/viewer-protected.e2e.ts index 91fb4274b..f4f3fb5e5 100644 --- a/e2e/playwright/viewer/src/tests/viewer-protected.e2e.ts +++ b/e2e/playwright/viewer/src/tests/viewer-protected.e2e.ts @@ -55,14 +55,14 @@ test.describe('viewer file', () => { test('[C268958] Password dialog appears when opening a protected file', async ({ personalFiles }) => { expect(await personalFiles.passwordDialog.isDialogOpen(), 'Password dialog not open').toBe(true); expect(await personalFiles.passwordDialog.isPasswordInputDisplayed(), 'Password input not displayed').toBe(true); - expect(await personalFiles.passwordDialog.submitButton.isHidden(), 'Submit button not disabled').toBe(false); + await expect(personalFiles.passwordDialog.submitButton, 'Submit button not disabled').toBeVisible(); expect(await personalFiles.passwordDialog.isCloseVisible(), 'Close button not enabled').toBe(true); - expect(await personalFiles.viewer.pdfViewerContentPages.isVisible(), 'Viewer did not close').toBe(false); + await expect(personalFiles.viewer.pdfViewerContentPages, 'Viewer did not close').toBeHidden(); }); test('[C268959] File content is displayed when entering the correct password', async ({ personalFiles }) => { await personalFiles.passwordDialog.enterPassword(TEST_FILES.PDF_PROTECTED.password); - expect(await personalFiles.passwordDialog.submitButton.isVisible(), 'Submit button not enabled').toBe(true); + await expect(personalFiles.passwordDialog.submitButton, 'Submit button not enabled').toBeVisible(); await personalFiles.passwordDialog.submitButton.click(); await personalFiles.passwordDialog.waitForDialogToClose(); @@ -72,7 +72,7 @@ test.describe('viewer file', () => { test('[C268960] Error appears when entering an incorrect password', async ({ personalFiles }) => { await personalFiles.passwordDialog.enterPassword('incorrect'); - expect(await personalFiles.passwordDialog.submitButton.isVisible(), 'Submit button not enabled').toBe(true); + await expect(personalFiles.passwordDialog.submitButton, 'Submit button not enabled').toBeVisible(); await personalFiles.passwordDialog.submitButton.click(); expect(await personalFiles.passwordDialog.getErrorMessage()).toBe('Password is wrong'); diff --git a/e2e/playwright/viewer/src/tests/viewer-useraction.e2e.ts b/e2e/playwright/viewer/src/tests/viewer-useraction.e2e.ts index f186162fc..a4adf6016 100644 --- a/e2e/playwright/viewer/src/tests/viewer-useraction.e2e.ts +++ b/e2e/playwright/viewer/src/tests/viewer-useraction.e2e.ts @@ -87,7 +87,7 @@ test.describe('from File Libraries', () => { await myLibrariesPage.viewer.closeButtonLocator.click(); await myLibrariesPage.dataTable.getRowByName(xlsxLibraries).waitFor({ state: 'detached' }); - expect(await myLibrariesPage.dataTable.getRowByName(xlsxLibraries).isVisible(), 'Item was not moved').toBe(false); + await expect(myLibrariesPage.dataTable.getRowByName(xlsxLibraries), 'Item was not moved').toBeHidden(); await personalFiles.navigate({ remoteUrl: `#/personal-files/${destinationId}` }); expect(await personalFiles.dataTable.isItemPresent(xlsxLibraries), 'Item is not present in destination').toBe(true); }); diff --git a/e2e/playwright/viewer/src/tests/viewer.e2e.ts b/e2e/playwright/viewer/src/tests/viewer.e2e.ts index a78aaa3c9..3e1a696cb 100644 --- a/e2e/playwright/viewer/src/tests/viewer.e2e.ts +++ b/e2e/playwright/viewer/src/tests/viewer.e2e.ts @@ -130,7 +130,7 @@ test.describe('viewer file', () => { expect(await personalFiles.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true); expect(await personalFiles.viewer.getCloseButtonTooltip()).toEqual('Close'); await personalFiles.viewer.closeButtonLocator.click(); - expect(await personalFiles.dataTable.getCellLinkByName(randomDocxName).isVisible(), 'Viewer did not close').toBe(true); + await expect(personalFiles.dataTable.getCellLinkByName(randomDocxName), 'Viewer did not close').toBeVisible(); }); test('[C284636] Viewer opens for a file from Recent Files', async ({ personalFiles, recentFilesPage }) => { @@ -162,7 +162,7 @@ test.describe('viewer file', () => { await personalFiles.navigate({ remoteUrl: previewURL }); await personalFiles.dataTable.spinnerWaitForReload(); expect(await personalFiles.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true); - expect(await personalFiles.viewer.fileTitleButtonLocator.innerText()).toEqual(randomDocxName); + await expect(personalFiles.viewer.fileTitleButtonLocator).toHaveText(randomDocxName); }); test('[C284635] Viewer opens for a file from Shared Files', async ({ sharedPage }) => { @@ -187,7 +187,7 @@ test.describe('viewer file', () => { test('[C279287] Viewer does not open when accessing the preview URL for a file without permissions', async ({ personalFiles }) => { const previewURL = `#/libraries/${docLibId}/(viewer:view/${fileAdminId})`; await personalFiles.navigate({ remoteUrl: `${previewURL}` }); - expect(await personalFiles.viewer.viewerLocator.isVisible(), 'Viewer should not be opened!').toBe(false); + await expect(personalFiles.viewer.viewerLocator, 'Viewer should not be opened!').toBeHidden(); }); test('[C284633] Viewer opens for a file from File Libraries', async ({ myLibrariesPage }) => { diff --git a/package-lock.json b/package-lock.json index 55cdf03d0..3096d5060 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,6 +75,7 @@ "eslint-plugin-import": "2.29.1", "eslint-plugin-jsdoc": "46.5.1", "eslint-plugin-license-header": "^0.6.0", + "eslint-plugin-playwright": "^1.5.4", "eslint-plugin-prefer-arrow": "1.2.3", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-rxjs": "^5.0.2", @@ -15410,6 +15411,54 @@ "requireindex": "^1.2.0" } }, + "node_modules/eslint-plugin-playwright": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-1.5.4.tgz", + "integrity": "sha512-J38Wy3Vc2f9y73J+KRmgXgbYI8TZ3zbz6qBbTj3PhpFndUS572jZ7kqQ3rJ9si5BaMHT7lmZzraO+3UjwIDV4Q==", + "dev": true, + "dependencies": { + "globals": "^13.23.0" + }, + "engines": { + "node": ">=16.6.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0", + "eslint-plugin-jest": ">=25" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-playwright/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-playwright/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-prefer-arrow": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", diff --git a/package.json b/package.json index f0f5b006d..cb6b706a8 100644 --- a/package.json +++ b/package.json @@ -99,6 +99,7 @@ "eslint-plugin-import": "2.29.1", "eslint-plugin-jsdoc": "46.5.1", "eslint-plugin-license-header": "^0.6.0", + "eslint-plugin-playwright": "^1.5.4", "eslint-plugin-prefer-arrow": "1.2.3", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-rxjs": "^5.0.2",