faster_shoulda 2.11.3
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 +10 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +154 -0
- data/Rakefile +74 -0
- data/bin/convert_to_should_syntax +42 -0
- data/lib/shoulda/action_controller/macros.rb +221 -0
- data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +114 -0
- data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +74 -0
- data/lib/shoulda/action_controller/matchers/redirect_to_matcher.rb +62 -0
- data/lib/shoulda/action_controller/matchers/render_template_matcher.rb +54 -0
- data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +99 -0
- data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +74 -0
- data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +85 -0
- data/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
- data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +98 -0
- data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +100 -0
- data/lib/shoulda/action_controller/matchers.rb +39 -0
- data/lib/shoulda/action_controller.rb +34 -0
- data/lib/shoulda/action_mailer/assertions.rb +42 -0
- data/lib/shoulda/action_mailer/matchers/have_sent_email.rb +110 -0
- data/lib/shoulda/action_mailer/matchers.rb +22 -0
- data/lib/shoulda/action_mailer.rb +13 -0
- data/lib/shoulda/active_record/assertions.rb +69 -0
- data/lib/shoulda/active_record/helpers.rb +32 -0
- data/lib/shoulda/active_record/macros.rb +457 -0
- data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
- data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +110 -0
- data/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
- data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
- data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
- data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
- data/lib/shoulda/active_record/matchers/have_db_index_matcher.rb +112 -0
- data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
- data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
- data/lib/shoulda/active_record/matchers/validate_format_of_matcher.rb +65 -0
- data/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
- data/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
- data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
- data/lib/shoulda/active_record/matchers/validation_matcher.rb +56 -0
- data/lib/shoulda/active_record/matchers.rb +42 -0
- data/lib/shoulda/active_record.rb +16 -0
- data/lib/shoulda/assertions.rb +79 -0
- data/lib/shoulda/autoload_macros.rb +46 -0
- data/lib/shoulda/context.rb +537 -0
- data/lib/shoulda/helpers.rb +8 -0
- data/lib/shoulda/integrations/rspec.rb +13 -0
- data/lib/shoulda/integrations/rspec2.rb +22 -0
- data/lib/shoulda/integrations/test_unit.rb +22 -0
- data/lib/shoulda/macros.rb +161 -0
- data/lib/shoulda/private_helpers.rb +13 -0
- data/lib/shoulda/proc_extensions.rb +14 -0
- data/lib/shoulda/rails.rb +8 -0
- data/lib/shoulda/tasks/list_tests.rake +29 -0
- data/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
- data/lib/shoulda/tasks.rb +3 -0
- data/lib/shoulda/version.rb +4 -0
- data/lib/shoulda.rb +9 -0
- data/rails/init.rb +8 -0
- data/test/README +36 -0
- data/test/fail_macros.rb +55 -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 +121 -0
- data/test/functional/users_controller_test.rb +19 -0
- data/test/hello_should.rb +37 -0
- data/test/matchers/action_mailer/have_sent_email_test.rb +76 -0
- data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +74 -0
- data/test/matchers/active_record/allow_value_matcher_test.rb +64 -0
- data/test/matchers/active_record/association_matcher_test.rb +263 -0
- data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +81 -0
- data/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
- data/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
- data/test/matchers/active_record/have_db_index_matcher_test.rb +91 -0
- data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
- data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
- data/test/matchers/active_record/validate_format_of_matcher_test.rb +39 -0
- data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
- data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
- data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
- data/test/matchers/controller/assign_to_matcher_test.rb +55 -0
- data/test/matchers/controller/filter_param_matcher_test.rb +40 -0
- data/test/matchers/controller/redirect_to_matcher_test.rb +37 -0
- data/test/matchers/controller/render_template_matcher_test.rb +37 -0
- data/test/matchers/controller/render_with_layout_matcher_test.rb +47 -0
- data/test/matchers/controller/respond_with_content_type_matcher_test.rb +32 -0
- data/test/matchers/controller/respond_with_matcher_test.rb +96 -0
- data/test/matchers/controller/route_matcher_test.rb +75 -0
- data/test/matchers/controller/set_session_matcher_test.rb +48 -0
- data/test/matchers/controller/set_the_flash_matcher.rb +95 -0
- data/test/other/autoload_macro_test.rb +18 -0
- data/test/other/context_test.rb +372 -0
- data/test/other/convert_to_should_syntax_test.rb +63 -0
- data/test/other/helpers_test.rb +317 -0
- data/test/other/private_helpers_test.rb +32 -0
- data/test/other/should_test.rb +271 -0
- data/test/rails2_model_builder.rb +130 -0
- data/test/rails2_root/app/controllers/application_controller.rb +22 -0
- data/test/rails2_root/app/controllers/posts_controller.rb +87 -0
- data/test/rails2_root/app/controllers/users_controller.rb +84 -0
- data/test/rails2_root/app/helpers/application_helper.rb +3 -0
- data/test/rails2_root/app/helpers/posts_helper.rb +2 -0
- data/test/rails2_root/app/helpers/users_helper.rb +2 -0
- data/test/rails2_root/app/models/address.rb +7 -0
- data/test/rails2_root/app/models/flea.rb +11 -0
- data/test/rails2_root/app/models/friendship.rb +4 -0
- data/test/rails2_root/app/models/notifier.rb +8 -0
- data/test/rails2_root/app/models/pets/cat.rb +7 -0
- data/test/rails2_root/app/models/pets/dog.rb +10 -0
- data/test/rails2_root/app/models/post.rb +12 -0
- data/test/rails2_root/app/models/product.rb +12 -0
- data/test/rails2_root/app/models/profile.rb +2 -0
- data/test/rails2_root/app/models/registration.rb +2 -0
- data/test/rails2_root/app/models/tag.rb +8 -0
- data/test/rails2_root/app/models/tagging.rb +4 -0
- data/test/rails2_root/app/models/treat.rb +3 -0
- data/test/rails2_root/app/models/user.rb +32 -0
- data/test/rails2_root/app/views/layouts/posts.rhtml +19 -0
- data/test/rails2_root/app/views/layouts/users.rhtml +17 -0
- data/test/rails2_root/app/views/layouts/wide.html.erb +1 -0
- data/test/rails2_root/app/views/notifier/the_email.html.erb +1 -0
- data/test/rails2_root/app/views/posts/edit.rhtml +27 -0
- data/test/rails2_root/app/views/posts/index.rhtml +25 -0
- data/test/rails2_root/app/views/posts/new.rhtml +26 -0
- data/test/rails2_root/app/views/posts/show.rhtml +18 -0
- data/test/rails2_root/app/views/users/edit.rhtml +22 -0
- data/test/rails2_root/app/views/users/index.rhtml +22 -0
- data/test/rails2_root/app/views/users/new.rhtml +21 -0
- data/test/rails2_root/app/views/users/show.rhtml +13 -0
- data/test/rails2_root/config/boot.rb +110 -0
- data/test/rails2_root/config/database.yml +4 -0
- data/test/rails2_root/config/environment.rb +17 -0
- data/test/rails2_root/config/environments/test.rb +23 -0
- data/test/rails2_root/config/initializers/new_rails_defaults.rb +15 -0
- data/test/rails2_root/config/initializers/shoulda.rb +8 -0
- data/test/rails2_root/config/routes.rb +6 -0
- data/test/rails2_root/db/migrate/001_create_users.rb +19 -0
- data/test/rails2_root/db/migrate/002_create_posts.rb +13 -0
- data/test/rails2_root/db/migrate/003_create_taggings.rb +12 -0
- data/test/rails2_root/db/migrate/004_create_tags.rb +11 -0
- data/test/rails2_root/db/migrate/005_create_dogs.rb +12 -0
- data/test/rails2_root/db/migrate/006_create_addresses.rb +14 -0
- data/test/rails2_root/db/migrate/007_create_fleas.rb +11 -0
- data/test/rails2_root/db/migrate/008_create_dogs_fleas.rb +12 -0
- data/test/rails2_root/db/migrate/009_create_products.rb +17 -0
- data/test/rails2_root/db/migrate/010_create_friendships.rb +14 -0
- data/test/rails2_root/db/migrate/011_create_treats.rb +12 -0
- data/test/rails2_root/db/migrate/20090506203502_create_profiles.rb +12 -0
- data/test/rails2_root/db/migrate/20090506203536_create_registrations.rb +14 -0
- data/test/rails2_root/db/migrate/20090513104502_create_cats.rb +12 -0
- data/test/rails2_root/db/schema.rb +0 -0
- data/test/rails2_root/public/404.html +30 -0
- data/test/rails2_root/public/422.html +30 -0
- data/test/rails2_root/public/500.html +30 -0
- data/test/rails2_root/script/console +3 -0
- data/test/rails2_root/script/generate +3 -0
- data/test/rails2_root/test/shoulda_macros/custom_macro.rb +6 -0
- data/test/rails2_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
- data/test/rails2_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
- data/test/rails2_test_helper.rb +6 -0
- data/test/rails3_model_builder.rb +118 -0
- data/test/rails3_root/Gemfile +28 -0
- data/test/rails3_root/README +244 -0
- data/test/rails3_root/Rakefile +10 -0
- data/test/rails3_root/app/controllers/application_controller.rb +22 -0
- data/test/rails3_root/app/controllers/posts_controller.rb +87 -0
- data/test/rails3_root/app/controllers/users_controller.rb +82 -0
- data/test/rails3_root/app/helpers/application_helper.rb +2 -0
- data/test/rails3_root/app/models/address.rb +7 -0
- data/test/rails3_root/app/models/flea.rb +11 -0
- data/test/rails3_root/app/models/friendship.rb +4 -0
- data/test/rails3_root/app/models/notifier.rb +8 -0
- data/test/rails3_root/app/models/pets/cat.rb +7 -0
- data/test/rails3_root/app/models/pets/dog.rb +10 -0
- data/test/rails3_root/app/models/post.rb +12 -0
- data/test/rails3_root/app/models/product.rb +12 -0
- data/test/rails3_root/app/models/profile.rb +2 -0
- data/test/rails3_root/app/models/registration.rb +2 -0
- data/test/rails3_root/app/models/tag.rb +8 -0
- data/test/rails3_root/app/models/tagging.rb +4 -0
- data/test/rails3_root/app/models/treat.rb +3 -0
- data/test/rails3_root/app/models/user.rb +32 -0
- data/test/rails3_root/app/views/layouts/application.html.erb +14 -0
- data/test/rails3_root/app/views/layouts/posts.rhtml +19 -0
- data/test/rails3_root/app/views/layouts/users.rhtml +17 -0
- data/test/rails3_root/app/views/layouts/wide.html.erb +1 -0
- data/test/rails3_root/app/views/notifier/the_email.html.erb +1 -0
- data/test/rails3_root/app/views/posts/edit.rhtml +27 -0
- data/test/rails3_root/app/views/posts/index.rhtml +25 -0
- data/test/rails3_root/app/views/posts/new.rhtml +24 -0
- data/test/rails3_root/app/views/posts/show.rhtml +18 -0
- data/test/rails3_root/app/views/users/edit.rhtml +22 -0
- data/test/rails3_root/app/views/users/index.rhtml +22 -0
- data/test/rails3_root/app/views/users/new.rhtml +21 -0
- data/test/rails3_root/app/views/users/show.rhtml +13 -0
- data/test/rails3_root/config/application.rb +46 -0
- data/test/rails3_root/config/boot.rb +6 -0
- data/test/rails3_root/config/database.yml +22 -0
- data/test/rails3_root/config/environment.rb +5 -0
- data/test/rails3_root/config/environments/development.rb +19 -0
- data/test/rails3_root/config/environments/production.rb +42 -0
- data/test/rails3_root/config/environments/test.rb +32 -0
- data/test/rails3_root/config/initializers/backtrace_silencers.rb +7 -0
- data/test/rails3_root/config/initializers/inflections.rb +10 -0
- data/test/rails3_root/config/initializers/mime_types.rb +5 -0
- data/test/rails3_root/config/initializers/secret_token.rb +7 -0
- data/test/rails3_root/config/initializers/session_store.rb +8 -0
- data/test/rails3_root/config/locales/en.yml +5 -0
- data/test/rails3_root/config/routes.rb +4 -0
- data/test/rails3_root/config.ru +4 -0
- data/test/rails3_root/db/migrate/001_create_users.rb +19 -0
- data/test/rails3_root/db/migrate/002_create_posts.rb +13 -0
- data/test/rails3_root/db/migrate/003_create_taggings.rb +12 -0
- data/test/rails3_root/db/migrate/004_create_tags.rb +11 -0
- data/test/rails3_root/db/migrate/005_create_dogs.rb +12 -0
- data/test/rails3_root/db/migrate/006_create_addresses.rb +14 -0
- data/test/rails3_root/db/migrate/007_create_fleas.rb +11 -0
- data/test/rails3_root/db/migrate/008_create_dogs_fleas.rb +12 -0
- data/test/rails3_root/db/migrate/009_create_products.rb +17 -0
- data/test/rails3_root/db/migrate/010_create_friendships.rb +14 -0
- data/test/rails3_root/db/migrate/011_create_treats.rb +12 -0
- data/test/rails3_root/db/migrate/20090506203502_create_profiles.rb +12 -0
- data/test/rails3_root/db/migrate/20090506203536_create_registrations.rb +14 -0
- data/test/rails3_root/db/migrate/20090513104502_create_cats.rb +12 -0
- data/test/rails3_root/db/seeds.rb +7 -0
- data/test/rails3_root/public/404.html +26 -0
- data/test/rails3_root/public/422.html +26 -0
- data/test/rails3_root/public/500.html +26 -0
- data/test/rails3_root/public/favicon.ico +0 -0
- data/test/rails3_root/public/images/rails.png +0 -0
- data/test/rails3_root/public/index.html +279 -0
- data/test/rails3_root/public/javascripts/application.js +2 -0
- data/test/rails3_root/public/javascripts/controls.js +965 -0
- data/test/rails3_root/public/javascripts/dragdrop.js +974 -0
- data/test/rails3_root/public/javascripts/effects.js +1123 -0
- data/test/rails3_root/public/javascripts/prototype.js +4874 -0
- data/test/rails3_root/public/javascripts/rails.js +118 -0
- data/test/rails3_root/public/robots.txt +5 -0
- data/test/rails3_root/script/rails +9 -0
- data/test/rails3_root/test/performance/browsing_test.rb +9 -0
- data/test/rails3_root/test/test_helper.rb +13 -0
- data/test/rails3_test_helper.rb +6 -0
- data/test/rspec_test.rb +207 -0
- data/test/test_helper.rb +36 -0
- data/test/unit/address_test.rb +10 -0
- data/test/unit/cat_test.rb +7 -0
- data/test/unit/dog_test.rb +9 -0
- data/test/unit/flea_test.rb +14 -0
- data/test/unit/friendship_test.rb +6 -0
- data/test/unit/post_test.rb +15 -0
- data/test/unit/product_test.rb +23 -0
- data/test/unit/tag_test.rb +11 -0
- data/test/unit/tagging_test.rb +6 -0
- data/test/unit/user_test.rb +46 -0
- metadata +325 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
module Shoulda # :nodoc:
|
|
2
|
+
module ActionController # :nodoc:
|
|
3
|
+
module Matchers
|
|
4
|
+
|
|
5
|
+
# Ensures that the flash contains the given value. Can be a String, a
|
|
6
|
+
# Regexp, or nil (indicating that the flash should not be set).
|
|
7
|
+
#
|
|
8
|
+
# Example:
|
|
9
|
+
#
|
|
10
|
+
# it { should set_the_flash }
|
|
11
|
+
# it { should set_the_flash.to("Thank you for placing this order.") }
|
|
12
|
+
# it { should set_the_flash.to(/created/i) }
|
|
13
|
+
# it { should set_the_flash.to(/logged in/i).now }
|
|
14
|
+
# it { should_not set_the_flash }
|
|
15
|
+
def set_the_flash
|
|
16
|
+
SetTheFlashMatcher.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class SetTheFlashMatcher # :nodoc:
|
|
20
|
+
|
|
21
|
+
def to(value)
|
|
22
|
+
@value = value
|
|
23
|
+
self
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def now
|
|
27
|
+
@now = true
|
|
28
|
+
self
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def matches?(controller)
|
|
32
|
+
@controller = controller
|
|
33
|
+
sets_the_flash? && string_value_matches? && regexp_value_matches?
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
attr_reader :failure_message, :negative_failure_message
|
|
37
|
+
|
|
38
|
+
def description
|
|
39
|
+
description = "set the flash"
|
|
40
|
+
description << " to #{@value.inspect}" unless @value.nil?
|
|
41
|
+
description
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def failure_message
|
|
45
|
+
"Expected #{expectation}"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def negative_failure_message
|
|
49
|
+
"Did not expect #{expectation}"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def sets_the_flash?
|
|
55
|
+
!flash.blank?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def string_value_matches?
|
|
59
|
+
return true unless String === @value
|
|
60
|
+
flash.values.any? {|value| value == @value }
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def regexp_value_matches?
|
|
64
|
+
return true unless Regexp === @value
|
|
65
|
+
flash.values.any? {|value| value =~ @value }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def flash
|
|
69
|
+
return @flash if @flash
|
|
70
|
+
flash_and_now = @controller.request.session["flash"].dup if @controller.request.session["flash"]
|
|
71
|
+
flash = @controller.send(:flash)
|
|
72
|
+
|
|
73
|
+
@flash = if @now
|
|
74
|
+
flash.keys.each {|key| flash_and_now.delete(key) }
|
|
75
|
+
flash_and_now
|
|
76
|
+
else
|
|
77
|
+
flash
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def expectation
|
|
82
|
+
expectation = "the flash#{".now" if @now} to be set"
|
|
83
|
+
expectation << " to #{@value.inspect}" unless @value.nil?
|
|
84
|
+
expectation << ", but #{flash_description}"
|
|
85
|
+
expectation
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def flash_description
|
|
89
|
+
if flash.blank?
|
|
90
|
+
"no flash was set"
|
|
91
|
+
else
|
|
92
|
+
"was #{flash.inspect}"
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'shoulda/action_controller/matchers/assign_to_matcher'
|
|
2
|
+
require 'shoulda/action_controller/matchers/filter_param_matcher'
|
|
3
|
+
require 'shoulda/action_controller/matchers/set_the_flash_matcher'
|
|
4
|
+
require 'shoulda/action_controller/matchers/render_with_layout_matcher'
|
|
5
|
+
require 'shoulda/action_controller/matchers/respond_with_matcher'
|
|
6
|
+
require 'shoulda/action_controller/matchers/respond_with_content_type_matcher'
|
|
7
|
+
require 'shoulda/action_controller/matchers/set_session_matcher'
|
|
8
|
+
require 'shoulda/action_controller/matchers/route_matcher'
|
|
9
|
+
require 'shoulda/action_controller/matchers/redirect_to_matcher'
|
|
10
|
+
require 'shoulda/action_controller/matchers/render_template_matcher'
|
|
11
|
+
|
|
12
|
+
module Shoulda # :nodoc:
|
|
13
|
+
module ActionController # :nodoc:
|
|
14
|
+
|
|
15
|
+
# By using the macro helpers you can quickly and easily create concise and
|
|
16
|
+
# easy to read test suites.
|
|
17
|
+
#
|
|
18
|
+
# This code segment:
|
|
19
|
+
#
|
|
20
|
+
# describe UsersController, "on GET to show with a valid id" do
|
|
21
|
+
# before(:each) do
|
|
22
|
+
# get :show, :id => User.first.to_param
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# it { should assign_to(:user) }
|
|
26
|
+
# it { should respond_with(:success) }
|
|
27
|
+
# it { should render_template(:show) }
|
|
28
|
+
# it { should not_set_the_flash) }
|
|
29
|
+
#
|
|
30
|
+
# it "should do something else really cool" do
|
|
31
|
+
# assigns[:user].id.should == 1
|
|
32
|
+
# end
|
|
33
|
+
# end
|
|
34
|
+
#
|
|
35
|
+
# Would produce 5 tests for the show action
|
|
36
|
+
module Matchers
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'shoulda'
|
|
2
|
+
require 'shoulda/action_controller/matchers'
|
|
3
|
+
require 'shoulda/action_controller/macros'
|
|
4
|
+
|
|
5
|
+
module Test # :nodoc: all
|
|
6
|
+
module Unit
|
|
7
|
+
class TestCase
|
|
8
|
+
include Shoulda::ActionController::Matchers
|
|
9
|
+
extend Shoulda::ActionController::Macros
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
require 'shoulda/active_record/assertions'
|
|
15
|
+
require 'shoulda/action_mailer/assertions'
|
|
16
|
+
|
|
17
|
+
module ActionController #:nodoc: all
|
|
18
|
+
module Integration
|
|
19
|
+
class Session
|
|
20
|
+
include Shoulda::Assertions
|
|
21
|
+
include Shoulda::Helpers
|
|
22
|
+
include Shoulda::ActiveRecord::Assertions
|
|
23
|
+
include Shoulda::ActionMailer::Assertions
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
if defined?(ActionController::TestCase)
|
|
29
|
+
class ActionController::TestCase
|
|
30
|
+
def subject
|
|
31
|
+
@controller
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Shoulda # :nodoc:
|
|
2
|
+
module ActionMailer # :nodoc:
|
|
3
|
+
module Assertions
|
|
4
|
+
# Asserts that an email was delivered. Can take a block that can further
|
|
5
|
+
# narrow down the types of emails you're expecting.
|
|
6
|
+
#
|
|
7
|
+
# assert_sent_email
|
|
8
|
+
#
|
|
9
|
+
# Passes if ActionMailer::Base.deliveries has an email
|
|
10
|
+
#
|
|
11
|
+
# assert_sent_email do |email|
|
|
12
|
+
# email.subject =~ /hi there/ && email.to.include?('none@none.com')
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# Passes if there is an email with subject containing 'hi there' and
|
|
16
|
+
# 'none@none.com' as one of the recipients.
|
|
17
|
+
#
|
|
18
|
+
def assert_sent_email
|
|
19
|
+
::ActiveSupport::Deprecation.warn("use: should have_sent_email")
|
|
20
|
+
emails = ::ActionMailer::Base.deliveries
|
|
21
|
+
assert !emails.empty?, "No emails were sent"
|
|
22
|
+
if block_given?
|
|
23
|
+
matching_emails = emails.select {|email| yield email }
|
|
24
|
+
assert !matching_emails.empty?, "None of the emails matched."
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# should have_sent_email.with_subject(/hi there/).to('none@none.com').from('noreply@example.com').with_body(/reach out/)
|
|
29
|
+
|
|
30
|
+
# Asserts that no ActionMailer mails were delivered
|
|
31
|
+
#
|
|
32
|
+
# assert_did_not_send_email
|
|
33
|
+
def assert_did_not_send_email
|
|
34
|
+
::ActiveSupport::Deprecation.warn("use: should_not have_sent_email")
|
|
35
|
+
msg = "Sent #{::ActionMailer::Base.deliveries.size} emails.\n"
|
|
36
|
+
::ActionMailer::Base.deliveries.each { |m| msg << " '#{m.subject}' sent to #{m.to.to_sentence}\n" }
|
|
37
|
+
assert ::ActionMailer::Base.deliveries.empty?, msg
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
module Shoulda # :nodoc:
|
|
2
|
+
module ActionMailer # :nodoc:
|
|
3
|
+
module Matchers
|
|
4
|
+
|
|
5
|
+
# The right email is sent.
|
|
6
|
+
#
|
|
7
|
+
# it { should have_sent_email.with_subject(/is spam$/) }
|
|
8
|
+
# it { should have_sent_email.from('do-not-reply@example.com') }
|
|
9
|
+
# it { should have_sent_email.with_body(/is spam\./) }
|
|
10
|
+
# it { should have_sent_email.to('myself@me.com') }
|
|
11
|
+
# it { should have_sent_email.with_subject(/spam/).
|
|
12
|
+
# from('do-not-reply@example.com').
|
|
13
|
+
# with_body(/spam/).
|
|
14
|
+
# to('myself@me.com') }
|
|
15
|
+
def have_sent_email
|
|
16
|
+
HaveSentEmailMatcher.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class HaveSentEmailMatcher # :nodoc:
|
|
20
|
+
|
|
21
|
+
def initialize
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def with_subject(email_subject)
|
|
25
|
+
@email_subject = email_subject
|
|
26
|
+
self
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def from(sender)
|
|
30
|
+
@sender = sender
|
|
31
|
+
self
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def with_body(body)
|
|
35
|
+
@body = body
|
|
36
|
+
self
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def to(recipient)
|
|
40
|
+
@recipient = recipient
|
|
41
|
+
self
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def matches?(subject=nil)
|
|
45
|
+
::ActionMailer::Base.deliveries.each do |mail|
|
|
46
|
+
@subject_failed = !regexp_or_string_match(mail.subject, @email_subject) if @email_subject
|
|
47
|
+
@body_failed = !regexp_or_string_match(mail.body, @body) if @body
|
|
48
|
+
@sender_failed = !regexp_or_string_match_in_array(mail.from, @sender) if @sender
|
|
49
|
+
@recipient_failed = !regexp_or_string_match_in_array(mail.to, @recipient) if @recipient
|
|
50
|
+
return true unless anything_failed?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
false
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def failure_message
|
|
57
|
+
"Expected #{expectation}"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def negative_failure_message
|
|
61
|
+
"Did not expect #{expectation}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def description
|
|
65
|
+
"send an email"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
def expectation
|
|
71
|
+
expectation = "sent email"
|
|
72
|
+
expectation << " with subject #{@email_subject.inspect}" if @subject_failed
|
|
73
|
+
expectation << " with body #{@body.inspect}" if @body_failed
|
|
74
|
+
expectation << " from #{@sender.inspect}" if @sender_failed
|
|
75
|
+
expectation << " to #{@recipient.inspect}" if @recipient_failed
|
|
76
|
+
expectation << "\nDeliveries:\n#{inspect_deliveries}"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def inspect_deliveries
|
|
80
|
+
::ActionMailer::Base.deliveries.map do |delivery|
|
|
81
|
+
"#{delivery.subject.inspect} to #{delivery.to.inspect}"
|
|
82
|
+
end.join("\n")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def anything_failed?
|
|
86
|
+
@subject_failed || @body_failed || @sender_failed || @recipient_failed
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def regexp_or_string_match(a_string, a_regexp_or_string)
|
|
90
|
+
case a_regexp_or_string
|
|
91
|
+
when Regexp
|
|
92
|
+
a_string =~ a_regexp_or_string
|
|
93
|
+
when String
|
|
94
|
+
a_string == a_regexp_or_string
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def regexp_or_string_match_in_array(an_array, a_regexp_or_string)
|
|
99
|
+
case a_regexp_or_string
|
|
100
|
+
when Regexp
|
|
101
|
+
an_array.any? { |string| string =~ a_regexp_or_string }
|
|
102
|
+
when String
|
|
103
|
+
an_array.include?(a_regexp_or_string)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'shoulda/action_mailer/matchers/have_sent_email'
|
|
2
|
+
|
|
3
|
+
module Shoulda # :nodoc:
|
|
4
|
+
module ActionMailer # :nodoc:
|
|
5
|
+
# = Matchers for your mailers
|
|
6
|
+
#
|
|
7
|
+
# This matcher will test that email is sent properly
|
|
8
|
+
#
|
|
9
|
+
# describe User do
|
|
10
|
+
# it { should have_sent_email.with_subject(/is spam$/) }
|
|
11
|
+
# it { should have_sent_email.from('do-not-reply@example.com') }
|
|
12
|
+
# it { should have_sent_email.with_body(/is spam\./) }
|
|
13
|
+
# it { should have_sent_email.to('myself@me.com') }
|
|
14
|
+
# it { should have_sent_email.with_subject(/spam/).
|
|
15
|
+
# from('do-not-reply@example.com').
|
|
16
|
+
# with_body(/spam/).
|
|
17
|
+
# to('myself@me.com') }
|
|
18
|
+
# end
|
|
19
|
+
module Matchers
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'shoulda'
|
|
2
|
+
require 'shoulda/action_mailer/assertions'
|
|
3
|
+
require 'shoulda/action_mailer/matchers'
|
|
4
|
+
|
|
5
|
+
module Test # :nodoc: all
|
|
6
|
+
module Unit
|
|
7
|
+
class TestCase
|
|
8
|
+
include Shoulda::ActionMailer::Assertions
|
|
9
|
+
include Shoulda::ActionMailer::Matchers
|
|
10
|
+
extend Shoulda::ActionMailer::Matchers
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module Shoulda # :nodoc:
|
|
2
|
+
module ActiveRecord # :nodoc:
|
|
3
|
+
module Assertions
|
|
4
|
+
# Asserts that the given object can be saved
|
|
5
|
+
#
|
|
6
|
+
# assert_save User.new(params)
|
|
7
|
+
def assert_save(obj)
|
|
8
|
+
assert obj.save, "Errors: #{pretty_error_messages obj}"
|
|
9
|
+
obj.reload
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Asserts that the given object is valid
|
|
13
|
+
#
|
|
14
|
+
# assert_valid User.new(params)
|
|
15
|
+
def assert_valid(obj)
|
|
16
|
+
assert obj.valid?, "Errors: #{pretty_error_messages obj}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Asserts that an Active Record model validates with the passed
|
|
20
|
+
# <tt>value</tt> by making sure the <tt>error_message_to_avoid</tt> is not
|
|
21
|
+
# contained within the list of errors for that attribute.
|
|
22
|
+
#
|
|
23
|
+
# assert_good_value(User.new, :email, "user@example.com")
|
|
24
|
+
# assert_good_value(User.new, :ssn, "123456789", /length/)
|
|
25
|
+
#
|
|
26
|
+
# If a class is passed as the first argument, a new object will be
|
|
27
|
+
# instantiated before the assertion. If an instance variable exists with
|
|
28
|
+
# the same name as the class (underscored), that object will be used
|
|
29
|
+
# instead.
|
|
30
|
+
#
|
|
31
|
+
# assert_good_value(User, :email, "user@example.com")
|
|
32
|
+
#
|
|
33
|
+
# product = Product.new(:tangible => false)
|
|
34
|
+
# assert_good_value(product, :price, "0")
|
|
35
|
+
def assert_good_value(object_or_klass, attribute, value, error_message_to_avoid = nil)
|
|
36
|
+
object = get_instance_of(object_or_klass)
|
|
37
|
+
matcher = allow_value(value).
|
|
38
|
+
for(attribute).
|
|
39
|
+
with_message(error_message_to_avoid)
|
|
40
|
+
assert_accepts(matcher, object)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Asserts that an Active Record model invalidates the passed
|
|
44
|
+
# <tt>value</tt> by making sure the <tt>error_message_to_expect</tt> is
|
|
45
|
+
# contained within the list of errors for that attribute.
|
|
46
|
+
#
|
|
47
|
+
# assert_bad_value(User.new, :email, "invalid")
|
|
48
|
+
# assert_bad_value(User.new, :ssn, "123", /length/)
|
|
49
|
+
#
|
|
50
|
+
# If a class is passed as the first argument, a new object will be
|
|
51
|
+
# instantiated before the assertion. If an instance variable exists with
|
|
52
|
+
# the same name as the class (underscored), that object will be used
|
|
53
|
+
# instead.
|
|
54
|
+
#
|
|
55
|
+
# assert_bad_value(User, :email, "invalid")
|
|
56
|
+
#
|
|
57
|
+
# product = Product.new(:tangible => true)
|
|
58
|
+
# assert_bad_value(product, :price, "0")
|
|
59
|
+
def assert_bad_value(object_or_klass, attribute, value,
|
|
60
|
+
error_message_to_expect = nil)
|
|
61
|
+
object = get_instance_of(object_or_klass)
|
|
62
|
+
matcher = allow_value(value).
|
|
63
|
+
for(attribute).
|
|
64
|
+
with_message(error_message_to_expect)
|
|
65
|
+
assert_rejects(matcher, object)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Shoulda # :nodoc:
|
|
2
|
+
module ActiveRecord # :nodoc:
|
|
3
|
+
module Helpers
|
|
4
|
+
def pretty_error_messages(obj) # :nodoc:
|
|
5
|
+
obj.errors.map do |a, m|
|
|
6
|
+
msg = "#{a} #{m}"
|
|
7
|
+
msg << " (#{obj.send(a).inspect})" unless a.to_sym == :base
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Helper method that determines the default error message used by Active
|
|
12
|
+
# Record. Works for both existing Rails 2.1 and Rails 2.2 with the newly
|
|
13
|
+
# introduced I18n module used for localization.
|
|
14
|
+
#
|
|
15
|
+
# default_error_message(:blank)
|
|
16
|
+
# default_error_message(:too_short, :count => 5)
|
|
17
|
+
# default_error_message(:too_long, :count => 60)
|
|
18
|
+
def default_error_message(key, values = {})
|
|
19
|
+
if Object.const_defined?(:I18n) # Rails >= 2.2
|
|
20
|
+
result = I18n.translate("activerecord.errors.messages.#{key}", values)
|
|
21
|
+
if result =~ /^translation missing/
|
|
22
|
+
I18n.translate("errors.messages.#{key}", values)
|
|
23
|
+
else
|
|
24
|
+
result
|
|
25
|
+
end
|
|
26
|
+
else # Rails <= 2.1.x
|
|
27
|
+
::ActiveRecord::Errors.default_error_messages[key] % values[:count]
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|