diff --git a/Furious/Window/SettingsPage.py b/Furious/Window/SettingsPage.py index 8215234..61953f3 100644 --- a/Furious/Window/SettingsPage.py +++ b/Furious/Window/SettingsPage.py @@ -646,7 +646,11 @@ class SettingsPage(Mixins.QTranslatable, QMainWindow): self.pluginSections = [] self._pluginActions = [] - self._tunModeAvailable = PLATFORM == 'Linux' or SystemRuntime.isAdmin() + if PLATFORM == 'Linux': + self._tunModeAvailable = not SystemRuntime.flatpakID() + else: + self._tunModeAvailable = SystemRuntime.isAdmin() + self.tunModeCard = _ToggleSettingsCard( 'shield-check.svg', 'VPNMode', diff --git a/tests/test_ui_behavior.py b/tests/test_ui_behavior.py index 71fde0a..d112ce5 100644 --- a/tests/test_ui_behavior.py +++ b/tests/test_ui_behavior.py @@ -353,7 +353,7 @@ class SettingsPageOrganizationTest(unittest.TestCase): """Finish deferred Settings-page deletion between tests.""" collectAtBoundary() - def buildPage(self, *, platform='Windows', flatpakID=''): + def buildPage(self, *, platform='Windows', flatpakID='', isAdmin=False): """Build one isolated Settings page for the requested platform state.""" callbacks = { 'checkForUpdates': mock.Mock(), @@ -369,7 +369,7 @@ class SettingsPageOrganizationTest(unittest.TestCase): mock.patch('Furious.Window.SettingsPage.PLATFORM', platform), mock.patch( 'Furious.Window.SettingsPage.SystemRuntime.isAdmin', - return_value=False, + return_value=isAdmin, ), mock.patch( 'Furious.Window.SettingsPage.SystemRuntime.flatpakID', @@ -444,6 +444,25 @@ class SettingsPageOrganizationTest(unittest.TestCase): page.close() page.deleteLater() + def testFlatpakShowsDisabledTunModeCardRegardlessOfPrivileges(self): + """Keep the Flatpak TUN mode toggle visible but always disabled.""" + for isAdmin in (False, True): + with self.subTest(isAdmin=isAdmin): + page, _callbacks = self.buildPage( + platform='Linux', + flatpakID='io.github.LorenEteval.Furious', + isAdmin=isAdmin, + ) + + self.assertIn(page.tunModeCard, page.generalSection.cards) + self.assertFalse(page.tunModeCard.checkBox.isEnabled()) + + page.setConnectionControlsEnabled(True) + self.assertFalse(page.tunModeCard.checkBox.isEnabled()) + + page.close() + page.deleteLater() + def testMovedCardsPreservePlatformVisibility(self): """Retain the existing restart, Darwin, and Flatpak visibility gates.""" cases = (