@@ -84,7 +84,7 @@ class InternetConnectionStatusProviderTests: XCTestCase {
84
84
XCTAssertEqual ( connectionStatusReceiver. connectionStatusHasChangedStub. callCounter, 3 )
85
85
}
86
86
87
- func testHasConnection_whenConnectedViaVPN_andPingFails_itShouldReturnNotConnected ( ) {
87
+ func testHasConnection_whenConnectedViaVPN_andBothPingTargetsAreFailed_itShouldReturnNotConnected ( ) {
88
88
sut. register ( receiver: connectionStatusReceiver, fireWhenRegister: false )
89
89
90
90
let expectation1 = expectation ( description: " status updated " )
@@ -98,22 +98,25 @@ class InternetConnectionStatusProviderTests: XCTestCase {
98
98
let expected : [ NWInterface . InterfaceType ] = [ . wifi, . other]
99
99
return expected. contains ( interface)
100
100
}
101
- session. dataTaskStub. bodyIs { _, request, handler in
101
+ session. dataStub. bodyIs { call, request in
102
+ let error = NSError ( domain: " pm.test " , code: - 999 )
102
103
guard let link = request. url? . absoluteString else {
103
104
XCTFail ( " Link shouldn't be nil " )
104
- return MockURLSessionDataTaskProtocol ( )
105
+ throw error
105
106
}
106
- XCTAssertEqual ( link, " https://status.proton.me " )
107
- let error = NSError ( domain: " pm.test " , code: - 999 )
108
- handler ( nil , nil , error)
109
- return MockURLSessionDataTaskProtocol ( )
107
+ if call == 1 {
108
+ XCTAssertEqual ( link, " https://mail-api.proton.me/core/v4/tests/ping " )
109
+ } else {
110
+ XCTAssertEqual ( link, " https://status.proton.me " )
111
+ }
112
+ throw error
110
113
}
111
114
112
115
updateConnection ( isConnected: true , interfaces: [ . other] )
113
116
wait ( for: [ expectation1] , timeout: 5 )
114
117
}
115
118
116
- func testHasConnection_whenConnectedViaVPN_andPingSucceeds_itShouldReturnConnected ( ) {
119
+ func testHasConnection_whenConnectedViaVPN_andServerPingSucceeds_itShouldReturnConnected ( ) {
117
120
sut. register ( receiver: connectionStatusReceiver, fireWhenRegister: false )
118
121
let expectation1 = expectation ( description: " status updated " )
119
122
connectionStatusReceiver. connectionStatusHasChangedStub. bodyIs { _, newStatus in
@@ -126,19 +129,79 @@ class InternetConnectionStatusProviderTests: XCTestCase {
126
129
let expected : [ NWInterface . InterfaceType ] = [ . wifi, . other]
127
130
return expected. contains ( interface)
128
131
}
129
- session. dataTaskStub . bodyIs { _ , request, handler in
132
+ session. dataStub . bodyIs { call , request in
130
133
guard let link = request. url? . absoluteString else {
131
134
XCTFail ( " Link shouldn't be nil " )
132
- return MockURLSessionDataTaskProtocol ( )
135
+ throw NSError ( domain : " pm.test " , code : - 999 )
133
136
}
134
- XCTAssertEqual ( link, " https://status.proton.me " )
135
- handler ( nil , nil , nil )
136
- return MockURLSessionDataTaskProtocol ( )
137
+ XCTAssertEqual ( link, " https://mail-api.proton.me/core/v4/tests/ping " )
138
+ return ( Data ( ) , URLResponse ( ) )
137
139
}
138
140
139
141
updateConnection ( isConnected: true , interfaces: [ . other, . wifi] )
140
142
wait ( for: [ expectation1] , timeout: 5 )
141
143
}
144
+
145
+ func testHasConnection_whenConnectedViaVPN_serverPingFailedButStatusPageSuccess_itShouldReturnConnected( ) {
146
+ sut. register ( receiver: connectionStatusReceiver, fireWhenRegister: false )
147
+
148
+ let expectation1 = expectation ( description: " status updated " )
149
+ connectionStatusReceiver. connectionStatusHasChangedStub. bodyIs { _, newStatus in
150
+ XCTAssertEqual ( newStatus, . connected)
151
+ expectation1. fulfill ( )
152
+ }
153
+
154
+ mockNWPath. pathStatusStub. fixture = . satisfied
155
+ mockNWPath. usesInterfaceTypeStub. bodyIs { _, interface in
156
+ let expected : [ NWInterface . InterfaceType ] = [ . wifi, . other]
157
+ return expected. contains ( interface)
158
+ }
159
+ session. dataStub. bodyIs { call, request in
160
+ let error = NSError ( domain: " pm.test " , code: - 999 )
161
+ guard let link = request. url? . absoluteString else {
162
+ XCTFail ( " Link shouldn't be nil " )
163
+ throw error
164
+ }
165
+ if call == 1 {
166
+ XCTAssertEqual ( link, " https://mail-api.proton.me/core/v4/tests/ping " )
167
+ throw error
168
+ } else {
169
+ XCTAssertEqual ( link, " https://status.proton.me " )
170
+ return ( Data ( ) , URLResponse ( ) )
171
+ }
172
+ }
173
+
174
+ updateConnection ( isConnected: true , interfaces: [ . other] )
175
+ wait ( for: [ expectation1] , timeout: 5 )
176
+ }
177
+
178
+ func testHasConnection_whenConnectedViaVPN_receiveTooManyRedirection_itShouldReturnConnected( ) {
179
+ sut. register ( receiver: connectionStatusReceiver, fireWhenRegister: false )
180
+
181
+ let expectation1 = expectation ( description: " status updated " )
182
+ connectionStatusReceiver. connectionStatusHasChangedStub. bodyIs { _, newStatus in
183
+ XCTAssertEqual ( newStatus, . connected)
184
+ expectation1. fulfill ( )
185
+ }
186
+
187
+ mockNWPath. pathStatusStub. fixture = . satisfied
188
+ mockNWPath. usesInterfaceTypeStub. bodyIs { _, interface in
189
+ let expected : [ NWInterface . InterfaceType ] = [ . wifi, . other]
190
+ return expected. contains ( interface)
191
+ }
192
+ session. dataStub. bodyIs { call, request in
193
+ let error = NSError ( domain: " pm.test " , code: - 1007 )
194
+ guard let link = request. url? . absoluteString else {
195
+ XCTFail ( " Link shouldn't be nil " )
196
+ throw error
197
+ }
198
+ XCTAssertEqual ( link, " https://mail-api.proton.me/core/v4/tests/ping " )
199
+ throw error
200
+ }
201
+
202
+ updateConnection ( isConnected: true , interfaces: [ . other] )
203
+ wait ( for: [ expectation1] , timeout: 5 )
204
+ }
142
205
}
143
206
144
207
extension InternetConnectionStatusProviderTests {
0 commit comments