rmm5t-shoulda 2.0.6 → 2.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/README.rdoc +38 -10
  2. data/Rakefile +5 -3
  3. data/lib/shoulda.rb +7 -15
  4. data/lib/shoulda/action_mailer.rb +1 -1
  5. data/lib/shoulda/action_mailer/assertions.rb +32 -33
  6. data/lib/shoulda/active_record.rb +6 -2
  7. data/lib/shoulda/active_record/assertions.rb +62 -81
  8. data/lib/shoulda/active_record/helpers.rb +40 -0
  9. data/lib/shoulda/active_record/macros.rb +511 -640
  10. data/lib/shoulda/active_record/matchers.rb +42 -0
  11. data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
  12. data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +102 -0
  13. data/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
  14. data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
  15. data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
  16. data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
  17. data/lib/shoulda/active_record/matchers/have_index_matcher.rb +105 -0
  18. data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +125 -0
  19. data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
  20. data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
  21. data/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
  22. data/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
  23. data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
  24. data/lib/shoulda/active_record/matchers/validation_matcher.rb +56 -0
  25. data/lib/shoulda/assertions.rb +50 -40
  26. data/lib/shoulda/autoload_macros.rb +46 -0
  27. data/lib/shoulda/context.rb +124 -126
  28. data/lib/shoulda/helpers.rb +5 -7
  29. data/lib/shoulda/macros.rb +63 -64
  30. data/lib/shoulda/private_helpers.rb +16 -18
  31. data/lib/shoulda/rails.rb +5 -11
  32. data/lib/shoulda/rspec.rb +9 -0
  33. data/lib/shoulda/tasks/list_tests.rake +6 -1
  34. data/lib/shoulda/test_unit.rb +19 -0
  35. data/rails/init.rb +7 -1
  36. data/test/README +2 -2
  37. data/test/fail_macros.rb +16 -16
  38. data/test/functional/posts_controller_test.rb +33 -24
  39. data/test/functional/users_controller_test.rb +0 -19
  40. data/test/model_builder.rb +106 -0
  41. data/test/other/autoload_macro_test.rb +18 -0
  42. data/test/other/helpers_test.rb +58 -0
  43. data/test/other/private_helpers_test.rb +1 -1
  44. data/test/other/should_test.rb +16 -16
  45. data/test/rails_root/app/controllers/posts_controller.rb +6 -5
  46. data/test/rails_root/app/models/pets/dog.rb +10 -0
  47. data/test/rails_root/app/models/treat.rb +3 -0
  48. data/test/rails_root/app/models/user.rb +2 -2
  49. data/test/rails_root/app/views/layouts/posts.rhtml +2 -0
  50. data/test/rails_root/config/database.yml +1 -1
  51. data/test/rails_root/config/environments/{sqlite3.rb → test.rb} +0 -0
  52. data/test/rails_root/db/migrate/001_create_users.rb +3 -2
  53. data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
  54. data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
  55. data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
  56. data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
  57. data/test/test_helper.rb +3 -1
  58. data/test/unit/address_test.rb +1 -1
  59. data/test/unit/dog_test.rb +5 -2
  60. data/test/unit/post_test.rb +7 -3
  61. data/test/unit/product_test.rb +2 -2
  62. data/test/unit/tag_test.rb +2 -1
  63. data/test/unit/user_test.rb +17 -8
  64. metadata +54 -4
  65. data/lib/shoulda/controller.rb +0 -30
  66. data/lib/shoulda/controller/formats/html.rb +0 -201
  67. data/lib/shoulda/controller/formats/xml.rb +0 -170
  68. data/lib/shoulda/controller/helpers.rb +0 -64
  69. data/lib/shoulda/controller/macros.rb +0 -316
  70. data/lib/shoulda/controller/resource_options.rb +0 -236
  71. data/test/rails_root/app/models/dog.rb +0 -5
@@ -16,23 +16,4 @@ class UsersControllerTest < Test::Unit::TestCase
16
16
 
17
17
  should_filter_params :ssn
18
18
 
19
- should_be_restful do |resource|
20
- resource.identifier = :id
21
- resource.klass = User
22
- resource.object = :user
23
- resource.parent = []
24
- resource.actions = [:index, :show, :new, :edit, :update, :create, :destroy]
25
- resource.formats = [:html, :xml]
26
-
27
- resource.create.params = { :name => "bob", :email => 'bob@bob.com', :age => 13, :ssn => "123456789"}
28
- resource.update.params = { :name => "sue" }
29
-
30
- resource.create.redirect = "user_url(@user)"
31
- resource.update.redirect = "user_url(@user)"
32
- resource.destroy.redirect = "users_url"
33
-
34
- resource.create.flash = /created/i
35
- resource.update.flash = /updated/i
36
- resource.destroy.flash = /removed/i
37
- end
38
19
  end
@@ -0,0 +1,106 @@
1
+ class Test::Unit::TestCase
2
+ def create_table(table_name, &block)
3
+ connection = ActiveRecord::Base.connection
4
+
5
+ begin
6
+ connection.execute("DROP TABLE IF EXISTS #{table_name}")
7
+ connection.create_table(table_name, &block)
8
+ @created_tables ||= []
9
+ @created_tables << table_name
10
+ connection
11
+ rescue Exception => e
12
+ connection.execute("DROP TABLE IF EXISTS #{table_name}")
13
+ raise e
14
+ end
15
+ end
16
+
17
+ def define_constant(class_name, base, &block)
18
+ class_name = class_name.to_s.camelize
19
+
20
+ klass = Class.new(base)
21
+ Object.const_set(class_name, klass)
22
+
23
+ klass.class_eval(&block) if block_given?
24
+
25
+ @defined_constants ||= []
26
+ @defined_constants << class_name
27
+
28
+ klass
29
+ end
30
+
31
+ def define_model_class(class_name, &block)
32
+ define_constant(class_name, ActiveRecord::Base, &block)
33
+ end
34
+
35
+ def define_model(name, columns = {}, &block)
36
+ class_name = name.to_s.pluralize.classify
37
+ table_name = class_name.tableize
38
+
39
+ create_table(table_name) do |table|
40
+ columns.each do |name, type|
41
+ table.column name, type
42
+ end
43
+ end
44
+
45
+ define_model_class(class_name, &block)
46
+ end
47
+
48
+ def define_controller(class_name, &block)
49
+ class_name = class_name.to_s
50
+ class_name << 'Controller' unless class_name =~ /Controller$/
51
+ define_constant(class_name, ActionController::Base, &block)
52
+ end
53
+
54
+ def define_routes(&block)
55
+ @replaced_routes = ActionController::Routing::Routes
56
+ new_routes = ActionController::Routing::RouteSet.new
57
+ silence_warnings do
58
+ ActionController::Routing.const_set('Routes', new_routes)
59
+ end
60
+ new_routes.draw(&block)
61
+ end
62
+
63
+ def build_response(&block)
64
+ klass = define_controller('Examples')
65
+ block ||= lambda { render :nothing => true }
66
+ klass.class_eval { define_method(:example, &block) }
67
+ define_routes do |map|
68
+ map.connect 'examples', :controller => 'examples', :action => 'example'
69
+ end
70
+
71
+ @controller = klass.new
72
+ @request = ActionController::TestRequest.new
73
+ @response = ActionController::TestResponse.new
74
+ get :example
75
+
76
+ @controller
77
+ end
78
+
79
+ def teardown_with_models
80
+ if @defined_constants
81
+ @defined_constants.each do |class_name|
82
+ Object.send(:remove_const, class_name)
83
+ end
84
+ end
85
+
86
+ if @created_tables
87
+ @created_tables.each do |table_name|
88
+ ActiveRecord::Base.
89
+ connection.
90
+ execute("DROP TABLE IF EXISTS #{table_name}")
91
+ end
92
+ end
93
+
94
+ if @replaced_routes
95
+ ActionController::Routing::Routes.clear!
96
+ silence_warnings do
97
+ ActionController::Routing.const_set('Routes', @replaced_routes)
98
+ end
99
+ @replaced_routes.reload!
100
+ end
101
+
102
+ teardown_without_models
103
+ end
104
+ alias_method :teardown_without_models, :teardown
105
+ alias_method :teardown, :teardown_with_models
106
+ end
@@ -0,0 +1,18 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class AutoloadMacroTest < Test::Unit::TestCase # :nodoc:
4
+ context "The macro auto-loader" do
5
+ should "load macros from the plugins" do
6
+ assert self.class.respond_to?('plugin_macro')
7
+ end
8
+
9
+ should "load macros from the gems" do
10
+ assert self.class.respond_to?('gem_macro')
11
+ end
12
+
13
+ should "load custom macros from ROOT/test/shoulda_macros" do
14
+ assert self.class.respond_to?('custom_macro')
15
+ end
16
+ end
17
+ end
18
+
@@ -180,4 +180,62 @@ class HelpersTest < Test::Unit::TestCase # :nodoc:
180
180
  end
181
181
  end
182
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
183
241
  end
@@ -1,7 +1,7 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
2
 
3
3
  class PrivateHelpersTest < Test::Unit::TestCase # :nodoc:
4
- include ThoughtBot::Shoulda::Private
4
+ include Shoulda::Private
5
5
  context "get_options!" do
6
6
  should "remove opts from args" do
7
7
  args = [:a, :b, {}]
@@ -119,21 +119,21 @@ class ShouldTest < Test::Unit::TestCase # :nodoc:
119
119
 
120
120
  def test_should_create_a_new_context
121
121
  assert_nothing_raised do
122
- Thoughtbot::Shoulda::Context.new("context name", self) do; end
122
+ Shoulda::Context.new("context name", self) do; end
123
123
  end
124
124
  end
125
125
 
126
126
  def test_should_create_a_nested_context
127
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
128
+ parent = Shoulda::Context.new("Parent", self) do; end
129
+ child = Shoulda::Context.new("Child", parent) do; end
130
130
  end
131
131
  end
132
132
 
133
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
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
137
 
138
138
  assert_equal "Parent", parent.full_name
139
139
  assert_equal "Parent Child", child.full_name
@@ -143,7 +143,7 @@ class ShouldTest < Test::Unit::TestCase # :nodoc:
143
143
  # Should statements
144
144
 
145
145
  def test_should_have_should_hashes_when_given_should_statements
146
- context = Thoughtbot::Shoulda::Context.new("name", self) do
146
+ context = Shoulda::Context.new("name", self) do
147
147
  should "be good" do; end
148
148
  should "another" do; end
149
149
  end
@@ -155,7 +155,7 @@ class ShouldTest < Test::Unit::TestCase # :nodoc:
155
155
  # setup and teardown
156
156
 
157
157
  def test_should_capture_setup_and_teardown_blocks
158
- context = Thoughtbot::Shoulda::Context.new("name", self) do
158
+ context = Shoulda::Context.new("name", self) do
159
159
  setup do; "setup"; end
160
160
  teardown do; "teardown"; end
161
161
  end
@@ -167,7 +167,7 @@ class ShouldTest < Test::Unit::TestCase # :nodoc:
167
167
  # building
168
168
 
169
169
  def test_should_create_shoulda_test_for_each_should_on_build
170
- context = Thoughtbot::Shoulda::Context.new("name", self) do
170
+ context = Shoulda::Context.new("name", self) do
171
171
  should "one" do; end
172
172
  should "two" do; end
173
173
  end
@@ -178,7 +178,7 @@ class ShouldTest < Test::Unit::TestCase # :nodoc:
178
178
 
179
179
  def test_should_create_test_methods_on_build
180
180
  tu_class = Test::Unit::TestCase
181
- context = Thoughtbot::Shoulda::Context.new("A Context", tu_class) do
181
+ context = Shoulda::Context.new("A Context", tu_class) do
182
182
  should "define the test" do; end
183
183
  end
184
184
 
@@ -188,7 +188,7 @@ class ShouldTest < Test::Unit::TestCase # :nodoc:
188
188
 
189
189
  def test_should_create_test_methods_on_build_when_subcontext
190
190
  tu_class = Test::Unit::TestCase
191
- context = Thoughtbot::Shoulda::Context.new("A Context", tu_class) do
191
+ context = Shoulda::Context.new("A Context", tu_class) do
192
192
  context "with a child" do
193
193
  should "define the test" do; end
194
194
  end
@@ -203,21 +203,21 @@ class ShouldTest < Test::Unit::TestCase # :nodoc:
203
203
  def test_should_create_a_new_context_and_build_it_on_Test_Unit_context
204
204
  c = mock("context")
205
205
  c.expects(:build)
206
- Thoughtbot::Shoulda::Context.expects(:new).with("foo", kind_of(Class)).returns(c)
206
+ Shoulda::Context.expects(:new).with("foo", kind_of(Class)).returns(c)
207
207
  self.class.context "foo" do; end
208
208
  end
209
209
 
210
210
  def test_should_create_a_one_off_context_and_build_it_on_Test_Unit_should
211
211
  s = mock("test")
212
- Thoughtbot::Shoulda::Context.any_instance.expects(:should).with("rock", {}).returns(s)
213
- Thoughtbot::Shoulda::Context.any_instance.expects(:build)
212
+ Shoulda::Context.any_instance.expects(:should).with("rock", {}).returns(s)
213
+ Shoulda::Context.any_instance.expects(:build)
214
214
  self.class.should "rock" do; end
215
215
  end
216
216
 
217
217
  def test_should_create_a_one_off_context_and_build_it_on_Test_Unit_should_eventually
218
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)
219
+ Shoulda::Context.any_instance.expects(:should_eventually).with("rock").returns(s)
220
+ Shoulda::Context.any_instance.expects(:build)
221
221
  self.class.should_eventually "rock" do; end
222
222
  end
223
223
 
@@ -1,7 +1,7 @@
1
1
  class PostsController < ApplicationController
2
2
  before_filter :ensure_logged_in
3
3
  before_filter :load_user
4
-
4
+
5
5
  def index
6
6
  @posts = @user.posts
7
7
 
@@ -19,6 +19,7 @@ class PostsController < ApplicationController
19
19
 
20
20
  def show
21
21
  @post = @user.posts.find(params[:id])
22
+ @false_flag = false
22
23
 
23
24
  respond_to do |format|
24
25
  format.html { render :layout => 'wide' }
@@ -68,17 +69,17 @@ class PostsController < ApplicationController
68
69
  def destroy
69
70
  @post = @user.posts.find(params[:id])
70
71
  @post.destroy
71
-
72
+
72
73
  flash[:notice] = "Post was removed"
73
-
74
+
74
75
  respond_to do |format|
75
76
  format.html { redirect_to user_posts_url(@post.user) }
76
77
  format.xml { head :ok }
77
78
  end
78
79
  end
79
-
80
+
80
81
  private
81
-
82
+
82
83
  def load_user
83
84
  @user = User.find(params[:user_id])
84
85
  end
@@ -0,0 +1,10 @@
1
+ module Pets
2
+ class Dog < ActiveRecord::Base
3
+ belongs_to :user, :foreign_key => :owner_id
4
+ belongs_to :address, :dependent => :destroy
5
+ has_many :treats
6
+ has_and_belongs_to_many :fleas, :join_table => :fleas
7
+ validates_presence_of :treats, :fleas
8
+ validates_presence_of :owner_id
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ class Treat < ActiveRecord::Base
2
+
3
+ end
@@ -1,6 +1,6 @@
1
1
  class User < ActiveRecord::Base
2
2
  has_many :posts
3
- has_many :dogs, :foreign_key => :owner_id
3
+ has_many :dogs, :foreign_key => :owner_id, :class_name => "Pets::Dog"
4
4
 
5
5
  has_many :friendships
6
6
  has_many :friends, :through => :friendships
@@ -22,7 +22,7 @@ class User < ActiveRecord::Base
22
22
  validates_length_of :email, :in => 1..100
23
23
  validates_inclusion_of :age, :in => 1..100
24
24
  validates_acceptance_of :eula
25
- validates_uniqueness_of :email, :scope => :name
25
+ validates_uniqueness_of :email, :scope => :name, :case_sensitive => false
26
26
  validates_length_of :ssn, :is => 9, :message => "Social Security Number is not the right length"
27
27
  validates_numericality_of :ssn
28
28
  end
@@ -4,6 +4,8 @@
4
4
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
5
  <head>
6
6
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7
+ <meta name="description" content="Posts, posts and more posts" />
8
+ <meta name='keywords' content='posts' />
7
9
  <title>Posts: <%= controller.action_name %></title>
8
10
  <%= stylesheet_link_tag 'scaffold' %>
9
11
  </head>
@@ -1,4 +1,4 @@
1
- sqlite3:
1
+ test:
2
2
  :adapter: sqlite3
3
3
  # :dbfile: db/sqlite3.db
4
4
  :dbfile: ":memory:"
@@ -5,11 +5,12 @@ class CreateUsers < ActiveRecord::Migration
5
5
  t.column :email, :string
6
6
  t.column :age, :integer
7
7
  t.column :ssn, :string
8
+ t.column :phone, :string
8
9
  end
9
- add_index :users, :email
10
+ add_index :users, :email, :unique => true
10
11
  add_index :users, :name
11
12
  add_index :users, :age
12
- add_index :users, [:email, :name]
13
+ add_index :users, [:email, :name], :unique => true
13
14
  end
14
15
 
15
16
  def self.down
@@ -0,0 +1,12 @@
1
+ class CreateTreats < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :treats do |t|
4
+ t.integer :dog_id
5
+ t.timestamps
6
+ end
7
+ end
8
+
9
+ def self.down
10
+ drop_table :treats
11
+ end
12
+ end