@@ -14,6 +14,15 @@ import io.kotest.matchers.types.beInstanceOf
14
14
import kotlinx.coroutines.TimeoutCancellationException
15
15
import org.json.JSONObject
16
16
17
+ class Mocks {
18
+ internal val mockConfigModel = MockHelper .configModelStore()
19
+ internal val response = MockHttpConnectionFactory .MockResponse ()
20
+ internal val factory = MockHttpConnectionFactory (response)
21
+ internal val httpClient by lazy {
22
+ HttpClient (factory, MockPreferencesService (), mockConfigModel)
23
+ }
24
+ }
25
+
17
26
class HttpClientTests : FunSpec ({
18
27
19
28
beforeAny {
@@ -22,20 +31,16 @@ class HttpClientTests : FunSpec({
22
31
23
32
test("timeout request will give a bad response") {
24
33
// Given
25
- val mockResponse = MockHttpConnectionFactory .MockResponse ()
26
- mockResponse.mockRequestTime = 10000 // HttpClient will add 5 seconds to the httpTimeout to "give up" so we need to fail the request more than 5 seconds beyond our timeout.
27
-
28
- val mockConfigModel =
29
- MockHelper .configModelStore {
30
- it.httpTimeout = 200
31
- it.httpGetTimeout = 200
32
- }
33
-
34
- val factory = MockHttpConnectionFactory (mockResponse)
35
- val httpClient = HttpClient (factory, MockPreferencesService (), mockConfigModel)
34
+ val mocks = Mocks ()
35
+ // HttpClient will add 5 seconds to the httpTimeout to "give up" so we need to fail the request more than 5 seconds beyond our timeout.
36
+ mocks.response.mockRequestTime = 10_000
37
+ mocks.mockConfigModel.model.let {
38
+ it.httpGetTimeout = 200
39
+ it.httpGetTimeout = 200
40
+ }
36
41
37
42
// When
38
- val response = httpClient.get("URL ")
43
+ val response = mocks. httpClient.get("URL ")
39
44
40
45
// Then
41
46
response.statusCode shouldBe 0
@@ -45,9 +50,8 @@ class HttpClientTests : FunSpec({
45
50
46
51
test("SDKHeader is included in all requests") {
47
52
// Given
48
- val mockResponse = MockHttpConnectionFactory .MockResponse ()
49
- val factory = MockHttpConnectionFactory (mockResponse)
50
- val httpClient = HttpClient (factory, MockPreferencesService (), MockHelper .configModelStore())
53
+ val mocks = Mocks ()
54
+ val httpClient = mocks.httpClient
51
55
52
56
// When
53
57
httpClient.get("URL ")
@@ -57,30 +61,31 @@ class HttpClientTests : FunSpec({
57
61
httpClient.put("URL ", JSONObject ())
58
62
59
63
// Then
60
- for (connection in factory.connections) {
64
+ for (connection in mocks. factory.connections) {
61
65
connection.getRequestProperty("SDK -Version ") shouldBe " onesignal/android/${OneSignalUtils .SDK_VERSION } "
62
66
}
63
67
}
64
68
65
69
test("GET with cache key uses cache when unchanged") {
66
70
// Given
71
+ val mocks = Mocks ()
67
72
val payload = " RESPONSE IS THIS"
68
73
val mockResponse1 = MockHttpConnectionFactory .MockResponse ()
69
74
mockResponse1.status = 200
70
75
mockResponse1.responseBody = payload
71
76
mockResponse1.mockProps.put("etag", "MOCK_ETAG ")
77
+ mocks.factory.mockResponse = mockResponse1
72
78
73
79
val mockResponse2 = MockHttpConnectionFactory .MockResponse ()
74
80
mockResponse2.status = 304
75
81
76
- val factory = MockHttpConnectionFactory (mockResponse1)
77
- val httpClient = HttpClient (factory, MockPreferencesService (), MockHelper .configModelStore())
82
+ val factory = mocks.factory
83
+ val httpClient = mocks.httpClient
78
84
79
85
// When
80
- var response1 = httpClient.get("URL ", "CACHE_KEY ")
81
-
86
+ val response1 = httpClient.get("URL ", "CACHE_KEY ")
82
87
factory.mockResponse = mockResponse2
83
- var response2 = httpClient.get("URL ", "CACHE_KEY ")
88
+ val response2 = httpClient.get("URL ", "CACHE_KEY ")
84
89
85
90
// Then
86
91
response1.statusCode shouldBe 200
@@ -92,12 +97,14 @@ class HttpClientTests : FunSpec({
92
97
93
98
test("GET with cache key replaces cache when changed") {
94
99
// Given
100
+ val mocks = Mocks ()
95
101
val payload1 = " RESPONSE IS THIS"
96
102
val payload2 = " A DIFFERENT RESPONSE"
97
103
val mockResponse1 = MockHttpConnectionFactory .MockResponse ()
98
104
mockResponse1.status = 200
99
105
mockResponse1.responseBody = payload1
100
106
mockResponse1.mockProps.put("etag", "MOCK_ETAG1 ")
107
+ mocks.factory.mockResponse = mockResponse1
101
108
102
109
val mockResponse2 = MockHttpConnectionFactory .MockResponse ()
103
110
mockResponse2.status = 200
@@ -107,17 +114,17 @@ class HttpClientTests : FunSpec({
107
114
val mockResponse3 = MockHttpConnectionFactory .MockResponse ()
108
115
mockResponse3.status = 304
109
116
110
- val factory = MockHttpConnectionFactory (mockResponse1)
111
- val httpClient = HttpClient (factory, MockPreferencesService (), MockHelper .configModelStore())
117
+ val factory = mocks.factory
118
+ val httpClient = mocks.httpClient
112
119
113
120
// When
114
- var response1 = httpClient.get("URL ", "CACHE_KEY ")
121
+ val response1 = httpClient.get("URL ", "CACHE_KEY ")
115
122
116
123
factory.mockResponse = mockResponse2
117
- var response2 = httpClient.get("URL ", "CACHE_KEY ")
124
+ val response2 = httpClient.get("URL ", "CACHE_KEY ")
118
125
119
126
factory.mockResponse = mockResponse3
120
- var response3 = httpClient.get("URL ", "CACHE_KEY ")
127
+ val response3 = httpClient.get("URL ", "CACHE_KEY ")
121
128
122
129
// Then
123
130
response1.statusCode shouldBe 200
@@ -132,16 +139,13 @@ class HttpClientTests : FunSpec({
132
139
133
140
test("Error response") {
134
141
// Given
142
+ val mocks = Mocks ()
135
143
val payload = " ERROR RESPONSE"
136
- val mockResponse = MockHttpConnectionFactory .MockResponse ()
137
- mockResponse.status = 400
138
- mockResponse.errorResponseBody = payload
139
-
140
- val factory = MockHttpConnectionFactory (mockResponse)
141
- val httpClient = HttpClient (factory, MockPreferencesService (), MockHelper .configModelStore())
144
+ mocks.response.status = 400
145
+ mocks.response.errorResponseBody = payload
142
146
143
147
// When
144
- var response = httpClient.post("URL ", JSONObject ())
148
+ val response = mocks. httpClient.post("URL ", JSONObject ())
145
149
146
150
// Then
147
151
response.statusCode shouldBe 400
@@ -150,50 +154,41 @@ class HttpClientTests : FunSpec({
150
154
151
155
test("should parse valid Retry -After , on 429") {
152
156
// Given
153
- val mockResponse = MockHttpConnectionFactory .MockResponse ()
154
- mockResponse.status = 429
155
- mockResponse.mockProps[" Retry-After" ] = " 1234"
156
- mockResponse.errorResponseBody = " {}"
157
-
158
- val factory = MockHttpConnectionFactory (mockResponse)
159
- val httpClient = HttpClient (factory, MockPreferencesService (), MockHelper .configModelStore())
157
+ val mocks = Mocks ()
158
+ mocks.response.status = 429
159
+ mocks.response.mockProps[" Retry-After" ] = " 1234"
160
+ mocks.response.errorResponseBody = " {}"
160
161
161
162
// When
162
- val response = httpClient.post("URL ", JSONObject ())
163
+ val response = mocks. httpClient.post("URL ", JSONObject ())
163
164
164
165
// Then
165
166
response.retryAfterSeconds shouldBe 1234
166
167
}
167
168
168
169
test("should parse valid Retry -After , on 500") {
169
170
// Given
170
- val mockResponse = MockHttpConnectionFactory .MockResponse ()
171
- mockResponse.status = 500
172
- mockResponse.mockProps[" Retry-After" ] = " 1234"
173
- mockResponse.errorResponseBody = " {}"
174
-
175
- val factory = MockHttpConnectionFactory (mockResponse)
176
- val httpClient = HttpClient (factory, MockPreferencesService (), MockHelper .configModelStore())
171
+ val mocks = Mocks ()
172
+ mocks.response.status = 500
173
+ mocks.response.mockProps[" Retry-After" ] = " 1234"
174
+ mocks.response.errorResponseBody = " {}"
177
175
178
176
// When
179
- val response = httpClient.post("URL ", JSONObject ())
177
+ val response = mocks. httpClient.post("URL ", JSONObject ())
180
178
181
179
// Then
182
180
response.retryAfterSeconds shouldBe 1234
183
181
}
184
182
185
183
test("should use set fallback retryAfterSeconds if can't parse Retry -After ") {
186
184
// Given
187
- val mockResponse = MockHttpConnectionFactory .MockResponse ()
188
- mockResponse.status = 429
189
- mockResponse.mockProps[" Retry-After" ] = " INVALID FORMAT"
190
- mockResponse.errorResponseBody = " {}"
191
-
192
- val factory = MockHttpConnectionFactory (mockResponse)
193
- val httpClient = HttpClient (factory, MockPreferencesService (), MockHelper .configModelStore())
185
+ val mocks = Mocks ()
186
+ mocks.response.status = 429
187
+ mocks.response.mockProps[" Retry-After" ] = " INVALID FORMAT"
188
+ mocks.response.errorResponseBody = " {}"
194
189
195
190
// When
196
- val response = httpClient.post("URL ", JSONObject ())
191
+ val response = mocks. httpClient.post("URL ", JSONObject ())
197
192
198
193
// Then
199
194
response.retryAfterSeconds shouldBe 60
@@ -203,15 +198,12 @@ class HttpClientTests : FunSpec({
203
198
// Retry-After we should assume a our safe fallback.
204
199
test("should use set fallback retryAfterSeconds if 429 and Retry -After is missing") {
205
200
// Given
206
- val mockResponse = MockHttpConnectionFactory .MockResponse ()
207
- mockResponse.status = 429
208
- mockResponse.errorResponseBody = " {}"
209
-
210
- val factory = MockHttpConnectionFactory (mockResponse)
211
- val httpClient = HttpClient (factory, MockPreferencesService (), MockHelper .configModelStore())
201
+ val mocks = Mocks ()
202
+ mocks.response.status = 429
203
+ mocks.response.errorResponseBody = " {}"
212
204
213
205
// When
214
- val response = httpClient.post("URL ", JSONObject ())
206
+ val response = mocks. httpClient.post("URL ", JSONObject ())
215
207
216
208
// Then
217
209
response.retryAfterSeconds shouldBe 60
0 commit comments