shoulda 2.11.0 → 2.11.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.
- data/CONTRIBUTION_GUIDELINES.rdoc +5 -5
- data/README.rdoc +72 -89
- data/Rakefile +30 -13
- data/lib/shoulda.rb +5 -3
- data/lib/shoulda/action_controller/matchers.rb +5 -5
- data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +1 -1
- data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +9 -9
- data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +12 -12
- data/lib/shoulda/action_controller/matchers/route_matcher.rb +1 -1
- data/lib/shoulda/action_mailer/matchers/have_sent_email.rb +17 -26
- data/lib/shoulda/active_record/helpers.rb +2 -2
- data/lib/shoulda/active_record/macros.rb +2 -2
- data/lib/shoulda/active_record/matchers/association_matcher.rb +8 -8
- data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +1 -1
- data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +2 -2
- data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +11 -11
- data/lib/shoulda/active_record/matchers/have_db_index_matcher.rb +8 -8
- data/lib/shoulda/active_record/matchers/validate_format_of_matcher.rb +2 -4
- data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +3 -3
- data/lib/shoulda/active_record/matchers/validation_matcher.rb +0 -1
- data/lib/shoulda/assertions.rb +2 -2
- data/lib/shoulda/autoload_macros.rb +20 -20
- data/lib/shoulda/context.rb +2 -2
- data/lib/shoulda/{rspec.rb → integrations/rspec.rb} +0 -0
- data/lib/shoulda/integrations/rspec2.rb +22 -0
- data/lib/shoulda/{test_unit.rb → integrations/test_unit.rb} +0 -0
- data/lib/shoulda/macros.rb +32 -2
- data/lib/shoulda/tasks/yaml_to_shoulda.rake +11 -11
- data/lib/shoulda/version.rb +1 -1
- data/rails/init.rb +2 -2
- data/test/matchers/action_mailer/have_sent_email_test.rb +27 -10
- data/test/other/context_test.rb +22 -22
- data/test/other/convert_to_should_syntax_test.rb +1 -1
- data/test/other/private_helpers_test.rb +1 -1
- data/test/other/should_test.rb +12 -12
- data/test/rails2_model_builder.rb +4 -4
- data/test/rails2_root/log/test.log +5852 -0
- data/test/rails3_model_builder.rb +4 -4
- data/test/rails3_root/Gemfile +1 -1
- data/test/rails3_root/db/test.sqlite3 +0 -0
- data/test/rails3_root/log/test.log +5056 -0
- data/test/unit/flea_test.rb +1 -1
- metadata +5 -4
data/lib/shoulda/context.rb
CHANGED
@@ -116,7 +116,7 @@ module Shoulda
|
|
116
116
|
# context "on GET" do
|
117
117
|
# setup { get :index }
|
118
118
|
#
|
119
|
-
#
|
119
|
+
# should respond_with(:success)
|
120
120
|
#
|
121
121
|
# # runs before "get :index"
|
122
122
|
# before_should "find all users" do
|
@@ -215,7 +215,7 @@ module Shoulda
|
|
215
215
|
# subject { User.first }
|
216
216
|
#
|
217
217
|
# # uses the existing user
|
218
|
-
#
|
218
|
+
# should validate_uniqueness_of(:email)
|
219
219
|
# end
|
220
220
|
def subject(&block)
|
221
221
|
@subject_block = block
|
File without changes
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'shoulda/active_record/matchers'
|
2
|
+
require 'shoulda/action_controller/matchers'
|
3
|
+
require 'shoulda/action_mailer/matchers'
|
4
|
+
|
5
|
+
# :enddoc:
|
6
|
+
|
7
|
+
module RSpec
|
8
|
+
module Matchers
|
9
|
+
include Shoulda::ActiveRecord::Matchers
|
10
|
+
end
|
11
|
+
|
12
|
+
module Rails
|
13
|
+
module ControllerExampleGroup
|
14
|
+
include Shoulda::ActionController::Matchers
|
15
|
+
end
|
16
|
+
|
17
|
+
module MailerExampleGroup
|
18
|
+
include Shoulda::ActionMailer::Matchers
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
File without changes
|
data/lib/shoulda/macros.rb
CHANGED
@@ -36,8 +36,23 @@ module Shoulda # :nodoc:
|
|
36
36
|
#
|
37
37
|
# # Assert the value changed to "new:"
|
38
38
|
# should_change("the post title", :to => "new") { @post.title }
|
39
|
+
#
|
40
|
+
# This macro was deprecated because these tests aren't as valuable as
|
41
|
+
# alternative tests that explicitly test the final state.
|
42
|
+
#
|
43
|
+
# Consider an alternative:
|
44
|
+
#
|
45
|
+
# context "updating a post" do
|
46
|
+
# setup do
|
47
|
+
# @post = Post.create(:title => "old")
|
48
|
+
# put :update, :post => {:title => "new"}, :id => @post.to_param
|
49
|
+
# end
|
50
|
+
# should "update the title" do
|
51
|
+
# assert_equal "new", @post.reload.title
|
52
|
+
# end
|
53
|
+
# end
|
39
54
|
def should_change(description, options = {}, &block)
|
40
|
-
::ActiveSupport::Deprecation.warn
|
55
|
+
::ActiveSupport::Deprecation.warn("Not considered a useful test. Instead, test the end state explicitly.")
|
41
56
|
by, from, to = get_options!([options], :by, :from, :to)
|
42
57
|
stmt = "change #{description}"
|
43
58
|
stmt << " from #{from.inspect}" if from
|
@@ -69,8 +84,23 @@ module Shoulda # :nodoc:
|
|
69
84
|
# setup { @post.update_attributes(:title => "new") }
|
70
85
|
# should_not_change("the number of posts") { Post.count }
|
71
86
|
# end
|
87
|
+
#
|
88
|
+
# This macro was deprecated because these tests aren't as valuable as
|
89
|
+
# alternative tests that explicitly test the final state.
|
90
|
+
#
|
91
|
+
# Consider an alternative:
|
92
|
+
#
|
93
|
+
# context "updating a post" do
|
94
|
+
# setup do
|
95
|
+
# @post = Post.create(:title => "old")
|
96
|
+
# put :update, :post => {:title => ""}, :id => @post.to_param
|
97
|
+
# end
|
98
|
+
# should "not update the title" do
|
99
|
+
# assert_equal "old", @post.reload.title
|
100
|
+
# end
|
101
|
+
# end
|
72
102
|
def should_not_change(description, &block)
|
73
|
-
::ActiveSupport::Deprecation.warn
|
103
|
+
::ActiveSupport::Deprecation.warn("Not considered a useful test. Instead, test the end state explicitly.")
|
74
104
|
before = lambda { @_before_should_not_change = block.bind(self).call }
|
75
105
|
should "not change #{description}", :before => before do
|
76
106
|
new_value = block.bind(self).call
|
@@ -1,28 +1,28 @@
|
|
1
1
|
namespace :shoulda do
|
2
2
|
# From http://blog.internautdesign.com/2007/11/2/a-yaml_to_shoulda-rake-task
|
3
3
|
# David.Lowenfels@gmail.com
|
4
|
-
desc "Converts a YAML file (FILE=./path/to/yaml) into a Shoulda skeleton"
|
4
|
+
desc "Converts a YAML file (FILE=./path/to/yaml) into a Shoulda skeleton"
|
5
5
|
task :from_yaml do
|
6
6
|
require 'yaml'
|
7
|
-
|
7
|
+
|
8
8
|
def yaml_to_context(hash, indent = 0)
|
9
9
|
indent1 = ' ' * indent
|
10
10
|
indent2 = ' ' * (indent + 1)
|
11
11
|
hash.each_pair do |context, shoulds|
|
12
|
-
puts indent1 + "context \"#{context}\" do"
|
13
|
-
puts
|
12
|
+
puts indent1 + "context \"#{context}\" do"
|
13
|
+
puts
|
14
14
|
shoulds.each do |should|
|
15
15
|
yaml_to_context( should, indent + 1 ) and next if should.is_a?( Hash )
|
16
|
-
puts indent2 + "should_eventually \"" + should.gsub(/^should +/,'') + "\" do"
|
17
|
-
puts indent2 + "end"
|
16
|
+
puts indent2 + "should_eventually \"" + should.gsub(/^should +/,'') + "\" do"
|
17
|
+
puts indent2 + "end"
|
18
18
|
puts
|
19
19
|
end
|
20
|
-
puts indent1 + "end"
|
20
|
+
puts indent1 + "end"
|
21
21
|
end
|
22
|
-
end
|
23
|
-
|
22
|
+
end
|
23
|
+
|
24
24
|
puts("Please pass in a FILE argument.") and exit unless ENV['FILE']
|
25
|
-
|
25
|
+
|
26
26
|
yaml_to_context( YAML.load_file( ENV['FILE'] ) )
|
27
27
|
end
|
28
|
-
end
|
28
|
+
end
|
data/lib/shoulda/version.rb
CHANGED
data/rails/init.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
if RAILS_ENV == 'test'
|
2
2
|
if defined? Spec
|
3
|
-
require 'shoulda/rspec'
|
3
|
+
require 'shoulda/integrations/rspec'
|
4
4
|
else
|
5
|
-
require 'shoulda/
|
5
|
+
require 'shoulda/integrations/test_unit'
|
6
6
|
Shoulda.autoload_macros RAILS_ROOT, File.join("vendor", "{plugins,gems}", "*")
|
7
7
|
end
|
8
8
|
end
|
@@ -1,6 +1,14 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class HaveSentEmailTest < ActiveSupport::TestCase # :nodoc:
|
4
|
+
def add_mail_to_deliveries
|
5
|
+
if defined?(AbstractController::Rendering)
|
6
|
+
::ActionMailer::Base.deliveries << Mailer.the_email
|
7
|
+
else
|
8
|
+
::ActionMailer::Base.deliveries << Mailer.create_the_email
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
4
12
|
context "an email" do
|
5
13
|
setup do
|
6
14
|
define_mailer :mailer, [:the_email] do
|
@@ -18,31 +26,40 @@ class HaveSentEmailTest < ActiveSupport::TestCase # :nodoc:
|
|
18
26
|
end
|
19
27
|
end
|
20
28
|
end
|
21
|
-
|
22
|
-
::ActionMailer::Base.deliveries << Mailer.the_email
|
23
|
-
else
|
24
|
-
::ActionMailer::Base.deliveries << Mailer.create_the_email
|
25
|
-
end
|
29
|
+
add_mail_to_deliveries
|
26
30
|
end
|
27
31
|
|
32
|
+
teardown { ::ActionMailer::Base.deliveries.clear }
|
33
|
+
|
28
34
|
should "accept based on the subject" do
|
29
35
|
assert_accepts have_sent_email.with_subject(/is spam$/), nil
|
30
|
-
assert_rejects have_sent_email.with_subject(/totally safe/), nil
|
36
|
+
assert_rejects have_sent_email.with_subject(/totally safe/), nil,
|
37
|
+
:message => /Expected sent email with subject/
|
31
38
|
end
|
32
39
|
|
33
40
|
should "accept based on the sender" do
|
34
41
|
assert_accepts have_sent_email.from('do-not-reply@example.com'), nil
|
35
|
-
assert_rejects have_sent_email.from('you@example.com'), nil
|
42
|
+
assert_rejects have_sent_email.from('you@example.com'), nil,
|
43
|
+
:message => /Expected sent email from/
|
36
44
|
end
|
37
45
|
|
38
46
|
should "accept based on the body" do
|
39
47
|
assert_accepts have_sent_email.with_body(/is spam\./), nil
|
40
|
-
assert_rejects have_sent_email.with_body(/totally safe/), nil
|
48
|
+
assert_rejects have_sent_email.with_body(/totally safe/), nil,
|
49
|
+
:message => /Expected sent email with body/
|
41
50
|
end
|
42
51
|
|
43
|
-
should "accept
|
52
|
+
should "accept based on the recipient" do
|
44
53
|
assert_accepts have_sent_email.to('myself@me.com'), nil
|
45
|
-
assert_rejects have_sent_email.to('you@example.com'), nil
|
54
|
+
assert_rejects have_sent_email.to('you@example.com'), nil,
|
55
|
+
:message => /Expected sent email to/
|
56
|
+
end
|
57
|
+
|
58
|
+
should "list all deliveries within failure message" do
|
59
|
+
add_mail_to_deliveries
|
60
|
+
|
61
|
+
assert_rejects have_sent_email.to('you@example.com'), nil,
|
62
|
+
:message => /Deliveries:\n"This is spam" to \["myself@me\.com"\]\n"This is spam" to \["myself@me\.com"\]/
|
46
63
|
end
|
47
64
|
|
48
65
|
should "chain" do
|
data/test/other/context_test.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class ContextTest < ActiveSupport::TestCase # :nodoc:
|
4
|
-
|
4
|
+
|
5
5
|
def self.context_macro(&blk)
|
6
6
|
context "with a subcontext made by a macro" do
|
7
7
|
setup { @context_macro = :foo }
|
8
8
|
|
9
|
-
merge_block &blk
|
9
|
+
merge_block &blk
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -21,11 +21,11 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
|
|
21
21
|
setup do
|
22
22
|
@blah = "blah"
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
should "run the setup block" do
|
26
26
|
assert_equal "blah", @blah
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
should "have name set right" do
|
30
30
|
assert_match(/^test: context with setup block/, self.to_s)
|
31
31
|
end
|
@@ -34,11 +34,11 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
|
|
34
34
|
setup do
|
35
35
|
@blah = "#{@blah} twice"
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
should "be named correctly" do
|
39
39
|
assert_match(/^test: context with setup block and a subcontext should be named correctly/, self.to_s)
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
should "run the setup blocks in order" do
|
43
43
|
assert_equal @blah, "blah twice"
|
44
44
|
end
|
@@ -64,7 +64,7 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
|
|
64
64
|
setup do
|
65
65
|
@blah = "foo"
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
should "have @blah == 'foo'" do
|
69
69
|
assert_equal "foo", @blah
|
70
70
|
end
|
@@ -73,12 +73,12 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
|
|
73
73
|
assert_match(/^test: another context with setup block/, self.to_s)
|
74
74
|
end
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
context "context with method definition" do
|
78
78
|
setup do
|
79
79
|
def hello; "hi"; end
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
should "be able to read that method" do
|
83
83
|
assert_equal "hi", hello
|
84
84
|
end
|
@@ -87,52 +87,52 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
|
|
87
87
|
assert_match(/^test: context with method definition/, self.to_s)
|
88
88
|
end
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
context "another context" do
|
92
92
|
should "not define @blah" do
|
93
93
|
assert_nil @blah
|
94
94
|
end
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
context "context with multiple setups and/or teardowns" do
|
98
|
-
|
98
|
+
|
99
99
|
cleanup_count = 0
|
100
|
-
|
100
|
+
|
101
101
|
2.times do |i|
|
102
102
|
setup { cleanup_count += 1 }
|
103
103
|
teardown { cleanup_count -= 1 }
|
104
104
|
end
|
105
|
-
|
105
|
+
|
106
106
|
2.times do |i|
|
107
107
|
should "call all setups and all teardowns (check ##{i + 1})" do
|
108
108
|
assert_equal 2, cleanup_count
|
109
109
|
end
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
context "subcontexts" do
|
113
|
-
|
113
|
+
|
114
114
|
2.times do |i|
|
115
115
|
setup { cleanup_count += 1 }
|
116
116
|
teardown { cleanup_count -= 1 }
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
2.times do |i|
|
120
120
|
should "also call all setups and all teardowns in parent and subcontext (check ##{i + 1})" do
|
121
121
|
assert_equal 4, cleanup_count
|
122
122
|
end
|
123
123
|
end
|
124
|
-
|
124
|
+
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
end
|
128
|
-
|
128
|
+
|
129
129
|
should_eventually "pass, since it's unimplemented" do
|
130
130
|
flunk "what?"
|
131
131
|
end
|
132
132
|
|
133
133
|
should_eventually "not require a block when using should_eventually"
|
134
134
|
should "pass without a block, as that causes it to piggyback to should_eventually"
|
135
|
-
|
135
|
+
|
136
136
|
context "context for testing should piggybacking" do
|
137
137
|
should "call should_eventually as we are not passing a block"
|
138
138
|
end
|
@@ -164,7 +164,7 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
|
|
164
164
|
should "return the result of the block as the subject" do
|
165
165
|
assert_equal @expected, subject
|
166
166
|
end
|
167
|
-
|
167
|
+
|
168
168
|
context "nested context block without a subject block" do
|
169
169
|
should "return the result of the parent context's subject block" do
|
170
170
|
assert_equal @expected, subject
|
data/test/other/should_test.rb
CHANGED
@@ -4,11 +4,11 @@ class ShouldTest < ActiveSupport::TestCase # :nodoc:
|
|
4
4
|
should "be able to define a should statement outside of a context" do
|
5
5
|
assert true
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
should "see the name of my class as ShouldTest" do
|
9
9
|
assert_equal "ShouldTest", self.class.name
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def self.should_see_class_methods
|
13
13
|
should "be able to see class methods" do
|
14
14
|
assert true
|
@@ -27,13 +27,13 @@ class ShouldTest < ActiveSupport::TestCase # :nodoc:
|
|
27
27
|
|
28
28
|
def self.should_see_blah
|
29
29
|
should "see @blah through a macro" do
|
30
|
-
assert @blah
|
30
|
+
assert @blah
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.should_not_see_blah
|
35
35
|
should "not see @blah through a macro" do
|
36
|
-
assert_nil @blah
|
36
|
+
assert_nil @blah
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -75,12 +75,12 @@ class ShouldTest < ActiveSupport::TestCase # :nodoc:
|
|
75
75
|
setup do
|
76
76
|
@blah = "blah"
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
should "have @blah == 'blah'" do
|
80
80
|
assert_equal "blah", @blah
|
81
81
|
end
|
82
82
|
should_see_blah
|
83
|
-
|
83
|
+
|
84
84
|
should "have name set right" do
|
85
85
|
assert_match(/^test: Context with setup block/, self.to_s)
|
86
86
|
end
|
@@ -89,11 +89,11 @@ class ShouldTest < ActiveSupport::TestCase # :nodoc:
|
|
89
89
|
setup do
|
90
90
|
@blah = "#{@blah} twice"
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
should "be named correctly" do
|
94
94
|
assert_match(/^test: Context with setup block and a subcontext should be named correctly/, self.to_s)
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
should "run the setup methods in order" do
|
98
98
|
assert_equal @blah, "blah twice"
|
99
99
|
end
|
@@ -105,7 +105,7 @@ class ShouldTest < ActiveSupport::TestCase # :nodoc:
|
|
105
105
|
setup do
|
106
106
|
@blah = "foo"
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
should "have @blah == 'foo'" do
|
110
110
|
assert_equal "foo", @blah
|
111
111
|
end
|
@@ -115,7 +115,7 @@ class ShouldTest < ActiveSupport::TestCase # :nodoc:
|
|
115
115
|
end
|
116
116
|
should_see_blah
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
should_eventually "pass, since it's a should_eventually" do
|
120
120
|
flunk "what?"
|
121
121
|
end
|
@@ -152,7 +152,7 @@ class ShouldTest < ActiveSupport::TestCase # :nodoc:
|
|
152
152
|
should "be good" do; end
|
153
153
|
should "another" do; end
|
154
154
|
end
|
155
|
-
|
155
|
+
|
156
156
|
names = context.shoulds.map {|s| s[:name]}
|
157
157
|
assert_equal ["another", "be good"], names.sort
|
158
158
|
end
|
@@ -164,7 +164,7 @@ class ShouldTest < ActiveSupport::TestCase # :nodoc:
|
|
164
164
|
setup do; "setup"; end
|
165
165
|
teardown do; "teardown"; end
|
166
166
|
end
|
167
|
-
|
167
|
+
|
168
168
|
assert_equal "setup", context.setup_blocks.first.call
|
169
169
|
assert_equal "teardown", context.teardown_blocks.first.call
|
170
170
|
end
|