rack-radar 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|