mirror of
https://github.com/usebruno/bruno.git
synced 2026-06-30 16:14:06 +00:00
* Add proxy .pac file resolver chore(dependencies): update package-lock.json with new dependencies and version upgrades - Added new dependencies: ajv, git-url-parse, @opencollection/types, and storybook packages. - Updated existing dependencies to their latest versions, including eslint and babel packages. - Removed deprecated entries and cleaned up the package-lock structure for better maintainability. * tests * wip * wip * wip * wip * feat: file upload .pac * wip * wip * wip * wip * wip * wip * wip * wip * feat: Refactor proxy settings to use a new structure for PAC configuration. Introduced 'source' field to determine proxy type (manual or PAC) and updated related validation and state management. Removed deprecated 'pacUrl' field in favor of 'pac.source'. Updated preferences schema and test data accordingly. * fix: Update proxy settings to correctly reference 'source' field for PAC configuration. Adjusted state management and validation logic to align with new structure. Enhanced tests for backward compatibility and new format handling. * feat: Enhance proxy configuration by adding 'proxyModeReason' to provide context for proxy settings. Updated related functions to accommodate the new parameter and improved logging for proxy mode changes. * wip * refactor: Update proxy settings to remove 'inherit' field and replace it with 'source' for better clarity. Adjusted validation schema, default preferences, and migration logic to align with the new structure. Enhanced tests to ensure compatibility with the updated proxy configuration. * wip * wip * wip * wip * wip * chore: consistent path check * chore: consistency * tests(pac): fix unit params --------- Co-authored-by: Gianluca D'Abrosca <gianluca.dabrosca.1999@gmail.com> Co-authored-by: Sid <siddharth@usebruno.com>
348 lines
11 KiB
JavaScript
348 lines
11 KiB
JavaScript
let mockStoreData = {};
|
|
|
|
jest.mock('electron-store', () => {
|
|
return jest.fn().mockImplementation((opts = {}) => {
|
|
return {
|
|
get: (key, fallback) => (key in mockStoreData ? mockStoreData[key] : fallback),
|
|
set: (key, value) => {
|
|
mockStoreData[key] = value;
|
|
}
|
|
};
|
|
});
|
|
});
|
|
|
|
const { getPreferences, savePreferences } = require('../../src/store/preferences');
|
|
|
|
describe('Proxy Preferences Migration', () => {
|
|
beforeEach(() => {
|
|
mockStoreData = {};
|
|
});
|
|
|
|
describe('Default Proxy Settings', () => {
|
|
it('should default to source: inherit for new users (empty preferences)', () => {
|
|
mockStoreData['preferences'] = {};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('inherit');
|
|
expect(preferences.proxy.disabled).toBeUndefined();
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
expect(preferences.proxy.config).toBeDefined();
|
|
expect(preferences.proxy.config.protocol).toBe('http');
|
|
expect(preferences.proxy.config.hostname).toBe('');
|
|
expect(preferences.proxy.config.port).toBeNull();
|
|
});
|
|
|
|
it('should default to source: manual, disabled: true for existing users without proxy settings', () => {
|
|
mockStoreData['preferences'] = {
|
|
request: { sslVerification: true },
|
|
font: { codeFont: 'default', codeFontSize: 13 }
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('manual');
|
|
expect(preferences.proxy.disabled).toBe(true);
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
expect(preferences.proxy.config.protocol).toBe('http');
|
|
expect(preferences.proxy.config.hostname).toBe('');
|
|
expect(preferences.proxy.config.port).toBeNull();
|
|
expect(preferences.proxy.config.auth.username).toBe('');
|
|
expect(preferences.proxy.config.auth.password).toBe('');
|
|
expect(preferences.proxy.config.bypassProxy).toBe('');
|
|
});
|
|
});
|
|
|
|
describe('v3 Format (no migration needed)', () => {
|
|
it('should handle source: manual', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
source: 'manual',
|
|
config: {
|
|
protocol: 'http',
|
|
hostname: 'proxy.example.com',
|
|
port: 8080,
|
|
auth: { username: 'user', password: 'pass' },
|
|
bypassProxy: 'localhost'
|
|
}
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('manual');
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
expect(preferences.proxy.config.hostname).toBe('proxy.example.com');
|
|
expect(preferences.proxy.config.port).toBe(8080);
|
|
});
|
|
|
|
it('should handle source: inherit', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
source: 'inherit',
|
|
config: { protocol: 'http', hostname: '', port: null, auth: { username: '', password: '' }, bypassProxy: '' }
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('inherit');
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
});
|
|
|
|
it('should handle source: pac', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
source: 'pac',
|
|
pac: { source: 'http://internal/proxy.pac' },
|
|
config: { protocol: 'http', hostname: '', port: null, auth: { username: '', password: '' }, bypassProxy: '' }
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('pac');
|
|
expect(preferences.proxy.pac.source).toBe('http://internal/proxy.pac');
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
});
|
|
|
|
it('should handle disabled: true with source: manual', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
disabled: true,
|
|
source: 'manual',
|
|
config: { protocol: 'http', hostname: '', port: null, auth: { username: '', password: '' }, bypassProxy: '' }
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.disabled).toBe(true);
|
|
expect(preferences.proxy.source).toBe('manual');
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
});
|
|
|
|
it('should handle auth.disabled: true', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
source: 'manual',
|
|
config: {
|
|
protocol: 'http',
|
|
hostname: 'proxy.example.com',
|
|
port: 8080,
|
|
auth: { disabled: true, username: 'user', password: 'pass' },
|
|
bypassProxy: ''
|
|
}
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.config.auth.disabled).toBe(true);
|
|
expect(preferences.proxy.config.auth.username).toBe('user');
|
|
});
|
|
});
|
|
|
|
describe('v2 → v3 Migration (inherit boolean → source string)', () => {
|
|
it('should migrate inherit: true → source: system', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
inherit: true,
|
|
config: { protocol: 'http', hostname: '', port: null, auth: { username: '', password: '' }, bypassProxy: '' }
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('inherit');
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
});
|
|
|
|
it('should migrate inherit: false (no source) → source: manual', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
inherit: false,
|
|
config: { protocol: 'http', hostname: 'proxy.example.com', port: 8080, auth: { username: 'user', password: 'pass' }, bypassProxy: '' }
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('manual');
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
expect(preferences.proxy.config.hostname).toBe('proxy.example.com');
|
|
});
|
|
|
|
it('should migrate inherit: false, source: pac → source: pac (preserved)', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
inherit: false,
|
|
source: 'pac',
|
|
pac: { source: 'http://internal/proxy.pac' },
|
|
config: { protocol: 'http', hostname: '', port: null, auth: { username: '', password: '' }, bypassProxy: '' }
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('pac');
|
|
expect(preferences.proxy.pac.source).toBe('http://internal/proxy.pac');
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
});
|
|
|
|
it('should save migrated v2 → v3 back to disk', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
inherit: true,
|
|
config: { protocol: 'http', hostname: '', port: null, auth: { username: '', password: '' }, bypassProxy: '' }
|
|
}
|
|
};
|
|
|
|
getPreferences();
|
|
|
|
expect(mockStoreData['preferences'].proxy.inherit).toBeUndefined();
|
|
expect(mockStoreData['preferences'].proxy.source).toBe('inherit');
|
|
});
|
|
});
|
|
|
|
describe('v1 → v3 Migration (enabled boolean)', () => {
|
|
it('should migrate enabled: true → source: manual', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
enabled: true,
|
|
protocol: 'http',
|
|
hostname: 'proxy.example.com',
|
|
port: 8080,
|
|
auth: { enabled: true, username: 'user', password: 'pass' },
|
|
bypassProxy: 'localhost'
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('manual');
|
|
expect(preferences.proxy.disabled).toBeUndefined();
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
expect(preferences.proxy.config.hostname).toBe('proxy.example.com');
|
|
expect(preferences.proxy.config.port).toBe(8080);
|
|
});
|
|
|
|
it('should migrate enabled: false → source: manual, disabled: true', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
enabled: false,
|
|
protocol: 'http',
|
|
hostname: '',
|
|
port: null,
|
|
auth: { enabled: false, username: '', password: '' },
|
|
bypassProxy: ''
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('manual');
|
|
expect(preferences.proxy.disabled).toBe(true);
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
});
|
|
|
|
it('should migrate auth.enabled: false → auth.disabled: true', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
enabled: true,
|
|
protocol: 'http',
|
|
hostname: 'proxy.example.com',
|
|
port: 8080,
|
|
auth: { enabled: false, username: 'user', password: 'pass' },
|
|
bypassProxy: ''
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.config.auth.disabled).toBe(true);
|
|
expect(preferences.proxy.config.auth.username).toBe('user');
|
|
});
|
|
|
|
it('should save migrated v1 → v3 back to disk', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
enabled: true,
|
|
protocol: 'http',
|
|
hostname: 'proxy.example.com',
|
|
port: 8080,
|
|
auth: { enabled: true, username: 'user', password: 'pass' },
|
|
bypassProxy: ''
|
|
}
|
|
};
|
|
|
|
getPreferences();
|
|
|
|
expect(mockStoreData['preferences'].proxy.enabled).toBeUndefined();
|
|
expect(mockStoreData['preferences'].proxy.source).toBe('manual');
|
|
});
|
|
});
|
|
|
|
describe('v1 → v3 Migration (mode string)', () => {
|
|
it('should migrate mode: off → source: manual, disabled: true', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
mode: 'off',
|
|
protocol: 'http',
|
|
hostname: '',
|
|
port: null,
|
|
auth: { enabled: false, username: '', password: '' },
|
|
bypassProxy: ''
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('manual');
|
|
expect(preferences.proxy.disabled).toBe(true);
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
});
|
|
|
|
it('should migrate mode: on → source: manual', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
mode: 'on',
|
|
protocol: 'https',
|
|
hostname: 'proxy.example.com',
|
|
port: 8443,
|
|
auth: { enabled: true, username: 'user', password: 'pass' },
|
|
bypassProxy: '*.local'
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('manual');
|
|
expect(preferences.proxy.disabled).toBeUndefined();
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
expect(preferences.proxy.config.protocol).toBe('https');
|
|
expect(preferences.proxy.config.hostname).toBe('proxy.example.com');
|
|
expect(preferences.proxy.config.port).toBe(8443);
|
|
});
|
|
|
|
it('should migrate mode: system → source: inherit', () => {
|
|
mockStoreData['preferences'] = {
|
|
proxy: {
|
|
mode: 'system',
|
|
protocol: 'http',
|
|
hostname: '',
|
|
port: null,
|
|
auth: { enabled: false, username: '', password: '' },
|
|
bypassProxy: ''
|
|
}
|
|
};
|
|
|
|
const preferences = getPreferences();
|
|
|
|
expect(preferences.proxy.source).toBe('inherit');
|
|
expect(preferences.proxy.disabled).toBeUndefined();
|
|
expect(preferences.proxy.inherit).toBeUndefined();
|
|
});
|
|
});
|
|
});
|