rack-radar 0.0.1
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/Gemfile +2 -0
- data/LICENSE +22 -0
- data/README.md +283 -0
- data/Rakefile +14 -0
- data/lib/rack-radar.rb +1 -0
- data/lib/rack/radar.rb +127 -0
- data/lib/rack/radar/cookies.rb +128 -0
- data/lib/rack/radar/session.rb +190 -0
- data/rack-radar.gemspec +21 -0
- data/test/app_test.rb +52 -0
- data/test/auth_test.rb +150 -0
- data/test/cookies_test.rb +280 -0
- data/test/follow_redirect_test.rb +44 -0
- data/test/headers_test.rb +82 -0
- data/test/map_test.rb +64 -0
- data/test/params_test.rb +45 -0
- data/test/request_methods_test.rb +52 -0
- data/test/session_test.rb +42 -0
- data/test/test_setup.rb +162 -0
- metadata +105 -0
data/test/params_test.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'test_setup'
|
2
|
+
|
3
|
+
class ParamsTest
|
4
|
+
include Minispec
|
5
|
+
|
6
|
+
class App < Air
|
7
|
+
|
8
|
+
def index vars
|
9
|
+
self.GET.values_at(*vars.split(',')).inspect
|
10
|
+
end
|
11
|
+
|
12
|
+
def post_index vars
|
13
|
+
self.POST.values_at(*vars.split(',')).inspect
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
before_all { app App }
|
18
|
+
before do
|
19
|
+
@vars, @vals = 2.times.map { 10.times.map { rand.to_s } }
|
20
|
+
@params = Hash[@vars.zip(@vals)]
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'handle GET params' do
|
24
|
+
get @vars.join(','), @params
|
25
|
+
is(last_response.body) == @params.values_at(*@vars).inspect
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'handle POST params' do
|
29
|
+
post @vars.join(','), @params
|
30
|
+
expect(last_response.body) == @params.values_at(*@vars).inspect
|
31
|
+
end
|
32
|
+
|
33
|
+
should 'mix params [Hash] with query_string [String]' do
|
34
|
+
qs_vars, qs_vals = 2.times.map { 10.times.map { rand.to_s } }
|
35
|
+
qs_params = Hash[qs_vars.zip qs_vals]
|
36
|
+
query_string = ::Rack::Utils.build_query(qs_params)
|
37
|
+
get((@vars + qs_vars).join(',') << '?' << query_string, @params)
|
38
|
+
is(last_response.body) == @params.merge(qs_params).values_at(*(@vars + qs_vars)).inspect
|
39
|
+
end
|
40
|
+
|
41
|
+
should 'have content type set to application/x-www-form-urlencoded' do
|
42
|
+
post @vars.join(','), @params
|
43
|
+
expect(last_request.env['CONTENT_TYPE']) == 'application/x-www-form-urlencoded'
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'test_setup'
|
2
|
+
|
3
|
+
class RequestMethodsTest
|
4
|
+
include Minispec
|
5
|
+
|
6
|
+
class App < Air
|
7
|
+
|
8
|
+
Rack::Radar::RACK_RADAR__REQUEST_METHODS.each do |rm|
|
9
|
+
define_method('%s_index' % rm) { body }
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def body
|
14
|
+
[request_method, port, ssl?, xhr?].inspect
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
before_all { app App }
|
19
|
+
|
20
|
+
testing :generic do
|
21
|
+
Rack::Radar::RACK_RADAR__REQUEST_METHODS.each do |rm|
|
22
|
+
self.send(rm.downcase)
|
23
|
+
is(last_response).ok?
|
24
|
+
is(last_response.body) == [rm, 80, false, false].inspect
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
testing :SSL do
|
29
|
+
Rack::Radar::RACK_RADAR__REQUEST_METHODS.each do |rm|
|
30
|
+
self.send('s_' + rm.downcase)
|
31
|
+
is(last_response).ok?
|
32
|
+
is(last_response.body) == [rm, 443, true, false].inspect
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
testing :XHR do
|
37
|
+
Rack::Radar::RACK_RADAR__REQUEST_METHODS.each do |rm|
|
38
|
+
self.send(rm.downcase + '_x')
|
39
|
+
is(last_response).ok?
|
40
|
+
is(last_response.body) == [rm, 80, false, true].inspect
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
testing :SecureXHR do
|
45
|
+
Rack::Radar::RACK_RADAR__REQUEST_METHODS.each do |rm|
|
46
|
+
self.send('s_' + rm.downcase + '_x')
|
47
|
+
is(last_response).ok?
|
48
|
+
is(last_response.body) == [rm, 443, true, true].inspect
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test_setup'
|
2
|
+
|
3
|
+
class SessionTest
|
4
|
+
include Minispec
|
5
|
+
|
6
|
+
class App < Air
|
7
|
+
|
8
|
+
def index
|
9
|
+
__method__
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class JustAnotherApp < Air
|
14
|
+
def alone
|
15
|
+
__method__
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:session) { Rack::Radar::RackRadarSession.new(App) }
|
20
|
+
|
21
|
+
testing 'manually initialized session' do
|
22
|
+
|
23
|
+
session.header['User-Agent'] = 'Rack::Radar'
|
24
|
+
|
25
|
+
session.get
|
26
|
+
is(session.last_response).ok?
|
27
|
+
is(session.last_response.body) == 'index'
|
28
|
+
|
29
|
+
is(session.last_request.env['HTTP_USER_AGENT']) == 'Rack::Radar'
|
30
|
+
|
31
|
+
expect { session.reset_app! }.to_raise_error
|
32
|
+
end
|
33
|
+
|
34
|
+
testing 'app switcher' do
|
35
|
+
session = Rack::Radar::RackRadarSession.new(JustAnotherApp)
|
36
|
+
session.get
|
37
|
+
is(session.last_response).not_found?
|
38
|
+
|
39
|
+
session.get :alone
|
40
|
+
is(session.last_response).ok?
|
41
|
+
end
|
42
|
+
end
|
data/test/test_setup.rb
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
$:.unshift(::File.expand_path '../../lib', __FILE__)
|
2
|
+
require 'rack-radar'
|
3
|
+
|
4
|
+
module Minispec
|
5
|
+
include Rack::Radar
|
6
|
+
end
|
7
|
+
|
8
|
+
# a mini web-framework
|
9
|
+
class Air < ::Rack::Request
|
10
|
+
class << self
|
11
|
+
|
12
|
+
def base_url
|
13
|
+
@root || '/'
|
14
|
+
end
|
15
|
+
alias baseurl base_url
|
16
|
+
|
17
|
+
# adds Rack middleware to the stack
|
18
|
+
def use ware = nil, *args, &proc
|
19
|
+
@middleware ||= []
|
20
|
+
@middleware << [ware, args, proc] if ware
|
21
|
+
@middleware
|
22
|
+
end
|
23
|
+
|
24
|
+
# set the controller's root path
|
25
|
+
def map
|
26
|
+
@map
|
27
|
+
end
|
28
|
+
|
29
|
+
# a Hash that keeps data about routes for each action
|
30
|
+
def action_map
|
31
|
+
@action_map
|
32
|
+
end
|
33
|
+
|
34
|
+
# builds a Rack app
|
35
|
+
def app root = nil
|
36
|
+
if root
|
37
|
+
@root = root
|
38
|
+
else
|
39
|
+
return @app if @app
|
40
|
+
end
|
41
|
+
map!
|
42
|
+
|
43
|
+
builder, app = ::Rack::Builder.new, self
|
44
|
+
use.each do |w|
|
45
|
+
ware, args, proc = w
|
46
|
+
builder.use ware, *args, &proc
|
47
|
+
end
|
48
|
+
map.each_key do |route|
|
49
|
+
builder.map route do
|
50
|
+
run lambda { |env| app.new(env).__air__response__ route }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
@app = builder.to_app
|
54
|
+
end
|
55
|
+
alias to_app app
|
56
|
+
|
57
|
+
# invoke Rack app
|
58
|
+
def call env
|
59
|
+
app.call env
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# build routes
|
65
|
+
def map!
|
66
|
+
@action_map = {}
|
67
|
+
@map = self.instance_methods(false).reject { |m| m.to_s =~ /^__air__/ }.inject({}) do |map, meth|
|
68
|
+
route, request_method = meth.to_s, 'GET'
|
69
|
+
Rack::Radar::RACK_RADAR__REQUEST_METHODS.each do |rm|
|
70
|
+
regex = /^#{rm}_/i
|
71
|
+
route =~ regex && (route = route.sub(regex, '')) && (request_method = rm.upcase) && break
|
72
|
+
end
|
73
|
+
|
74
|
+
{'____' => '.',
|
75
|
+
'___' => '-',
|
76
|
+
'__' => '/'}.each_pair { |f, t| route = route.gsub(f, t) }
|
77
|
+
|
78
|
+
arity = self.instance_method(meth).arity
|
79
|
+
setup = [meth, arity < 0 ? -arity - 1 : arity]
|
80
|
+
(map[rootify(route)] ||={})[request_method] = setup
|
81
|
+
(map[rootify] ||= {})[request_method] = setup if route == 'index'
|
82
|
+
@action_map[meth.to_sym] = rootify(route)
|
83
|
+
map
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# build a route from given path
|
88
|
+
def rootify path = nil
|
89
|
+
('/%s/%s' % [base_url, path]).gsub /\/+/, '/'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def response
|
94
|
+
@__air__response__
|
95
|
+
end
|
96
|
+
|
97
|
+
def __air__response__ route
|
98
|
+
rsp = catch :__air__halt__ do
|
99
|
+
@__air__response__ = ::Rack::Response.new
|
100
|
+
rest_map = self.class.map[route] || halt(404)
|
101
|
+
action, required_parameters = rest_map[env['REQUEST_METHOD']] || halt(404)
|
102
|
+
arguments = env['PATH_INFO'].to_s.split('/').select { |c| c.size > 0 }
|
103
|
+
arguments.size == required_parameters || halt(404, '%s arguments expected, %s given' % [required_parameters, arguments.size])
|
104
|
+
response.body = [self.send(action, *arguments).to_s]
|
105
|
+
response
|
106
|
+
end
|
107
|
+
rsp['Content-Type'] ||= 'text/html'
|
108
|
+
rsp.finish
|
109
|
+
end
|
110
|
+
|
111
|
+
def base_url
|
112
|
+
self.class.base_url
|
113
|
+
end
|
114
|
+
|
115
|
+
def halt status, message = nil
|
116
|
+
response.status = status
|
117
|
+
response.body = [message] if message
|
118
|
+
throw :__air__halt__, response
|
119
|
+
end
|
120
|
+
|
121
|
+
def redirect action_or_path
|
122
|
+
response['Location'] = self.class.action_map[action_or_path] || action_or_path
|
123
|
+
response.status = 302
|
124
|
+
throw :__air__halt__, response
|
125
|
+
end
|
126
|
+
|
127
|
+
def permanent_redirect action_or_path
|
128
|
+
response['Location'] = self.class.action_map[action_or_path] || action_or_path
|
129
|
+
response.status = 301
|
130
|
+
throw :__air__halt__, response
|
131
|
+
end
|
132
|
+
|
133
|
+
def params
|
134
|
+
@__air__params__ ||= indifferent_params(super)
|
135
|
+
end
|
136
|
+
|
137
|
+
def get_params
|
138
|
+
@__air__get_params__ ||= indifferent_params(self.GET)
|
139
|
+
end
|
140
|
+
|
141
|
+
def post_params
|
142
|
+
@__air__post_params__ ||= indifferent_params(self.POST)
|
143
|
+
end
|
144
|
+
|
145
|
+
private
|
146
|
+
def indifferent_params(object)
|
147
|
+
case object
|
148
|
+
when Hash
|
149
|
+
new_hash = indifferent_hash
|
150
|
+
object.each { |key, value| new_hash[key] = indifferent_params(value) }
|
151
|
+
new_hash
|
152
|
+
when Array
|
153
|
+
object.map { |item| indifferent_params(item) }
|
154
|
+
else
|
155
|
+
object
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def indifferent_hash
|
160
|
+
Hash.new { |hash, key| hash[key.to_s] if Symbol === key }
|
161
|
+
end
|
162
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rack-radar
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Slee Woo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minispec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
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: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: A simple API for testing Rack applications via Rack::MockRequest
|
56
|
+
email:
|
57
|
+
- mail@sleewoo.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- Gemfile
|
63
|
+
- LICENSE
|
64
|
+
- README.md
|
65
|
+
- Rakefile
|
66
|
+
- lib/rack-radar.rb
|
67
|
+
- lib/rack/radar.rb
|
68
|
+
- lib/rack/radar/cookies.rb
|
69
|
+
- lib/rack/radar/session.rb
|
70
|
+
- rack-radar.gemspec
|
71
|
+
- test/app_test.rb
|
72
|
+
- test/auth_test.rb
|
73
|
+
- test/cookies_test.rb
|
74
|
+
- test/follow_redirect_test.rb
|
75
|
+
- test/headers_test.rb
|
76
|
+
- test/map_test.rb
|
77
|
+
- test/params_test.rb
|
78
|
+
- test/request_methods_test.rb
|
79
|
+
- test/session_test.rb
|
80
|
+
- test/test_setup.rb
|
81
|
+
homepage: https://github.com/sleewoo/rack-radar
|
82
|
+
licenses:
|
83
|
+
- MIT
|
84
|
+
metadata: {}
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.9.2
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
requirements: []
|
100
|
+
rubyforge_project:
|
101
|
+
rubygems_version: 2.4.5
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: rack-radar-0.0.1
|
105
|
+
test_files: []
|