Flamefork-shoulda 2.10.1

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 (160) hide show
  1. data/CONTRIBUTION_GUIDELINES.rdoc +12 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README.rdoc +169 -0
  4. data/Rakefile +72 -0
  5. data/bin/convert_to_should_syntax +42 -0
  6. data/lib/shoulda/action_controller/helpers.rb +47 -0
  7. data/lib/shoulda/action_controller/macros.rb +277 -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_controller/matchers.rb +37 -0
  17. data/lib/shoulda/action_controller.rb +24 -0
  18. data/lib/shoulda/action_mailer/assertions.rb +38 -0
  19. data/lib/shoulda/action_mailer.rb +6 -0
  20. data/lib/shoulda/action_view/macros.rb +56 -0
  21. data/lib/shoulda/action_view.rb +6 -0
  22. data/lib/shoulda/active_record/assertions.rb +69 -0
  23. data/lib/shoulda/active_record/helpers.rb +40 -0
  24. data/lib/shoulda/active_record/macros.rb +588 -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/active_record/matchers.rb +42 -0
  40. data/lib/shoulda/active_record.rb +12 -0
  41. data/lib/shoulda/assertions.rb +59 -0
  42. data/lib/shoulda/autoload_macros.rb +46 -0
  43. data/lib/shoulda/context.rb +304 -0
  44. data/lib/shoulda/helpers.rb +8 -0
  45. data/lib/shoulda/macros.rb +73 -0
  46. data/lib/shoulda/private_helpers.rb +20 -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 +14 -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 +34 -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 +125 -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 +41 -0
  69. data/test/matchers/active_record/association_matcher_test.rb +258 -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_index_matcher_test.rb +74 -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_numericality_of_matcher_test.rb +52 -0
  78. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
  79. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
  80. data/test/matchers/controller/assign_to_matcher_test.rb +35 -0
  81. data/test/matchers/controller/filter_param_matcher_test.rb +32 -0
  82. data/test/matchers/controller/render_with_layout_matcher_test.rb +33 -0
  83. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +27 -0
  84. data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
  85. data/test/matchers/controller/route_matcher_test.rb +58 -0
  86. data/test/matchers/controller/set_session_matcher_test.rb +31 -0
  87. data/test/matchers/controller/set_the_flash_matcher.rb +41 -0
  88. data/test/model_builder.rb +106 -0
  89. data/test/other/autoload_macro_test.rb +18 -0
  90. data/test/other/context_test.rb +145 -0
  91. data/test/other/convert_to_should_syntax_test.rb +63 -0
  92. data/test/other/helpers_test.rb +241 -0
  93. data/test/other/private_helpers_test.rb +34 -0
  94. data/test/other/should_test.rb +266 -0
  95. data/test/rails_root/app/controllers/application.rb +25 -0
  96. data/test/rails_root/app/controllers/posts_controller.rb +86 -0
  97. data/test/rails_root/app/controllers/users_controller.rb +84 -0
  98. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  99. data/test/rails_root/app/helpers/posts_helper.rb +2 -0
  100. data/test/rails_root/app/helpers/users_helper.rb +2 -0
  101. data/test/rails_root/app/models/address.rb +7 -0
  102. data/test/rails_root/app/models/flea.rb +3 -0
  103. data/test/rails_root/app/models/friendship.rb +4 -0
  104. data/test/rails_root/app/models/pets/dog.rb +10 -0
  105. data/test/rails_root/app/models/post.rb +12 -0
  106. data/test/rails_root/app/models/product.rb +12 -0
  107. data/test/rails_root/app/models/tag.rb +8 -0
  108. data/test/rails_root/app/models/tagging.rb +4 -0
  109. data/test/rails_root/app/models/treat.rb +3 -0
  110. data/test/rails_root/app/models/user.rb +29 -0
  111. data/test/rails_root/app/views/layouts/posts.rhtml +19 -0
  112. data/test/rails_root/app/views/layouts/users.rhtml +17 -0
  113. data/test/rails_root/app/views/layouts/wide.html.erb +1 -0
  114. data/test/rails_root/app/views/posts/edit.rhtml +27 -0
  115. data/test/rails_root/app/views/posts/index.rhtml +25 -0
  116. data/test/rails_root/app/views/posts/new.rhtml +26 -0
  117. data/test/rails_root/app/views/posts/show.rhtml +18 -0
  118. data/test/rails_root/app/views/users/edit.rhtml +22 -0
  119. data/test/rails_root/app/views/users/index.rhtml +22 -0
  120. data/test/rails_root/app/views/users/new.rhtml +21 -0
  121. data/test/rails_root/app/views/users/show.rhtml +13 -0
  122. data/test/rails_root/config/boot.rb +109 -0
  123. data/test/rails_root/config/database.yml +4 -0
  124. data/test/rails_root/config/environment.rb +14 -0
  125. data/test/rails_root/config/environments/test.rb +0 -0
  126. data/test/rails_root/config/initializers/new_rails_defaults.rb +15 -0
  127. data/test/rails_root/config/initializers/shoulda.rb +8 -0
  128. data/test/rails_root/config/routes.rb +6 -0
  129. data/test/rails_root/db/migrate/001_create_users.rb +19 -0
  130. data/test/rails_root/db/migrate/002_create_posts.rb +13 -0
  131. data/test/rails_root/db/migrate/003_create_taggings.rb +12 -0
  132. data/test/rails_root/db/migrate/004_create_tags.rb +11 -0
  133. data/test/rails_root/db/migrate/005_create_dogs.rb +12 -0
  134. data/test/rails_root/db/migrate/006_create_addresses.rb +14 -0
  135. data/test/rails_root/db/migrate/007_create_fleas.rb +11 -0
  136. data/test/rails_root/db/migrate/008_create_dogs_fleas.rb +12 -0
  137. data/test/rails_root/db/migrate/009_create_products.rb +17 -0
  138. data/test/rails_root/db/migrate/010_create_friendships.rb +14 -0
  139. data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
  140. data/test/rails_root/db/schema.rb +0 -0
  141. data/test/rails_root/public/404.html +30 -0
  142. data/test/rails_root/public/422.html +30 -0
  143. data/test/rails_root/public/500.html +30 -0
  144. data/test/rails_root/script/console +3 -0
  145. data/test/rails_root/script/generate +3 -0
  146. data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
  147. data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
  148. data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
  149. data/test/rspec_test.rb +207 -0
  150. data/test/test_helper.rb +35 -0
  151. data/test/unit/address_test.rb +10 -0
  152. data/test/unit/dog_test.rb +10 -0
  153. data/test/unit/flea_test.rb +6 -0
  154. data/test/unit/friendship_test.rb +6 -0
  155. data/test/unit/post_test.rb +19 -0
  156. data/test/unit/product_test.rb +27 -0
  157. data/test/unit/tag_test.rb +15 -0
  158. data/test/unit/tagging_test.rb +6 -0
  159. data/test/unit/user_test.rb +70 -0
  160. metadata +258 -0
@@ -0,0 +1,241 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+ require 'action_mailer'
3
+ require 'mocha'
4
+
5
+ class HelpersTest < Test::Unit::TestCase # :nodoc:
6
+
7
+ context "given delivered emails" do
8
+ setup do
9
+ email1 = stub(:subject => "one", :to => ["none1@email.com"])
10
+ email2 = stub(:subject => "two", :to => ["none2@email.com"])
11
+ ActionMailer::Base.stubs(:deliveries).returns([email1, email2])
12
+ end
13
+
14
+ should "have sent an email" do
15
+ assert_sent_email
16
+
17
+ assert_raises(Test::Unit::AssertionFailedError) do
18
+ assert_did_not_send_email
19
+ end
20
+ end
21
+
22
+ should "find email one" do
23
+ assert_sent_email do |e|
24
+ e.subject =~ /one/
25
+ end
26
+ end
27
+
28
+ should "not find an email that doesn't exist" do
29
+ assert_raises(Test::Unit::AssertionFailedError) do
30
+ assert_sent_email do |e|
31
+ e.subject =~ /whatever/
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ context "when there are no emails" do
38
+ setup do
39
+ ActionMailer::Base.stubs(:deliveries).returns([])
40
+ end
41
+
42
+ should "not have sent an email" do
43
+ assert_did_not_send_email
44
+
45
+ assert_raises(Test::Unit::AssertionFailedError) do
46
+ assert_sent_email
47
+ end
48
+ end
49
+ end
50
+
51
+ context "an array of values" do
52
+ setup do
53
+ @a = ['abc', 'def', 3]
54
+ end
55
+
56
+ [/b/, 'abc', 3].each do |x|
57
+ should "contain #{x.inspect}" do
58
+ assert_raises(Test::Unit::AssertionFailedError) do
59
+ assert_does_not_contain @a, x
60
+ end
61
+ assert_contains @a, x
62
+ end
63
+ end
64
+
65
+ should "not contain 'wtf'" do
66
+ assert_raises(Test::Unit::AssertionFailedError) {assert_contains @a, 'wtf'}
67
+ assert_does_not_contain @a, 'wtf'
68
+ end
69
+
70
+ should "be the same as another array, ordered differently" do
71
+ assert_same_elements(@a, [3, "def", "abc"])
72
+ assert_raises(Test::Unit::AssertionFailedError) do
73
+ assert_same_elements(@a, [3, 3, "def", "abc"])
74
+ end
75
+ assert_raises(Test::Unit::AssertionFailedError) do
76
+ assert_same_elements([@a, "abc"].flatten, [3, 3, "def", "abc"])
77
+ end
78
+ end
79
+ end
80
+
81
+ context "an array of values" do
82
+ setup do
83
+ @a = [1, 2, "(3)"]
84
+ end
85
+
86
+ context "after adding another value" do
87
+ setup do
88
+ @a.push(4)
89
+ end
90
+
91
+ should_change "@a.length", :by => 1
92
+ should_change "@a.length", :from => 3
93
+ should_change "@a.length", :to => 4
94
+ should_change "@a[0]", :by => 0
95
+ should_not_change "@a[0]"
96
+ end
97
+
98
+ context "after replacing it with an array of strings" do
99
+ setup do
100
+ @a = %w(a b c d e f)
101
+ end
102
+
103
+ should_change "@a.length", :by => 3
104
+ should_change "@a.length", :from => 3, :to => 6, :by => 3
105
+ should_change "@a[0]"
106
+ should_change "@a[1]", :from => 2, :to => "b"
107
+ should_change "@a[2]", :from => /\d/, :to => /\w/
108
+ should_change "@a[3]", :to => String
109
+ end
110
+ end
111
+
112
+ context "assert_good_value" do
113
+ should "validate a good email address" do
114
+ assert_good_value User.new, :email, "good@example.com"
115
+ end
116
+
117
+ should "validate a good SSN with a custom message" do
118
+ assert_good_value User.new, :ssn, "xxxxxxxxx", /length/
119
+ end
120
+
121
+ should "fail to validate a bad email address" do
122
+ assert_raises Test::Unit::AssertionFailedError do
123
+ assert_good_value User.new, :email, "bad"
124
+ end
125
+ end
126
+
127
+ should "fail to validate a bad SSN that is too short" do
128
+ assert_raises Test::Unit::AssertionFailedError do
129
+ assert_good_value User.new, :ssn, "x", /length/
130
+ end
131
+ end
132
+
133
+ should "accept a class as the first argument" do
134
+ assert_good_value User, :email, "good@example.com"
135
+ end
136
+
137
+ context "with an instance variable" do
138
+ setup do
139
+ @product = Product.new(:tangible => true)
140
+ end
141
+
142
+ should "use that instance variable" do
143
+ assert_good_value Product, :price, "9999", /included/
144
+ end
145
+ end
146
+ end
147
+
148
+ context "assert_bad_value" do
149
+ should "invalidate a bad email address" do
150
+ assert_bad_value User.new, :email, "bad"
151
+ end
152
+
153
+ should "invalidate a bad SSN with a custom message" do
154
+ assert_bad_value User.new, :ssn, "x", /length/
155
+ end
156
+
157
+ should "fail to invalidate a good email address" do
158
+ assert_raises Test::Unit::AssertionFailedError do
159
+ assert_bad_value User.new, :email, "good@example.com"
160
+ end
161
+ end
162
+
163
+ should "fail to invalidate a good SSN" do
164
+ assert_raises Test::Unit::AssertionFailedError do
165
+ assert_bad_value User.new, :ssn, "xxxxxxxxx", /length/
166
+ end
167
+ end
168
+
169
+ should "accept a class as the first argument" do
170
+ assert_bad_value User, :email, "bad"
171
+ end
172
+
173
+ context "with an instance variable" do
174
+ setup do
175
+ @product = Product.new(:tangible => true)
176
+ end
177
+
178
+ should "use that instance variable" do
179
+ assert_bad_value Product, :price, "0", /included/
180
+ end
181
+ end
182
+ end
183
+
184
+ context "a matching matcher" do
185
+ setup do
186
+ @matcher = stub('matcher', :matches? => true,
187
+ :failure_message => 'bad failure message',
188
+ :negative_failure_message => 'big time failure')
189
+ end
190
+
191
+ should "pass when given to assert_accepts" do
192
+ assert_accepts @matcher, 'target'
193
+ end
194
+
195
+ context "when given to assert_rejects" do
196
+ setup do
197
+ begin
198
+ assert_rejects @matcher, 'target'
199
+ rescue Test::Unit::AssertionFailedError => @error
200
+ end
201
+ end
202
+
203
+ should "fail" do
204
+ assert_not_nil @error
205
+ end
206
+
207
+ should "use the error message from the matcher" do
208
+ assert_equal 'big time failure', @error.message
209
+ end
210
+ end
211
+ end
212
+
213
+ context "a non-matching matcher" do
214
+ setup do
215
+ @matcher = stub('matcher', :matches? => false,
216
+ :failure_message => 'big time failure',
217
+ :negative_failure_message => 'bad failure message')
218
+ end
219
+
220
+ should "pass when given to assert_rejects" do
221
+ assert_rejects @matcher, 'target'
222
+ end
223
+
224
+ context "when given to assert_accepts" do
225
+ setup do
226
+ begin
227
+ assert_accepts @matcher, 'target'
228
+ rescue Test::Unit::AssertionFailedError => @error
229
+ end
230
+ end
231
+
232
+ should "fail" do
233
+ assert_not_nil @error
234
+ end
235
+
236
+ should "use the error message from the matcher" do
237
+ assert_equal 'big time failure', @error.message
238
+ end
239
+ end
240
+ end
241
+ end
@@ -0,0 +1,34 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class PrivateHelpersTest < Test::Unit::TestCase # :nodoc:
4
+ include Shoulda::Private
5
+ context "get_options!" do
6
+ should "remove opts from args" do
7
+ args = [:a, :b, {}]
8
+ get_options!(args)
9
+ assert_equal [:a, :b], args
10
+ end
11
+
12
+ should "return wanted opts in order" do
13
+ args = [{:one => 1, :two => 2}]
14
+ one, two = get_options!(args, :one, :two)
15
+ assert_equal 1, one
16
+ assert_equal 2, two
17
+ end
18
+
19
+ should "raise ArgumentError if given unwanted option" do
20
+ args = [{:one => 1, :two => 2}]
21
+ assert_raises ArgumentError do
22
+ get_options!(args, :one)
23
+ end
24
+ end
25
+ end
26
+
27
+ class ::SomeModel; end
28
+ context "model_class" do
29
+ should "sniff the class constant from the test class" do
30
+ self.expects(:name).returns("SomeModelTest")
31
+ assert_equal SomeModel, model_class
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,266 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class ShouldTest < Test::Unit::TestCase # :nodoc:
4
+ should "be able to define a should statement outside of a context" do
5
+ assert true
6
+ end
7
+
8
+ should "see the name of my class as ShouldTest" do
9
+ assert_equal "ShouldTest", self.class.name
10
+ end
11
+
12
+ def self.should_see_class_methods
13
+ should "be able to see class methods" do
14
+ assert true
15
+ end
16
+ end
17
+
18
+ def self.should_see_a_context_block_like_a_Test_Unit_class
19
+ should "see a context block as a Test::Unit class" do
20
+ assert_equal "ShouldTest", self.class.name
21
+ end
22
+ end
23
+
24
+ def self.should_see_blah
25
+ should "see @blah through a macro" do
26
+ assert @blah
27
+ end
28
+ end
29
+
30
+ def self.should_not_see_blah
31
+ should "not see @blah through a macro" do
32
+ assert_nil @blah
33
+ end
34
+ end
35
+
36
+ def self.should_be_able_to_make_context_macros(prefix = nil)
37
+ context "a macro" do
38
+ should "have the tests named correctly" do
39
+ assert_match(/^test: #{prefix}a macro should have the tests named correctly/, self.to_s)
40
+ end
41
+ end
42
+ end
43
+
44
+ context "Context" do
45
+
46
+ should_see_class_methods
47
+ should_see_a_context_block_like_a_Test_Unit_class
48
+ should_be_able_to_make_context_macros("Context ")
49
+
50
+ should "not define @blah" do
51
+ assert ! self.instance_variables.include?("@blah")
52
+ end
53
+
54
+ should_not_see_blah
55
+
56
+ should "be able to define a should statement" do
57
+ assert true
58
+ end
59
+
60
+ should "see the name of my class as ShouldTest" do
61
+ assert_equal "ShouldTest", self.class.name
62
+ end
63
+
64
+ context "with a subcontext" do
65
+ should_be_able_to_make_context_macros("Context with a subcontext ")
66
+ end
67
+ end
68
+
69
+ context "Context with setup block" do
70
+ setup do
71
+ @blah = "blah"
72
+ end
73
+
74
+ should "have @blah == 'blah'" do
75
+ assert_equal "blah", @blah
76
+ end
77
+ should_see_blah
78
+
79
+ should "have name set right" do
80
+ assert_match(/^test: Context with setup block/, self.to_s)
81
+ end
82
+
83
+ context "and a subcontext" do
84
+ setup do
85
+ @blah = "#{@blah} twice"
86
+ end
87
+
88
+ should "be named correctly" do
89
+ assert_match(/^test: Context with setup block and a subcontext should be named correctly/, self.to_s)
90
+ end
91
+
92
+ should "run the setup methods in order" do
93
+ assert_equal @blah, "blah twice"
94
+ end
95
+ should_see_blah
96
+ end
97
+ end
98
+
99
+ context "Another context with setup block" do
100
+ setup do
101
+ @blah = "foo"
102
+ end
103
+
104
+ should "have @blah == 'foo'" do
105
+ assert_equal "foo", @blah
106
+ end
107
+
108
+ should "have name set right" do
109
+ assert_match(/^test: Another context with setup block/, self.to_s)
110
+ end
111
+ should_see_blah
112
+ end
113
+
114
+ should_eventually "pass, since it's a should_eventually" do
115
+ flunk "what?"
116
+ end
117
+
118
+ # Context creation and naming
119
+
120
+ def test_should_create_a_new_context
121
+ assert_nothing_raised do
122
+ Shoulda::Context.new("context name", self) do; end
123
+ end
124
+ end
125
+
126
+ def test_should_create_a_nested_context
127
+ assert_nothing_raised do
128
+ parent = Shoulda::Context.new("Parent", self) do; end
129
+ child = Shoulda::Context.new("Child", parent) do; end
130
+ end
131
+ end
132
+
133
+ def test_should_name_a_contexts_correctly
134
+ parent = Shoulda::Context.new("Parent", self) do; end
135
+ child = Shoulda::Context.new("Child", parent) do; end
136
+ grandchild = Shoulda::Context.new("GrandChild", child) do; end
137
+
138
+ assert_equal "Parent", parent.full_name
139
+ assert_equal "Parent Child", child.full_name
140
+ assert_equal "Parent Child GrandChild", grandchild.full_name
141
+ end
142
+
143
+ # Should statements
144
+
145
+ def test_should_have_should_hashes_when_given_should_statements
146
+ context = Shoulda::Context.new("name", self) do
147
+ should "be good" do; end
148
+ should "another" do; end
149
+ end
150
+
151
+ names = context.shoulds.map {|s| s[:name]}
152
+ assert_equal ["another", "be good"], names.sort
153
+ end
154
+
155
+ # setup and teardown
156
+
157
+ def test_should_capture_setup_and_teardown_blocks
158
+ context = Shoulda::Context.new("name", self) do
159
+ setup do; "setup"; end
160
+ teardown do; "teardown"; end
161
+ end
162
+
163
+ assert_equal "setup", context.setup_blocks.first.call
164
+ assert_equal "teardown", context.teardown_blocks.first.call
165
+ end
166
+
167
+ # building
168
+
169
+ def test_should_create_shoulda_test_for_each_should_on_build
170
+ context = Shoulda::Context.new("name", self) do
171
+ should "one" do; end
172
+ should "two" do; end
173
+ end
174
+ context.expects(:create_test_from_should_hash).with(has_entry(:name => "one"))
175
+ context.expects(:create_test_from_should_hash).with(has_entry(:name => "two"))
176
+ context.build
177
+ end
178
+
179
+ def test_should_create_test_methods_on_build
180
+ tu_class = Test::Unit::TestCase
181
+ context = Shoulda::Context.new("A Context", tu_class) do
182
+ should "define the test" do; end
183
+ end
184
+
185
+ tu_class.expects(:define_method).with(:"test: A Context should define the test. ")
186
+ context.build
187
+ end
188
+
189
+ def test_should_create_test_methods_on_build_when_subcontext
190
+ tu_class = Test::Unit::TestCase
191
+ context = Shoulda::Context.new("A Context", tu_class) do
192
+ context "with a child" do
193
+ should "define the test" do; end
194
+ end
195
+ end
196
+
197
+ tu_class.expects(:define_method).with(:"test: A Context with a child should define the test. ")
198
+ context.build
199
+ end
200
+
201
+ # Test::Unit integration
202
+
203
+ def test_should_create_a_new_context_and_build_it_on_Test_Unit_context
204
+ c = mock("context")
205
+ c.expects(:build)
206
+ Shoulda::Context.expects(:new).with("foo", kind_of(Class)).returns(c)
207
+ self.class.context "foo" do; end
208
+ end
209
+
210
+ def test_should_create_a_one_off_context_and_build_it_on_Test_Unit_should
211
+ s = mock("test")
212
+ Shoulda::Context.any_instance.expects(:should).with("rock", {}).returns(s)
213
+ Shoulda::Context.any_instance.expects(:build)
214
+ self.class.should "rock" do; end
215
+ end
216
+
217
+ def test_should_create_a_one_off_context_and_build_it_on_Test_Unit_should_eventually
218
+ s = mock("test")
219
+ Shoulda::Context.any_instance.expects(:should_eventually).with("rock").returns(s)
220
+ Shoulda::Context.any_instance.expects(:build)
221
+ self.class.should_eventually "rock" do; end
222
+ end
223
+
224
+ should "run a :before proc", :before => lambda { @value = "before" } do
225
+ assert_equal "before", @value
226
+ end
227
+
228
+ context "A :before proc" do
229
+ setup do
230
+ assert_equal "before", @value
231
+ @value = "setup"
232
+ end
233
+
234
+ should "run before the current setup", :before => lambda { @value = "before" } do
235
+ assert_equal "setup", @value
236
+ end
237
+ end
238
+
239
+ context "a before statement" do
240
+ setup do
241
+ assert_equal "before", @value
242
+ @value = "setup"
243
+ end
244
+
245
+ before_should "run before the current setup" do
246
+ @value = "before"
247
+ end
248
+ end
249
+
250
+ context "A context" do
251
+ setup do
252
+ @value = "outer"
253
+ end
254
+
255
+ context "with a subcontext and a :before proc" do
256
+ before = lambda do
257
+ assert "outer", @value
258
+ @value = "before"
259
+ end
260
+ should "run after the parent setup", :before => before do
261
+ assert_equal "before", @value
262
+ end
263
+ end
264
+ end
265
+
266
+ end
@@ -0,0 +1,25 @@
1
+ # Filters added to this controller apply to all controllers in the application.
2
+ # Likewise, all the methods added will be available for all controllers.
3
+
4
+ class ApplicationController < ActionController::Base
5
+ # Pick a unique cookie name to distinguish our session data from others'
6
+ session :session_key => '_rails_root_session_id'
7
+
8
+ def ensure_logged_in
9
+ unless session[:logged_in]
10
+ respond_to do |accepts|
11
+ accepts.html do
12
+ flash[:error] = 'What do you think you\'re doing?'
13
+ redirect_to '/'
14
+ end
15
+ accepts.xml do
16
+ headers["Status"] = "Unauthorized"
17
+ headers["WWW-Authenticate"] = %(Basic realm="Web Password")
18
+ render :text => "Couldn't authenticate you", :status => '401 Unauthorized'
19
+ end
20
+ end
21
+ return false
22
+ end
23
+ return true
24
+ end
25
+ end
@@ -0,0 +1,86 @@
1
+ class PostsController < ApplicationController
2
+ before_filter :ensure_logged_in
3
+ before_filter :load_user
4
+
5
+ def index
6
+ @posts = @user.posts
7
+
8
+ respond_to do |format|
9
+ format.html # index.rhtml
10
+ format.xml { render :xml => @posts.to_xml }
11
+ format.rss do
12
+ headers['Content-Type'] = 'application/rss+xml'
13
+ session[:special] = '$2 off your next purchase'
14
+ session[:special_user_id] = @user.id
15
+ head :ok
16
+ end
17
+ end
18
+ end
19
+
20
+ def show
21
+ @post = @user.posts.find(params[:id])
22
+ @false_flag = false
23
+
24
+ respond_to do |format|
25
+ format.html { render :layout => 'wide' }
26
+ format.xml { render :xml => @post.to_xml }
27
+ end
28
+ end
29
+
30
+ def new
31
+ @post = @user.posts.build
32
+ render :layout => false
33
+ end
34
+
35
+ def edit
36
+ @post = @user.posts.find(params[:id])
37
+ end
38
+
39
+ def create
40
+ @post = @user.posts.build(params[:post])
41
+
42
+ respond_to do |format|
43
+ if @post.save
44
+ flash[:notice] = 'Post was successfully created.'
45
+ format.html { redirect_to user_post_url(@post.user, @post) }
46
+ format.xml { head :created, :location => user_post_url(@post.user, @post) }
47
+ else
48
+ format.html { render :action => "new" }
49
+ format.xml { render :xml => @post.errors.to_xml }
50
+ end
51
+ end
52
+ end
53
+
54
+ def update
55
+ @post = @user.posts.find(params[:id])
56
+
57
+ respond_to do |format|
58
+ if @post.update_attributes(params[:post])
59
+ flash[:notice] = 'Post was successfully updated.'
60
+ format.html { redirect_to user_post_url(@post.user, @post) }
61
+ format.xml { head :ok }
62
+ else
63
+ format.html { render :action => "edit" }
64
+ format.xml { render :xml => @post.errors.to_xml }
65
+ end
66
+ end
67
+ end
68
+
69
+ def destroy
70
+ @post = @user.posts.find(params[:id])
71
+ @post.destroy
72
+
73
+ flash[:notice] = "Post was removed"
74
+
75
+ respond_to do |format|
76
+ format.html { redirect_to user_posts_url(@post.user) }
77
+ format.xml { head :ok }
78
+ end
79
+ end
80
+
81
+ private
82
+
83
+ def load_user
84
+ @user = User.find(params[:user_id])
85
+ end
86
+ end