wreq 1.2.5 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Cargo.lock +20 -13
- data/Cargo.toml +10 -2
- data/crates/wreq-util/src/emulate/macros.rs +12 -10
- data/crates/wreq-util/src/emulate/profile/chrome/header.rs +18 -3
- data/crates/wreq-util/src/emulate/profile/firefox/header.rs +16 -0
- data/crates/wreq-util/src/emulate/profile/opera/header.rs +6 -7
- data/crates/wreq-util/tests/client.rs +103 -1
- data/lib/wreq.rb +70 -45
- data/lib/wreq_ruby/body.rb +29 -11
- data/lib/wreq_ruby/client.rb +88 -55
- data/lib/wreq_ruby/cookie.rb +79 -19
- data/lib/wreq_ruby/emulate.rb +74 -6
- data/lib/wreq_ruby/error.rb +5 -7
- data/lib/wreq_ruby/http.rb +74 -0
- data/lib/wreq_ruby/response.rb +3 -0
- data/script/build_windows_gnu.ps1 +6 -0
- data/src/arch.rs +22 -0
- data/src/client/body/form.rs +2 -0
- data/src/client/body/json.rs +47 -14
- data/src/client/body/stream.rs +147 -43
- data/src/client/body.rs +11 -15
- data/src/client/param.rs +7 -7
- data/src/client/req.rs +87 -47
- data/src/client/resp.rs +23 -24
- data/src/client.rs +310 -230
- data/src/cookie.rs +280 -87
- data/src/emulate.rs +85 -50
- data/src/error.rs +198 -41
- data/src/extractor.rs +16 -76
- data/src/header.rs +146 -23
- data/src/http.rs +62 -33
- data/src/lib.rs +26 -20
- data/src/macros.rs +71 -46
- data/src/options.rs +284 -0
- data/src/rt.rs +22 -11
- data/src/serde/de/array_deserializer.rs +48 -0
- data/src/serde/de/array_enumerator.rs +59 -0
- data/src/serde/de/deserializer.rs +307 -0
- data/src/serde/de/enum_deserializer.rs +47 -0
- data/src/serde/de/hash_deserializer.rs +89 -0
- data/src/serde/de/number_deserializer.rs +51 -0
- data/src/serde/de/variant_deserializer.rs +101 -0
- data/src/serde/de.rs +33 -0
- data/src/serde/error.rs +146 -0
- data/src/serde/ser/enums.rs +14 -0
- data/src/serde/ser/map_serializer.rs +56 -0
- data/src/serde/ser/seq_serializer.rs +71 -0
- data/src/serde/ser/serializer.rs +194 -0
- data/src/serde/ser/struct_serializer.rs +106 -0
- data/src/serde/ser/struct_variant_serializer.rs +44 -0
- data/src/serde/ser/tuple_variant_serializer.rs +41 -0
- data/src/serde/ser.rs +18 -0
- data/src/serde/tests.rs +237 -0
- data/src/serde.rs +202 -0
- data/test/body_sender_test.rb +246 -0
- data/test/cookie_test.rb +211 -10
- data/test/json_precision_test.rb +209 -0
- data/test/option_validation_test.rb +311 -0
- data/test/value_semantics_test.rb +238 -0
- metadata +25 -2
- data/src/header/helper.rs +0 -112
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
|
|
3
|
+
class OptionValidationTest < Minitest::Test
|
|
4
|
+
INVALID_URL = "not a url"
|
|
5
|
+
|
|
6
|
+
def test_unknown_client_option_names_every_invalid_key_without_values
|
|
7
|
+
secret = "must-not-appear"
|
|
8
|
+
|
|
9
|
+
error = assert_raises(ArgumentError) do
|
|
10
|
+
Wreq::Client.new(timout: secret, history: secret)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
assert_includes error.message, ":timout"
|
|
14
|
+
assert_includes error.message, ":history"
|
|
15
|
+
refute_includes error.message, secret
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_unknown_options_are_checked_before_known_values
|
|
19
|
+
secret = "must-not-appear"
|
|
20
|
+
|
|
21
|
+
error = assert_raises(ArgumentError) do
|
|
22
|
+
Wreq::Client.new(timeout: secret, history: Object.new, timout: secret)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
assert_includes error.message, ":history"
|
|
26
|
+
assert_includes error.message, ":timout"
|
|
27
|
+
refute_includes error.message, secret
|
|
28
|
+
|
|
29
|
+
conflict_error = assert_raises(ArgumentError) do
|
|
30
|
+
Wreq::Client.new(http1_only: true, http2_only: true, history: secret)
|
|
31
|
+
end
|
|
32
|
+
assert_includes conflict_error.message, ":history"
|
|
33
|
+
refute_includes conflict_error.message, secret
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_unknown_request_options_raise_for_client_and_module_methods
|
|
37
|
+
client_error = assert_raises(ArgumentError) do
|
|
38
|
+
Wreq::Client.new.get(INVALID_URL, history: true)
|
|
39
|
+
end
|
|
40
|
+
module_error = assert_raises(ArgumentError) do
|
|
41
|
+
Wreq.get(INVALID_URL, history: true)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
assert_includes client_error.message, ":history"
|
|
45
|
+
assert_includes module_error.message, ":history"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_hash_expansion_uses_the_same_validation
|
|
49
|
+
valid = {timeout: 1, allow_redirects: true, max_redirects: 2}
|
|
50
|
+
invalid = {timout: 1}
|
|
51
|
+
|
|
52
|
+
assert_instance_of Wreq::Client, Wreq::Client.new(**valid)
|
|
53
|
+
error = assert_raises(ArgumentError) { Wreq::Client.new(**invalid) }
|
|
54
|
+
assert_includes error.message, ":timout"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_string_option_keys_are_supported_and_duplicate_forms_are_rejected
|
|
58
|
+
assert_instance_of Wreq::Client, Wreq::Client.new({"timeout" => 1})
|
|
59
|
+
|
|
60
|
+
error = assert_raises(ArgumentError) do
|
|
61
|
+
Wreq::Client.new({:timeout => 1, "timeout" => 2})
|
|
62
|
+
end
|
|
63
|
+
assert_includes error.message, "duplicate option: :timeout"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_non_string_or_symbol_option_key_raises_type_error
|
|
67
|
+
error = assert_raises(TypeError) { Wreq::Client.new({1 => true}) }
|
|
68
|
+
|
|
69
|
+
assert_includes error.message, "option keys"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_hash_subclass_cannot_hide_unknown_options
|
|
73
|
+
options_class = Class.new(Hash) do
|
|
74
|
+
def keys
|
|
75
|
+
[]
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
options = options_class.new
|
|
79
|
+
options[:timout] = 1
|
|
80
|
+
|
|
81
|
+
error = assert_raises(ArgumentError) { Wreq::Client.new(options) }
|
|
82
|
+
assert_includes error.message, ":timout"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_invalid_known_values_name_the_option
|
|
86
|
+
timeout_error = assert_raises(TypeError) do
|
|
87
|
+
Wreq::Client.new(timeout: "slow")
|
|
88
|
+
end
|
|
89
|
+
address_error = assert_raises(ArgumentError) do
|
|
90
|
+
Wreq::Client.new(local_address: "not-an-address")
|
|
91
|
+
end
|
|
92
|
+
proxy_error = assert_raises(TypeError) do
|
|
93
|
+
Wreq::Client.new(proxy: Object.new)
|
|
94
|
+
end
|
|
95
|
+
proxy_uri_error = assert_raises(Wreq::BuilderError) do
|
|
96
|
+
Wreq::Client.new(proxy: "invalid://")
|
|
97
|
+
end
|
|
98
|
+
orig_headers_error = assert_raises(Wreq::BuilderError) do
|
|
99
|
+
Wreq.get(INVALID_URL, orig_headers: ["Accept", Object.new])
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
assert_includes timeout_error.message, ":timeout"
|
|
103
|
+
assert_includes address_error.message, ":local_address"
|
|
104
|
+
assert_includes proxy_error.message, ":proxy"
|
|
105
|
+
assert_includes proxy_uri_error.message, ":proxy"
|
|
106
|
+
assert_includes orig_headers_error.message, ":orig_headers"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_consumed_body_sender_error_preserves_class_and_names_option
|
|
110
|
+
sender = Wreq::BodySender.new(1)
|
|
111
|
+
|
|
112
|
+
assert_raises(Wreq::BuilderError) do
|
|
113
|
+
Wreq.post(INVALID_URL, body: sender)
|
|
114
|
+
end
|
|
115
|
+
error = assert_raises(Wreq::MemoryError) do
|
|
116
|
+
Wreq.post(INVALID_URL, body: sender)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
assert_includes error.message, ":body"
|
|
120
|
+
ensure
|
|
121
|
+
sender&.close
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def test_option_conversion_preserves_raised_exception_class
|
|
125
|
+
source = Object.new
|
|
126
|
+
source.define_singleton_method(:to_a) { raise IOError, "boom" }
|
|
127
|
+
|
|
128
|
+
error = assert_raises(IOError) do
|
|
129
|
+
Wreq::Client.new(headers: source)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
assert_includes error.message, ":headers"
|
|
133
|
+
assert_includes error.message, "boom"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def test_out_of_range_integer_names_the_option
|
|
137
|
+
error = assert_raises(ArgumentError) do
|
|
138
|
+
Wreq::Client.new(timeout: 2**256)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
assert_includes error.message, ":timeout"
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def test_invalid_request_value_names_the_option_before_network_io
|
|
145
|
+
error = assert_raises(TypeError) do
|
|
146
|
+
Wreq.get(INVALID_URL, cookies: Object.new)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
assert_includes error.message, ":cookies"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def test_client_constructor_rejects_non_hash_and_extra_arguments
|
|
153
|
+
assert_raises(TypeError) { Wreq::Client.new("ignored") }
|
|
154
|
+
assert_raises(ArgumentError) { Wreq::Client.new({}, {}) }
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def test_emulation_constructor_rejects_invalid_arguments_and_options
|
|
158
|
+
assert_raises(TypeError) { Wreq::Emulation.new("ignored") }
|
|
159
|
+
assert_raises(ArgumentError) { Wreq::Emulation.new({}, {}) }
|
|
160
|
+
|
|
161
|
+
error = assert_raises(ArgumentError) { Wreq::Emulation.new(unknown: true) }
|
|
162
|
+
assert_includes error.message, ":unknown"
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def test_invalid_emulation_values_name_the_option
|
|
166
|
+
http2_error = assert_raises(TypeError) do
|
|
167
|
+
Wreq::Emulation.new(http2: "yes")
|
|
168
|
+
end
|
|
169
|
+
profile_error = assert_raises(TypeError) do
|
|
170
|
+
Wreq::Emulation.new(profile: Object.new)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
assert_includes http2_error.message, ":http2"
|
|
174
|
+
assert_includes profile_error.message, ":profile"
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def test_body_options_are_mutually_exclusive
|
|
178
|
+
error = assert_raises(ArgumentError) do
|
|
179
|
+
Wreq.post(INVALID_URL, body: "raw", form: {a: 1}, json: {b: 2})
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
assert_includes error.message, ":body"
|
|
183
|
+
assert_includes error.message, ":form"
|
|
184
|
+
assert_includes error.message, ":json"
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def test_body_conflict_does_not_consume_sender
|
|
188
|
+
sender = Wreq::BodySender.new(1)
|
|
189
|
+
|
|
190
|
+
assert_raises(ArgumentError) do
|
|
191
|
+
Wreq.post(INVALID_URL, body: sender, json: {value: true})
|
|
192
|
+
end
|
|
193
|
+
assert_raises(Wreq::BuilderError) do
|
|
194
|
+
Wreq.post(INVALID_URL, body: sender)
|
|
195
|
+
end
|
|
196
|
+
ensure
|
|
197
|
+
sender&.close
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def test_dependent_option_error_does_not_consume_sender
|
|
201
|
+
sender = Wreq::BodySender.new(1)
|
|
202
|
+
|
|
203
|
+
assert_raises(ArgumentError) do
|
|
204
|
+
Wreq.post(INVALID_URL, body: sender, max_redirects: 2)
|
|
205
|
+
end
|
|
206
|
+
assert_raises(Wreq::BuilderError) do
|
|
207
|
+
Wreq.post(INVALID_URL, body: sender)
|
|
208
|
+
end
|
|
209
|
+
ensure
|
|
210
|
+
sender&.close
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def test_authentication_options_are_mutually_exclusive
|
|
214
|
+
error = assert_raises(ArgumentError) do
|
|
215
|
+
Wreq.get(
|
|
216
|
+
INVALID_URL,
|
|
217
|
+
auth: "secret",
|
|
218
|
+
bearer_auth: "secret",
|
|
219
|
+
basic_auth: ["user", "secret"]
|
|
220
|
+
)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
assert_includes error.message, ":auth"
|
|
224
|
+
assert_includes error.message, ":bearer_auth"
|
|
225
|
+
assert_includes error.message, ":basic_auth"
|
|
226
|
+
refute_includes error.message, "secret"
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def test_protocol_only_options_are_mutually_exclusive
|
|
230
|
+
error = assert_raises(ArgumentError) do
|
|
231
|
+
Wreq::Client.new(http1_only: true, http2_only: true)
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
assert_includes error.message, ":http1_only"
|
|
235
|
+
assert_includes error.message, ":http2_only"
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def test_validation_reports_the_first_failed_rule
|
|
239
|
+
error = assert_raises(ArgumentError) do
|
|
240
|
+
Wreq::Client.new(
|
|
241
|
+
http1_only: true,
|
|
242
|
+
http2_only: true,
|
|
243
|
+
max_redirects: 2,
|
|
244
|
+
headers: Object.new
|
|
245
|
+
)
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
assert_includes error.message, ":http1_only"
|
|
249
|
+
assert_includes error.message, ":http2_only"
|
|
250
|
+
refute_includes error.message, ":max_redirects"
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def test_explicit_proxy_and_no_proxy_are_mutually_exclusive
|
|
254
|
+
error = assert_raises(ArgumentError) do
|
|
255
|
+
Wreq::Client.new(proxy: "http://127.0.0.1:8080", no_proxy: true)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
assert_includes error.message, ":proxy"
|
|
259
|
+
assert_includes error.message, ":no_proxy"
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def test_max_redirects_requires_redirects_to_be_enabled
|
|
263
|
+
client_error = assert_raises(ArgumentError) do
|
|
264
|
+
Wreq::Client.new(max_redirects: 2)
|
|
265
|
+
end
|
|
266
|
+
disabled_error = assert_raises(ArgumentError) do
|
|
267
|
+
Wreq::Client.new(allow_redirects: false, max_redirects: 2)
|
|
268
|
+
end
|
|
269
|
+
request_error = assert_raises(ArgumentError) do
|
|
270
|
+
Wreq.get(INVALID_URL, max_redirects: 2)
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
[client_error, disabled_error, request_error].each do |error|
|
|
274
|
+
assert_includes error.message, ":max_redirects"
|
|
275
|
+
assert_includes error.message, ":allow_redirects"
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def test_unsupported_platform_option_raises_argument_error
|
|
280
|
+
return if RUBY_PLATFORM.match?(/linux|android|fuchsia/)
|
|
281
|
+
|
|
282
|
+
error = assert_raises(ArgumentError) do
|
|
283
|
+
Wreq::Client.new(tcp_user_timeout: 1)
|
|
284
|
+
end
|
|
285
|
+
assert_instance_of ArgumentError, error
|
|
286
|
+
assert_includes error.message, ":tcp_user_timeout"
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def test_windows_rejects_interface_for_client_and_request
|
|
290
|
+
return unless Gem.win_platform?
|
|
291
|
+
|
|
292
|
+
client_error = assert_raises(ArgumentError) do
|
|
293
|
+
Wreq::Client.new(interface: "Ethernet")
|
|
294
|
+
end
|
|
295
|
+
request_error = assert_raises(ArgumentError) do
|
|
296
|
+
Wreq.get(INVALID_URL, interface: "Ethernet")
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
assert_instance_of ArgumentError, client_error
|
|
300
|
+
assert_instance_of ArgumentError, request_error
|
|
301
|
+
assert_includes client_error.message, ":interface"
|
|
302
|
+
assert_includes request_error.message, ":interface"
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
def test_valid_nil_and_zero_option_construction
|
|
306
|
+
assert_instance_of Wreq::Client, Wreq::Client.new
|
|
307
|
+
assert_instance_of Wreq::Client,
|
|
308
|
+
Wreq::Client.new(proxy: nil, interface: nil, tcp_user_timeout: nil)
|
|
309
|
+
assert_instance_of Wreq::Emulation, Wreq::Emulation.new(profile: nil, http2: true)
|
|
310
|
+
end
|
|
311
|
+
end
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
class ValueSemanticsTest < Minitest::Test
|
|
6
|
+
# ---- StatusCode ----
|
|
7
|
+
|
|
8
|
+
def setup
|
|
9
|
+
@response = Wreq.get("#{HTTPBIN_URL}/status/201")
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_status_code_to_i
|
|
13
|
+
assert_equal 201, @response.status.to_i
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_status_code_as_int_still_works
|
|
17
|
+
assert_equal 201, @response.status.as_int
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_status_code_to_i_matches_as_int
|
|
21
|
+
assert_equal @response.status.as_int, @response.status.to_i
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_status_code_equality
|
|
25
|
+
a = @response.status
|
|
26
|
+
b = @response.status
|
|
27
|
+
assert_equal a, b
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_status_code_eql
|
|
31
|
+
a = @response.status
|
|
32
|
+
b = @response.status
|
|
33
|
+
assert a.eql?(b)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_status_code_hash_consistent
|
|
37
|
+
a = @response.status
|
|
38
|
+
b = @response.status
|
|
39
|
+
assert_equal a.hash, b.hash
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_status_code_as_hash_key
|
|
43
|
+
status = @response.status
|
|
44
|
+
h = {status => "created"}
|
|
45
|
+
assert_equal "created", h[@response.status]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_status_code_in_set
|
|
49
|
+
s = Set.new
|
|
50
|
+
s.add(@response.status)
|
|
51
|
+
assert_includes s, @response.status
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_status_code_not_equal_to_integer
|
|
55
|
+
refute_equal @response.status, 201
|
|
56
|
+
refute @response.status.eql?(201)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_status_code_different_values_not_equal
|
|
60
|
+
ok = Wreq.get("#{HTTPBIN_URL}/status/200").status
|
|
61
|
+
created = @response.status
|
|
62
|
+
refute_equal ok, created
|
|
63
|
+
refute ok.eql?(created)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_response_code_still_returns_integer
|
|
67
|
+
assert_instance_of Integer, @response.code
|
|
68
|
+
assert_equal 201, @response.code
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# ---- Version ----
|
|
72
|
+
|
|
73
|
+
def test_version_equality
|
|
74
|
+
assert_equal Wreq::Version::HTTP_11, Wreq::Version::HTTP_11
|
|
75
|
+
assert_equal "HTTP/0.9", Wreq::Version::HTTP_09.to_s
|
|
76
|
+
assert_equal "HTTP/1.0", Wreq::Version::HTTP_10.to_s
|
|
77
|
+
assert_equal "HTTP/1.1", Wreq::Version::HTTP_11.to_s
|
|
78
|
+
assert_equal "HTTP/2.0", Wreq::Version::HTTP_2.to_s
|
|
79
|
+
assert_equal "HTTP/3.0", Wreq::Version::HTTP_3.to_s
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_version_eql
|
|
83
|
+
v = Wreq::Version::HTTP_11
|
|
84
|
+
assert v.eql?(Wreq::Version::HTTP_11)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def test_version_hash_consistent
|
|
88
|
+
a = Wreq::Version::HTTP_11
|
|
89
|
+
b = Wreq::Version::HTTP_11
|
|
90
|
+
assert_equal a.hash, b.hash
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def test_version_different_values_not_equal
|
|
94
|
+
refute_equal Wreq::Version::HTTP_11, Wreq::Version::HTTP_2
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def test_version_as_hash_key
|
|
98
|
+
v = Wreq::Version::HTTP_11
|
|
99
|
+
h = {v => "http1.1"}
|
|
100
|
+
assert_equal "http1.1", h[Wreq::Version::HTTP_11]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def test_version_in_set
|
|
104
|
+
s = Set.new([Wreq::Version::HTTP_11, Wreq::Version::HTTP_2])
|
|
105
|
+
assert_includes s, Wreq::Version::HTTP_11
|
|
106
|
+
assert_includes s, Wreq::Version::HTTP_2
|
|
107
|
+
refute_includes s, Wreq::Version::HTTP_3
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# ---- Method ----
|
|
111
|
+
|
|
112
|
+
def test_method_to_s
|
|
113
|
+
assert_equal "GET", Wreq::Method::GET.to_s
|
|
114
|
+
assert_equal "POST", Wreq::Method::POST.to_s
|
|
115
|
+
assert_equal "PUT", Wreq::Method::PUT.to_s
|
|
116
|
+
assert_equal "DELETE", Wreq::Method::DELETE.to_s
|
|
117
|
+
assert_equal "HEAD", Wreq::Method::HEAD.to_s
|
|
118
|
+
assert_equal "OPTIONS", Wreq::Method::OPTIONS.to_s
|
|
119
|
+
assert_equal "TRACE", Wreq::Method::TRACE.to_s
|
|
120
|
+
assert_equal "PATCH", Wreq::Method::PATCH.to_s
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def test_method_to_sym
|
|
124
|
+
assert_equal :get, Wreq::Method::GET.to_sym
|
|
125
|
+
assert_equal :post, Wreq::Method::POST.to_sym
|
|
126
|
+
assert_equal :put, Wreq::Method::PUT.to_sym
|
|
127
|
+
assert_equal :delete, Wreq::Method::DELETE.to_sym
|
|
128
|
+
assert_equal :head, Wreq::Method::HEAD.to_sym
|
|
129
|
+
assert_equal :options, Wreq::Method::OPTIONS.to_sym
|
|
130
|
+
assert_equal :trace, Wreq::Method::TRACE.to_sym
|
|
131
|
+
assert_equal :patch, Wreq::Method::PATCH.to_sym
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_method_equality
|
|
135
|
+
assert_equal Wreq::Method::GET, Wreq::Method::GET
|
|
136
|
+
refute_equal Wreq::Method::GET, Wreq::Method::POST
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_method_eql
|
|
140
|
+
assert Wreq::Method::GET.eql?(Wreq::Method::GET)
|
|
141
|
+
refute Wreq::Method::GET.eql?(Wreq::Method::POST)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def test_method_hash_consistent
|
|
145
|
+
assert_equal Wreq::Method::GET.hash, Wreq::Method::GET.hash
|
|
146
|
+
refute_equal Wreq::Method::GET.hash, Wreq::Method::POST.hash
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def test_method_as_hash_key
|
|
150
|
+
h = {Wreq::Method::GET => "get it"}
|
|
151
|
+
assert_equal "get it", h[Wreq::Method::GET]
|
|
152
|
+
assert_nil h[Wreq::Method::POST]
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# ---- SameSite ----
|
|
156
|
+
|
|
157
|
+
def test_same_site_to_s
|
|
158
|
+
assert_equal "Strict", Wreq::SameSite::Strict.to_s
|
|
159
|
+
assert_equal "Lax", Wreq::SameSite::Lax.to_s
|
|
160
|
+
assert_equal "None", Wreq::SameSite::None.to_s
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def test_same_site_to_sym
|
|
164
|
+
assert_equal :strict, Wreq::SameSite::Strict.to_sym
|
|
165
|
+
assert_equal :lax, Wreq::SameSite::Lax.to_sym
|
|
166
|
+
assert_equal :none, Wreq::SameSite::None.to_sym
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def test_same_site_equality
|
|
170
|
+
assert_equal Wreq::SameSite::Lax, Wreq::SameSite::Lax
|
|
171
|
+
refute_equal Wreq::SameSite::Lax, Wreq::SameSite::Strict
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def test_same_site_eql_and_hash
|
|
175
|
+
assert Wreq::SameSite::Lax.eql?(Wreq::SameSite::Lax)
|
|
176
|
+
assert_equal Wreq::SameSite::Lax.hash, Wreq::SameSite::Lax.hash
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# ---- Profile ----
|
|
180
|
+
|
|
181
|
+
def test_profile_equality
|
|
182
|
+
assert_equal Wreq::Profile::Chrome134, Wreq::Profile::Chrome134
|
|
183
|
+
refute_equal Wreq::Profile::Chrome134, Wreq::Profile::Chrome135
|
|
184
|
+
assert_equal "Chrome134", Wreq::Profile::Chrome134.to_s
|
|
185
|
+
assert_equal "SafariIos17_4_1", Wreq::Profile::SafariIos17_4_1.to_s
|
|
186
|
+
assert_equal "OkHttp4_12", Wreq::Profile::OkHttp4_12.to_s
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def test_profile_eql_and_hash
|
|
190
|
+
assert Wreq::Profile::Chrome134.eql?(Wreq::Profile::Chrome134)
|
|
191
|
+
assert_equal Wreq::Profile::Chrome134.hash, Wreq::Profile::Chrome134.hash
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def test_profile_as_hash_key
|
|
195
|
+
h = {Wreq::Profile::Chrome134 => "chrome"}
|
|
196
|
+
assert_equal "chrome", h[Wreq::Profile::Chrome134]
|
|
197
|
+
assert_nil h[Wreq::Profile::Chrome135]
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# ---- Platform ----
|
|
201
|
+
|
|
202
|
+
def test_platform_equality
|
|
203
|
+
assert_equal Wreq::Platform::Windows, Wreq::Platform::Windows
|
|
204
|
+
refute_equal Wreq::Platform::Windows, Wreq::Platform::Linux
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def test_platform_eql_and_hash
|
|
208
|
+
assert Wreq::Platform::Windows.eql?(Wreq::Platform::Windows)
|
|
209
|
+
assert_equal Wreq::Platform::Windows.hash, Wreq::Platform::Windows.hash
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def test_platform_to_sym
|
|
213
|
+
assert_equal "Windows", Wreq::Platform::Windows.to_s
|
|
214
|
+
assert_equal "MacOS", Wreq::Platform::MacOS.to_s
|
|
215
|
+
assert_equal "Linux", Wreq::Platform::Linux.to_s
|
|
216
|
+
assert_equal "Android", Wreq::Platform::Android.to_s
|
|
217
|
+
assert_equal "IOS", Wreq::Platform::IOS.to_s
|
|
218
|
+
|
|
219
|
+
assert_equal :windows, Wreq::Platform::Windows.to_sym
|
|
220
|
+
assert_equal :macos, Wreq::Platform::MacOS.to_sym
|
|
221
|
+
assert_equal :linux, Wreq::Platform::Linux.to_sym
|
|
222
|
+
assert_equal :android, Wreq::Platform::Android.to_sym
|
|
223
|
+
assert_equal :ios, Wreq::Platform::IOS.to_sym
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# ---- Cross-type comparisons ----
|
|
227
|
+
|
|
228
|
+
def test_cross_type_not_equal
|
|
229
|
+
refute_equal Wreq::Method::GET, Wreq::Version::HTTP_11
|
|
230
|
+
refute_equal Wreq::SameSite::Lax, Wreq::Method::GET
|
|
231
|
+
refute_equal Wreq::Platform::Windows, Wreq::Profile::Chrome134
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def test_cross_type_eql_false
|
|
235
|
+
refute Wreq::Method::GET.eql?(Wreq::Version::HTTP_11)
|
|
236
|
+
refute Wreq::SameSite::Lax.eql?(Wreq::Method::GET)
|
|
237
|
+
end
|
|
238
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: wreq
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.2.
|
|
4
|
+
version: 1.2.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- SearchApi
|
|
@@ -117,11 +117,31 @@ files:
|
|
|
117
117
|
- src/extractor.rs
|
|
118
118
|
- src/gvl.rs
|
|
119
119
|
- src/header.rs
|
|
120
|
-
- src/header/helper.rs
|
|
121
120
|
- src/http.rs
|
|
122
121
|
- src/lib.rs
|
|
123
122
|
- src/macros.rs
|
|
123
|
+
- src/options.rs
|
|
124
124
|
- src/rt.rs
|
|
125
|
+
- src/serde.rs
|
|
126
|
+
- src/serde/de.rs
|
|
127
|
+
- src/serde/de/array_deserializer.rs
|
|
128
|
+
- src/serde/de/array_enumerator.rs
|
|
129
|
+
- src/serde/de/deserializer.rs
|
|
130
|
+
- src/serde/de/enum_deserializer.rs
|
|
131
|
+
- src/serde/de/hash_deserializer.rs
|
|
132
|
+
- src/serde/de/number_deserializer.rs
|
|
133
|
+
- src/serde/de/variant_deserializer.rs
|
|
134
|
+
- src/serde/error.rs
|
|
135
|
+
- src/serde/ser.rs
|
|
136
|
+
- src/serde/ser/enums.rs
|
|
137
|
+
- src/serde/ser/map_serializer.rs
|
|
138
|
+
- src/serde/ser/seq_serializer.rs
|
|
139
|
+
- src/serde/ser/serializer.rs
|
|
140
|
+
- src/serde/ser/struct_serializer.rs
|
|
141
|
+
- src/serde/ser/struct_variant_serializer.rs
|
|
142
|
+
- src/serde/ser/tuple_variant_serializer.rs
|
|
143
|
+
- src/serde/tests.rs
|
|
144
|
+
- test/body_sender_test.rb
|
|
125
145
|
- test/client_cookie_test.rb
|
|
126
146
|
- test/client_test.rb
|
|
127
147
|
- test/cookie_test.rb
|
|
@@ -129,13 +149,16 @@ files:
|
|
|
129
149
|
- test/error_handling_test.rb
|
|
130
150
|
- test/header_test.rb
|
|
131
151
|
- test/inspect_test.rb
|
|
152
|
+
- test/json_precision_test.rb
|
|
132
153
|
- test/module_methods_test.rb
|
|
154
|
+
- test/option_validation_test.rb
|
|
133
155
|
- test/orig_header_test.rb
|
|
134
156
|
- test/request_parameters_test.rb
|
|
135
157
|
- test/request_test.rb
|
|
136
158
|
- test/response_test.rb
|
|
137
159
|
- test/stream_test.rb
|
|
138
160
|
- test/test_helper.rb
|
|
161
|
+
- test/value_semantics_test.rb
|
|
139
162
|
- wreq.gemspec
|
|
140
163
|
homepage: https://github.com/SearchApi/wreq-ruby
|
|
141
164
|
licenses:
|