diff --git a/packages/bruno-app/src/components/ManageWorkspace/index.js b/packages/bruno-app/src/components/ManageWorkspace/index.js index e0084b154d3..ff751fb8b2c 100644 --- a/packages/bruno-app/src/components/ManageWorkspace/index.js +++ b/packages/bruno-app/src/components/ManageWorkspace/index.js @@ -163,7 +163,7 @@ const ManageWorkspace = () => { { id: 'remove', label: 'Remove', onClick: () => handleCloseClick(workspace) } ]} > - diff --git a/tests/utils/page/workspace/manage-workspace.ts b/tests/utils/page/workspace/manage-workspace.ts new file mode 100644 index 00000000000..037ee295cf7 --- /dev/null +++ b/tests/utils/page/workspace/manage-workspace.ts @@ -0,0 +1,67 @@ +import { Page, test } from '../../../../playwright'; + +import { buildTitleBarLocators } from '../title-bar'; + +export const buildManageWorkspaceLocators = (page: Page) => ({ + myWorkspaceDropdownItem: () => page.locator('.dropdown-item'), + manageWorkspaceTitle: () => page.getByText('Manage Workspace', { exact: true }), + defaultWorkspaceItem: () => page.locator('.workspace-item'), + moreActionsBtn: () => page.locator('.more-actions-btn'), + workspaceListItem: () => page.locator('.dropdown-item'), + terminalSession: () => page.getByTestId('session-list-0'), + workspaceItem: () => page.locator('.workspace-item'), + dropdownItem: () => page.locator('.dropdown-item'), + modalCard: () => page.locator('.bruno-modal-card'), + workspaceFileNameInput: () => page.locator('#workspace-name'), + submitRenameBtn: () => page.getByTestId('modal-submit-btn'), + renamedWorkspaceItem: () => page.getByTestId('workspace-name'), + submitRemoveBtn: () => page.getByTestId('modal-submit-btn') +}); + +export const manageWorkspace = async (page: Page) => { + const locators = buildManageWorkspaceLocators(page); + await test.step('Open manage workspaces', async () => { + await buildTitleBarLocators(page).workspaceMenuTrigger().click(); + await locators.myWorkspaceDropdownItem().filter({ hasText: 'Manage workspaces' }).click(); + }); +}; + +export const openTerminalFromWorkspaceActions = async (page: Page, workspaceName: string) => { + const locators = buildManageWorkspaceLocators(page); + await test.step('Open terminal from workspace actions', async () => { + const workspaceItem = locators.defaultWorkspaceItem().filter({ hasText: workspaceName }); + await workspaceItem.locator(locators.moreActionsBtn()).click(); + await locators.workspaceListItem().filter({ hasText: 'Open in Terminal' }).click(); + }); +}; + +export const clickOnMoreActionsButton = async (page: Page, workspaceName: string) => { + const locators = buildManageWorkspaceLocators(page); + await test.step('Click on the more actions button', async () => { + const workspaceItem = locators.workspaceItem().filter({ hasText: workspaceName }); + await workspaceItem.locator(locators.moreActionsBtn()).click(); + }); +}; + +export const renameOrRemoveWorkspaceOnPopup = async (page: Page, optionName: string) => { + const locators = buildManageWorkspaceLocators(page); + await test.step('Rename or remove workspace on popup', async () => { + await locators.dropdownItem().filter({ hasText: optionName }).click(); + await locators.modalCard().waitFor({ state: 'visible' }); + }); +}; + +export const enterNewWorkspaceFilename = async (page: Page, workspaceName: string, btnName: string) => { + const locators = buildManageWorkspaceLocators(page); + await test.step('Enter a new name for the workspace in the editing field.', async () => { + await locators.workspaceFileNameInput().fill(workspaceName); + await locators.submitRenameBtn().filter({ hasText: btnName }).click(); + }); +}; + +export const clickOnRemoveButtonOnPopup = async (page: Page) => { + const locators = buildManageWorkspaceLocators(page); + await test.step('Verify the workspace name is updated in the workspace list.', async () => { + await locators.submitRemoveBtn().click(); + }); +}; diff --git a/tests/workspace/manage-workspace/manage-workspace.spec.ts b/tests/workspace/manage-workspace/manage-workspace.spec.ts index 782938bb335..68e88536b0b 100644 --- a/tests/workspace/manage-workspace/manage-workspace.spec.ts +++ b/tests/workspace/manage-workspace/manage-workspace.spec.ts @@ -1,68 +1,55 @@ -import path from 'path'; -import fs from 'fs'; -import { test, expect, closeElectronApp } from '../../../playwright'; - -const initUserDataPath = path.join(__dirname, '../create-workspace/init-user-data'); - -function findCreatedWorkspaceDirs(location: string): string[] { - return fs.readdirSync(location).filter((e) => { - const fullPath = path.join(location, e); - return ( - fs.statSync(fullPath).isDirectory() - && e !== 'default-workspace' - && fs.existsSync(path.join(fullPath, 'workspace.yml')) - ); +import { test, expect } from '../../../playwright'; +import { createWorkspace } from '../../utils/page/actions'; +import { + clickOnMoreActionsButton, + manageWorkspace, + buildManageWorkspaceLocators, + openTerminalFromWorkspaceActions, + renameOrRemoveWorkspaceOnPopup, + enterNewWorkspaceFilename, + clickOnRemoveButtonOnPopup +} from '../../utils/page/workspace/manage-workspace'; + +test.describe('Manage workspace', () => { + test.beforeEach(async ({ page }) => { + await test.step('Create a workspace', async () => { + await createWorkspace(page, 'Custom Workspace'); + }); + + await test.step('Open manage workspaces', async () => { + const locators = buildManageWorkspaceLocators(page); + await manageWorkspace(page); + await expect(locators.manageWorkspaceTitle()).toBeVisible(); + }); }); -} - -test.describe('Manage Workspace', () => { - test('should open terminal from the workspace actions menu', async ({ launchElectronApp, createTmpDir }) => { - const wsLocation = await createTmpDir('ws-location-terminal'); - - const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - - try { - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); - await test.step('Create a workspace', async () => { - await page.locator('.workspace-name-container').click(); - await page.locator('.dropdown-item').filter({ hasText: 'Create workspace' }).click(); - const renameInput = page.locator('.workspace-name-input'); - await expect(renameInput).toBeVisible({ timeout: 5000 }); - await renameInput.fill('Terminal Workspace'); - await renameInput.press('Enter'); - await expect(page.getByText('Workspace created!')).toBeVisible({ timeout: 10000 }); - }); - - const wsDirs = findCreatedWorkspaceDirs(wsLocation); - expect(wsDirs).toHaveLength(1); - - await test.step('Open Manage Workspaces', async () => { - await page.locator('.workspace-name-container').click(); - await page.locator('.dropdown-item').filter({ hasText: 'Manage workspaces' }).click(); - await expect(page.getByText('Manage Workspace')).toBeVisible({ timeout: 5000 }); - }); - - await test.step('Verify default workspace has no actions menu', async () => { - const defaultWorkspaceItem = page.locator('.workspace-item').filter({ hasText: 'My Workspace' }); - await expect(defaultWorkspaceItem.locator('.more-actions-btn')).toHaveCount(0); - }); + test.describe('Manage workspace actions-open in terminal', () => { + test('TC-3109: Verify that the workspace should open terminal from the workspace actions menu', { tag: '@sanity' }, async ({ page }) => { + await openTerminalFromWorkspaceActions(page, 'Custom Workspace'); + const locators = buildManageWorkspaceLocators(page); + await expect(locators.terminalSession()).toBeVisible(); + await expect(locators.terminalSession()).toContainText('Custom Workspace'); + }); + }); - await test.step('Open terminal from workspace actions', async () => { - const workspaceItem = page.locator('.workspace-item').filter({ hasText: 'Terminal Workspace' }); - await expect(workspaceItem).toBeVisible({ timeout: 5000 }); - await workspaceItem.locator('.more-actions-btn').click(); - await page.locator('.dropdown-item').filter({ hasText: 'Open in Terminal' }).click(); - }); + test.describe('Manage workspace actions-rename workspace', () => { + test('TC-2612: Verify renaming a workspace from manage workspace section.', { tag: '@sanity' }, async ({ page }) => { + const locators = buildManageWorkspaceLocators(page); + await clickOnMoreActionsButton(page, 'Custom Workspace'); + await renameOrRemoveWorkspaceOnPopup(page, 'Rename'); + await enterNewWorkspaceFilename(page, 'New Workspace Name', 'Rename'); + await expect(locators.renamedWorkspaceItem()).toHaveText('New Workspace Name'); + await expect(locators.workspaceItem().filter({ hasText: 'New Workspace Name' })).toBeVisible(); + }); + }); - await test.step('Verify terminal session opens at the workspace folder', async () => { - const terminalSession = page.getByTestId('session-list-0'); - await expect(terminalSession).toBeVisible({ timeout: 5000 }); - await expect(terminalSession).toContainText(wsDirs[0]); - }); - } finally { - await closeElectronApp(app); - } + test.describe('Manage Workspace Actions - Remove Workspace', () => { + test('TC-2611: Verify removing a Workspace from manage workspace section', { tag: '@sanity' }, async ({ page }) => { + const locators = buildManageWorkspaceLocators(page); + await clickOnMoreActionsButton(page, 'Custom Workspace'); + await renameOrRemoveWorkspaceOnPopup(page, 'Remove'); + await clickOnRemoveButtonOnPopup(page); + await expect(locators.workspaceItem().filter({ hasText: 'Custom Workspace' })).not.toBeVisible({ timeout: 10000 }); + }); }); });