robert-shoulda 2.10.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 (169) hide show
  1. data/CONTRIBUTION_GUIDELINES.rdoc +10 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README.rdoc +171 -0
  4. data/Rakefile +72 -0
  5. data/bin/convert_to_should_syntax +42 -0
  6. data/lib/shoulda/action_controller/macros.rb +240 -0
  7. data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +109 -0
  8. data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +57 -0
  9. data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +81 -0
  10. data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +74 -0
  11. data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +81 -0
  12. data/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
  13. data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +87 -0
  14. data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +85 -0
  15. data/lib/shoulda/action_controller/matchers.rb +37 -0
  16. data/lib/shoulda/action_controller.rb +26 -0
  17. data/lib/shoulda/action_mailer/assertions.rb +38 -0
  18. data/lib/shoulda/action_mailer.rb +10 -0
  19. data/lib/shoulda/action_view/macros.rb +61 -0
  20. data/lib/shoulda/action_view.rb +10 -0
  21. data/lib/shoulda/active_record/assertions.rb +69 -0
  22. data/lib/shoulda/active_record/helpers.rb +27 -0
  23. data/lib/shoulda/active_record/macros.rb +571 -0
  24. data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
  25. data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +102 -0
  26. data/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
  27. data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
  28. data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
  29. data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
  30. data/lib/shoulda/active_record/matchers/have_db_index_matcher.rb +112 -0
  31. data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +128 -0
  32. data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
  33. data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
  34. data/lib/shoulda/active_record/matchers/validate_format_of_matcher.rb +67 -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 +57 -0
  39. data/lib/shoulda/active_record/matchers.rb +43 -0
  40. data/lib/shoulda/active_record.rb +16 -0
  41. data/lib/shoulda/assertions.rb +71 -0
  42. data/lib/shoulda/autoload_macros.rb +46 -0
  43. data/lib/shoulda/context.rb +413 -0
  44. data/lib/shoulda/helpers.rb +8 -0
  45. data/lib/shoulda/macros.rb +133 -0
  46. data/lib/shoulda/private_helpers.rb +13 -0
  47. data/lib/shoulda/proc_extensions.rb +14 -0
  48. data/lib/shoulda/rails.rb +13 -0
  49. data/lib/shoulda/rspec.rb +11 -0
  50. data/lib/shoulda/tasks/list_tests.rake +29 -0
  51. data/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
  52. data/lib/shoulda/tasks.rb +3 -0
  53. data/lib/shoulda/test_unit.rb +22 -0
  54. data/lib/shoulda.rb +9 -0
  55. data/rails/init.rb +7 -0
  56. data/test/README +36 -0
  57. data/test/fail_macros.rb +39 -0
  58. data/test/fixtures/addresses.yml +3 -0
  59. data/test/fixtures/friendships.yml +0 -0
  60. data/test/fixtures/posts.yml +5 -0
  61. data/test/fixtures/products.yml +0 -0
  62. data/test/fixtures/taggings.yml +0 -0
  63. data/test/fixtures/tags.yml +9 -0
  64. data/test/fixtures/users.yml +6 -0
  65. data/test/functional/posts_controller_test.rb +121 -0
  66. data/test/functional/users_controller_test.rb +19 -0
  67. data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +68 -0
  68. data/test/matchers/active_record/allow_value_matcher_test.rb +64 -0
  69. data/test/matchers/active_record/association_matcher_test.rb +263 -0
  70. data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +80 -0
  71. data/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
  72. data/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
  73. data/test/matchers/active_record/have_db_index_matcher_test.rb +91 -0
  74. data/test/matchers/active_record/have_named_scope_matcher_test.rb +65 -0
  75. data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
  76. data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
  77. data/test/matchers/active_record/validate_format_of_matcher_test.rb +39 -0
  78. data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
  79. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
  80. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
  81. data/test/matchers/controller/assign_to_matcher_test.rb +35 -0
  82. data/test/matchers/controller/filter_param_matcher_test.rb +32 -0
  83. data/test/matchers/controller/render_with_layout_matcher_test.rb +33 -0
  84. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +32 -0
  85. data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
  86. data/test/matchers/controller/route_matcher_test.rb +75 -0
  87. data/test/matchers/controller/set_session_matcher_test.rb +38 -0
  88. data/test/matchers/controller/set_the_flash_matcher.rb +41 -0
  89. data/test/model_builder.rb +106 -0
  90. data/test/other/autoload_macro_test.rb +18 -0
  91. data/test/other/context_test.rb +203 -0
  92. data/test/other/convert_to_should_syntax_test.rb +63 -0
  93. data/test/other/helpers_test.rb +340 -0
  94. data/test/other/private_helpers_test.rb +32 -0
  95. data/test/other/should_test.rb +271 -0
  96. data/test/rails_root/app/controllers/application_controller.rb +25 -0
  97. data/test/rails_root/app/controllers/posts_controller.rb +87 -0
  98. data/test/rails_root/app/controllers/users_controller.rb +84 -0
  99. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  100. data/test/rails_root/app/helpers/posts_helper.rb +2 -0
  101. data/test/rails_root/app/helpers/users_helper.rb +2 -0
  102. data/test/rails_root/app/models/address.rb +7 -0
  103. data/test/rails_root/app/models/flea.rb +3 -0
  104. data/test/rails_root/app/models/friendship.rb +4 -0
  105. data/test/rails_root/app/models/pets/cat.rb +7 -0
  106. data/test/rails_root/app/models/pets/dog.rb +10 -0
  107. data/test/rails_root/app/models/post.rb +12 -0
  108. data/test/rails_root/app/models/product.rb +12 -0
  109. data/test/rails_root/app/models/profile.rb +2 -0
  110. data/test/rails_root/app/models/registration.rb +2 -0
  111. data/test/rails_root/app/models/tag.rb +8 -0
  112. data/test/rails_root/app/models/tagging.rb +4 -0
  113. data/test/rails_root/app/models/treat.rb +3 -0
  114. data/test/rails_root/app/models/user.rb +32 -0
  115. data/test/rails_root/app/views/layouts/posts.rhtml +19 -0
  116. data/test/rails_root/app/views/layouts/users.rhtml +17 -0
  117. data/test/rails_root/app/views/layouts/wide.html.erb +1 -0
  118. data/test/rails_root/app/views/posts/edit.rhtml +27 -0
  119. data/test/rails_root/app/views/posts/index.rhtml +25 -0
  120. data/test/rails_root/app/views/posts/new.rhtml +26 -0
  121. data/test/rails_root/app/views/posts/show.rhtml +18 -0
  122. data/test/rails_root/app/views/users/edit.rhtml +22 -0
  123. data/test/rails_root/app/views/users/index.rhtml +22 -0
  124. data/test/rails_root/app/views/users/new.rhtml +21 -0
  125. data/test/rails_root/app/views/users/show.rhtml +13 -0
  126. data/test/rails_root/config/boot.rb +110 -0
  127. data/test/rails_root/config/database.yml +4 -0
  128. data/test/rails_root/config/environment.rb +18 -0
  129. data/test/rails_root/config/environments/test.rb +0 -0
  130. data/test/rails_root/config/initializers/new_rails_defaults.rb +15 -0
  131. data/test/rails_root/config/initializers/shoulda.rb +8 -0
  132. data/test/rails_root/config/routes.rb +6 -0
  133. data/test/rails_root/db/migrate/001_create_users.rb +19 -0
  134. data/test/rails_root/db/migrate/002_create_posts.rb +13 -0
  135. data/test/rails_root/db/migrate/003_create_taggings.rb +12 -0
  136. data/test/rails_root/db/migrate/004_create_tags.rb +11 -0
  137. data/test/rails_root/db/migrate/005_create_dogs.rb +12 -0
  138. data/test/rails_root/db/migrate/006_create_addresses.rb +14 -0
  139. data/test/rails_root/db/migrate/007_create_fleas.rb +11 -0
  140. data/test/rails_root/db/migrate/008_create_dogs_fleas.rb +12 -0
  141. data/test/rails_root/db/migrate/009_create_products.rb +17 -0
  142. data/test/rails_root/db/migrate/010_create_friendships.rb +14 -0
  143. data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
  144. data/test/rails_root/db/migrate/20090506203502_create_profiles.rb +12 -0
  145. data/test/rails_root/db/migrate/20090506203536_create_registrations.rb +14 -0
  146. data/test/rails_root/db/migrate/20090513104502_create_cats.rb +12 -0
  147. data/test/rails_root/db/schema.rb +0 -0
  148. data/test/rails_root/log/test.log +8963 -0
  149. data/test/rails_root/public/404.html +30 -0
  150. data/test/rails_root/public/422.html +30 -0
  151. data/test/rails_root/public/500.html +30 -0
  152. data/test/rails_root/script/console +3 -0
  153. data/test/rails_root/script/generate +3 -0
  154. data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
  155. data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
  156. data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
  157. data/test/rspec_test.rb +207 -0
  158. data/test/test_helper.rb +28 -0
  159. data/test/unit/address_test.rb +15 -0
  160. data/test/unit/cat_test.rb +7 -0
  161. data/test/unit/dog_test.rb +9 -0
  162. data/test/unit/flea_test.rb +6 -0
  163. data/test/unit/friendship_test.rb +6 -0
  164. data/test/unit/post_test.rb +19 -0
  165. data/test/unit/product_test.rb +23 -0
  166. data/test/unit/tag_test.rb +15 -0
  167. data/test/unit/tagging_test.rb +6 -0
  168. data/test/unit/user_test.rb +80 -0
  169. metadata +225 -0
@@ -0,0 +1,106 @@
1
+ class ActiveSupport::TestCase
2
+ def create_table(table_name, &block)
3
+ connection = ActiveRecord::Base.connection
4
+
5
+ begin
6
+ connection.execute("DROP TABLE IF EXISTS #{table_name}")
7
+ connection.create_table(table_name, &block)
8
+ @created_tables ||= []
9
+ @created_tables << table_name
10
+ connection
11
+ rescue Exception => e
12
+ connection.execute("DROP TABLE IF EXISTS #{table_name}")
13
+ raise e
14
+ end
15
+ end
16
+
17
+ def define_constant(class_name, base, &block)
18
+ class_name = class_name.to_s.camelize
19
+
20
+ klass = Class.new(base)
21
+ Object.const_set(class_name, klass)
22
+
23
+ klass.class_eval(&block) if block_given?
24
+
25
+ @defined_constants ||= []
26
+ @defined_constants << class_name
27
+
28
+ klass
29
+ end
30
+
31
+ def define_model_class(class_name, &block)
32
+ define_constant(class_name, ActiveRecord::Base, &block)
33
+ end
34
+
35
+ def define_model(name, columns = {}, &block)
36
+ class_name = name.to_s.pluralize.classify
37
+ table_name = class_name.tableize
38
+
39
+ create_table(table_name) do |table|
40
+ columns.each do |name, type|
41
+ table.column name, type
42
+ end
43
+ end
44
+
45
+ define_model_class(class_name, &block)
46
+ end
47
+
48
+ def define_controller(class_name, &block)
49
+ class_name = class_name.to_s
50
+ class_name << 'Controller' unless class_name =~ /Controller$/
51
+ define_constant(class_name, ActionController::Base, &block)
52
+ end
53
+
54
+ def define_routes(&block)
55
+ @replaced_routes = ActionController::Routing::Routes
56
+ new_routes = ActionController::Routing::RouteSet.new
57
+ silence_warnings do
58
+ ActionController::Routing.const_set('Routes', new_routes)
59
+ end
60
+ new_routes.draw(&block)
61
+ end
62
+
63
+ def build_response(&block)
64
+ klass = define_controller('Examples')
65
+ block ||= lambda { render :nothing => true }
66
+ klass.class_eval { define_method(:example, &block) }
67
+ define_routes do |map|
68
+ map.connect 'examples', :controller => 'examples', :action => 'example'
69
+ end
70
+
71
+ @controller = klass.new
72
+ @request = ActionController::TestRequest.new
73
+ @response = ActionController::TestResponse.new
74
+ get :example
75
+
76
+ @controller
77
+ end
78
+
79
+ def teardown_with_models
80
+ if @defined_constants
81
+ @defined_constants.each do |class_name|
82
+ Object.send(:remove_const, class_name)
83
+ end
84
+ end
85
+
86
+ if @created_tables
87
+ @created_tables.each do |table_name|
88
+ ActiveRecord::Base.
89
+ connection.
90
+ execute("DROP TABLE IF EXISTS #{table_name}")
91
+ end
92
+ end
93
+
94
+ if @replaced_routes
95
+ ActionController::Routing::Routes.clear!
96
+ silence_warnings do
97
+ ActionController::Routing.const_set('Routes', @replaced_routes)
98
+ end
99
+ @replaced_routes.reload!
100
+ end
101
+
102
+ teardown_without_models
103
+ end
104
+ alias_method :teardown_without_models, :teardown
105
+ alias_method :teardown, :teardown_with_models
106
+ end
@@ -0,0 +1,18 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class AutoloadMacroTest < ActiveSupport::TestCase # :nodoc:
4
+ context "The macro auto-loader" do
5
+ should "load macros from the plugins" do
6
+ assert self.class.respond_to?('plugin_macro')
7
+ end
8
+
9
+ should "load macros from the gems" do
10
+ assert self.class.respond_to?('gem_macro')
11
+ end
12
+
13
+ should "load custom macros from ROOT/test/shoulda_macros" do
14
+ assert self.class.respond_to?('custom_macro')
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,203 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class ContextTest < ActiveSupport::TestCase # :nodoc:
4
+
5
+ def self.context_macro(&blk)
6
+ context "with a subcontext made by a macro" do
7
+ setup { @context_macro = :foo }
8
+
9
+ merge_block &blk
10
+ end
11
+ end
12
+
13
+ # def self.context_macro(&blk)
14
+ # context "with a subcontext made by a macro" do
15
+ # setup { @context_macro = :foo }
16
+ # yield # <- this doesn't work.
17
+ # end
18
+ # end
19
+
20
+ context "context with setup block" do
21
+ setup do
22
+ @blah = "blah"
23
+ end
24
+
25
+ should "run the setup block" do
26
+ assert_equal "blah", @blah
27
+ end
28
+
29
+ should "have name set right" do
30
+ assert_match(/^test: context with setup block/, self.to_s)
31
+ end
32
+
33
+ context "and a subcontext" do
34
+ setup do
35
+ @blah = "#{@blah} twice"
36
+ end
37
+
38
+ should "be named correctly" do
39
+ assert_match(/^test: context with setup block and a subcontext should be named correctly/, self.to_s)
40
+ end
41
+
42
+ should "run the setup blocks in order" do
43
+ assert_equal @blah, "blah twice"
44
+ end
45
+ end
46
+
47
+ context_macro do
48
+ should "have name set right" do
49
+ assert_match(/^test: context with setup block with a subcontext made by a macro should have name set right/, self.to_s)
50
+ end
51
+
52
+ should "run the setup block of that context macro" do
53
+ assert_equal :foo, @context_macro
54
+ end
55
+
56
+ should "run the setup block of the main context" do
57
+ assert_equal "blah", @blah
58
+ end
59
+ end
60
+
61
+ end
62
+
63
+ context "another context with setup block" do
64
+ setup do
65
+ @blah = "foo"
66
+ end
67
+
68
+ should "have @blah == 'foo'" do
69
+ assert_equal "foo", @blah
70
+ end
71
+
72
+ should "have name set right" do
73
+ assert_match(/^test: another context with setup block/, self.to_s)
74
+ end
75
+ end
76
+
77
+ context "context with method definition" do
78
+ setup do
79
+ def hello; "hi"; end
80
+ end
81
+
82
+ should "be able to read that method" do
83
+ assert_equal "hi", hello
84
+ end
85
+
86
+ should "have name set right" do
87
+ assert_match(/^test: context with method definition/, self.to_s)
88
+ end
89
+ end
90
+
91
+ context "another context" do
92
+ should "not define @blah" do
93
+ assert_nil @blah
94
+ end
95
+ end
96
+
97
+ context "context with multiple setups and/or teardowns" do
98
+
99
+ cleanup_count = 0
100
+
101
+ 2.times do |i|
102
+ setup { cleanup_count += 1 }
103
+ teardown { cleanup_count -= 1 }
104
+ end
105
+
106
+ 2.times do |i|
107
+ should "call all setups and all teardowns (check ##{i + 1})" do
108
+ assert_equal 2, cleanup_count
109
+ end
110
+ end
111
+
112
+ context "subcontexts" do
113
+
114
+ 2.times do |i|
115
+ setup { cleanup_count += 1 }
116
+ teardown { cleanup_count -= 1 }
117
+ end
118
+
119
+ 2.times do |i|
120
+ should "also call all setups and all teardowns in parent and subcontext (check ##{i + 1})" do
121
+ assert_equal 4, cleanup_count
122
+ end
123
+ end
124
+
125
+ end
126
+
127
+ end
128
+
129
+ should_eventually "pass, since it's unimplemented" do
130
+ flunk "what?"
131
+ end
132
+
133
+ should_eventually "not require a block when using should_eventually"
134
+ should "pass without a block, as that causes it to piggyback to should_eventually"
135
+
136
+ context "context for testing should piggybacking" do
137
+ should "call should_eventually as we are not passing a block"
138
+ end
139
+
140
+ context "context" do
141
+ context "with nested subcontexts" do
142
+ should_eventually "only print this statement once for a should_eventually"
143
+ end
144
+ end
145
+
146
+ class ::SomeModel; end
147
+
148
+ context "given a test named after a class" do
149
+ setup do
150
+ self.class.stubs(:name).returns("SomeModelTest")
151
+ end
152
+
153
+ should "determine the described type" do
154
+ assert_equal SomeModel, self.class.described_type
155
+ end
156
+
157
+ should "return a new instance of the described type as the subject if none exists" do
158
+ assert_kind_of SomeModel, subject
159
+ end
160
+
161
+ should "return an existing instance of the described type as the subject" do
162
+ @some_model = SomeModel.new
163
+ assert_equal @some_model, subject
164
+ end
165
+
166
+ context "with an explicit subject block" do
167
+ setup { @expected = SomeModel.new }
168
+ subject { @expected }
169
+ should "return the result of the block as the subject" do
170
+ assert_equal @expected, subject
171
+ end
172
+
173
+ context "nested context block without a subject block" do
174
+ should "return the result of the parent context's subject block" do
175
+ assert_equal @expected, subject
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
181
+
182
+ class Subject; end
183
+
184
+ class SubjectTest < ActiveSupport::TestCase
185
+
186
+ def setup
187
+ @expected = Subject.new
188
+ end
189
+
190
+ subject { @expected }
191
+
192
+ should "return a specified subject" do
193
+ assert_equal @expected, subject
194
+ end
195
+ end
196
+
197
+ class SubjectLazinessTest < ActiveSupport::TestCase
198
+ subject { Subject.new }
199
+
200
+ should "only build the subject once" do
201
+ assert_equal subject, subject
202
+ end
203
+ end
@@ -0,0 +1,63 @@
1
+ require 'test/unit'
2
+
3
+ class ConvertToShouldSyntaxTest < ActiveSupport::TestCase # :nodoc:
4
+
5
+ BEFORE_FIXTURE = <<-EOS
6
+ class DummyTest < ActiveSupport::TestCase
7
+
8
+ should "Not change this_word_with_underscores" do
9
+ end
10
+
11
+ def test_should_be_working
12
+ assert true
13
+ end
14
+
15
+ def test_some_cool_stuff
16
+ assert true
17
+ end
18
+
19
+ def non_test_method
20
+ end
21
+
22
+ end
23
+ EOS
24
+
25
+ AFTER_FIXTURE = <<-EOS
26
+ class DummyTest < ActiveSupport::TestCase
27
+
28
+ should "Not change this_word_with_underscores" do
29
+ end
30
+
31
+ should "be working" do
32
+ assert true
33
+ end
34
+
35
+ should "RENAME ME: test some cool stuff" do
36
+ assert true
37
+ end
38
+
39
+ def non_test_method
40
+ end
41
+
42
+ end
43
+ EOS
44
+
45
+ FIXTURE_PATH = "./convert_to_should_syntax_fixture.dat"
46
+
47
+ RUBY = ENV['RUBY'] || 'ruby'
48
+
49
+ def test_convert_to_should_syntax
50
+ File.open(FIXTURE_PATH, "w") {|f| f.write(BEFORE_FIXTURE)}
51
+ cmd = "#{RUBY} #{File.join(File.dirname(__FILE__), '../../bin/convert_to_should_syntax')} #{FIXTURE_PATH}"
52
+ output = `#{cmd}`
53
+ File.unlink($1) if output.match(/has been stored in '([^']+)/)
54
+ assert_match(/has been converted/, output)
55
+ result = IO.read(FIXTURE_PATH)
56
+ assert_equal result, AFTER_FIXTURE
57
+ end
58
+
59
+ def teardown
60
+ File.unlink(FIXTURE_PATH)
61
+ end
62
+
63
+ end