summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOskar Nyberg <oskar@mullvad.net>2022-09-06 15:41:08 +0200
committerHank <hank@mullvad.net>2022-09-20 11:32:56 +0200
commit61691a099015652c66b8931e2767df0bb7c10c3f (patch)
treedb3053effd6dedc47c28dca7a6f1d16dbb4d54fb
parentb0b74d00d5234405205e4a1527791c820a06fa78 (diff)
downloadmullvadvpn-61691a099015652c66b8931e2767df0bb7c10c3f.tar.xz
mullvadvpn-61691a099015652c66b8931e2767df0bb7c10c3f.zip
Add sepearate implementation for main-process for tests
-rw-r--r--gui/e2e/main.spec.ts3
-rw-r--r--gui/e2e/setup/main.ts195
-rw-r--r--gui/e2e/utils.ts2
-rw-r--r--gui/src/main/relay-list.ts8
-rw-r--r--gui/src/renderer/redux/store.ts2
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();
}