technicalpickles-shoulda 2.0.0
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.
- data/CONTRIBUTION_GUIDELINES.rdoc +12 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +132 -0
- data/Rakefile +72 -0
- data/bin/convert_to_should_syntax +42 -0
- data/lib/shoulda/action_mailer/assertions.rb +39 -0
- data/lib/shoulda/action_mailer.rb +10 -0
- data/lib/shoulda/active_record/assertions.rb +84 -0
- data/lib/shoulda/active_record/macros.rb +684 -0
- data/lib/shoulda/active_record.rb +12 -0
- data/lib/shoulda/assertions.rb +45 -0
- data/lib/shoulda/context.rb +309 -0
- data/lib/shoulda/controller/formats/html.rb +201 -0
- data/lib/shoulda/controller/formats/xml.rb +170 -0
- data/lib/shoulda/controller/helpers.rb +64 -0
- data/lib/shoulda/controller/macros.rb +171 -0
- data/lib/shoulda/controller/resource_options.rb +236 -0
- data/lib/shoulda/controller/routing/macros.rb +47 -0
- data/lib/shoulda/controller/routing.rb +10 -0
- data/lib/shoulda/controller.rb +31 -0
- data/lib/shoulda/helpers.rb +10 -0
- data/lib/shoulda/macros.rb +80 -0
- data/lib/shoulda/private_helpers.rb +22 -0
- data/lib/shoulda/proc_extensions.rb +14 -0
- data/lib/shoulda/rails.rb +19 -0
- data/lib/shoulda/tasks/list_tests.rake +24 -0
- data/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
- data/lib/shoulda/tasks.rb +3 -0
- data/lib/shoulda.rb +16 -0
- data/test/README +36 -0
- data/test/fixtures/addresses.yml +3 -0
- data/test/fixtures/friendships.yml +0 -0
- data/test/fixtures/posts.yml +5 -0
- data/test/fixtures/products.yml +0 -0
- data/test/fixtures/taggings.yml +0 -0
- data/test/fixtures/tags.yml +9 -0
- data/test/fixtures/users.yml +6 -0
- data/test/functional/posts_controller_test.rb +72 -0
- data/test/functional/users_controller_test.rb +36 -0
- data/test/other/context_test.rb +145 -0
- data/test/other/convert_to_should_syntax_test.rb +63 -0
- data/test/other/helpers_test.rb +183 -0
- data/test/other/private_helpers_test.rb +34 -0
- data/test/other/should_test.rb +266 -0
- data/test/rails_root/app/controllers/application.rb +25 -0
- data/test/rails_root/app/controllers/posts_controller.rb +78 -0
- data/test/rails_root/app/controllers/users_controller.rb +81 -0
- data/test/rails_root/app/helpers/application_helper.rb +3 -0
- data/test/rails_root/app/helpers/posts_helper.rb +2 -0
- data/test/rails_root/app/helpers/users_helper.rb +2 -0
- data/test/rails_root/app/models/address.rb +7 -0
- data/test/rails_root/app/models/dog.rb +5 -0
- data/test/rails_root/app/models/flea.rb +3 -0
- data/test/rails_root/app/models/friendship.rb +4 -0
- data/test/rails_root/app/models/post.rb +12 -0
- data/test/rails_root/app/models/product.rb +12 -0
- data/test/rails_root/app/models/tag.rb +8 -0
- data/test/rails_root/app/models/tagging.rb +4 -0
- data/test/rails_root/app/models/user.rb +28 -0
- data/test/rails_root/app/views/layouts/posts.rhtml +17 -0
- data/test/rails_root/app/views/layouts/users.rhtml +17 -0
- data/test/rails_root/app/views/posts/edit.rhtml +27 -0
- data/test/rails_root/app/views/posts/index.rhtml +25 -0
- data/test/rails_root/app/views/posts/new.rhtml +26 -0
- data/test/rails_root/app/views/posts/show.rhtml +18 -0
- data/test/rails_root/app/views/users/edit.rhtml +22 -0
- data/test/rails_root/app/views/users/index.rhtml +22 -0
- data/test/rails_root/app/views/users/new.rhtml +21 -0
- data/test/rails_root/app/views/users/show.rhtml +13 -0
- data/test/rails_root/config/boot.rb +109 -0
- data/test/rails_root/config/database.yml +4 -0
- data/test/rails_root/config/environment.rb +14 -0
- data/test/rails_root/config/environments/sqlite3.rb +0 -0
- data/test/rails_root/config/initializers/new_rails_defaults.rb +15 -0
- data/test/rails_root/config/initializers/shoulda.rb +8 -0
- data/test/rails_root/config/routes.rb +6 -0
- data/test/rails_root/db/migrate/001_create_users.rb +18 -0
- data/test/rails_root/db/migrate/002_create_posts.rb +13 -0
- data/test/rails_root/db/migrate/003_create_taggings.rb +12 -0
- data/test/rails_root/db/migrate/004_create_tags.rb +11 -0
- data/test/rails_root/db/migrate/005_create_dogs.rb +12 -0
- data/test/rails_root/db/migrate/006_create_addresses.rb +14 -0
- data/test/rails_root/db/migrate/007_create_fleas.rb +11 -0
- data/test/rails_root/db/migrate/008_create_dogs_fleas.rb +12 -0
- data/test/rails_root/db/migrate/009_create_products.rb +17 -0
- data/test/rails_root/db/migrate/010_create_friendships.rb +14 -0
- data/test/rails_root/db/schema.rb +0 -0
- data/test/rails_root/public/404.html +30 -0
- data/test/rails_root/public/422.html +30 -0
- data/test/rails_root/public/500.html +30 -0
- data/test/rails_root/script/console +3 -0
- data/test/rails_root/script/generate +3 -0
- data/test/test_helper.rb +31 -0
- data/test/unit/address_test.rb +10 -0
- data/test/unit/dog_test.rb +7 -0
- data/test/unit/flea_test.rb +6 -0
- data/test/unit/friendship_test.rb +6 -0
- data/test/unit/post_test.rb +15 -0
- data/test/unit/product_test.rb +27 -0
- data/test/unit/tag_test.rb +10 -0
- data/test/unit/tagging_test.rb +6 -0
- data/test/unit/user_test.rb +47 -0
- metadata +197 -0
|
@@ -0,0 +1,183 @@
|
|
|
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
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class PrivateHelpersTest < Test::Unit::TestCase # :nodoc:
|
|
4
|
+
include ThoughtBot::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
|
+
Thoughtbot::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 = Thoughtbot::Shoulda::Context.new("Parent", self) do; end
|
|
129
|
+
child = Thoughtbot::Shoulda::Context.new("Child", parent) do; end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def test_should_name_a_contexts_correctly
|
|
134
|
+
parent = Thoughtbot::Shoulda::Context.new("Parent", self) do; end
|
|
135
|
+
child = Thoughtbot::Shoulda::Context.new("Child", parent) do; end
|
|
136
|
+
grandchild = Thoughtbot::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 = Thoughtbot::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 = Thoughtbot::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 = Thoughtbot::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 = Thoughtbot::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 = Thoughtbot::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
|
+
Thoughtbot::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
|
+
Thoughtbot::Shoulda::Context.any_instance.expects(:should).with("rock", {}).returns(s)
|
|
213
|
+
Thoughtbot::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
|
+
Thoughtbot::Shoulda::Context.any_instance.expects(:should_eventually).with("rock").returns(s)
|
|
220
|
+
Thoughtbot::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,78 @@
|
|
|
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
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def show
|
|
15
|
+
@post = @user.posts.find(params[:id])
|
|
16
|
+
|
|
17
|
+
respond_to do |format|
|
|
18
|
+
format.html # show.rhtml
|
|
19
|
+
format.xml { render :xml => @post.to_xml }
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def new
|
|
24
|
+
@post = @user.posts.build
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def edit
|
|
28
|
+
@post = @user.posts.find(params[:id])
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def create
|
|
32
|
+
@post = @user.posts.build(params[:post])
|
|
33
|
+
|
|
34
|
+
respond_to do |format|
|
|
35
|
+
if @post.save
|
|
36
|
+
flash[:notice] = 'Post was successfully created.'
|
|
37
|
+
format.html { redirect_to user_post_url(@post.user, @post) }
|
|
38
|
+
format.xml { head :created, :location => user_post_url(@post.user, @post) }
|
|
39
|
+
else
|
|
40
|
+
format.html { render :action => "new" }
|
|
41
|
+
format.xml { render :xml => @post.errors.to_xml }
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def update
|
|
47
|
+
@post = @user.posts.find(params[:id])
|
|
48
|
+
|
|
49
|
+
respond_to do |format|
|
|
50
|
+
if @post.update_attributes(params[:post])
|
|
51
|
+
flash[:notice] = 'Post was successfully updated.'
|
|
52
|
+
format.html { redirect_to user_post_url(@post.user, @post) }
|
|
53
|
+
format.xml { head :ok }
|
|
54
|
+
else
|
|
55
|
+
format.html { render :action => "edit" }
|
|
56
|
+
format.xml { render :xml => @post.errors.to_xml }
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def destroy
|
|
62
|
+
@post = @user.posts.find(params[:id])
|
|
63
|
+
@post.destroy
|
|
64
|
+
|
|
65
|
+
flash[:notice] = "Post was removed"
|
|
66
|
+
|
|
67
|
+
respond_to do |format|
|
|
68
|
+
format.html { redirect_to user_posts_url(@post.user) }
|
|
69
|
+
format.xml { head :ok }
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def load_user
|
|
76
|
+
@user = User.find(params[:user_id])
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
class UsersController < ApplicationController
|
|
2
|
+
# GET /users
|
|
3
|
+
# GET /users.xml
|
|
4
|
+
def index
|
|
5
|
+
@users = User.find(:all)
|
|
6
|
+
|
|
7
|
+
respond_to do |format|
|
|
8
|
+
format.html # index.rhtml
|
|
9
|
+
format.xml { render :xml => @users.to_xml }
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# GET /users/1
|
|
14
|
+
# GET /users/1.xml
|
|
15
|
+
def show
|
|
16
|
+
@user = User.find(params[:id])
|
|
17
|
+
|
|
18
|
+
respond_to do |format|
|
|
19
|
+
format.html # show.rhtml
|
|
20
|
+
format.xml { render :xml => @user.to_xml }
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# GET /users/new
|
|
25
|
+
def new
|
|
26
|
+
@user = User.new
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# GET /users/1;edit
|
|
30
|
+
def edit
|
|
31
|
+
@user = User.find(params[:id])
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# POST /users
|
|
35
|
+
# POST /users.xml
|
|
36
|
+
def create
|
|
37
|
+
@user = User.new(params[:user])
|
|
38
|
+
|
|
39
|
+
respond_to do |format|
|
|
40
|
+
if @user.save
|
|
41
|
+
flash[:notice] = 'User was successfully created.'
|
|
42
|
+
format.html { redirect_to user_url(@user) }
|
|
43
|
+
format.xml { head :created, :location => user_url(@user) }
|
|
44
|
+
else
|
|
45
|
+
format.html { render :action => "new" }
|
|
46
|
+
format.xml { render :xml => @user.errors.to_xml }
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# PUT /users/1
|
|
52
|
+
# PUT /users/1.xml
|
|
53
|
+
def update
|
|
54
|
+
@user = User.find(params[:id])
|
|
55
|
+
|
|
56
|
+
respond_to do |format|
|
|
57
|
+
if @user.update_attributes(params[:user])
|
|
58
|
+
flash[:notice] = 'User was successfully updated.'
|
|
59
|
+
format.html { redirect_to user_url(@user) }
|
|
60
|
+
format.xml { head :ok }
|
|
61
|
+
else
|
|
62
|
+
format.html { render :action => "edit" }
|
|
63
|
+
format.xml { render :xml => @user.errors.to_xml }
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# DELETE /users/1
|
|
69
|
+
# DELETE /users/1.xml
|
|
70
|
+
def destroy
|
|
71
|
+
@user = User.find(params[:id])
|
|
72
|
+
@user.destroy
|
|
73
|
+
|
|
74
|
+
flash[:notice] = "User was removed"
|
|
75
|
+
|
|
76
|
+
respond_to do |format|
|
|
77
|
+
format.html { redirect_to users_url }
|
|
78
|
+
format.xml { head :ok }
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|