Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Created shoulda metagem

  • Loading branch information...
commit 46076d5c7517cfc5f11934502eddba99e2dd7da3 1 parent c482786
Joe Ferris jferris authored jferris committed

Showing 162 changed files with 26 additions and 14,398 deletions. Show diff stats Hide diff stats

  1. +1 2  Gemfile
  2. +1 9 Gemfile.lock
  3. +4 28 Rakefile
  4. +2 2 features/rails_integration.feature
  5. +5 0 features/step_definitions/rails_steps.rb
  6. +0 8 lib/shoulda-matchers.rb
  7. +0 38 lib/shoulda/matchers/action_controller.rb
  8. +0 114 lib/shoulda/matchers/action_controller/assign_to_matcher.rb
  9. +0 50 lib/shoulda/matchers/action_controller/filter_param_matcher.rb
  10. +0 62 lib/shoulda/matchers/action_controller/redirect_to_matcher.rb
  11. +0 54 lib/shoulda/matchers/action_controller/render_template_matcher.rb
  12. +0 99 lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb
  13. +0 74 lib/shoulda/matchers/action_controller/respond_with_content_type_matcher.rb
  14. +0 85 lib/shoulda/matchers/action_controller/respond_with_matcher.rb
  15. +0 93 lib/shoulda/matchers/action_controller/route_matcher.rb
  16. +0 98 lib/shoulda/matchers/action_controller/set_session_matcher.rb
  17. +0 94 lib/shoulda/matchers/action_controller/set_the_flash_matcher.rb
  18. +0 22 lib/shoulda/matchers/action_mailer.rb
  19. +0 110 lib/shoulda/matchers/action_mailer/have_sent_email.rb
  20. +0 42 lib/shoulda/matchers/active_record.rb
  21. +0 83 lib/shoulda/matchers/active_record/allow_mass_assignment_of_matcher.rb
  22. +0 110 lib/shoulda/matchers/active_record/allow_value_matcher.rb
  23. +0 226 lib/shoulda/matchers/active_record/association_matcher.rb
  24. +0 87 lib/shoulda/matchers/active_record/ensure_inclusion_of_matcher.rb
  25. +0 141 lib/shoulda/matchers/active_record/ensure_length_of_matcher.rb
  26. +0 169 lib/shoulda/matchers/active_record/have_db_column_matcher.rb
  27. +0 112 lib/shoulda/matchers/active_record/have_db_index_matcher.rb
  28. +0 59 lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb
  29. +0 34 lib/shoulda/matchers/active_record/helpers.rb
  30. +0 41 lib/shoulda/matchers/active_record/validate_acceptance_of_matcher.rb
  31. +0 65 lib/shoulda/matchers/active_record/validate_format_of_matcher.rb
  32. +0 39 lib/shoulda/matchers/active_record/validate_numericality_of_matcher.rb
  33. +0 60 lib/shoulda/matchers/active_record/validate_presence_of_matcher.rb
  34. +0 148 lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb
  35. +0 56 lib/shoulda/matchers/active_record/validation_matcher.rb
  36. +0 23 lib/shoulda/matchers/integrations/rspec.rb
  37. +0 41 lib/shoulda/matchers/integrations/test_unit.rb
  38. +0 6 lib/shoulda/matchers/version.rb
  39. +4 0 lib/shoulda/version.rb
  40. +9 3 shoulda-matchers.gemspec → shoulda.gemspec
  41. +0 3  spec/fixtures/addresses.yml
  42. 0  spec/fixtures/friendships.yml
  43. +0 5 spec/fixtures/posts.yml
  44. 0  spec/fixtures/products.yml
  45. 0  spec/fixtures/taggings.yml
  46. +0 9 spec/fixtures/tags.yml
  47. +0 6 spec/fixtures/users.yml
  48. +0 4 spec/rails3_root/.gitignore
  49. +0 7 spec/rails3_root/Gemfile
  50. +0 95 spec/rails3_root/Gemfile.lock
  51. +0 244 spec/rails3_root/README
  52. +0 10 spec/rails3_root/Rakefile
  53. +0 22 spec/rails3_root/app/controllers/application_controller.rb
  54. +0 87 spec/rails3_root/app/controllers/posts_controller.rb
  55. +0 82 spec/rails3_root/app/controllers/users_controller.rb
  56. +0 2  spec/rails3_root/app/helpers/application_helper.rb
  57. +0 7 spec/rails3_root/app/models/address.rb
  58. +0 11 spec/rails3_root/app/models/flea.rb
  59. +0 4 spec/rails3_root/app/models/friendship.rb
  60. +0 8 spec/rails3_root/app/models/notifier.rb
  61. +0 7 spec/rails3_root/app/models/pets/cat.rb
  62. +0 10 spec/rails3_root/app/models/pets/dog.rb
  63. +0 12 spec/rails3_root/app/models/post.rb
  64. +0 12 spec/rails3_root/app/models/product.rb
  65. +0 2  spec/rails3_root/app/models/profile.rb
  66. +0 2  spec/rails3_root/app/models/registration.rb
  67. +0 8 spec/rails3_root/app/models/tag.rb
  68. +0 4 spec/rails3_root/app/models/tagging.rb
  69. +0 3  spec/rails3_root/app/models/treat.rb
  70. +0 32 spec/rails3_root/app/models/user.rb
  71. +0 14 spec/rails3_root/app/views/layouts/application.html.erb
  72. +0 19 spec/rails3_root/app/views/layouts/posts.rhtml
  73. +0 17 spec/rails3_root/app/views/layouts/users.rhtml
  74. +0 1  spec/rails3_root/app/views/layouts/wide.html.erb
  75. +0 1  spec/rails3_root/app/views/notifier/the_email.html.erb
  76. +0 27 spec/rails3_root/app/views/posts/edit.rhtml
  77. +0 25 spec/rails3_root/app/views/posts/index.rhtml
  78. +0 24 spec/rails3_root/app/views/posts/new.rhtml
  79. +0 18 spec/rails3_root/app/views/posts/show.rhtml
  80. +0 22 spec/rails3_root/app/views/users/edit.rhtml
  81. +0 22 spec/rails3_root/app/views/users/index.rhtml
  82. +0 21 spec/rails3_root/app/views/users/new.rhtml
  83. +0 13 spec/rails3_root/app/views/users/show.rhtml
  84. +0 4 spec/rails3_root/config.ru
  85. +0 46 spec/rails3_root/config/application.rb
  86. +0 6 spec/rails3_root/config/boot.rb
  87. +0 22 spec/rails3_root/config/database.yml
  88. +0 5 spec/rails3_root/config/environment.rb
  89. +0 19 spec/rails3_root/config/environments/development.rb
  90. +0 42 spec/rails3_root/config/environments/production.rb
  91. +0 33 spec/rails3_root/config/environments/test.rb
  92. +0 7 spec/rails3_root/config/initializers/backtrace_silencers.rb
  93. +0 10 spec/rails3_root/config/initializers/inflections.rb
  94. +0 5 spec/rails3_root/config/initializers/mime_types.rb
  95. +0 7 spec/rails3_root/config/initializers/secret_token.rb
  96. +0 8 spec/rails3_root/config/initializers/session_store.rb
  97. +0 5 spec/rails3_root/config/locales/en.yml
  98. +0 2  spec/rails3_root/config/routes.rb
  99. +0 19 spec/rails3_root/db/migrate/001_create_users.rb
  100. +0 13 spec/rails3_root/db/migrate/002_create_posts.rb
  101. +0 12 spec/rails3_root/db/migrate/003_create_taggings.rb
  102. +0 11 spec/rails3_root/db/migrate/004_create_tags.rb
  103. +0 12 spec/rails3_root/db/migrate/005_create_dogs.rb
  104. +0 14 spec/rails3_root/db/migrate/006_create_addresses.rb
  105. +0 11 spec/rails3_root/db/migrate/007_create_fleas.rb
  106. +0 12 spec/rails3_root/db/migrate/008_create_dogs_fleas.rb
  107. +0 17 spec/rails3_root/db/migrate/009_create_products.rb
  108. +0 14 spec/rails3_root/db/migrate/010_create_friendships.rb
  109. +0 12 spec/rails3_root/db/migrate/011_create_treats.rb
  110. +0 12 spec/rails3_root/db/migrate/20090506203502_create_profiles.rb
  111. +0 14 spec/rails3_root/db/migrate/20090506203536_create_registrations.rb
  112. +0 12 spec/rails3_root/db/migrate/20090513104502_create_cats.rb
  113. +0 7 spec/rails3_root/db/seeds.rb
  114. 0  spec/rails3_root/lib/tasks/.gitkeep
  115. +0 26 spec/rails3_root/public/404.html
  116. +0 26 spec/rails3_root/public/422.html
  117. +0 26 spec/rails3_root/public/500.html
  118. 0  spec/rails3_root/public/favicon.ico
  119. BIN  spec/rails3_root/public/images/rails.png
  120. +0 279 spec/rails3_root/public/index.html
  121. +0 2  spec/rails3_root/public/javascripts/application.js
  122. +0 965 spec/rails3_root/public/javascripts/controls.js
  123. +0 974 spec/rails3_root/public/javascripts/dragdrop.js
  124. +0 1,123 spec/rails3_root/public/javascripts/effects.js
  125. +0 4,874 spec/rails3_root/public/javascripts/prototype.js
  126. +0 118 spec/rails3_root/public/javascripts/rails.js
  127. +0 5 spec/rails3_root/public/robots.txt
  128. 0  spec/rails3_root/public/stylesheets/.gitkeep
  129. +0 9 spec/rails3_root/script/rails
  130. +0 9 spec/rails3_root/test/performance/browsing_test.rb
  131. +0 6 spec/rails3_root/test/shoulda_macros/custom_macro.rb
  132. +0 13 spec/rails3_root/test/test_helper.rb
  133. +0 6 spec/rails3_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb
  134. 0  spec/rails3_root/vendor/plugins/.gitkeep
  135. 0  spec/rails3_root/vendor/plugins/.keep
  136. +0 6 spec/rails3_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb
  137. +0 55 spec/shoulda/action_controller/assign_to_matcher_spec.rb
  138. +0 23 spec/shoulda/action_controller/filter_param_matcher_spec.rb
  139. +0 37 spec/shoulda/action_controller/redirect_to_matcher_spec.rb
  140. +0 38 spec/shoulda/action_controller/render_template_matcher_spec.rb
  141. +0 48 spec/shoulda/action_controller/render_with_layout_matcher_spec.rb
  142. +0 32 spec/shoulda/action_controller/respond_with_content_type_matcher_spec.rb
  143. +0 96 spec/shoulda/action_controller/respond_with_matcher_spec.rb
  144. +0 66 spec/shoulda/action_controller/route_matcher_spec.rb
  145. +0 48 spec/shoulda/action_controller/set_session_matcher_spec.rb
  146. +0 95 spec/shoulda/action_controller/set_the_flash_matcher_spec.rb
  147. +0 71 spec/shoulda/action_mailer/have_sent_email_spec.rb
  148. +0 74 spec/shoulda/active_record/allow_mass_assignment_of_matcher_spec.rb
  149. +0 62 spec/shoulda/active_record/allow_value_matcher_spec.rb
  150. +0 261 spec/shoulda/active_record/association_matcher_spec.rb
  151. +0 71 spec/shoulda/active_record/ensure_inclusion_of_matcher_spec.rb
  152. +0 125 spec/shoulda/active_record/ensure_length_of_matcher_spec.rb
  153. +0 169 spec/shoulda/active_record/have_db_column_matcher_spec.rb
  154. +0 90 spec/shoulda/active_record/have_db_index_matcher_spec.rb
  155. +0 29 spec/shoulda/active_record/have_readonly_attributes_matcher_spec.rb
  156. +0 43 spec/shoulda/active_record/validate_acceptance_of_matcher_spec.rb
  157. +0 35 spec/shoulda/active_record/validate_format_of_matcher_spec.rb
  158. +0 49 spec/shoulda/active_record/validate_numericality_of_matcher_spec.rb
  159. +0 86 spec/shoulda/active_record/validate_presence_of_matcher_spec.rb
  160. +0 145 spec/shoulda/active_record/validate_uniqueness_of_matcher_spec.rb
  161. +0 32 spec/spec_helper.rb
  162. +0 129 spec/support/model_builder.rb
3  Gemfile
@@ -2,8 +2,7 @@ source 'http://rubygems.org'
2 2
3 3 gem 'rails', '3.0.3'
4 4 gem 'sqlite3-ruby', :require => 'sqlite3'
5   -gem 'mocha'
6   -gem 'rspec-rails'
  5 +gem 'rspec'
7 6 gem 'ruby-debug'
8 7 gem 'cucumber'
9 8 gem "aruba"
10 Gemfile.lock
@@ -56,8 +56,6 @@ GEM
56 56 mime-types (~> 1.16)
57 57 treetop (~> 1.4.8)
58 58 mime-types (1.16)
59   - mocha (0.9.10)
60   - rake
61 59 polyglot (0.3.1)
62 60 rack (1.2.1)
63 61 rack-mount (0.6.13)
@@ -86,11 +84,6 @@ GEM
86 84 rspec-expectations (2.3.0)
87 85 diff-lcs (~> 1.1.2)
88 86 rspec-mocks (2.3.0)
89   - rspec-rails (2.3.0)
90   - actionpack (~> 3.0)
91   - activesupport (~> 3.0)
92   - railties (~> 3.0)
93   - rspec (~> 2.3.0)
94 87 ruby-debug (0.10.4)
95 88 columnize (>= 0.1)
96 89 ruby-debug-base (~> 0.10.4.0)
@@ -109,8 +102,7 @@ PLATFORMS
109 102 DEPENDENCIES
110 103 aruba
111 104 cucumber
112   - mocha
113 105 rails (= 3.0.3)
114   - rspec-rails
  106 + rspec
115 107 ruby-debug
116 108 sqlite3-ruby
32 Rakefile
... ... @@ -1,37 +1,13 @@
1 1 require 'rubygems'
2 2 require 'bundler/setup'
3 3 require 'rake'
4   -require 'rake/rdoctask'
5 4 require 'rake/gempackagetask'
6   -require 'rspec/core/rake_task'
7 5 require 'cucumber/rake/task'
8 6
9 7 $LOAD_PATH.unshift("lib")
10   -require 'shoulda/matchers/version'
  8 +require 'shoulda/version'
11 9
12   -Rake::RDocTask.new { |rdoc|
13   - rdoc.rdoc_dir = 'doc'
14   - rdoc.title = "Shoulda -- Making tests easy on the fingers and eyes"
15   - rdoc.options << '--line-numbers'
16   - rdoc.template = "#{ENV['template']}.rb" if ENV['template']
17   - rdoc.rdoc_files.include('README.rdoc', 'CONTRIBUTION_GUIDELINES.rdoc', 'lib/**/*.rb')
18   -}
19   -
20   -RSpec::Core::RakeTask.new do |t|
21   - t.pattern = "spec/**/*_spec.rb"
22   - t.rspec_opts = '--color --format progress'
23   - t.verbose = false
24   -end
25   -
26   -desc "Run code-coverage analysis using rcov"
27   -RSpec::Core::RakeTask.new(:coverage) do |t|
28   - t.rspec_opts = '--color --format progress'
29   - t.rcov = true
30   - t.rcov_opts = %{--exclude osx\/objc,spec,gems\/ --failure-threshold 100}
31   - t.pattern = "spec/**/*_spec.rb"
32   -end
33   -
34   -eval("$specification = begin; #{IO.read('shoulda-matchers.gemspec')}; end")
  10 +eval("$specification = begin; #{IO.read('shoulda.gemspec')}; end")
35 11 Rake::GemPackageTask.new $specification do |pkg|
36 12 pkg.need_tar = true
37 13 pkg.need_zip = true
@@ -45,6 +21,6 @@ Cucumber::Rake::Task.new do |t|
45 21 t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
46 22 end
47 23
48   -desc 'Default: run specs and cucumber features'
49   -task :default => [:spec, :cucumber]
  24 +desc 'Default: run cucumber features'
  25 +task :default => [:cucumber]
50 26
4 features/rails_integration.feature
@@ -33,7 +33,7 @@ Feature: integrate with Rails
33 33
34 34 Scenario: generate a rails application and use matchers in Test::Unit
35 35 When I configure the application to use shoulda-context
36   - And I configure the application to use "shoulda-matchers" from this project
  36 + When I configure the application to use shoulda-matchers
37 37 And I write to "test/unit/user_test.rb" with:
38 38 """
39 39 require 'test_helper'
@@ -63,7 +63,7 @@ Feature: integrate with Rails
63 63
64 64 Scenario: generate a rails application and use matchers in Rspec
65 65 When I configure the application to use rspec-rails
66   - And I configure the application to use "shoulda-matchers" from this project
  66 + And I configure the application to use shoulda-matchers
67 67 And I run the rspec generator
68 68 And I write to "spec/models/user_spec.rb" with:
69 69 """
5 features/step_definitions/rails_steps.rb
@@ -36,6 +36,11 @@
36 36 steps %{And I run "bundle install --local"}
37 37 end
38 38
  39 +When /^I configure the application to use shoulda-matchers$/ do
  40 + append_to_gemfile "gem 'shoulda-matchers', :git => 'git@github.com:thoughtbot/shoulda-matchers.git'"
  41 + steps %{And I run "bundle install --local"}
  42 +end
  43 +
39 44 When /^I configure a wildcard route$/ do
40 45 steps %{
41 46 When I write to "config/routes.rb" with:
8 lib/shoulda-matchers.rb
... ... @@ -1,8 +0,0 @@
1   -require 'shoulda/matchers/version'
2   -
3   -if defined?(RSpec)
4   - require 'shoulda/matchers/integrations/rspec'
5   -else
6   - require 'shoulda/matchers/integrations/test_unit'
7   -end
8   -
38 lib/shoulda/matchers/action_controller.rb
... ... @@ -1,38 +0,0 @@
1   -require 'shoulda/matchers/action_controller/assign_to_matcher'
2   -require 'shoulda/matchers/action_controller/filter_param_matcher'
3   -require 'shoulda/matchers/action_controller/set_the_flash_matcher'
4   -require 'shoulda/matchers/action_controller/render_with_layout_matcher'
5   -require 'shoulda/matchers/action_controller/respond_with_matcher'
6   -require 'shoulda/matchers/action_controller/respond_with_content_type_matcher'
7   -require 'shoulda/matchers/action_controller/set_session_matcher'
8   -require 'shoulda/matchers/action_controller/route_matcher'
9   -require 'shoulda/matchers/action_controller/redirect_to_matcher'
10   -require 'shoulda/matchers/action_controller/render_template_matcher'
11   -
12   -module Shoulda
13   - module Matchers
14   - # By using the matchers you can quickly and easily create concise and
15   - # easy to read test suites.
16   - #
17   - # This code segment:
18   - #
19   - # describe UsersController, "on GET to show with a valid id" do
20   - # before(:each) do
21   - # get :show, :id => User.first.to_param
22   - # end
23   - #
24   - # it { should assign_to(:user) }
25   - # it { should respond_with(:success) }
26   - # it { should render_template(:show) }
27   - # it { should not_set_the_flash) }
28   - #
29   - # it "should do something else really cool" do
30   - # assigns[:user].id.should == 1
31   - # end
32   - # end
33   - #
34   - # Would produce 5 tests for the show action
35   - module ActionController
36   - end
37   - end
38   -end
114 lib/shoulda/matchers/action_controller/assign_to_matcher.rb
... ... @@ -1,114 +0,0 @@
1   -module Shoulda # :nodoc:
2   - module Matchers
3   - module ActionController # :nodoc:
4   -
5   - # Ensures that the controller assigned to the named instance variable.
6   - #
7   - # Options:
8   - # * <tt>with_kind_of</tt> - The expected class of the instance variable
9   - # being checked.
10   - # * <tt>with</tt> - The value that should be assigned.
11   - #
12   - # Example:
13   - #
14   - # it { should assign_to(:user) }
15   - # it { should_not assign_to(:user) }
16   - # it { should assign_to(:user).with_kind_of(User) }
17   - # it { should assign_to(:user).with(@user) }
18   - def assign_to(variable)
19   - AssignToMatcher.new(variable)
20   - end
21   -
22   - class AssignToMatcher # :nodoc:
23   -
24   - def initialize(variable)
25   - @variable = variable.to_s
26   - @check_value = false
27   - end
28   -
29   - def with_kind_of(expected_class)
30   - @expected_class = expected_class
31   - self
32   - end
33   -
34   - def with(expected_value = nil, &block)
35   - @check_value = true
36   - @expected_value = expected_value
37   - @expectation_block = block
38   - self
39   - end
40   -
41   - def matches?(controller)
42   - @controller = controller
43   - @expected_value = @context.instance_eval(&@expectation_block) if @expectation_block
44   - assigned_value? && kind_of_expected_class? && equal_to_expected_value?
45   - end
46   -
47   - attr_reader :failure_message, :negative_failure_message
48   -
49   - def description
50   - description = "assign @#{@variable}"
51   - description << " with a kind of #{@expected_class}" if @expected_class
52   - description
53   - end
54   -
55   - def in_context(context)
56   - @context = context
57   - self
58   - end
59   -
60   - private
61   -
62   - def assigned_value?
63   - if !@controller.instance_variables.include?("@#{@variable}")
64   - @failure_message =
65   - "Expected action to assign a value for @#{@variable}"
66   - false
67   - else
68   - @negative_failure_message =
69   - "Didn't expect action to assign a value for @#{@variable}, " <<
70   - "but it was assigned to #{assigned_value.inspect}"
71   - true
72   - end
73   - end
74   -
75   - def kind_of_expected_class?
76   - return true unless @expected_class
77   - if assigned_value.kind_of?(@expected_class)
78   - @negative_failure_message =
79   - "Didn't expect action to assign a kind of #{@expected_class} " <<
80   - "for #{@variable}, but got one anyway"
81   - true
82   - else
83   - @failure_message =
84   - "Expected action to assign a kind of #{@expected_class} " <<
85   - "for #{@variable}, but got #{@variable.inspect} " <<
86   - "(#{@variable.class.name})"
87   - false
88   - end
89   - end
90   -
91   - def equal_to_expected_value?
92   - return true unless @check_value
93   - if @expected_value == assigned_value
94   - @negative_failure_message =
95   - "Didn't expect action to assign #{@expected_value.inspect} " <<
96   - "for #{@variable}, but got it anyway"
97   - true
98   - else
99   - @failure_message =
100   - "Expected action to assign #{@expected_value.inspect} " <<
101   - "for #{@variable}, but got #{assigned_value.inspect}"
102   - false
103   - end
104   - end
105   -
106   - def assigned_value
107   - @controller.instance_variable_get("@#{@variable}")
108   - end
109   -
110   - end
111   -
112   - end
113   - end
114   -end
50 lib/shoulda/matchers/action_controller/filter_param_matcher.rb
... ... @@ -1,50 +0,0 @@
1   -module Shoulda # :nodoc:
2   - module Matchers
3   - module ActionController # :nodoc:
4   -
5   - # Ensures that filter_parameter_logging is set for the specified key.
6   - #
7   - # Example:
8   - #
9   - # it { should filter_param(:password) }
10   - def filter_param(key)
11   - FilterParamMatcher.new(key)
12   - end
13   -
14   - class FilterParamMatcher # :nodoc:
15   -
16   - def initialize(key)
17   - @key = key.to_s
18   - end
19   -
20   - def matches?(controller)
21   - @controller = controller
22   - filters_key?
23   - end
24   -
25   - def failure_message
26   - "Expected #{@key} to be filtered; filtered keys: #{filtered_keys.join(', ')}"
27   - end
28   -
29   - def negative_failure_message
30   - "Did not expect #{@key} to be filtered"
31   - end
32   -
33   - def description
34   - "filter #{@key}"
35   - end
36   -
37   - private
38   -
39   - def filters_key?
40   - filtered_keys.include?(@key)
41   - end
42   -
43   - def filtered_keys
44   - Rails.application.config.filter_parameters.map { |filter| filter.to_s }
45   - end
46   - end
47   -
48   - end
49   - end
50   -end
62 lib/shoulda/matchers/action_controller/redirect_to_matcher.rb
... ... @@ -1,62 +0,0 @@
1   -module Shoulda # :nodoc:
2   - module Matchers
3   - module ActionController # :nodoc:
4   -
5   - # Ensures a controller redirected to the given url.
6   - #
7   - # Example:
8   - #
9   - # it { should redirect_to('http://somewhere.com') }
10   - # it { should redirect_to(users_path) }
11   - def redirect_to(url_or_description, &block)
12   - RedirectToMatcher.new(url_or_description, self, &block)
13   - end
14   -
15   - class RedirectToMatcher # :nodoc:
16   -
17   - def initialize(url_or_description, context, &block)
18   - if block
19   - @url_block = block
20   - @location = @url_or_description
21   - else
22   - @url = url_or_description
23   - @location = @url
24   - end
25   - @context = context
26   - end
27   -
28   - def in_context(context)
29   - @context = context
30   - self
31   - end
32   -
33   - def matches?(controller)
34   - @controller = controller
35   - redirects_to_url?
36   - end
37   -
38   - attr_reader :failure_message, :negative_failure_message
39   -
40   - def description
41   - "redirect to #{@location}"
42   - end
43   -
44   - private
45   -
46   - def redirects_to_url?
47   - @url = @context.instance_eval(&@url_block) if @url_block
48   - begin
49   - @context.send(:assert_redirected_to, @url)
50   - @negative_failure_message = "Didn't expect to redirect to #{@url}"
51   - true
52   - rescue Test::Unit::AssertionFailedError => error
53   - @failure_message = error.message
54   - false
55   - end
56   - end
57   -
58   - end
59   -
60   - end
61   - end
62   -end
54 lib/shoulda/matchers/action_controller/render_template_matcher.rb
... ... @@ -1,54 +0,0 @@
1   -module Shoulda # :nodoc:
2   - module Matchers
3   - module ActionController # :nodoc:
4   -
5   - # Ensures a controller rendered the given template.
6   - #
7   - # Example:
8   - #
9   - # it { should render_template(:show) }
10   - def render_template(template)
11   - RenderTemplateMatcher.new(template, self)
12   - end
13   -
14   - class RenderTemplateMatcher # :nodoc:
15   -
16   - def initialize(template, context)
17   - @template = template.to_s
18   - @context = context
19   - end
20   -
21   - def matches?(controller)
22   - @controller = controller
23   - renders_template?
24   - end
25   -
26   - attr_reader :failure_message, :negative_failure_message
27   -
28   - def description
29   - "render template #{@template}"
30   - end
31   -
32   - def in_context(context)
33   - @context = context
34   - self
35   - end
36   -
37   - private
38   -
39   - def renders_template?
40   - begin
41   - @context.send(:assert_template, @template)
42   - @negative_failure_message = "Didn't expect to render #{@template}"
43   - true
44   - rescue Test::Unit::AssertionFailedError => error
45   - @failure_message = error.message
46   - false
47   - end
48   - end
49   -
50   - end
51   -
52   - end
53   - end
54   -end
99 lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb
... ... @@ -1,99 +0,0 @@
1   -module Shoulda # :nodoc:
2   - module Matchers
3   - module ActionController # :nodoc:
4   -
5   - # Ensures that the controller rendered with the given layout.
6   - #
7   - # Example:
8   - #
9   - # it { should render_with_layout }
10   - # it { should render_with_layout(:special) }
11   - # it { should_not render_with_layout }
12   - def render_with_layout(expected_layout = nil)
13   - RenderWithLayoutMatcher.new(expected_layout).in_context(self)
14   - end
15   -
16   - class RenderWithLayoutMatcher # :nodoc:
17   -
18   - def initialize(expected_layout)
19   - @expected_layout = expected_layout.to_s unless expected_layout.nil?
20   - end
21   -
22   - # Used to provide access to layouts recorded by
23   - # ActionController::TemplateAssertions in Rails 3
24   - def in_context(context)
25   - @context = context
26   - self
27   - end
28   -
29   - def matches?(controller)
30   - @controller = controller
31   - rendered_with_layout? && rendered_with_expected_layout?
32   - end
33   -
34   - def failure_message
35   - "Expected #{expectation}, but #{result}"
36   - end
37   -
38   - def negative_failure_message
39   - "Did not expect #{expectation}, but #{result}"
40   - end
41   -
42   - def description
43   - description = "render with "
44   - if @expected_layout.nil?
45   - description << "a layout"
46   - else
47   - description << "the #{@expected_layout.inspect} layout"
48   - end
49   - description
50   - end
51   -
52   - private
53   -
54   - def rendered_with_layout?
55   - !rendered_layouts.empty?
56   - end
57   -
58   - def rendered_with_expected_layout?
59   - return true if @expected_layout.nil?
60   - rendered_layouts.include?(@expected_layout)
61   - end
62   -
63   - def rendered_layouts
64   - if recorded_layouts
65   - recorded_layouts.keys.compact.map { |layout| layout.sub(%r{^layouts/}, '') }
66   - else
67   - layout = @controller.response.layout
68   - if layout.nil?
69   - []
70   - else
71   - [layout.split('/').last]
72   - end
73   - end
74   - end
75   -
76   - def recorded_layouts
77   - if @context
78   - @context.instance_variable_get('@layouts')
79   - end
80   - end
81   -
82   - def expectation
83   - "to #{description}"
84   - end
85   -
86   - def result
87   - if rendered_with_layout?
88   - "rendered with " <<
89   - rendered_layouts.map { |layout| layout.inspect }.join(", ")
90   - else
91   - "rendered without a layout"
92   - end
93   - end
94   -
95   - end
96   -
97   - end
98   - end
99   -end
74 lib/shoulda/matchers/action_controller/respond_with_content_type_matcher.rb
... ... @@ -1,74 +0,0 @@
1   -module Shoulda # :nodoc:
2   - module Matchers
3   - module ActionController # :nodoc:
4   -
5   - # Ensures a controller responded with expected 'response' content type.
6   - #
7   - # You can pass an explicit content type such as 'application/rss+xml'
8   - # or its symbolic equivalent :rss
9   - # or a regular expression such as /rss/
10   - #
11   - # Example:
12   - #
13   - # it { should respond_with_content_type(:xml) }
14   - # it { should respond_with_content_type(:csv) }
15   - # it { should respond_with_content_type(:atom) }
16   - # it { should respond_with_content_type(:yaml) }
17   - # it { should respond_with_content_type(:text) }
18   - # it { should respond_with_content_type('application/rss+xml') }
19   - # it { should respond_with_content_type(/json/) }
20   - def respond_with_content_type(content_type)
21   - RespondWithContentTypeMatcher.new(content_type)
22   - end
23   -
24   - class RespondWithContentTypeMatcher # :nodoc:
25   -
26   - def initialize(content_type)
27   - @content_type = if content_type.is_a?(Symbol)
28   - lookup_by_extension(content_type)
29   - else
30   - content_type
31   - end
32   - end
33   -
34   - def description
35   - "respond with content type of #{@content_type}"
36   - end
37   -
38   - def matches?(controller)
39   - @controller = controller
40   - if @content_type.is_a?(Regexp)
41   - response_content_type =~ @content_type
42   - else
43   - response_content_type == @content_type
44   - end
45   - end
46   -
47   - def failure_message
48   - "Expected #{expectation}"
49   - end
50   -
51   - def negative_failure_message
52   - "Did not expect #{expectation}"
53   - end
54   -
55   - protected
56   -
57   - def response_content_type
58   - @controller.response.content_type.to_s
59   - end
60   -
61   - def lookup_by_extension(extension)
62   - Mime::Type.lookup_by_extension(extension.to_s).to_s
63   - end
64   -
65   - def expectation
66   - "content type to be #{@content_type}, " <<
67   - "but was #{response_content_type}"
68   - end
69   -
70   - end
71   -
72   - end
73   - end
74   -end
85 lib/shoulda/matchers/action_controller/respond_with_matcher.rb
... ... @@ -1,85 +0,0 @@
1   -module Shoulda # :nodoc:
2   - module Matchers
3   - module ActionController # :nodoc:
4   -
5   - # Ensures a controller responded with expected 'response' status code.
6   - #
7   - # You can pass an explicit status number like 200, 301, 404, 500
8   - # or its symbolic equivalent :success, :redirect, :missing, :error.
9   - # See ActionController::StatusCodes for a full list.
10   - #
11   - # Example:
12   - #
13   - # it { should respond_with(:success) }
14   - # it { should respond_with(:redirect) }
15   - # it { should respond_with(:missing) }
16   - # it { should respond_with(:error) }
17   - # it { should respond_with(501) }
18   - def respond_with(status)
19   - RespondWithMatcher.new(status)
20   - end
21   -
22   - class RespondWithMatcher # :nodoc:
23   -
24   - def initialize(status)
25   - @status = symbol_to_status_code(status)
26   - end
27   -
28   - def matches?(controller)
29   - @controller = controller
30   - correct_status_code? || correct_status_code_range?
31   - end
32   -
33   - def failure_message
34   - "Expected #{expectation}"
35   - end
36   -
37   - def negative_failure_message
38   - "Did not expect #{expectation}"
39   - end
40   -
41   - def description
42   - "respond with #{@status}"
43   - end
44   -
45   - protected
46   -
47   - def correct_status_code?
48   - response_code == @status
49   - end
50   -
51   - def correct_status_code_range?
52   - @status.is_a?(Range) &&
53   - @status.include?(response_code)
54   - end
55   -
56   - def response_code
57   - @controller.response.response_code
58   - end
59   -
60   - def symbol_to_status_code(potential_symbol)
61   - case potential_symbol
62   - when :success then 200
63   - when :redirect then 300..399
64   - when :missing then 404
65   - when :error then 500..599
66   - when Symbol
67   - if defined?(::Rack::Utils::SYMBOL_TO_STATUS_CODE)
68   - ::Rack::Utils::SYMBOL_TO_STATUS_CODE[potential_symbol]
69   - else
70   - ::ActionController::Base::SYMBOL_TO_STATUS_CODE[potential_symbol]
71   - end
72   - else
73   - potential_symbol
74   - end
75   - end
76   -
77   - def expectation
78   - "response to be a #{@status}, but was #{response_code}"
79   - end
80   -
81   - end
82   -
83   - end
84   - end
85   -end
93 lib/shoulda/matchers/action_controller/route_matcher.rb
... ... @@ -1,93 +0,0 @@
1   -module Shoulda # :nodoc:
2   - module Matchers
3   - module ActionController # :nodoc:
4   -
5   - # Ensures that requesting +path+ using +method+ routes to +options+.
6   - #
7   - # If you don't specify a controller, it will use the controller from the
8   - # example group.
9   - #
10   - # +to_param+ is called on the +options+ given.
11   - #
12   - # Examples:
13   - #
14   - # it { should route(:get, "/posts").
15   - # to(:controller => :posts, :action => :index) }
16   - # it { should route(:get, "/posts/new").to(:action => :new) }
17   - # it { should route(:post, "/posts").to(:action => :create) }
18   - # it { should route(:get, "/posts/1").to(:action => :show, :id => 1) }
19   - # it { should route(:edit, "/posts/1").to(:action => :show, :id => 1) }
20   - # it { should route(:put, "/posts/1").to(:action => :update, :id => 1) }
21   - # it { should route(:delete, "/posts/1").
22   - # to(:action => :destroy, :id => 1) }
23   - # it { should route(:get, "/users/1/posts/1").
24   - # to(:action => :show, :id => 1, :user_id => 1) }
25   - def route(method, path)
26   - RouteMatcher.new(method, path, self)
27   - end
28   -
29   - class RouteMatcher # :nodoc:
30   -
31   - def initialize(method, path, context)
32   - @method = method
33   - @path = path
34   - @context = context
35   - end
36   -
37   - def to(params)
38   - @params = params
39   - stringify_params!
40   - self
41   - end
42   -
43   - def in_context(context)
44   - @context = context
45   - self
46   - end
47   -
48   - def matches?(controller)
49   - @controller = controller
50   - guess_controller!
51   - route_recognized?
52   - end
53   -
54   - attr_reader :failure_message, :negative_failure_message
55   -
56   - def description
57   - "route #{@method.to_s.upcase} #{@path} to/from #{@params.inspect}"
58   - end
59   -
60   - private
61   -
62   - def guess_controller!
63   - @params[:controller] ||= @controller.controller_path
64   - end
65   -
66   - def stringify_params!
67   - @params.each do |key, value|
68   - @params[key] = value.is_a?(Array) ? value.collect {|v| v.to_param } : value.to_param
69   - end
70   - end
71   -
72   - def route_recognized?
73   - begin
74   - @context.send(:assert_routing,
75   - { :method => @method, :path => @path },
76   - @params)
77   -
78   - @negative_failure_message = "Didn't expect to #{description}"
79   - true
80   - rescue ::ActionController::RoutingError => error
81   - @failure_message = error.message
82   - false
83   - rescue Test::Unit::AssertionFailedError => error
84   - @failure_message = error.message
85   - false
86   - end
87   - end
88   -
89   - end
90   -
91   - end
92   - end
93   -end
98 lib/shoulda/matchers/action_controller/set_session_matcher.rb
... ... @@ -1,98 +0,0 @@
1   -module Shoulda # :nodoc:
2   - module Matchers
3   - module ActionController # :nodoc:
4   -
5   - # Ensures that a session key was set to the expected value.
6   - #
7   - # Example:
8   - #
9   - # it { should set_session(:message) }
10   - # it { should set_session(:user_id).to(@user.id) }
11   - # it { should_not set_session(:user_id) }
12   - def set_session(key)
13   - SetSessionMatcher.new(key)
14   - end
15   -
16   - class SetSessionMatcher # :nodoc:
17   -
18   - def initialize(key)
19   - @key = key.to_s
20   - end
21   -
22   - def to(value = nil, &block)
23   - @value = value
24   - @value_block = block
25   - self
26   - end
27   -
28   - def matches?(controller)
29   - @controller = controller
30   - @value = @context.instance_eval(&@value_block) if @value_block
31   - (assigned_value? && assigned_correct_value?) || cleared_value?
32   - end
33   -
34   - def failure_message
35   - "Expected #{expectation}, but #{result}"
36   - end
37   -
38   - def negative_failure_message
39   - "Didn't expect #{expectation}, but #{result}"
40   - end
41   -
42   - def description
43   - description = "set session variable #{@key.inspect}"
44   - description << " to #{@value.inspect}" if defined?(@value)
45   - description
46   - end
47   -
48   - def in_context(context)
49   - @context = context
50   - self
51   - end
52   -
53   - private
54   -
55   - def assigned_value?
56   - !assigned_value.nil?
57   - end
58   -
59   - def cleared_value?
60   - defined?(@value) && @value.nil? && assigned_value.nil?
61   - end
62   -
63   - def assigned_correct_value?
64   - return true if @value.nil?
65   - assigned_value == @value
66   - end
67   -
68   - def assigned_value
69   - session[@key]
70   - end
71   -
72   - def session
73   - if @controller.request.respond_to?(:session)
74   - @controller.request.session.to_hash
75   - else
76   - @controller.response.session.data
77   - end
78   - end
79   -
80   - def expectation
81   - expectation = "session variable #{@key} to be set"
82   - expectation << " to #{@value.inspect}" if @value
83   - expectation
84   - end
85   -
86   - def result
87   - if session.empty?
88   - "no session variables were set"
89   - else
90   - "the session was #{session.inspect}"
91   - end
92   - end
93   -
94   - end
95   -
96   - end
97   - end
98   -end
94 lib/shoulda/matchers/action_controller/set_the_flash_matcher.rb
... ... @@ -1,94 +0,0 @@
1   -module Shoulda # :nodoc:
2   - module Matchers
3   - module ActionController # :nodoc:
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