rspec-rails 2.0.0.beta.22 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. data/.gitignore +10 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +10 -0
  4. data/History.md +1 -33
  5. data/License.txt +23 -0
  6. data/{README.markdown → README.md} +27 -7
  7. data/README_DEV.md +43 -0
  8. data/Rakefile +105 -35
  9. data/Thorfile +40 -0
  10. data/Upgrade.md +1 -0
  11. data/features/.nav +34 -0
  12. data/features/Autotest.md +24 -0
  13. data/features/Changelog.md +151 -0
  14. data/features/Generators.md +8 -0
  15. data/features/GettingStarted.md +84 -0
  16. data/features/README.md +58 -0
  17. data/features/Upgrade.md +117 -0
  18. data/features/controller_specs/README.md +45 -0
  19. data/features/controller_specs/anonymous_controller.feature +7 -7
  20. data/features/controller_specs/controller_spec.feature +18 -0
  21. data/features/controller_specs/isolation_from_views.feature +55 -8
  22. data/features/controller_specs/render_views.feature +63 -52
  23. data/features/helper_specs/helper_spec.feature +40 -6
  24. data/features/mailer_specs/url_helpers.feature +4 -4
  25. data/features/matchers/README.md +4 -0
  26. data/features/matchers/new_record_matcher.feature +6 -48
  27. data/features/matchers/redirect_to_matcher.feature +5 -6
  28. data/features/matchers/render_template_matcher.feature +13 -10
  29. data/features/mocks/mock_model.feature +29 -13
  30. data/features/mocks/stub_model.feature +4 -4
  31. data/features/model_specs/README.md +21 -0
  32. data/features/model_specs/errors_on.feature +2 -2
  33. data/features/model_specs/transactional_examples.feature +14 -9
  34. data/features/request_specs/request_spec.feature +49 -0
  35. data/features/routing_specs/README.md +17 -0
  36. data/features/{matchers → routing_specs}/be_routable_matcher.feature +25 -25
  37. data/features/routing_specs/named_routes.feature +18 -0
  38. data/features/routing_specs/route_to_matcher.feature +58 -0
  39. data/features/step_definitions/additional_cli_steps.rb +4 -0
  40. data/features/support/env.rb +14 -6
  41. data/features/view_specs/inferred_controller_path.feature +6 -6
  42. data/features/view_specs/stub_template.feature +51 -0
  43. data/features/view_specs/view_spec.feature +23 -42
  44. data/gemfiles/.bundle/config +2 -0
  45. data/gemfiles/base.rb +58 -0
  46. data/gemfiles/rails-3-0-stable +6 -0
  47. data/gemfiles/rails-3.0.0 +5 -0
  48. data/gemfiles/rails-3.0.1 +5 -0
  49. data/gemfiles/rails-3.0.2 +5 -0
  50. data/gemfiles/rails-3.0.3 +5 -0
  51. data/gemfiles/rails-3.0.4 +5 -0
  52. data/gemfiles/rails-3.0.5 +5 -0
  53. data/gemfiles/rails-3.0.6 +5 -0
  54. data/gemfiles/rails-3.0.7 +5 -0
  55. data/gemfiles/rails-3.1.0.beta1 +5 -0
  56. data/gemfiles/rails-master +7 -0
  57. data/lib/autotest/rails_rspec2.rb +1 -1
  58. data/lib/generators/rspec/controller/controller_generator.rb +4 -4
  59. data/lib/generators/rspec/helper/helper_generator.rb +3 -3
  60. data/lib/generators/rspec/install/install_generator.rb +0 -8
  61. data/lib/generators/rspec/integration/integration_generator.rb +15 -1
  62. data/lib/generators/rspec/integration/templates/request_spec.rb +7 -1
  63. data/lib/generators/rspec/mailer/mailer_generator.rb +2 -2
  64. data/lib/generators/rspec/model/model_generator.rb +1 -1
  65. data/lib/generators/rspec/observer/observer_generator.rb +1 -1
  66. data/lib/generators/rspec/scaffold/scaffold_generator.rb +40 -11
  67. data/lib/generators/rspec/scaffold/templates/controller_spec.rb +90 -58
  68. data/lib/generators/rspec/scaffold/templates/edit_spec.rb +15 -7
  69. data/lib/generators/rspec/scaffold/templates/index_spec.rb +7 -2
  70. data/lib/generators/rspec/scaffold/templates/new_spec.rb +14 -7
  71. data/lib/generators/rspec/scaffold/templates/routing_spec.rb +14 -14
  72. data/lib/generators/rspec/scaffold/templates/show_spec.rb +7 -2
  73. data/lib/generators/rspec/view/view_generator.rb +1 -1
  74. data/lib/rspec/rails/example/controller_example_group.rb +25 -34
  75. data/lib/rspec/rails/example/helper_example_group.rb +5 -11
  76. data/lib/rspec/rails/example/mailer_example_group.rb +0 -14
  77. data/lib/rspec/rails/example/model_example_group.rb +0 -4
  78. data/lib/rspec/rails/example/rails_example_group.rb +0 -2
  79. data/lib/rspec/rails/example/request_example_group.rb +5 -30
  80. data/lib/rspec/rails/example/routing_example_group.rb +3 -5
  81. data/lib/rspec/rails/example/view_example_group.rb +20 -11
  82. data/lib/rspec/rails/example.rb +31 -1
  83. data/lib/rspec/rails/extensions/active_record/base.rb +28 -32
  84. data/lib/rspec/rails/fixture_support.rb +1 -1
  85. data/lib/rspec/rails/matchers/be_new_record.rb +5 -0
  86. data/lib/rspec/rails/matchers/redirect_to.rb +6 -2
  87. data/lib/rspec/rails/matchers/render_template.rb +5 -1
  88. data/lib/rspec/rails/matchers/routing_matchers.rb +24 -3
  89. data/lib/rspec/rails/matchers.rb +1 -1
  90. data/lib/rspec/rails/mocks.rb +118 -79
  91. data/lib/rspec/rails/module_inclusion.rb +17 -0
  92. data/lib/rspec/rails/tasks/rspec.rake +1 -1
  93. data/lib/rspec/rails/vendor/capybara.rb +29 -0
  94. data/lib/rspec/rails/vendor/webrat.rb +33 -0
  95. data/lib/rspec/rails/version.rb +1 -1
  96. data/lib/rspec/rails/view_assigns.rb +23 -4
  97. data/lib/rspec/rails/view_rendering.rb +50 -13
  98. data/lib/rspec/rails.rb +7 -10
  99. data/lib/rspec-rails.rb +4 -2
  100. data/rspec-rails.gemspec +11 -39
  101. data/spec/autotest/rails_rspec2_spec.rb +25 -14
  102. data/spec/rspec/rails/configuration_spec.rb +26 -0
  103. data/spec/rspec/rails/deprecations_spec.rb +18 -0
  104. data/spec/rspec/rails/example/controller_example_group_spec.rb +47 -5
  105. data/spec/rspec/rails/example/helper_example_group_spec.rb +19 -1
  106. data/spec/rspec/rails/example/request_example_group_spec.rb +2 -0
  107. data/spec/rspec/rails/extensions/active_model/errors_on_spec.rb +23 -0
  108. data/spec/rspec/rails/extensions/active_record/records_spec.rb +9 -0
  109. data/spec/rspec/rails/matchers/be_new_record_spec.rb +17 -0
  110. data/spec/rspec/rails/matchers/be_routable_spec.rb +41 -0
  111. data/spec/rspec/rails/matchers/redirect_to_spec.rb +67 -8
  112. data/spec/rspec/rails/matchers/render_template_spec.rb +67 -10
  113. data/spec/rspec/rails/matchers/route_to_spec.rb +77 -31
  114. data/spec/rspec/rails/mocks/ar_classes.rb +17 -25
  115. data/spec/rspec/rails/mocks/mock_model_spec.rb +50 -13
  116. data/spec/rspec/rails/mocks/stub_model_spec.rb +121 -67
  117. data/spec/rspec/rails/view_rendering_spec.rb +105 -0
  118. data/spec/spec_helper.rb +0 -22
  119. data/spec/support/matchers.rb +9 -0
  120. data/templates/generate_stuff.rb +10 -2
  121. data/templates/run_specs.rb +2 -2
  122. metadata +141 -79
  123. data/Gemfile +0 -24
  124. data/Gotchas.markdown +0 -14
  125. data/Upgrade.markdown +0 -31
  126. data/autotest/discover.rb +0 -1
  127. data/features/README.markdown +0 -12
  128. data/features/controller_specs/readers.feature +0 -18
  129. data/features/routing_specs/access_to_named_routes.feature +0 -15
  130. data/lib/generators/rspec/install/templates/autotest/discover.rb +0 -2
  131. data/lib/rspec/rails/browser_simulators.rb +0 -30
  132. data/spec/rspec/rails/example/view_rendering_spec.rb +0 -110
  133. data/specs.watchr +0 -59
  134. data/templates/Gemfile +0 -18
@@ -2,100 +2,154 @@ require 'spec_helper'
2
2
  require File.dirname(__FILE__) + '/ar_classes'
3
3
 
4
4
  describe "stub_model" do
5
- describe "defaults" do
6
- it "has an id" do
7
- stub_model(MockableModel).id.should be > 0
5
+
6
+ shared_examples_for "stub model" do
7
+ describe "with a block" do
8
+ it "yields the model" do
9
+ model = stub_model(model_class) do |block_arg|
10
+ @block_arg = block_arg
11
+ end
12
+ model.should be(@block_arg)
13
+ end
8
14
  end
9
15
 
10
- it "says it is not a new record" do
11
- stub_model(MockableModel).should_not be_new_record
16
+ describe "#persisted?" do
17
+ context "default" do
18
+ it "returns true" do
19
+ model = stub_model(model_class)
20
+ model.should be_persisted
21
+ end
22
+ end
23
+
24
+ context "with as_new_record" do
25
+ it "returns false" do
26
+ model = stub_model(model_class).as_new_record
27
+ model.should_not be_persisted
28
+ end
29
+ end
12
30
  end
13
- end
14
31
 
15
- it "accepts a stub id" do
16
- stub_model(MockableModel, :id => 37).id.should == 37
17
- end
32
+ it "increments the value returned by to_param" do
33
+ first = stub_model(model_class)
34
+ second = stub_model(model_class)
35
+ second.to_param.to_i.should == (first.to_param.to_i + 1)
36
+ end
18
37
 
19
- it "says it is a new record when id is set to nil" do
20
- stub_model(MockableModel, :id => nil).should be_new_record
38
+ describe "#blank?" do
39
+ it "is false" do
40
+ stub_model(model_class).should_not be_blank
41
+ end
42
+ end
21
43
  end
22
44
 
23
- it "accepts any arbitrary stub" do
24
- stub_model(MockableModel, :foo => "bar").foo.should == "bar"
45
+ context "with ActiveModel (not ActiveRecord)" do
46
+ it_behaves_like "stub model" do
47
+ def model_class
48
+ NonActiveRecordModel
49
+ end
50
+ end
25
51
  end
26
52
 
27
- it "accepts a stub for save" do
28
- stub_model(MockableModel, :save => false).save.should be(false)
29
- end
30
-
31
- describe "alternate primary key" do
32
- it "has the correct primary_key name" do
33
- stub_model(AlternatePrimaryKeyModel).class.primary_key.should eql('my_id')
53
+ context "with an ActiveRecord model" do
54
+ let(:model_class) { MockableModel }
55
+
56
+ it_behaves_like "stub model"
57
+
58
+ describe "#new_record?" do
59
+ context "default" do
60
+ it "returns false" do
61
+ model = stub_model(model_class)
62
+ model.new_record?.should be_false
63
+ end
64
+ end
65
+
66
+ context "with as_new_record" do
67
+ it "returns true" do
68
+ model = stub_model(model_class).as_new_record
69
+ model.new_record?.should be_true
70
+ end
71
+ end
34
72
  end
35
-
36
- it "has a primary_key" do
37
- stub_model(AlternatePrimaryKeyModel).my_id.should be > 0
73
+
74
+ describe "defaults" do
75
+ it "has an id" do
76
+ stub_model(MockableModel).id.should be > 0
77
+ end
78
+
79
+ it "says it is not a new record" do
80
+ stub_model(MockableModel).should_not be_new_record
81
+ end
38
82
  end
39
-
40
- it "does not say it is a new record" do
41
- stub_model(AlternatePrimaryKeyModel).should_not be_new_record
83
+
84
+ describe "#as_new_record" do
85
+ it "has a nil id" do
86
+ stub_model(MockableModel).as_new_record.id.should be(nil)
87
+ end
42
88
  end
43
-
44
- it "says it is a new record if primary_key is nil" do
45
- stub_model(AlternatePrimaryKeyModel, :my_id => nil).should be_new_record
89
+
90
+ it "raises when hitting the db" do
91
+ lambda do
92
+ stub_model(MockableModel).connection
93
+ end.should raise_error(RSpec::Rails::IllegalDataAccessException, /stubbed models are not allowed to access the database/)
46
94
  end
47
-
48
- it "accepts a stub for the primary_key" do
49
- stub_model(AlternatePrimaryKeyModel, :my_id => 5).my_id.should == 5
95
+
96
+ it "increments the id" do
97
+ first = stub_model(model_class)
98
+ second = stub_model(model_class)
99
+ second.id.should == (first.id + 1)
50
100
  end
51
- end
52
101
 
53
- describe "#as_new_record" do
54
- it "says it is a new record" do
55
- stub_model(MockableModel).as_new_record.should be_new_record
102
+ it "accepts a stub id" do
103
+ stub_model(MockableModel, :id => 37).id.should == 37
56
104
  end
57
105
 
58
- it "has a nil id" do
59
- stub_model(MockableModel).as_new_record.id.should be(nil)
106
+ it "says it is a new record when id is set to nil" do
107
+ stub_model(MockableModel, :id => nil).should be_new_record
60
108
  end
61
- end
62
109
 
63
- it "raises when hitting the db" do
64
- lambda do
65
- stub_model(ConnectableModel).connection
66
- end.should raise_error(RSpec::Rails::IllegalDataAccessException, /stubbed models are not allowed to access the database/)
67
- end
110
+ it "accepts a stub for save" do
111
+ stub_model(MockableModel, :save => false).save.should be(false)
112
+ end
68
113
 
69
- it "increments the id" do
70
- first = stub_model(MockableModel)
71
- second = stub_model(MockableModel)
72
- second.id.should == (first.id + 1)
73
- end
114
+ describe "alternate primary key" do
115
+ it "has the correct primary_key name" do
116
+ stub_model(AlternatePrimaryKeyModel).class.primary_key.to_s.should eql('my_id')
117
+ end
118
+
119
+ it "has a primary_key" do
120
+ stub_model(AlternatePrimaryKeyModel).my_id.should be > 0
121
+ end
122
+
123
+ it "says it is not a new record" do
124
+ stub_model(AlternatePrimaryKeyModel) do |m|
125
+ m.should_not be_new_record
126
+ end
127
+ end
128
+
129
+ it "says it is a new record if primary_key is nil" do
130
+ stub_model(AlternatePrimaryKeyModel, :my_id => nil).should be_new_record
131
+ end
74
132
 
75
- describe "as association" do
76
- before(:each) do
77
- @real = AssociatedModel.create!
78
- @stub_model = stub_model(MockableModel)
79
- @real.mockable_model = @stub_model
133
+ it "accepts a stub for the primary_key" do
134
+ stub_model(AlternatePrimaryKeyModel, :my_id => 5).my_id.should == 5
135
+ end
80
136
  end
81
137
 
82
- it "passes associated_model == mock" do
138
+ describe "as association" do
139
+ before(:each) do
140
+ @real = AssociatedModel.create!
141
+ @stub_model = stub_model(MockableModel)
142
+ @real.mockable_model = @stub_model
143
+ end
144
+
145
+ it "passes associated_model == mock" do
83
146
  @stub_model.should == @real.mockable_model
84
- end
147
+ end
85
148
 
86
- it "passes mock == associated_model" do
149
+ it "passes mock == associated_model" do
87
150
  @real.mockable_model.should == @stub_model
88
- end
89
- end
90
-
91
- describe "with a block" do
92
- it "yields the model" do
93
- model = stub_model(MockableModel) do |block_arg|
94
- @block_arg = block_arg
95
151
  end
96
- model.should be(@block_arg)
97
152
  end
153
+
98
154
  end
99
155
  end
100
-
101
-
@@ -0,0 +1,105 @@
1
+ require "spec_helper"
2
+
3
+ module RSpec::Rails
4
+ describe ViewRendering do
5
+ let(:group) do
6
+ RSpec::Core::ExampleGroup.describe do
7
+ def controller
8
+ ActionController::Base.new
9
+ end
10
+ include ViewRendering
11
+ end
12
+ end
13
+
14
+ context "default" do
15
+ context "ActionController::Base" do
16
+ it "does not render views" do
17
+ group.new.render_views?.should be_false
18
+ end
19
+
20
+ it "does not render views in a nested group" do
21
+ group.describe{}.new.render_views?.should be_false
22
+ end
23
+ end
24
+
25
+ context "ActionController::Metal" do
26
+ it "renders views" do
27
+ group.new.tap do |example|
28
+ def example.controller
29
+ ActionController::Metal.new
30
+ end
31
+ example.render_views?.should be_true
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ describe "#render_views" do
38
+ context "with no args" do
39
+ it "tells examples to render views" do
40
+ group.render_views
41
+ group.new.render_views?.should be_true
42
+ end
43
+ end
44
+
45
+ context "with true" do
46
+ it "tells examples to render views" do
47
+ group.render_views true
48
+ group.new.render_views?.should be_true
49
+ end
50
+ end
51
+
52
+ context "with false" do
53
+ it "tells examples not to render views" do
54
+ group.render_views false
55
+ group.new.render_views?.should be_false
56
+ end
57
+ end
58
+
59
+ context "in a nested group" do
60
+ let(:nested_group) do
61
+ group.describe{}
62
+ end
63
+
64
+ context "with no args" do
65
+ it "tells examples to render views" do
66
+ nested_group.render_views
67
+ nested_group.new.render_views?.should be_true
68
+ end
69
+ end
70
+
71
+ context "with true" do
72
+ it "tells examples to render views" do
73
+ nested_group.render_views true
74
+ nested_group.new.render_views?.should be_true
75
+ end
76
+ end
77
+
78
+ context "with false" do
79
+ it "tells examples not to render views" do
80
+ nested_group.render_views false
81
+ nested_group.new.render_views?.should be_false
82
+ end
83
+ end
84
+
85
+ it "leaves the parent group as/is" do
86
+ group.render_views
87
+ nested_group.render_views false
88
+ group.new.render_views?.should be_true
89
+ end
90
+
91
+ it "overrides the value inherited from the parent group" do
92
+ group.render_views
93
+ nested_group.render_views false
94
+ nested_group.new.render_views?.should be_false
95
+ end
96
+
97
+ it "passes override to children" do
98
+ group.render_views
99
+ nested_group.render_views false
100
+ nested_group.describe{}.new.render_views?.should be_false
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
data/spec/spec_helper.rb CHANGED
@@ -9,35 +9,13 @@ require 'rspec/rails'
9
9
 
10
10
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
11
11
 
12
- # TODO - most of this is borrowed from rspec-core's spec_helper - should
13
- # be extracted to something we can use here
14
- def in_editor?
15
- ENV.has_key?('TM_MODE') || ENV.has_key?('EMACS') || ENV.has_key?('VIM')
16
- end
17
-
18
12
  class RSpec::Core::ExampleGroup
19
13
  def self.run_all(reporter=nil)
20
14
  run(reporter || RSpec::Mocks::Mock.new('reporter').as_null_object)
21
15
  end
22
16
  end
23
17
 
24
- module MatchesForRSpecRailsSpecs
25
- extend RSpec::Matchers::DSL
26
-
27
- matcher :be_included_in_files_in do |path|
28
- match do |mod|
29
- stub_metadata(
30
- :example_group => {:file_path => "#{path}whatever_spec.rb:15"}
31
- )
32
- group = RSpec::Core::ExampleGroup.describe
33
- group.included_modules.include?(mod)
34
- end
35
- end
36
- end
37
-
38
18
  RSpec.configure do |c|
39
- c.include MatchesForRSpecRailsSpecs
40
- c.color_enabled = !in_editor?
41
19
  c.before(:each) do
42
20
  @real_world = RSpec.world
43
21
  RSpec.instance_variable_set(:@world, RSpec::Core::World.new)
@@ -0,0 +1,9 @@
1
+ RSpec::Matchers::define :be_included_in_files_in do |path|
2
+ match do |mod|
3
+ stub_metadata(
4
+ :example_group => {:file_path => "#{path}whatever_spec.rb:15"}
5
+ )
6
+ group = RSpec::Core::ExampleGroup.describe
7
+ group.included_modules.include?(mod)
8
+ end
9
+ end
@@ -5,9 +5,17 @@ generate('integration_test widgets')
5
5
  generate('mailer Notifications signup')
6
6
  generate('model thing name:string')
7
7
  generate('helper things')
8
- generate('scaffold widget name:string category:string instock:boolean')
8
+ generate('scaffold widget name:string category:string instock:boolean --force')
9
9
  generate('observer widget')
10
- generate('scaffold gadget ') # scaffold with no attributes
10
+ generate('scaffold gadget') # scaffold with no attributes
11
+ generate('scaffold admin/accounts name:string') # scaffold with nested resource
12
+
13
+ generate('controller things custom_action')
14
+ template_code= <<-TEMPLATE
15
+ <% raise 'Error from custom_action because we should never render this template....derp derp derp' %>
16
+ TEMPLATE
17
+
18
+ file "app/views/things/custom_action.html.erb", template_code, {:force=>true}
11
19
 
12
20
  run('rake db:migrate')
13
21
  run('rake db:test:prepare')
@@ -1,4 +1,4 @@
1
- run('bundle exec rspec spec -cfdoc')
1
+ run('rspec spec -cfdoc')
2
2
  run('rake spec')
3
3
  run('rake spec:requests')
4
4
  run('rake spec:models')
@@ -6,4 +6,4 @@ run('rake spec:views')
6
6
  run('rake spec:controllers')
7
7
  run('rake spec:helpers')
8
8
  run('rake spec:mailers')
9
- run('rake stats')
9
+ run("rake stats")