diff --git a/Changelog.md b/Changelog.md index 30645a97bc..c3cdcd6866 100644 --- a/Changelog.md +++ b/Changelog.md @@ -10,6 +10,8 @@ Enhancements: (Gabe Martin-Dempesy, #1361) * Include `RSpec::Rails::FixtureSupport` into example groups using metadata `:use_fixtures => true`. (Aaron Kromer, #1372) +* Include `rspec:request` generator for generating request specs; this is an + alias of `rspec:integration` (Aaron Kromer, #1378) Bug Fixes: diff --git a/example_app_generator/generate_stuff.rb b/example_app_generator/generate_stuff.rb index c52d178186..f8ce0df046 100644 --- a/example_app_generator/generate_stuff.rb +++ b/example_app_generator/generate_stuff.rb @@ -82,6 +82,7 @@ def using_source_path(path) generate('rspec:install') generate('controller wombats index') # plural generate('controller welcome index') # singular +generate('rspec:request wombats') generate('integration_test widgets') generate('mailer Notifications signup') diff --git a/lib/generators/rspec/integration/integration_generator.rb b/lib/generators/rspec/integration/integration_generator.rb index 3730923abe..8e1fab015f 100644 --- a/lib/generators/rspec/integration/integration_generator.rb +++ b/lib/generators/rspec/integration/integration_generator.rb @@ -4,7 +4,12 @@ module Rspec module Generators # @private class IntegrationGenerator < Base - class_option :request_specs, :type => :boolean, :default => true, :desc => "Generate request specs" + # Add a deprecation for this class, before rspec-rails 4, to use the + # `RequestGenerator` instead + class_option :request_specs, + :type => :boolean, + :default => true, + :desc => "Generate request specs" def generate_request_spec return unless options[:request_specs] diff --git a/lib/generators/rspec/request/request_generator.rb b/lib/generators/rspec/request/request_generator.rb new file mode 100644 index 0000000000..5f47c62cb5 --- /dev/null +++ b/lib/generators/rspec/request/request_generator.rb @@ -0,0 +1,10 @@ +require 'generators/rspec/integration/integration_generator' + +module Rspec + module Generators + # @private + class RequestGenerator < IntegrationGenerator + source_paths << File.expand_path("../../integration/templates", __FILE__) + end + end +end diff --git a/spec/generators/rspec/controller/controller_generator_spec.rb b/spec/generators/rspec/controller/controller_generator_spec.rb index 6b305c4478..6194610207 100644 --- a/spec/generators/rspec/controller/controller_generator_spec.rb +++ b/spec/generators/rspec/controller/controller_generator_spec.rb @@ -1,13 +1,9 @@ -require 'spec_helper' - # Generators are not automatically loaded by Rails require 'generators/rspec/controller/controller_generator' +require 'support/generators' -describe Rspec::Generators::ControllerGenerator, :type => :generator do - # Tell the generator where to put its output (what it thinks of as Rails.root) - destination File.expand_path("../../../../../tmp", __FILE__) - - before { prepare_destination } +RSpec.describe Rspec::Generators::ControllerGenerator, :type => :generator do + setup_default_destination describe 'controller specs' do subject { file('spec/controllers/posts_controller_spec.rb') } diff --git a/spec/generators/rspec/feature/feature_generator_spec.rb b/spec/generators/rspec/feature/feature_generator_spec.rb index 1926a89ca1..c37dd85f6d 100644 --- a/spec/generators/rspec/feature/feature_generator_spec.rb +++ b/spec/generators/rspec/feature/feature_generator_spec.rb @@ -1,13 +1,9 @@ -require 'spec_helper' - # Generators are not automatically loaded by rails require 'generators/rspec/feature/feature_generator' +require 'support/generators' -describe Rspec::Generators::FeatureGenerator, :type => :generator do - # Tell the generator where to put its output (what it thinks of as Rails.root) - destination File.expand_path('../../../../../tmp', __FILE__) - - before { prepare_destination } +RSpec.describe Rspec::Generators::FeatureGenerator, :type => :generator do + setup_default_destination describe 'feature specs' do describe 'are generated independently from the command line' do diff --git a/spec/generators/rspec/helper/helper_generator_spec.rb b/spec/generators/rspec/helper/helper_generator_spec.rb index 3e7f709967..76554dd559 100644 --- a/spec/generators/rspec/helper/helper_generator_spec.rb +++ b/spec/generators/rspec/helper/helper_generator_spec.rb @@ -1,13 +1,9 @@ -require 'spec_helper' - # Generators are not automatically loaded by Rails require 'generators/rspec/helper/helper_generator' +require 'support/generators' -describe Rspec::Generators::HelperGenerator, :type => :generator do - # Tell the generator where to put its output (what it thinks of as Rails.root) - destination File.expand_path("../../../../../tmp", __FILE__) - - before { prepare_destination } +RSpec.describe Rspec::Generators::HelperGenerator, :type => :generator do + setup_default_destination subject { file('spec/helpers/posts_helper_spec.rb') } describe 'generated by default' do diff --git a/spec/generators/rspec/install/install_generator_spec.rb b/spec/generators/rspec/install/install_generator_spec.rb index 99770feb61..71e6830672 100644 --- a/spec/generators/rspec/install/install_generator_spec.rb +++ b/spec/generators/rspec/install/install_generator_spec.rb @@ -1,9 +1,8 @@ -require 'spec_helper' +# Generators are not automatically loaded by Rails require 'generators/rspec/install/install_generator' +require 'support/generators' RSpec.describe Rspec::Generators::InstallGenerator, :type => :generator do - destination File.expand_path("../../../../../tmp", __FILE__) - def use_active_record_migration match(/ActiveRecord::Migration\./m) end @@ -32,7 +31,7 @@ def use_transactional_fixtures match(/config\.use_transactional_fixtures/m) end - before { prepare_destination } + setup_default_destination let(:rails_helper) { content_for('spec/rails_helper.rb') } let(:spec_helper) { content_for('spec/spec_helper.rb') } diff --git a/spec/generators/rspec/integration/integration_generator_spec.rb b/spec/generators/rspec/integration/integration_generator_spec.rb index 5626084925..2702688926 100644 --- a/spec/generators/rspec/integration/integration_generator_spec.rb +++ b/spec/generators/rspec/integration/integration_generator_spec.rb @@ -1,33 +1,8 @@ -require 'spec_helper' - # Generators are not automatically loaded by Rails require 'generators/rspec/integration/integration_generator' +require 'support/generators' -describe Rspec::Generators::IntegrationGenerator, :type => :generator do - # Tell the generator where to put its output (what it thinks of as Rails.root) - destination File.expand_path("../../../../../tmp", __FILE__) - - before { prepare_destination } - - describe 'are not generated' do - before do - run_generator %w(posts --no-request-specs) - end - describe 'index.html.erb' do - subject { file('spec/requests/posts_spec.rb') } - it { is_expected.not_to exist } - end - end - - describe 'are generated' do - before do - run_generator %w(posts) - end - subject { file('spec/requests/posts_spec.rb') } - it { is_expected.to exist } - it { is_expected.to contain(/require 'rails_helper'/) } - it { is_expected.to contain(/^RSpec.describe \"Posts\", #{type_metatag(:request)}/) } - it { is_expected.to contain(/describe "GET \/posts"/) } - it { is_expected.to contain(/get posts_index_path/) } - end +RSpec.describe Rspec::Generators::IntegrationGenerator, :type => :generator do + setup_default_destination + it_behaves_like "a request spec generator" end diff --git a/spec/generators/rspec/job/job_generator_spec.rb b/spec/generators/rspec/job/job_generator_spec.rb index adb95d7fb7..15c6fa1b9d 100644 --- a/spec/generators/rspec/job/job_generator_spec.rb +++ b/spec/generators/rspec/job/job_generator_spec.rb @@ -1,13 +1,9 @@ -require 'spec_helper' - # Generators are not automatically loaded by Rails require 'generators/rspec/job/job_generator' +require 'support/generators' RSpec.describe Rspec::Generators::JobGenerator, :type => :generator, :skip => !RSpec::Rails::FeatureCheck.has_active_job? do - # Tell the generator where to put its output (what it thinks of as Rails.root) - destination File.expand_path('../../../../../tmp', __FILE__) - - before { prepare_destination } + setup_default_destination describe 'the generated files' do before { run_generator %w(user) } diff --git a/spec/generators/rspec/mailer/mailer_generator_spec.rb b/spec/generators/rspec/mailer/mailer_generator_spec.rb index 9d23a261d7..3248f1a97b 100644 --- a/spec/generators/rspec/mailer/mailer_generator_spec.rb +++ b/spec/generators/rspec/mailer/mailer_generator_spec.rb @@ -1,13 +1,9 @@ -require 'spec_helper' - # Generators are not automatically loaded by Rails require 'generators/rspec/mailer/mailer_generator' +require 'support/generators' -describe Rspec::Generators::MailerGenerator, :type => :generator do - # Tell the generator where to put its output (what it thinks of as Rails.root) - destination File.expand_path("../../../../../tmp", __FILE__) - - before { prepare_destination } +RSpec.describe Rspec::Generators::MailerGenerator, :type => :generator do + setup_default_destination describe 'mailer spec' do subject { file('spec/mailers/posts_spec.rb') } diff --git a/spec/generators/rspec/model/model_generator_spec.rb b/spec/generators/rspec/model/model_generator_spec.rb index 3377abe427..dee5c99e2f 100644 --- a/spec/generators/rspec/model/model_generator_spec.rb +++ b/spec/generators/rspec/model/model_generator_spec.rb @@ -1,13 +1,9 @@ -require 'spec_helper' - # Generators are not automatically loaded by Rails require 'generators/rspec/model/model_generator' +require 'support/generators' -describe Rspec::Generators::ModelGenerator, :type => :generator do - # Tell the generator where to put its output (what it thinks of as Rails.root) - destination File.expand_path("../../../../../tmp", __FILE__) - - before { prepare_destination } +RSpec.describe Rspec::Generators::ModelGenerator, :type => :generator do + setup_default_destination it 'runs both the model and fixture tasks' do gen = generator %w(posts) diff --git a/spec/generators/rspec/observer/observer_generator_spec.rb b/spec/generators/rspec/observer/observer_generator_spec.rb index 0d38c53d45..ade31d7ed9 100644 --- a/spec/generators/rspec/observer/observer_generator_spec.rb +++ b/spec/generators/rspec/observer/observer_generator_spec.rb @@ -1,15 +1,13 @@ -require 'spec_helper' - # Generators are not automatically loaded by Rails require 'generators/rspec/observer/observer_generator' +require 'support/generators' -describe Rspec::Generators::ObserverGenerator, :type => :generator do - # Tell the generator where to put its output (what it thinks of as Rails.root) - destination File.expand_path("../../../../../tmp", __FILE__) +RSpec.describe Rspec::Generators::ObserverGenerator, :type => :generator do + setup_default_destination subject { file('spec/models/posts_observer_spec.rb') } + before do - prepare_destination run_generator %w(posts) end diff --git a/spec/generators/rspec/request/request_generator_spec.rb b/spec/generators/rspec/request/request_generator_spec.rb new file mode 100644 index 0000000000..a484c32421 --- /dev/null +++ b/spec/generators/rspec/request/request_generator_spec.rb @@ -0,0 +1,8 @@ +# Generators are not automatically loaded by Rails +require 'generators/rspec/request/request_generator' +require 'support/generators' + +RSpec.describe Rspec::Generators::RequestGenerator, :type => :generator do + setup_default_destination + it_behaves_like "a request spec generator" +end diff --git a/spec/generators/rspec/scaffold/scaffold_generator_spec.rb b/spec/generators/rspec/scaffold/scaffold_generator_spec.rb index 2d9ccda6c4..e4b515f126 100644 --- a/spec/generators/rspec/scaffold/scaffold_generator_spec.rb +++ b/spec/generators/rspec/scaffold/scaffold_generator_spec.rb @@ -1,11 +1,9 @@ -require 'spec_helper' - +# Generators are not automatically loaded by Rails require 'generators/rspec/scaffold/scaffold_generator' +require 'support/generators' -describe Rspec::Generators::ScaffoldGenerator, :type => :generator do - destination File.expand_path("../../../../../tmp", __FILE__) - - before { prepare_destination } +RSpec.describe Rspec::Generators::ScaffoldGenerator, :type => :generator do + setup_default_destination describe 'standard controller spec' do subject { file('spec/controllers/posts_controller_spec.rb') } diff --git a/spec/generators/rspec/view/view_generator_spec.rb b/spec/generators/rspec/view/view_generator_spec.rb index a0911120db..5f94e20564 100644 --- a/spec/generators/rspec/view/view_generator_spec.rb +++ b/spec/generators/rspec/view/view_generator_spec.rb @@ -1,13 +1,9 @@ -require 'spec_helper' - # Generators are not automatically loaded by Rails require 'generators/rspec/view/view_generator' +require 'support/generators' -describe Rspec::Generators::ViewGenerator, :type => :generator do - # Tell the generator where to put its output (what it thinks of as Rails.root) - destination File.expand_path("../../../../../tmp", __FILE__) - - before { prepare_destination } +RSpec.describe Rspec::Generators::ViewGenerator, :type => :generator do + setup_default_destination describe 'with default template engine' do it 'generates a spec for the supplied action' do diff --git a/spec/support/generators.rb b/spec/support/generators.rb new file mode 100644 index 0000000000..f26df2e279 --- /dev/null +++ b/spec/support/generators.rb @@ -0,0 +1,73 @@ +module RSpec + module Rails + module Specs + module Generators + module Macros + # Tell the generator where to put its output (what it thinks of as + # Rails.root) + def set_default_destination + destination File.expand_path("../../../tmp", __FILE__) + end + + def setup_default_destination + set_default_destination + before { prepare_destination } + end + end + + def self.included(klass) + klass.extend(Macros) + end + + shared_examples_for "a request spec generator" do + describe 'generated with flag `--no-request-specs`' do + before do + run_generator %w(posts --no-request-specs) + end + + subject(:request_spec) { file('spec/requests/posts_spec.rb') } + + it "does not create the request spec" do + expect(request_spec).not_to exist + end + end + + describe 'generated with no flags' do + before do + run_generator %w(posts) + end + + subject(:request_spec) { file('spec/requests/posts_spec.rb') } + + it "creates the request spec" do + expect(request_spec).to exist + end + + it "the generator requires 'rails_helper'" do + expect(request_spec).to contain(/require 'rails_helper'/) + end + + it "the generator describes the provided NAME without monkey " \ + "patching setting the type to `:request`" do + expect(request_spec).to contain( + /^RSpec.describe \"Posts\", #{type_metatag(:request)}/ + ) + end + + it "the generator includes a sample GET request" do + expect(request_spec).to contain(/describe "GET \/posts"/) + end + + it "the generator sends the GET request to the index path" do + expect(request_spec).to contain(/get posts_index_path/) + end + end + end + end + end + end +end + +RSpec.configure do |config| + config.include RSpec::Rails::Specs::Generators, :type => :generator +end