merb 0.5.3 → 0.9.2
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.
- data/LICENSE +0 -20
- data/README +0 -277
- data/Rakefile +80 -199
- data/TODO +0 -3
- metadata +19 -438
- data/SVN_REVISION +0 -1
- data/app_generators/merb/USAGE +0 -5
- data/app_generators/merb/merb_generator.rb +0 -108
- data/app_generators/merb/templates/Rakefile +0 -124
- data/app_generators/merb/templates/app/controllers/application.rb +0 -3
- data/app_generators/merb/templates/app/controllers/exceptions.rb +0 -13
- data/app_generators/merb/templates/app/helpers/global_helper.rb +0 -5
- data/app_generators/merb/templates/app/mailers/views/layout/application.html.erb +0 -1
- data/app_generators/merb/templates/app/mailers/views/layout/application.text.erb +0 -1
- data/app_generators/merb/templates/app/parts/views/layout/application.html.erb +0 -1
- data/app_generators/merb/templates/app/views/exceptions/internal_server_error.html.erb +0 -216
- data/app_generators/merb/templates/app/views/exceptions/not_acceptable.html.erb +0 -38
- data/app_generators/merb/templates/app/views/exceptions/not_found.html.erb +0 -40
- data/app_generators/merb/templates/app/views/layout/application.html.erb +0 -11
- data/app_generators/merb/templates/config/boot.rb +0 -11
- data/app_generators/merb/templates/config/dependencies.rb +0 -41
- data/app_generators/merb/templates/config/environments/development.rb +0 -1
- data/app_generators/merb/templates/config/environments/production.rb +0 -1
- data/app_generators/merb/templates/config/environments/test.rb +0 -1
- data/app_generators/merb/templates/config/merb.yml +0 -82
- data/app_generators/merb/templates/config/merb_init.rb +0 -17
- data/app_generators/merb/templates/config/plugins.yml +0 -1
- data/app_generators/merb/templates/config/router.rb +0 -35
- data/app_generators/merb/templates/config/upload.conf +0 -0
- data/app_generators/merb/templates/public/images/merb.jpg +0 -0
- data/app_generators/merb/templates/public/merb.fcgi +0 -6
- data/app_generators/merb/templates/public/stylesheets/master.css +0 -119
- data/app_generators/merb/templates/script/destroy +0 -32
- data/app_generators/merb/templates/script/generate +0 -32
- data/app_generators/merb/templates/script/stop_merb +0 -13
- data/app_generators/merb/templates/script/win_script.cmd +0 -1
- data/app_generators/merb/templates/spec/spec.opts +0 -6
- data/app_generators/merb/templates/spec/spec_helper.rb +0 -15
- data/app_generators/merb/templates/test/test_helper.rb +0 -14
- data/app_generators/merb_plugin/USAGE +0 -5
- data/app_generators/merb_plugin/merb_plugin_generator.rb +0 -68
- data/app_generators/merb_plugin/templates/LICENSE +0 -20
- data/app_generators/merb_plugin/templates/README +0 -4
- data/app_generators/merb_plugin/templates/Rakefile +0 -35
- data/app_generators/merb_plugin/templates/TODO +0 -5
- data/app_generators/merb_plugin/templates/merbtasks.rb +0 -6
- data/app_generators/merb_plugin/templates/sampleplugin.rb +0 -10
- data/app_generators/merb_plugin/templates/sampleplugin_spec.rb +0 -7
- data/app_generators/merb_plugin/templates/spec_helper.rb +0 -2
- data/bin/merb +0 -4
- data/lib/autotest/discover.rb +0 -3
- data/lib/autotest/merb_rspec.rb +0 -80
- data/lib/merb.rb +0 -188
- data/lib/merb/abstract_controller.rb +0 -399
- data/lib/merb/assets.rb +0 -160
- data/lib/merb/assets.rb.orig +0 -119
- data/lib/merb/boot_loader.rb +0 -286
- data/lib/merb/boot_loader.rb.orig +0 -235
- data/lib/merb/caching.rb +0 -5
- data/lib/merb/caching/action_cache.rb +0 -92
- data/lib/merb/caching/fragment_cache.rb +0 -39
- data/lib/merb/caching/store/file_cache.rb +0 -90
- data/lib/merb/caching/store/memory_cache.rb +0 -85
- data/lib/merb/config.rb +0 -290
- data/lib/merb/constants.rb +0 -50
- data/lib/merb/controller.rb +0 -220
- data/lib/merb/cookies.rb +0 -95
- data/lib/merb/core_ext.rb +0 -15
- data/lib/merb/core_ext/array.rb +0 -0
- data/lib/merb/core_ext/class.rb +0 -180
- data/lib/merb/core_ext/enumerable.rb +0 -49
- data/lib/merb/core_ext/get_args.rb +0 -76
- data/lib/merb/core_ext/hash.rb +0 -306
- data/lib/merb/core_ext/inflections.rb +0 -112
- data/lib/merb/core_ext/inflector.rb +0 -275
- data/lib/merb/core_ext/kernel.rb +0 -242
- data/lib/merb/core_ext/mash.rb +0 -88
- data/lib/merb/core_ext/module.rb +0 -67
- data/lib/merb/core_ext/numeric.rb +0 -72
- data/lib/merb/core_ext/object.rb +0 -183
- data/lib/merb/core_ext/string.rb +0 -53
- data/lib/merb/core_ext/symbol.rb +0 -6
- data/lib/merb/dispatcher.rb +0 -109
- data/lib/merb/drb_server.rb +0 -19
- data/lib/merb/erubis_ext.rb +0 -10
- data/lib/merb/exceptions.rb +0 -192
- data/lib/merb/generators/merb_app/merb_app.rb +0 -22
- data/lib/merb/generators/merb_generator_helpers.rb +0 -318
- data/lib/merb/generators/merb_plugin.rb +0 -22
- data/lib/merb/logger.rb +0 -78
- data/lib/merb/mail_controller.rb +0 -268
- data/lib/merb/mailer.rb +0 -87
- data/lib/merb/mixins/basic_authentication.rb +0 -35
- data/lib/merb/mixins/controller.rb +0 -160
- data/lib/merb/mixins/erubis_capture.rb +0 -68
- data/lib/merb/mixins/general_controller.rb +0 -253
- data/lib/merb/mixins/inline_partial.rb +0 -32
- data/lib/merb/mixins/render.rb +0 -465
- data/lib/merb/mixins/responder.rb +0 -449
- data/lib/merb/mixins/view_context.rb +0 -558
- data/lib/merb/mixins/web_controller.rb +0 -36
- data/lib/merb/mongrel_handler.rb +0 -168
- data/lib/merb/part_controller.rb +0 -29
- data/lib/merb/plugins.rb +0 -16
- data/lib/merb/rack_adapter.rb +0 -37
- data/lib/merb/request.rb +0 -465
- data/lib/merb/router.rb +0 -646
- data/lib/merb/server.rb +0 -169
- data/lib/merb/session.rb +0 -23
- data/lib/merb/session/cookie_store.rb +0 -118
- data/lib/merb/session/mem_cache_session.rb +0 -131
- data/lib/merb/session/memory_session.rb +0 -176
- data/lib/merb/template.rb +0 -37
- data/lib/merb/template/erubis.rb +0 -68
- data/lib/merb/template/haml.rb +0 -87
- data/lib/merb/template/markaby.rb +0 -59
- data/lib/merb/template/xml_builder.rb +0 -50
- data/lib/merb/test/fake_request.rb +0 -74
- data/lib/merb/test/helper.rb +0 -260
- data/lib/merb/test/hpricot.rb +0 -136
- data/lib/merb/test/multipart.rb +0 -66
- data/lib/merb/test/rspec.rb +0 -18
- data/lib/merb/test/rspec_matchers/controller_matchers.rb +0 -117
- data/lib/merb/test/rspec_matchers/markup_matchers.rb +0 -98
- data/lib/merb/upload_handler.rb +0 -80
- data/lib/merb/upload_progress.rb +0 -48
- data/lib/merb/version.rb +0 -49
- data/lib/merb/view_context.rb +0 -79
- data/lib/tasks.rb +0 -7
- data/lib/tasks/merb.rake +0 -54
- data/merb_default_generators/model/USAGE +0 -0
- data/merb_default_generators/model/model_generator.rb +0 -16
- data/merb_default_generators/model/templates/new_model_template.erb +0 -5
- data/merb_default_generators/resource_controller/USAGE +0 -0
- data/merb_default_generators/resource_controller/resource_controller_generator.rb +0 -26
- data/merb_default_generators/resource_controller/templates/controller.rb +0 -30
- data/merb_default_generators/resource_controller/templates/edit.html.erb +0 -1
- data/merb_default_generators/resource_controller/templates/helper.rb +0 -5
- data/merb_default_generators/resource_controller/templates/index.html.erb +0 -1
- data/merb_default_generators/resource_controller/templates/new.html.erb +0 -1
- data/merb_default_generators/resource_controller/templates/show.html.erb +0 -1
- data/merb_generators/controller/USAGE +0 -5
- data/merb_generators/controller/controller_generator.rb +0 -16
- data/merb_generators/controller/templates/controller.rb +0 -8
- data/merb_generators/controller/templates/helper.rb +0 -5
- data/merb_generators/controller/templates/index.html.erb +0 -3
- data/merb_generators/part_controller/USAGE +0 -5
- data/merb_generators/part_controller/part_controller_generator.rb +0 -27
- data/merb_generators/part_controller/templates/controller.rb +0 -8
- data/merb_generators/part_controller/templates/helper.rb +0 -5
- data/merb_generators/part_controller/templates/index.html.erb +0 -3
- data/merb_generators/resource/USAGE +0 -0
- data/merb_generators/resource/resource_generator.rb +0 -67
- data/rspec_generators/merb_controller_test/merb_controller_test_generator.rb +0 -67
- data/rspec_generators/merb_controller_test/templates/controller_spec.rb +0 -8
- data/rspec_generators/merb_controller_test/templates/edit_spec.rb +0 -12
- data/rspec_generators/merb_controller_test/templates/helper_spec.rb +0 -5
- data/rspec_generators/merb_controller_test/templates/index_spec.rb +0 -12
- data/rspec_generators/merb_controller_test/templates/new_spec.rb +0 -12
- data/rspec_generators/merb_controller_test/templates/show_spec.rb +0 -5
- data/rspec_generators/merb_model_test/merb_model_test_generator.rb +0 -26
- data/rspec_generators/merb_model_test/templates/model_spec_template.erb +0 -7
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/spec/fixtures/config/environments/environment_config_test.yml +0 -1
- data/spec/fixtures/config/merb.yml +0 -18
- data/spec/fixtures/controllers/dispatch_spec_controllers.rb +0 -235
- data/spec/fixtures/controllers/render_spec_controllers.rb +0 -184
- data/spec/fixtures/foo.rb +0 -3
- data/spec/fixtures/mailers/views/layout/application.html.erb +0 -3
- data/spec/fixtures/mailers/views/layout/application.text.erb +0 -3
- data/spec/fixtures/mailers/views/test_mail_controller/eighth.html.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/eighth.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/first.html.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/first.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/ninth.html.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/ninth.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/second.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/third.html.erb +0 -1
- data/spec/fixtures/models/router_spec_models.rb +0 -30
- data/spec/fixtures/parts/views/layout/todo_part.html.erb +0 -3
- data/spec/fixtures/parts/views/layout/todo_part.xml.erb +0 -3
- data/spec/fixtures/parts/views/todo_part/formatted_output.html.erb +0 -1
- data/spec/fixtures/parts/views/todo_part/formatted_output.js.erb +0 -1
- data/spec/fixtures/parts/views/todo_part/formatted_output.xml.erb +0 -1
- data/spec/fixtures/parts/views/todo_part/list.html.erb +0 -3
- data/spec/fixtures/sample.txt +0 -1
- data/spec/fixtures/views/erubis.html.erb +0 -1
- data/spec/fixtures/views/examples/_erubis.html.erb +0 -1
- data/spec/fixtures/views/examples/_haml.html.haml +0 -1
- data/spec/fixtures/views/examples/_markaby.html.mab +0 -1
- data/spec/fixtures/views/examples/_throw_content.html.erb +0 -6
- data/spec/fixtures/views/examples/hello.xml.builder +0 -1
- data/spec/fixtures/views/examples/js.js.erb +0 -1
- data/spec/fixtures/views/examples/template_catch_content.html.erb +0 -15
- data/spec/fixtures/views/examples/template_catch_content_from_partial.html.erb +0 -6
- data/spec/fixtures/views/examples/template_throw_content.html.erb +0 -10
- data/spec/fixtures/views/examples/template_throw_content_without_block.html.erb +0 -3
- data/spec/fixtures/views/exceptions/admin_access_required.html.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/_nested_js.js.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/_nested_xml.xml.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/_render_partial_multiple_times.html.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.html.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.js.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.rhtml +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.xml.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/haml_index.html.haml +0 -0
- data/spec/fixtures/views/extension_template_controller/haml_templates.html.haml +0 -1
- data/spec/fixtures/views/extension_template_controller/haml_templates.js.haml +0 -1
- data/spec/fixtures/views/extension_template_controller/haml_templates.xml.haml +0 -1
- data/spec/fixtures/views/extension_template_controller/index.html.erb +0 -0
- data/spec/fixtures/views/extension_template_controller/markaby_index.html.mab +0 -0
- data/spec/fixtures/views/extension_template_controller/markaby_templates.html.mab +0 -1
- data/spec/fixtures/views/extension_template_controller/markaby_templates.js.mab +0 -1
- data/spec/fixtures/views/extension_template_controller/markaby_templates.xml.mab +0 -1
- data/spec/fixtures/views/extension_template_controller/render_multiple_partials.html.erb +0 -4
- data/spec/fixtures/views/extension_template_controller/render_nested_js.js.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/render_nested_xml.xml.erb +0 -1
- data/spec/fixtures/views/haml.html.haml +0 -1
- data/spec/fixtures/views/haml.xml.haml +0 -2
- data/spec/fixtures/views/layout/application.html.erb +0 -1
- data/spec/fixtures/views/layout/application.xml.erb +0 -1
- data/spec/fixtures/views/layout/nested/example.html.erb +0 -1
- data/spec/fixtures/views/markaby.html.mab +0 -1
- data/spec/fixtures/views/nested/example/test.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis_collection.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis_collection_with_locals.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis_new.html.erb +0 -1
- data/spec/fixtures/views/partials/_haml.html.haml +0 -1
- data/spec/fixtures/views/partials/_haml_collection.html.haml +0 -1
- data/spec/fixtures/views/partials/_haml_collection_with_locals.html.haml +0 -1
- data/spec/fixtures/views/partials/_haml_new.html.haml +0 -1
- data/spec/fixtures/views/partials/_markaby.html.mab +0 -1
- data/spec/fixtures/views/partials/_markaby_collection.html.mab +0 -1
- data/spec/fixtures/views/partials/_markaby_collection_with_locals.html.mab +0 -1
- data/spec/fixtures/views/partials/_markaby_new.html.mab +0 -1
- data/spec/fixtures/views/render_object_controller/render_object_with_template.html.erb +0 -1
- data/spec/fixtures/views/render_object_controller/render_object_with_template.js.erb +0 -1
- data/spec/fixtures/views/render_object_controller/render_object_with_template.xml.erb +0 -1
- data/spec/fixtures/views/template_views/interface__buffer_erubis.html.erb +0 -4
- data/spec/fixtures/views/template_views/interface__buffer_haml.html.haml +0 -7
- data/spec/fixtures/views/template_views/interface__buffer_markaby.html.mab +0 -7
- data/spec/fixtures/views/template_views/interface_capture_erubis.html.erb +0 -15
- data/spec/fixtures/views/template_views/interface_capture_haml.html.haml +0 -15
- data/spec/fixtures/views/template_views/interface_capture_markaby.html.mab +0 -4
- data/spec/fixtures/views/template_views/interface_concat_erubis.html.erb +0 -12
- data/spec/fixtures/views/template_views/interface_concat_haml.html.haml +0 -11
- data/spec/fixtures/views/template_views/interface_concat_markaby.html.mab +0 -14
- data/spec/fixtures/views/test.dir/the_template.html.erb +0 -1
- data/spec/merb/abstract_controller_spec.rb +0 -38
- data/spec/merb/assets_spec.rb +0 -207
- data/spec/merb/caching_spec.rb +0 -102
- data/spec/merb/config_spec.rb +0 -29
- data/spec/merb/controller_filters_spec.rb +0 -253
- data/spec/merb/controller_spec.rb +0 -126
- data/spec/merb/cookie_store_spec.rb +0 -72
- data/spec/merb/cookies_spec.rb +0 -96
- data/spec/merb/core_ext/class_spec.rb +0 -97
- data/spec/merb/core_ext/enumerable_spec.rb +0 -27
- data/spec/merb/core_ext/hash_spec.rb +0 -251
- data/spec/merb/core_ext/inflector_spec.rb +0 -34
- data/spec/merb/core_ext/kernel_spec.rb +0 -25
- data/spec/merb/core_ext/numeric_spec.rb +0 -26
- data/spec/merb/core_ext/object_spec.rb +0 -47
- data/spec/merb/core_ext/string_spec.rb +0 -22
- data/spec/merb/core_ext/symbol_spec.rb +0 -7
- data/spec/merb/dependency_spec.rb +0 -22
- data/spec/merb/dispatch_spec.rb +0 -528
- data/spec/merb/fake_request_spec.rb +0 -80
- data/spec/merb/generator_spec.rb +0 -248
- data/spec/merb/handler_spec.rb +0 -169
- data/spec/merb/mail_controller_spec.rb +0 -177
- data/spec/merb/mailer_spec.rb +0 -87
- data/spec/merb/multipart_spec.rb +0 -50
- data/spec/merb/part_controller_spec.rb +0 -124
- data/spec/merb/plugins_spec.rb +0 -80
- data/spec/merb/render_spec.rb +0 -469
- data/spec/merb/request_spec.rb +0 -287
- data/spec/merb/responder_spec.rb +0 -562
- data/spec/merb/router_spec.rb +0 -900
- data/spec/merb/server_spec.rb +0 -19
- data/spec/merb/template_spec.rb +0 -41
- data/spec/merb/upload_handler_spec.rb +0 -108
- data/spec/merb/version_spec.rb +0 -33
- data/spec/merb/view_context_spec.rb +0 -366
- data/spec/spec_generator_helper.rb +0 -34
- data/spec/spec_helper.rb +0 -101
- data/spec/spec_helpers/url_shared_behaviour.rb +0 -112
- data/test_unit_generators/merb_controller_test/merb_controller_test_generator.rb +0 -53
- data/test_unit_generators/merb_controller_test/templates/functional_test.rb +0 -17
- data/test_unit_generators/merb_controller_test/templates/helper_test.rb +0 -9
- data/test_unit_generators/merb_model_test/merb_model_test_generator.rb +0 -29
- data/test_unit_generators/merb_model_test/templates/model_test_unit_template.erb +0 -9
data/spec/merb/request_spec.rb
DELETED
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Merb::Request do
|
|
4
|
-
include Mocha::SetupAndTeardown
|
|
5
|
-
|
|
6
|
-
class GoodPosts < Merb::Controller
|
|
7
|
-
def show() end
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
before(:each) do
|
|
11
|
-
setup_stubs
|
|
12
|
-
@in = Merb::Test::FakeRequest.new
|
|
13
|
-
Merb::Request.any_instance.stubs(:route_params).returns({})
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
after(:each) do
|
|
17
|
-
teardown_stubs
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
it "should parse POST body into params" do
|
|
21
|
-
@in.post_body = "title=hello%20there&body=some%20text&user[roles][]=admin&user[roles][]=superuser&commit=Submit"
|
|
22
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
23
|
-
@in['CONTENT_TYPE'] = "application/x-www-form-urlencoded"
|
|
24
|
-
request = Merb::Request.new(@in)
|
|
25
|
-
request.params[:title].should == "hello there"
|
|
26
|
-
request.params[:body].should == "some text"
|
|
27
|
-
request.params[:commit].should == "Submit"
|
|
28
|
-
request.params[:user][:roles].class.should == Array
|
|
29
|
-
request.params[:user][:roles][0].should == "admin"
|
|
30
|
-
request.params[:user][:roles][1].should == "superuser"
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "should parse POST body into params unless Content-Type header is set explicitly" do
|
|
34
|
-
input = "title=hello%20there&body=some%20text&commit=Submit"
|
|
35
|
-
@in.post_body = input
|
|
36
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
37
|
-
@in['CONTENT_TYPE'] = 'text/plain'
|
|
38
|
-
request = Merb::Request.new(@in)
|
|
39
|
-
request.params[:title].should be_nil
|
|
40
|
-
request.params[:body].should be_nil
|
|
41
|
-
request.params[:commit].should be_nil
|
|
42
|
-
request.raw_post.should == input
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "should parse PUT body into params" do
|
|
46
|
-
@in.post_body = "title=hello%20there&body=some%20text&commit=Submit"
|
|
47
|
-
@in['REQUEST_METHOD'] = 'PUT'
|
|
48
|
-
@in['CONTENT_TYPE'] = "application/x-www-form-urlencoded"
|
|
49
|
-
request = Merb::Request.new(@in)
|
|
50
|
-
request.params[:title].should == "hello there"
|
|
51
|
-
request.params[:body].should == "some text"
|
|
52
|
-
request.params[:commit].should == "Submit"
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
it "should parse PUT body into params unless Content-Type header is set explicitly" do
|
|
56
|
-
input = "title=hello%20there&body=some%20text&commit=Submit"
|
|
57
|
-
@in.post_body = input
|
|
58
|
-
@in['REQUEST_METHOD'] = 'PUT'
|
|
59
|
-
@in['CONTENT_TYPE'] = 'text/plain'
|
|
60
|
-
request = Merb::Request.new(@in)
|
|
61
|
-
request.params[:title].should be_nil
|
|
62
|
-
request.params[:body].should be_nil
|
|
63
|
-
request.params[:commit].should be_nil
|
|
64
|
-
request.raw_post.should == input
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
it "should parse Query String into params" do
|
|
68
|
-
@in['QUERY_STRING'] = "title=hello%20there&body=some%20text&commit=Submit"
|
|
69
|
-
request = Merb::Request.new(@in)
|
|
70
|
-
request.params[:title].should == "hello there"
|
|
71
|
-
request.params[:body].should == "some text"
|
|
72
|
-
request.params[:commit].should == "Submit"
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
it "shouldn't explode on key only query" do
|
|
76
|
-
@in['QUERY_STRING'] = "pop"
|
|
77
|
-
request = Merb::Request.new(@in)
|
|
78
|
-
request.params.has_key?(:pop).should be_true
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it "shouldn't explode on value only query" do
|
|
82
|
-
@in['QUERY_STRING'] = "=bang"
|
|
83
|
-
request = Merb::Request.new(@in)
|
|
84
|
-
request.params.has_value?('bang').should be_true
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
it "should handle file upload for multipart/form-data posts" do
|
|
88
|
-
m = Merb::Test::Multipart::Post.new :file => File.open(FIXTURES / 'sample.txt')
|
|
89
|
-
body, head = m.to_multipart
|
|
90
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
91
|
-
@in['CONTENT_TYPE'] = head
|
|
92
|
-
@in['CONTENT_LENGTH'] = body.length
|
|
93
|
-
@in.post_body = body
|
|
94
|
-
request = Merb::Request.new(@in)
|
|
95
|
-
request.params[:file].should_not be_nil
|
|
96
|
-
request.params[:file][:tempfile].class.should == Tempfile
|
|
97
|
-
request.params[:file][:content_type].should == 'text/plain'
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# it "multipart/form-data handles multiple form fields" do
|
|
101
|
-
# m = Merb::Test::Multipart::Post.new :foo => 'bario', 'files[]' => File.open(FIXTURES / 'sample.txt')
|
|
102
|
-
# m.push_params 'files[]' => File.open(FIXTURES / 'foo.rb')
|
|
103
|
-
# body, head = m.to_multipart
|
|
104
|
-
# @in['REQUEST_METHOD'] = 'POST'
|
|
105
|
-
# @in['CONTENT_TYPE'] = head
|
|
106
|
-
# @in['CONTENT_LENGTH'] = body.length
|
|
107
|
-
# @in.post_body = body
|
|
108
|
-
# request = Merb::Request.new(@in)
|
|
109
|
-
# params[:foo].should == 'bario'
|
|
110
|
-
# params[:files].should_not be_nil
|
|
111
|
-
# params[:files].should be_kind_of(Array)
|
|
112
|
-
# params[:files].first[:tempfile].class.should == Tempfile
|
|
113
|
-
# end
|
|
114
|
-
|
|
115
|
-
it "Json Post Body is parsed into params" do
|
|
116
|
-
@in.post_body = "{\"title\":\"hello there\",\"body\":\"some text\"}"
|
|
117
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
118
|
-
@in['CONTENT_TYPE'] = "text/x-json"
|
|
119
|
-
request = Merb::Request.new(@in)
|
|
120
|
-
request.params[:title].should == "hello there"
|
|
121
|
-
request.params[:body].should == "some text"
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it "Json Post Body is not parsed into params if Merb::Request::parse_json_params = false" do
|
|
125
|
-
Merb::Request::parse_json_params = false
|
|
126
|
-
@in.post_body = "{\"title\":\"hello there\",\"body\":\"some text\"}"
|
|
127
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
128
|
-
@in['CONTENT_TYPE'] = "text/x-json"
|
|
129
|
-
request = Merb::Request.new(@in)
|
|
130
|
-
request.params[:title].should be_nil
|
|
131
|
-
request.params[:body].should be_nil
|
|
132
|
-
Merb::Request::parse_json_params = true
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
it "should parse a JSON body into params when charset provided" do
|
|
136
|
-
@in.post_body = "{\"title\":\"hello there\",\"body\":\"some text\"}"
|
|
137
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
138
|
-
@in['CONTENT_TYPE'] = "text/x-json; charset=utf-8"
|
|
139
|
-
request = Merb::Request.new(@in)
|
|
140
|
-
request.params[:title].should == "hello there"
|
|
141
|
-
request.params[:body].should == "some text"
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
it "should parse an XML body into params when charset provided" do
|
|
145
|
-
@in.post_body = "<root><title>hello there</title><body>some text</body></root>"
|
|
146
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
147
|
-
@in['CONTENT_TYPE'] = "text/xml; charset=utf-8"
|
|
148
|
-
request = Merb::Request.new(@in)
|
|
149
|
-
request.params[:root][:title].should == "hello there"
|
|
150
|
-
request.params[:root][:body].should == "some text"
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
it "should handle hash-style form fields in multipart/form-data" do
|
|
154
|
-
m = Merb::Test::Multipart::Post.new :foo => 'bario',
|
|
155
|
-
'files[foo][file]' => File.open(FIXTURES / 'foo.rb'),
|
|
156
|
-
'files[foo][name]' => "Foo",
|
|
157
|
-
'files[bar][file]' => File.open(FIXTURES / 'foo.rb'),
|
|
158
|
-
'files[bar][name]' => "Bar",
|
|
159
|
-
'deep[files][foobar][]' => File.open(FIXTURES / 'foo.rb'),
|
|
160
|
-
'regular_fields[user][name]' => "John Doe",
|
|
161
|
-
'regular_fields[user][email]' => "jdoe@example.com"
|
|
162
|
-
body, head = m.to_multipart
|
|
163
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
164
|
-
@in['CONTENT_TYPE'] = head
|
|
165
|
-
@in['CONTENT_LENGTH'] = body.length
|
|
166
|
-
@in.post_body = body
|
|
167
|
-
request = Merb::Request.new(@in)
|
|
168
|
-
|
|
169
|
-
request.params.should_not include(:"files[foo]")
|
|
170
|
-
request.params.should_not include(:"files[bar]")
|
|
171
|
-
request.params.should_not include(:"regular_fields[user]")
|
|
172
|
-
request.params.should_not include(:"deep[files]")
|
|
173
|
-
|
|
174
|
-
request.params[:files][:foo][:name].should == "Foo"
|
|
175
|
-
request.params[:files][:foo][:file].should include(:filename)
|
|
176
|
-
request.params[:files][:foo][:file][:tempfile].class.should == Tempfile
|
|
177
|
-
request.params[:files][:bar][:name].should == "Bar"
|
|
178
|
-
request.params[:files][:bar][:file].should include(:filename)
|
|
179
|
-
request.params[:files][:bar][:file][:tempfile].class.should == Tempfile
|
|
180
|
-
|
|
181
|
-
request.params[:deep][:files][:foobar].class.should == Array
|
|
182
|
-
request.params[:deep][:files][:foobar].size.should == 1
|
|
183
|
-
|
|
184
|
-
request.params[:regular_fields][:user][:name].should == "John Doe"
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
it "should understand PUT if passed as _method in query string for RESTful form dispatch" do
|
|
188
|
-
@in.post_body = "title=hello"
|
|
189
|
-
@in['QUERY_STRING'] = '_method=put'
|
|
190
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
191
|
-
@in['CONTENT_TYPE'] = "application/x-www-form-urlencoded"
|
|
192
|
-
request = Merb::Request.new(@in)
|
|
193
|
-
request.method.should == :put
|
|
194
|
-
request.params[:title].should == "hello"
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
it "should understand DELETE if passed as _method in query string for RESTful form dispatch" do
|
|
198
|
-
@in.post_body = "title=hello"
|
|
199
|
-
@in['QUERY_STRING'] = '_method=delete'
|
|
200
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
201
|
-
@in['CONTENT_TYPE'] = "application/x-www-form-urlencoded"
|
|
202
|
-
request = Merb::Request.new(@in)
|
|
203
|
-
request.method.should == :delete
|
|
204
|
-
request.params[:title].should == "hello"
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
it "should understand PUT if passed as _method in request body for RESTful form dispatch" do
|
|
208
|
-
@in.post_body = "_method=put&title=hello"
|
|
209
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
210
|
-
@in['CONTENT_TYPE'] = "application/x-www-form-urlencoded"
|
|
211
|
-
request = Merb::Request.new(@in)
|
|
212
|
-
request.method.should == :put
|
|
213
|
-
request.params[:title].should == "hello"
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
it "should understand DELETE if passed as _method in request body for RESTful form dispatch" do
|
|
217
|
-
@in.post_body = "_method=delete&title=hello"
|
|
218
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
219
|
-
@in['CONTENT_TYPE'] = "application/x-www-form-urlencoded"
|
|
220
|
-
request = Merb::Request.new(@in)
|
|
221
|
-
request.env['REQUEST_METHOD'].should == 'POST'
|
|
222
|
-
request.method.should == :delete
|
|
223
|
-
request.params[:title].should == "hello"
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
it "should not raise a NotFound exception when the controller class exists" do
|
|
227
|
-
@in['REQUEST_URI'] = "/good_posts/show/1"
|
|
228
|
-
@in['REQUEST_METHOD'] = 'GET'
|
|
229
|
-
@in['CONTENT_TYPE'] = "application/x-www-form-urlencoded"
|
|
230
|
-
request = Merb::Request.new(@in)
|
|
231
|
-
request.stubs(:controller_name).returns("good_posts")
|
|
232
|
-
lambda { request.controller_class }.should_not raise_error(Merb::ControllerExceptions::NotFound)
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
it "should raise a NotFound exception when the controller does not exist" do
|
|
236
|
-
@in['REQUEST_URI'] = "/bad_posts/show/1"
|
|
237
|
-
@in['REQUEST_METHOD'] = 'GET'
|
|
238
|
-
@in['CONTENT_TYPE'] = "application/x-www-form-urlencoded"
|
|
239
|
-
request = Merb::Request.new(@in)
|
|
240
|
-
request.stubs(:controller_name).returns("bad_posts")
|
|
241
|
-
lambda { request.controller_class }.should raise_error(Merb::ControllerExceptions::NotFound)
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
it "should set accept to '*/*' when HTTP_ACCEPT is blank" do
|
|
245
|
-
@in['HTTP_ACCEPT'] = ""
|
|
246
|
-
request = Merb::Request.new(@in)
|
|
247
|
-
request.accept.should == "*/*"
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
it "should set accept to '*/*' when HTTP_ACCEPT is empty" do
|
|
251
|
-
@in['HTTP_ACCEPT'] = nil
|
|
252
|
-
request = Merb::Request.new(@in)
|
|
253
|
-
request.accept.should == "*/*"
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
it "should set accept to '*/*' when HTTP_ACCEPT is not set" do
|
|
257
|
-
@in.env.delete('HTTP_ACCEPT')
|
|
258
|
-
request = Merb::Request.new(@in)
|
|
259
|
-
request.accept.should == "*/*"
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
it "should be able to tell you the HTTP method for POST requests without an error" do
|
|
263
|
-
@in['REQUEST_METHOD'] = 'POST'
|
|
264
|
-
request = Merb::Request.new(@in)
|
|
265
|
-
lambda {request.method}.should_not raise_error
|
|
266
|
-
request.method.should == :post
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
it "should be able to tell you the HTTP method for GET requests without an error" do
|
|
270
|
-
@in['REQUEST_METHOD'] = 'GET'
|
|
271
|
-
request = Merb::Request.new(@in)
|
|
272
|
-
lambda {request.method}.should_not raise_error
|
|
273
|
-
request.method.should == :get
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
it "multipart_params should return an empty hash if the request is not multipart" do
|
|
278
|
-
request = Merb::Request.new(@in)
|
|
279
|
-
request.send(:multipart_params).should == {}
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
it "should add namespace to controller name" do
|
|
283
|
-
request = Merb::Request.new(@in)
|
|
284
|
-
request.stubs(:route_params).returns({:controller => 'bar', :namespace => 'foo'})
|
|
285
|
-
request.controller_name.should == "foo/bar"
|
|
286
|
-
end
|
|
287
|
-
end
|
data/spec/merb/responder_spec.rb
DELETED
|
@@ -1,562 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
|
-
|
|
3
|
-
module ResponderSpecModule
|
|
4
|
-
def new_mime(entry,index)
|
|
5
|
-
Merb::ResponderMixin::Rest::AcceptType.new(entry,index)
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
describe "The Merb Module" do
|
|
10
|
-
|
|
11
|
-
after do
|
|
12
|
-
Merb.reset_default_mime_types!
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
it "should respond to add_mime_type" do
|
|
16
|
-
Merb.should respond_to(:add_mime_type)
|
|
17
|
-
end
|
|
18
|
-
it "should respond to remove_mime_type" do
|
|
19
|
-
Merb.should respond_to(:remove_mime_type)
|
|
20
|
-
end
|
|
21
|
-
it "should respond to available_mime_types" do
|
|
22
|
-
Merb.should respond_to(:available_mime_types)
|
|
23
|
-
end
|
|
24
|
-
it "should respond to outgoing_headers" do
|
|
25
|
-
Merb.should respond_to(:response_headers)
|
|
26
|
-
end
|
|
27
|
-
it "should respond to add_outgoing_headers!" do
|
|
28
|
-
Merb.should respond_to(:add_response_headers!)
|
|
29
|
-
end
|
|
30
|
-
it "should respond to remove_outgoing_headers!" do
|
|
31
|
-
Merb.should respond_to(:remove_response_headers!)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "should give access to the available_mime_types" do
|
|
35
|
-
Merb.available_mime_types.should equal(Merb::ResponderMixin::Rest::TYPES)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "should add a mime type to the TYPES array" do
|
|
39
|
-
Merb::ResponderMixin::Rest::TYPES.has_key?(:png).should be_false
|
|
40
|
-
Merb.add_mime_type(:png, :to_png, %w[image/png])
|
|
41
|
-
Merb::ResponderMixin::Rest::TYPES.has_key?(:png).should be_true
|
|
42
|
-
end
|
|
43
|
-
it "should only accept Symbols for add_mime_type's key argument" do
|
|
44
|
-
lambda{
|
|
45
|
-
Merb.add_mime_type('silly string', %w[string/silly])
|
|
46
|
-
}.should raise_error(ArgumentError)
|
|
47
|
-
end
|
|
48
|
-
it "should only accept an Array for add_mime_type's values argument" do
|
|
49
|
-
lambda{Merb.add_mime_type(:key, :to_key, 'Congos')}.should raise_error(ArgumentError)
|
|
50
|
-
end
|
|
51
|
-
it "should remove a mime type from the TYPES array" do
|
|
52
|
-
Merb.add_mime_type(:png, :to_png, %w[image/png])
|
|
53
|
-
Merb::ResponderMixin::Rest::TYPES.has_key?(:png).should be_true
|
|
54
|
-
Merb.remove_mime_type(:png)
|
|
55
|
-
Merb::ResponderMixin::Rest::TYPES.has_key?(:png).should be_false
|
|
56
|
-
end
|
|
57
|
-
it "should not allow removal of the special :all mime-type" do
|
|
58
|
-
Merb.remove_mime_type(:all).should be_false
|
|
59
|
-
Merb::ResponderMixin::Rest::TYPES.has_key?(:all).should be_true
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "should add a mime type with outgoing headers defined" do
|
|
63
|
-
Merb.available_mime_types.should_not have_key(:pdf)
|
|
64
|
-
Merb.response_headers.should_not have_key?(:pdf)
|
|
65
|
-
Merb.mime_transform_method(:pdf).should be_nil
|
|
66
|
-
Merb.add_mime_type(:pdf, :to_pdf, %w[application/pdf],{"Content-Encoding" => "gzip"})
|
|
67
|
-
Merb.available_mime_types.should have_key(:pdf)
|
|
68
|
-
Merb.available_mime_types[:pdf].should == %w[application/pdf]
|
|
69
|
-
Merb.response_headers.should have_key(:pdf)
|
|
70
|
-
Merb.response_headers[:pdf].should == { "Content-Encoding" => "gzip" }
|
|
71
|
-
Merb.mime_transform_method(:pdf).should == :to_pdf
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it "should add an outgoing header for an existing mime type" do
|
|
75
|
-
Merb.response_headers[:html].should be_empty
|
|
76
|
-
Merb.add_response_headers!(:html,{:header => "content"})
|
|
77
|
-
Merb.response_headers[:html].should == {:header => "content"}
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "should set the transform for the default html to nil" do
|
|
81
|
-
Merb.available_mime_types.should have_key(:html)
|
|
82
|
-
Merb.mime_transform_method(:html).should be_nil
|
|
83
|
-
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
it "should set xml to default to :Encoding => 'UTF-8'" do
|
|
87
|
-
Merb.response_headers[:xml].should == {:Encoding => "UTF-8"}
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
it "should set the xml transform method to :to_xml" do
|
|
91
|
-
Merb.mime_transform_method(:xml).should == :to_xml
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
it "should set the :js transform method to :to_json" do
|
|
95
|
-
Merb.mime_transform_method(:js).should == :to_json
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
it "should replace any and all existing headers on an existing mime type" do
|
|
99
|
-
header = {:header => "content"}
|
|
100
|
-
Merb.response_headers[:xml].should_not be_empty
|
|
101
|
-
Merb.response_headers[:xml].should_not == header
|
|
102
|
-
Merb.add_response_headers!(:xml, header)
|
|
103
|
-
Merb.response_headers[:xml].should == header
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
it "the specs should not alter the outgoing headers between specs" do
|
|
107
|
-
Merb.response_headers[:xml].should == {:Encoding => "UTF-8"}
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
it "should remove all existing headers for a given mime type" do
|
|
111
|
-
Merb.response_headers[:xml].should_not be_empty
|
|
112
|
-
Merb.remove_response_headers!(:xml)
|
|
113
|
-
Merb.response_headers[:xml].should be_empty
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
describe "A Merb Responder's AcceptType" do
|
|
118
|
-
include ResponderSpecModule
|
|
119
|
-
|
|
120
|
-
before :each do
|
|
121
|
-
@app_xhtml = new_mime('application/xhtml+xml',1)
|
|
122
|
-
@text_html = new_mime('text/html',5)
|
|
123
|
-
@app_html = new_mime('application/html;q=0.9',9)
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
it "should initialize properly from mime description and index" do
|
|
127
|
-
acc_entry = new_mime(' application/html ; q=0.9 ',1)
|
|
128
|
-
acc_entry.media_range.should == 'application/html'
|
|
129
|
-
acc_entry.quality.should == 90
|
|
130
|
-
acc_entry.index.should == 1
|
|
131
|
-
acc_entry.synonyms.should ==
|
|
132
|
-
%w[text/html application/xhtml+xml application/html]
|
|
133
|
-
acc_entry.super_range.should == 'text/html'
|
|
134
|
-
acc_entry.to_s.should == acc_entry.media_range
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
it "should assign lowest quality to */* unless otherwise specified" do
|
|
138
|
-
new_mime('*/*',1).quality.should == 0
|
|
139
|
-
new_mime('*/*;q=1.0',1).quality.should == 100
|
|
140
|
-
new_mime('*/*;q=0.2',1).quality.should == 20
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
it "should be equal to another AcceptType in the same synonym group" do
|
|
144
|
-
@text_html.should == @app_html
|
|
145
|
-
@text_html.should eql(@app_html)
|
|
146
|
-
@text_html.hash.should == @app_html.hash
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
it "should share a super range with an AcceptType in the same synonym group" do
|
|
150
|
-
@text_html.synonyms.should == @app_html.synonyms
|
|
151
|
-
@text_html.super_range.should == @app_html.super_range
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
it "should parse type and subtype" do
|
|
155
|
-
@app_xhtml.type.should == 'application'
|
|
156
|
-
@app_xhtml.sub_type.should == 'xhtml+xml'
|
|
157
|
-
@text_html.type.should == 'text'
|
|
158
|
-
@text_html.sub_type.should == 'html'
|
|
159
|
-
@app_html.type.should == 'application'
|
|
160
|
-
@app_html.sub_type.should == 'html'
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
describe "A Merb Responder's parsing of an Accept header" do
|
|
166
|
-
|
|
167
|
-
setup do
|
|
168
|
-
@acc_hdr = "text/xml,application/xml,application/xhtml+xml," \
|
|
169
|
-
"text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
it "should parse accept header string to Array of AcceptType instances" do
|
|
173
|
-
acc_hdr = Merb::ResponderMixin::Rest::Responder.parse(@acc_hdr)
|
|
174
|
-
acc_hdr.should be_kind_of(Array)
|
|
175
|
-
acc_hdr.all?{|e| e.kind_of?(Merb::ResponderMixin::Rest::AcceptType) }.should be_true
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
it "should parse single entry accept headers" do
|
|
179
|
-
acc_hdr = Merb::ResponderMixin::Rest::Responder.parse('application/xml')
|
|
180
|
-
acc_hdr.should be_kind_of(Array)
|
|
181
|
-
acc_hdr.all?{|e| e.kind_of?(Merb::ResponderMixin::Rest::AcceptType) }.should be_true
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
it "should parse accept header into proper number of AcceptType instances" do
|
|
185
|
-
acc_hdr = 'foo/bar,baz/quuz,chimi/changa,cobra/khai'
|
|
186
|
-
acc_hdr = Merb::ResponderMixin::Rest::Responder.parse(acc_hdr)
|
|
187
|
-
acc_hdr.size.should == 4
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
it "should only return unique AcceptType instances" do
|
|
191
|
-
acc_hdr = 'text/html,application/xhtml+xml,application/html,text/xml,' \
|
|
192
|
-
'application/xml,application/x-xml'
|
|
193
|
-
acc_hdr = Merb::ResponderMixin::Rest::Responder.parse(acc_hdr)
|
|
194
|
-
acc_hdr.size.should == 2
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
it "should sort AcceptType instances by quality" do
|
|
198
|
-
acc_hdr = 'foo/bar;q=0.1,donny/darko;q=0.9,tango/cash,water/melon;q=0.5'
|
|
199
|
-
acc_hdr = Merb::ResponderMixin::Rest::Responder.parse(acc_hdr)
|
|
200
|
-
acc_hdr.map!{|hdr| hdr.super_range }.should ==
|
|
201
|
-
%w[tango/cash donny/darko water/melon foo/bar]
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
it "should sort AcceptType instances by order" do
|
|
205
|
-
acc_hdr = 'foo/bar,baz/quuz,chimi/changa,cobra/khai'
|
|
206
|
-
acc_hdr = Merb::ResponderMixin::Rest::Responder.parse(acc_hdr)
|
|
207
|
-
acc_hdr.map!{|hdr| hdr.super_range }.should ==
|
|
208
|
-
%w[foo/bar baz/quuz chimi/changa cobra/khai]
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
it "should prefer alternate xml forms (foo+xml) over application/xml" do
|
|
212
|
-
acc_hdr = Merb::ResponderMixin::Rest::Responder.parse(@acc_hdr)
|
|
213
|
-
acc_hdr.first.super_range.should == 'text/html'
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
it "should sort AcceptType instances by quality and order" do
|
|
217
|
-
acc_hdr = Merb::ResponderMixin::Rest::Responder.parse(@acc_hdr)
|
|
218
|
-
acc_hdr.map!{|hdr| hdr.super_range }.should ==
|
|
219
|
-
%w[text/html application/xml image/png text/plain */*]
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
class ResponderSpecController < Merb::Controller
|
|
226
|
-
def index
|
|
227
|
-
only_provides :html, :xml, :yaml
|
|
228
|
-
content_type.to_s
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
def create
|
|
232
|
-
only_provides :xml
|
|
233
|
-
render :nothing => 201
|
|
234
|
-
end
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
class CrazyResponderSpecController < Merb::Controller
|
|
238
|
-
def index
|
|
239
|
-
only_provides :donkey
|
|
240
|
-
content_type
|
|
241
|
-
"donkey"
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
Merb::BootLoader.load_action_arguments
|
|
246
|
-
Merb::BootLoader.load_controller_template_path_cache
|
|
247
|
-
Merb::BootLoader.load_inline_helpers
|
|
248
|
-
|
|
249
|
-
describe "A Merb Responder's Content Negotiation" do
|
|
250
|
-
|
|
251
|
-
it "should set Content-Type by :format for supported type: xml" do
|
|
252
|
-
c = new_responder_spec_controller(:format => 'xml')
|
|
253
|
-
c.dispatch(:index)
|
|
254
|
-
c.status.should == 200
|
|
255
|
-
c.headers['Content-Type'].should == 'application/xml'
|
|
256
|
-
end
|
|
257
|
-
|
|
258
|
-
it "should set Content-Type by :format for supported type: yaml" do
|
|
259
|
-
c = new_responder_spec_controller(:format => 'yaml')
|
|
260
|
-
c.dispatch(:index)
|
|
261
|
-
c.status.should == 200
|
|
262
|
-
c.headers['Content-Type'].should == 'application/x-yaml'
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
it "should set Content-Type by :format for supported type: html" do
|
|
266
|
-
c = new_responder_spec_controller(:format => 'html')
|
|
267
|
-
c.dispatch(:index)
|
|
268
|
-
c.status.should == 200
|
|
269
|
-
c.headers['Content-Type'].should == 'text/html'
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
it "should set Content-Type by accept header for supported type: xml" do
|
|
273
|
-
c = new_responder_spec_controller(:http_accept => 'text/xml')
|
|
274
|
-
c.dispatch(:index)
|
|
275
|
-
c.status.should == 200
|
|
276
|
-
c.headers['Content-Type'].should == 'application/xml'
|
|
277
|
-
end
|
|
278
|
-
|
|
279
|
-
it "should set Content-Type by accept header for supported type: yaml" do
|
|
280
|
-
c = new_responder_spec_controller(:http_accept => 'text/yaml')
|
|
281
|
-
c.dispatch(:index)
|
|
282
|
-
c.status.should == 200
|
|
283
|
-
c.headers['Content-Type'].should == 'application/x-yaml'
|
|
284
|
-
end
|
|
285
|
-
|
|
286
|
-
it "should set Content-Type by accept header for supported type: html" do
|
|
287
|
-
c = new_responder_spec_controller(:http_accept => 'text/html')
|
|
288
|
-
c.dispatch(:index)
|
|
289
|
-
c.status.should == 200
|
|
290
|
-
c.headers['Content-Type'].should == 'text/html'
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
it "should set Content-Type by :format in preference to accept headers when both are of a supported response type" do
|
|
294
|
-
c = new_responder_spec_controller(:http_accept => 'text/plain', :format => 'yaml')
|
|
295
|
-
c.dispatch(:index)
|
|
296
|
-
c.status.should == 200
|
|
297
|
-
c.headers['Content-Type'].should == 'application/x-yaml'
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
it "should set status 406 when format is of an unsupported response type" do
|
|
301
|
-
c = new_responder_spec_controller(:format => 'fromage')
|
|
302
|
-
lambda{c.dispatch(:index)}.should raise_error(Merb::ControllerExceptions::NotAcceptable)
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
it "should set status 406 when no accept header is of a unsupported response type" do
|
|
306
|
-
c = new_responder_spec_controller(:http_accept => 'stale/crackers;q=0.7,camel/milk;q=1.0')
|
|
307
|
-
lambda{c.dispatch(:index)}.should raise_error(Merb::ControllerExceptions::NotAcceptable)
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
it "should raise 406 when negotiated type is not in TYPES" do
|
|
311
|
-
r = Merb::Test::FakeRequest.new
|
|
312
|
-
c = CrazyResponderSpecController.build(r, r.body)
|
|
313
|
-
lambda{c.dispatch(:index)}.should raise_error(Merb::ControllerExceptions::NotAcceptable)
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
it "should call the block for the supported response type yaml" do
|
|
317
|
-
c = new_responder_spec_controller(:http_accept => 'text/yaml')
|
|
318
|
-
c.dispatch(:index)
|
|
319
|
-
c.body.should == "yaml"
|
|
320
|
-
end
|
|
321
|
-
|
|
322
|
-
it "should call the block for the supported response type xml" do
|
|
323
|
-
c = new_responder_spec_controller(:http_accept => 'text/xml')
|
|
324
|
-
c.dispatch(:index)
|
|
325
|
-
c.body.should == "xml"
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
it "should call the block for the supported response type html" do
|
|
329
|
-
c = new_responder_spec_controller(:http_accept => 'text/html')
|
|
330
|
-
c.dispatch(:index)
|
|
331
|
-
c.body.should == "html"
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
it "should utilise format in preference to accept header" do
|
|
335
|
-
c = new_responder_spec_controller(:http_accept => 'text/html', :format => 'xml')
|
|
336
|
-
c.dispatch(:index)
|
|
337
|
-
c.status.should == 200
|
|
338
|
-
c.headers['Content-Type'].should == 'application/xml'
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
it "should respond to the */* catchall accept header" do
|
|
342
|
-
c = new_responder_spec_controller(:http_accept => '*/*')
|
|
343
|
-
c.dispatch(:index)
|
|
344
|
-
c.status.should == 200
|
|
345
|
-
c.headers['Content-Type'].should == 'text/html'
|
|
346
|
-
end
|
|
347
|
-
|
|
348
|
-
it "should honor a return :nothing => status specified in the respond_to block" do
|
|
349
|
-
c = new_responder_spec_controller(:http_accept => 'application/xml')
|
|
350
|
-
c.dispatch(:create)
|
|
351
|
-
c.status.should == 201
|
|
352
|
-
end
|
|
353
|
-
|
|
354
|
-
def new_responder_spec_controller(options={})
|
|
355
|
-
params = {:controller => 'ResponderSpecController', :action => 'index'}
|
|
356
|
-
params.update(:format => options.delete(:format)) if options[:format]
|
|
357
|
-
|
|
358
|
-
@request = Merb::Test::FakeRequest.new(options)
|
|
359
|
-
@request.params.merge!(params)
|
|
360
|
-
ResponderSpecController.build(@request, @request.body)
|
|
361
|
-
end
|
|
362
|
-
end
|
|
363
|
-
|
|
364
|
-
class SimpleResponder
|
|
365
|
-
include Merb::ResponderMixin
|
|
366
|
-
end
|
|
367
|
-
|
|
368
|
-
describe "Merb::ResponderMixin", "negotiating content_type" do
|
|
369
|
-
before(:each) do
|
|
370
|
-
@responder = SimpleResponder.new
|
|
371
|
-
@responder.stub!(:provided_formats).and_return([:html, :xml])
|
|
372
|
-
@responder.stub!(:params).and_return({:format => "html"})
|
|
373
|
-
@request = mock("request")
|
|
374
|
-
@request.stub!(:accept).and_return("text/html")
|
|
375
|
-
@responder.stub!(:request).and_return(@request)
|
|
376
|
-
end
|
|
377
|
-
|
|
378
|
-
it "should have a perform_content_negotiation" do
|
|
379
|
-
@responder.should respond_to(:perform_content_negotiation)
|
|
380
|
-
end
|
|
381
|
-
|
|
382
|
-
it "should use provided_formats when params[:format] is nil" do
|
|
383
|
-
@responder.stub!(:params).and_return({})
|
|
384
|
-
@responder.should_receive(:provided_formats).
|
|
385
|
-
at_least(:once).and_return([:html])
|
|
386
|
-
@responder.perform_content_negotiation
|
|
387
|
-
end
|
|
388
|
-
|
|
389
|
-
it "should use provided_formats when params[:format] is not nil" do
|
|
390
|
-
@responder.should_receive(:provided_formats).
|
|
391
|
-
at_least(:once).and_return([:html])
|
|
392
|
-
@responder.perform_content_negotiation
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
it "should use params[:format] when determining content_type" do
|
|
396
|
-
@responder.should_receive(:params).at_least(:once).
|
|
397
|
-
and_return({:format => "html"})
|
|
398
|
-
@responder.perform_content_negotiation
|
|
399
|
-
end
|
|
400
|
-
|
|
401
|
-
it "should use request.accept when params[:format] is nil" do
|
|
402
|
-
@responder.stub!(:params).and_return({})
|
|
403
|
-
@responder.should_receive(:request).once.and_return(@request)
|
|
404
|
-
@request.should_receive(:accept).once.and_return("text/html")
|
|
405
|
-
@responder.perform_content_negotiation
|
|
406
|
-
end
|
|
407
|
-
|
|
408
|
-
it "should not use request.accept when params[:format] is not nil" do
|
|
409
|
-
@responder.should_receive(:request).exactly(0).times
|
|
410
|
-
@responder.perform_content_negotiation
|
|
411
|
-
end
|
|
412
|
-
|
|
413
|
-
it "should return :html when params[:format] = :html" do
|
|
414
|
-
@responder.perform_content_negotiation.should == :html
|
|
415
|
-
end
|
|
416
|
-
|
|
417
|
-
it "should raise NotAcceptable when params[:format] = :html but :html is not provided" do
|
|
418
|
-
@responder.should_receive(:provided_formats).at_least(:once).
|
|
419
|
-
and_return([:xml])
|
|
420
|
-
lambda {@responder.perform_content_negotiation}.should raise_error(Merb::ControllerExceptions::NotAcceptable)
|
|
421
|
-
end
|
|
422
|
-
|
|
423
|
-
it "should return :xml when it is the first provided and accepts is */*" do
|
|
424
|
-
@responder.stub!(:provided_formats).and_return([:xml, :html])
|
|
425
|
-
@responder.stub!(:params).and_return({})
|
|
426
|
-
@request.should_receive(:accept).once.and_return("*/*")
|
|
427
|
-
@responder.perform_content_negotiation.should == :xml
|
|
428
|
-
end
|
|
429
|
-
|
|
430
|
-
it "should return :xml when it is the first requested" do
|
|
431
|
-
@responder.stub!(:provided_formats).and_return([:html, :xml, :text])
|
|
432
|
-
@responder.stub!(:params).and_return({})
|
|
433
|
-
@request.should_receive(:accept).once.and_return("text/xml, text/html")
|
|
434
|
-
@responder.perform_content_negotiation.should == :xml
|
|
435
|
-
end
|
|
436
|
-
|
|
437
|
-
it "should raise NotAcceptable when accepts and provides do not intersect" do
|
|
438
|
-
@responder.stub!(:provided_formats).and_return([:html, :text])
|
|
439
|
-
@responder.stub!(:params).and_return({})
|
|
440
|
-
@request.should_receive(:accept).once.and_return("text/xml, text/json")
|
|
441
|
-
lambda {@responder.perform_content_negotiation}.should raise_error(Merb::ControllerExceptions::NotAcceptable)
|
|
442
|
-
end
|
|
443
|
-
|
|
444
|
-
it "should short circuit and raise NotAcceptable when provided_formats is empty" do
|
|
445
|
-
@responder.stub!(:provided_formats).and_return([])
|
|
446
|
-
@responder.should_receive(:params).exactly(0).times
|
|
447
|
-
@responder.should_receive(:request).exactly(0).times
|
|
448
|
-
lambda {@responder.perform_content_negotiation}.should raise_error(Merb::ControllerExceptions::NotAcceptable)
|
|
449
|
-
end
|
|
450
|
-
end
|
|
451
|
-
|
|
452
|
-
class DoubleProvides < Merb::Controller
|
|
453
|
-
def double_provides ; provides :xml; @_content_type = :html ; provides :txt ; end
|
|
454
|
-
end
|
|
455
|
-
|
|
456
|
-
describe "Merb::ResponderMixin", "dealing with content_type variable" do
|
|
457
|
-
it "should raise an error if provides is called after content_type has been determined" do
|
|
458
|
-
c = new_controller("double_provides",DoubleProvides)
|
|
459
|
-
lambda { c.double_provides }.should raise_error
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
it "should return false for content_type_set? when @_content_type is nil" do
|
|
463
|
-
c = new_controller("double_provides",DoubleProvides)
|
|
464
|
-
c.should_not be_content_type_set
|
|
465
|
-
end
|
|
466
|
-
|
|
467
|
-
it "should return true for content_type_set? when @_content_type is not nil" do
|
|
468
|
-
c = new_controller("double_provides",DoubleProvides)
|
|
469
|
-
c.instance_variable_set("@_content_type",:html)
|
|
470
|
-
c.should be_content_type_set
|
|
471
|
-
end
|
|
472
|
-
|
|
473
|
-
it "should return @_content_type when content_type is called" do
|
|
474
|
-
c = new_controller("double_provides",DoubleProvides)
|
|
475
|
-
c.instance_variable_set("@_content_type",:html)
|
|
476
|
-
c.content_type.should == :html
|
|
477
|
-
end
|
|
478
|
-
|
|
479
|
-
it "should allow content_type to be set directly" do
|
|
480
|
-
c = new_controller()
|
|
481
|
-
c.content_type=:txt
|
|
482
|
-
c.content_type.should == :txt
|
|
483
|
-
end
|
|
484
|
-
end
|
|
485
|
-
|
|
486
|
-
class FormattedBasic < Merb::Controller ; end
|
|
487
|
-
class WithXml < Merb::Controller ; provides :xml ; end
|
|
488
|
-
class XmlOnly < Merb::Controller ; only_provides :xml ; end
|
|
489
|
-
class ProvidesNothing < Merb::Controller ; does_not_provide :html ; end
|
|
490
|
-
class HtmlAgain < Merb::Controller ; provides :html ; end
|
|
491
|
-
|
|
492
|
-
class ManyProvides < Merb::Controller
|
|
493
|
-
provides :html, :xml, :txt
|
|
494
|
-
def noextra ; end
|
|
495
|
-
def extra ; provides :json, :yaml ; end
|
|
496
|
-
end
|
|
497
|
-
|
|
498
|
-
describe "Responder", "managing provided formats (class)" do
|
|
499
|
-
it "should have the default class_provided_formats of [:html]" do
|
|
500
|
-
c = new_controller("index",FormattedBasic)
|
|
501
|
-
c.class_provided_formats.should == [:html]
|
|
502
|
-
end
|
|
503
|
-
|
|
504
|
-
it "should add :xml to class_provided_formats when called with provides :xml" do
|
|
505
|
-
c = new_controller("index",WithXml)
|
|
506
|
-
c.class_provided_formats.should == [:html, :xml]
|
|
507
|
-
end
|
|
508
|
-
|
|
509
|
-
it "should only have :xml in class_provided_formats when called with only_provides :xml" do
|
|
510
|
-
c = new_controller("index",XmlOnly)
|
|
511
|
-
c.class_provided_formats.should == [:xml]
|
|
512
|
-
end
|
|
513
|
-
|
|
514
|
-
it "should have an empty class_provided_formats when called with does_not_provide :html" do
|
|
515
|
-
c = new_controller("index",ProvidesNothing)
|
|
516
|
-
c.class_provided_formats.should == []
|
|
517
|
-
end
|
|
518
|
-
|
|
519
|
-
it "should only have :html in class_provided_formats when called with provides :html (after other controllers have set it)" do
|
|
520
|
-
c = new_controller("index",HtmlAgain)
|
|
521
|
-
c.class_provided_formats.should == [:html]
|
|
522
|
-
end
|
|
523
|
-
|
|
524
|
-
it "should handle multiple provides added via class method" do
|
|
525
|
-
c = new_controller("noextra",ManyProvides)
|
|
526
|
-
c.provided_formats.should == [:html, :xml, :txt]
|
|
527
|
-
end
|
|
528
|
-
end
|
|
529
|
-
|
|
530
|
-
class ActionProvides < Merb::Controller
|
|
531
|
-
def basic ; end
|
|
532
|
-
def with_xml ; provides :xml ; end
|
|
533
|
-
def xml_only ; only_provides :xml ; end
|
|
534
|
-
def nothing ; does_not_provide :html ; end
|
|
535
|
-
end
|
|
536
|
-
|
|
537
|
-
describe "Responder", "managing provided formats (action)" do
|
|
538
|
-
it "should have the default provided_formats" do
|
|
539
|
-
c = new_controller("basic",ActionProvides)
|
|
540
|
-
c.basic
|
|
541
|
-
c.provided_formats.should == [:html]
|
|
542
|
-
end
|
|
543
|
-
|
|
544
|
-
it "should add :xml to provided_formats when called with provides :xml" do
|
|
545
|
-
c = new_controller("with_xml",ActionProvides)
|
|
546
|
-
c.with_xml
|
|
547
|
-
c.provided_formats.should == [:html, :xml]
|
|
548
|
-
end
|
|
549
|
-
|
|
550
|
-
it "should only have :xml in provided_formats when called with only_provides :xml" do
|
|
551
|
-
c = new_controller("xml_only",ActionProvides)
|
|
552
|
-
c.xml_only
|
|
553
|
-
c.provided_formats.should == [:xml]
|
|
554
|
-
end
|
|
555
|
-
|
|
556
|
-
it "should have an empty provided_formats when called with does_not_provide :html" do
|
|
557
|
-
c = new_controller("nothing",ActionProvides)
|
|
558
|
-
c.nothing
|
|
559
|
-
c.provided_formats.should be_empty
|
|
560
|
-
end
|
|
561
|
-
end
|
|
562
|
-
|