mirror of
https://github.com/usebruno/bruno.git
synced 2026-06-14 11:21:30 +00:00
* feat: add dropdown for quick request creation in tab bar - Create reusable CreateUntitledRequest component with customizable trigger - Add generateUniqueRequestName utility for unique request naming - Replace modal-based request creation with dropdown in tab bar - Support HTTP, GraphQL, WebSocket, and gRPC request types - Generate unique names (Untitled, Untitled1, etc.) automatically - Create requests at collection root level * Update request creation and collection components * Fix dropdown positioning and styling when appended to document.body - Change appendTo from 'parent' to document.body for absolute positioning - Add comprehensive styling via onShow handler to ensure proper width, padding, text color, and opacity - Add global styles as fallback for dropdown elements - Ensure dropdown overlaps parent without expanding it * Update RequestTabs and Collection components * Add curl paste detection and parsing for HTTP requests * Fix generateUniqueRequestName to check filesystem for existing files * feat: add placeholder text to HTTP request URL input Add helpful placeholder text 'Enter URL or paste a cURL request' to the HTTP request URL input field. This guides users on how to use the input field, indicating they can either enter a URL directly or paste a cURL command which will be automatically parsed. * Simplify request creation in collection menu * fix: fixed issues with cURL paste for GraphQL requests in the URL input bar * fix: added icons to create request dropdown * fix: fixed the icon | text gap in dropdown * fix: removed unnecessary updates on the Dropdown Component * added onCreate to Dropdown to remove unwanted diffs * fix: simplified the generateUniqueRequestName function. ai writes complex code * chore: formatting and removed unnecessary diffs * Update packages/bruno-app/src/components/RequestPane/QueryUrl/index.js Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * chore: format * Fix failing E2E tests by updating to new request creation flow - Replace #create-new-tab selector with new dropdown flow using createUntitledRequest helper - Update generateUniqueRequestName to handle .bru, .yml, and .yaml file extensions - Add createUntitledRequest helper function with optional URL and tag parameters - Update all failing tests to use the new helper function - Fix selectors from .collection-item-name to .item-name where needed - All 13 previously failing tests now pass * chore: removed unused import --------- Co-authored-by: Sid <siddharth@usebruno.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
107 lines
4.5 KiB
TypeScript
107 lines
4.5 KiB
TypeScript
import { test, expect } from '../../../playwright';
|
|
import { closeAllCollections, createUntitledRequest } from '../../utils/page';
|
|
|
|
test.describe('Code Generation URL Encoding', () => {
|
|
test.afterEach(async ({ page }) => {
|
|
try {
|
|
const modalCloseButton = page.locator('[data-test-id="modal-close-button"]');
|
|
if (await modalCloseButton.isVisible()) {
|
|
await modalCloseButton.click();
|
|
await modalCloseButton.waitFor({ state: 'hidden' });
|
|
}
|
|
} catch (e) {}
|
|
|
|
await closeAllCollections(page);
|
|
});
|
|
|
|
test('Should generate code with proper URL encoding for unencoded input', async ({
|
|
page,
|
|
createTmpDir
|
|
}) => {
|
|
// Use plus icon button in new workspace UI
|
|
await page.getByTestId('collections-header-add-menu').click();
|
|
await page.locator('.tippy-box .dropdown-item').filter({ hasText: 'Create collection' }).click();
|
|
await page.getByLabel('Name').fill('unencoded-test-collection');
|
|
const locationInput = page.getByLabel('Location');
|
|
if (await locationInput.isVisible()) {
|
|
await locationInput.fill(await createTmpDir('unencoded-test-collection'));
|
|
}
|
|
await page.locator('.bruno-modal').getByRole('button', { name: 'Create', exact: true }).click();
|
|
|
|
await expect(page.locator('#sidebar-collection-name').filter({ hasText: 'unencoded-test-collection' })).toBeVisible();
|
|
await page.locator('#sidebar-collection-name').filter({ hasText: 'unencoded-test-collection' }).click();
|
|
await page.getByLabel('Safe Mode').check();
|
|
await page.getByRole('button', { name: 'Save' }).click();
|
|
|
|
// Create a new request using the new dropdown flow
|
|
await createUntitledRequest(page, {
|
|
requestType: 'HTTP',
|
|
url: 'http://base.source?name=John Doe'
|
|
});
|
|
|
|
// Find the untitled request and click on it
|
|
await page.locator('.item-name').filter({ hasText: /^Untitled/ }).first().click();
|
|
|
|
await page.locator('#send-request .infotip').first().click();
|
|
|
|
await expect(page.getByRole('dialog')).toBeVisible();
|
|
await expect(page.getByRole('dialog').locator('.bruno-modal-header-title')).toContainText('Generate Code');
|
|
|
|
const codeEditor = page.locator('.editor-content .CodeMirror').first();
|
|
await expect(codeEditor).toBeVisible();
|
|
|
|
const generatedCode = await codeEditor.textContent();
|
|
|
|
expect(generatedCode).toContain('http://base.source/?name=John%20Doe');
|
|
|
|
await page.locator('[data-test-id="modal-close-button"]').click();
|
|
|
|
await page.locator('[data-test-id="modal-close-button"]').waitFor({ state: 'hidden' });
|
|
});
|
|
|
|
test('Should generate code with proper URL encoding for encoded input', async ({
|
|
page,
|
|
createTmpDir
|
|
}) => {
|
|
// Use plus icon button in new workspace UI
|
|
await page.getByTestId('collections-header-add-menu').click();
|
|
await page.locator('.tippy-box .dropdown-item').filter({ hasText: 'Create collection' }).click();
|
|
await page.getByLabel('Name').fill('encoded-test-collection');
|
|
const locationInput = page.getByLabel('Location');
|
|
if (await locationInput.isVisible()) {
|
|
await locationInput.fill(await createTmpDir('encoded-test-collection'));
|
|
}
|
|
await page.locator('.bruno-modal').getByRole('button', { name: 'Create', exact: true }).click();
|
|
|
|
await expect(page.locator('#sidebar-collection-name').filter({ hasText: 'encoded-test-collection' })).toBeVisible();
|
|
await page.locator('#sidebar-collection-name').filter({ hasText: 'encoded-test-collection' }).click();
|
|
await page.getByLabel('Safe Mode').check();
|
|
await page.getByRole('button', { name: 'Save' }).click();
|
|
|
|
// Create a new request using the new dropdown flow
|
|
await createUntitledRequest(page, {
|
|
requestType: 'HTTP',
|
|
url: 'http://base.source?name=John%20Doe'
|
|
});
|
|
|
|
// Find the untitled request and click on it
|
|
await page.locator('.item-name').filter({ hasText: /^Untitled/ }).first().click();
|
|
|
|
await page.locator('#send-request .infotip').first().click();
|
|
|
|
await expect(page.getByRole('dialog')).toBeVisible();
|
|
await expect(page.getByRole('dialog').locator('.bruno-modal-header-title')).toContainText('Generate Code');
|
|
|
|
const codeEditor = page.locator('.editor-content .CodeMirror').first();
|
|
await expect(codeEditor).toBeVisible();
|
|
|
|
const generatedCode = await codeEditor.textContent();
|
|
|
|
expect(generatedCode).toContain('http://base.source/?name=John%20Doe');
|
|
|
|
await page.locator('[data-test-id="modal-close-button"]').click();
|
|
|
|
await page.locator('[data-test-id="modal-close-button"]').waitFor({ state: 'hidden' });
|
|
});
|
|
});
|