Module: Merb::Test::RequestHelper
- Includes:
- MakeRequest
- Included in:
- ControllerHelper, RouteHelper
- Defined in:
- lib/merb-core/test/helpers/request_helper.rb,
lib/merb-core/test/helpers/mock_request_helper.rb
Defined Under Namespace
Classes: CookieJar, FakeRequest
Instance Method Summary collapse
- #build_request(params = {}, env = {}) ⇒ Object deprecated Deprecated.
- #check_request_for_route(request) ⇒ Object deprecated Deprecated.
- #delete(path, params = {}, env = {}, &block) ⇒ Object deprecated Deprecated.
- #describe_input(input) ⇒ Object
- #describe_request(rack) ⇒ Object
- #dispatch_request(request, controller_klass, action) {|controller| ... } ⇒ Object deprecated Deprecated.
- #dispatch_to(controller_klass, action, params = {}, env = {}, &blk) ⇒ Object deprecated Deprecated.
- #dispatch_with_basic_authentication_to(controller_klass, action, username, password, params = {}, env = {}, &blk) ⇒ Object deprecated Deprecated.
- #fake_request(env = {}, opt = {}) ⇒ Object deprecated Deprecated.
- #get(path, params = {}, env = {}, &block) ⇒ Object deprecated Deprecated.
-
#merge_controller_and_action(controller_klass, action, params) ⇒ Object
:api: private.
- #mock_request(path, params = {}, env = {}, &block) ⇒ Object deprecated Deprecated.
- #post(path, params = {}, env = {}, &block) ⇒ Object deprecated Deprecated.
-
#put(path, params = {}, env = {}, &block) ⇒ Object
An HTTP PUT request that operates through the router.
- #requesting(*args) ⇒ Object
- #response_for(*args) ⇒ Object
- #status_code(input) ⇒ Object
- #with_cookies(*controller_classes, &blk) ⇒ Object deprecated Deprecated.
Methods included from MakeRequest
Instance Method Details
#build_request(params = {}, env = {}) ⇒ Object
Prepares and returns a request suitable for dispatching with dispatch_request. If you don’t need to modify the request object before dispatching (e.g. to add cookies), you probably want to use dispatch_to instead.
Parameters
- params<Hash>
-
An optional hash that will end up as params in the controller instance.
- env<Hash>
-
An optional hash that is passed to the fake request. Any request options should go here (see
fake_request
), including :req or :post_body for setting the request body itself.
Example
req = build_request(:id => 1)
req.['app_cookie'] = "testing"
dispatch_request(req, MyController, :edit)
Notes
Does not use routes.
:api: public
217 218 219 220 221 222 223 224 225 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 217 def build_request(params = {}, env = {}) params = Merb::Parse.params_to_query_string(params) query_string = env[:query_string] || env['QUERY_STRING'] env[:query_string] = query_string ? "#{query_string}&#{params}" : params post_body = env[:post_body] || env['POST_BODY'] fake_request(env, { :post_body => post_body, :req => env[:req] }) end |
#check_request_for_route(request) ⇒ Object
Checks to see that a request is routable.
Parameters
- request<Merb::Test::RequestHelper::FakeRequest, Merb::Request>
-
The request object to inspect.
Raises
- Merb::ControllerExceptions::BadRequest
-
No matching route was found.
Returns
- Hash
-
The parameters built based on the matching route.
:api: plugin
395 396 397 398 399 400 401 402 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 395 def check_request_for_route(request) match = ::Merb::Router.match(request) if match[0].nil? && match[1].empty? raise ::Merb::ControllerExceptions::BadRequest, "No routes match the request. Request uri: #{request.uri}" else match[1] end end |
#delete(path, params = {}, env = {}, &block) ⇒ Object
An HTTP DELETE request that operates through the router
Parameters
- path<String>
-
The path that should go to the router as the request uri.
- params<Hash>
-
An optional hash that will end up as params in the controller instance.
- env<Hash>
-
An optional hash that is passed to the fake request. Any request options should go here (see fake_request).
- &blk
-
The controller is yielded to the block provided for actions prior to the action being dispatched.
:api: public
301 302 303 304 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 301 def delete(path, params = {}, env = {}, &block) env[:request_method] = "DELETE" mock_request(path, params, env, &block) end |
#describe_input(input) ⇒ Object
76 77 78 79 80 81 82 83 84 |
# File 'lib/merb-core/test/helpers/request_helper.rb', line 76 def describe_input(input) if input.respond_to?(:controller_name) "#{input.controller_name}##{input.action_name}" elsif input.respond_to?(:original_env) describe_request(input) else input end end |
#describe_request(rack) ⇒ Object
72 73 74 |
# File 'lib/merb-core/test/helpers/request_helper.rb', line 72 def describe_request(rack) "a #{rack.original_env[:method] || rack.original_env["REQUEST_METHOD"] || "GET"} to '#{rack.url}'" end |
#dispatch_request(request, controller_klass, action) {|controller| ... } ⇒ Object
The workhorse for the dispatch*to helpers.
Parameters
- request<Merb::Test::RequestHelper::FakeRequest, Merb::Request>
-
A request object that has been setup for testing.
- controller_klass<Merb::Controller>
-
The class object off the controller to dispatch the action to.
- action<Symbol>
-
The action to dispatch the request to.
- &blk
-
The controller is yielded to the block provided for actions prior to the action being dispatched.
Returns
An instance of controller_klass
based on the parameters.
Notes
Does not use routes.
:api: public
369 370 371 372 373 374 375 376 377 378 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 369 def dispatch_request(request, controller_klass, action, &blk) controller = controller_klass.new(request) yield controller if block_given? controller._dispatch(action) Merb.logger.info controller._benchmarks.inspect Merb.logger.flush controller end |
#dispatch_to(controller_klass, action, params = {}, env = {}, &blk) ⇒ Object
Dispatches an action to the given class. This bypasses the router and is suitable for unit testing of controllers.
Parameters
- controller_klass<Controller>
-
The controller class object that the action should be dispatched to.
- action<Symbol>
-
The action name, as a symbol.
- params<Hash>
-
An optional hash that will end up as params in the controller instance.
- env<Hash>
-
An optional hash that is passed to the fake request. Any request options should go here (see
fake_request
), including :req or :post_body for setting the request body itself. - &blk
-
The controller is yielded to the block provided for actions prior to the action being dispatched.
Example
dispatch_to(MyController, :create, :name => 'Homer' ) do |controller|
controller.stub!(:current_user).and_return(@user)
end
Notes
Does not use routes.
:api: public
121 122 123 124 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 121 def dispatch_to(controller_klass, action, params = {}, env = {}, &blk) params = merge_controller_and_action(controller_klass, action, params) dispatch_request(build_request(params, env), controller_klass, action.to_s, &blk) end |
#dispatch_with_basic_authentication_to(controller_klass, action, username, password, params = {}, env = {}, &blk) ⇒ Object
Dispatches an action to the given class and using HTTP Basic Authentication This bypasses the router and is suitable for unit testing of controllers.
Parameters
- controller_klass<Controller>
-
The controller class object that the action should be dispatched to.
- action<Symbol>
-
The action name, as a symbol.
- username<String>
-
The username.
- password<String>
-
The password.
- params<Hash>
-
An optional hash that will end up as params in the controller instance.
- env<Hash>
-
An optional hash that is passed to the fake request. Any request options should go here (see
fake_request
), including :req or :post_body for setting the request body itself. - &blk
-
The controller is yielded to the block provided for actions prior to the action being dispatched.
Example
dispatch_with_basic_authentication_to(MyController, :create, 'Fred', 'secret', :name => 'Homer' ) do |controller|
controller.stub!(:current_user).and_return(@user)
end
Notes
Does not use routes.
:api: public
179 180 181 182 183 184 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 179 def dispatch_with_basic_authentication_to(controller_klass, action, username, password, params = {}, env = {}, &blk) env["X_HTTP_AUTHORIZATION"] = "Basic #{Base64.encode64("#{username}:#{password}")}" params = merge_controller_and_action(controller_klass, action, params) dispatch_request(build_request(params, env), controller_klass, action.to_s, &blk) end |
#fake_request(env = {}, opt = {}) ⇒ Object
Parameters
- env<Hash>
-
A hash of environment keys to be merged into the default list.
- opt<Hash>
-
A hash of options (see below).
Options (opt)
- :post_body<String>
-
The post body for the request.
- :req<String>
-
The request string. This will only be used if :post_body is left out.
Returns
- FakeRequest
-
A Request object that is built based on the parameters.
Notes
If you pass a post body, the content-type will be set to URL-encoded.
:api: public
84 85 86 87 88 89 90 91 92 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 84 def fake_request(env = {}, opt = {}) if opt[:post_body] req = opt[:post_body] env[:content_type] ||= "application/x-www-form-urlencoded" else req = opt[:req] end FakeRequest.new(env, StringIO.new(req || '')) end |
#get(path, params = {}, env = {}, &block) ⇒ Object
An HTTP GET request that operates through the router.
Parameters
- path<String>
-
The path that should go to the router as the request uri.
- params<Hash>
-
An optional hash that will end up as params in the controller instance.
- env<Hash>
-
An optional hash that is passed to the fake request. Any request options should go here (see
fake_request
). - &blk
-
The controller is yielded to the block provided for actions prior to the action being dispatched.
:api: public
242 243 244 245 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 242 def get(path, params = {}, env = {}, &block) env[:request_method] = "GET" mock_request(path, params, env, &block) end |
#merge_controller_and_action(controller_klass, action, params) ⇒ Object
:api: private
187 188 189 190 191 192 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 187 def merge_controller_and_action(controller_klass, action, params) params[:controller] = controller_klass.name.to_const_path params[:action] = action.to_s params end |
#mock_request(path, params = {}, env = {}, &block) ⇒ Object
A generic request that checks the router for the controller and action. This request goes through the Merb::Router and finishes at the controller.
Parameters
- path<String>
-
The path that should go to the router as the request uri.
- params<Hash>
-
An optional hash that will end up as params in the controller instance.
- env<Hash>
-
An optional hash that is passed to the fake request. Any request options should go here (see
fake_request
). - &blk
-
The controller is yielded to the block provided for actions prior to the action being dispatched.
Example
request(path, { :name => 'Homer' }, { :request_method => "PUT" }) do |controller|
controller.stub!(:current_user).and_return(@user)
end
Notes
Uses Routes.
:api: plugin
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 330 def mock_request(path, params = {}, env= {}, &block) env[:request_method] ||= "GET" env[:request_uri], env[:query_string] = path.split('?') multipart = env.delete(:test_with_multipart) request = build_request(params, env) opts = check_request_for_route(request) # Check that the request will be routed correctly controller_name = (opts[:namespace] ? opts.delete(:namespace) + '/' : '') + opts.delete(:controller) klass = Object.full_const_get(controller_name.snake_case.to_const_string) action = opts.delete(:action).to_s params.merge!(opts) multipart.nil? ? dispatch_to(klass, action, params, env, &block) : dispatch_multipart_to(klass, action, params, env, &block) end |
#post(path, params = {}, env = {}, &block) ⇒ Object
An HTTP POST request that operates through the router.
Parameters
- path<String>
-
The path that should go to the router as the request uri.
- params<Hash>
-
An optional hash that will end up as params in the controller instance.
- env<Hash>
-
An optional hash that is passed to the fake request. Any request options should go here (see fake_request).
- &blk
-
The controller is yielded to the block provided for actions prior to the action being dispatched.
:api: public
262 263 264 265 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 262 def post(path, params = {}, env = {}, &block) env[:request_method] = "POST" mock_request(path, params, env, &block) end |
#put(path, params = {}, env = {}, &block) ⇒ Object
An HTTP PUT request that operates through the router.
Parameters
- path<String>
-
The path that should go to the router as the request uri.
- params<Hash>
-
An optional hash that will end up as params in the controller instance.
- env<Hash>
-
An optional hash that is passed to the fake request. Any request options should go here (see fake_request).
- &blk
-
The controller is yielded to the block provided for actions prior to the action being dispatched.
:api: public
281 282 283 284 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 281 def put(path, params = {}, env = {}, &block) env[:request_method] = "PUT" mock_request(path, params, env, &block) end |
#requesting(*args) ⇒ Object
90 |
# File 'lib/merb-core/test/helpers/request_helper.rb', line 90 def requesting(*args) request(*args) end |
#response_for(*args) ⇒ Object
91 |
# File 'lib/merb-core/test/helpers/request_helper.rb', line 91 def response_for(*args) request(*args) end |
#status_code(input) ⇒ Object
86 87 88 |
# File 'lib/merb-core/test/helpers/request_helper.rb', line 86 def status_code(input) input.respond_to?(:status) ? input.status : input end |
#with_cookies(*controller_classes, &blk) ⇒ Object
Keep track of cookie values in CookieJar within the context of the block; you need to set this up for secific controllers.
Parameters
- *controller_classes
-
Controller classes to operate on in the context of the block.
- &blk
-
The context to operate on; optionally accepts the cookie jar as an argument.
:api: public
135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/merb-core/test/helpers/mock_request_helper.rb', line 135 def (*controller_classes, &blk) = CookieJar.new before_cb = lambda { |c| c..update() } after_cb = lambda { |c| .update_from_request(c.request) } controller_classes.each do |klass| klass._before_dispatch_callbacks << before_cb klass._after_dispatch_callbacks << after_cb end blk.arity == 1 ? blk.call() : blk.call controller_classes.each do |klass| klass._before_dispatch_callbacks.delete before_cb klass._after_dispatch_callbacks.delete after_cb end end |