mirror of
https://github.com/usebruno/bruno.git
synced 2026-06-11 09:51:30 +00:00
190 lines
8.6 KiB
TypeScript
190 lines
8.6 KiB
TypeScript
import { execSync } from 'child_process';
|
|
import { test, expect } from '../../../playwright';
|
|
import { Page, ElectronApplication } from '@playwright/test';
|
|
import path from 'path';
|
|
import { waitForReadyPage } from '../../utils/page';
|
|
import { openCollection } from '../../utils/page/actions';
|
|
import { buildCommonLocators } from '../../utils/page/locators';
|
|
|
|
/**
|
|
* Helper function to restart app and get fresh state with locators
|
|
*/
|
|
const restartAppAndGetLocators = async (restartApp: (options?: { initUserDataPath?: string }) => Promise<ElectronApplication>): Promise<{ app: ElectronApplication; page: Page; locators: ReturnType<typeof buildCommonLocators> }> => {
|
|
const app = await restartApp();
|
|
const page = await waitForReadyPage(app);
|
|
const locators = buildCommonLocators(page);
|
|
return { app, page, locators };
|
|
};
|
|
|
|
// TODO: These tests need to be updated for the new workspace UI
|
|
// The CollectionsHeader component (with collections-header-actions-menu-close-all) is not rendered in workspace mode
|
|
// The "Remove from workspace" flow is different from the old "Close collection" flow
|
|
test.describe.skip('Close All Collections', () => {
|
|
test.afterAll(async () => {
|
|
// Reset the request file to the original state after saving changes
|
|
execSync(`git checkout -- "${path.join(__dirname, 'fixtures', 'collections', 'collection 1', 'test-request.bru')}"`);
|
|
});
|
|
|
|
test('should show/hide close all icon based on hover state', async ({ pageWithUserData: page }) => {
|
|
const locators = buildCommonLocators(page);
|
|
|
|
await test.step('Verify initial state', async () => {
|
|
await expect(locators.sidebar.collection('collection 1')).toBeVisible();
|
|
const closeAllButton = locators.sidebar.closeAllCollectionsButton();
|
|
await expect(closeAllButton).toHaveCSS('opacity', '0');
|
|
});
|
|
|
|
await test.step('Hover to show icon', async () => {
|
|
const closeAllButton = locators.sidebar.closeAllCollectionsButton();
|
|
await locators.sidebar.collectionsContainer().hover();
|
|
await expect(closeAllButton).toHaveCSS('opacity', '1');
|
|
});
|
|
|
|
await test.step('Move mouse away to hide icon', async () => {
|
|
const closeAllButton = locators.sidebar.closeAllCollectionsButton();
|
|
await page.mouse.move(0, 0);
|
|
await expect(closeAllButton).toHaveCSS('opacity', '0');
|
|
});
|
|
});
|
|
|
|
test('should handle closing all collections without unsaved changes', async ({ restartApp }) => {
|
|
const { page, locators } = await restartAppAndGetLocators(restartApp);
|
|
|
|
await test.step('Verify collections are visible', async () => {
|
|
await expect(locators.sidebar.collection('collection 1')).toBeVisible();
|
|
await expect(locators.sidebar.collection('collection 2')).toBeVisible();
|
|
});
|
|
|
|
await test.step('Cancel closing collections', async () => {
|
|
// Hover and click close all icon
|
|
await locators.sidebar.collectionsContainer().hover();
|
|
await locators.sidebar.closeAllCollectionsButton().click();
|
|
|
|
// Verify confirmation modal appears
|
|
const confirmModal = locators.modal.byTitle('Close all collections');
|
|
await expect(confirmModal).toBeVisible();
|
|
|
|
// Click "Cancel" to dismiss the modal
|
|
await locators.modal.closeButton().click();
|
|
|
|
// Verify collections are still visible
|
|
await expect(locators.sidebar.collection('collection 1')).toBeVisible();
|
|
await expect(locators.sidebar.collection('collection 2')).toBeVisible();
|
|
});
|
|
|
|
await test.step('Confirm closing collections', async () => {
|
|
// Hover and click close all icon again
|
|
await locators.sidebar.collectionsContainer().hover();
|
|
await locators.sidebar.closeAllCollectionsButton().click();
|
|
|
|
// Verify confirmation modal appears
|
|
const confirmModal = locators.modal.byTitle('Close all collections');
|
|
await expect(confirmModal).toBeVisible();
|
|
|
|
// Click "Close All" to confirm
|
|
await locators.modal.button('Close All').click();
|
|
|
|
// Verify collections are closed
|
|
await expect(locators.sidebar.collection('collection 1')).not.toBeVisible();
|
|
await expect(locators.sidebar.collection('collection 2')).not.toBeVisible();
|
|
});
|
|
});
|
|
|
|
test('should discard changes and close collections when Discard and Close is clicked', async ({ restartApp }) => {
|
|
const { page, locators: newLocators } = await restartAppAndGetLocators(restartApp);
|
|
|
|
await test.step('Verify collections are visible', async () => {
|
|
await expect(newLocators.sidebar.collection('collection 1')).toBeVisible();
|
|
await expect(newLocators.sidebar.collection('collection 2')).toBeVisible();
|
|
});
|
|
|
|
await test.step('Create unsaved changes', async () => {
|
|
await openCollection(page, 'collection 1');
|
|
await newLocators.sidebar.request('test-request').click();
|
|
|
|
const urlContainer = page.locator('#request-url');
|
|
await expect(urlContainer).toBeVisible();
|
|
|
|
const codeMirrorEditor = urlContainer.locator('.CodeMirror');
|
|
await codeMirrorEditor.click();
|
|
await page.keyboard.type('modified');
|
|
});
|
|
|
|
await test.step('Trigger close all and discard changes', async () => {
|
|
await newLocators.sidebar.collectionsContainer().hover();
|
|
await newLocators.sidebar.closeAllCollectionsButton().click();
|
|
|
|
const unsavedChangesModal = newLocators.modal.byTitle('Close all collections');
|
|
await expect(unsavedChangesModal).toBeVisible();
|
|
await expect(unsavedChangesModal.getByText('Do you want to save')).toBeVisible();
|
|
|
|
await newLocators.modal.button('Discard and Close').click();
|
|
|
|
await expect(page.getByText('Closed all collections')).toBeVisible();
|
|
await expect(newLocators.sidebar.collection('collection 1')).not.toBeVisible();
|
|
await expect(newLocators.sidebar.collection('collection 2')).not.toBeVisible();
|
|
});
|
|
|
|
await test.step('Restart app to verify changes were discarded', async () => {
|
|
const { page: restartedPage, locators: restartedLocators } = await restartAppAndGetLocators(restartApp);
|
|
|
|
await expect(restartedLocators.sidebar.collection('collection 1')).toBeVisible();
|
|
await openCollection(restartedPage, 'collection 1');
|
|
await restartedLocators.sidebar.request('test-request').click();
|
|
|
|
const urlContainerAfterReopen = restartedPage.locator('#request-url');
|
|
await expect(urlContainerAfterReopen).toBeVisible();
|
|
const urlAfterReopen = await urlContainerAfterReopen.locator('.CodeMirror').textContent();
|
|
expect(urlAfterReopen).not.toContain('modified');
|
|
});
|
|
});
|
|
|
|
test('should save changes and close collections when Save and Close is clicked', async ({ restartApp }) => {
|
|
const { page, locators: newLocators } = await restartAppAndGetLocators(restartApp);
|
|
|
|
await test.step('Verify collections are visible', async () => {
|
|
await expect(newLocators.sidebar.collection('collection 1')).toBeVisible();
|
|
await expect(newLocators.sidebar.collection('collection 2')).toBeVisible();
|
|
});
|
|
|
|
await test.step('Create unsaved changes', async () => {
|
|
await openCollection(page, 'collection 1');
|
|
await newLocators.sidebar.request('test-request').click();
|
|
|
|
const urlContainer = page.locator('#request-url');
|
|
await expect(urlContainer).toBeVisible();
|
|
|
|
const codeMirrorEditor = urlContainer.locator('.CodeMirror');
|
|
await codeMirrorEditor.click();
|
|
await page.keyboard.type('modified');
|
|
});
|
|
|
|
await test.step('Trigger close all and save changes', async () => {
|
|
await newLocators.sidebar.collectionsContainer().hover();
|
|
await newLocators.sidebar.closeAllCollectionsButton().click();
|
|
|
|
const unsavedChangesModal = newLocators.modal.byTitle('Close all collections');
|
|
await expect(unsavedChangesModal).toBeVisible();
|
|
await expect(unsavedChangesModal.getByText('Do you want to save')).toBeVisible();
|
|
|
|
await newLocators.modal.button('Save and Close').click();
|
|
|
|
await expect(newLocators.sidebar.collection('collection 1')).not.toBeVisible();
|
|
await expect(newLocators.sidebar.collection('collection 2')).not.toBeVisible();
|
|
});
|
|
|
|
await test.step('Restart app to verify changes were saved', async () => {
|
|
const { page: restartedPage, locators: restartedLocators } = await restartAppAndGetLocators(restartApp);
|
|
|
|
await expect(restartedLocators.sidebar.collection('collection 1')).toBeVisible();
|
|
await openCollection(restartedPage, 'collection 1');
|
|
await restartedLocators.sidebar.request('test-request').click();
|
|
|
|
const urlContainerAfterReopen = restartedPage.locator('#request-url');
|
|
await expect(urlContainerAfterReopen).toBeVisible();
|
|
const urlAfterReopen = await urlContainerAfterReopen.locator('.CodeMirror').textContent();
|
|
expect(urlAfterReopen).toContain('modified');
|
|
});
|
|
});
|
|
});
|