thoughtbot-shoulda 2.10.1 → 2.10.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/CONTRIBUTION_GUIDELINES.rdoc +4 -6
  2. data/README.rdoc +14 -12
  3. data/lib/shoulda.rb +1 -1
  4. data/lib/shoulda/action_controller.rb +0 -2
  5. data/lib/shoulda/action_controller/macros.rb +38 -75
  6. data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +4 -0
  7. data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +1 -1
  8. data/lib/shoulda/action_view/macros.rb +6 -1
  9. data/lib/shoulda/active_record/assertions.rb +4 -4
  10. data/lib/shoulda/active_record/helpers.rb +0 -13
  11. data/lib/shoulda/active_record/macros.rb +50 -127
  12. data/lib/shoulda/active_record/matchers.rb +2 -1
  13. data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +1 -1
  14. data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +5 -5
  15. data/lib/shoulda/active_record/matchers/association_matcher.rb +3 -3
  16. data/lib/shoulda/active_record/matchers/{have_index_matcher.rb → have_db_index_matcher.rb} +15 -8
  17. data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +3 -0
  18. data/lib/shoulda/active_record/matchers/validate_format_of_matcher.rb +67 -0
  19. data/lib/shoulda/active_record/matchers/validation_matcher.rb +1 -0
  20. data/lib/shoulda/assertions.rb +18 -6
  21. data/lib/shoulda/context.rb +99 -1
  22. data/lib/shoulda/macros.rb +83 -23
  23. data/lib/shoulda/private_helpers.rb +1 -8
  24. data/lib/shoulda/test_unit.rb +3 -0
  25. data/test/fail_macros.rb +6 -1
  26. data/test/functional/posts_controller_test.rb +17 -21
  27. data/test/functional/users_controller_test.rb +1 -1
  28. data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +1 -1
  29. data/test/matchers/active_record/allow_value_matcher_test.rb +24 -1
  30. data/test/matchers/active_record/association_matcher_test.rb +8 -3
  31. data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +1 -1
  32. data/test/matchers/active_record/ensure_length_of_matcher_test.rb +1 -1
  33. data/test/matchers/active_record/have_db_column_matcher_test.rb +1 -1
  34. data/test/matchers/active_record/{have_index_matcher_test.rb → have_db_index_matcher_test.rb} +24 -7
  35. data/test/matchers/active_record/have_named_scope_matcher_test.rb +1 -1
  36. data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +1 -1
  37. data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +1 -1
  38. data/test/matchers/active_record/validate_format_of_matcher_test.rb +39 -0
  39. data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +1 -1
  40. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +1 -1
  41. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +1 -1
  42. data/test/matchers/controller/assign_to_matcher_test.rb +1 -1
  43. data/test/matchers/controller/filter_param_matcher_test.rb +1 -1
  44. data/test/matchers/controller/render_with_layout_matcher_test.rb +1 -1
  45. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +12 -7
  46. data/test/matchers/controller/respond_with_matcher_test.rb +1 -1
  47. data/test/matchers/controller/route_matcher_test.rb +1 -1
  48. data/test/matchers/controller/set_session_matcher_test.rb +9 -2
  49. data/test/matchers/controller/set_the_flash_matcher.rb +1 -1
  50. data/test/model_builder.rb +1 -1
  51. data/test/other/autoload_macro_test.rb +1 -1
  52. data/test/other/context_test.rb +45 -1
  53. data/test/other/convert_to_should_syntax_test.rb +3 -3
  54. data/test/other/helpers_test.rb +102 -3
  55. data/test/other/private_helpers_test.rb +6 -8
  56. data/test/other/should_test.rb +8 -3
  57. data/test/rails_root/app/controllers/{application.rb → application_controller.rb} +0 -0
  58. data/test/rails_root/app/controllers/posts_controller.rb +1 -0
  59. data/test/rails_root/app/models/pets/cat.rb +7 -0
  60. data/test/rails_root/app/models/profile.rb +2 -0
  61. data/test/rails_root/app/models/registration.rb +2 -0
  62. data/test/rails_root/app/models/user.rb +3 -0
  63. data/test/rails_root/config/boot.rb +6 -5
  64. data/test/rails_root/config/environment.rb +5 -1
  65. data/test/rails_root/db/migrate/20090506203502_create_profiles.rb +12 -0
  66. data/test/rails_root/db/migrate/20090506203536_create_registrations.rb +14 -0
  67. data/test/rails_root/db/migrate/20090513104502_create_cats.rb +12 -0
  68. data/test/rails_root/test/shoulda_macros/custom_macro.rb +1 -1
  69. data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +1 -1
  70. data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +1 -1
  71. data/test/rspec_test.rb +1 -1
  72. data/test/test_helper.rb +3 -10
  73. data/test/unit/address_test.rb +2 -2
  74. data/test/unit/cat_test.rb +7 -0
  75. data/test/unit/dog_test.rb +2 -3
  76. data/test/unit/flea_test.rb +1 -1
  77. data/test/unit/post_test.rb +2 -2
  78. data/test/unit/product_test.rb +2 -6
  79. data/test/unit/tag_test.rb +2 -2
  80. data/test/unit/tagging_test.rb +1 -1
  81. data/test/unit/user_test.rb +18 -8
  82. metadata +16 -10
  83. data/lib/shoulda/action_controller/helpers.rb +0 -47
@@ -7,14 +7,7 @@ module Shoulda # :nodoc:
7
7
  opts = (args.last.is_a?(Hash) ? args.pop : {})
8
8
  wanted.each {|w| ret << opts.delete(w)}
9
9
  raise ArgumentError, "Unsupported options given: #{opts.keys.join(', ')}" unless opts.keys.empty?
10
- return *ret
11
- end
12
-
13
- # Returns the model class constant, as determined by the test class name.
14
- #
15
- # class TestUser; model_class; end => User
16
- def model_class
17
- self.name.gsub(/Test$/, '').constantize
10
+ return wanted.size == 1 ? ret.first : ret
18
11
  end
19
12
  end
20
13
  end
@@ -1,3 +1,5 @@
1
+ require 'test/unit'
2
+
1
3
  require 'shoulda/context'
2
4
  require 'shoulda/proc_extensions'
3
5
  require 'shoulda/assertions'
@@ -9,6 +11,7 @@ require 'shoulda/rails' if defined? RAILS_ROOT
9
11
  module Test # :nodoc: all
10
12
  module Unit
11
13
  class TestCase
14
+ include Shoulda::InstanceMethods
12
15
  extend Shoulda::ClassMethods
13
16
  include Shoulda::Assertions
14
17
  extend Shoulda::Macros
@@ -13,7 +13,12 @@ module Shoulda
13
13
  # end
14
14
  def should_fail(&block)
15
15
  context "should fail when trying to run:" do
16
- Shoulda.expected_exceptions = [Test::Unit::AssertionFailedError]
16
+ if defined?(Test::Unit::AssertionFailedError)
17
+ failures = [Test::Unit::AssertionFailedError]
18
+ elsif defined?(MiniTest::Assertion)
19
+ failures = [MiniTest::Assertion]
20
+ end
21
+ Shoulda.expected_exceptions = failures
17
22
  yield block
18
23
  Shoulda.expected_exceptions = nil
19
24
  end
@@ -4,7 +4,7 @@ require 'posts_controller'
4
4
  # Re-raise errors caught by the controller.
5
5
  class PostsController; def rescue_action(e) raise e end; end
6
6
 
7
- class PostsControllerTest < Test::Unit::TestCase
7
+ class PostsControllerTest < ActionController::TestCase
8
8
  fixtures :all
9
9
 
10
10
  def setup
@@ -43,14 +43,12 @@ class PostsControllerTest < Test::Unit::TestCase
43
43
  get :index, :user_id => users(:first)
44
44
  end
45
45
  should_respond_with :success
46
- should_assign_to :user, :class => User, :equals => 'users(:first)'
46
+ should_assign_to :user, :class => User
47
+ should_render_template :index
47
48
  should_assign_to(:user) { users(:first) }
48
49
  should_fail do
49
50
  should_assign_to :user, :class => Post
50
51
  end
51
- should_fail do
52
- should_assign_to :user, :equals => 'posts(:first)'
53
- end
54
52
  should_fail do
55
53
  should_assign_to(:user) { posts(:first) }
56
54
  end
@@ -69,20 +67,11 @@ class PostsControllerTest < Test::Unit::TestCase
69
67
  should_respond_with_content_type 'application/rss+xml'
70
68
  should_respond_with_content_type :rss
71
69
  should_respond_with_content_type /rss/
72
- context "deprecated" do # to avoid redefining a test
73
- should_return_from_session :special, "'$2 off your next purchase'"
74
- end
75
- should_fail do
76
- should_return_from_session :special, "'not special'"
77
- end
78
70
  should_set_session(:mischief) { nil }
79
- should_return_from_session :malarky, "nil"
80
- should_set_session :special, "'$2 off your next purchase'"
81
- should_set_session :special_user_id, '@user.id'
82
- context "with a block" do
83
- should_set_session(:special_user_id) { @user.id }
84
- end
85
- should_fail do # to avoid redefining a test
71
+ should_set_session(:special) { '$2 off your next purchase' }
72
+ should_set_session(:special_user_id) { @user.id }
73
+ should_set_session(:false_var) { false }
74
+ should_fail do
86
75
  should_set_session(:special_user_id) { 'value' }
87
76
  end
88
77
  should_assign_to :user, :posts
@@ -96,11 +85,17 @@ class PostsControllerTest < Test::Unit::TestCase
96
85
  should_render_with_layout :wide
97
86
  end
98
87
  should_assign_to :false_flag
88
+ should_set_the_flash_to nil
89
+ should_fail do
90
+ should_set_the_flash_to /.*/
91
+ end
99
92
  end
100
93
 
101
94
  context "on GET to #new" do
102
95
  setup { get :new, :user_id => users(:first) }
103
96
  should_render_without_layout
97
+ should_not_set_the_flash
98
+ should_render_a_form
104
99
  end
105
100
 
106
101
  context "on POST to #create" do
@@ -110,14 +105,15 @@ class PostsControllerTest < Test::Unit::TestCase
110
105
  :body => 'blah blah blah' }
111
106
  end
112
107
 
113
- should_redirect_to 'user_post_url(@post.user, @post)'
114
108
  should_redirect_to('the created post') { user_post_url(users(:first),
115
109
  assigns(:post)) }
116
110
  should_fail do
117
- should_redirect_to 'user_posts_url(@post.user)'
111
+ should_redirect_to('elsewhere') { user_posts_url(users(:first)) }
118
112
  end
113
+
114
+ should_set_the_flash_to /success/
119
115
  should_fail do
120
- should_redirect_to('elsewhere') { user_posts_url(users(:first)) }
116
+ should_not_set_the_flash
121
117
  end
122
118
  end
123
119
  end
@@ -4,7 +4,7 @@ require 'users_controller'
4
4
  # Re-raise errors caught by the controller.
5
5
  class UsersController; def rescue_action(e) raise e end; end
6
6
 
7
- class UsersControllerTest < Test::Unit::TestCase
7
+ class UsersControllerTest < ActionController::TestCase
8
8
  fixtures :all
9
9
 
10
10
  def setup
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class AllowMassAssignmentOfMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class AllowMassAssignmentOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "an attribute that is blacklisted from mass-assignment" do
6
6
  setup do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class AllowValueMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class AllowValueMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "an attribute with a format validation" do
6
6
  setup do
@@ -38,4 +38,27 @@ class AllowValueMatcherTest < Test::Unit::TestCase # :nodoc:
38
38
  end
39
39
  end
40
40
 
41
+ context "an attribute with several validations" do
42
+ setup do
43
+ define_model :example, :attr => :string do
44
+ validates_presence_of :attr
45
+ validates_length_of :attr, :within => 1..5
46
+ validates_numericality_of :attr, :greater_than_or_equal_to => 1,
47
+ :less_than_or_equal_to => 50000
48
+ end
49
+ @model = Example.new
50
+ end
51
+
52
+ should "allow a good value" do
53
+ assert_accepts allow_value("12345").for(:attr), @model
54
+ end
55
+
56
+ bad_values = [nil, "", "abc", "0", "50001", "123456"]
57
+ bad_values.each do |value|
58
+ should "not allow a bad value (#{value.inspect})" do
59
+ assert_rejects allow_value(value).for(:attr), @model
60
+ end
61
+ end
62
+ end
63
+
41
64
  end
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class AssociationMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class AssociationMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "belong_to" do
6
6
  setup do
@@ -126,7 +126,9 @@ class AssociationMatcherTest < Test::Unit::TestCase # :nodoc:
126
126
  define_model :parent do
127
127
  has_many :children
128
128
  end
129
- assert_rejects @matcher.through(:conceptions), Parent.new
129
+ assert_rejects @matcher.through(:conceptions),
130
+ Parent.new,
131
+ :message => /does not have any relationship to conceptions/
130
132
  end
131
133
 
132
134
  should "reject an association that has the wrong :through option" do
@@ -137,9 +139,12 @@ class AssociationMatcherTest < Test::Unit::TestCase # :nodoc:
137
139
  end
138
140
  define_model :parent do
139
141
  has_many :conceptions
142
+ has_many :relationships
140
143
  has_many :children, :through => :conceptions
141
144
  end
142
- assert_rejects @matcher.through(:relationships), Parent.new
145
+ assert_rejects @matcher.through(:relationships),
146
+ Parent.new,
147
+ :message => /through relationships, but got it through conceptions/
143
148
  end
144
149
 
145
150
  should "accept an association with a valid :dependent option" do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class EnsureInclusionOfMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class EnsureInclusionOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "an attribute which must be included in a range" do
6
6
  setup do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class EnsureLengthOfMatcher < Test::Unit::TestCase # :nodoc:
3
+ class EnsureLengthOfMatcher < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "an attribute with a non-zero minimum length validation" do
6
6
  setup do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class HaveDbColumnMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class HaveDbColumnMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "have_db_column" do
6
6
  setup do
@@ -1,10 +1,10 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class HaveIndexMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class HaveDbIndexMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
- context "have_index" do
5
+ context "have_db_index" do
6
6
  setup do
7
- @matcher = have_index(:age)
7
+ @matcher = have_db_index(:age)
8
8
  end
9
9
 
10
10
  should "accept an existing index" do
@@ -22,9 +22,9 @@ class HaveIndexMatcherTest < Test::Unit::TestCase # :nodoc:
22
22
  end
23
23
  end
24
24
 
25
- context "have_index with unique option" do
25
+ context "have_db_index with unique option" do
26
26
  setup do
27
- @matcher = have_index(:ssn).unique(true)
27
+ @matcher = have_db_index(:ssn).unique(true)
28
28
  end
29
29
 
30
30
  should "accept an index of correct unique" do
@@ -46,9 +46,9 @@ class HaveIndexMatcherTest < Test::Unit::TestCase # :nodoc:
46
46
  end
47
47
  end
48
48
 
49
- context "have_index on multiple columns" do
49
+ context "have_db_index on multiple columns" do
50
50
  setup do
51
- @matcher = have_index([:geocodable_type, :geocodable_id])
51
+ @matcher = have_db_index([:geocodable_type, :geocodable_id])
52
52
  end
53
53
 
54
54
  should "accept an existing index" do
@@ -70,5 +70,22 @@ class HaveIndexMatcherTest < Test::Unit::TestCase # :nodoc:
70
70
  assert_rejects @matcher, Geocoding.new
71
71
  end
72
72
  end
73
+
74
+ should "join columns with and describing multiple columns" do
75
+ assert_match /on columns user_id and post_id/,
76
+ have_db_index([:user_id, :post_id]).description
77
+ end
78
+
79
+ should "describe a unique index as unique" do
80
+ assert_match /a unique index/, have_db_index(:user_id).unique(true).description
81
+ end
82
+
83
+ should "describe a non-unique index as non-unique" do
84
+ assert_match /a non-unique index/, have_db_index(:user_id).unique(false).description
85
+ end
86
+
87
+ should "not describe an index's uniqueness when it isn't important" do
88
+ assert_no_match /unique/, have_db_index(:user_id).description
89
+ end
73
90
 
74
91
  end
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class HaveNamedScopeMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class HaveNamedScopeMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "an attribute with a named scope" do
6
6
  setup do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class HaveReadonlyAttributesMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class HaveReadonlyAttributesMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "an attribute that cannot be set after being saved" do
6
6
  setup do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class ValidateAcceptanceOfMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class ValidateAcceptanceOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "an attribute which must be accepted" do
6
6
  setup do
@@ -0,0 +1,39 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class ValidateFormatOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
+
5
+
6
+ context "a postal code" do
7
+ setup do
8
+ define_model :example, :attr => :string do
9
+ validates_format_of :attr, :with => /^\d{5}$/
10
+ end
11
+ @model = Example.new
12
+ end
13
+
14
+ should "be valid" do
15
+ assert_accepts validate_format_of(:attr).with('12345'), @model
16
+ end
17
+
18
+ should "not be valid with alpha in zip" do
19
+ assert_rejects validate_format_of(:attr).not_with('1234a'), @model, :message=>"is invalid"
20
+ end
21
+
22
+ should "not be valid with to few digits" do
23
+ assert_rejects validate_format_of(:attr).not_with('1234'), @model, :message=>"is invalid"
24
+ end
25
+
26
+ should "not be valid with to many digits" do
27
+ assert_rejects validate_format_of(:attr).not_with('123456'), @model, :message=>"is invalid"
28
+ end
29
+
30
+ should "raise error if you try to call both with and not_with" do
31
+ assert_raise RuntimeError do
32
+ validate_format_of(:attr).not_with('123456').with('12345')
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+
39
+ end
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class ValidateNumericalityOfMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class ValidateNumericalityOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "a numeric attribute" do
6
6
  setup do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class ValidatePresenceOfMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class ValidatePresenceOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "a required attribute" do
6
6
  setup do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class ValidateUniquenessOfMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class ValidateUniquenessOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
5
5
  context "a unique attribute" do
6
6
  setup do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class AssignToMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class AssignToMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
5
5
  context "a controller that assigns to an instance variable" do
6
6
  setup do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class FilterParamMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class FilterParamMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
5
5
  context "a controller that filters no parameters" do
6
6
  setup do
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class RenderWithLayoutMatcherTest < Test::Unit::TestCase # :nodoc:
3
+ class RenderWithLayoutMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
5
5
  context "a controller that renders with a layout" do
6
6
  setup do
@@ -1,27 +1,32 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
2
 
3
- class RespondWithContentTypeMatcherTest < Test::Unit::TestCase # :nodoc:
4
-
3
+ class RespondWithContentTypeMatcherTest < ActionController::TestCase # :nodoc:
4
+
5
5
  context "a controller responding with content type :xml" do
6
6
  setup do
7
7
  @controller = build_response { render :xml => { :user => "thoughtbot" }.to_xml }
8
8
  end
9
-
9
+
10
10
  should "accept responding with content type :xml" do
11
11
  assert_accepts respond_with_content_type(:xml), @controller
12
12
  end
13
-
13
+
14
14
  should "accept responding with content type 'application/xml'" do
15
15
  assert_accepts respond_with_content_type('application/xml'), @controller
16
16
  end
17
-
17
+
18
18
  should "accept responding with content type /xml/" do
19
19
  assert_accepts respond_with_content_type(/xml/), @controller
20
20
  end
21
-
21
+
22
22
  should "reject responding with another content type" do
23
23
  assert_rejects respond_with_content_type(:json), @controller
24
24
  end
25
25
  end
26
-
26
+
27
+ should "generate the correct test name" do
28
+ assert_equal "respond with content type of application/xml",
29
+ respond_with_content_type(:xml).description
30
+ end
31
+
27
32
  end