rack-test_app 1.0.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.
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rack/test_app'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rack-test_app"
8
+ spec.version = Rack::TestApp::VERSION
9
+ spec.authors = ["makoto kuwata"]
10
+ spec.email = ["kwa@kuwata-lab.com"]
11
+ spec.summary = "more intuitive testing helper library for Rack app"
12
+ spec.description = <<END
13
+ Rack::TestApp is another testing helper library for Rack application.
14
+ IMO it is more intuitive than Rack::Test.
15
+ END
16
+ spec.homepage = "https://github.com/kwatch/rack-test_app"
17
+ spec.license = "MIT-LICENCE"
18
+ spec.files = Dir[*%w[
19
+ README.md MIT-LICENSE.txt Rakefile rack-test_app.gemspec
20
+ lib/rack/test_app.rb
21
+ test/test_helper.rb
22
+ test/rack/**/*_test.rb
23
+ test/rack/test_app/data/**/*.*
24
+ ]]
25
+ spec.require_paths = ["lib"]
26
+ spec.required_ruby_version = '>= 2.0'
27
+ spec.add_runtime_dependency 'rack'
28
+ spec.add_development_dependency "bundler", "~> 1.10"
29
+ spec.add_development_dependency "rake", "~> 10.0"
30
+ spec.add_development_dependency "minitest"
31
+ end
@@ -0,0 +1,158 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ###
4
+ ### $Release: 1.0.0 $
5
+ ### $Copyright: copyright(c) 2015 kuwata-lab.com all rights reserved $
6
+ ### $License: MIT License $
7
+ ###
8
+
9
+
10
+ require_relative '../../test_helper'
11
+
12
+ require 'tempfile'
13
+ require 'rack/multipart'
14
+ require 'rack/mock'
15
+ require 'rack/request'
16
+
17
+
18
+ describe Rack::TestApp::MultipartBuilder do
19
+
20
+
21
+ describe '#initialize()' do
22
+
23
+ it "[!ajfgl] sets random string as boundary when boundary is nil." do
24
+ arr = []
25
+ 1000.times do
26
+ mp = Rack::TestApp::MultipartBuilder.new(nil)
27
+ refute_nil mp.boundary
28
+ assert_kind_of String, mp.boundary
29
+ arr << mp.boundary
30
+ end
31
+ assert_equal 1000, arr.sort.uniq.length
32
+ end
33
+
34
+ end
35
+
36
+
37
+ describe '#add()' do
38
+
39
+ it "[!tp4bk] detects content type from filename when filename is not nil." do
40
+ mp = Rack::TestApp::MultipartBuilder.new
41
+ mp.add("name1", "value1")
42
+ mp.add("name2", "value2", "foo.csv")
43
+ mp.add("name3", "value3", "bar.csv", "text/plain")
44
+ expected = [
45
+ ["name1", "value1", nil, nil],
46
+ #["name2", "value2", "foo.csv", "text/comma-separated-values"],
47
+ ["name2", "value2", "foo.csv", "text/csv"],
48
+ ["name3", "value3", "bar.csv", "text/plain"],
49
+ ]
50
+ assert_equal expected, mp.instance_variable_get('@params')
51
+ end
52
+
53
+ end
54
+
55
+
56
+ describe '#add_file()' do
57
+
58
+ data_dir = File.join(File.dirname(__FILE__), 'data')
59
+ filename1 = File.join(data_dir, 'example1.png')
60
+ filename2 = File.join(data_dir, 'example1.jpg')
61
+ datafile = File.join(data_dir, 'multipart.form')
62
+ multipart_data = File.open(datafile, 'rb') {|f| f.read }
63
+
64
+ it "[!uafqa] detects content type from filename when content type is not provided." do
65
+ file1 = File.open(filename1)
66
+ file2 = File.open(filename2)
67
+ begin
68
+ mp = Rack::TestApp::MultipartBuilder.new
69
+ mp.add_file('image1', file1)
70
+ mp.add_file('image2', file2)
71
+ params = mp.instance_variable_get('@params')
72
+ assert_equal "example1.png" , params[0][2]
73
+ assert_equal "image/png" , params[0][3]
74
+ assert_equal "example1.jpg" , params[1][2]
75
+ assert_equal "image/jpeg" , params[1][3]
76
+ ensure
77
+ [file1, file2].each {|f| f.close() unless f.closed? }
78
+ end
79
+ end
80
+
81
+ it "[!b5811] reads file content and adds it as param value." do
82
+ file1 = File.open(filename1)
83
+ file2 = File.open(filename2)
84
+ begin
85
+ boundary = '---------------------------68927884511827559971471404947'
86
+ mp = Rack::TestApp::MultipartBuilder.new(boundary)
87
+ mp.add('text1', "test1")
88
+ mp.add('text2', "日本語\r\nあいうえお\r\n")
89
+ mp.add_file('file1', file1)
90
+ mp.add_file('file2', file2)
91
+ expected = multipart_data
92
+ assert expected, mp.to_s
93
+ ensure
94
+ [file1, file2].each {|f| f.close() unless f.closed? }
95
+ end
96
+ end
97
+
98
+ it "[!36bsu] closes opened file automatically." do
99
+ file1 = File.open(filename1)
100
+ file2 = File.open(filename2)
101
+ begin
102
+ assert_equal false, file1.closed?
103
+ assert_equal false, file2.closed?
104
+ mp = Rack::TestApp::MultipartBuilder.new()
105
+ mp.add_file('file1', file1)
106
+ mp.add_file('file2', file2)
107
+ assert_equal true, file1.closed?
108
+ assert_equal true, file2.closed?
109
+ ensure
110
+ [file1, file2].each {|f| f.close() unless f.closed? }
111
+ end
112
+ end
113
+
114
+ end
115
+
116
+
117
+ describe '#to_s()' do
118
+
119
+ it "[!61gc4] returns multipart form string." do
120
+ mp = Rack::TestApp::MultipartBuilder.new("abc123")
121
+ mp.add("name1", "value1")
122
+ mp.add("name2", "value2", "foo.txt", "text/plain")
123
+ s = mp.to_s
124
+ expected = [
125
+ "--abc123\r\n",
126
+ "Content-Disposition: form-data; name=\"name1\"\r\n",
127
+ "\r\n",
128
+ "value1\r\n",
129
+ "--abc123\r\n",
130
+ "Content-Disposition: form-data; name=\"name2\"; filename=\"foo.txt\"\r\n",
131
+ "Content-Type: text/plain\r\n",
132
+ "\r\n",
133
+ "value2\r\n",
134
+ "--abc123--\r\n",
135
+ ].join()
136
+ s = mp.to_s
137
+ assert_equal expected, s
138
+ #
139
+ opts = {
140
+ :method => "POST",
141
+ :input => s,
142
+ "CONTENT_TYPE" => "multipart/form-data; boundary=abc123",
143
+ "CONTENT_LENGTH" => s.bytesize,
144
+ }
145
+ env = Rack::MockRequest.env_for('http://localhost/form', opts)
146
+ req = Rack::Request.new(env)
147
+ params = req.POST
148
+ assert_equal "value1", params["name1"]
149
+ assert_equal "name2", params["name2"][:name]
150
+ assert_equal "foo.txt", params["name2"][:filename]
151
+ assert_equal "text/plain", params["name2"][:type]
152
+ assert_kind_of Tempfile, params["name2"][:tempfile]
153
+ end
154
+
155
+ end
156
+
157
+
158
+ end
@@ -0,0 +1,184 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ###
4
+ ### $Release: 1.0.0 $
5
+ ### $Copyright: copyright(c) 2015 kuwata-lab.com all rights reserved $
6
+ ### $License: MIT License $
7
+ ###
8
+
9
+
10
+ require_relative '../../test_helper'
11
+
12
+
13
+ describe Rack::TestApp::Result do
14
+
15
+
16
+ describe '#initialize()' do
17
+
18
+ it "[!3lcsj] accepts response status, headers and body." do
19
+ r = Rack::TestApp::Result.new(200, {"Content-Type"=>"text/plain"}, ["Hello"])
20
+ assert 200, r.status
21
+ assert({"Content-Type"=>"text/plain"}, r.headers)
22
+ assert ["Hello"], r.body
23
+ end
24
+
25
+ it "[!n086q] parses 'Set-Cookie' header." do
26
+ headers = {
27
+ "Content-Type"=>"text/plain",
28
+ "Set-Cookie"=>("key1=value1; Path=/; Domain=example.com; HttpOnly; Secure\n" +
29
+ "key2=value2"),
30
+ }
31
+ expected = {
32
+ 'key1' => {
33
+ :name => 'key1',
34
+ :value => 'value1',
35
+ :path => '/',
36
+ :domain => 'example.com',
37
+ :httponly => true,
38
+ :secure => true,
39
+ },
40
+ 'key2' => {
41
+ :name => 'key2',
42
+ :value => 'value2',
43
+ },
44
+ }
45
+ r = Rack::TestApp::Result.new(200, headers, ["Hello"])
46
+ assert_equal expected, r.cookies
47
+ end
48
+
49
+ end
50
+
51
+
52
+ describe '#body_binary' do
53
+
54
+ it "[!mb0i4] returns body as binary string." do
55
+ r = Rack::TestApp::Result.new(200, {}, ["Hello"])
56
+ assert_equal "Hello", r.body_binary
57
+ end
58
+
59
+ end
60
+
61
+
62
+ describe '#body_text' do
63
+
64
+ it "[!vkj9h] returns body as text string, according to 'charset' in 'Content-Type'." do
65
+ headers = {'Content-Type' => 'text/plain; charset=utf-8'}
66
+ r = Rack::TestApp::Result.new(200, headers, ["Hello"])
67
+ assert_equal "Hello", r.body_text
68
+ end
69
+
70
+ it "[!rr18d] error when 'Content-Type' header is missing." do
71
+ headers = {}
72
+ r = Rack::TestApp::Result.new(200, headers, ["Hello"])
73
+ ex = assert_raises(TypeError) { r.body_text }
74
+ assert_equal "body_text(): missing 'Content-Type' header.", ex.message
75
+ end
76
+
77
+ it "[!dou1n] converts body text according to 'charset' in 'Content-Type' header." do
78
+ headers = {'Content-Type' => 'text/plain; charset=utf-8'}
79
+ binary = "\u3042\u3044\u3046\u3048\u304A"
80
+ assert_equal binary, "あいうえお".encode('utf-8')
81
+ r = Rack::TestApp::Result.new(200, headers, [binary])
82
+ assert_equal "あいうえお", r.body_text
83
+ assert_equal 'UTF-8', r.body_text.encoding.name
84
+ end
85
+
86
+ it "[!cxje7] assumes charset as 'utf-8' when 'Content-Type' is json." do
87
+ headers = {'Content-Type' => 'application/json'}
88
+ binary = %Q`{"msg":"\u3042\u3044\u3046\u3048\u304A"}`
89
+ assert_equal binary, %Q`{"msg":"あいうえお"}`.encode('utf-8')
90
+ r = Rack::TestApp::Result.new(200, headers, [binary])
91
+ assert_equal %Q`{"msg":"あいうえお"}`, r.body_text
92
+ assert_equal 'UTF-8', r.body_text.encoding.name
93
+ end
94
+
95
+ it "[!n4c71] error when non-json 'Content-Type' header has no 'charset'." do
96
+ headers = {'Content-Type' => 'text/plain'}
97
+ binary = "\u3042\u3044\u3046\u3048\u304A"
98
+ assert_equal binary, "あいうえお".encode('utf-8')
99
+ r = Rack::TestApp::Result.new(200, headers, [binary])
100
+ ex = assert_raises(TypeError) { r.body_text }
101
+ assert_equal "body_text(): missing 'charset' in 'Content-Type' header.", ex.message
102
+ end
103
+
104
+ end
105
+
106
+
107
+ describe '#body_json' do
108
+
109
+ it "[!qnic1] returns Hash object representing JSON string." do
110
+ headers = {'Content-Type' => 'application/json'}
111
+ binary = %Q`{"msg":"\u3042\u3044\u3046\u3048\u304A"}`
112
+ assert_equal binary, %Q`{"msg":"あいうえお"}`.encode('utf-8')
113
+ r = Rack::TestApp::Result.new(200, headers, [binary])
114
+ assert_equal({"msg"=>"あいうえお"}, r.body_json)
115
+ end
116
+
117
+ end
118
+
119
+
120
+ describe '#content_type' do
121
+
122
+ it "[!40hcz] returns 'Content-Type' header value." do
123
+ headers = {'Content-Type' => 'application/json'}
124
+ r = Rack::TestApp::Result.new(200, headers, [])
125
+ assert_equal "application/json", r.content_type
126
+ #
127
+ headers = {'content-type' => 'application/json'}
128
+ r = Rack::TestApp::Result.new(200, headers, [])
129
+ assert_equal "application/json", r.content_type
130
+ end
131
+
132
+ end
133
+
134
+
135
+ describe '' do
136
+
137
+ it "[!5lb19] returns 'Content-Length' header value as integer." do
138
+ headers = {'Content-Length' => '123'}
139
+ r = Rack::TestApp::Result.new(200, headers, [])
140
+ assert_equal 123, r.content_length
141
+ #
142
+ headers = {'content-length' => '123'}
143
+ r = Rack::TestApp::Result.new(200, headers, [])
144
+ assert_equal 123, r.content_length
145
+ end
146
+
147
+ it "[!qjktz] returns nil when 'Content-Length' is not set." do
148
+ headers = {'Content-Type' => 'text/plain'}
149
+ r = Rack::TestApp::Result.new(200, headers, ["Hello"])
150
+ assert_nil r.content_length
151
+ end
152
+
153
+ end
154
+
155
+
156
+ describe '#location' do
157
+
158
+ it "[!8y8lg] returns 'Location' header value." do
159
+ headers = {'Location' => '/foo'}
160
+ r = Rack::TestApp::Result.new(302, headers, [])
161
+ assert_equal '/foo', r.location
162
+ end
163
+
164
+ end
165
+
166
+
167
+ describe '#cookie_value' do
168
+
169
+ it "[!neaf8] returns cookie value if exists." do
170
+ headers = {'Set-Cookie' => 'name1=value1'}
171
+ r = Rack::TestApp::Result.new(200, headers, [])
172
+ assert_equal 'value1', r.cookie_value('name1')
173
+ end
174
+
175
+ it "[!oapns] returns nil if cookie not exists." do
176
+ headers = {'Set-Cookie' => 'name1=value1'}
177
+ r = Rack::TestApp::Result.new(200, headers, [])
178
+ assert_equal nil, r.cookie_value('name2')
179
+ end
180
+
181
+ end
182
+
183
+
184
+ end
@@ -0,0 +1,238 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ###
4
+ ### $Release: 1.0.0 $
5
+ ### $Copyright: copyright(c) 2015 kuwata-lab.com all rights reserved $
6
+ ### $License: MIT License $
7
+ ###
8
+
9
+
10
+ require_relative '../../test_helper'
11
+
12
+
13
+ describe Rack::TestApp do
14
+
15
+ class << self
16
+ alias context describe # minitest doesn't provide 'context' method
17
+ end
18
+
19
+
20
+ describe '::VERSION' do
21
+
22
+ it "represents release version number." do
23
+ expected = '$Release: 1.0.0 $'.split()[1]
24
+ assert_equal expected, Rack::TestApp::VERSION
25
+ end
26
+
27
+ end
28
+
29
+
30
+ describe '.new_env()' do
31
+
32
+ it "[!b3ts8] returns environ hash object." do
33
+ env = Rack::TestApp.new_env()
34
+ assert_kind_of Hash, env
35
+ assert_equal 'GET', env['REQUEST_METHOD']
36
+ assert_equal '/', env['PATH_INFO']
37
+ end
38
+
39
+ it "[!j879z] sets 'HTTPS' with 'on' when 'rack.url_scheme' is 'https'." do
40
+ env = Rack::TestApp.new_env(env: {'rack.url_scheme'=>'https'})
41
+ assert_equal 'on', env['HTTPS']
42
+ assert_equal 'https', env['rack.url_scheme']
43
+ end
44
+
45
+ it "[!vpwvu] sets 'HTTPS' with 'on' when 'HTTPS' is 'on'." do
46
+ env = Rack::TestApp.new_env(env: {'HTTPS'=>'on'})
47
+ assert_equal 'on', env['HTTPS']
48
+ assert_equal 'https', env['rack.url_scheme']
49
+ end
50
+
51
+ it "[!2uvyb] raises ArgumentError when both query string and 'query' kwarg specified." do
52
+ ex = assert_raises(ArgumentError) do
53
+ Rack::TestApp.new_env(:GET, '/path?x=1', query: {'y'=>2})
54
+ end
55
+ assert_equal "new_env(): not allowed both query string and 'query' kwarg at a time.", ex.message
56
+ end
57
+
58
+ it "[!8tq3m] accepts query string in path string." do
59
+ env = Rack::TestApp.new_env(:GET, '/path?x=1')
60
+ assert_equal 'x=1', env['QUERY_STRING']
61
+ end
62
+
63
+ context "[!d1c83] when 'form' kwarg specified..." do
64
+
65
+ it "[!c779l] raises ArgumentError when both 'form' and 'json' are specified." do
66
+ ex = assert_raises(ArgumentError) do
67
+ Rack::TestApp.new_env(form: {}, json: {})
68
+ end
69
+ assert_equal "new_env(): not allowed both 'form' and 'json' at a time.", ex.message
70
+ end
71
+
72
+ it "[!5iv35] sets content type with 'application/x-www-form-urlencoded'." do
73
+ env = Rack::TestApp.new_env(form: {'x'=>1})
74
+ assert_equal 'application/x-www-form-urlencoded', env['CONTENT_TYPE']
75
+ end
76
+
77
+ end
78
+
79
+ context "[!prv5z] when 'json' kwarg specified..." do
80
+
81
+ it "[!2o0ph] raises ArgumentError when both 'json' and 'multipart' are specified." do
82
+ ex = assert_raises(ArgumentError) do
83
+ Rack::TestApp.new_env(json: {}, multipart: {})
84
+ end
85
+ assert_equal "new_env(): not allowed both 'json' and 'multipart' at a time.", ex.message
86
+ end
87
+
88
+ it "[!ta24a] sets content type with 'application/json'." do
89
+ env = Rack::TestApp.new_env(json: {'x'=>1})
90
+ assert_equal 'application/json', env['CONTENT_TYPE']
91
+ end
92
+
93
+ end
94
+
95
+ context "[!dnvgj] when 'multipart' kwarg specified..." do
96
+
97
+ it "[!b1d1t] raises ArgumentError when both 'multipart' and 'form' are specified." do
98
+ ex = assert_raises(ArgumentError) do
99
+ Rack::TestApp.new_env(multipart: {}, form: {})
100
+ end
101
+ assert_equal "new_env(): not allowed both 'multipart' and 'form' at a time.", ex.message
102
+ end
103
+
104
+ it "[!dq33d] sets content type with 'multipart/form-data'." do
105
+ env = Rack::TestApp.new_env(multipart: {})
106
+ assert_match /\Amultipart\/form-data; boundary=\S+\z/, env['CONTENT_TYPE']
107
+ end
108
+
109
+ it "[!gko8g] 'multipart:' kwarg accepts Hash object (which is converted into multipart data)." do
110
+ fpath = File.join(File.dirname(__FILE__), "data", "example1.jpg")
111
+ file = File.open(fpath, 'rb')
112
+ env = Rack::TestApp.new_env(multipart: {
113
+ "value" => 123,
114
+ "upload" => file,
115
+ })
116
+ assert_equal true, file.closed?
117
+ req = Rack::Request.new(env)
118
+ params = req.POST
119
+ assert_equal "123", params['value']
120
+ assert_equal "upload", params['upload'][:name]
121
+ assert_equal "example1.jpg", params['upload'][:filename]
122
+ assert_equal "image/jpeg", params['upload'][:type]
123
+ assert_kind_of Tempfile, params['upload'][:tempfile]
124
+ end
125
+
126
+ end
127
+
128
+ it "[!iamrk] uses 'application/x-www-form-urlencoded' as default content type of input." do
129
+ env = Rack::TestApp.new_env(:POST, '/', input: 'x=1')
130
+ assert_equal 'application/x-www-form-urlencoded', env['CONTENT_TYPE']
131
+ end
132
+
133
+ it "[!7hfri] converts input string into binary." do
134
+ form = {"x"=>"あいうえお"}
135
+ env = Rack::TestApp.new_env(:POST, '/api/hello', form: form)
136
+ s = env['rack.input'].read()
137
+ assert_equal Encoding::ASCII_8BIT, s.encoding
138
+ end
139
+
140
+ it "[!r3soc] converts query string into binary." do
141
+ query = {"x"=>"あいうえお"}
142
+ env = Rack::TestApp.new_env(:POST, '/api/hello', query: query)
143
+ s = env['QUERY_STRING']
144
+ assert_equal Encoding::ASCII_8BIT, s.encoding
145
+ end
146
+
147
+ it "[!na9w6] builds environ hash object." do
148
+ env = Rack::TestApp.new_env(:POST, '/api/session?q=test')
149
+ #
150
+ assert_equal Rack::VERSION , env['rack.version']
151
+ assert_kind_of Array , env['rack.version']
152
+ assert_match /\A\[1, \d+\]\z/, env['rack.version'].inspect
153
+ assert_kind_of StringIO , env['rack.input']
154
+ assert_kind_of StringIO , env['rack.errors']
155
+ assert_equal true , env['rack.multithread']
156
+ assert_equal true , env['rack.multiprocess']
157
+ assert_equal false , env['rack.run_once']
158
+ assert_equal 'http' , env['rack.url_scheme']
159
+ #
160
+ assert_equal 'POST' , env['REQUEST_METHOD']
161
+ assert_equal 'q=test' , env['QUERY_STRING']
162
+ assert_equal 'localhost' , env['SERVER_NAME']
163
+ assert_equal '80' , env['SERVER_PORT']
164
+ assert_equal 'q=test' , env['QUERY_STRING']
165
+ assert_equal '/api/session' , env['PATH_INFO']
166
+ assert_equal 'off' , env['HTTPS']
167
+ assert_equal '' , env['SCRIPT_NAME']
168
+ assert_equal '0' , env['CONTENT_LENGTH']
169
+ assert_equal nil , env['CONTENT_TYPE']
170
+ end
171
+
172
+ it "[!ezvdn] unsets CONTENT_TYPE when not input." do
173
+ env = Rack::TestApp.new_env(:POST, '/api/session?q=test')
174
+ assert_nil env['CONTENT_TYPE']
175
+ assert_equal false, env.key?('CONTENT_TYPE')
176
+ end
177
+
178
+ it "[!r4jz8] copies 'headers' kwarg content into environ with 'HTTP_' prefix." do
179
+ headers = {
180
+ 'If-Modified-Since' => 'Mon, 02 Feb 2015 19:05:06 GMT',
181
+ 'X-Requested-With' => 'XMLHttpRequest'
182
+ }
183
+ env = Rack::TestApp.new_env(:PUT, '/', headers: headers)
184
+ assert_equal 'Mon, 02 Feb 2015 19:05:06 GMT', env['HTTP_IF_MODIFIED_SINCE']
185
+ assert_equal 'XMLHttpRequest', env['HTTP_X_REQUESTED_WITH']
186
+ end
187
+
188
+ it "[!ai9t3] don't add 'HTTP_' to Content-Length and Content-Type headers." do
189
+ headers = {
190
+ 'Content-Type' => 'application/json',
191
+ 'Content-Length' => '123',
192
+ }
193
+ env = Rack::TestApp.new_env(:PUT, '/', headers: headers)
194
+ assert_equal 'application/json', env['CONTENT_TYPE']
195
+ assert_equal '123', env['CONTENT_LENGTH']
196
+ assert_equal false, env.key?('HTTP_CONTENT_TYPE')
197
+ assert_equal false, env.key?('HTTP_CONTENT_LENGTH')
198
+ end
199
+
200
+ it "[!a47n9] copies 'env' kwarg content into environ." do
201
+ environ = {
202
+ 'rack.session' => {'k1'=>'v1'},
203
+ }
204
+ env = Rack::TestApp.new_env(:PUT, '/', env: environ)
205
+ expected = {'k1'=>'v1'}
206
+ assert_equal expected, env['rack.session']
207
+ end
208
+
209
+ it "[!pmefk] sets 'HTTP_COOKIE' when 'cookie' kwarg specified." do
210
+ env = Rack::TestApp.new_env(cookies: 'c1=v1')
211
+ assert_equal 'c1=v1', env['HTTP_COOKIE']
212
+ env = Rack::TestApp.new_env(cookies: {'c2'=>'v2'})
213
+ assert_equal 'c2=v2', env['HTTP_COOKIE']
214
+ end
215
+
216
+ it "[!qj7b8] cookie value can be {:name=>'name', :value=>'value'}." do
217
+ env = Rack::TestApp.new_env(cookies: {'c3'=>{name: 'c3', value: 'v3'}})
218
+ assert_equal 'c3=v3', env['HTTP_COOKIE']
219
+ end
220
+
221
+ end
222
+
223
+
224
+ describe '.wrap()' do
225
+
226
+ it "[!grqlf] creates new Wrapper object." do
227
+ app = proc {|env| [200, {}, []] }
228
+ env = {"HTTPS"=>"on"}
229
+ wrapper = Rack::TestApp.wrap(app, env)
230
+ assert_kind_of Rack::TestApp::Wrapper, wrapper
231
+ assert_equal app, wrapper.instance_variable_get('@app')
232
+ assert_equal env, wrapper.instance_variable_get('@env')
233
+ end
234
+
235
+ end
236
+
237
+
238
+ end