Skip to content

Commit 0b34361

Browse files
committed
fix: prompt for sign in when toggling coder connect on
1 parent ebcb698 commit 0b34361

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)