Flamefork-shoulda 2.10.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.
Files changed (160) hide show
  1. data/CONTRIBUTION_GUIDELINES.rdoc +12 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README.rdoc +169 -0
  4. data/Rakefile +72 -0
  5. data/bin/convert_to_should_syntax +42 -0
  6. data/lib/shoulda/action_controller/helpers.rb +47 -0
  7. data/lib/shoulda/action_controller/macros.rb +277 -0
  8. data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +109 -0
  9. data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +57 -0
  10. data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +81 -0
  11. data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +70 -0
  12. data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +81 -0
  13. data/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
  14. data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +87 -0
  15. data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +85 -0
  16. data/lib/shoulda/action_controller/matchers.rb +37 -0
  17. data/lib/shoulda/action_controller.rb +24 -0
  18. data/lib/shoulda/action_mailer/assertions.rb +38 -0
  19. data/lib/shoulda/action_mailer.rb +6 -0
  20. data/lib/shoulda/action_view/macros.rb +56 -0
  21. data/lib/shoulda/action_view.rb +6 -0
  22. data/lib/shoulda/active_record/assertions.rb +69 -0
  23. data/lib/shoulda/active_record/helpers.rb +40 -0
  24. data/lib/shoulda/active_record/macros.rb +588 -0
  25. data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
  26. data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +102 -0
  27. data/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
  28. data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
  29. data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
  30. data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
  31. data/lib/shoulda/active_record/matchers/have_index_matcher.rb +105 -0
  32. data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +125 -0
  33. data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
  34. data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
  35. data/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
  36. data/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
  37. data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
  38. data/lib/shoulda/active_record/matchers/validation_matcher.rb +56 -0
  39. data/lib/shoulda/active_record/matchers.rb +42 -0
  40. data/lib/shoulda/active_record.rb +12 -0
  41. data/lib/shoulda/assertions.rb +59 -0
  42. data/lib/shoulda/autoload_macros.rb +46 -0
  43. data/lib/shoulda/context.rb +304 -0
  44. data/lib/shoulda/helpers.rb +8 -0
  45. data/lib/shoulda/macros.rb +73 -0
  46. data/lib/shoulda/private_helpers.rb +20 -0
  47. data/lib/shoulda/proc_extensions.rb +14 -0
  48. data/lib/shoulda/rails.rb +13 -0
  49. data/lib/shoulda/rspec.rb +11 -0
  50. data/lib/shoulda/tasks/list_tests.rake +29 -0
  51. data/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
  52. data/lib/shoulda/tasks.rb +3 -0
  53. data/lib/shoulda/test_unit.rb +14 -0
  54. data/lib/shoulda.rb +9 -0
  55. data/rails/init.rb +7 -0
  56. data/test/README +36 -0
  57. data/test/fail_macros.rb +34 -0
  58. data/test/fixtures/addresses.yml +3 -0
  59. data/test/fixtures/friendships.yml +0 -0
  60. data/test/fixtures/posts.yml +5 -0
  61. data/test/fixtures/products.yml +0 -0
  62. data/test/fixtures/taggings.yml +0 -0
  63. data/test/fixtures/tags.yml +9 -0
  64. data/test/fixtures/users.yml +6 -0
  65. data/test/functional/posts_controller_test.rb +125 -0
  66. data/test/functional/users_controller_test.rb +19 -0
  67. data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +68 -0
  68. data/test/matchers/active_record/allow_value_matcher_test.rb +41 -0
  69. data/test/matchers/active_record/association_matcher_test.rb +258 -0
  70. data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +80 -0
  71. data/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
  72. data/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
  73. data/test/matchers/active_record/have_index_matcher_test.rb +74 -0
  74. data/test/matchers/active_record/have_named_scope_matcher_test.rb +65 -0
  75. data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
  76. data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
  77. data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
  78. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
  79. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
  80. data/test/matchers/controller/assign_to_matcher_test.rb +35 -0
  81. data/test/matchers/controller/filter_param_matcher_test.rb +32 -0
  82. data/test/matchers/controller/render_with_layout_matcher_test.rb +33 -0
  83. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +27 -0
  84. data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
  85. data/test/matchers/controller/route_matcher_test.rb +58 -0
  86. data/test/matchers/controller/set_session_matcher_test.rb +31 -0
  87. data/test/matchers/controller/set_the_flash_matcher.rb +41 -0
  88. data/test/model_builder.rb +106 -0
  89. data/test/other/autoload_macro_test.rb +18 -0
  90. data/test/other/context_test.rb +145 -0
  91. data/test/other/convert_to_should_syntax_test.rb +63 -0
  92. data/test/other/helpers_test.rb +241 -0
  93. data/test/other/private_helpers_test.rb +34 -0
  94. data/test/other/should_test.rb +266 -0
  95. data/test/rails_root/app/controllers/application.rb +25 -0
  96. data/test/rails_root/app/controllers/posts_controller.rb +86 -0
  97. data/test/rails_root/app/controllers/users_controller.rb +84 -0
  98. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  99. data/test/rails_root/app/helpers/posts_helper.rb +2 -0
  100. data/test/rails_root/app/helpers/users_helper.rb +2 -0
  101. data/test/rails_root/app/models/address.rb +7 -0
  102. data/test/rails_root/app/models/flea.rb +3 -0
  103. data/test/rails_root/app/models/friendship.rb +4 -0
  104. data/test/rails_root/app/models/pets/dog.rb +10 -0
  105. data/test/rails_root/app/models/post.rb +12 -0
  106. data/test/rails_root/app/models/product.rb +12 -0
  107. data/test/rails_root/app/models/tag.rb +8 -0
  108. data/test/rails_root/app/models/tagging.rb +4 -0
  109. data/test/rails_root/app/models/treat.rb +3 -0
  110. data/test/rails_root/app/models/user.rb +29 -0
  111. data/test/rails_root/app/views/layouts/posts.rhtml +19 -0
  112. data/test/rails_root/app/views/layouts/users.rhtml +17 -0
  113. data/test/rails_root/app/views/layouts/wide.html.erb +1 -0
  114. data/test/rails_root/app/views/posts/edit.rhtml +27 -0
  115. data/test/rails_root/app/views/posts/index.rhtml +25 -0
  116. data/test/rails_root/app/views/posts/new.rhtml +26 -0
  117. data/test/rails_root/app/views/posts/show.rhtml +18 -0
  118. data/test/rails_root/app/views/users/edit.rhtml +22 -0
  119. data/test/rails_root/app/views/users/index.rhtml +22 -0
  120. data/test/rails_root/app/views/users/new.rhtml +21 -0
  121. data/test/rails_root/app/views/users/show.rhtml +13 -0
  122. data/test/rails_root/config/boot.rb +109 -0
  123. data/test/rails_root/config/database.yml +4 -0
  124. data/test/rails_root/config/environment.rb +14 -0
  125. data/test/rails_root/config/environments/test.rb +0 -0
  126. data/test/rails_root/config/initializers/new_rails_defaults.rb +15 -0
  127. data/test/rails_root/config/initializers/shoulda.rb +8 -0
  128. data/test/rails_root/config/routes.rb +6 -0
  129. data/test/rails_root/db/migrate/001_create_users.rb +19 -0
  130. data/test/rails_root/db/migrate/002_create_posts.rb +13 -0
  131. data/test/rails_root/db/migrate/003_create_taggings.rb +12 -0
  132. data/test/rails_root/db/migrate/004_create_tags.rb +11 -0
  133. data/test/rails_root/db/migrate/005_create_dogs.rb +12 -0
  134. data/test/rails_root/db/migrate/006_create_addresses.rb +14 -0
  135. data/test/rails_root/db/migrate/007_create_fleas.rb +11 -0
  136. data/test/rails_root/db/migrate/008_create_dogs_fleas.rb +12 -0
  137. data/test/rails_root/db/migrate/009_create_products.rb +17 -0
  138. data/test/rails_root/db/migrate/010_create_friendships.rb +14 -0
  139. data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
  140. data/test/rails_root/db/schema.rb +0 -0
  141. data/test/rails_root/public/404.html +30 -0
  142. data/test/rails_root/public/422.html +30 -0
  143. data/test/rails_root/public/500.html +30 -0
  144. data/test/rails_root/script/console +3 -0
  145. data/test/rails_root/script/generate +3 -0
  146. data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
  147. data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
  148. data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
  149. data/test/rspec_test.rb +207 -0
  150. data/test/test_helper.rb +35 -0
  151. data/test/unit/address_test.rb +10 -0
  152. data/test/unit/dog_test.rb +10 -0
  153. data/test/unit/flea_test.rb +6 -0
  154. data/test/unit/friendship_test.rb +6 -0
  155. data/test/unit/post_test.rb +19 -0
  156. data/test/unit/product_test.rb +27 -0
  157. data/test/unit/tag_test.rb +15 -0
  158. data/test/unit/tagging_test.rb +6 -0
  159. data/test/unit/user_test.rb +70 -0
  160. metadata +258 -0
@@ -0,0 +1,73 @@
1
+ require 'shoulda/private_helpers'
2
+
3
+ module Shoulda # :nodoc:
4
+ module Macros
5
+ # Macro that creates a test asserting a change between the return value
6
+ # of an expression that is run before and after the current setup block
7
+ # is run. This is similar to Active Support's <tt>assert_difference</tt>
8
+ # assertion, but supports more than just numeric values. See also
9
+ # should_not_change.
10
+ #
11
+ # Example:
12
+ #
13
+ # context "Creating a post" do
14
+ # setup { Post.create }
15
+ # should_change "Post.count", :by => 1
16
+ # end
17
+ #
18
+ # As shown in this example, the <tt>:by</tt> option expects a numeric
19
+ # difference between the before and after values of the expression. You
20
+ # may also specify <tt>:from</tt> and <tt>:to</tt> options:
21
+ #
22
+ # should_change "Post.count", :from => 0, :to => 1
23
+ # should_change "@post.title", :from => "old", :to => "new"
24
+ #
25
+ # Combinations of <tt>:by</tt>, <tt>:from</tt>, and <tt>:to</tt> are allowed:
26
+ #
27
+ # should_change "@post.title" # => assert the value changed in some way
28
+ # should_change "@post.title", :from => "old" # => assert the value changed to anything other than "old"
29
+ # should_change "@post.title", :to => "new" # => assert the value changed from anything other than "new"
30
+ def should_change(expression, options = {})
31
+ by, from, to = get_options!([options], :by, :from, :to)
32
+ stmt = "change #{expression.inspect}"
33
+ stmt << " from #{from.inspect}" if from
34
+ stmt << " to #{to.inspect}" if to
35
+ stmt << " by #{by.inspect}" if by
36
+
37
+ expression_eval = lambda { eval(expression) }
38
+ before = lambda { @_before_should_change = expression_eval.bind(self).call }
39
+ should stmt, :before => before do
40
+ old_value = @_before_should_change
41
+ new_value = expression_eval.bind(self).call
42
+ assert_operator from, :===, old_value, "#{expression.inspect} did not originally match #{from.inspect}" if from
43
+ assert_not_equal old_value, new_value, "#{expression.inspect} did not change" unless by == 0
44
+ assert_operator to, :===, new_value, "#{expression.inspect} was not changed to match #{to.inspect}" if to
45
+ assert_equal old_value + by, new_value if by
46
+ end
47
+ end
48
+
49
+ # Macro that creates a test asserting no change between the return value
50
+ # of an expression that is run before and after the current setup block
51
+ # is run. This is the logical opposite of should_change.
52
+ #
53
+ # Example:
54
+ #
55
+ # context "Updating a post" do
56
+ # setup { @post.update_attributes(:title => "new") }
57
+ # should_not_change "Post.count"
58
+ # end
59
+ def should_not_change(expression)
60
+ expression_eval = lambda { eval(expression) }
61
+ before = lambda { @_before_should_not_change = expression_eval.bind(self).call }
62
+ should "not change #{expression.inspect}", :before => before do
63
+ new_value = expression_eval.bind(self).call
64
+ assert_equal @_before_should_not_change, new_value, "#{expression.inspect} changed"
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ include Shoulda::Private
71
+ end
72
+ end
73
+
@@ -0,0 +1,20 @@
1
+ module Shoulda # :nodoc:
2
+ module Private # :nodoc:
3
+ # Returns the values for the entries in the args hash who's keys are listed in the wanted array.
4
+ # Will raise if there are keys in the args hash that aren't listed.
5
+ def get_options!(args, *wanted)
6
+ ret = []
7
+ opts = (args.last.is_a?(Hash) ? args.pop : {})
8
+ wanted.each {|w| ret << opts.delete(w)}
9
+ raise ArgumentError, "Unsupported options given: #{opts.keys.join(', ')}" unless opts.keys.empty?
10
+ return *ret
11
+ end
12
+
13
+ # Returns the model class constant, as determined by the test class name.
14
+ #
15
+ # class TestUser; model_class; end => User
16
+ def model_class
17
+ self.name.gsub(/Test$/, '').constantize
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ # Stolen straight from ActiveSupport
2
+
3
+ class Proc #:nodoc:
4
+ def bind(object)
5
+ block, time = self, Time.now
6
+ (class << object; self end).class_eval do
7
+ method_name = "__bind_#{time.to_i}_#{time.usec}"
8
+ define_method(method_name, &block)
9
+ method = instance_method(method_name)
10
+ remove_method(method_name)
11
+ method
12
+ end.bind(object)
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+ require 'active_support'
3
+ require 'shoulda'
4
+
5
+ require 'shoulda/active_record' if defined? ActiveRecord::Base
6
+ require 'shoulda/action_controller' if defined? ActionController::Base
7
+ require 'shoulda/action_view' if defined? ActionView::Base
8
+ require 'shoulda/action_mailer' if defined? ActionMailer::Base
9
+
10
+ if defined?(RAILS_ROOT)
11
+ # load in the 3rd party macros from vendorized plugins and gems
12
+ Shoulda.autoload_macros RAILS_ROOT, File.join("vendor", "{plugins,gems}", "*")
13
+ end
@@ -0,0 +1,11 @@
1
+ require 'shoulda/active_record/matchers'
2
+ require 'shoulda/action_controller/matchers'
3
+ require 'active_support/test_case'
4
+
5
+ # :enddoc:
6
+ module ActiveSupport
7
+ class TestCase
8
+ include Shoulda::ActiveRecord::Matchers
9
+ include Shoulda::ActionController::Matchers
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ namespace :shoulda do
2
+ desc "List the names of the test methods in a specification like format"
3
+ task :list do
4
+ $LOAD_PATH.unshift("test")
5
+
6
+ require 'test/unit'
7
+ require 'rubygems'
8
+ require 'active_support'
9
+
10
+ # bug in test unit. Set to true to stop from running.
11
+ Test::Unit.run = true
12
+
13
+ test_files = Dir.glob(File.join('test', '**', '*_test.rb'))
14
+ test_files.each do |file|
15
+ load file
16
+ klass = File.basename(file, '.rb').classify
17
+ unless Object.const_defined?(klass.to_s)
18
+ puts "Skipping #{klass} because it doesn't map to a Class"
19
+ next
20
+ end
21
+ klass = klass.constantize
22
+
23
+ puts klass.name.gsub('Test', '')
24
+
25
+ test_methods = klass.instance_methods.grep(/^test/).map {|s| s.gsub(/^test: /, '')}.sort
26
+ test_methods.each {|m| puts " " + m }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ namespace :shoulda do
2
+ # From http://blog.internautdesign.com/2007/11/2/a-yaml_to_shoulda-rake-task
3
+ # David.Lowenfels@gmail.com
4
+ desc "Converts a YAML file (FILE=./path/to/yaml) into a Shoulda skeleton"
5
+ task :from_yaml do
6
+ require 'yaml'
7
+
8
+ def yaml_to_context(hash, indent = 0)
9
+ indent1 = ' ' * indent
10
+ indent2 = ' ' * (indent + 1)
11
+ hash.each_pair do |context, shoulds|
12
+ puts indent1 + "context \"#{context}\" do"
13
+ puts
14
+ shoulds.each do |should|
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"
18
+ puts
19
+ end
20
+ puts indent1 + "end"
21
+ end
22
+ end
23
+
24
+ puts("Please pass in a FILE argument.") and exit unless ENV['FILE']
25
+
26
+ yaml_to_context( YAML.load_file( ENV['FILE'] ) )
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ Dir[File.join(File.dirname(__FILE__), 'tasks', '*.rake')].each do |f|
2
+ load f
3
+ end
@@ -0,0 +1,14 @@
1
+ require 'shoulda/context'
2
+ require 'shoulda/proc_extensions'
3
+ require 'shoulda/assertions'
4
+ require 'shoulda/macros'
5
+ require 'shoulda/helpers'
6
+ require 'shoulda/autoload_macros'
7
+ require 'shoulda/rails' if defined? RAILS_ROOT
8
+
9
+ Test::Unit::TestCase.class_eval do
10
+ extend Shoulda::ClassMethods
11
+ include Shoulda::Assertions
12
+ extend Shoulda::Macros
13
+ include Shoulda::Helpers
14
+ end
data/lib/shoulda.rb ADDED
@@ -0,0 +1,9 @@
1
+ module Shoulda
2
+ VERSION = "2.10.1"
3
+ end
4
+
5
+ if defined? Spec
6
+ require 'shoulda/rspec'
7
+ else
8
+ require 'shoulda/test_unit'
9
+ end
data/rails/init.rb ADDED
@@ -0,0 +1,7 @@
1
+ if RAILS_ENV == 'test'
2
+ if defined? Spec
3
+ require 'shoulda/rspec'
4
+ else
5
+ require 'shoulda/rails'
6
+ end
7
+ end
data/test/README ADDED
@@ -0,0 +1,36 @@
1
+ The Shoulda test suite (in particular - the tests that test shoulda)
2
+
3
+ Quick overview:
4
+
5
+ The test directory contains the following files and subdirectories:
6
+
7
+ * rails_root - contains the stripped down rails application that the tests run against. The rails root contains:
8
+ ** the models, controllers, and views defined under app/
9
+ ** the test.rb environment file
10
+ ** a migration file for each model
11
+ ** a shoulda initializer that simulates loading the plugin but without relying on vendor/plugins
12
+ * fixtures - contain the sample DB data for each model
13
+ * functional - controller tests for each of the controllers under rails_root/app
14
+ * unit - model tests for each of the models under rails_root/app
15
+ * other - tests for the shoulda contexts, should statements, and assertions
16
+ * test_helper.rb - responsible for initializing the test environment
17
+ ** sets the rails_env to test
18
+ ** sets the rails_root
19
+ ** runs all the migrations against the in-memory sqlite3 db
20
+ ** adds some magic to load the right fixture files
21
+
22
+ In order to add a new model (or controller) to the test suite:
23
+
24
+ * add that model to rails_root/app/models
25
+ * add a migration for that model
26
+ * add a fixture file
27
+ * add a test for that file under test/units
28
+
29
+ Dependencies:
30
+
31
+ * Rails gem installed in the host system
32
+ * A working sqlite3 installation.
33
+
34
+ If you have problems running these tests, please notify the mailing list: shoulda@googlegroups.com
35
+
36
+ - Tammer Saleh <tsaleh@thoughtbot.com>
@@ -0,0 +1,34 @@
1
+ module Shoulda
2
+ class << self
3
+ attr_accessor :expected_exceptions
4
+ end
5
+
6
+ module ClassMethods
7
+ # Enables the core shoulda test suite to test for failure scenarios. For
8
+ # example, to ensure that a set of test macros should fail, do this:
9
+ #
10
+ # should_fail do
11
+ # should_validate_presence_of :comments
12
+ # should_not_allow_mass_assignment_of :name
13
+ # end
14
+ def should_fail(&block)
15
+ context "should fail when trying to run:" do
16
+ Shoulda.expected_exceptions = [Test::Unit::AssertionFailedError]
17
+ yield block
18
+ Shoulda.expected_exceptions = nil
19
+ end
20
+ end
21
+ end
22
+
23
+ class Context
24
+ # alias_method_chain hack to allow the should_fail macro to work
25
+ def should_with_failure_scenario(name, options = {}, &block)
26
+ if Shoulda.expected_exceptions
27
+ expected_exceptions = Shoulda.expected_exceptions
28
+ failure_block = lambda { assert_raise(*expected_exceptions, &block.bind(self)) }
29
+ end
30
+ should_without_failure_scenario(name, options, &(failure_block || block))
31
+ end
32
+ alias_method_chain :should, :failure_scenario
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ first:
2
+ title: Home
3
+ addressable: first (User)
File without changes
@@ -0,0 +1,5 @@
1
+ first:
2
+ id: 1
3
+ title: My Cute Kitten!
4
+ body: This is totally a cute kitten
5
+ user_id: 1
File without changes
File without changes
@@ -0,0 +1,9 @@
1
+ first:
2
+ id: 1
3
+ name: Stuff
4
+ second:
5
+ id: 2
6
+ name: Rails
7
+ third:
8
+ id: 3
9
+ name: Nothing
@@ -0,0 +1,6 @@
1
+ first:
2
+ id: 1
3
+ name: Some dude
4
+ age: 2
5
+ email: none@none.com
6
+ ssn: 123456789
@@ -0,0 +1,125 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+ require 'posts_controller'
3
+
4
+ # Re-raise errors caught by the controller.
5
+ class PostsController; def rescue_action(e) raise e end; end
6
+
7
+ class PostsControllerTest < Test::Unit::TestCase
8
+ fixtures :all
9
+
10
+ def setup
11
+ @controller = PostsController.new
12
+ @request = ActionController::TestRequest.new
13
+ @response = ActionController::TestResponse.new
14
+ @post = Post.find(:first)
15
+ end
16
+
17
+ # autodetects the :controller
18
+ should_route :get, '/posts', :action => :index
19
+ # explicitly specify :controller
20
+ should_route :post, '/posts', :controller => :posts, :action => :create
21
+ # non-string parameter
22
+ should_route :get, '/posts/1', :action => :show, :id => 1
23
+ # string-parameter
24
+ should_route :put, '/posts/1', :action => :update, :id => "1"
25
+ should_route :delete, '/posts/1', :action => :destroy, :id => 1
26
+ should_route :get, '/posts/new', :action => :new
27
+
28
+ # Test the nested routes
29
+ should_route :get, '/users/5/posts', :action => :index, :user_id => 5
30
+ should_route :post, '/users/5/posts', :action => :create, :user_id => 5
31
+ should_route :get, '/users/5/posts/1', :action => :show, :id => 1, :user_id => 5
32
+ should_route :delete, '/users/5/posts/1', :action => :destroy, :id => 1, :user_id => 5
33
+ should_route :get, '/users/5/posts/new', :action => :new, :user_id => 5
34
+ should_route :put, '/users/5/posts/1', :action => :update, :id => 1, :user_id => 5
35
+
36
+ context "Logged in" do
37
+ setup do
38
+ @request.session[:logged_in] = true
39
+ end
40
+
41
+ context "viewing posts for a user" do
42
+ setup do
43
+ get :index, :user_id => users(:first)
44
+ end
45
+ should_respond_with :success
46
+ should_assign_to :user, :class => User, :equals => 'users(:first)'
47
+ should_assign_to(:user) { users(:first) }
48
+ should_fail do
49
+ should_assign_to :user, :class => Post
50
+ end
51
+ should_fail do
52
+ should_assign_to :user, :equals => 'posts(:first)'
53
+ end
54
+ should_fail do
55
+ should_assign_to(:user) { posts(:first) }
56
+ end
57
+ should_assign_to :posts
58
+ should_not_assign_to :foo, :bar
59
+ should_render_page_with_metadata :description => /Posts/, :title => /index/
60
+ should_render_page_with_metadata :keywords => "posts"
61
+ end
62
+
63
+ context "viewing posts for a user with rss format" do
64
+ setup do
65
+ get :index, :user_id => users(:first), :format => 'rss'
66
+ @user = users(:first)
67
+ end
68
+ should_respond_with :success
69
+ should_respond_with_content_type 'application/rss+xml'
70
+ should_respond_with_content_type :rss
71
+ should_respond_with_content_type /rss/
72
+ context "deprecated" do # to avoid redefining a test
73
+ should_return_from_session :special, "'$2 off your next purchase'"
74
+ end
75
+ should_fail do
76
+ should_return_from_session :special, "'not special'"
77
+ end
78
+ should_set_session(:mischief) { nil }
79
+ should_return_from_session :malarky, "nil"
80
+ should_set_session :special, "'$2 off your next purchase'"
81
+ should_set_session :special_user_id, '@user.id'
82
+ context "with a block" do
83
+ should_set_session(:special_user_id) { @user.id }
84
+ end
85
+ should_fail do # to avoid redefining a test
86
+ should_set_session(:special_user_id) { 'value' }
87
+ end
88
+ should_assign_to :user, :posts
89
+ should_not_assign_to :foo, :bar
90
+ end
91
+
92
+ context "viewing a post on GET to #show" do
93
+ setup { get :show, :user_id => users(:first), :id => posts(:first) }
94
+ should_render_with_layout 'wide'
95
+ context "with a symbol" do # to avoid redefining a test
96
+ should_render_with_layout :wide
97
+ end
98
+ should_assign_to :false_flag
99
+ end
100
+
101
+ context "on GET to #new" do
102
+ setup { get :new, :user_id => users(:first) }
103
+ should_render_without_layout
104
+ end
105
+
106
+ context "on POST to #create" do
107
+ setup do
108
+ post :create, :user_id => users(:first),
109
+ :post => { :title => "first post",
110
+ :body => 'blah blah blah' }
111
+ end
112
+
113
+ should_redirect_to 'user_post_url(@post.user, @post)'
114
+ should_redirect_to('the created post') { user_post_url(users(:first),
115
+ assigns(:post)) }
116
+ should_fail do
117
+ should_redirect_to 'user_posts_url(@post.user)'
118
+ end
119
+ should_fail do
120
+ should_redirect_to('elsewhere') { user_posts_url(users(:first)) }
121
+ end
122
+ end
123
+ end
124
+
125
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+ require 'users_controller'
3
+
4
+ # Re-raise errors caught by the controller.
5
+ class UsersController; def rescue_action(e) raise e end; end
6
+
7
+ class UsersControllerTest < Test::Unit::TestCase
8
+ fixtures :all
9
+
10
+ def setup
11
+ @controller = UsersController.new
12
+ @request = ActionController::TestRequest.new
13
+ @response = ActionController::TestResponse.new
14
+ @user = User.find(:first)
15
+ end
16
+
17
+ should_filter_params :ssn
18
+
19
+ end
@@ -0,0 +1,68 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class AllowMassAssignmentOfMatcherTest < Test::Unit::TestCase # :nodoc:
4
+
5
+ context "an attribute that is blacklisted from mass-assignment" do
6
+ setup do
7
+ define_model :example, :attr => :string do
8
+ attr_protected :attr
9
+ end
10
+ @model = Example.new
11
+ end
12
+
13
+ should "reject being mass-assignable" do
14
+ assert_rejects allow_mass_assignment_of(:attr), @model
15
+ end
16
+ end
17
+
18
+ context "an attribute that is not whitelisted for mass-assignment" do
19
+ setup do
20
+ define_model :example, :attr => :string, :other => :string do
21
+ attr_accessible :other
22
+ end
23
+ @model = Example.new
24
+ end
25
+
26
+ should "reject being mass-assignable" do
27
+ assert_rejects allow_mass_assignment_of(:attr), @model
28
+ end
29
+ end
30
+
31
+ context "an attribute that is whitelisted for mass-assignment" do
32
+ setup do
33
+ define_model :example, :attr => :string do
34
+ attr_accessible :attr
35
+ end
36
+ @model = Example.new
37
+ end
38
+
39
+ should "accept being mass-assignable" do
40
+ assert_accepts allow_mass_assignment_of(:attr), @model
41
+ end
42
+ end
43
+
44
+ context "an attribute not included in the mass-assignment blacklist" do
45
+ setup do
46
+ define_model :example, :attr => :string, :other => :string do
47
+ attr_protected :other
48
+ end
49
+ @model = Example.new
50
+ end
51
+
52
+ should "accept being mass-assignable" do
53
+ assert_accepts allow_mass_assignment_of(:attr), @model
54
+ end
55
+ end
56
+
57
+ context "an attribute on a class with no protected attributes" do
58
+ setup do
59
+ define_model :example, :attr => :string
60
+ @model = Example.new
61
+ end
62
+
63
+ should "accept being mass-assignable" do
64
+ assert_accepts allow_mass_assignment_of(:attr), @model
65
+ end
66
+ end
67
+
68
+ end
@@ -0,0 +1,41 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class AllowValueMatcherTest < Test::Unit::TestCase # :nodoc:
4
+
5
+ context "an attribute with a format validation" do
6
+ setup do
7
+ define_model :example, :attr => :string do
8
+ validates_format_of :attr, :with => /abc/
9
+ end
10
+ @model = Example.new
11
+ end
12
+
13
+ should "allow a good value" do
14
+ assert_accepts allow_value("abcde").for(:attr), @model
15
+ end
16
+
17
+ should "not allow a bad value" do
18
+ assert_rejects allow_value("xyz").for(:attr), @model
19
+ end
20
+ end
21
+
22
+ context "an attribute with a format validation and a custom message" do
23
+ setup do
24
+ define_model :example, :attr => :string do
25
+ validates_format_of :attr, :with => /abc/, :message => 'bad value'
26
+ end
27
+ @model = Example.new
28
+ end
29
+
30
+ should "allow a good value" do
31
+ assert_accepts allow_value('abcde').for(:attr).with_message(/bad/),
32
+ @model
33
+ end
34
+
35
+ should "not allow a bad value" do
36
+ assert_rejects allow_value('xyz').for(:attr).with_message(/bad/),
37
+ @model
38
+ end
39
+ end
40
+
41
+ end