rspec-rails 2.0.0.beta.17 → 2.0.0.beta.18

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.
@@ -65,8 +65,10 @@ Request specs live in spec/requests.
65
65
 
66
66
  describe "widgets resource" do
67
67
  describe "GET index" do
68
- get "/widgets/index"
69
- response.should have_selector("h1", :content => "Widgets")
68
+ it "contains the widgets header" do
69
+ get "/widgets/index"
70
+ response.should have_selector("h1", :content => "Widgets")
71
+ end
70
72
  end
71
73
  end
72
74
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.0.beta.17
1
+ 2.0.0.beta.18
@@ -152,3 +152,34 @@ Feature: view spec
152
152
  """
153
153
  When I run "rspec spec/views"
154
154
  Then the output should contain "1 example, 0 failures"
155
+
156
+ Scenario: spec with view that accesses helper_method helpers
157
+ Given a file named "app/views/secrets/index.html.erb" with:
158
+ """
159
+ <%- if admin? %>
160
+ <h1>Secret admin area</h1>
161
+ <%- end %>
162
+ """
163
+ And a file named "spec/views/secrets/index.html.erb_spec.rb" with:
164
+ """
165
+ require 'spec_helper'
166
+
167
+ describe 'secrets/index.html.erb' do
168
+ before do
169
+ controller.singleton_class.class_eval do
170
+ protected
171
+ def admin?
172
+ true
173
+ end
174
+ helper_method :admin?
175
+ end
176
+ end
177
+
178
+ it 'checks for admin access' do
179
+ render
180
+ rendered.should contain('Secret admin area')
181
+ end
182
+ end
183
+ """
184
+ When I run "rspec spec/views/secrets"
185
+ Then the output should contain "1 example, 0 failures"
@@ -29,9 +29,9 @@ Autotest.add_hook :initialize do |at|
29
29
  %w{config/ coverage/ db/ doc/ log/ public/ script/ tmp/ vendor/rails vendor/plugins vendor/gems}.each do |exception|
30
30
  at.add_exception("^#{exception}")
31
31
  end
32
-
32
+
33
33
  at.clear_mappings
34
-
34
+
35
35
  at.add_mapping(%r%^(test|spec)/fixtures/(.*).yml$%) { |_, m|
36
36
  ["spec/models/#{m[2].singularize}_spec.rb"] + at.files_matching(%r%^spec\/views\/#{m[2]}/.*_spec\.rb$%)
37
37
  }
@@ -18,7 +18,7 @@ module Rspec
18
18
 
19
19
  def create_view_files
20
20
  return if actions.empty?
21
- return unless options[:views]
21
+ return unless options[:views]
22
22
 
23
23
  empty_directory File.join("spec", "views", file_path)
24
24
 
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  # Specs in this file have access to a helper object that includes
4
4
  # the <%= class_name %>Helper. For example:
5
- #
5
+ #
6
6
  # describe <%= class_name %>Helper do
7
7
  # describe "string concat" do
8
8
  # it "concats two strings with spaces" do
@@ -22,15 +22,15 @@ describe <%= controller_class_name %>Controller do
22
22
  end
23
23
 
24
24
  it "recognizes and generates #create" do
25
- { :post => "/<%= table_name %>" }.should route_to(:controller => "<%= table_name %>", :action => "create")
25
+ { :post => "/<%= table_name %>" }.should route_to(:controller => "<%= table_name %>", :action => "create")
26
26
  end
27
27
 
28
28
  it "recognizes and generates #update" do
29
- { :put => "/<%= table_name %>/1" }.should route_to(:controller => "<%= table_name %>", :action => "update", :id => "1")
29
+ { :put => "/<%= table_name %>/1" }.should route_to(:controller => "<%= table_name %>", :action => "update", :id => "1")
30
30
  end
31
31
 
32
32
  it "recognizes and generates #destroy" do
33
- { :delete => "/<%= table_name %>/1" }.should route_to(:controller => "<%= table_name %>", :action => "destroy", :id => "1")
33
+ { :delete => "/<%= table_name %>/1" }.should route_to(:controller => "<%= table_name %>", :action => "destroy", :id => "1")
34
34
  end
35
35
 
36
36
  end
@@ -4,7 +4,7 @@ module RSpec::Rails
4
4
  # == Examples
5
5
  #
6
6
  # == with stubs
7
- #
7
+ #
8
8
  # describe WidgetsController do
9
9
  # describe "GET index" do
10
10
  # it "assigns all widgets to @widgets" do
@@ -69,7 +69,7 @@ module RSpec::Rails
69
69
  # describe WidgetsController do
70
70
  # render_views
71
71
  # ...
72
- #
72
+ #
73
73
  module ControllerExampleGroup
74
74
  extend ActiveSupport::Concern
75
75
  extend RSpec::Rails::ModuleInclusion
@@ -28,9 +28,24 @@ module RSpec::Rails
28
28
  include Webrat::Matchers
29
29
  include RSpec::Rails::Matchers::RenderTemplate
30
30
 
31
+ module ClassMethods
32
+ def _default_helper
33
+ base = metadata[:behaviour][:description].split('/').first
34
+ (base.camelize + 'Helper').constantize if base
35
+ rescue NameError
36
+ nil
37
+ end
38
+
39
+ def _default_helpers
40
+ helpers = [_default_helper].compact
41
+ helpers << ApplicationHelper if Object.const_defined?('ApplicationHelper')
42
+ helpers
43
+ end
44
+ end
45
+
31
46
  module InstanceMethods
32
47
  # :call-seq:
33
- # render
48
+ # render
34
49
  # render(:template => "widgets/new.html.erb")
35
50
  # render({:partial => "widgets/widget.html.erb"}, {... locals ...})
36
51
  # render({:partial => "widgets/widget.html.erb"}, {... locals ...}) do ... end
@@ -73,13 +88,20 @@ module RSpec::Rails
73
88
  _view
74
89
  end
75
90
 
91
+ # Provides access to the params hash that will be available within the
92
+ # view:
93
+ #
94
+ # params[:foo] = 'bar'
95
+ def params
96
+ controller.params
97
+ end
98
+
76
99
  # Deprecated. Use +view+ instead.
77
100
  def template
78
101
  RSpec.deprecate("template","view")
79
102
  view
80
103
  end
81
104
 
82
-
83
105
  # Deprecated. Use +rendered+ instead.
84
106
  def response
85
107
  RSpec.deprecate("response", "rendered")
@@ -95,12 +117,21 @@ module RSpec::Rails
95
117
  def _controller_path
96
118
  _default_file_to_render.split("/")[0..-2].join("/")
97
119
  end
120
+
121
+ def _include_controller_helpers
122
+ helpers = controller._helpers
123
+ view.singleton_class.class_eval do
124
+ include helpers unless included_modules.include?(helpers)
125
+ end
126
+ end
98
127
  end
99
128
 
100
129
  included do
101
130
  metadata[:type] = :view
131
+ helper *_default_helpers
102
132
 
103
133
  before do
134
+ _include_controller_helpers
104
135
  controller.controller_path = _controller_path
105
136
  # this won't be necessary if/when
106
137
  # https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4903
@@ -35,7 +35,7 @@ if defined?(ActiveRecord::Base)
35
35
  end
36
36
  end
37
37
  end
38
-
38
+
39
39
  module ActiveRecord #:nodoc:
40
40
  class Base
41
41
  extend RSpec::Rails::Extensions::ActiveRecord::ClassMethods
@@ -9,13 +9,13 @@ module RSpec
9
9
  included do
10
10
  if RSpec.configuration.use_transactional_fixtures
11
11
  # TODO - figure out how to move this outside the included block
12
- include ActiveRecord::TestFixtures
12
+ include ActiveRecord::TestFixtures
13
13
 
14
- self.fixture_path = RSpec.configuration.fixture_path
14
+ self.fixture_path = RSpec.configuration.fixture_path
15
15
  self.use_transactional_fixtures = RSpec.configuration.use_transactional_fixtures
16
16
  self.use_instantiated_fixtures = RSpec.configuration.use_instantiated_fixtures
17
17
  fixtures RSpec.configuration.global_fixtures if RSpec.configuration.global_fixtures
18
- end
18
+ end
19
19
  end
20
20
  end
21
21
  end
@@ -10,7 +10,7 @@ module RSpec #:nodoc:
10
10
  return failure_message_for_should_without_errors_on_extensions
11
11
  end
12
12
  alias_method_chain :failure_message_for_should, :errors_on_extensions
13
-
13
+
14
14
  def description_with_errors_on_extensions
15
15
  return "have #{relativities[@relativity]}#{@expected} errors on :#{@args[0]}" if @collection_name == :errors_on
16
16
  return "have #{relativities[@relativity]}#{@expected} error on :#{@args[0]}" if @collection_name == :error_on
@@ -27,11 +27,40 @@ module RSpec
27
27
  self.stub(:id) { nil }
28
28
  end
29
29
  end
30
-
31
- # Creates a mock object instance for a +model_class+ with common
32
- # methods stubbed out. Additional methods may be easily stubbed (via
33
- # add_stubs) if +stubs+ is passed.
34
- def mock_model(model_class, options_and_stubs = {})
30
+
31
+ # Creates a mock object instance for a +string_or_model_class+ with
32
+ # common methods stubbed out. Additional methods may be easily stubbed
33
+ # (via add_stubs) if +stubs+ is passed.
34
+ #
35
+ # +model_class+ can be any of:
36
+ #
37
+ # * A String representing a Class that does not exist
38
+ # * A String representing a Class that extends ActiveModel::Naming
39
+ # * A Class that extends ActiveModel::Naming
40
+ def mock_model(string_or_model_class, options_and_stubs = {})
41
+ if String === string_or_model_class
42
+ if Object.const_defined?(string_or_model_class)
43
+ model_class = Object.const_get(string_or_model_class)
44
+ else
45
+ model_class = Object.const_set(string_or_model_class, Class.new do
46
+ extend ActiveModel::Naming
47
+ end)
48
+ end
49
+ else
50
+ model_class = string_or_model_class
51
+ end
52
+
53
+ unless model_class.kind_of? ActiveModel::Naming
54
+ raise ArgumentError.new <<-EOM
55
+ The mock_model method can only accept as its first argument:
56
+ * A String representing a Class that does not exist
57
+ * A String representing a Class that extends ActiveModel::Naming
58
+ * A Class that extends ActiveModel::Naming
59
+
60
+ It received #{model_class.inspect}
61
+ EOM
62
+ end
63
+
35
64
  id = options_and_stubs.has_key?(:id) ? options_and_stubs[:id] : next_id
36
65
  options_and_stubs = options_and_stubs.reverse_merge({
37
66
  :id => id,
@@ -65,10 +94,6 @@ module RSpec
65
94
  def @object.to_s
66
95
  "#{model_class.name}_#{id}"
67
96
  end
68
-
69
- def @object.model_name
70
- "#{model_class}"
71
- end
72
97
  CODE
73
98
  yield m if block_given?
74
99
  m
@@ -152,3 +177,4 @@ end
152
177
  RSpec.configure do |c|
153
178
  c.include RSpec::Rails::Mocks
154
179
  end
180
+
@@ -51,7 +51,7 @@ module RSpec
51
51
  @controller.class.view_paths = ::ActionView::PathSet.new.push(@_path_set_delegator_resolver)
52
52
  end
53
53
  end
54
-
54
+
55
55
  after do
56
56
  unless self.class.render_views?
57
57
  @controller.class.view_paths = @_path_set_delegator_resolver.path_set
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rspec-rails}
8
- s.version = "2.0.0.beta.17"
8
+ s.version = "2.0.0.beta.18"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["David Chelimsky", "Chad Humphries"]
12
- s.date = %q{2010-07-11}
12
+ s.date = %q{2010-07-21}
13
13
  s.description = %q{RSpec-2 for Rails-3}
14
14
  s.email = %q{dchelimsky@gmail.com;chad.humphries@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -122,7 +122,7 @@ Gem::Specification.new do |s|
122
122
  s.homepage = %q{http://github.com/rspec/rspec-rails}
123
123
  s.post_install_message = %q{**************************************************
124
124
 
125
- Thank you for installing rspec-rails-2.0.0.beta.17!
125
+ Thank you for installing rspec-rails-2.0.0.beta.18!
126
126
 
127
127
  This version of rspec-rails only works with versions of rails >= 3.0.0.beta.4.
128
128
 
@@ -132,7 +132,7 @@ Gem::Specification.new do |s|
132
132
  can access its generators and rake tasks.
133
133
 
134
134
  group :development, :test do
135
- gem "rspec-rails", ">= 2.0.0.beta.17"
135
+ gem "rspec-rails", ">= 2.0.0.beta.18"
136
136
  end
137
137
 
138
138
  Be sure to run the following command in each of your Rails apps if you're
@@ -158,7 +158,7 @@ Gem::Specification.new do |s|
158
158
  s.require_paths = ["lib"]
159
159
  s.rubyforge_project = %q{rspec}
160
160
  s.rubygems_version = %q{1.3.7}
161
- s.summary = %q{rspec-rails-2.0.0.beta.17}
161
+ s.summary = %q{rspec-rails-2.0.0.beta.18}
162
162
  s.test_files = [
163
163
  "spec/rspec/rails/example/controller_example_group_spec.rb",
164
164
  "spec/rspec/rails/example/helper_example_group_spec.rb",
@@ -12,6 +12,73 @@ module RSpec::Rails
12
12
  group.metadata[:type].should eq(:view)
13
13
  end
14
14
 
15
+ describe 'automatic inclusion of helpers' do
16
+ module ::ThingsHelper; end
17
+
18
+ it 'includes the helper with the same name' do
19
+ group = RSpec::Core::ExampleGroup.describe 'things/show.html.erb'
20
+ group.should_receive(:helper).with(ThingsHelper)
21
+ group.class_eval do
22
+ include ViewExampleGroup
23
+ end
24
+ end
25
+
26
+ it 'operates normally when no helper with the same name exists' do
27
+ raise 'unexpected constant found' if Object.const_defined?('ClocksHelper')
28
+ lambda {
29
+ RSpec::Core::ExampleGroup.describe 'clocks/show.html.erb' do
30
+ include ViewExampleGroup
31
+ end
32
+ }.should_not raise_error
33
+ end
34
+
35
+ context 'application helper exists' do
36
+ before do
37
+ if !Object.const_defined? 'ApplicationHelper'
38
+ module ::ApplicationHelper; end
39
+ @application_helper_defined = true
40
+ end
41
+ end
42
+
43
+ after do
44
+ if @application_helper_defined
45
+ Object.__send__ :remove_const, 'ApplicationHelper'
46
+ end
47
+ end
48
+
49
+ it 'includes the application helper' do
50
+ group = RSpec::Core::Example.describe 'bars/new.html.erb'
51
+ group.should_receive(:helper).with(ApplicationHelper)
52
+ group.class_eval do
53
+ include ViewExampleGroup
54
+ end
55
+ end
56
+ end
57
+
58
+ context 'no application helper exists' do
59
+ before do
60
+ if Object.const_defined? 'ApplicationHelper'
61
+ @application_helper = ApplicationHelper
62
+ Object.__send__ :remove_const, 'ApplicationHelper'
63
+ end
64
+ end
65
+
66
+ after do
67
+ if @application_helper
68
+ ApplicationHelper = @application_helper
69
+ end
70
+ end
71
+
72
+ it 'operates normally' do
73
+ lambda {
74
+ RSpec::Core::ExampleGroup.describe 'foos/edit.html.erb' do
75
+ include ViewExampleGroup
76
+ end
77
+ }.should_not raise_error
78
+ end
79
+ end
80
+ end
81
+
15
82
  describe "#render" do
16
83
  let(:view_spec) do
17
84
  Class.new do
@@ -54,6 +121,22 @@ module RSpec::Rails
54
121
  end
55
122
  end
56
123
 
124
+ describe '#params' do
125
+ let(:view_spec) do
126
+ Class.new do
127
+ include ViewExampleGroup::InstanceMethods
128
+ def controller
129
+ @controller ||= Object.new
130
+ end
131
+ end.new
132
+ end
133
+
134
+ it 'delegates to the controller' do
135
+ view_spec.controller.should_receive(:params).and_return({})
136
+ view_spec.params[:foo] = 1
137
+ end
138
+ end
139
+
57
140
  describe "#_controller_path" do
58
141
  let(:view_spec) do
59
142
  Class.new do
@@ -4,7 +4,7 @@ describe "error_on" do
4
4
  it "should provide a description including the name of what the error is on" do
5
5
  have(1).error_on(:whatever).description.should == "have 1 error on :whatever"
6
6
  end
7
-
7
+
8
8
  it "should provide a failure message including the number actually given" do
9
9
  lambda {
10
10
  [].should have(1).error_on(:whatever)
@@ -16,7 +16,7 @@ describe "errors_on" do
16
16
  it "should provide a description including the name of what the error is on" do
17
17
  have(2).errors_on(:whatever).description.should == "have 2 errors on :whatever"
18
18
  end
19
-
19
+
20
20
  it "should provide a failure message including the number actually given" do
21
21
  lambda {
22
22
  [1].should have(3).errors_on(:whatever)
@@ -35,7 +35,7 @@ describe "be_routable" do
35
35
  end
36
36
 
37
37
  context "with should_not" do
38
-
38
+
39
39
  it "passes if routes do not recognize the path" do
40
40
  routes.stub(:recognize_path) { raise ActionController::RoutingError.new('ignore') }
41
41
  expect do
@@ -2,6 +2,41 @@ require 'spec_helper'
2
2
  require File.dirname(__FILE__) + '/ar_classes'
3
3
 
4
4
  describe "mock_model(RealModel)" do
5
+
6
+ context "given a String" do
7
+ context "that does not represent an existing constant" do
8
+ it "class says it's name" do
9
+ model = mock_model("Foo")
10
+ model.class.name.should eq("Foo")
11
+ end
12
+ end
13
+
14
+ context "that represents an existing constant" do
15
+ context "that extends ActiveModel::Naming" do
16
+ it "treats the constant as the class" do
17
+ model = mock_model("MockableModel")
18
+ model.class.name.should eq("MockableModel")
19
+ end
20
+ end
21
+
22
+ context "that does not extend ActiveModel::Naming" do
23
+ it "raises with a helpful message" do
24
+ expect do
25
+ mock_model("String")
26
+ end.to raise_error(ArgumentError)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ context "given a class that does not extend ActiveModel::Naming" do
33
+ it "raises with a helpful message" do
34
+ expect do
35
+ mock_model(String)
36
+ end.to raise_error(ArgumentError)
37
+ end
38
+ end
39
+
5
40
  describe "with #id stubbed" do
6
41
  before(:each) do
7
42
  @model = mock_model(MockableModel, :id => 1)
@@ -105,17 +140,6 @@ describe "mock_model(RealModel)" do
105
140
  end
106
141
  end
107
142
 
108
- describe "#model_name" do
109
- before(:each) do
110
- @model = mock_model(SubMockableModel)
111
- end
112
-
113
- it "says its model_name" do
114
- @model.model_name.should == "SubMockableModel"
115
- end
116
- end
117
-
118
-
119
143
  describe "#destroyed?" do
120
144
  context "default" do
121
145
  it "returns false" do
@@ -199,6 +223,5 @@ describe "mock_model(RealModel)" do
199
223
  def model
200
224
  mock_model(MockableModel, :id => nil)
201
225
  end
202
-
203
226
  end
204
227
  end
@@ -6,28 +6,28 @@ describe "stub_model" do
6
6
  it "should have an id" do
7
7
  stub_model(MockableModel).id.should be > 0
8
8
  end
9
-
9
+
10
10
  it "should say it is not a new record" do
11
11
  stub_model(MockableModel).should_not be_new_record
12
12
  end
13
13
  end
14
-
14
+
15
15
  it "should accept a stub id" do
16
16
  stub_model(MockableModel, :id => 37).id.should == 37
17
17
  end
18
-
18
+
19
19
  it "should say it is a new record when id is set to nil" do
20
20
  stub_model(MockableModel, :id => nil).should be_new_record
21
21
  end
22
-
22
+
23
23
  it "should accept any arbitrary stub" do
24
24
  stub_model(MockableModel, :foo => "bar").foo.should == "bar"
25
25
  end
26
-
26
+
27
27
  it "should accept a stub for save" do
28
28
  stub_model(MockableModel, :save => false).save.should be(false)
29
29
  end
30
-
30
+
31
31
  describe "#as_new_record" do
32
32
  it "should say it is a new record" do
33
33
  stub_model(MockableModel).as_new_record.should be_new_record
@@ -37,20 +37,20 @@ describe "stub_model" do
37
37
  stub_model(MockableModel).as_new_record.id.should be(nil)
38
38
  end
39
39
  end
40
-
40
+
41
41
  pending "should raise when hitting the db" do
42
42
  lambda do
43
43
  model = stub_model(MockableModel, :changed => true, :attributes_with_quotes => {'this' => 'that'})
44
44
  model.save
45
45
  end.should raise_error(RSpec::Rails::IllegalDataAccessException, /stubbed models are not allowed to access the database/)
46
46
  end
47
-
47
+
48
48
  it "should increment the id" do
49
49
  first = stub_model(MockableModel)
50
50
  second = stub_model(MockableModel)
51
51
  second.id.should == (first.id + 1)
52
52
  end
53
-
53
+
54
54
  describe "as association" do
55
55
  before(:each) do
56
56
  @real = AssociatedModel.create!
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-rails
3
3
  version: !ruby/object:Gem::Version
4
- hash: 62196417
4
+ hash: 62196423
5
5
  prerelease: true
6
6
  segments:
7
7
  - 2
8
8
  - 0
9
9
  - 0
10
10
  - beta
11
- - 17
12
- version: 2.0.0.beta.17
11
+ - 18
12
+ version: 2.0.0.beta.18
13
13
  platform: ruby
14
14
  authors:
15
15
  - David Chelimsky
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2010-07-11 00:00:00 -05:00
21
+ date: 2010-07-21 00:00:00 -05:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
@@ -173,7 +173,7 @@ licenses: []
173
173
  post_install_message: |
174
174
  **************************************************
175
175
 
176
- Thank you for installing rspec-rails-2.0.0.beta.17!
176
+ Thank you for installing rspec-rails-2.0.0.beta.18!
177
177
 
178
178
  This version of rspec-rails only works with versions of rails >= 3.0.0.beta.4.
179
179
 
@@ -183,7 +183,7 @@ post_install_message: |
183
183
  can access its generators and rake tasks.
184
184
 
185
185
  group :development, :test do
186
- gem "rspec-rails", ">= 2.0.0.beta.17"
186
+ gem "rspec-rails", ">= 2.0.0.beta.18"
187
187
  end
188
188
 
189
189
  Be sure to run the following command in each of your Rails apps if you're
@@ -235,7 +235,7 @@ rubyforge_project: rspec
235
235
  rubygems_version: 1.3.7
236
236
  signing_key:
237
237
  specification_version: 3
238
- summary: rspec-rails-2.0.0.beta.17
238
+ summary: rspec-rails-2.0.0.beta.18
239
239
  test_files:
240
240
  - spec/rspec/rails/example/controller_example_group_spec.rb
241
241
  - spec/rspec/rails/example/helper_example_group_spec.rb