diff --git a/.rspec b/.rspec index 83e16f8044..893e1291c4 100644 --- a/.rspec +++ b/.rspec @@ -1,2 +1,3 @@ --color --require spec_helper +--exclude "**/black_box/*_spec.rb" diff --git a/Gemfile b/Gemfile index 9d7051b65d..cb992f5b9c 100644 --- a/Gemfile +++ b/Gemfile @@ -36,7 +36,9 @@ group :test do gem "capybara" gem "database_cleaner" gem "formulaic" + gem "jet_black" gem "launchy" + gem "sack_race", github: "nickcharlton/sack_race" gem "selenium-webdriver" gem "shoulda-matchers" gem "timecop" diff --git a/Gemfile.lock b/Gemfile.lock index a864489103..33c16b6ebb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,9 @@ +GIT + remote: https://github.com/nickcharlton/sack_race.git + revision: 89b4e5fff452aa6e48498aa356da87f8d1b65ae9 + specs: + sack_race (1.0.0.rc1) + PATH remote: . specs: @@ -174,6 +180,7 @@ GEM pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) + jet_black (0.7.1) jsbundling-rails (1.3.1) railties (>= 6.0.0) json (2.13.2) @@ -426,6 +433,7 @@ DEPENDENCIES globalid i18n-tasks (= 1.0.15) image_processing + jet_black jsbundling-rails (~> 1.3) kaminari-i18n launchy @@ -434,6 +442,7 @@ DEPENDENCIES pundit rack-timeout redcarpet + sack_race! selenium-webdriver sentry-rails sentry-ruby diff --git a/bin/bundle b/bin/bundle deleted file mode 100755 index 66e9889e8b..0000000000 --- a/bin/bundle +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -load Gem.bin_path('bundler', 'bundle') diff --git a/gemfiles/pundit21.gemfile b/gemfiles/pundit21.gemfile index 6d45e2abb5..229c420054 100644 --- a/gemfiles/pundit21.gemfile +++ b/gemfiles/pundit21.gemfile @@ -36,7 +36,9 @@ group :test do gem "capybara" gem "database_cleaner" gem "formulaic" + gem "jet_black" gem "launchy" + gem "sack_race", github: "nickcharlton/sack_race" gem "selenium-webdriver" gem "shoulda-matchers" gem "timecop" diff --git a/gemfiles/rails60.gemfile b/gemfiles/rails60.gemfile index a747a55662..8e915df4b3 100644 --- a/gemfiles/rails60.gemfile +++ b/gemfiles/rails60.gemfile @@ -40,7 +40,9 @@ group :test do gem "capybara" gem "database_cleaner" gem "formulaic" + gem "jet_black" gem "launchy" + gem "sack_race", github: "nickcharlton/sack_race" gem "selenium-webdriver" gem "shoulda-matchers" gem "timecop" diff --git a/gemfiles/rails61.gemfile b/gemfiles/rails61.gemfile index 7bc1a5e6ac..2a17e25f92 100644 --- a/gemfiles/rails61.gemfile +++ b/gemfiles/rails61.gemfile @@ -39,7 +39,9 @@ group :test do gem "capybara" gem "database_cleaner" gem "formulaic" + gem "jet_black" gem "launchy" + gem "sack_race", github: "nickcharlton/sack_race" gem "selenium-webdriver" gem "shoulda-matchers" gem "timecop" diff --git a/gemfiles/rails70.gemfile b/gemfiles/rails70.gemfile index 35ca11ca84..ccc4997c30 100644 --- a/gemfiles/rails70.gemfile +++ b/gemfiles/rails70.gemfile @@ -37,7 +37,9 @@ group :test do gem "capybara" gem "database_cleaner" gem "formulaic" + gem "jet_black" gem "launchy" + gem "sack_race", github: "nickcharlton/sack_race" gem "selenium-webdriver" gem "shoulda-matchers" gem "timecop" diff --git a/gemfiles/rails80.gemfile b/gemfiles/rails80.gemfile index 86de0cc8e5..2083380e99 100644 --- a/gemfiles/rails80.gemfile +++ b/gemfiles/rails80.gemfile @@ -37,7 +37,9 @@ group :test do gem "capybara" gem "database_cleaner" gem "formulaic" + gem "jet_black" gem "launchy" + gem "sack_race", github: "nickcharlton/sack_race" gem "selenium-webdriver" gem "shoulda-matchers" gem "timecop" diff --git a/spec/black_box/default_rails_app_spec.rb b/spec/black_box/default_rails_app_spec.rb new file mode 100644 index 0000000000..c6f7326c42 --- /dev/null +++ b/spec/black_box/default_rails_app_spec.rb @@ -0,0 +1,33 @@ +require "rails_helper" + +RSpec.describe "with a Default Rails app" do + it "works" do + create_rails_application + setup_post_model + setup_administrate + + app.start_and_wait_for_ready + + visit("/admin") + + expect(page).to have_css("header h1#page-title", text: "Posts") + click_on "New post" + + fill_in "Body", with: "Some words!" + fill_in "Title", with: "A post with words" + click_button "Create Post" + + expect(page).to have_content("Post was successfully created.") + expect(page).to have_content("Show Post #1") + + app.stop + end + + def session + @session ||= JetBlack::Session.new(options: {clean_bundler_env: true}) + end + + def app + @app ||= TestAppProcess.new(session) + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index bf7687ba2b..c466293543 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,4 +1,5 @@ -# http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +require "jet_black/rspec" + RSpec.configure do |config| config.expect_with :rspec do |expectations| expectations.syntax = :expect diff --git a/spec/support/acceptance_helpers.rb b/spec/support/acceptance_helpers.rb new file mode 100644 index 0000000000..b6e16de944 --- /dev/null +++ b/spec/support/acceptance_helpers.rb @@ -0,0 +1,65 @@ +module AcceptanceHelpers + def create_rails_application + session.create_file("Gemfile", <<~RUBY) + source "http://rubygems.org" + + gem "rails" + RUBY + + session.run("bundle install") + + rails_new_cmd = [ + "bundle exec rails new .", + "--skip-test", + "--skip-spring", + "--force" + ].join(" ") + + expect(session.run(rails_new_cmd)) + .to be_a_success.and have_stdout("force Gemfile") + end + + def gem_path + File.expand_path(Rails.root + "../../") + end + + def setup_administrate + session.append_to_file("Gemfile", "gem \"administrate\", path: \"#{gem_path}\"") + session.run("bundle install") + + generate_dashboards_run = session.run( + "bundle exec rails g administrate:install" + ) + + expect(generate_dashboards_run) + .to be_a_success.and have_stdout("create app/dashboards/post_dashboard.rb") + end + + def setup_post_model + new_post_cmd = session.run([ + "bundle exec rails g model post", + "title:string", + "body:text", + "published_at:datetime" + ].join(" ")) + + expect(new_post_cmd) + .to be_a_success.and have_stdout("create app/models/post.rb") + + migrate_run = session.run("bundle exec rails db:migrate") + + expect(migrate_run).to be_a_success.and have_stdout("CreatePosts: migrated") + end +end + +RSpec.configure do |config| + config.include Capybara::DSL, type: :black_box + config.include Capybara::RSpecMatchers, type: :black_box + config.include AcceptanceHelpers, type: :black_box + + config.before(:each, type: :black_box) do + Capybara.current_driver = :chrome + Capybara.run_server = false + Capybara.app_host = "http://localhost:3000" + end +end diff --git a/spec/support/test_app_process.rb b/spec/support/test_app_process.rb new file mode 100644 index 0000000000..4bcbc3d08c --- /dev/null +++ b/spec/support/test_app_process.rb @@ -0,0 +1,31 @@ +class TestAppProcess + def initialize(session) + @session = session + @process = + Bundler.with_unbundled_env do + SackRace::Process.new( + "bundle exec rails server", + { + chdir: session.directory, + verbose: true + } + ) + end + end + + def start_and_wait_for_ready + Bundler.with_unbundled_env do + process.add_handler(:ready, "Use Ctrl-C to stop\n") + process.start + process.wait_for_handler(:ready) + end + end + + def stop + process.stop + end + + private + + attr_reader :process, :session +end