rspec-rails 2.14.2 → 2.99.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +14 -6
  2. data/Changelog.md +8 -10
  3. data/features/Autotest.md +24 -0
  4. data/features/Generators.md +24 -0
  5. data/features/GettingStarted.md +84 -0
  6. data/features/README.md +56 -0
  7. data/features/RailsVersions.md +4 -0
  8. data/features/Transactions.md +84 -0
  9. data/features/Upgrade.md +121 -0
  10. data/features/controller_specs/Cookies.md +57 -0
  11. data/features/controller_specs/README.md +45 -0
  12. data/features/controller_specs/anonymous_controller.feature +378 -0
  13. data/features/controller_specs/bypass_rescue.feature +75 -0
  14. data/features/controller_specs/controller_spec.feature +58 -0
  15. data/features/controller_specs/engine_routes.feature +51 -0
  16. data/features/controller_specs/isolation_from_views.feature +87 -0
  17. data/features/controller_specs/render_views.feature +114 -0
  18. data/features/feature_specs/feature_spec.feature +34 -0
  19. data/features/helper_specs/helper_spec.feature +122 -0
  20. data/features/mailer_specs/url_helpers.feature +38 -0
  21. data/features/matchers/README.md +18 -0
  22. data/features/matchers/new_record_matcher.feature +41 -0
  23. data/features/matchers/redirect_to_matcher.feature +40 -0
  24. data/features/matchers/relation_match_array.feature +27 -0
  25. data/features/matchers/render_template_matcher.feature +49 -0
  26. data/features/mocks/mock_model.feature +147 -0
  27. data/features/mocks/stub_model.feature +58 -0
  28. data/features/model_specs/README.md +21 -0
  29. data/features/model_specs/errors_on.feature +51 -0
  30. data/features/model_specs/records.feature +27 -0
  31. data/features/model_specs/transactional_examples.feature +109 -0
  32. data/features/request_specs/request_spec.feature +49 -0
  33. data/features/routing_specs/README.md +16 -0
  34. data/features/routing_specs/be_routable_matcher.feature +80 -0
  35. data/features/routing_specs/engine_routes.feature +38 -0
  36. data/features/routing_specs/named_routes.feature +18 -0
  37. data/features/routing_specs/route_to_matcher.feature +90 -0
  38. data/features/step_definitions/additional_cli_steps.rb +4 -0
  39. data/features/step_definitions/model_steps.rb +3 -0
  40. data/features/support/env.rb +53 -0
  41. data/features/support/rails_versions.rb +4 -0
  42. data/features/support/rubinius.rb +6 -0
  43. data/features/view_specs/inferred_controller_path.feature +45 -0
  44. data/features/view_specs/stub_template.feature +51 -0
  45. data/features/view_specs/view_spec.feature +206 -0
  46. data/lib/autotest/rails_rspec2.rb +81 -76
  47. data/lib/generators/rspec/install/templates/spec/spec_helper.rb.tt +1 -6
  48. data/lib/rspec/rails/adapters.rb +5 -12
  49. data/lib/rspec/rails/example/controller_example_group.rb +1 -2
  50. data/lib/rspec/rails/example/helper_example_group.rb +3 -3
  51. data/lib/rspec/rails/example/view_example_group.rb +4 -7
  52. data/lib/rspec/rails/matchers/have_extension.rb +0 -1
  53. data/lib/rspec/rails/matchers/routing_matchers.rb +0 -4
  54. data/lib/rspec/rails/mocks.rb +0 -26
  55. data/lib/rspec/rails/tasks/rspec.rake +5 -12
  56. data/lib/rspec/rails/version.rb +1 -1
  57. data/spec/autotest/rails_rspec2_spec.rb +36 -0
  58. data/spec/generators/rspec/controller/controller_generator_spec.rb +97 -0
  59. data/spec/generators/rspec/helper/helper_generator_spec.rb +30 -0
  60. data/spec/generators/rspec/install/install_generator_spec.rb +30 -0
  61. data/spec/generators/rspec/integration/integration_generator_spec.rb +44 -0
  62. data/spec/generators/rspec/mailer/mailer_generator_spec.rb +48 -0
  63. data/spec/generators/rspec/model/model_generator_spec.rb +52 -0
  64. data/spec/generators/rspec/observer/observer_generator_spec.rb +21 -0
  65. data/spec/generators/rspec/scaffold/scaffold_generator_spec.rb +138 -0
  66. data/spec/generators/rspec/view/view_generator_spec.rb +41 -0
  67. data/spec/rspec/rails/assertion_adapter_spec.rb +28 -0
  68. data/spec/rspec/rails/assertion_delegator_spec.rb +43 -0
  69. data/spec/rspec/rails/configuration_spec.rb +26 -0
  70. data/spec/rspec/rails/deprecations_spec.rb +18 -0
  71. data/spec/rspec/rails/example/controller_example_group_spec.rb +100 -0
  72. data/spec/rspec/rails/example/feature_example_group_spec.rb +56 -0
  73. data/spec/rspec/rails/example/helper_example_group_spec.rb +66 -0
  74. data/spec/rspec/rails/example/mailer_example_group_spec.rb +21 -0
  75. data/spec/rspec/rails/example/model_example_group_spec.rb +15 -0
  76. data/spec/rspec/rails/example/request_example_group_spec.rb +17 -0
  77. data/spec/rspec/rails/example/routing_example_group_spec.rb +32 -0
  78. data/spec/rspec/rails/example/view_example_group_spec.rb +220 -0
  79. data/spec/rspec/rails/extensions/active_model/errors_on_spec.rb +23 -0
  80. data/spec/rspec/rails/extensions/active_record/base_spec.rb +42 -0
  81. data/spec/rspec/rails/fixture_support_spec.rb +17 -0
  82. data/spec/rspec/rails/matchers/be_a_new_spec.rb +142 -0
  83. data/spec/rspec/rails/matchers/be_new_record_spec.rb +33 -0
  84. data/spec/rspec/rails/matchers/be_routable_spec.rb +41 -0
  85. data/spec/rspec/rails/matchers/be_valid_spec.rb +44 -0
  86. data/spec/rspec/rails/matchers/errors_on_spec.rb +38 -0
  87. data/spec/rspec/rails/matchers/has_spec.rb +29 -0
  88. data/spec/rspec/rails/matchers/have_rendered_spec.rb +93 -0
  89. data/spec/rspec/rails/matchers/redirect_to_spec.rb +80 -0
  90. data/spec/rspec/rails/matchers/relation_match_array_spec.rb +31 -0
  91. data/spec/rspec/rails/matchers/route_to_spec.rb +151 -0
  92. data/spec/rspec/rails/minitest_lifecycle_adapter_spec.rb +22 -0
  93. data/spec/rspec/rails/mocks/mock_model_spec.rb +378 -0
  94. data/spec/rspec/rails/mocks/stub_model_spec.rb +154 -0
  95. data/spec/rspec/rails/setup_and_teardown_adapter_spec.rb +32 -0
  96. data/spec/rspec/rails/view_rendering_spec.rb +111 -0
  97. data/spec/spec_helper.rb +31 -0
  98. data/spec/support/ar_classes.rb +42 -0
  99. data/spec/support/helpers.rb +20 -0
  100. data/spec/support/matchers.rb +9 -0
  101. data/spec/support/null_object.rb +6 -0
  102. metadata +223 -47
@@ -0,0 +1,56 @@
1
+ require "spec_helper"
2
+
3
+ module RSpec::Rails
4
+ describe FeatureExampleGroup do
5
+ it { should be_included_in_files_in('./spec/features/') }
6
+ it { should be_included_in_files_in('.\\spec\\features\\') }
7
+
8
+ it "adds :type => :feature to the metadata" do
9
+ group = RSpec::Core::ExampleGroup.describe do
10
+ include FeatureExampleGroup
11
+ end
12
+
13
+ expect(group.metadata[:type]).to eq(:feature)
14
+ end
15
+
16
+ it "includes Rails route helpers" do
17
+ Rails.application.routes.draw do
18
+ get "/foo", :as => :foo, :to => "foo#bar"
19
+ end
20
+
21
+ group = RSpec::Core::ExampleGroup.describe do
22
+ include FeatureExampleGroup
23
+ end
24
+
25
+ expect(group.new.foo_path).to eq("/foo")
26
+ expect(group.new.foo_url).to eq("http://www.example.com/foo")
27
+ end
28
+
29
+ describe "#visit" do
30
+ it "raises an error informing about missing Capybara" do
31
+ group = RSpec::Core::ExampleGroup.describe do
32
+ include FeatureExampleGroup
33
+ end
34
+
35
+ expect {
36
+ group.new.visit('/foobar')
37
+ }.to raise_error(/Capybara not loaded/)
38
+ end
39
+
40
+ it "is resistant to load order errors" do
41
+ capybara = Module.new do
42
+ def visit(url)
43
+ "success: #{url}"
44
+ end
45
+ end
46
+
47
+ group = RSpec::Core::ExampleGroup.describe do
48
+ include capybara
49
+ include FeatureExampleGroup
50
+ end
51
+
52
+ expect(group.new.visit("/foo")).to eq("success: /foo")
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,66 @@
1
+ require "spec_helper"
2
+
3
+ module RSpec::Rails
4
+ describe HelperExampleGroup do
5
+ module ::FoosHelper; end
6
+ subject { HelperExampleGroup }
7
+
8
+ it { should be_included_in_files_in('./spec/helpers/') }
9
+ it { should be_included_in_files_in('.\\spec\\helpers\\') }
10
+
11
+ it "provides a controller_path based on the helper module's name" do
12
+ example = double
13
+ example.stub_chain(:example_group, :described_class) { FoosHelper }
14
+
15
+ helper_spec = Object.new.extend HelperExampleGroup
16
+ helper_spec.__send__(:_controller_path, example).should == "foos"
17
+ end
18
+
19
+ it "adds :type => :helper to the metadata" do
20
+ group = RSpec::Core::ExampleGroup.describe do
21
+ include HelperExampleGroup
22
+ end
23
+ group.metadata[:type].should eq(:helper)
24
+ end
25
+
26
+ describe "#helper" do
27
+ it "returns the instance of AV::Base provided by AV::TC::Behavior" do
28
+ helper_spec = Object.new.extend HelperExampleGroup
29
+ helper_spec.should_receive(:view_assigns)
30
+ av_tc_b_view = double('_view')
31
+ av_tc_b_view.should_receive(:assign)
32
+ helper_spec.stub(:_view) { av_tc_b_view }
33
+ helper_spec.helper.should eq(av_tc_b_view)
34
+ end
35
+
36
+ before do
37
+ Object.const_set(:ApplicationHelper, Module.new)
38
+ end
39
+
40
+ after do
41
+ Object.__send__(:remove_const, :ApplicationHelper)
42
+ end
43
+
44
+ it "includes ApplicationHelper" do
45
+ group = RSpec::Core::ExampleGroup.describe do
46
+ include HelperExampleGroup
47
+ def _view
48
+ ActionView::Base.new
49
+ end
50
+ end
51
+ group.new.helper.should be_kind_of(ApplicationHelper)
52
+ end
53
+ end
54
+ end
55
+
56
+ describe HelperExampleGroup::ClassMethods do
57
+ describe "determine_default_helper_class" do
58
+ it "returns the helper module passed to describe" do
59
+ helper_spec = Object.new.extend HelperExampleGroup::ClassMethods
60
+ helper_spec.stub(:described_class) { FoosHelper }
61
+ helper_spec.determine_default_helper_class("ignore this").
62
+ should eq(FoosHelper)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ module RSpec::Rails
4
+ describe MailerExampleGroup do
5
+ module ::Rails; end
6
+ before do
7
+ Rails.stub_chain(:application, :routes, :url_helpers).and_return(Rails)
8
+ Rails.stub_chain(:configuration, :action_mailer, :default_url_options).and_return({})
9
+ end
10
+
11
+ it { should be_included_in_files_in('./spec/mailers/') }
12
+ it { should be_included_in_files_in('.\\spec\\mailers\\') }
13
+
14
+ it "adds :type => :mailer to the metadata" do
15
+ group = RSpec::Core::ExampleGroup.describe do
16
+ include MailerExampleGroup
17
+ end
18
+ group.metadata[:type].should eq(:mailer)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ module RSpec::Rails
4
+ describe ModelExampleGroup do
5
+ it { should be_included_in_files_in('./spec/models/') }
6
+ it { should be_included_in_files_in('.\\spec\\models\\') }
7
+
8
+ it "adds :type => :model to the metadata" do
9
+ group = RSpec::Core::ExampleGroup.describe do
10
+ include ModelExampleGroup
11
+ end
12
+ group.metadata[:type].should eq(:model)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ module RSpec::Rails
4
+ describe RequestExampleGroup do
5
+ it { should be_included_in_files_in('./spec/requests/') }
6
+ it { should be_included_in_files_in('./spec/integration/') }
7
+ it { should be_included_in_files_in('.\\spec\\requests\\') }
8
+ it { should be_included_in_files_in('.\\spec\\integration\\') }
9
+
10
+ it "adds :type => :request to the metadata" do
11
+ group = RSpec::Core::ExampleGroup.describe do
12
+ include RequestExampleGroup
13
+ end
14
+ group.metadata[:type].should eq(:request)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ require "spec_helper"
2
+
3
+ module RSpec::Rails
4
+ describe RoutingExampleGroup do
5
+ it { should be_included_in_files_in('./spec/routing/') }
6
+ it { should be_included_in_files_in('.\\spec\\routing\\') }
7
+
8
+ it "adds :type => :routing to the metadata" do
9
+ group = RSpec::Core::ExampleGroup.describe do
10
+ include RoutingExampleGroup
11
+ end
12
+ group.metadata[:type].should eq(:routing)
13
+ end
14
+
15
+ describe "named routes" do
16
+ it "delegates them to the route_set" do
17
+ group = RSpec::Core::ExampleGroup.describe do
18
+ include RoutingExampleGroup
19
+ end
20
+
21
+ example = group.new
22
+
23
+ # Yes, this is quite invasive
24
+ url_helpers = double('url_helpers', :foo_path => "foo")
25
+ routes = double('routes', :url_helpers => url_helpers)
26
+ example.stub(:routes => routes)
27
+
28
+ example.foo_path.should == "foo"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,220 @@
1
+ require "spec_helper"
2
+
3
+ module RSpec::Rails
4
+ describe ViewExampleGroup do
5
+ it { should be_included_in_files_in('./spec/views/') }
6
+ it { should be_included_in_files_in('.\\spec\\views\\') }
7
+
8
+ it "adds :type => :view to the metadata" do
9
+ group = RSpec::Core::ExampleGroup.describe do
10
+ include ViewExampleGroup
11
+ end
12
+ group.metadata[:type].should eq(:view)
13
+ end
14
+
15
+ describe 'automatic inclusion of helpers' do
16
+ module ::ThingsHelper; end
17
+ module ::Namespaced; module ThingsHelper; end; end
18
+
19
+ it 'includes the helper with the same name' do
20
+ group = RSpec::Core::ExampleGroup.describe 'things/show.html.erb'
21
+ group.should_receive(:helper).with(ThingsHelper)
22
+ group.class_eval do
23
+ include ViewExampleGroup
24
+ end
25
+ end
26
+
27
+ it 'includes the namespaced helper with the same name' do
28
+ group = RSpec::Core::ExampleGroup.describe 'namespaced/things/show.html.erb'
29
+ group.should_receive(:helper).with(Namespaced::ThingsHelper)
30
+ group.class_eval do
31
+ include ViewExampleGroup
32
+ end
33
+ end
34
+
35
+ it 'operates normally when no helper with the same name exists' do
36
+ raise 'unexpected constant found' if Object.const_defined?('ClocksHelper')
37
+ lambda {
38
+ RSpec::Core::ExampleGroup.describe 'clocks/show.html.erb' do
39
+ include ViewExampleGroup
40
+ end
41
+ }.should_not raise_error
42
+ end
43
+
44
+ context 'application helper exists' do
45
+ before do
46
+ if !Object.const_defined? 'ApplicationHelper'
47
+ module ::ApplicationHelper; end
48
+ @application_helper_defined = true
49
+ end
50
+ end
51
+
52
+ after do
53
+ if @application_helper_defined
54
+ Object.__send__ :remove_const, 'ApplicationHelper'
55
+ end
56
+ end
57
+
58
+ it 'includes the application helper' do
59
+ group = RSpec::Core::Example.describe 'bars/new.html.erb'
60
+ group.should_receive(:helper).with(ApplicationHelper)
61
+ group.class_eval do
62
+ include ViewExampleGroup
63
+ end
64
+ end
65
+ end
66
+
67
+ context 'no application helper exists' do
68
+ before do
69
+ if Object.const_defined? 'ApplicationHelper'
70
+ @application_helper = ApplicationHelper
71
+ Object.__send__ :remove_const, 'ApplicationHelper'
72
+ end
73
+ end
74
+
75
+ after do
76
+ if @application_helper
77
+ ApplicationHelper = @application_helper
78
+ end
79
+ end
80
+
81
+ it 'operates normally' do
82
+ lambda {
83
+ RSpec::Core::ExampleGroup.describe 'foos/edit.html.erb' do
84
+ include ViewExampleGroup
85
+ end
86
+ }.should_not raise_error
87
+ end
88
+ end
89
+ end
90
+
91
+ describe "#render" do
92
+ let(:view_spec) do
93
+ Class.new do
94
+ module Local
95
+ def received
96
+ @received ||= []
97
+ end
98
+ def render(options={}, local_assigns={}, &block)
99
+ received << [options, local_assigns, block]
100
+ end
101
+ def _assigns
102
+ {}
103
+ end
104
+ end
105
+ include Local
106
+ include ViewExampleGroup::ExampleMethods
107
+ end.new
108
+ end
109
+
110
+ context "given no input" do
111
+ it "sends render(:template => (described file)) to the view" do
112
+ view_spec.stub(:_default_file_to_render) { "widgets/new" }
113
+ view_spec.render
114
+ view_spec.received.first.should == [{:template => "widgets/new"},{}, nil]
115
+ end
116
+
117
+ it "converts the filename components into render options" do
118
+ view_spec.stub(:_default_file_to_render) { "widgets/new.en.html.erb" }
119
+ view_spec.render
120
+
121
+ if ::Rails::VERSION::STRING >= '3.2'
122
+ view_spec.received.first.should == [{:template => "widgets/new", :locales=>['en'], :formats=>['html'], :handlers=>['erb']}, {}, nil]
123
+ else
124
+ view_spec.received.first.should == [{:template => "widgets/new.en.html.erb"}, {}, nil]
125
+ end
126
+ end
127
+ end
128
+
129
+ context "given a string" do
130
+ it "sends string as the first arg to render" do
131
+ view_spec.render('arbitrary/path')
132
+ view_spec.received.first.should == ["arbitrary/path", {}, nil]
133
+ end
134
+ end
135
+
136
+ context "given a hash" do
137
+ it "sends the hash as the first arg to render" do
138
+ view_spec.render(:foo => 'bar')
139
+ view_spec.received.first.should == [{:foo => "bar"}, {}, nil]
140
+ end
141
+ end
142
+ end
143
+
144
+ describe '#params' do
145
+ let(:view_spec) do
146
+ Class.new do
147
+ include ViewExampleGroup::ExampleMethods
148
+ def controller
149
+ @controller ||= Object.new
150
+ end
151
+ end.new
152
+ end
153
+
154
+ it 'delegates to the controller' do
155
+ view_spec.controller.should_receive(:params).and_return({})
156
+ view_spec.params[:foo] = 1
157
+ end
158
+ end
159
+
160
+ describe "#_controller_path" do
161
+ let(:view_spec) do
162
+ Class.new do
163
+ include ViewExampleGroup::ExampleMethods
164
+ end.new
165
+ end
166
+ context "with a common _default_file_to_render" do
167
+ it "it returns the directory" do
168
+ view_spec.stub(:_default_file_to_render).
169
+ and_return("things/new.html.erb")
170
+ view_spec.__send__(:_controller_path).
171
+ should == "things"
172
+ end
173
+ end
174
+
175
+ context "with a nested _default_file_to_render" do
176
+ it "it returns the directory path" do
177
+ view_spec.stub(:_default_file_to_render).
178
+ and_return("admin/things/new.html.erb")
179
+ view_spec.__send__(:_controller_path).
180
+ should == "admin/things"
181
+ end
182
+ end
183
+ end
184
+
185
+ describe "#view" do
186
+ let(:view_spec) do
187
+ Class.new do
188
+ include ViewExampleGroup::ExampleMethods
189
+ end.new
190
+ end
191
+
192
+ it "delegates to _view" do
193
+ view = double("view")
194
+ view_spec.stub(:_view) { view }
195
+ view_spec.view.should == view
196
+ end
197
+ end
198
+
199
+ describe "#template" do
200
+ let(:view_spec) do
201
+ Class.new do
202
+ include ViewExampleGroup::ExampleMethods
203
+ def _view; end
204
+ end.new
205
+ end
206
+
207
+ before { RSpec.stub(:deprecate) }
208
+
209
+ it "is deprecated" do
210
+ RSpec.should_receive(:deprecate)
211
+ view_spec.template
212
+ end
213
+
214
+ it "delegates to #view" do
215
+ view_spec.should_receive(:view)
216
+ view_spec.template
217
+ end
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ describe "errors_on" do
4
+ let(:klass) do
5
+ Class.new do
6
+ include ActiveModel::Validations
7
+ end
8
+ end
9
+
10
+ it "calls valid?" do
11
+ model = klass.new
12
+ model.should_receive(:valid?)
13
+ model.errors_on(:foo)
14
+ end
15
+
16
+ it "returns the errors on that attribute" do
17
+ model = klass.new
18
+ model.stub(:errors) do
19
+ { :foo => ['a', 'b'] }
20
+ end
21
+ model.errors_on(:foo).should eq(['a','b'])
22
+ end
23
+ end