-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathVPNMenuTests.swift
124 lines (104 loc) · 3.66 KB
/
VPNMenuTests.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
@testable import Coder_Desktop
import SwiftUI
import Testing
import ViewInspector
@MainActor
@Suite(.timeLimit(.minutes(1)))
struct VPNMenuTests {
let vpn: MockVPNService
let fsd: MockFileSyncDaemon
let state: AppState
let sut: VPNMenu<MockVPNService, MockFileSyncDaemon>
let view: any View
init() {
vpn = MockVPNService()
state = AppState(persistent: false)
sut = VPNMenu<MockVPNService, MockFileSyncDaemon>()
fsd = MockFileSyncDaemon()
view = sut.environmentObject(vpn).environmentObject(state).environmentObject(fsd)
}
@Test
func testVPNLoggedOut() async throws {
try await ViewHosting.host(view) {
try await sut.inspection.inspect { view in
let toggle = try view.find(ViewType.Toggle.self)
#expect(!toggle.isDisabled())
#expect(throws: Never.self) { try view.find(text: "Sign in to use Coder Desktop") }
#expect(throws: Never.self) { try view.find(button: "Sign in") }
}
}
}
@Test
func testStartStopCalled() async throws {
try await ViewHosting.host(view) {
try await sut.inspection.inspect { view in
var toggle = try view.find(ViewType.Toggle.self)
#expect(try !toggle.isOn())
vpn.onStart = {
vpn.state = .connected
}
await vpn.start()
toggle = try view.find(ViewType.Toggle.self)
#expect(try toggle.isOn())
vpn.onStop = {
vpn.state = .disabled
}
await vpn.stop()
#expect(try !toggle.isOn())
}
}
}
@Test
func testVPNDisabledWhileConnecting() async throws {
vpn.state = .disabled
try await ViewHosting.host(view) {
try await sut.inspection.inspect { view in
var toggle = try view.find(ViewType.Toggle.self)
#expect(try !toggle.isOn())
vpn.onStart = {
vpn.state = .connecting
}
await vpn.start()
toggle = try view.find(ViewType.Toggle.self)
#expect(toggle.isDisabled())
}
}
}
@Test
func testVPNDisabledWhileDisconnecting() async throws {
vpn.state = .disabled
try await ViewHosting.host(view) {
try await sut.inspection.inspect { view in
var toggle = try view.find(ViewType.Toggle.self)
#expect(try !toggle.isOn())
vpn.onStart = {
vpn.state = .connected
}
await vpn.start()
#expect(try toggle.isOn())
vpn.onStop = {
vpn.state = .disconnecting
}
await vpn.stop()
toggle = try view.find(ViewType.Toggle.self)
#expect(toggle.isDisabled())
}
}
}
@Test
func testOffWhenFailed() async throws {
state.login(baseAccessURL: URL(string: "https://coder.example.com")!, sessionToken: "fake-token")
try await ViewHosting.host(view) {
try await sut.inspection.inspect { view in
let toggle = try view.find(ViewType.Toggle.self)
#expect(try !toggle.isOn())
vpn.onStart = {
vpn.state = .failed(.internalError("This is a long error message!"))
}
await vpn.start()
#expect(try !toggle.isOn())
#expect(!toggle.isDisabled())
}
}
}
}