rack-test 0.6.3 → 2.1.0
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 +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
|