rack-test_app 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE.txt +21 -0
- data/README.md +122 -0
- data/Rakefile +49 -0
- data/lib/rack/test_app.rb +487 -0
- data/rack-test_app.gemspec +31 -0
- data/test/rack/test_app/MultipartBuilder_test.rb +158 -0
- data/test/rack/test_app/Result_test.rb +184 -0
- data/test/rack/test_app/TestApp_test.rb +238 -0
- data/test/rack/test_app/Util_test.rb +168 -0
- data/test/rack/test_app/Wrapper_test.rb +182 -0
- data/test/rack/test_app/data/example1.jpg +0 -0
- data/test/rack/test_app/data/example1.png +0 -0
- data/test/rack/test_app/data/multipart.form +0 -0
- data/test/test_helper.rb +4 -0
- metadata +116 -0
@@ -0,0 +1,168 @@
|
|
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::Util do
|
14
|
+
|
15
|
+
|
16
|
+
describe '.#percent_encode()' do
|
17
|
+
|
18
|
+
it "[!a96jo] encodes string into percent encoding format." do
|
19
|
+
expected = "%5Bxxx%5D"
|
20
|
+
assert_equal expected, Rack::TestApp::Util.percent_encode('[xxx]')
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
describe '.#percent_decode()' do
|
27
|
+
|
28
|
+
it "[!kl9sk] decodes percent encoded string." do
|
29
|
+
expected = "[xxx]"
|
30
|
+
assert_equal expected, Rack::TestApp::Util.percent_decode('%5Bxxx%5D')
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
describe '.#build_query_string()' do
|
37
|
+
|
38
|
+
it "[!098ac] returns nil when argument is nil." do
|
39
|
+
expected = nil
|
40
|
+
assert_equal expected, Rack::TestApp::Util.build_query_string(nil)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "[!z9ds2] returns argument itself when it is a string." do
|
44
|
+
query = "a=10&b=20"
|
45
|
+
expected = query
|
46
|
+
assert_equal expected, Rack::TestApp::Util.build_query_string(query)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "[!m5yyh] returns query string when Hash or Array passed." do
|
50
|
+
query = {a: 10, b: 20}
|
51
|
+
expected = "a=10&b=20"
|
52
|
+
assert_equal expected, Rack::TestApp::Util.build_query_string(query)
|
53
|
+
#
|
54
|
+
query = [[:a, 10], ["b", 20]]
|
55
|
+
expected = "a=10&b=20"
|
56
|
+
assert_equal expected, Rack::TestApp::Util.build_query_string(query)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "[!nksh3] raises ArgumentError when passed value except nil, string, hash or array." do
|
60
|
+
ex = assert_raises ArgumentError do
|
61
|
+
Rack::TestApp::Util.build_query_string(123)
|
62
|
+
end
|
63
|
+
assert_equal ex.message, "Hash or Array expected but got 123."
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
describe '.#parse_set_cookie()' do
|
70
|
+
|
71
|
+
it "[!hvvu4] parses 'Set-Cookie' header value and returns hash object." do
|
72
|
+
set_cookie = "name1=value1; Domain=localhost; Path=/; Expires=Monday, 15-Aug-2005 15:52:01 UTC; Max-Age=3600; Secure; HttpOnly"
|
73
|
+
expected = {
|
74
|
+
:name => "name1",
|
75
|
+
:value => "value1",
|
76
|
+
:domain => "localhost",
|
77
|
+
:path => "/",
|
78
|
+
:expires => "Monday, 15-Aug-2005 15:52:01 UTC",
|
79
|
+
:max_age => 3600,
|
80
|
+
:secure => true,
|
81
|
+
:httponly => true,
|
82
|
+
}
|
83
|
+
actual = Rack::TestApp::Util.parse_set_cookie(set_cookie)
|
84
|
+
assert_equal expected, actual
|
85
|
+
end
|
86
|
+
|
87
|
+
it "[!q1h29] sets true as value for Secure or HttpOnly attribute." do
|
88
|
+
set_cookie = "name1=value1; secure; httponly"
|
89
|
+
expected = {
|
90
|
+
:name => "name1",
|
91
|
+
:value => "value1",
|
92
|
+
:secure => true,
|
93
|
+
:httponly => true,
|
94
|
+
}
|
95
|
+
actual = Rack::TestApp::Util.parse_set_cookie(set_cookie)
|
96
|
+
assert_equal expected, actual
|
97
|
+
end
|
98
|
+
|
99
|
+
it "[!50iko] raises error when attribute value specified for Secure or HttpOnly attirbute." do
|
100
|
+
set_cookie = "name1=value1; Secure=1"
|
101
|
+
ex = assert_raises(TypeError) { Rack::TestApp::Util.parse_set_cookie(set_cookie) }
|
102
|
+
assert_equal "Secure=1: unexpected attribute value.", ex.message
|
103
|
+
#
|
104
|
+
set_cookie = "name1=value1; HttpOnly=1"
|
105
|
+
ex = assert_raises(TypeError) { Rack::TestApp::Util.parse_set_cookie(set_cookie) }
|
106
|
+
assert_equal "HttpOnly=1: unexpected attribute value.", ex.message
|
107
|
+
end
|
108
|
+
|
109
|
+
it "[!sucrm] raises error when attribute value is missing when neighter Secure nor HttpOnly." do
|
110
|
+
set_cookie = "name1=value1; Path"
|
111
|
+
ex = assert_raises(TypeError) { Rack::TestApp::Util.parse_set_cookie(set_cookie) }
|
112
|
+
assert_equal "Path: attribute value expected but not specified.", ex.message
|
113
|
+
end
|
114
|
+
|
115
|
+
it "[!f3rk7] converts string into integer for Max-Age attribute." do
|
116
|
+
set_cookie = "name1=value1; Max-Age=3600"
|
117
|
+
c = Rack::TestApp::Util.parse_set_cookie(set_cookie)
|
118
|
+
assert_equal 3600, c[:max_age]
|
119
|
+
assert_kind_of Fixnum, c[:max_age]
|
120
|
+
end
|
121
|
+
|
122
|
+
it "[!wgzyz] raises error when Max-Age attribute value is not a positive integer." do
|
123
|
+
set_cookie = "name1=value1; Max-Age=30sec"
|
124
|
+
ex = assert_raises(TypeError) { Rack::TestApp::Util.parse_set_cookie(set_cookie) }
|
125
|
+
assert_equal "Max-Age=30sec: positive integer expected.", ex.message
|
126
|
+
end
|
127
|
+
|
128
|
+
it "[!8xg63] raises ArgumentError when unknown attribute exists." do
|
129
|
+
set_cookie = "name1=value1; MaxAge=3600"
|
130
|
+
ex = assert_raises(TypeError) { Rack::TestApp::Util.parse_set_cookie(set_cookie) }
|
131
|
+
assert_equal "MaxAge=3600: unknown cookie attribute.", ex.message
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
describe '.#randstr_b64()' do
|
138
|
+
|
139
|
+
it "[!yq0gv] returns random string, encoded with urlsafe base64." do
|
140
|
+
arr = (1..1000).map { Rack::TestApp::Util.randstr_b64() }
|
141
|
+
assert_equal 1000, arr.sort.uniq.length
|
142
|
+
arr.each do |s|
|
143
|
+
assert_match /\A[-\w]+\z/, s
|
144
|
+
assert_equal 27, s.length
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
describe '.#guess_content_type()' do
|
152
|
+
|
153
|
+
it "[!xw0js] returns content type guessed from filename." do
|
154
|
+
assert_equal "text/html" , Rack::TestApp::Util.guess_content_type("foo.html")
|
155
|
+
assert_equal "image/jpeg" , Rack::TestApp::Util.guess_content_type("foo.jpg")
|
156
|
+
assert_equal "application/json", Rack::TestApp::Util.guess_content_type("foo.json")
|
157
|
+
assert_equal "application/vnd.ms-excel", Rack::TestApp::Util.guess_content_type("foo.xls")
|
158
|
+
end
|
159
|
+
|
160
|
+
it "[!dku5c] returns 'application/octet-stream' when failed to guess content type." do
|
161
|
+
assert_equal "application/octet-stream", Rack::TestApp::Util.guess_content_type("foo.rbc")
|
162
|
+
assert_equal "application/octet-stream", Rack::TestApp::Util.guess_content_type("foo")
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
end
|
@@ -0,0 +1,182 @@
|
|
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::Wrapper do
|
14
|
+
|
15
|
+
app = proc {|env|
|
16
|
+
text = "#{env['REQUEST_METHOD']} #{env['PATH_INFO']}"
|
17
|
+
text << "?#{env['QUERY_STRING']}" unless env['QUERY_STRING'].to_s.empty?
|
18
|
+
text = "" if env['REQUEST_METHOD'] == 'HEAD'
|
19
|
+
[200, {"Content-Type"=>"text/plain;charset=utf-8"}, [text]]
|
20
|
+
}
|
21
|
+
app = Rack::Lint.new(app)
|
22
|
+
|
23
|
+
|
24
|
+
describe '#initialize()' do
|
25
|
+
|
26
|
+
it "[!zz9yg] takes app and optional env objects." do
|
27
|
+
env = {"HTTPS"=>"on"}
|
28
|
+
wrapper = Rack::TestApp::Wrapper.new(app, env)
|
29
|
+
assert_equal app, wrapper.instance_variable_get('@app')
|
30
|
+
assert_equal env, wrapper.instance_variable_get('@env')
|
31
|
+
#
|
32
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
33
|
+
assert_equal app, wrapper.instance_variable_get('@app')
|
34
|
+
assert_equal nil, wrapper.instance_variable_get('@env')
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
describe '#with()' do
|
41
|
+
|
42
|
+
it "[!0bk12] returns new wrapper object, keeping cookies and headers." do
|
43
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
44
|
+
cookies = {'k1'=>{name: 'k1', value: 'v1'}}
|
45
|
+
headers = {'X-Requested-With'=>'XMLHttpRequest'}
|
46
|
+
new_wrapper = wrapper.with(cookies: cookies, headers: headers)
|
47
|
+
assert_kind_of Rack::TestApp::Wrapper, new_wrapper
|
48
|
+
expected = {"HTTP_X_REQUESTED_WITH"=>"XMLHttpRequest", "HTTP_COOKIE"=>"k1=v1"}
|
49
|
+
assert_equal expected, new_wrapper.instance_variable_get('@env')
|
50
|
+
end
|
51
|
+
|
52
|
+
it "[!mkdbu] yields with new wrapper object if block given." do
|
53
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
54
|
+
cookies = {'k1'=>{name: 'k1', value: 'v1'}}
|
55
|
+
headers = {'X-Requested-With'=>'XMLHttpRequest'}
|
56
|
+
wrapper.with(cookies: cookies, headers: headers) do |new_wrapper|
|
57
|
+
assert_kind_of Rack::TestApp::Wrapper, new_wrapper
|
58
|
+
expected = {"HTTP_X_REQUESTED_WITH"=>"XMLHttpRequest", "HTTP_COOKIE"=>"k1=v1"}
|
59
|
+
assert_equal expected, new_wrapper.instance_variable_get('@env')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
describe '#request()' do
|
67
|
+
|
68
|
+
it "[!eb153] returns Rack::TestApp::Result object." do
|
69
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
70
|
+
r = wrapper.request(:POST, '/hello')
|
71
|
+
assert_kind_of Rack::TestApp::Result, r
|
72
|
+
end
|
73
|
+
|
74
|
+
it "[!4xpwa] creates env object and calls app with it." do
|
75
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
76
|
+
wrapper.request(:POST, '/hello')
|
77
|
+
assert_equal 'POST', wrapper.last_env['REQUEST_METHOD']
|
78
|
+
assert_equal '/hello', wrapper.last_env['PATH_INFO']
|
79
|
+
end
|
80
|
+
|
81
|
+
it "[!r6sod] merges @env if passed for initializer." do
|
82
|
+
wrapper = Rack::TestApp::Wrapper.new(app, {"HTTPS"=>"on"})
|
83
|
+
wrapper.request(:POST, '/hello')
|
84
|
+
assert_equal 'on', wrapper.last_env['HTTPS']
|
85
|
+
#
|
86
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
87
|
+
wrapper.request(:POST, '/hello')
|
88
|
+
assert_equal 'off', wrapper.last_env['HTTPS']
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
describe '#GET()' do
|
95
|
+
|
96
|
+
it "requests with GET method." do
|
97
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
98
|
+
r = wrapper.GET('/api/foo', query: {"id"=>123})
|
99
|
+
assert_equal "GET /api/foo?id=123", r.body_text
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
describe '#POST()' do
|
106
|
+
|
107
|
+
it "requests with POST method." do
|
108
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
109
|
+
r = wrapper.POST('/api/foo', form: {"id"=>123})
|
110
|
+
assert_equal "POST /api/foo", r.body_text
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
describe '#PUT()' do
|
117
|
+
|
118
|
+
it "requests with PUT method." do
|
119
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
120
|
+
r = wrapper.PUT('/api/foo', form: {"id"=>123})
|
121
|
+
assert_equal "PUT /api/foo", r.body_text
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
describe '#DELETE()' do
|
128
|
+
|
129
|
+
it "requests with DELETE method." do
|
130
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
131
|
+
r = wrapper.DELETE('/api/foo', form: {"id"=>123})
|
132
|
+
assert_equal "DELETE /api/foo", r.body_text
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
describe '#HEAD()' do
|
139
|
+
|
140
|
+
it "requests with HEAD method." do
|
141
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
142
|
+
r = wrapper.HEAD('/api/foo', query: {"id"=>123})
|
143
|
+
assert_equal "", r.body_text
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
describe '#PATCH()' do
|
150
|
+
|
151
|
+
it "requests with PATCH method." do
|
152
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
153
|
+
r = wrapper.PATCH('/api/foo', form: {"id"=>123})
|
154
|
+
assert_equal "PATCH /api/foo", r.body_text
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
describe '#OPTIONS()' do
|
161
|
+
|
162
|
+
it "requests with OPTIONS method." do
|
163
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
164
|
+
r = wrapper.OPTIONS('/api/foo', form: {"id"=>123})
|
165
|
+
assert_equal "OPTIONS /api/foo", r.body_text
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
describe '#TRACE()' do
|
172
|
+
|
173
|
+
it "requests with TRACE method." do
|
174
|
+
wrapper = Rack::TestApp::Wrapper.new(app)
|
175
|
+
r = wrapper.TRACE('/api/foo', form: {"id"=>123})
|
176
|
+
assert_equal "TRACE /api/foo", r.body_text
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
|
182
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rack-test_app
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- makoto kuwata
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-11-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.10'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.10'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: |
|
70
|
+
Rack::TestApp is another testing helper library for Rack application.
|
71
|
+
IMO it is more intuitive than Rack::Test.
|
72
|
+
email:
|
73
|
+
- kwa@kuwata-lab.com
|
74
|
+
executables: []
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- MIT-LICENSE.txt
|
79
|
+
- README.md
|
80
|
+
- Rakefile
|
81
|
+
- lib/rack/test_app.rb
|
82
|
+
- rack-test_app.gemspec
|
83
|
+
- test/rack/test_app/MultipartBuilder_test.rb
|
84
|
+
- test/rack/test_app/Result_test.rb
|
85
|
+
- test/rack/test_app/TestApp_test.rb
|
86
|
+
- test/rack/test_app/Util_test.rb
|
87
|
+
- test/rack/test_app/Wrapper_test.rb
|
88
|
+
- test/rack/test_app/data/example1.jpg
|
89
|
+
- test/rack/test_app/data/example1.png
|
90
|
+
- test/rack/test_app/data/multipart.form
|
91
|
+
- test/test_helper.rb
|
92
|
+
homepage: https://github.com/kwatch/rack-test_app
|
93
|
+
licenses:
|
94
|
+
- MIT-LICENCE
|
95
|
+
metadata: {}
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '2.0'
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
requirements: []
|
111
|
+
rubyforge_project:
|
112
|
+
rubygems_version: 2.4.5.1
|
113
|
+
signing_key:
|
114
|
+
specification_version: 4
|
115
|
+
summary: more intuitive testing helper library for Rack app
|
116
|
+
test_files: []
|