technicalpickles-shoulda 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|