Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce suspenders:testing generator #1156

Merged
1 change: 1 addition & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Unreleased
* Introduce `suspenders:tasks` generator
* Introduce `suspenders:db:migrate` task
* Introduce `suspenders:email` generator
* Introduce `suspenders:testing` generator

20230113.0 (January, 13, 2023)

Expand Down
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,20 @@ Configures `default_url_options` in `test` and `development`.
bin/rails g suspenders:email
```

### Testing

Set up the project for an in-depth test-driven development workflow.

Installs and configures [rspec-rails][],
[action_dispatch-testing-integration-capybara][], [shoulda-matchers][],
[webdrivers][] and [webmock][].

[rspec-rails]: https://github.com/rspec/rspec-rails
[action_dispatch-testing-integration-capybara]: https://github.com/thoughtbot/action_dispatch-testing-integration-capybara
[shoulda-matchers]: https://github.com/thoughtbot/shoulda-matchers
[webdrivers]: https://github.com/titusfortner/webdrivers
[webmock]: https://github.com/bblimke/webmock

## Contributing

See the [CONTRIBUTING] document.
Expand Down
84 changes: 84 additions & 0 deletions lib/generators/suspenders/testing_generator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
module Suspenders
module Generators
class TestingGenerator < Rails::Generators::Base
source_root File.expand_path("../../templates/testing", __FILE__)
desc "Set up the project for an in-depth test-driven development workflow."

def add_gems
gem_group :development, :test do
gem "rspec-rails", "~> 6.1.0"
end

gem_group :test do
gem "action_dispatch-testing-integration-capybara",
github: "thoughtbot/action_dispatch-testing-integration-capybara", tag: "v0.1.0",
require: "action_dispatch/testing/integration/capybara/rspec"
gem "shoulda-matchers", "~> 6.0"
gem "webdrivers"
gem "webmock"
end

Bundler.with_unbundled_env { run "bundle install" }
end

def run_rspec_installation_script
rails_command "generate rspec:install"
end

def modify_rails_helper
insert_into_file "spec/rails_helper.rb",
"\s\sconfig.infer_base_class_for_anonymous_controllers = false\n",
after: "RSpec.configure do |config|\n"
end

def modify_spec_helper
persistence_file_path = "\s\sconfig.example_status_persistence_file_path = \"tmp/rspec_examples.txt\"\n"
order = "\s\sconfig.order = :random\n\n"
webmock_config = <<~RUBY

WebMock.disable_net_connect!(
allow_localhost: true,
allow: [
/(chromedriver|storage).googleapis.com/,
"googlechromelabs.github.io",
]
Comment on lines +41 to +44
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found I needed to add googlechromelabs.github.io and adjust the original host when I tested this on a fresh Rails app. Otherwise, we would raise WebMock::NetConnectNotAllowedError.

)
RUBY

insert_into_file "spec/spec_helper.rb",
persistence_file_path + order,
after: "RSpec.configure do |config|\n"

insert_into_file "spec/spec_helper.rb", "require \"webmock/rspec\"\n\n", before: "RSpec.configure do |config|"
insert_into_file "spec/spec_helper.rb", webmock_config
end

def create_system_spec_dir
empty_directory "spec/system"
create_file "spec/system/.gitkeep"
end

def configure_chromedriver
copy_file "chromedriver.rb", "spec/support/chromedriver.rb"
end

def configure_i18n_helper
copy_file "i18n.rb", "spec/support/i18n.rb"
end

def configure_shoulda_matchers
copy_file "shoulda_matchers.rb", "spec/support/shoulda_matchers.rb"
end

def configure_action_mailer_helpers
# https://guides.rubyonrails.org/testing.html#the-basic-test-case
#
# The ActionMailer::Base.deliveries array is only reset automatically in
# ActionMailer::TestCase and ActionDispatch::IntegrationTest tests. If
# you want to have a clean slate outside these test cases, you can reset
# it manually with: ActionMailer::Base.deliveries.clear
copy_file "action_mailer.rb", "spec/support/action_mailer.rb"
end
end
end
end
5 changes: 5 additions & 0 deletions lib/generators/templates/testing/action_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
RSpec.configure do |config|
config.before(:each) do
ActionMailer::Base.deliveries.clear
end
end
27 changes: 27 additions & 0 deletions lib/generators/templates/testing/chromedriver.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
require "selenium/webdriver"

Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end

Capybara.register_driver :headless_chrome do |app|
options = ::Selenium::WebDriver::Chrome::Options.new
options.headless!
options.add_argument "--window-size=1680,1050"

Capybara::Selenium::Driver.new app,
browser: :chrome,
options: options
end

Capybara.javascript_driver = :headless_chrome

RSpec.configure do |config|
config.before(:each, type: :system) do
driven_by :rack_test
end

config.before(:each, type: :system, js: true) do
driven_by Capybara.javascript_driver
end
end
3 changes: 3 additions & 0 deletions lib/generators/templates/testing/i18n.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
RSpec.configure do |config|
config.include ActionView::Helpers::TranslationHelper
end
6 changes: 6 additions & 0 deletions lib/generators/templates/testing/shoulda_matchers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec
with.library :rails
end
end
Loading