rack-radar 0.0.1

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