summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTobias Järvelöv <tobias.jarvelov@mullvad.net>2025-10-02 14:41:55 +0200
committerTobias Järvelöv <tobias.jarvelov@mullvad.net>2025-10-06 10:02:53 +0200
commitfa9f91a4f11dc13c64c6a007ceeb6fb08e956e52 (patch)
tree5ac6819bca247e14e560eae5d43355f32f40e770
parent806de1e268f8c97144d6ace322e8b0de585e25b5 (diff)
downloadmullvadvpn-fa9f91a4f11dc13c64c6a007ceeb6fb08e956e52.tar.xz
mullvadvpn-fa9f91a4f11dc13c64c6a007ceeb6fb08e956e52.zip
Add Linux Split tunneling supported test
-rw-r--r--desktop/packages/mullvad-vpn/test/e2e/mocked/split-tunneling/split-tunneling.spec.ts125
1 files changed, 125 insertions, 0 deletions
diff --git a/desktop/packages/mullvad-vpn/test/e2e/mocked/split-tunneling/split-tunneling.spec.ts b/desktop/packages/mullvad-vpn/test/e2e/mocked/split-tunneling/split-tunneling.spec.ts
index cd2eb5cc2e..cb0f0d717e 100644
--- a/desktop/packages/mullvad-vpn/test/e2e/mocked/split-tunneling/split-tunneling.spec.ts
+++ b/desktop/packages/mullvad-vpn/test/e2e/mocked/split-tunneling/split-tunneling.spec.ts
@@ -66,3 +66,128 @@ test.describe('Linux Split tunneling unsupported', () => {
await expect(unsupportedText).not.toBeVisible();
});
});
+
+test.describe('Linux Split tunneling supported', () => {
+ if (process.platform !== 'linux') {
+ test.skip();
+ }
+
+ test.afterAll(async () => {
+ await page.close();
+ });
+
+ test.beforeAll(async () => {
+ await startup();
+ });
+
+ test.beforeAll(async () => {
+ await util.ipc.linuxSplitTunneling.isSplitTunnelingSupported.handle(true);
+ await util.ipc.linuxSplitTunneling.getApplications.handle(linuxApplicationsList);
+ });
+
+ test('App list items should be shown', async () => {
+ const linuxApplications = routes.splitTunnelingSettings.getLinuxApplications();
+ await expect(linuxApplications).toHaveCount(3);
+ });
+
+ test('App list items should be filterered when searching', async () => {
+ // List should be unfiltered at first
+ const linuxApplications = routes.splitTunnelingSettings.getLinuxApplications();
+ await expect(linuxApplications).toHaveCount(3);
+
+ // List should only show 2 matching items
+ await routes.splitTunnelingSettings.fillSearchInput('launches');
+ await expect(linuxApplications).toHaveCount(2);
+ let applicationNames = await linuxApplications.allInnerTexts();
+ expect(applicationNames).toEqual(['launches-elsewhere', 'launches-in-existing-process']);
+
+ // List should only show 1 matching item
+ await routes.splitTunnelingSettings.fillSearchInput('app');
+ await expect(linuxApplications).toHaveCount(1);
+ applicationNames = await linuxApplications.allInnerTexts();
+ expect(applicationNames).toEqual(['app']);
+
+ // Clearing the search value should show all list items
+ await routes.splitTunnelingSettings.clearSearchInput();
+ await expect(linuxApplications).toHaveCount(3);
+ applicationNames = await linuxApplications.allInnerTexts();
+ expect(applicationNames).toEqual(['app', 'launches-elsewhere', 'launches-in-existing-process']);
+ });
+
+ test('App list items should be launched when clicked', async () => {
+ // Launch the "app" application from the list
+ await Promise.all([
+ util.ipc.linuxSplitTunneling.launchApplication.expect({ success: true }),
+ routes.splitTunnelingSettings.openLinuxApplication('app'),
+ ]);
+ });
+
+ test('App list items with "launches-in-existing-process" warnings should show warning dialog when clicked', async () => {
+ // Try to open the application in the list to display the warning dialog
+ await routes.splitTunnelingSettings.openLinuxApplication('launches-in-existing-process');
+
+ // Ensure warning dialog is visible
+ const warningText =
+ routes.splitTunnelingSettings.getLinuxApplicationWarningLaunchesInExistingProcessDialogText(
+ 'launches-in-existing-process',
+ );
+ await expect(warningText).toBeVisible();
+
+ // Close the warning dialog
+ await routes.splitTunnelingSettings.closeLinuxApplicationWarningLaunchesInExistingProcessDialog();
+ await expect(warningText).not.toBeVisible();
+
+ // Try to open the application again to display the warning dialog again
+ await routes.splitTunnelingSettings.openLinuxApplication('launches-in-existing-process');
+ await expect(warningText).toBeVisible();
+
+ // Launch the application from the warning dialog
+ await Promise.all([
+ util.ipc.linuxSplitTunneling.launchApplication.expect({ success: true }),
+ routes.splitTunnelingSettings.openLinuxApplicationFromWarningLaunchesInExistingProcessDialogText(),
+ ]);
+
+ // Ensure the warning dialog is not visible after application has launched
+ await expect(warningText).not.toBeVisible();
+ });
+
+ test('App list items with "launches-elsewhere" warnings should show warning dialog when clicked', async () => {
+ // Ensure clicking the application in the list makes the warning dialog visible
+ await routes.splitTunnelingSettings.openLinuxApplication('launches-elsewhere');
+
+ const warningText =
+ routes.splitTunnelingSettings.getLinuxApplicationWarningLaunchesElsewhereDialogText(
+ 'launches-elsewhere',
+ );
+ await expect(warningText).toBeVisible();
+
+ // Close the warning dialog
+ await routes.splitTunnelingSettings.closeLinuxApplicationWarningLaunchesElsewhereDialog();
+ await expect(warningText).not.toBeVisible();
+ });
+
+ test('App should launch file picker when button Find another app button is clicked', async () => {
+ // Ensure clicking the "Find another app" button opens the file picker
+ await Promise.all([
+ util.ipc.app.showOpenDialog.expect({
+ canceled: false,
+ bookmarks: [],
+ filePaths: [],
+ }),
+ routes.splitTunnelingSettings.openFindAnotherApp(),
+ ]);
+
+ // Ensure selecting an application with the file picker will launch the application
+ await Promise.all([
+ util.ipc.app.showOpenDialog.expect({
+ canceled: false,
+ bookmarks: [],
+ filePaths: ['/app'],
+ }),
+ routes.splitTunnelingSettings.openFindAnotherApp(),
+ util.ipc.linuxSplitTunneling.launchApplication.expect({
+ success: true,
+ }),
+ ]);
+ });
+});