merb-core 0.9.2 → 0.9.3

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.
Files changed (104) hide show
  1. data/Rakefile +61 -11
  2. data/bin/merb +5 -1
  3. data/lib/merb-core.rb +202 -25
  4. data/lib/merb-core/autoload.rb +19 -17
  5. data/lib/merb-core/bootloader.rb +84 -71
  6. data/lib/merb-core/config.rb +19 -14
  7. data/lib/merb-core/controller/abstract_controller.rb +16 -17
  8. data/lib/merb-core/controller/exceptions.rb +115 -70
  9. data/lib/merb-core/controller/merb_controller.rb +62 -38
  10. data/lib/merb-core/controller/mime.rb +1 -1
  11. data/lib/merb-core/controller/mixins/authentication.rb +87 -0
  12. data/lib/merb-core/controller/mixins/controller.rb +16 -15
  13. data/lib/merb-core/controller/mixins/render.rb +113 -19
  14. data/lib/merb-core/controller/mixins/responder.rb +8 -2
  15. data/lib/merb-core/controller/template.rb +1 -1
  16. data/lib/merb-core/core_ext.rb +1 -0
  17. data/lib/merb-core/core_ext/class.rb +113 -6
  18. data/lib/merb-core/core_ext/hash.rb +43 -39
  19. data/lib/merb-core/core_ext/kernel.rb +75 -38
  20. data/lib/merb-core/core_ext/mash.rb +4 -4
  21. data/lib/merb-core/core_ext/object.rb +18 -7
  22. data/lib/merb-core/core_ext/set.rb +9 -4
  23. data/lib/merb-core/core_ext/string.rb +29 -9
  24. data/lib/merb-core/core_ext/time.rb +13 -0
  25. data/lib/merb-core/dispatch/cookies.rb +1 -2
  26. data/lib/merb-core/dispatch/dispatcher.rb +18 -10
  27. data/lib/merb-core/dispatch/exceptions.html.erb +1 -1
  28. data/lib/merb-core/dispatch/request.rb +3 -0
  29. data/lib/merb-core/dispatch/router.rb +10 -7
  30. data/lib/merb-core/dispatch/router/behavior.rb +36 -27
  31. data/lib/merb-core/dispatch/router/route.rb +7 -2
  32. data/lib/merb-core/dispatch/session/cookie.rb +4 -4
  33. data/lib/merb-core/dispatch/session/memcached.rb +17 -5
  34. data/lib/merb-core/logger.rb +2 -2
  35. data/lib/merb-core/plugins.rb +16 -4
  36. data/lib/merb-core/rack/adapter/ebb.rb +4 -1
  37. data/lib/merb-core/rack/adapter/evented_mongrel.rb +2 -0
  38. data/lib/merb-core/rack/adapter/fcgi.rb +1 -0
  39. data/lib/merb-core/rack/adapter/mongrel.rb +1 -0
  40. data/lib/merb-core/rack/adapter/runner.rb +1 -0
  41. data/lib/merb-core/rack/adapter/thin.rb +3 -1
  42. data/lib/merb-core/rack/adapter/webrick.rb +1 -0
  43. data/lib/merb-core/rack/application.rb +17 -1
  44. data/lib/merb-core/server.rb +78 -28
  45. data/lib/merb-core/test/helpers/multipart_request_helper.rb +3 -3
  46. data/lib/merb-core/test/helpers/request_helper.rb +81 -27
  47. data/lib/merb-core/test/helpers/view_helper.rb +1 -1
  48. data/lib/merb-core/test/matchers/controller_matchers.rb +55 -5
  49. data/lib/merb-core/test/matchers/route_matchers.rb +8 -17
  50. data/lib/merb-core/test/matchers/view_matchers.rb +53 -11
  51. data/lib/merb-core/test/run_specs.rb +22 -14
  52. data/lib/merb-core/test/tasks/spectasks.rb +54 -33
  53. data/lib/merb-core/vendor/facets/inflect.rb +91 -2
  54. data/lib/merb-core/version.rb +2 -2
  55. data/spec/private/config/config_spec.rb +54 -26
  56. data/spec/private/core_ext/class_spec.rb +22 -0
  57. data/spec/private/core_ext/hash_spec.rb +70 -54
  58. data/spec/private/core_ext/kernel_spec.rb +149 -14
  59. data/spec/private/core_ext/object_spec.rb +92 -10
  60. data/spec/private/core_ext/string_spec.rb +162 -4
  61. data/spec/private/core_ext/time_spec.rb +16 -0
  62. data/spec/private/dispatch/bootloader_spec.rb +24 -0
  63. data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +1 -1
  64. data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +1 -1
  65. data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +1 -1
  66. data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +1 -1
  67. data/spec/private/dispatch/fixture/config/black_hole.rb +12 -0
  68. data/spec/private/dispatch/fixture/log/merb_test.log +138 -0
  69. data/spec/private/plugins/plugin_spec.rb +79 -8
  70. data/spec/private/rack/application_spec.rb +1 -1
  71. data/spec/public/abstract_controller/controllers/filters.rb +26 -0
  72. data/spec/public/abstract_controller/controllers/helpers.rb +2 -2
  73. data/spec/public/abstract_controller/controllers/partial.rb +2 -2
  74. data/spec/public/abstract_controller/controllers/render.rb +16 -4
  75. data/spec/public/abstract_controller/filter_spec.rb +8 -0
  76. data/spec/public/abstract_controller/render_spec.rb +12 -0
  77. data/spec/public/controller/authentication_spec.rb +103 -0
  78. data/spec/public/controller/base_spec.rb +4 -3
  79. data/spec/public/controller/controllers/authentication.rb +47 -0
  80. data/spec/public/controller/controllers/base.rb +1 -0
  81. data/spec/public/controller/controllers/display.rb +30 -0
  82. data/spec/public/controller/controllers/views/layout/custom_arg.html.erb +1 -0
  83. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template_argument/index.html.erb +1 -0
  84. data/spec/public/controller/display_spec.rb +17 -0
  85. data/spec/public/controller/spec_helper.rb +1 -0
  86. data/spec/public/controller/url_spec.rb +25 -7
  87. data/spec/public/core/merb_core_spec.rb +34 -0
  88. data/spec/public/directory_structure/directory/app/controllers/custom.rb +2 -2
  89. data/spec/public/directory_structure/directory/log/merb_test.log +48 -0
  90. data/spec/public/logger/logger_spec.rb +10 -4
  91. data/spec/public/reloading/directory/app/controllers/reload.rb +1 -1
  92. data/spec/public/reloading/directory/log/merb_test.log +13 -0
  93. data/spec/public/reloading/reload_spec.rb +23 -22
  94. data/spec/public/request/request_spec.rb +2 -0
  95. data/spec/public/router/nested_resources_spec.rb +7 -0
  96. data/spec/public/router/resources_spec.rb +46 -1
  97. data/spec/public/router/special_spec.rb +5 -1
  98. data/spec/public/test/controller_matchers_spec.rb +25 -1
  99. data/spec/public/test/controllers/spec_helper_controller.rb +8 -0
  100. data/spec/public/test/request_helper_spec.rb +52 -1
  101. data/spec/public/test/route_matchers_spec.rb +27 -25
  102. data/spec/public/test/view_helper_spec.rb +1 -1
  103. data/spec/public/test/view_matchers_spec.rb +148 -72
  104. metadata +23 -3
@@ -22,9 +22,9 @@ describe Merb::Logger do
22
22
 
23
23
  describe "#new" do
24
24
  it "should call set_log with the arguments it was passed." do
25
- pending("How do we catch an initialize in a spec?")
26
- # Merb::Logger.should_receive(:set_log).with(Merb.log_file).and_return(true)
27
- # Merb::Logger.new(Merb.log_file)
25
+ logger = Merb::Logger.allocate # create an object sans initialization
26
+ logger.should_receive(:set_log).with('a partridge', 'a pear tree', 'a time bomb').and_return(true)
27
+ logger.send(:initialize, 'a partridge', 'a pear tree', 'a time bomb')
28
28
  end
29
29
  end
30
30
 
@@ -102,6 +102,12 @@ describe Merb::Logger do
102
102
  @logger.close
103
103
  end
104
104
 
105
+ it "shouldn't call the close method if the log is a terminal" do
106
+ @logger.log.should_receive(:tty?).and_return(true)
107
+ @logger.log.should_not_receive(:close)
108
+ @logger.close
109
+ end
110
+
105
111
  it "should set the stored log attribute to nil" do
106
112
  @logger.close
107
113
  @logger.log.should eql(nil)
@@ -172,4 +178,4 @@ describe Merb::Logger do
172
178
 
173
179
  end
174
180
 
175
- end
181
+ end
@@ -1,4 +1,4 @@
1
-
1
+
2
2
  class Reloader < Application
3
3
  end
4
4
 
@@ -57,3 +57,16 @@ Mon, 25 Feb 2008 23:13:22 GMT ~ Not Using Sessions
57
57
  ~ Not Using Sessions
58
58
  ~ Not Using Sessions
59
59
  ~ Not Using Sessions
60
+ ~ Not Using Sessions
61
+ ~ Not Using Sessions
62
+ ~ Not Using Sessions
63
+ ~ Not Using Sessions
64
+ ~ Not Using Sessions
65
+ ~ Not Using Sessions
66
+ ~ Not Using Sessions
67
+ ~ Not Using Sessions
68
+ ~ Not Using Sessions
69
+ ~ Not Using Sessions
70
+ ~ Not Using Sessions
71
+ ~ Not Using Sessions
72
+ ~ Not Using Sessions
@@ -1,18 +1,19 @@
1
1
  require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
2
2
  Merb.start :environment => 'test',
3
3
  :merb_root => File.dirname(__FILE__) / "directory"
4
-
4
+
5
5
  describe "The reloader" do
6
+ SLEEP_TIME = 0.5
6
7
 
7
8
  def reload!
8
9
  Merb::BootLoader::ReloadClasses.reload
9
10
  end
10
-
11
+
11
12
  before :all do
12
13
  @reload_file = File.dirname(__FILE__) / "directory" / "app" / "controllers" / "reload.rb"
13
14
  File.open(@reload_file, "w") do |f|
14
15
  @text = <<-END
15
-
16
+
16
17
  class Reloader < Application
17
18
  end
18
19
 
@@ -21,20 +22,20 @@ describe "The reloader" do
21
22
  END
22
23
  f.puts @text
23
24
  end
24
-
25
- sleep 0.6
25
+
26
+ sleep SLEEP_TIME
26
27
  end
27
-
28
+
28
29
  it "should reload files that were changed" do
29
30
  defined?(Hello).should_not be_nil
30
31
  defined?(Reloader).should_not be_nil
31
32
  defined?(Reloader2).should be_nil
32
-
33
- sleep 0.6
34
-
33
+
34
+ sleep SLEEP_TIME
35
+
35
36
  File.open(@reload_file, "w") do |f|
36
37
  f.puts <<-END
37
-
38
+
38
39
  class Reloader < Application
39
40
  end
40
41
 
@@ -43,17 +44,17 @@ describe "The reloader" do
43
44
  END
44
45
  end
45
46
 
46
- sleep 0.6
47
-
47
+ sleep SLEEP_TIME
48
+
48
49
  defined?(Hello).should be_nil
49
50
  defined?(Reloader).should_not be_nil
50
51
  defined?(Reloader2).should_not be_nil
51
52
  end
52
-
53
+
53
54
  it "should remove classes for _abstract_subclasses" do
54
55
  File.open(@reload_file, "w") do |f|
55
56
  f.puts <<-END
56
-
57
+
57
58
  class Reloader < Application
58
59
  end
59
60
 
@@ -61,20 +62,20 @@ describe "The reloader" do
61
62
  end
62
63
  END
63
64
  end
64
-
65
- sleep 0.6
66
-
65
+
66
+ sleep SLEEP_TIME
67
+
67
68
  Merb::AbstractController._abstract_subclasses.should include("Reloader")
68
- Merb::AbstractController._abstract_subclasses.should include("Reloader2")
69
+ Merb::AbstractController._abstract_subclasses.should include("Reloader2")
69
70
  defined?(Hello).should be_nil
70
71
  defined?(Reloader).should_not be_nil
71
- defined?(Reloader2).should_not be_nil
72
+ defined?(Reloader2).should_not be_nil
72
73
  end
73
-
74
+
74
75
  after :each do
75
- sleep 0.6
76
+ sleep SLEEP_TIME
76
77
  File.open(@reload_file, "w") do |f|
77
78
  f.puts @text
78
79
  end
79
80
  end
80
- end
81
+ end
@@ -45,6 +45,8 @@ describe Merb::Request, " query and body params" do
45
45
 
46
46
  {"foo=bar&baz=bat" => {"foo" => "bar", "baz" => "bat"},
47
47
  "foo[]=bar&foo[]=baz" => {"foo" => ["bar", "baz"]},
48
+ "foo[][bar]=1&foo[][bar]=2" => {"foo" => [{"bar" => "1"},{"bar" => "2"}]},
49
+ "foo[bar][][baz]=1&foo[bar][][baz]=2" => {"foo" => {"bar" => [{"baz" => "1"},{"baz" => "2"}]}},
48
50
  "foo[1]=bar&foo[2]=baz" => {"foo" => {"1" => "bar", "2" => "baz"}}}.each do |query, parse|
49
51
 
50
52
  it "should convert #{query.inspect} to #{parse.inspect} in the query string" do
@@ -12,6 +12,9 @@ Merb::Router.prepare do |r|
12
12
  r.resource :foo do |f|
13
13
  f.resources :comments
14
14
  end
15
+ r.resources :domains, :keys => [:domain] do |d|
16
+ d.resources :emails, :keys => [:username]
17
+ end
15
18
  end
16
19
 
17
20
  describe "nested resources routes" do
@@ -31,4 +34,8 @@ describe "nested resources routes" do
31
34
  it "should match a get to /foo/comments to the comments controller and index action" do
32
35
  route_to('/foo/comments', :method => :get).should have_route(:controller => 'comments', :action => 'index', :id => nil)
33
36
  end
37
+
38
+ it "should match a get to /domains/merbivore_com/emails to the emails controller and index action with domain => 'merbivore_com" do
39
+ route_to('/domains/merbivore_com/emails', :method => :get).should have_route(:controller => 'emails', :action => 'index', :username => nil, :domain => 'merbivore_com')
40
+ end
34
41
  end
@@ -54,4 +54,49 @@ describe "resources routes" do
54
54
  it "should match a get to /blogposts/1/delete to the blogposts controller and the delete action with id 1" do
55
55
  route_to('/blogposts/1/delete', :method => :get).should have_route(:controller => 'blogposts', :action => 'delete', :id => "1")
56
56
  end
57
- end
57
+ end
58
+
59
+
60
+ describe "resources routes with named keys" do
61
+ before :each do
62
+ Merb::Router.prepare do |r|
63
+ r.resources :emails, :keys => ["username", "domain"]
64
+ end
65
+ end
66
+
67
+ it "should match a get to /emails/bidule/merbivore_com to the emails controller and the show action with username => 'bidule', domain => 'merbivore_com'" do
68
+ route_to('/emails/bidule/merbivore_com', :method => :get).should have_route(:controller => 'emails', :action => 'show', :username => "bidule", :domain => "merbivore_com")
69
+ end
70
+
71
+ it "should match a put to /emails/bidule/merbivore_com to the emails controller and the update action with username => 'bidule', domain => 'merbivore_com'" do
72
+ route_to('/emails/bidule/merbivore_com', :method => :put).should have_route(:controller => 'emails', :action => 'update', :username => "bidule", :domain => "merbivore_com")
73
+ end
74
+
75
+ it "should match a delete to /emails/bidule/merbivore_com to the emails controller and the destroy action with username => 'bidule', domain => 'merbivore_com'" do
76
+ route_to('/emails/bidule/merbivore_com', :method => :delete).should have_route(:controller => 'emails', :action => 'destroy', :username => "bidule", :domain => "merbivore_com")
77
+ end
78
+
79
+ it "should match a get to /emails/bidule/merbivore_com/edit to the emails controller and the destroy action with username => 'bidule', domain => 'merbivore_com'" do
80
+ route_to('/emails/bidule/merbivore_com/edit', :method => :get).should have_route(:controller => 'emails', :action => 'edit', :username => "bidule", :domain => "merbivore_com")
81
+ end
82
+
83
+ it "should match a get to /emails/bidule/merbivore_com;edit to the emails controller and the destroy action with username => 'bidule', domain => 'merbivore_com'" do
84
+ route_to('/emails/bidule/merbivore_com;edit', :method => :get).should have_route(:controller => 'emails', :action => 'edit', :username => "bidule", :domain => "merbivore_com")
85
+ end
86
+
87
+ it "should not match a put to /emails/bidule/merbivore_com/edit" do
88
+ # not sure which of these is the best way to specify what I mean - so they're both in...
89
+ route_to('/emails/bidule/merbivore_com/edit', :method => :put).should have_nil_route
90
+ route_to('/emails/bidule/merbivore_com/edit', :method => :put).should_not have_route(:controller => 'emails', :action => 'edit', :username => "bidule", :domain => "merbivore_com")
91
+ end
92
+
93
+ it "should not match a put to /emails/bidule/merbivore_com;edit" do
94
+ # not sure which of these is the best way to specify what I mean - so they're both in...
95
+ route_to('/emails/bidule/merbivore_com;edit', :method => :put).should have_nil_route
96
+ route_to('/emails/bidule/merbivore_com;edit', :method => :put).should_not have_route(:controller => 'emails', :action => 'edit', :username => "bidule", :domain => "merbivore_com")
97
+ end
98
+
99
+ it "should match a get to /emails/bidule/merbivore_com/delete to the emails controller and the delete action with username => 'bidule', domain => 'merbivore_com'" do
100
+ route_to('/emails/bidule/merbivore_com/delete', :method => :get).should have_route(:controller => 'emails', :action => 'delete', :username => "bidule", :domain => "merbivore_com")
101
+ end
102
+ end
@@ -24,12 +24,16 @@ describe "Routes that are restricted based on incoming params" do
24
24
 
25
25
  it "should allow you to restrict routes to POST requests" do
26
26
  Merb::Router.prepare do |r|
27
- r.match("/:controller/create/:id").
27
+ r.match("/:controller/create/:id", :method => :post).
28
28
  to(:action => "create")
29
29
  end
30
30
  route_to("/foo/create/12", :method => "post").should have_route(
31
31
  :controller => "foo", :action => "create", :id => "12"
32
32
  )
33
+
34
+ route_to("/foo/create/12", :method => "get").should_not have_route(
35
+ :controller => "foo", :action => "create", :id => "12"
36
+ )
33
37
  end
34
38
 
35
39
  it "should allow you to restrict routes based on protocol" do
@@ -374,5 +374,29 @@ module Merb::Test::Rspec
374
374
  end
375
375
  end
376
376
  end
377
+
378
+ describe Provide do
379
+ class TestController < Merb::Controller
380
+ provides :xml
381
+ end
382
+
383
+ it 'should match for formats a controller class provides' do
384
+ Provide.new( :xml ).matches?( TestController ).should be_true
385
+ end
386
+
387
+ it 'should match for formats a controller instance provides' do
388
+ t = TestController.new( fake_request )
389
+ Provide.new( :xml ).matches?( t ).should be_true
390
+ end
391
+
392
+ it 'should not match for formats a controller class does not provide' do
393
+ Provide.new( :yaml ).matches?( TestController ).should be_false
394
+ end
395
+
396
+ it 'should not match for formats a controller instance does not provide' do
397
+ t = TestController.new( fake_request )
398
+ Provide.new( :yaml ).matches?( t ).should be_false
399
+ end
400
+ end
377
401
  end
378
- end
402
+ end
@@ -27,4 +27,12 @@ class SpecHelperController < Merb::Controller
27
27
  def destroy
28
28
  Merb::Test::ControllerAssertionMock.called(:destroy)
29
29
  end
30
+ end
31
+
32
+ module Namespaced
33
+ class SpecHelperController < Merb::Controller
34
+ def index
35
+ Merb::Test::ControllerAssertionMock.called(:index)
36
+ end
37
+ end
30
38
  end
@@ -26,11 +26,46 @@ describe Merb::Test::RequestHelper do
26
26
  controller.params[:name].should == "Fred"
27
27
  end
28
28
 
29
- it "should not hit the router to match it's route" do
29
+ it "should not hit the router to match its route" do
30
30
  Merb::Router.should_not_receive(:match)
31
31
  dispatch_to(@controller_klass, :index)
32
32
  end
33
33
  end
34
+
35
+ describe "#dispatch_with_basic_authentication_to" do
36
+
37
+ before(:all) do
38
+ @controller_klass = Merb::Test::DispatchController
39
+ end
40
+
41
+ it "should dispatch to the given controller and action" do
42
+ Merb::Test::ControllerAssertionMock.should_receive(:called).with(:index)
43
+
44
+ dispatch_with_basic_authentication_to(@controller_klass, :index, "Fred", "secret")
45
+ end
46
+
47
+ it "should dispatch to the given controller and action with authentication token" do
48
+ Merb::Test::ControllerAssertionMock.should_receive(:called).with(:show)
49
+
50
+ controller = dispatch_with_basic_authentication_to(@controller_klass, :show, "Fred", "secret")
51
+
52
+ controller.request.env["X_HTTP_AUTHORIZATION"].should == "Basic #{Base64.encode64("Fred:secret")}"
53
+ end
54
+
55
+ it "should dispatch to the given controller and action with authentication token and params" do
56
+ Merb::Test::ControllerAssertionMock.should_receive(:called).with(:show)
57
+
58
+ controller = dispatch_with_basic_authentication_to(@controller_klass, :show, "Fred", "secret", :name => "Fred")
59
+
60
+ controller.request.env["X_HTTP_AUTHORIZATION"].should == "Basic #{Base64.encode64("Fred:secret")}"
61
+ controller.params[:name].should == "Fred"
62
+ end
63
+
64
+ it "should not hit the router to match its route" do
65
+ Merb::Router.should_not_receive(:match)
66
+ dispatch_with_basic_authentication_to(@controller_klass, :index, "Fred", "secret")
67
+ end
68
+ end
34
69
 
35
70
  describe "#get" do
36
71
  before(:each) do
@@ -125,6 +160,22 @@ describe Merb::Test::RequestHelper do
125
160
  controller.params[:id].should == "my_id"
126
161
  end
127
162
  end
163
+
164
+ describe "#request" do
165
+ before(:each) do
166
+ Merb::Router.prepare do |r|
167
+ r.namespace :namespaced do |namespaced|
168
+ namespaced.resources :spec_helper_controller
169
+ end
170
+ end
171
+ end
172
+
173
+ it "should get namespaced index action" do
174
+ Merb::Test::ControllerAssertionMock.should_receive(:called).with(:index)
175
+ controller = request("/namespaced/spec_helper_controller")
176
+ controller.class.should == Namespaced::SpecHelperController
177
+ end
178
+ end
128
179
  end
129
180
 
130
181
  module Merb::Test::RequestHelper
@@ -10,7 +10,7 @@ end
10
10
  class IDish
11
11
  attr_accessor :id
12
12
  alias_method :to_param, :id
13
-
13
+
14
14
  def initialize(id)
15
15
  @id = id
16
16
  end
@@ -18,7 +18,7 @@ end
18
18
 
19
19
  describe Merb::Test::Rspec::RouteMatchers do
20
20
  include Merb::Test::RouteHelper
21
-
21
+
22
22
  before(:each) do
23
23
  Merb::Router.prepare do |r|
24
24
  r.match("/", :method => :get).to(:controller => "test_controller", :action => "get").name(:getter)
@@ -26,94 +26,96 @@ describe Merb::Test::Rspec::RouteMatchers do
26
26
  r.match("/:id").to(:controller => "test_controller", :action => "get").name(:with_id)
27
27
  end
28
28
  end
29
-
29
+
30
30
  describe "#route_to" do
31
31
  it "should work with the request_to helper" do
32
32
  request_to("/", :get).should route_to(TestController, :get)
33
33
  request_to("/", :post).should_not route_to(TestController, :get)
34
34
  end
35
-
35
+
36
36
  it "should work with the url helper and ParamMatcher" do
37
37
  idish = IDish.new(rand(1000).to_s)
38
38
  request_to(url(:with_id, idish)).should route_to(TestController, :get).with(idish)
39
39
  end
40
40
  end
41
-
41
+
42
42
  module Merb::Test::Rspec::RouteMatchers
43
-
43
+
44
44
  describe RouteToMatcher do
45
-
45
+
46
46
  it "should work with snake cased controllers" do
47
47
  RouteToMatcher.new(TestController, :get).matches?(:controller => "test_controller", :action => "get").should be_true
48
48
  end
49
-
49
+
50
50
  it "should work with camel cased controllers" do
51
51
  RouteToMatcher.new(TestController, :get).matches?(:controller => "TestController", :action => "get").should be_true
52
52
  end
53
-
53
+
54
54
  it "should work with symbol or string controller name" do
55
55
  RouteToMatcher.new(TestController, :get).matches?(:controller => "test_controller", :action => "get").should be_true
56
56
  RouteToMatcher.new(TestController, :get).matches?(:controller => :test_controller, :action => :get)
57
57
  end
58
-
58
+
59
59
  it "should not pass if the controllers do not match" do
60
60
  RouteToMatcher.new(TestController, :get).matches?(:controller => "other_controller", :action => "get").should be_false
61
61
  end
62
-
62
+
63
63
  it "should not pass if the actions do not match" do
64
64
  RouteToMatcher.new(TestController, :get).matches?(:controller => "test_controller", :action => "post").should be_false
65
65
  end
66
-
66
+
67
67
  it "should not pass if the parameters do not the ParameterMatcher" do
68
68
  route_matcher = RouteToMatcher.new(TestController, :get)
69
69
  route_matcher.with(:id => "123")
70
-
70
+
71
71
  route_matcher.matches?(:controller => "test_case", :action => "get", :id => "456").should be_false
72
72
  end
73
-
73
+
74
74
  describe "#with" do
75
75
  it "should add a ParameterMatcher" do
76
76
  ParameterMatcher.should_receive(:new).with(:id => "123")
77
-
77
+
78
78
  route_matcher = RouteToMatcher.new(TestController, :get)
79
79
  route_matcher.with(:id => "123")
80
80
  end
81
81
  end
82
-
82
+
83
83
  describe "#failure_message" do
84
84
  it "should include the expected controller and action" do
85
- RouteToMatcher.new(TestController, :any_action).failure_message.should include("TestController#any_action")
85
+ matcher = RouteToMatcher.new(TestController, :any_action)
86
+ matcher.matches?(:controller => "target_controller", :action => "target_action")
87
+ matcher.failure_message.should include("TestController#any_action")
86
88
  end
87
-
89
+
88
90
  it "should include the target controller and action in camel case" do
89
91
  matcher = RouteToMatcher.new(TestController, :any_action)
90
92
  matcher.matches?(:controller => "target_controller", :action => "target_action")
91
93
  matcher.failure_message.should include("TargetController#target_action")
92
94
  end
93
95
  end
94
-
96
+
95
97
  describe "#negative_failure_message" do
96
98
  it "should include the expected controller and action" do
97
99
  RouteToMatcher.new(TestController, :any_action).negative_failure_message.should include("TestController#any_action")
98
100
  end
99
101
  end
100
102
  end
101
-
103
+
102
104
  describe ParameterMatcher do
103
105
  it "should work with a Hash as the parameter argument" do
104
106
  ParameterMatcher.new(:param => "abc").matches?(:param => "abc").should be_true
105
107
  end
106
-
108
+
107
109
  it "should work with an object as the parameter argument" do
108
110
  ParameterMatcher.new(IDish.new(1234)).matches?(:id => 1234).should be_true
109
111
  end
110
-
112
+
111
113
  describe "#failure_message" do
112
114
  it "should include the expected parameters hash" do
113
115
  parameter_hash = {:parent_id => "123", :child_id => "abc"}
114
116
  ParameterMatcher.new(parameter_hash).failure_message.should include(parameter_hash.inspect)
115
117
  end
116
-
118
+
117
119
  it "should include the actual parameters hash" do
118
120
  parameter_hash = {:parent_id => "123", :child_id => "abc"}
119
121
  matcher = ParameterMatcher.new(:id => 123)
@@ -121,7 +123,7 @@ describe Merb::Test::Rspec::RouteMatchers do
121
123
  matcher.failure_message.should include(parameter_hash.inspect)
122
124
  end
123
125
  end
124
-
126
+
125
127
  describe "#negative_failure_message" do
126
128
  it "should include the expected parameters hash" do
127
129
  parameter_hash = {:parent_id => "123", :child_id => "abc"}
@@ -130,4 +132,4 @@ describe Merb::Test::Rspec::RouteMatchers do
130
132
  end
131
133
  end
132
134
  end
133
- end
135
+ end