technicalpickles-shoulda 2.0.6 → 2.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/README.rdoc +61 -11
  2. data/Rakefile +7 -5
  3. data/lib/shoulda.rb +7 -15
  4. data/lib/shoulda/action_controller.rb +28 -0
  5. data/lib/shoulda/action_controller/helpers.rb +47 -0
  6. data/lib/shoulda/action_controller/macros.rb +277 -0
  7. data/lib/shoulda/action_controller/matchers.rb +37 -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 +83 -0
  15. data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +85 -0
  16. data/lib/shoulda/action_mailer.rb +1 -1
  17. data/lib/shoulda/action_mailer/assertions.rb +32 -33
  18. data/lib/shoulda/action_view.rb +10 -0
  19. data/lib/shoulda/action_view/macros.rb +56 -0
  20. data/lib/shoulda/active_record.rb +6 -2
  21. data/lib/shoulda/active_record/assertions.rb +62 -81
  22. data/lib/shoulda/active_record/helpers.rb +40 -0
  23. data/lib/shoulda/active_record/macros.rb +514 -640
  24. data/lib/shoulda/active_record/matchers.rb +42 -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/assertions.rb +50 -40
  40. data/lib/shoulda/autoload_macros.rb +46 -0
  41. data/lib/shoulda/context.rb +124 -126
  42. data/lib/shoulda/helpers.rb +5 -7
  43. data/lib/shoulda/macros.rb +63 -64
  44. data/lib/shoulda/private_helpers.rb +16 -18
  45. data/lib/shoulda/rails.rb +5 -11
  46. data/lib/shoulda/rspec.rb +11 -0
  47. data/lib/shoulda/tasks/list_tests.rake +6 -1
  48. data/lib/shoulda/test_unit.rb +19 -0
  49. data/rails/init.rb +7 -1
  50. data/test/README +2 -2
  51. data/test/fail_macros.rb +16 -16
  52. data/test/functional/posts_controller_test.rb +33 -24
  53. data/test/functional/users_controller_test.rb +0 -19
  54. data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +68 -0
  55. data/test/matchers/active_record/allow_value_matcher_test.rb +41 -0
  56. data/test/matchers/active_record/association_matcher_test.rb +258 -0
  57. data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +80 -0
  58. data/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
  59. data/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
  60. data/test/matchers/active_record/have_index_matcher_test.rb +74 -0
  61. data/test/matchers/active_record/have_named_scope_matcher_test.rb +65 -0
  62. data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
  63. data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
  64. data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
  65. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
  66. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
  67. data/test/matchers/controller/assign_to_matcher_test.rb +35 -0
  68. data/test/matchers/controller/filter_param_matcher_test.rb +32 -0
  69. data/test/matchers/controller/render_with_layout_matcher_test.rb +33 -0
  70. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +27 -0
  71. data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
  72. data/test/matchers/controller/route_matcher_test.rb +58 -0
  73. data/test/matchers/controller/set_session_matcher_test.rb +27 -0
  74. data/test/matchers/controller/set_the_flash_matcher.rb +41 -0
  75. data/test/model_builder.rb +106 -0
  76. data/test/other/autoload_macro_test.rb +18 -0
  77. data/test/other/helpers_test.rb +58 -0
  78. data/test/other/private_helpers_test.rb +1 -1
  79. data/test/other/should_test.rb +16 -16
  80. data/test/rails_root/app/controllers/posts_controller.rb +6 -5
  81. data/test/rails_root/app/models/pets/dog.rb +10 -0
  82. data/test/rails_root/app/models/treat.rb +3 -0
  83. data/test/rails_root/app/models/user.rb +4 -3
  84. data/test/rails_root/app/views/layouts/posts.rhtml +2 -0
  85. data/test/rails_root/config/database.yml +1 -1
  86. data/test/rails_root/config/environment.rb +1 -1
  87. data/test/rails_root/config/environments/{sqlite3.rb → test.rb} +0 -0
  88. data/test/rails_root/db/migrate/001_create_users.rb +3 -2
  89. data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
  90. data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
  91. data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
  92. data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
  93. data/test/rspec_test.rb +207 -0
  94. data/test/test_helper.rb +3 -1
  95. data/test/unit/address_test.rb +1 -1
  96. data/test/unit/dog_test.rb +5 -2
  97. data/test/unit/post_test.rb +7 -3
  98. data/test/unit/product_test.rb +2 -2
  99. data/test/unit/tag_test.rb +2 -1
  100. data/test/unit/user_test.rb +27 -9
  101. metadata +82 -13
  102. data/lib/shoulda/controller.rb +0 -30
  103. data/lib/shoulda/controller/formats/html.rb +0 -201
  104. data/lib/shoulda/controller/formats/xml.rb +0 -170
  105. data/lib/shoulda/controller/helpers.rb +0 -64
  106. data/lib/shoulda/controller/macros.rb +0 -316
  107. data/lib/shoulda/controller/resource_options.rb +0 -236
  108. data/test/rails_root/app/models/dog.rb +0 -5
@@ -1,10 +1,8 @@
1
- module ThoughtBot # :nodoc:
2
- module Shoulda # :nodoc:
3
- module Helpers
4
- # Prints a message to stdout, tagged with the name of the calling method.
5
- def report!(msg = "")
6
- puts("#{caller.first}: #{msg}")
7
- end
1
+ module Shoulda # :nodoc:
2
+ module Helpers
3
+ # Prints a message to stdout, tagged with the name of the calling method.
4
+ def report!(msg = "")
5
+ puts("#{caller.first}: #{msg}")
8
6
  end
9
7
  end
10
8
  end
@@ -1,74 +1,73 @@
1
1
  require 'shoulda/private_helpers'
2
2
 
3
- module ThoughtBot # :nodoc:
4
- module Shoulda # :nodoc:
5
- module Macros
6
- # Macro that creates a test asserting a change between the return value
7
- # of an expression that is run before and after the current setup block
8
- # is run. This is similar to Active Support's <tt>assert_difference</tt>
9
- # assertion, but supports more than just numeric values. See also
10
- # should_not_change.
11
- #
12
- # Example:
13
- #
14
- # context "Creating a post" do
15
- # setup { Post.create }
16
- # should_change "Post.count", :by => 1
17
- # end
18
- #
19
- # As shown in this example, the <tt>:by</tt> option expects a numeric
20
- # difference between the before and after values of the expression. You
21
- # may also specify <tt>:from</tt> and <tt>:to</tt> options:
22
- #
23
- # should_change "Post.count", :from => 0, :to => 1
24
- # should_change "@post.title", :from => "old", :to => "new"
25
- #
26
- # Combinations of <tt>:by</tt>, <tt>:from</tt>, and <tt>:to</tt> are allowed:
27
- #
28
- # should_change "@post.title" # => assert the value changed in some way
29
- # should_change "@post.title", :from => "old" # => assert the value changed to anything other than "old"
30
- # should_change "@post.title", :to => "new" # => assert the value changed from anything other than "new"
31
- def should_change(expression, options = {})
32
- by, from, to = get_options!([options], :by, :from, :to)
33
- stmt = "change #{expression.inspect}"
34
- stmt << " from #{from.inspect}" if from
35
- stmt << " to #{to.inspect}" if to
36
- stmt << " by #{by.inspect}" if by
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
37
36
 
38
- expression_eval = lambda { eval(expression) }
39
- before = lambda { @_before_should_change = expression_eval.bind(self).call }
40
- should stmt, :before => before do
41
- old_value = @_before_should_change
42
- new_value = expression_eval.bind(self).call
43
- assert_operator from, :===, old_value, "#{expression.inspect} did not originally match #{from.inspect}" if from
44
- assert_not_equal old_value, new_value, "#{expression.inspect} did not change" unless by == 0
45
- assert_operator to, :===, new_value, "#{expression.inspect} was not changed to match #{to.inspect}" if to
46
- assert_equal old_value + by, new_value if by
47
- end
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
48
46
  end
47
+ end
49
48
 
50
- # Macro that creates a test asserting no change between the return value
51
- # of an expression that is run before and after the current setup block
52
- # is run. This is the logical opposite of should_change.
53
- #
54
- # Example:
55
- #
56
- # context "Updating a post" do
57
- # setup { @post.update_attributes(:title => "new") }
58
- # should_not_change "Post.count"
59
- # end
60
- def should_not_change(expression)
61
- expression_eval = lambda { eval(expression) }
62
- before = lambda { @_before_should_not_change = expression_eval.bind(self).call }
63
- should "not change #{expression.inspect}", :before => before do
64
- new_value = expression_eval.bind(self).call
65
- assert_equal @_before_should_not_change, new_value, "#{expression.inspect} changed"
66
- end
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"
67
65
  end
66
+ end
68
67
 
69
- private
68
+ private
70
69
 
71
- include ThoughtBot::Shoulda::Private
72
- end
70
+ include Shoulda::Private
73
71
  end
74
72
  end
73
+
@@ -1,22 +1,20 @@
1
- module ThoughtBot # :nodoc:
2
- module Shoulda # :nodoc:
3
- module Private # :nodoc:
4
- # Returns the values for the entries in the args hash who's keys are listed in the wanted array.
5
- # Will raise if there are keys in the args hash that aren't listed.
6
- def get_options!(args, *wanted)
7
- ret = []
8
- opts = (args.last.is_a?(Hash) ? args.pop : {})
9
- wanted.each {|w| ret << opts.delete(w)}
10
- raise ArgumentError, "Unsupported options given: #{opts.keys.join(', ')}" unless opts.keys.empty?
11
- return *ret
12
- end
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
13
12
 
14
- # Returns the model class constant, as determined by the test class name.
15
- #
16
- # class TestUser; model_class; end => User
17
- def model_class
18
- self.name.gsub(/Test$/, '').constantize
19
- end
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
20
18
  end
21
19
  end
22
20
  end
data/lib/shoulda/rails.rb CHANGED
@@ -2,18 +2,12 @@ require 'rubygems'
2
2
  require 'active_support'
3
3
  require 'shoulda'
4
4
 
5
- require 'shoulda/active_record' if defined? ActiveRecord::Base
6
- require 'shoulda/controller' if defined? ActionController::Base
7
- require 'shoulda/action_mailer' if defined? ActionMailer::Base
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
8
9
 
9
10
  if defined?(RAILS_ROOT)
10
11
  # load in the 3rd party macros from vendorized plugins and gems
11
- Dir[File.join(RAILS_ROOT, "vendor", "{plugins,gems}", "*", "shoulda_macros", "*.rb")].each do |macro_file_path|
12
- require macro_file_path
13
- end
14
-
15
- # load in the local application specific macros
16
- Dir[File.join(RAILS_ROOT, "test", "shoulda_macros", "*.rb")].each do |macro_file_path|
17
- require macro_file_path
18
- end
12
+ Shoulda.autoload_macros RAILS_ROOT, File.join("vendor", "{plugins,gems}", "*")
19
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
@@ -13,7 +13,12 @@ namespace :shoulda do
13
13
  test_files = Dir.glob(File.join('test', '**', '*_test.rb'))
14
14
  test_files.each do |file|
15
15
  load file
16
- klass = File.basename(file, '.rb').classify.constantize
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
17
22
 
18
23
  puts klass.name.gsub('Test', '')
19
24
 
@@ -0,0 +1,19 @@
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
+ module Test # :nodoc: all
10
+ module Unit
11
+ class TestCase
12
+ extend Shoulda::ClassMethods
13
+ include Shoulda::Assertions
14
+ extend Shoulda::Macros
15
+ include Shoulda::Helpers
16
+ end
17
+ end
18
+ end
19
+
data/rails/init.rb CHANGED
@@ -1 +1,7 @@
1
- require 'shoulda/rails'
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 CHANGED
@@ -6,7 +6,7 @@ The test directory contains the following files and subdirectories:
6
6
 
7
7
  * rails_root - contains the stripped down rails application that the tests run against. The rails root contains:
8
8
  ** the models, controllers, and views defined under app/
9
- ** the sqlite3.rb environment file
9
+ ** the test.rb environment file
10
10
  ** a migration file for each model
11
11
  ** a shoulda initializer that simulates loading the plugin but without relying on vendor/plugins
12
12
  * fixtures - contain the sample DB data for each model
@@ -14,7 +14,7 @@ The test directory contains the following files and subdirectories:
14
14
  * unit - model tests for each of the models under rails_root/app
15
15
  * other - tests for the shoulda contexts, should statements, and assertions
16
16
  * test_helper.rb - responsible for initializing the test environment
17
- ** sets the rails_env to sqlite3
17
+ ** sets the rails_env to test
18
18
  ** sets the rails_root
19
19
  ** runs all the migrations against the in-memory sqlite3 db
20
20
  ** adds some magic to load the right fixture files
data/test/fail_macros.rb CHANGED
@@ -1,15 +1,15 @@
1
- module Thoughtbot
2
- module Shoulda
3
- class << self
4
- attr_accessor :expected_exceptions
5
- end
1
+ module Shoulda
2
+ class << self
3
+ attr_accessor :expected_exceptions
4
+ end
6
5
 
6
+ module ClassMethods
7
7
  # Enables the core shoulda test suite to test for failure scenarios. For
8
8
  # example, to ensure that a set of test macros should fail, do this:
9
9
  #
10
10
  # should_fail do
11
- # should_require_attributes :comments
12
- # should_protect_attributes :name
11
+ # should_validate_presence_of :comments
12
+ # should_not_allow_mass_assignment_of :name
13
13
  # end
14
14
  def should_fail(&block)
15
15
  context "should fail when trying to run:" do
@@ -18,17 +18,17 @@ module Thoughtbot
18
18
  Shoulda.expected_exceptions = nil
19
19
  end
20
20
  end
21
+ end
21
22
 
22
- class Context
23
- # alias_method_chain hack to allow the should_fail macro to work
24
- def should_with_failure_scenario(name, options = {}, &block)
25
- if Shoulda.expected_exceptions
26
- expected_exceptions = Shoulda.expected_exceptions
27
- failure_block = lambda { assert_raise(*expected_exceptions, &block.bind(self)) }
28
- end
29
- should_without_failure_scenario(name, options, &(failure_block || block))
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)) }
30
29
  end
31
- alias_method_chain :should, :failure_scenario
30
+ should_without_failure_scenario(name, options, &(failure_block || block))
32
31
  end
32
+ alias_method_chain :should, :failure_scenario
33
33
  end
34
34
  end
@@ -13,7 +13,7 @@ class PostsControllerTest < Test::Unit::TestCase
13
13
  @response = ActionController::TestResponse.new
14
14
  @post = Post.find(:first)
15
15
  end
16
-
16
+
17
17
  # autodetects the :controller
18
18
  should_route :get, '/posts', :action => :index
19
19
  # explicitly specify :controller
@@ -24,7 +24,7 @@ class PostsControllerTest < Test::Unit::TestCase
24
24
  should_route :put, '/posts/1', :action => :update, :id => "1"
25
25
  should_route :delete, '/posts/1', :action => :destroy, :id => 1
26
26
  should_route :get, '/posts/new', :action => :new
27
-
27
+
28
28
  # Test the nested routes
29
29
  should_route :get, '/users/5/posts', :action => :index, :user_id => 5
30
30
  should_route :post, '/users/5/posts', :action => :create, :user_id => 5
@@ -33,46 +33,31 @@ class PostsControllerTest < Test::Unit::TestCase
33
33
  should_route :get, '/users/5/posts/new', :action => :new, :user_id => 5
34
34
  should_route :put, '/users/5/posts/1', :action => :update, :id => 1, :user_id => 5
35
35
 
36
- context "The public" do
37
- setup do
38
- @request.session[:logged_in] = false
39
- end
40
-
41
- should_be_restful do |resource|
42
- resource.parent = :user
43
-
44
- resource.denied.actions = [:index, :show, :edit, :new, :create, :update, :destroy]
45
- resource.denied.flash = /what/i
46
- resource.denied.redirect = '"/"'
47
- end
48
- end
49
-
50
36
  context "Logged in" do
51
37
  setup do
52
38
  @request.session[:logged_in] = true
53
39
  end
54
40
 
55
- should_be_restful do |resource|
56
- resource.parent = :user
57
-
58
- resource.create.params = { :title => "first post", :body => 'blah blah blah'}
59
- resource.update.params = { :title => "changed" }
60
- end
61
-
62
41
  context "viewing posts for a user" do
63
42
  setup do
64
43
  get :index, :user_id => users(:first)
65
44
  end
66
45
  should_respond_with :success
67
46
  should_assign_to :user, :class => User, :equals => 'users(:first)'
47
+ should_assign_to(:user) { users(:first) }
68
48
  should_fail do
69
49
  should_assign_to :user, :class => Post
70
50
  end
71
51
  should_fail do
72
52
  should_assign_to :user, :equals => 'posts(:first)'
73
53
  end
54
+ should_fail do
55
+ should_assign_to(:user) { posts(:first) }
56
+ end
74
57
  should_assign_to :posts
75
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"
76
61
  end
77
62
 
78
63
  context "viewing posts for a user with rss format" do
@@ -85,7 +70,12 @@ class PostsControllerTest < Test::Unit::TestCase
85
70
  should_respond_with_content_type :rss
86
71
  should_respond_with_content_type /rss/
87
72
  should_return_from_session :special, "'$2 off your next purchase'"
88
- should_return_from_session :special_user_id, '@user.id'
73
+ should_set_session :special, "'$2 off your next purchase'"
74
+ should_set_session :special_user_id, '@user.id'
75
+ should_set_session(:special_user_id) { @user.id }
76
+ should_fail do
77
+ should_set_session(:special_user_id) { 'value' }
78
+ end
89
79
  should_assign_to :user, :posts
90
80
  should_not_assign_to :foo, :bar
91
81
  end
@@ -94,12 +84,31 @@ class PostsControllerTest < Test::Unit::TestCase
94
84
  setup { get :show, :user_id => users(:first), :id => posts(:first) }
95
85
  should_render_with_layout 'wide'
96
86
  should_render_with_layout :wide
87
+ should_assign_to :false_flag
97
88
  end
98
89
 
99
90
  context "on GET to #new" do
100
91
  setup { get :new, :user_id => users(:first) }
101
92
  should_render_without_layout
102
93
  end
94
+
95
+ context "on POST to #create" do
96
+ setup do
97
+ post :create, :user_id => users(:first),
98
+ :post => { :title => "first post",
99
+ :body => 'blah blah blah' }
100
+ end
101
+
102
+ should_redirect_to 'user_post_url(@post.user, @post)'
103
+ should_redirect_to('the created post') { user_post_url(users(:first),
104
+ assigns(:post)) }
105
+ should_fail do
106
+ should_redirect_to 'user_posts_url(@post.user)'
107
+ end
108
+ should_fail do
109
+ should_redirect_to('elsewhere') { user_posts_url(users(:first)) }
110
+ end
111
+ end
103
112
  end
104
113
 
105
114
  end