diff options
| -rw-r--r-- | gui/e2e/main.spec.ts | 3 | ||||
| -rw-r--r-- | gui/e2e/setup/main.ts | 195 | ||||
| -rw-r--r-- | gui/e2e/utils.ts | 2 | ||||
| -rw-r--r-- | gui/src/main/relay-list.ts | 8 | ||||
| -rw-r--r-- | gui/src/renderer/redux/store.ts | 2 |
5 files changed, 199 insertions, 11 deletions
diff --git a/gui/e2e/main.spec.ts b/gui/e2e/main.spec.ts index 444ced7c23..92e40d1af3 100644 --- a/gui/e2e/main.spec.ts +++ b/gui/e2e/main.spec.ts @@ -92,7 +92,4 @@ test('Validate status and header', async () => { }); expect(headerColor).toBe('rgb(68, 173, 77)'); await appWindow.screenshot({ path: 'e2e/screenshots/secure.png' }); - - await appWindow.locator('text=Disconnect').click(); - await expect(statusSpan).toContainText('UNSECURED CONNECTION'); }); diff --git a/gui/e2e/setup/main.ts b/gui/e2e/setup/main.ts new file mode 100644 index 0000000000..090cef9695 --- /dev/null +++ b/gui/e2e/setup/main.ts @@ -0,0 +1,195 @@ +import { app, BrowserWindow } from 'electron'; +import * as path from 'path'; + +import { getDefaultSettings } from '../../src/main/default-settings'; +import { changeIpcWebContents, IpcMainEventChannel } from '../../src/main/ipc-event-channel'; +import { loadTranslations } from '../../src/main/load-translations'; +import { + DeviceState, + IAccountData, + IAppVersionInfo, + ILocation, + IRelayList, +} from '../../src/shared/daemon-rpc-types'; +import { messages, relayLocations } from '../../src/shared/gettext'; +import { IGuiSettingsState } from '../../src/shared/gui-settings-state'; +import { ITranslations, MacOsScrollbarVisibility } from '../../src/shared/ipc-schema'; +import { ICurrentAppVersionInfo } from '../../src/shared/ipc-types'; + +const DEBUG = false; + +class ApplicationMain { + private guiSettings: IGuiSettingsState = { + preferredLocale: 'en', + autoConnect: false, + enableSystemNotifications: true, + monochromaticIcon: false, + startMinimized: false, + unpinnedWindow: process.platform !== 'win32' && process.platform !== 'darwin', + browsedForSplitTunnelingApplications: [], + changelogDisplayedForVersion: '', + }; + + private settings = getDefaultSettings(); + + private translations: ITranslations = { locale: this.guiSettings.preferredLocale }; + + private isConnectedToDaemon = true; + + private accountData: IAccountData = { + expiry: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), + }; + + private deviceState: DeviceState = { + type: 'logged in', + accountAndDevice: { + accountToken: '1234123412341234', + device: { + id: '1234', + name: 'Testing Mole', + ports: [], + created: new Date(), + }, + }, + }; + + private currentVersion: ICurrentAppVersionInfo = { + gui: '2000.1', + daemon: '2000.1', + isConsistent: true, + isBeta: false, + }; + private upgradeVersion: IAppVersionInfo = { + supported: true, + suggestedUpgrade: undefined, + }; + + private location: ILocation = { + country: 'Sweden', + city: 'Gothenburg', + latitude: 58, + longitude: 12, + mullvadExitIp: false, + }; + + private relayList: IRelayList = { + countries: [ + { + name: 'Sweden', + code: 'se', + cities: [ + { + name: 'Gothenburg', + code: 'got', + latitude: 58, + longitude: 12, + relays: [ + { + hostname: 'se-got-wg-101', + provider: 'mullvad', + ipv4AddrIn: '127.0.0.1', + includeInCountry: true, + active: true, + weight: 0, + owned: true, + endpointType: 'wireguard', + }, + ], + }, + ], + }, + ], + }; + + public constructor() { + app.enableSandbox(); + app.on('ready', this.onReady); + } + + private onReady = async () => { + this.updateCurrentLocale('en'); + + const window = new BrowserWindow({ + useContentSize: true, + width: 320, + height: 568, + resizable: false, + maximizable: false, + fullscreenable: false, + show: DEBUG, + frame: true, + webPreferences: { + preload: path.join(__dirname, '../../src/renderer/preloadBundle.js'), + nodeIntegration: false, + nodeIntegrationInWorker: false, + nodeIntegrationInSubFrames: false, + sandbox: true, + contextIsolation: true, + spellcheck: false, + devTools: DEBUG, + }, + }); + + changeIpcWebContents(window.webContents); + + this.registerIpcListeners(); + + // @ts-ignore + const filePath = path.resolve(path.join(__dirname, '../../src/renderer/index.html')); + await window.loadFile(filePath); + + if (DEBUG) { + window.webContents.openDevTools({ mode: 'detach' }); + } + }; + + private registerIpcListeners() { + IpcMainEventChannel.state.handleGet(() => ({ + isConnected: this.isConnectedToDaemon, + autoStart: false, + accountData: this.accountData, + accountHistory: undefined, + tunnelState: { state: 'disconnected' }, + settings: this.settings, + isPerformingPostUpgrade: false, + deviceState: this.deviceState, + relayListPair: { relays: this.relayList, bridges: this.relayList }, + currentVersion: this.currentVersion, + upgradeVersion: this.upgradeVersion, + guiSettings: this.guiSettings, + translations: this.translations, + windowsSplitTunnelingApplications: [], + macOsScrollbarVisibility: MacOsScrollbarVisibility.whenScrolling, + changelog: [], + forceShowChanges: false, + navigationHistory: undefined, + scrollPositions: {}, + })); + + IpcMainEventChannel.location.handleGet(() => Promise.resolve(this.location)); + + IpcMainEventChannel.guiSettings.handleSetPreferredLocale((locale) => { + this.updateCurrentLocale(locale); + IpcMainEventChannel.guiSettings.notify?.(this.guiSettings); + return Promise.resolve(this.translations); + }); + } + + private updateCurrentLocale(locale: string) { + this.guiSettings.preferredLocale = locale; + + const messagesTranslations = loadTranslations(this.guiSettings.preferredLocale, messages); + const relayLocationsTranslations = loadTranslations( + this.guiSettings.preferredLocale, + relayLocations, + ); + + this.translations = { + locale: this.guiSettings.preferredLocale, + messages: messagesTranslations, + relayLocations: relayLocationsTranslations, + }; + } +} + +new ApplicationMain(); diff --git a/gui/e2e/utils.ts b/gui/e2e/utils.ts index 78e2229b36..2fb14dc027 100644 --- a/gui/e2e/utils.ts +++ b/gui/e2e/utils.ts @@ -10,7 +10,7 @@ const startApp = async (): Promise<StartAppResponse> => { process.env.CI = 'e2e'; const electronApp = await electron.launch({ - args: ['.'], + args: ['build/e2e/setup/main.js'], }); const appWindow = await electronApp.firstWindow(); diff --git a/gui/src/main/relay-list.ts b/gui/src/main/relay-list.ts index 8583f58776..b43548e6a1 100644 --- a/gui/src/main/relay-list.ts +++ b/gui/src/main/relay-list.ts @@ -1,11 +1,7 @@ import { BridgeState, IRelayList, liftConstraint, RelaySettings } from '../shared/daemon-rpc-types'; +import { IRelayListPair } from '../shared/ipc-schema'; import { IpcMainEventChannel } from './ipc-event-channel'; -interface RelayLists { - relays: IRelayList; - bridges: IRelayList; -} - export default class RelayList { private relays: IRelayList = { countries: [] }; @@ -32,7 +28,7 @@ export default class RelayList { relayList: IRelayList, relaySettings: RelaySettings, bridgeState: BridgeState, - ): RelayLists { + ): IRelayListPair { const filteredRelays = this.processRelaysForPresentation(relayList, relaySettings); const filteredBridges = this.processBridgesForPresentation(relayList, bridgeState); diff --git a/gui/src/renderer/redux/store.ts b/gui/src/renderer/redux/store.ts index d0969dbf85..cd343883e7 100644 --- a/gui/src/renderer/redux/store.ts +++ b/gui/src/renderer/redux/store.ts @@ -62,7 +62,7 @@ function composeEnhancers(): typeof compose { return window.env.development ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ actionCreators })() + (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?.({ actionCreators })() ?? compose() : compose(); } |
