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.
@@ -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: []