Files
bruno/tests/request/encoding/curl-encoding.spec.ts
sanish chirayath 8b230043c1 Enable encodeUrl setting to control URL encoding in generated snippets (#7187)
* feat(snippet-generator): implement encodeUrl setting to control URL encoding in generated snippets

* refactor(snippet-generator): rename and enhance URL encoding logic for better clarity and functionality

* feat(snippet-generator): enhance raw URL handling to preserve user encoding choices and improve snippet generation

* test(snippet-generator): add tests for URL fragment handling based on encodeUrl setting

* test(snippet-generator): improve comments on URL fragment handling to clarify RFC compliance

* feat(url): enhance interpolateUrlPathParams to support raw URL handling, preserving user encoding choices for snippet generation

* fix(url): ensure URLs are prefixed with http:// if missing in interpolateUrlPathParams function

* refactor(snippet-generator): streamline URL handling logic to improve snippet generation and ensure proper encoding based on settings

* feat(url): add stripOrigin utility to simplify URL processing in snippet generation

* test(snippet-generator): add test for double-encoding of pre-encoded URLs when encodeUrl is true

* feat(encoding): implement URL encoding settings and add tests for encoding behavior

* fix: address PR review comments (#7187)

- Remove unnecessary no-op jest.mock for @usebruno/common/utils
- Add length guard to prevent catastrophic replaceAll('/') on root-path URLs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* empty commit

* fix(tests): update interpolateUrlPathParams tests to use correct parameter structure

* empty commit

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 15:46:24 +05:30

86 lines
3.3 KiB
TypeScript

import { test, expect } from '../../../playwright';
import { openCollection } from '../../utils/page';
import { buildCommonLocators } from '../../utils/page/locators';
test.describe('Code Generation URL Encoding', () => {
test.describe('when encodeUrl is true', () => {
test('should encode unencoded URL (spaces to %20)', async ({ pageWithUserData: page }) => {
const { sidebar, request, modal } = buildCommonLocators(page);
await openCollection(page, 'encoding-test');
await sidebar.request('encode-url-unencoded').click();
await request.generateCodeButton().click();
await expect(page.getByRole('dialog')).toBeVisible();
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 modal.closeButton().click();
await modal.closeButton().waitFor({ state: 'hidden' });
});
test('should double-encode pre-encoded URL (%20 to %2520)', async ({ pageWithUserData: page }) => {
const { sidebar, request, modal } = buildCommonLocators(page);
await openCollection(page, 'encoding-test');
await sidebar.request('encode-url-preencoded').click();
await request.generateCodeButton().click();
await expect(page.getByRole('dialog')).toBeVisible();
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%2520Doe');
await modal.closeButton().click();
await modal.closeButton().waitFor({ state: 'hidden' });
});
});
test.describe('when encodeUrl is false', () => {
test('should preserve unencoded URL as-is (spaces kept)', async ({ pageWithUserData: page }) => {
const { sidebar, request, modal } = buildCommonLocators(page);
await openCollection(page, 'encoding-test');
await sidebar.request('raw-url-unencoded').click();
await request.generateCodeButton().click();
await expect(page.getByRole('dialog')).toBeVisible();
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 Doe');
await modal.closeButton().click();
await modal.closeButton().waitFor({ state: 'hidden' });
});
test('should preserve pre-encoded URL as-is', async ({ pageWithUserData: page }) => {
const { sidebar, request, modal } = buildCommonLocators(page);
await openCollection(page, 'encoding-test');
await sidebar.request('raw-url-preencoded').click();
await request.generateCodeButton().click();
await expect(page.getByRole('dialog')).toBeVisible();
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 modal.closeButton().click();
await modal.closeButton().waitFor({ state: 'hidden' });
});
});
});