Skip to content

Commit faaa0af

Browse files
fix: prompt for sign in when toggling coder connect on (#204)
I undid the work of #114 in #158, by disabling the VPN toggle when the network extension was unconfigured. When signed out, the network extension is unconfigured. This PR adds a special exception to make the VPN toggle always clickable when signed out, as it has special behaviour when signed out. It also adds a proper regression test. A slightly different regression test existed, but it didn't account for cases where the VPN state is one that would normally disable the toggle.
1 parent ebcb698 commit faaa0af

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

Coder-Desktop/Coder-Desktop/Views/VPN/VPNMenu.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,15 @@ struct VPNMenu<VPN: VPNService, FS: FileSyncDaemon>: View {
117117
}
118118

119119
private var vpnDisabled: Bool {
120-
vpn.state == .connecting ||
121-
vpn.state == .disconnecting ||
122-
// Prevent starting the VPN before the user has approved the system extension.
123-
vpn.state == .failed(.systemExtensionError(.needsUserApproval)) ||
124-
// Prevent starting the VPN without a VPN configuration.
125-
vpn.state == .failed(.networkExtensionError(.unconfigured))
120+
// Always enabled if signed out, as that will open the sign in window
121+
state.hasSession && (
122+
vpn.state == .connecting ||
123+
vpn.state == .disconnecting ||
124+
// Prevent starting the VPN before the user has approved the system extension.
125+
vpn.state == .failed(.systemExtensionError(.needsUserApproval)) ||
126+
// Prevent starting the VPN without a VPN configuration.
127+
vpn.state == .failed(.networkExtensionError(.unconfigured))
128+
)
126129
}
127130
}
128131

Coder-Desktop/Coder-DesktopTests/VPNMenuTests.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@ struct VPNMenuTests {
3232
}
3333
}
3434

35+
@Test
36+
func testVPNLoggedOutUnconfigured() async throws {
37+
vpn.state = .failed(.networkExtensionError(.unconfigured))
38+
try await ViewHosting.host(view) {
39+
try await sut.inspection.inspect { view in
40+
let toggle = try view.find(ViewType.Toggle.self)
41+
// Toggle should be enabled even with a failure that would
42+
// normally make it disabled, because we're signed out.
43+
#expect(!toggle.isDisabled())
44+
#expect(throws: Never.self) { try view.find(text: "Sign in to use Coder Desktop") }
45+
#expect(throws: Never.self) { try view.find(button: "Sign in") }
46+
}
47+
}
48+
}
49+
3550
@Test
3651
func testStartStopCalled() async throws {
3752
try await ViewHosting.host(view) {
@@ -59,6 +74,7 @@ struct VPNMenuTests {
5974
@Test
6075
func testVPNDisabledWhileConnecting() async throws {
6176
vpn.state = .disabled
77+
state.login(baseAccessURL: URL(string: "https://coder.example.com")!, sessionToken: "fake-token")
6278

6379
try await ViewHosting.host(view) {
6480
try await sut.inspection.inspect { view in
@@ -79,6 +95,7 @@ struct VPNMenuTests {
7995
@Test
8096
func testVPNDisabledWhileDisconnecting() async throws {
8197
vpn.state = .disabled
98+
state.login(baseAccessURL: URL(string: "https://coder.example.com")!, sessionToken: "fake-token")
8299

83100
try await ViewHosting.host(view) {
84101
try await sut.inspection.inspect { view in

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy