fix(proxy): proxy config export from v2 to import in v3 (#8112)

* FIXED regression for proxy config from v2 to v3

* REMOVED console.log

* ADDED test case with fixture to test proxy import

* ADDED proxy handling for older brunoConfig in  packages/bruno-electron/src/utils/collection-import.js

* RESOLVED githiub converstation

changed afterAll --> afterEach

* ADDED guard to transformProxyConfig(brunoConfig.proxy) function
This commit is contained in:
Abhishek Patil
2026-06-01 19:14:41 +05:30
committed by GitHub
parent f23e406ef8
commit 462a39308d
4 changed files with 135 additions and 3 deletions

View File

@@ -28,6 +28,7 @@ const { cookiesStore } = require('../store/cookies');
const { parseLargeRequestWithRedaction } = require('../utils/parse'); const { parseLargeRequestWithRedaction } = require('../utils/parse');
const { wsClient } = require('../ipc/network/ws-event-handlers'); const { wsClient } = require('../ipc/network/ws-event-handlers');
const { hasSubDirectories } = require('../utils/filesystem'); const { hasSubDirectories } = require('../utils/filesystem');
const { transformProxyConfig } = require('@usebruno/requests');
const { const {
DEFAULT_GITIGNORE, DEFAULT_GITIGNORE,
@@ -1227,7 +1228,9 @@ const registerRendererEventHandlers = (mainWindow, watcher) => {
ignore: ['node_modules', '.git'] ignore: ['node_modules', '.git']
}; };
} }
if (brunoConfig.proxy) {
brunoConfig.proxy = transformProxyConfig(brunoConfig.proxy);
}
return brunoConfig; return brunoConfig;
}; };
@@ -2442,7 +2445,7 @@ const registerRendererEventHandlers = (mainWindow, watcher) => {
await fsExtra.move(collectionDir, finalCollectionPath); await fsExtra.move(collectionDir, finalCollectionPath);
if (tempDir !== collectionDir) { if (tempDir !== collectionDir) {
await fsExtra.remove(tempDir).catch(() => {}); await fsExtra.remove(tempDir).catch(() => { });
} }
const uid = generateUidBasedOnHash(finalCollectionPath); const uid = generateUidBasedOnHash(finalCollectionPath);
@@ -2455,7 +2458,7 @@ const registerRendererEventHandlers = (mainWindow, watcher) => {
return finalCollectionPath; return finalCollectionPath;
} catch (error) { } catch (error) {
await fsExtra.remove(tempDir).catch(() => {}); await fsExtra.remove(tempDir).catch(() => { });
throw error; throw error;
} }
} catch (error) { } catch (error) {

View File

@@ -4,6 +4,7 @@ const { ipcMain } = require('electron');
const { sanitizeName, createDirectory, writeFile, safeWriteFileSync, getCollectionStats } = require('./filesystem'); const { sanitizeName, createDirectory, writeFile, safeWriteFileSync, getCollectionStats } = require('./filesystem');
const { generateUidBasedOnHash, stringifyJson } = require('./common'); const { generateUidBasedOnHash, stringifyJson } = require('./common');
const { stringifyRequestViaWorker, stringifyCollection, stringifyEnvironment, stringifyFolder, DEFAULT_COLLECTION_FORMAT } = require('@usebruno/filestore'); const { stringifyRequestViaWorker, stringifyCollection, stringifyEnvironment, stringifyFolder, DEFAULT_COLLECTION_FORMAT } = require('@usebruno/filestore');
const { transformProxyConfig } = require('@usebruno/requests/dist/cjs');
/** /**
* Recursively find a unique folder name by appending incremental numbers * Recursively find a unique folder name by appending incremental numbers
@@ -93,6 +94,10 @@ async function importCollection(collection, collectionLocation, mainWindow, uniq
}; };
} }
if (brunoConfig.proxy) {
brunoConfig.proxy = transformProxyConfig(brunoConfig.proxy);
}
return brunoConfig; return brunoConfig;
}; };

View File

@@ -0,0 +1,87 @@
{
"name": "proxy-collection-v2",
"version": "1",
"items": [
{
"type": "http",
"name": "proxy-get",
"filename": "proxy-get.bru",
"seq": 1,
"settings": {
"encodeUrl": true,
"timeout": 0
},
"tags": [],
"request": {
"url": "https://httpbin.org/get?paramName=paramValue",
"method": "GET",
"headers": [
{
"name": "headerKey",
"value": "headerValue",
"enabled": true
}
],
"params": [
{
"name": "paramName",
"value": "paramValue",
"type": "query",
"enabled": true
}
],
"body": {
"mode": "none",
"formUrlEncoded": [],
"multipartForm": [],
"file": []
},
"script": {},
"vars": {},
"assertions": [],
"tests": "",
"docs": "",
"auth": {
"mode": "inherit"
}
}
}
],
"environments": [],
"root": {
"request": {
"headers": [
{
"name": "collectionHeader",
"value": "collectionHeaderValue",
"enabled": true,
"uid": "ZPXDKmXFtuYkq1KLjYIlz"
}
]
},
"docs": "This is collection Doc"
},
"brunoConfig": {
"version": "1",
"name": "proxy-collection-v2",
"type": "collection",
"ignore": [
"node_modules",
".git"
],
"size": 0.0001430511474609375,
"filesCount": 1,
"proxy": {
"enabled": true,
"protocol": "http",
"hostname": "127.0.0.1",
"port": 8080,
"auth": {
"enabled": false,
"username": "",
"password": ""
},
"bypassProxy": ""
}
}
}

View File

@@ -0,0 +1,37 @@
import path from 'path';
import { test, expect } from '../../../playwright';
import { importCollection, closeAllCollections } from '../../utils/page';
import { buildCommonLocators } from '../../utils/page/locators';
test.describe('Import Bruno v2 JSON collection', () => {
test.afterEach(async ({ page }) => {
await closeAllCollections(page);
});
test('proxy settings are preserved after importing a v2 JSON collection', async ({ page, createTmpDir }) => {
const collectionName = 'proxy-collection-v2';
const collectionFile = path.join(__dirname, 'fixtures', 'bruno-v2-json-collection-with-proxy.json');
const locators = buildCommonLocators(page);
await test.step('Import v2 JSON collection', async () => {
await importCollection(page, collectionFile, await createTmpDir('v2-json-proxy-import'), {
expectedCollectionName: collectionName
});
});
await test.step('Open collection settings → Proxy tab', async () => {
await locators.sidebar.collection(collectionName).hover();
await locators.actions.collectionActions(collectionName).click();
await locators.dropdown.item('Settings').click();
await locators.paneTabs.collectionSettingsTab('proxy').click();
});
await test.step('Verify proxy settings match the imported file', async () => {
await expect(page.locator('input[name="enabled"][value="true"]')).toBeChecked();
await expect(page.locator('input[name="protocol"][value="http"]')).toBeChecked();
await expect(page.locator('#hostname')).toHaveValue('127.0.0.1');
await expect(page.locator('#port')).toHaveValue('8080');
await expect(page.locator('input[name="auth.disabled"]')).not.toBeChecked();
});
});
});