From ff6ec4a6895127130d2ef89240aded9b1105567e Mon Sep 17 00:00:00 2001 From: prateek-bruno Date: Tue, 28 Apr 2026 19:13:52 +0530 Subject: [PATCH] fix: "URL encoding off" ignored for multi-param URLs in generated code (#7769) --- .../utils/snippet-generator.js | 2 +- .../utils/snippet-generator.spec.js | 26 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/GenerateCodeItem/utils/snippet-generator.js b/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/GenerateCodeItem/utils/snippet-generator.js index a8a64b513..2feaab2fa 100644 --- a/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/GenerateCodeItem/utils/snippet-generator.js +++ b/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/GenerateCodeItem/utils/snippet-generator.js @@ -88,7 +88,7 @@ const generateSnippet = ({ language, item, collection, shouldInterpolate = false const settings = item.draft ? get(item, 'draft.settings') : get(item, 'settings'); const rawUrl = item.rawUrl || request.url; const parsed = parse(request.url, true, true); - const search = stringify(parsed.query); + const search = stringify(parsed.query, { sort: false }); const httpSnippetPath = search ? `${parsed.pathname}?${search}` : parsed.pathname; let desiredPath; diff --git a/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/GenerateCodeItem/utils/snippet-generator.spec.js b/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/GenerateCodeItem/utils/snippet-generator.spec.js index f6d492213..0a2822451 100644 --- a/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/GenerateCodeItem/utils/snippet-generator.spec.js +++ b/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/GenerateCodeItem/utils/snippet-generator.spec.js @@ -919,7 +919,7 @@ describe('generateSnippet – encodeUrl setting', () => { if (!parsed.query || Object.keys(parsed.query).length === 0) { return parsed.pathname; } - const search = stringify(parsed.query); + const search = stringify(parsed.query, { sort: false }); return search ? `${parsed.pathname}?${search}` : parsed.pathname; }; @@ -1240,4 +1240,28 @@ describe('generateSnippet – encodeUrl setting', () => { const result = generateSnippet({ language, item, collection: baseCollection, shouldInterpolate: false }); expect(result).toBe(`curl -X GET '${rawUrl}'`); }); + + it('should preserve raw URL with multiple query params in non-alphabetical order when encodeUrl is false', () => { + const rawUrl = 'https://example.com/api?start=2026-02-01T00:00:00.000Z&a=b'; + const item = makeItem(rawUrl, { encodeUrl: false }); + + const result = generateSnippet({ language, item, collection: baseCollection, shouldInterpolate: false }); + expect(result).toBe(`curl -X GET '${rawUrl}'`); + }); + + it('should encode URL with multiple query params in non-alphabetical order when encodeUrl is true', () => { + const rawUrl = 'https://example.com/api?start=2026-02-01T00:00:00.000Z&a=b'; + const item = makeItem(rawUrl, { encodeUrl: true }); + + const result = generateSnippet({ language, item, collection: baseCollection, shouldInterpolate: false }); + expect(result).toBe('curl -X GET \'https://example.com/api?start=2026-02-01T00%3A00%3A00.000Z&a=b\''); + }); + + it('should preserve param order in raw URL when encodeUrl is false and params are reverse-alphabetical', () => { + const rawUrl = 'https://example.com/api?z=last&a=first&m=middle'; + const item = makeItem(rawUrl, { encodeUrl: false }); + + const result = generateSnippet({ language, item, collection: baseCollection, shouldInterpolate: false }); + expect(result).toBe(`curl -X GET '${rawUrl}'`); + }); });