francois-shoulda 2.0.5.4 → 2.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/README.rdoc +60 -10
  2. data/Rakefile +7 -7
  3. data/lib/shoulda.rb +7 -15
  4. data/lib/shoulda/action_controller.rb +28 -0
  5. data/lib/shoulda/action_controller/helpers.rb +47 -0
  6. data/lib/shoulda/action_controller/macros.rb +277 -0
  7. data/lib/shoulda/action_controller/matchers.rb +37 -0
  8. data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +109 -0
  9. data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +57 -0
  10. data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +81 -0
  11. data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +70 -0
  12. data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +81 -0
  13. data/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
  14. data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +87 -0
  15. data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +85 -0
  16. data/lib/shoulda/action_mailer.rb +1 -1
  17. data/lib/shoulda/action_mailer/assertions.rb +32 -33
  18. data/lib/shoulda/action_view.rb +10 -0
  19. data/lib/shoulda/action_view/macros.rb +56 -0
  20. data/lib/shoulda/active_record.rb +6 -2
  21. data/lib/shoulda/active_record/assertions.rb +62 -89
  22. data/lib/shoulda/active_record/helpers.rb +40 -0
  23. data/lib/shoulda/active_record/macros.rb +520 -684
  24. data/lib/shoulda/active_record/matchers.rb +42 -0
  25. data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
  26. data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +102 -0
  27. data/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
  28. data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
  29. data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
  30. data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
  31. data/lib/shoulda/active_record/matchers/have_index_matcher.rb +105 -0
  32. data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +125 -0
  33. data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
  34. data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
  35. data/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
  36. data/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
  37. data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
  38. data/lib/shoulda/active_record/matchers/validation_matcher.rb +56 -0
  39. data/lib/shoulda/assertions.rb +50 -40
  40. data/lib/shoulda/autoload_macros.rb +46 -0
  41. data/lib/shoulda/context.rb +124 -126
  42. data/lib/shoulda/helpers.rb +5 -7
  43. data/lib/shoulda/macros.rb +63 -64
  44. data/lib/shoulda/private_helpers.rb +16 -18
  45. data/lib/shoulda/rails.rb +5 -11
  46. data/lib/shoulda/rspec.rb +11 -0
  47. data/lib/shoulda/tasks/list_tests.rake +6 -1
  48. data/lib/shoulda/test_unit.rb +19 -0
  49. data/rails/init.rb +7 -1
  50. data/test/README +2 -2
  51. data/test/fail_macros.rb +15 -15
  52. data/test/fixtures/tags.yml +1 -1
  53. data/test/functional/posts_controller_test.rb +46 -26
  54. data/test/functional/users_controller_test.rb +0 -19
  55. data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +68 -0
  56. data/test/matchers/active_record/allow_value_matcher_test.rb +41 -0
  57. data/test/matchers/active_record/association_matcher_test.rb +258 -0
  58. data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +80 -0
  59. data/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
  60. data/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
  61. data/test/matchers/active_record/have_index_matcher_test.rb +74 -0
  62. data/test/matchers/active_record/have_named_scope_matcher_test.rb +65 -0
  63. data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
  64. data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
  65. data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
  66. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
  67. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
  68. data/test/matchers/controller/assign_to_matcher_test.rb +35 -0
  69. data/test/matchers/controller/filter_param_matcher_test.rb +32 -0
  70. data/test/matchers/controller/render_with_layout_matcher_test.rb +33 -0
  71. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +27 -0
  72. data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
  73. data/test/matchers/controller/route_matcher_test.rb +58 -0
  74. data/test/matchers/controller/set_session_matcher_test.rb +31 -0
  75. data/test/matchers/controller/set_the_flash_matcher.rb +41 -0
  76. data/test/model_builder.rb +106 -0
  77. data/test/other/autoload_macro_test.rb +18 -0
  78. data/test/other/helpers_test.rb +58 -0
  79. data/test/other/private_helpers_test.rb +1 -1
  80. data/test/other/should_test.rb +16 -16
  81. data/test/rails_root/app/controllers/posts_controller.rb +6 -5
  82. data/test/rails_root/app/models/pets/dog.rb +10 -0
  83. data/test/rails_root/app/models/treat.rb +3 -0
  84. data/test/rails_root/app/models/user.rb +4 -3
  85. data/test/rails_root/app/views/layouts/posts.rhtml +2 -0
  86. data/test/rails_root/config/database.yml +1 -1
  87. data/test/rails_root/config/environment.rb +1 -1
  88. data/test/rails_root/config/environments/{sqlite3.rb → test.rb} +0 -0
  89. data/test/rails_root/db/migrate/001_create_users.rb +3 -2
  90. data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
  91. data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
  92. data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
  93. data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
  94. data/test/rspec_test.rb +207 -0
  95. data/test/test_helper.rb +3 -1
  96. data/test/unit/address_test.rb +1 -23
  97. data/test/unit/dog_test.rb +5 -2
  98. data/test/unit/post_test.rb +7 -3
  99. data/test/unit/product_test.rb +2 -2
  100. data/test/unit/tag_test.rb +2 -1
  101. data/test/unit/user_test.rb +25 -9
  102. metadata +84 -23
  103. data/lib/shoulda/controller.rb +0 -30
  104. data/lib/shoulda/controller/formats/html.rb +0 -201
  105. data/lib/shoulda/controller/formats/xml.rb +0 -170
  106. data/lib/shoulda/controller/helpers.rb +0 -64
  107. data/lib/shoulda/controller/macros.rb +0 -316
  108. data/lib/shoulda/controller/resource_options.rb +0 -236
  109. data/test/rails_root/app/models/dog.rb +0 -5
@@ -0,0 +1,158 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class EnsureLengthOfMatcher < Test::Unit::TestCase # :nodoc:
4
+
5
+ context "an attribute with a non-zero minimum length validation" do
6
+ setup do
7
+ @model = define_model(:example, :attr => :string) do
8
+ validates_length_of :attr, :minimum => 4
9
+ end.new
10
+ end
11
+
12
+ should "accept ensuring the correct minimum length" do
13
+ assert_accepts ensure_length_of(:attr).is_at_least(4), @model
14
+ end
15
+
16
+ should "reject ensuring a lower minimum length with any message" do
17
+ assert_rejects ensure_length_of(:attr).
18
+ is_at_least(3).
19
+ with_short_message(/.*/),
20
+ @model
21
+ end
22
+
23
+ should "reject ensuring a higher minimum length with any message" do
24
+ assert_rejects ensure_length_of(:attr).
25
+ is_at_least(5).
26
+ with_short_message(/.*/),
27
+ @model
28
+ end
29
+
30
+ should "not override the default message with a blank" do
31
+ assert_accepts ensure_length_of(:attr).
32
+ is_at_least(4).
33
+ with_short_message(nil),
34
+ @model
35
+ end
36
+ end
37
+
38
+ context "an attribute with a minimum length validation of 0" do
39
+ setup do
40
+ @model = define_model(:example, :attr => :string) do
41
+ validates_length_of :attr, :minimum => 0
42
+ end.new
43
+ end
44
+
45
+ should "accept ensuring the correct minimum length" do
46
+ assert_accepts ensure_length_of(:attr).is_at_least(0), @model
47
+ end
48
+ end
49
+
50
+ context "an attribute with a maximum length" do
51
+ setup do
52
+ @model = define_model(:example, :attr => :string) do
53
+ validates_length_of :attr, :maximum => 4
54
+ end.new
55
+ end
56
+
57
+ should "accept ensuring the correct maximum length" do
58
+ assert_accepts ensure_length_of(:attr).is_at_most(4), @model
59
+ end
60
+
61
+ should "reject ensuring a lower maximum length with any message" do
62
+ assert_rejects ensure_length_of(:attr).
63
+ is_at_most(3).
64
+ with_long_message(/.*/),
65
+ @model
66
+ end
67
+
68
+ should "reject ensuring a higher maximum length with any message" do
69
+ assert_rejects ensure_length_of(:attr).
70
+ is_at_most(5).
71
+ with_long_message(/.*/),
72
+ @model
73
+ end
74
+
75
+ should "not override the default message with a blank" do
76
+ assert_accepts ensure_length_of(:attr).
77
+ is_at_most(4).
78
+ with_long_message(nil),
79
+ @model
80
+ end
81
+ end
82
+
83
+ context "an attribute with a required exact length" do
84
+ setup do
85
+ @model = define_model(:example, :attr => :string) do
86
+ validates_length_of :attr, :is => 4
87
+ end.new
88
+ end
89
+
90
+ should "accept ensuring the correct length" do
91
+ assert_accepts ensure_length_of(:attr).is_equal_to(4), @model
92
+ end
93
+
94
+ should "reject ensuring a lower maximum length with any message" do
95
+ assert_rejects ensure_length_of(:attr).
96
+ is_equal_to(3).
97
+ with_message(/.*/),
98
+ @model
99
+ end
100
+
101
+ should "reject ensuring a higher maximum length with any message" do
102
+ assert_rejects ensure_length_of(:attr).
103
+ is_equal_to(5).
104
+ with_message(/.*/),
105
+ @model
106
+ end
107
+
108
+ should "not override the default message with a blank" do
109
+ assert_accepts ensure_length_of(:attr).
110
+ is_equal_to(4).
111
+ with_message(nil),
112
+ @model
113
+ end
114
+ end
115
+
116
+ context "an attribute with a custom minimum length validation" do
117
+ setup do
118
+ @model = define_model(:example, :attr => :string) do
119
+ validates_length_of :attr, :minimum => 4, :too_short => 'short'
120
+ end.new
121
+ end
122
+
123
+ should "accept ensuring the correct minimum length" do
124
+ assert_accepts ensure_length_of(:attr).
125
+ is_at_least(4).
126
+ with_short_message(/short/),
127
+ @model
128
+ end
129
+
130
+ end
131
+
132
+ context "an attribute with a custom maximum length validation" do
133
+ setup do
134
+ @model = define_model(:example, :attr => :string) do
135
+ validates_length_of :attr, :maximum => 4, :too_long => 'long'
136
+ end.new
137
+ end
138
+
139
+ should "accept ensuring the correct minimum length" do
140
+ assert_accepts ensure_length_of(:attr).
141
+ is_at_most(4).
142
+ with_long_message(/long/),
143
+ @model
144
+ end
145
+
146
+ end
147
+
148
+ context "an attribute without a length validation" do
149
+ setup do
150
+ @model = define_model(:example, :attr => :string).new
151
+ end
152
+
153
+ should "reject ensuring a minimum length" do
154
+ assert_rejects ensure_length_of(:attr).is_at_least(1), @model
155
+ end
156
+ end
157
+
158
+ end
@@ -0,0 +1,169 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class HaveDbColumnMatcherTest < Test::Unit::TestCase # :nodoc:
4
+
5
+ context "have_db_column" do
6
+ setup do
7
+ @matcher = have_db_column(:nickname)
8
+ end
9
+
10
+ should "accept an existing database column" do
11
+ create_table 'superheros' do |table|
12
+ table.string :nickname
13
+ end
14
+ define_model_class 'Superhero'
15
+ assert_accepts @matcher, Superhero.new
16
+ end
17
+
18
+ should "reject a nonexistent database column" do
19
+ define_model :superhero
20
+ assert_rejects @matcher, Superhero.new
21
+ end
22
+ end
23
+
24
+ context "have_db_column of type string" do
25
+ setup do
26
+ @matcher = have_db_column(:nickname).of_type(:string)
27
+ end
28
+
29
+ should "accept a column of correct type" do
30
+ create_table 'superheros' do |table|
31
+ table.string :nickname
32
+ end
33
+ define_model_class 'Superhero'
34
+ assert_accepts @matcher, Superhero.new
35
+ end
36
+
37
+ should "reject a nonexistent database column" do
38
+ define_model :superhero
39
+ assert_rejects @matcher, Superhero.new
40
+ end
41
+
42
+ should "reject a column of wrong type" do
43
+ create_table 'superheros' do |table|
44
+ table.integer :nickname
45
+ end
46
+ define_model_class 'Superhero'
47
+ assert_rejects @matcher, Superhero.new
48
+ end
49
+ end
50
+
51
+ context "have_db_column with precision option" do
52
+ setup do
53
+ @matcher = have_db_column(:salary).with_options(:precision => 5)
54
+ end
55
+
56
+ should "accept a column of correct precision" do
57
+ create_table 'superheros' do |table|
58
+ table.decimal :salary, :precision => 5
59
+ end
60
+ define_model_class 'Superhero'
61
+ assert_accepts @matcher, Superhero.new
62
+ end
63
+
64
+ should "reject a column of wrong precision" do
65
+ create_table 'superheros' do |table|
66
+ table.decimal :salary, :precision => 15
67
+ end
68
+ define_model_class 'Superhero'
69
+ assert_rejects @matcher, Superhero.new
70
+ end
71
+ end
72
+
73
+ context "have_db_column with limit option" do
74
+ setup do
75
+ @matcher = have_db_column(:email).
76
+ of_type(:string).
77
+ with_options(:limit => 255)
78
+ end
79
+
80
+ should "accept a column of correct limit" do
81
+ create_table 'superheros' do |table|
82
+ table.string :email, :limit => 255
83
+ end
84
+ define_model_class 'Superhero'
85
+ assert_accepts @matcher, Superhero.new
86
+ end
87
+
88
+ should "reject a column of wrong limit" do
89
+ create_table 'superheros' do |table|
90
+ table.string :email, :limit => 500
91
+ end
92
+ define_model_class 'Superhero'
93
+ assert_rejects @matcher, Superhero.new
94
+ end
95
+ end
96
+
97
+ context "have_db_column with default option" do
98
+ setup do
99
+ @matcher = have_db_column(:admin).
100
+ of_type(:boolean).
101
+ with_options(:default => false)
102
+ end
103
+
104
+ should "accept a column of correct default" do
105
+ create_table 'superheros' do |table|
106
+ table.boolean :admin, :default => false
107
+ end
108
+ define_model_class 'Superhero'
109
+ assert_accepts @matcher, Superhero.new
110
+ end
111
+
112
+ should "reject a column of wrong default" do
113
+ create_table 'superheros' do |table|
114
+ table.boolean :admin, :default => true
115
+ end
116
+ define_model_class 'Superhero'
117
+ assert_rejects @matcher, Superhero.new
118
+ end
119
+ end
120
+
121
+ context "have_db_column with null option" do
122
+ setup do
123
+ @matcher = have_db_column(:admin).
124
+ of_type(:boolean).
125
+ with_options(:null => false)
126
+ end
127
+
128
+ should "accept a column of correct null" do
129
+ create_table 'superheros' do |table|
130
+ table.boolean :admin, :null => false
131
+ end
132
+ define_model_class 'Superhero'
133
+ assert_accepts @matcher, Superhero.new
134
+ end
135
+
136
+ should "reject a column of wrong null" do
137
+ create_table 'superheros' do |table|
138
+ table.boolean :admin, :null => true
139
+ end
140
+ define_model_class 'Superhero'
141
+ assert_rejects @matcher, Superhero.new
142
+ end
143
+ end
144
+
145
+ context "have_db_column with scale option" do
146
+ setup do
147
+ @matcher = have_db_column(:salary).
148
+ of_type(:decimal).
149
+ with_options(:scale => 2)
150
+ end
151
+
152
+ should "accept a column of correct scale" do
153
+ create_table 'superheros' do |table|
154
+ table.decimal :salary, :precision => 10, :scale => 2
155
+ end
156
+ define_model_class 'Superhero'
157
+ assert_accepts @matcher, Superhero.new
158
+ end
159
+
160
+ should "reject a column of wrong scale" do
161
+ create_table 'superheros' do |table|
162
+ table.decimal :salary, :precision => 10, :scale => 4
163
+ end
164
+ define_model_class 'Superhero'
165
+ assert_rejects @matcher, Superhero.new
166
+ end
167
+ end
168
+
169
+ end
@@ -0,0 +1,74 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class HaveIndexMatcherTest < Test::Unit::TestCase # :nodoc:
4
+
5
+ context "have_index" do
6
+ setup do
7
+ @matcher = have_index(:age)
8
+ end
9
+
10
+ should "accept an existing index" do
11
+ db_connection = create_table 'superheros' do |table|
12
+ table.integer :age
13
+ end
14
+ db_connection.add_index :superheros, :age
15
+ define_model_class 'Superhero'
16
+ assert_accepts @matcher, Superhero.new
17
+ end
18
+
19
+ should "reject a nonexistent index" do
20
+ define_model :superhero
21
+ assert_rejects @matcher, Superhero.new
22
+ end
23
+ end
24
+
25
+ context "have_index with unique option" do
26
+ setup do
27
+ @matcher = have_index(:ssn).unique(true)
28
+ end
29
+
30
+ should "accept an index of correct unique" do
31
+ db_connection = create_table 'superheros' do |table|
32
+ table.integer :ssn
33
+ end
34
+ db_connection.add_index :superheros, :ssn, :unique => true
35
+ define_model_class 'Superhero'
36
+ assert_accepts @matcher, Superhero.new
37
+ end
38
+
39
+ should "reject an index of wrong unique" do
40
+ db_connection = create_table 'superheros' do |table|
41
+ table.integer :ssn
42
+ end
43
+ db_connection.add_index :superheros, :ssn, :unique => false
44
+ define_model_class 'Superhero'
45
+ assert_rejects @matcher, Superhero.new
46
+ end
47
+ end
48
+
49
+ context "have_index on multiple columns" do
50
+ setup do
51
+ @matcher = have_index([:geocodable_type, :geocodable_id])
52
+ end
53
+
54
+ should "accept an existing index" do
55
+ db_connection = create_table 'geocodings' do |table|
56
+ table.integer :geocodable_id
57
+ table.string :geocodable_type
58
+ end
59
+ db_connection.add_index :geocodings, [:geocodable_type, :geocodable_id]
60
+ define_model_class 'Geocoding'
61
+ assert_accepts @matcher, Geocoding.new
62
+ end
63
+
64
+ should "reject a nonexistant index" do
65
+ db_connection = create_table 'geocodings' do |table|
66
+ table.integer :geocodable_id
67
+ table.string :geocodable_type
68
+ end
69
+ define_model_class 'Geocoding'
70
+ assert_rejects @matcher, Geocoding.new
71
+ end
72
+ end
73
+
74
+ end
@@ -0,0 +1,65 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class HaveNamedScopeMatcherTest < Test::Unit::TestCase # :nodoc:
4
+
5
+ context "an attribute with a named scope" do
6
+ setup do
7
+ define_model :example, :attr => :string do
8
+ named_scope :xyz, lambda {|n|
9
+ { :order => :attr }
10
+ }
11
+ end
12
+ @model = Example.new
13
+ end
14
+
15
+ should "accept having a scope with the correct signature" do
16
+ assert_accepts have_named_scope("xyz(1)"), @model
17
+ end
18
+
19
+ should "accept having a scope with the correct signature and find options" do
20
+ assert_accepts have_named_scope("xyz(1)").finding(:order => :attr), @model
21
+ end
22
+
23
+ should "reject having a scope with incorrect find options" do
24
+ assert_rejects have_named_scope("xyz(1)").
25
+ finding(:order => 'attr DESC'),
26
+ @model
27
+ end
28
+
29
+ should "reject having a scope with another name" do
30
+ assert_rejects have_named_scope("abc(1)"), @model
31
+ end
32
+
33
+ end
34
+
35
+ should "evaluate the scope in the correct context" do
36
+ define_model :example, :attr => :string do
37
+ named_scope :xyz, lambda {|n|
38
+ { :order => n }
39
+ }
40
+ end
41
+ model = Example.new
42
+ @order = :attr
43
+ assert_accepts have_named_scope("xyz(@order)").
44
+ finding(:order => @order).
45
+ in_context(self),
46
+ model
47
+ end
48
+
49
+ context "a method that does not return a scope" do
50
+ setup do
51
+ klass = Class.new
52
+ klass.class_eval do
53
+ def self.xyz
54
+ 'xyz'
55
+ end
56
+ end
57
+ @model = klass.new
58
+ end
59
+
60
+ should "reject having a named scope with that name" do
61
+ assert_rejects have_named_scope(:xyz), @model
62
+ end
63
+ end
64
+
65
+ end