rspec-rails 2.99.0 → 3.0.0.beta1

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 (128) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.sig +2 -0
  3. data.tar.gz.sig +0 -0
  4. data/Changelog.md +40 -68
  5. data/License.txt +1 -0
  6. data/README.md +6 -4
  7. data/features/Generators.md +24 -0
  8. data/features/GettingStarted.md +84 -0
  9. data/features/README.md +56 -0
  10. data/features/RailsVersions.md +4 -0
  11. data/features/Transactions.md +84 -0
  12. data/features/Upgrade.md +121 -0
  13. data/features/controller_specs/Cookies.md +57 -0
  14. data/features/controller_specs/README.md +45 -0
  15. data/features/controller_specs/anonymous_controller.feature +378 -0
  16. data/features/controller_specs/bypass_rescue.feature +75 -0
  17. data/features/controller_specs/controller_spec.feature +58 -0
  18. data/features/controller_specs/engine_routes.feature +51 -0
  19. data/features/controller_specs/isolation_from_views.feature +87 -0
  20. data/features/controller_specs/render_views.feature +114 -0
  21. data/features/directory_structure.feature +71 -0
  22. data/features/feature_specs/feature_spec.feature +35 -0
  23. data/features/helper_specs/helper_spec.feature +122 -0
  24. data/features/mailer_specs/url_helpers.feature +38 -0
  25. data/features/matchers/README.md +18 -0
  26. data/features/matchers/new_record_matcher.feature +41 -0
  27. data/features/matchers/redirect_to_matcher.feature +40 -0
  28. data/features/matchers/relation_match_array.feature +27 -0
  29. data/features/matchers/render_template_matcher.feature +49 -0
  30. data/features/mocks/mock_model.feature +147 -0
  31. data/features/mocks/stub_model.feature +58 -0
  32. data/features/model_specs/README.md +21 -0
  33. data/features/model_specs/errors_on.feature +51 -0
  34. data/features/model_specs/records.feature +27 -0
  35. data/features/model_specs/transactional_examples.feature +109 -0
  36. data/features/request_specs/request_spec.feature +49 -0
  37. data/features/routing_specs/README.md +16 -0
  38. data/features/routing_specs/be_routable_matcher.feature +80 -0
  39. data/features/routing_specs/engine_routes.feature +38 -0
  40. data/features/routing_specs/named_routes.feature +18 -0
  41. data/features/routing_specs/route_to_matcher.feature +90 -0
  42. data/features/step_definitions/additional_cli_steps.rb +4 -0
  43. data/features/step_definitions/model_steps.rb +3 -0
  44. data/features/support/capybara.rb +7 -0
  45. data/features/support/env.rb +53 -0
  46. data/features/support/rails_versions.rb +4 -0
  47. data/features/support/rubinius.rb +6 -0
  48. data/features/view_specs/inferred_controller_path.feature +45 -0
  49. data/features/view_specs/stub_template.feature +51 -0
  50. data/features/view_specs/view_spec.feature +206 -0
  51. data/lib/generators/rspec/controller/templates/controller_spec.rb +1 -1
  52. data/lib/generators/rspec/install/templates/spec/spec_helper.rb.tt +2 -21
  53. data/lib/generators/rspec/integration/integration_generator.rb +2 -3
  54. data/lib/generators/rspec/integration/templates/request_spec.rb +1 -1
  55. data/lib/generators/rspec/mailer/templates/mailer_spec.rb +4 -4
  56. data/lib/generators/rspec/scaffold/scaffold_generator.rb +2 -3
  57. data/lib/generators/rspec/scaffold/templates/controller_spec.rb +16 -16
  58. data/lib/generators/rspec/scaffold/templates/edit_spec.rb +2 -2
  59. data/lib/generators/rspec/scaffold/templates/index_spec.rb +1 -1
  60. data/lib/generators/rspec/scaffold/templates/new_spec.rb +2 -2
  61. data/lib/generators/rspec/scaffold/templates/routing_spec.rb +7 -7
  62. data/lib/generators/rspec/scaffold/templates/show_spec.rb +2 -2
  63. data/lib/rspec/rails.rb +0 -5
  64. data/lib/rspec/rails/adapters.rb +5 -12
  65. data/lib/rspec/rails/example.rb +55 -24
  66. data/lib/rspec/rails/example/controller_example_group.rb +7 -31
  67. data/lib/rspec/rails/example/view_example_group.rb +0 -3
  68. data/lib/rspec/rails/matchers.rb +1 -2
  69. data/lib/rspec/rails/matchers/be_a_new.rb +1 -1
  70. data/lib/rspec/rails/matchers/be_new_record.rb +1 -1
  71. data/lib/rspec/rails/matchers/be_valid.rb +1 -1
  72. data/lib/rspec/rails/matchers/have_rendered.rb +1 -1
  73. data/lib/rspec/rails/matchers/redirect_to.rb +1 -1
  74. data/lib/rspec/rails/matchers/relation_match_array.rb +1 -1
  75. data/lib/rspec/rails/matchers/routing_matchers.rb +6 -10
  76. data/lib/rspec/rails/mocks.rb +5 -41
  77. data/lib/rspec/rails/tasks/rspec.rake +5 -12
  78. data/lib/rspec/rails/vendor/capybara.rb +4 -35
  79. data/lib/rspec/rails/version.rb +1 -1
  80. data/spec/generators/rspec/controller/controller_generator_spec.rb +97 -0
  81. data/spec/generators/rspec/helper/helper_generator_spec.rb +30 -0
  82. data/spec/generators/rspec/install/install_generator_spec.rb +30 -0
  83. data/spec/generators/rspec/integration/integration_generator_spec.rb +44 -0
  84. data/spec/generators/rspec/mailer/mailer_generator_spec.rb +48 -0
  85. data/spec/generators/rspec/model/model_generator_spec.rb +52 -0
  86. data/spec/generators/rspec/observer/observer_generator_spec.rb +21 -0
  87. data/spec/generators/rspec/scaffold/scaffold_generator_spec.rb +138 -0
  88. data/spec/generators/rspec/view/view_generator_spec.rb +41 -0
  89. data/spec/rspec/rails/assertion_adapter_spec.rb +28 -0
  90. data/spec/rspec/rails/assertion_delegator_spec.rb +43 -0
  91. data/spec/rspec/rails/configuration_spec.rb +26 -0
  92. data/spec/rspec/rails/deprecations_spec.rb +18 -0
  93. data/spec/rspec/rails/example/controller_example_group_spec.rb +100 -0
  94. data/spec/rspec/rails/example/feature_example_group_spec.rb +56 -0
  95. data/spec/rspec/rails/example/helper_example_group_spec.rb +66 -0
  96. data/spec/rspec/rails/example/mailer_example_group_spec.rb +21 -0
  97. data/spec/rspec/rails/example/model_example_group_spec.rb +15 -0
  98. data/spec/rspec/rails/example/request_example_group_spec.rb +17 -0
  99. data/spec/rspec/rails/example/routing_example_group_spec.rb +32 -0
  100. data/spec/rspec/rails/example/view_example_group_spec.rb +220 -0
  101. data/spec/rspec/rails/extensions/active_model/errors_on_spec.rb +23 -0
  102. data/spec/rspec/rails/extensions/active_record/base_spec.rb +42 -0
  103. data/spec/rspec/rails/fixture_support_spec.rb +17 -0
  104. data/spec/rspec/rails/matchers/be_a_new_spec.rb +142 -0
  105. data/spec/rspec/rails/matchers/be_new_record_spec.rb +33 -0
  106. data/spec/rspec/rails/matchers/be_routable_spec.rb +41 -0
  107. data/spec/rspec/rails/matchers/be_valid_spec.rb +44 -0
  108. data/spec/rspec/rails/matchers/has_spec.rb +29 -0
  109. data/spec/rspec/rails/matchers/have_rendered_spec.rb +93 -0
  110. data/spec/rspec/rails/matchers/redirect_to_spec.rb +80 -0
  111. data/spec/rspec/rails/matchers/relation_match_array_spec.rb +31 -0
  112. data/spec/rspec/rails/matchers/route_to_spec.rb +151 -0
  113. data/spec/rspec/rails/minitest_lifecycle_adapter_spec.rb +22 -0
  114. data/spec/rspec/rails/mocks/mock_model_spec.rb +378 -0
  115. data/spec/rspec/rails/mocks/stub_model_spec.rb +154 -0
  116. data/spec/rspec/rails/setup_and_teardown_adapter_spec.rb +32 -0
  117. data/spec/rspec/rails/view_rendering_spec.rb +111 -0
  118. data/spec/spec_helper.rb +35 -0
  119. data/spec/support/ar_classes.rb +42 -0
  120. data/spec/support/helpers.rb +20 -0
  121. data/spec/support/matchers.rb +9 -0
  122. data/spec/support/null_object.rb +6 -0
  123. metadata +229 -42
  124. metadata.gz.sig +0 -0
  125. data/lib/autotest/rails_rspec2.rb +0 -91
  126. data/lib/rspec/rails/infer_type_configuration.rb +0 -26
  127. data/lib/rspec/rails/matchers/have_extension.rb +0 -36
  128. data/lib/rspec/rails/module_inclusion.rb +0 -19
@@ -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
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe ::ActiveModel::Validations do
4
+ describe "#errors_on" do
5
+ context "ActiveModel class that takes no arguments to valid?" do
6
+ let(:klass) {
7
+ Class.new do
8
+ include ActiveModel::Validations
9
+
10
+ def self.name
11
+ "ActiveModelValidationsFake"
12
+ end
13
+
14
+ def valid?
15
+ super
16
+ end
17
+
18
+ attr_accessor :name
19
+ validates_presence_of :name
20
+ end
21
+ }
22
+
23
+ context "with nil name" do
24
+ it "has one error" do
25
+ object = klass.new
26
+ object.name = ""
27
+
28
+ expect(object).to have(1).error_on(:name)
29
+ end
30
+ end
31
+
32
+ context "with non-blank name" do
33
+ it "has no error" do
34
+ object = klass.new
35
+ object.name = "Ywen"
36
+
37
+ expect(object).to have(:no).error_on(:name)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ module RSpec::Rails
4
+ describe FixtureSupport do
5
+ context "with use_transactional_fixtures set to false" do
6
+ it "still supports fixture_path" do
7
+ RSpec.configuration.stub(:use_transactional_fixtures) { false }
8
+ group = RSpec::Core::ExampleGroup.describe do
9
+ include FixtureSupport
10
+ end
11
+
12
+ group.should respond_to(:fixture_path)
13
+ group.should respond_to(:fixture_path=)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,142 @@
1
+ require "spec_helper"
2
+
3
+ describe "be_a_new matcher" do
4
+ include RSpec::Rails::Matchers
5
+
6
+ context "new record" do
7
+ let(:record) do
8
+ Class.new do
9
+ def new_record?; true; end
10
+ end.new
11
+ end
12
+ context "right class" do
13
+ it "passes" do
14
+ record.should be_a_new(record.class)
15
+ end
16
+ end
17
+ context "wrong class" do
18
+ it "fails" do
19
+ record.should_not be_a_new(String)
20
+ end
21
+ end
22
+ end
23
+
24
+ context "existing record" do
25
+ let(:record) do
26
+ Class.new do
27
+ def new_record?; false; end
28
+ end.new
29
+ end
30
+ context "right class" do
31
+ it "fails" do
32
+ record.should_not be_a_new(record.class)
33
+ end
34
+ end
35
+ context "wrong class" do
36
+ it "fails" do
37
+ record.should_not be_a_new(String)
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "#with" do
43
+ context "right class and new record" do
44
+ let(:record) do
45
+ Class.new do
46
+ def initialize(attributes)
47
+ @attributes = attributes
48
+ end
49
+
50
+ def attributes
51
+ @attributes.stringify_keys
52
+ end
53
+
54
+ def new_record?; true; end
55
+ end.new(:foo => 'foo', :bar => 'bar')
56
+ end
57
+
58
+ context "all attributes same" do
59
+ it "passes" do
60
+ record.should be_a_new(record.class).with(:foo => 'foo', :bar => 'bar')
61
+ end
62
+ end
63
+
64
+ context "one attribute same" do
65
+ it "passes" do
66
+ record.should be_a_new(record.class).with(:foo => 'foo')
67
+ end
68
+ end
69
+
70
+ context "no attributes same" do
71
+ it "fails" do
72
+ expect {
73
+ record.should be_a_new(record.class).with(:zoo => 'zoo', :car => 'car')
74
+ }.to raise_error {|e|
75
+ e.message.should match(/attributes {.*} were not set on #{record.inspect}/)
76
+ e.message.should match(/"zoo"=>"zoo"/)
77
+ e.message.should match(/"car"=>"car"/)
78
+ }
79
+ end
80
+ end
81
+
82
+ context "one attribute value not the same" do
83
+ it "fails" do
84
+ expect {
85
+ record.should be_a_new(record.class).with(:foo => 'bar')
86
+ }.to raise_error(
87
+ %Q(attribute {"foo"=>"bar"} was not set on #{record.inspect})
88
+ )
89
+ end
90
+ end
91
+ end
92
+
93
+ context "wrong class and existing record" do
94
+ let(:record) do
95
+ Class.new do
96
+ def initialize(attributes)
97
+ @attributes = attributes
98
+ end
99
+
100
+ def attributes
101
+ @attributes.stringify_keys
102
+ end
103
+
104
+ def new_record?; false; end
105
+ end.new(:foo => 'foo', :bar => 'bar')
106
+ end
107
+
108
+ context "all attributes same" do
109
+ it "fails" do
110
+ expect {
111
+ record.should be_a_new(String).with(:foo => 'foo', :bar => 'bar')
112
+ }.to raise_error(
113
+ "expected #{record.inspect} to be a new String"
114
+ )
115
+ end
116
+ end
117
+
118
+ context "no attributes same" do
119
+ it "fails" do
120
+ expect {
121
+ record.should be_a_new(String).with(:zoo => 'zoo', :car => 'car')
122
+ }.to raise_error {|e|
123
+ e.message.should match(/expected #{record.inspect} to be a new String and attributes {.*} were not set on #{record.inspect}/)
124
+ e.message.should match(/"zoo"=>"zoo"/)
125
+ e.message.should match(/"car"=>"car"/)
126
+ }
127
+ end
128
+ end
129
+
130
+ context "one attribute value not the same" do
131
+ it "fails" do
132
+ expect {
133
+ record.should be_a_new(String).with(:foo => 'bar')
134
+ }.to raise_error(
135
+ "expected #{record.inspect} to be a new String and " +
136
+ %Q(attribute {"foo"=>"bar"} was not set on #{record.inspect})
137
+ )
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe "be_new_record" do
4
+ include RSpec::Rails::Matchers
5
+
6
+ context "un-persisted record" do
7
+ let(:record) { double('record', :persisted? => false) }
8
+
9
+ it "passes" do
10
+ record.should be_new_record
11
+ end
12
+
13
+ it "fails with custom failure message" do
14
+ expect {
15
+ expect(record).not_to be_new_record
16
+ }.to raise_exception(/expected .* to be persisted, but was a new record/)
17
+ end
18
+ end
19
+
20
+ context "persisted record" do
21
+ let(:record) { double('record', :persisted? => true) }
22
+
23
+ it "fails" do
24
+ record.should_not be_new_record
25
+ end
26
+
27
+ it "fails with custom failure message" do
28
+ expect {
29
+ expect(record).to be_new_record
30
+ }.to raise_exception(/expected .* to be a new record, but was persisted/)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,41 @@
1
+ require "spec_helper"
2
+
3
+ describe "be_routable" do
4
+ include RSpec::Rails::Matchers::RoutingMatchers
5
+ attr_reader :routes
6
+
7
+ before { @routes = double("routes") }
8
+
9
+ context "with should" do
10
+ it "passes if routes recognize the path" do
11
+ routes.stub(:recognize_path) { {} }
12
+ expect do
13
+ {:get => "/a/path"}.should be_routable
14
+ end.to_not raise_error
15
+ end
16
+
17
+ it "fails if routes do not recognize the path" do
18
+ routes.stub(:recognize_path) { raise ActionController::RoutingError.new('ignore') }
19
+ expect do
20
+ {:get => "/a/path"}.should be_routable
21
+ end.to raise_error(/expected \{:get=>"\/a\/path"\} to be routable/)
22
+ end
23
+ end
24
+
25
+ context "with should_not" do
26
+
27
+ it "passes if routes do not recognize the path" do
28
+ routes.stub(:recognize_path) { raise ActionController::RoutingError.new('ignore') }
29
+ expect do
30
+ {:get => "/a/path"}.should_not be_routable
31
+ end.to_not raise_error
32
+ end
33
+
34
+ it "fails if routes recognize the path" do
35
+ routes.stub(:recognize_path) { {:controller => "foo"} }
36
+ expect do
37
+ {:get => "/a/path"}.should_not be_routable
38
+ end.to raise_error(/expected \{:get=>"\/a\/path"\} not to be routable, but it routes to \{:controller=>"foo"\}/)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+ require 'active_support/all'
3
+ require 'rspec/rails/matchers/be_valid'
4
+
5
+ describe "be_valid matcher" do
6
+ include RSpec::Rails::Matchers
7
+
8
+ class Post
9
+ include ActiveModel::Validations
10
+ attr_accessor :title
11
+ validates_presence_of :title
12
+ end
13
+
14
+ let(:post) { Post.new }
15
+
16
+ it "includes the error messages in the failure message" do
17
+ expect {
18
+ expect(post).to be_valid
19
+ }.to raise_exception(/Title can't be blank/)
20
+ end
21
+
22
+ it "includes a failure message for the negative case" do
23
+ post.stub(:valid?) { true }
24
+ expect {
25
+ expect(post).not_to be_valid
26
+ }.to raise_exception(/expected .* not to be valid/)
27
+ end
28
+
29
+ it "uses a custom failure message if provided" do
30
+ expect {
31
+ expect(post).to be_valid, "Post was not valid!"
32
+ }.to raise_exception(/Post was not valid!/)
33
+ end
34
+
35
+ it "includes the validation context if provided" do
36
+ post.should_receive(:valid?).with(:create) { true }
37
+ expect(post).to be_valid(:create)
38
+ end
39
+
40
+ it "does not include the validation context if not provided" do
41
+ post.should_receive(:valid?).with(no_args) { true }
42
+ expect(post).to be_valid
43
+ end
44
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ class CollectionOwner < ActiveRecord::Base
4
+ connection.execute <<-SQL
5
+ CREATE TABLE collection_owners (
6
+ id integer PRIMARY KEY AUTOINCREMENT
7
+ )
8
+ SQL
9
+ has_many :associated_items do
10
+ def has_some_quality?; true end
11
+ end
12
+ end
13
+
14
+ class AssociatedItem < ActiveRecord::Base
15
+ connection.execute <<-SQL
16
+ CREATE TABLE associated_items (
17
+ id integer PRIMARY KEY AUTOINCREMENT,
18
+ collection_owner_id integer
19
+ )
20
+ SQL
21
+ belongs_to :collection_owner
22
+ end
23
+
24
+ describe "should have_xxx" do
25
+ it "works with ActiveRecord::Associations::CollectionProxy" do
26
+ owner = CollectionOwner.new
27
+ owner.associated_items.should have_some_quality
28
+ end
29
+ end
@@ -0,0 +1,93 @@
1
+ require "spec_helper"
2
+
3
+ %w[have_rendered render_template].each do |template_expectation|
4
+ describe template_expectation do
5
+ include RSpec::Rails::Matchers::RenderTemplate
6
+ let(:response) { ActionController::TestResponse.new }
7
+
8
+ context "given a hash" do
9
+ it "delegates to assert_template" do
10
+ self.should_receive(:assert_template).with({:this => "hash"}, "this message")
11
+ expect("response").to send(template_expectation, {:this => "hash"}, "this message")
12
+ end
13
+ end
14
+
15
+ context "given a string" do
16
+ it "delegates to assert_template" do
17
+ self.should_receive(:assert_template).with("this string", "this message")
18
+ expect("response").to send(template_expectation, "this string", "this message")
19
+ end
20
+ end
21
+
22
+ context "given a symbol" do
23
+ it "converts to_s and delegates to assert_template" do
24
+ self.should_receive(:assert_template).with("template_name", "this message")
25
+ expect("response").to send(template_expectation, :template_name, "this message")
26
+ end
27
+ end
28
+
29
+ context "with should" do
30
+ context "when assert_template passes" do
31
+ it "passes" do
32
+ def assert_template(*); end
33
+ expect do
34
+ expect(response).to send(template_expectation, "template_name")
35
+ end.to_not raise_exception
36
+ end
37
+ end
38
+
39
+ context "when assert_template fails" do
40
+ it "uses failure message from assert_template" do
41
+ def assert_template(*)
42
+ raise ActiveSupport::TestCase::Assertion.new("this message")
43
+ end
44
+ expect do
45
+ expect(response).to send(template_expectation, "template_name")
46
+ end.to raise_error("this message")
47
+ end
48
+ end
49
+
50
+ context "when fails due to some other exception" do
51
+ it "raises that exception" do
52
+ def assert_template(*)
53
+ raise "oops"
54
+ end
55
+ expect do
56
+ expect(response).to send(template_expectation, "template_name")
57
+ end.to raise_exception("oops")
58
+ end
59
+ end
60
+ end
61
+
62
+ context "with should_not" do
63
+ context "when assert_template fails" do
64
+ it "passes" do
65
+ def assert_template(*)
66
+ raise ActiveSupport::TestCase::Assertion.new("this message")
67
+ end
68
+ expect do
69
+ expect(response).to_not send(template_expectation, "template_name")
70
+ end.to_not raise_exception
71
+ end
72
+ end
73
+
74
+ context "when assert_template passes" do
75
+ it "fails with custom failure message" do
76
+ def assert_template(*); end
77
+ expect do
78
+ expect(response).to_not send(template_expectation, "template_name")
79
+ end.to raise_error(/expected not to render \"template_name\", but did/)
80
+ end
81
+ end
82
+
83
+ context "when fails due to some other exception" do
84
+ it "raises that exception" do
85
+ def assert_template(*); raise "oops"; end
86
+ expect do
87
+ expect(response).to_not send(template_expectation, "template_name")
88
+ end.to raise_exception("oops")
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end