rack-test 0.6.3 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/History.md +375 -0
- data/MIT-LICENSE.txt +1 -0
- data/README.md +139 -0
- data/lib/rack/test/cookie_jar.rb +134 -64
- data/lib/rack/test/methods.rb +42 -31
- data/lib/rack/test/uploaded_file.rb +79 -19
- data/lib/rack/test/utils.rb +86 -80
- data/lib/rack/test/version.rb +5 -0
- data/lib/rack/test.rb +268 -204
- metadata +76 -68
- data/.document +0 -4
- data/.gitignore +0 -6
- data/Gemfile +0 -8
- data/Gemfile.lock +0 -41
- data/History.txt +0 -179
- data/README.rdoc +0 -85
- data/Rakefile +0 -33
- data/Thorfile +0 -114
- data/lib/rack/mock_session.rb +0 -66
- data/lib/rack/test/mock_digest_request.rb +0 -29
- data/rack-test.gemspec +0 -77
- data/spec/fixtures/bar.txt +0 -1
- data/spec/fixtures/config.ru +0 -3
- data/spec/fixtures/fake_app.rb +0 -143
- data/spec/fixtures/foo.txt +0 -1
- data/spec/rack/test/cookie_spec.rb +0 -219
- data/spec/rack/test/digest_auth_spec.rb +0 -46
- data/spec/rack/test/multipart_spec.rb +0 -145
- data/spec/rack/test/uploaded_file_spec.rb +0 -24
- data/spec/rack/test/utils_spec.rb +0 -193
- data/spec/rack/test_spec.rb +0 -550
- data/spec/spec_helper.rb +0 -69
- data/spec/support/matchers/body.rb +0 -9
- data/spec/support/matchers/challenge.rb +0 -11
data/lib/rack/test/utils.rb
CHANGED
@@ -1,22 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Rack
|
2
4
|
module Test
|
3
|
-
|
4
5
|
module Utils # :nodoc:
|
5
6
|
include Rack::Utils
|
7
|
+
extend self
|
6
8
|
|
9
|
+
# Build a query string for the given value and prefix. The value
|
10
|
+
# can be an array or hash of parameters.
|
7
11
|
def build_nested_query(value, prefix = nil)
|
8
12
|
case value
|
9
13
|
when Array
|
10
|
-
value.
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
if value.empty?
|
15
|
+
"#{prefix}[]="
|
16
|
+
else
|
17
|
+
prefix += "[]" unless unescape(prefix).end_with?('[]')
|
18
|
+
value.map do |v|
|
19
|
+
build_nested_query(v, prefix.to_s)
|
20
|
+
end.join('&')
|
21
|
+
end
|
16
22
|
when Hash
|
17
23
|
value.map do |k, v|
|
18
24
|
build_nested_query(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k))
|
19
|
-
end.join(
|
25
|
+
end.join('&')
|
20
26
|
when NilClass
|
21
27
|
prefix.to_s
|
22
28
|
else
|
@@ -24,15 +30,11 @@ module Rack
|
|
24
30
|
end
|
25
31
|
end
|
26
32
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
if first
|
31
|
-
unless params.is_a?(Hash)
|
32
|
-
raise ArgumentError, "value must be a Hash"
|
33
|
-
end
|
33
|
+
# Build a multipart body for the given params.
|
34
|
+
def build_multipart(params, _first = true, multipart = false)
|
35
|
+
raise ArgumentError, 'value must be a Hash' unless params.is_a?(Hash)
|
34
36
|
|
35
|
-
|
37
|
+
unless multipart
|
36
38
|
query = lambda { |value|
|
37
39
|
case value
|
38
40
|
when Array
|
@@ -47,7 +49,18 @@ module Rack
|
|
47
49
|
return nil unless multipart
|
48
50
|
end
|
49
51
|
|
50
|
-
|
52
|
+
params = normalize_multipart_params(params, true)
|
53
|
+
|
54
|
+
buffer = String.new
|
55
|
+
build_parts(buffer, params)
|
56
|
+
buffer
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
# Return a flattened hash of parameter values based on the given params.
|
62
|
+
def normalize_multipart_params(params, first=false)
|
63
|
+
flattened_params = {}
|
51
64
|
|
52
65
|
params.each do |key, value|
|
53
66
|
k = first ? key.to_s : "[#{key}]"
|
@@ -55,96 +68,89 @@ module Rack
|
|
55
68
|
case value
|
56
69
|
when Array
|
57
70
|
value.map do |v|
|
58
|
-
|
59
|
-
if (v.is_a?(Hash))
|
71
|
+
if v.is_a?(Hash)
|
60
72
|
nested_params = {}
|
61
|
-
|
73
|
+
normalize_multipart_params(v).each do |subkey, subvalue|
|
62
74
|
nested_params[subkey] = subvalue
|
63
|
-
|
64
|
-
flattened_params["#{k}[]"] ||= []
|
65
|
-
flattened_params["#{k}[]"] << nested_params
|
75
|
+
end
|
76
|
+
(flattened_params["#{k}[]"] ||= []) << nested_params
|
66
77
|
else
|
67
78
|
flattened_params["#{k}[]"] = value
|
68
79
|
end
|
69
|
-
|
70
80
|
end
|
71
81
|
when Hash
|
72
|
-
|
82
|
+
normalize_multipart_params(value).each do |subkey, subvalue|
|
73
83
|
flattened_params[k + subkey] = subvalue
|
74
|
-
|
84
|
+
end
|
75
85
|
else
|
76
86
|
flattened_params[k] = value
|
77
87
|
end
|
78
88
|
end
|
79
89
|
|
80
|
-
|
81
|
-
build_parts(flattened_params)
|
82
|
-
else
|
83
|
-
flattened_params
|
84
|
-
end
|
90
|
+
flattened_params
|
85
91
|
end
|
86
92
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
get_parts(parameters).join + "--#{MULTIPART_BOUNDARY}--\r"
|
93
|
+
# Build the multipart content for uploading.
|
94
|
+
def build_parts(buffer, parameters)
|
95
|
+
_build_parts(buffer, parameters)
|
96
|
+
buffer << END_BOUNDARY
|
92
97
|
end
|
93
98
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
99
|
+
# Append each multipart parameter value to the buffer.
|
100
|
+
def _build_parts(buffer, parameters)
|
101
|
+
parameters.map do |name, value|
|
102
|
+
if name =~ /\[\]\Z/ && value.is_a?(Array) && value.all? { |v| v.is_a?(Hash) }
|
103
|
+
value.each do |hash|
|
98
104
|
new_value = {}
|
99
|
-
hash.each { |k, v| new_value[name+k] = v }
|
100
|
-
|
101
|
-
|
105
|
+
hash.each { |k, v| new_value[name + k] = v }
|
106
|
+
_build_parts(buffer, new_value)
|
107
|
+
end
|
102
108
|
else
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end.join
|
110
|
-
|
111
|
-
else
|
112
|
-
primitive_part = build_primitive_part(name, value)
|
113
|
-
Rack::Test.encoding_aware_strings? ? primitive_part.force_encoding('BINARY') : primitive_part
|
109
|
+
[value].flatten.map do |v|
|
110
|
+
if v.respond_to?(:original_filename)
|
111
|
+
build_file_part(buffer, name, v)
|
112
|
+
else
|
113
|
+
build_primitive_part(buffer, name, v)
|
114
|
+
end
|
114
115
|
end
|
115
116
|
end
|
116
|
-
|
117
|
+
end
|
117
118
|
end
|
118
119
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
\r
|
128
|
-
|
129
|
-
EOF
|
130
|
-
end.join
|
120
|
+
# Append the multipart fragment for a parameter that isn't a file upload to the buffer.
|
121
|
+
def build_primitive_part(buffer, parameter_name, value)
|
122
|
+
buffer <<
|
123
|
+
START_BOUNDARY <<
|
124
|
+
"content-disposition: form-data; name=\"" <<
|
125
|
+
parameter_name.to_s.b <<
|
126
|
+
"\"\r\n\r\n" <<
|
127
|
+
value.to_s.b <<
|
128
|
+
"\r\n"
|
129
|
+
buffer
|
131
130
|
end
|
132
131
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
\r
|
142
|
-
|
143
|
-
|
132
|
+
# Append the multipart fragment for a parameter that is a file upload to the buffer.
|
133
|
+
def build_file_part(buffer, parameter_name, uploaded_file)
|
134
|
+
buffer <<
|
135
|
+
START_BOUNDARY <<
|
136
|
+
"content-disposition: form-data; name=\"" <<
|
137
|
+
parameter_name.to_s.b <<
|
138
|
+
"\"; filename=\"" <<
|
139
|
+
escape_path(uploaded_file.original_filename).b <<
|
140
|
+
"\"\r\ncontent-type: " <<
|
141
|
+
uploaded_file.content_type.to_s.b <<
|
142
|
+
"\r\ncontent-length: " <<
|
143
|
+
uploaded_file.size.to_s.b <<
|
144
|
+
"\r\n\r\n"
|
145
|
+
|
146
|
+
# Handle old versions of Capybara::RackTest::Form::NilUploadedFile
|
147
|
+
if uploaded_file.respond_to?(:set_encoding)
|
148
|
+
uploaded_file.set_encoding(Encoding::BINARY)
|
149
|
+
uploaded_file.append_to(buffer)
|
144
150
|
end
|
145
|
-
end
|
146
151
|
|
152
|
+
buffer << "\r\n"
|
153
|
+
end
|
147
154
|
end
|
148
|
-
|
149
155
|
end
|
150
156
|
end
|