rspec-rails 2.99.0 → 3.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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,75 @@
1
+ Feature: bypass rescue
2
+
3
+ Use `bypass_rescue` to bypass both Rails' default handling of errors in
4
+ controller actions, and any custom handling declared with a `rescue_from`
5
+ statement.
6
+
7
+ This lets you specify details of the exception being raised, regardless of
8
+ how it might be handled upstream.
9
+
10
+ Background:
11
+ Given a file named "spec/controllers/gadgets_controller_spec_context.rb" with:
12
+ """ruby
13
+ class AccessDenied < StandardError; end
14
+
15
+ class ApplicationController < ActionController::Base
16
+ rescue_from AccessDenied, :with => :access_denied
17
+
18
+ private
19
+
20
+ def access_denied
21
+ redirect_to "/401.html"
22
+ end
23
+ end
24
+ """
25
+
26
+ Scenario: standard exception handling using `rescue_from`
27
+ Given a file named "spec/controllers/gadgets_controller_spec.rb" with:
28
+ """ruby
29
+ require "spec_helper"
30
+
31
+ require 'controllers/gadgets_controller_spec_context'
32
+
33
+ describe GadgetsController do
34
+ before do
35
+ def controller.index
36
+ raise AccessDenied
37
+ end
38
+ end
39
+
40
+ describe "index" do
41
+ it "redirects to the /401.html page" do
42
+ get :index
43
+ expect(response).to redirect_to("/401.html")
44
+ end
45
+ end
46
+ end
47
+ """
48
+ When I run `rspec spec/controllers/gadgets_controller_spec.rb`
49
+ Then the examples should all pass
50
+
51
+ Scenario: bypass `rescue_from` handling with `bypass_rescue`
52
+ Given a file named "spec/controllers/gadgets_controller_spec.rb" with:
53
+ """ruby
54
+ require "spec_helper"
55
+
56
+ require 'controllers/gadgets_controller_spec_context'
57
+
58
+ describe GadgetsController do
59
+ before do
60
+ def controller.index
61
+ raise AccessDenied
62
+ end
63
+ end
64
+
65
+ describe "index" do
66
+ it "raises AccessDenied" do
67
+ bypass_rescue
68
+ expect { get :index }.to raise_error(AccessDenied)
69
+ end
70
+ end
71
+ end
72
+ """
73
+ When I run `rspec spec/controllers/gadgets_controller_spec.rb`
74
+ Then the examples should all pass
75
+
@@ -0,0 +1,58 @@
1
+ Feature: controller spec
2
+
3
+ Scenario: simple passing example
4
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
5
+ """ruby
6
+ require "spec_helper"
7
+
8
+ describe WidgetsController do
9
+ describe "GET index" do
10
+ it "has a 200 status code" do
11
+ get :index
12
+ expect(response.status).to eq(200)
13
+ end
14
+ end
15
+ end
16
+ """
17
+ When I run `rspec spec`
18
+ Then the example should pass
19
+
20
+ Scenario: controller is exposed to global before hooks
21
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
22
+ """ruby
23
+ require "spec_helper"
24
+
25
+ RSpec.configure {|c| c.before { expect(controller).not_to be_nil }}
26
+
27
+ describe WidgetsController do
28
+ describe "GET index" do
29
+ it "doesn't matter" do
30
+ end
31
+ end
32
+ end
33
+ """
34
+ When I run `rspec spec`
35
+ Then the example should pass
36
+
37
+ Scenario: controller is extended with a helper module
38
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
39
+ """ruby
40
+ require "spec_helper"
41
+
42
+ module MyHelper
43
+ def my_variable
44
+ end
45
+ end
46
+
47
+ RSpec.configure {|c| c.include MyHelper }
48
+
49
+ describe WidgetsController do
50
+ let(:my_variable) { 'is a value' }
51
+
52
+ describe 'something' do
53
+ specify { expect(my_variable).to eq 'is a value' }
54
+ end
55
+ end
56
+ """
57
+ When I run `rspec spec`
58
+ Then the example should pass
@@ -0,0 +1,51 @@
1
+ Feature: engine routes for controllers
2
+
3
+ Controller specs can specify the routeset that will be used for the example
4
+ group. This is most useful when testing Rails engines.
5
+
6
+ @unsupported-on-rails-3-0
7
+ Scenario: specify engine route
8
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
9
+ """ruby
10
+ require "spec_helper"
11
+
12
+ # A very simple Rails engine
13
+ module MyEngine
14
+ class Engine < ::Rails::Engine
15
+ isolate_namespace MyEngine
16
+ end
17
+
18
+ Engine.routes.draw do
19
+ resources :widgets, :only => [:show] do
20
+ get :random, :on => :collection
21
+ end
22
+ end
23
+
24
+ class WidgetsController < ::ActionController::Base
25
+ def random
26
+ @random_widget = Widget.all.shuffle.first
27
+ redirect_to widget_path(@random_widget)
28
+ end
29
+
30
+ def show
31
+ @widget = Widget.find(params[:id])
32
+ render :text => @widget.name
33
+ end
34
+ end
35
+ end
36
+
37
+ describe MyEngine::WidgetsController do
38
+ routes { MyEngine::Engine.routes }
39
+
40
+ it "redirects to a random widget" do
41
+ widget1 = Widget.create!(:name => "Widget 1")
42
+ widget2 = Widget.create!(:name => "Widget 2")
43
+
44
+ get :random
45
+ expect(response).to be_redirect
46
+ expect(response).to redirect_to(assigns(:random_widget))
47
+ end
48
+ end
49
+ """
50
+ When I run `rspec spec`
51
+ Then the examples should all pass
@@ -0,0 +1,87 @@
1
+ Feature: views are stubbed by default
2
+
3
+ By default, controller specs stub views with a template that renders an empty
4
+ string instead of the views in the app. This allows you specify which view
5
+ template an action should try to render regardless of whether the template
6
+ compiles cleanly.
7
+
8
+ NOTE: unlike rspec-rails-1.x, the real template must exist.
9
+
10
+ Scenario: expect template that is rendered by controller action (passes)
11
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
12
+ """ruby
13
+ require "spec_helper"
14
+
15
+ describe WidgetsController do
16
+ describe "index" do
17
+ it "renders the index template" do
18
+ get :index
19
+ expect(response).to render_template("index")
20
+ expect(response.body).to eq ""
21
+ end
22
+ it "renders the widgets/index template" do
23
+ get :index
24
+ expect(response).to render_template("widgets/index")
25
+ expect(response.body).to eq ""
26
+ end
27
+ end
28
+ end
29
+ """
30
+ When I run `rspec spec`
31
+ Then the examples should all pass
32
+
33
+ Scenario: expect template that is not rendered by controller action (fails)
34
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
35
+ """ruby
36
+ require "spec_helper"
37
+
38
+ describe WidgetsController do
39
+ describe "index" do
40
+ it "renders the 'new' template" do
41
+ get :index
42
+ expect(response).to render_template("new")
43
+ end
44
+ end
45
+ end
46
+ """
47
+ When I run `rspec spec`
48
+ Then the output should contain "1 example, 1 failure"
49
+
50
+ Scenario: expect empty templates to render when view path is changed at runtime (passes)
51
+ Given a file named "spec/controllers/things_controller_spec.rb" with:
52
+ """ruby
53
+ require "spec_helper"
54
+
55
+ describe ThingsController do
56
+ describe "custom_action" do
57
+ it "renders an empty custom_action template" do
58
+ controller.prepend_view_path 'app/views'
59
+ controller.append_view_path 'app/views'
60
+ get :custom_action
61
+ expect(response).to render_template("custom_action")
62
+ expect(response.body).to eq ""
63
+ end
64
+ end
65
+ end
66
+ """
67
+ When I run `rspec spec`
68
+ Then the examples should all pass
69
+
70
+ Scenario: expect template to render the real template with render_views when view path is changed at runtime
71
+ Given a file named "spec/controllers/things_controller_spec.rb" with:
72
+ """ruby
73
+ require "spec_helper"
74
+
75
+ describe ThingsController do
76
+ render_views
77
+
78
+ it "renders the real custom_action template" do
79
+ controller.prepend_view_path 'app/views'
80
+ get :custom_action
81
+ expect(response).to render_template("custom_action")
82
+ expect(response.body).to match(/template for a custom action/)
83
+ end
84
+ end
85
+ """
86
+ When I run `rspec spec`
87
+ Then the examples should all pass
@@ -0,0 +1,114 @@
1
+ Feature: render_views
2
+
3
+ You can tell a controller example group to render views with the
4
+ `render_views` declaration in any individual group, or globally.
5
+
6
+ Scenario: render_views directly in a single group
7
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
8
+ """ruby
9
+ require "spec_helper"
10
+
11
+ describe WidgetsController do
12
+ render_views
13
+
14
+ describe "GET index" do
15
+ it "says 'Listing widgets'" do
16
+ get :index
17
+ expect(response.body).to match /Listing widgets/m
18
+ end
19
+ end
20
+ end
21
+ """
22
+ When I run `rspec spec`
23
+ Then the examples should all pass
24
+
25
+ Scenario: render_views on and off in nested groups
26
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
27
+ """ruby
28
+ require "spec_helper"
29
+
30
+ describe WidgetsController do
31
+ context "with render_views" do
32
+ render_views
33
+
34
+ describe "GET index" do
35
+ it "renders the actual template" do
36
+ get :index
37
+ expect(response.body).to match /Listing widgets/m
38
+ end
39
+ end
40
+
41
+ context "with render_views(false) nested in a group with render_views" do
42
+ render_views false
43
+
44
+ describe "GET index" do
45
+ it "renders the RSpec generated template" do
46
+ get :index
47
+ expect(response.body).to eq("")
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ context "without render_views" do
54
+ describe "GET index" do
55
+ it "renders the RSpec generated template" do
56
+ get :index
57
+ expect(response.body).to eq("")
58
+ end
59
+ end
60
+ end
61
+
62
+ context "with render_views again" do
63
+ render_views
64
+
65
+ describe "GET index" do
66
+ it "renders the actual template" do
67
+ get :index
68
+ expect(response.body).to match /Listing widgets/m
69
+ end
70
+ end
71
+ end
72
+ end
73
+ """
74
+ When I run `rspec spec --order default --format documentation`
75
+ Then the output should contain:
76
+ """ruby
77
+ WidgetsController
78
+ with render_views
79
+ GET index
80
+ renders the actual template
81
+ with render_views(false) nested in a group with render_views
82
+ GET index
83
+ renders the RSpec generated template
84
+ without render_views
85
+ GET index
86
+ renders the RSpec generated template
87
+ with render_views again
88
+ GET index
89
+ renders the actual template
90
+ """
91
+
92
+ Scenario: render_views globally
93
+ Given a file named "spec/support/render_views.rb" with:
94
+ """ruby
95
+ RSpec.configure do |config|
96
+ config.render_views
97
+ end
98
+ """
99
+ And a file named "spec/controllers/widgets_controller_spec.rb" with:
100
+ """ruby
101
+ require "spec_helper"
102
+
103
+ describe WidgetsController do
104
+ describe "GET index" do
105
+ it "renders the index template" do
106
+ get :index
107
+ expect(response.body).to match /Listing widgets/m
108
+ end
109
+ end
110
+ end
111
+ """
112
+ When I run `rspec spec`
113
+ Then the examples should all pass
114
+
@@ -0,0 +1,71 @@
1
+ Feature: Directory Structure
2
+
3
+ Specs are usually placed in a canonical directory structure that describes
4
+ their purpose.
5
+
6
+ * Model specs reside in the `spec/models` directory
7
+ * Controller specs reside in the `spec/controllers` directory
8
+ * Request specs reside in the `spec/requests` directory
9
+ * Feature specs reside in the `spec/features` directory
10
+ * View specs reside in the `spec/views` directory
11
+ * Helper specs reside in the `spec/helpers` directory
12
+ * Mailer specs reside in the `spec/mailers` directory
13
+ * Routing specs reside in the `spec/routing` directory
14
+
15
+ If you follow this directory structure, RSpec will automatically include the
16
+ correct test support functions for each type of test.
17
+
18
+ Application developers are free to use a different directory structure, but
19
+ will need to specify the types manually by adding a `:type` metadata key (for
20
+ example, `describe WidgetsController, :type => :controller`)
21
+
22
+ Scenario: Specs in the `spec/controllers` directory automatically tagged as controller specs
23
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
24
+ """ruby
25
+ require "spec_helper"
26
+
27
+ describe WidgetsController do
28
+ it "responds successfully" do
29
+ get :index
30
+ expect(response.status).to eq(200)
31
+ end
32
+ end
33
+ """
34
+ When I run `rspec spec`
35
+ Then the example should pass
36
+
37
+ Scenario: Specs in other directories must have their types specified manually
38
+ Given a file named "spec/functional/widgets_controller_spec.rb" with:
39
+ """ruby
40
+ require "spec_helper"
41
+
42
+ describe WidgetsController, :type => :controller do
43
+ it "responds successfully" do
44
+ get :index
45
+ expect(response.status).to eq(200)
46
+ end
47
+ end
48
+ """
49
+ When I run `rspec spec`
50
+ Then the example should pass
51
+
52
+ Scenario: Specs in canonical directories can override their types
53
+ Given a file named "spec/routing/duckduck_routing_spec.rb" with:
54
+ """ruby
55
+ require "spec_helper"
56
+
57
+ Rails.application.routes.draw do
58
+ get "/example" => redirect("http://example.com")
59
+ end
60
+
61
+ # Due to limitations in the Rails routing test framework, routes that
62
+ # perform redirects must actually be tested via request specs
63
+ describe "/example", :type => :request do
64
+ it "redirects to example.com" do
65
+ get "/example"
66
+ expect(response).to redirect_to("http://example.com")
67
+ end
68
+ end
69
+ """
70
+ When I run `rspec spec`
71
+ Then the example should pass