[rubygems/rubygems] Move specs independent of gem name out of shared examples

And rename the shared examples to "paths dependent on gem name".

cdcc8ba92a
This commit is contained in:
David Rodríguez 2025-07-02 19:30:43 +02:00 committed by Hiroshi SHIBATA
parent 6d696fa3b4
commit 5fa484a441

View file

@ -6,8 +6,8 @@ RSpec.describe "bundle gem" do
expect(bundled_app("#{gem_name}/README.md")).to exist expect(bundled_app("#{gem_name}/README.md")).to exist
expect(bundled_app("#{gem_name}/Gemfile")).to exist expect(bundled_app("#{gem_name}/Gemfile")).to exist
expect(bundled_app("#{gem_name}/Rakefile")).to exist expect(bundled_app("#{gem_name}/Rakefile")).to exist
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb")).to exist expect(bundled_app("#{gem_name}/lib/#{gem_name}.rb")).to exist
expect(bundled_app("#{gem_name}/lib/#{require_path}/version.rb")).to exist expect(bundled_app("#{gem_name}/lib/#{gem_name}/version.rb")).to exist
expect(ignore_paths).to include("bin/") expect(ignore_paths).to include("bin/")
expect(ignore_paths).to include("Gemfile") expect(ignore_paths).to include("Gemfile")
@ -35,14 +35,6 @@ RSpec.describe "bundle gem" do
let(:gem_name) { "mygem" } let(:gem_name) { "mygem" }
let(:require_path) { "mygem" }
let(:require_relative_path) { "mygem" }
let(:minitest_test_file_path) { "test/test_mygem.rb" }
let(:minitest_test_class_name) { "class TestMygem < Minitest::Test" }
before do before do
git("config --global user.name 'Bundler User'") git("config --global user.name 'Bundler User'")
git("config --global user.email user@example.com") git("config --global user.email user@example.com")
@ -449,9 +441,9 @@ RSpec.describe "bundle gem" do
shared_examples_for "test framework is absent" do shared_examples_for "test framework is absent" do
it "does not create any test framework files" do it "does not create any test framework files" do
expect(bundled_app("#{gem_name}/.rspec")).to_not exist expect(bundled_app("#{gem_name}/.rspec")).to_not exist
expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb")).to_not exist expect(bundled_app("#{gem_name}/spec/#{gem_name}_spec.rb")).to_not exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to_not exist expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to_not exist
expect(bundled_app("#{gem_name}/test/#{require_path}.rb")).to_not exist expect(bundled_app("#{gem_name}/test/#{gem_name}.rb")).to_not exist
expect(bundled_app("#{gem_name}/test/test_helper.rb")).to_not exist expect(bundled_app("#{gem_name}/test/test_helper.rb")).to_not exist
end end
@ -628,6 +620,29 @@ RSpec.describe "bundle gem" do
end end
end end
it "generates a gem skeleton" do
bundle "gem #{gem_name}"
expect(bundled_app("#{gem_name}/#{gem_name}.gemspec")).to exist
expect(bundled_app("#{gem_name}/Gemfile")).to exist
expect(bundled_app("#{gem_name}/Rakefile")).to exist
expect(bundled_app("#{gem_name}/lib/#{gem_name}.rb")).to exist
expect(bundled_app("#{gem_name}/lib/#{gem_name}/version.rb")).to exist
expect(bundled_app("#{gem_name}/sig/#{gem_name}.rbs")).to exist
expect(bundled_app("#{gem_name}/.gitignore")).to exist
expect(bundled_app("#{gem_name}/bin/setup")).to exist
expect(bundled_app("#{gem_name}/bin/console")).to exist
unless Gem.win_platform?
expect(bundled_app("#{gem_name}/bin/setup")).to be_executable
expect(bundled_app("#{gem_name}/bin/console")).to be_executable
end
expect(bundled_app("#{gem_name}/bin/setup").read).to start_with("#!")
expect(bundled_app("#{gem_name}/bin/console").read).to start_with("#!")
end
it "includes bin/ into ignore list" do it "includes bin/ into ignore list" do
bundle "gem #{gem_name}" bundle "gem #{gem_name}"
@ -646,6 +661,18 @@ RSpec.describe "bundle gem" do
expect(ignore_paths).to include(".gitignore") expect(ignore_paths).to include(".gitignore")
end end
it "starts with version 0.1.0" do
bundle "gem #{gem_name}"
expect(bundled_app("#{gem_name}/lib/#{gem_name}/version.rb").read).to match(/VERSION = "0.1.0"/)
end
it "declare String type for VERSION constant" do
bundle "gem #{gem_name}"
expect(bundled_app("#{gem_name}/sig/#{gem_name}.rbs").read).to match(/VERSION: String/)
end
context "git config user.{name,email} is set" do context "git config user.{name,email} is set" do
before do before do
bundle "gem #{gem_name}" bundle "gem #{gem_name}"
@ -689,6 +716,97 @@ RSpec.describe "bundle gem" do
expect(generated_gemspec.required_ruby_version.to_s).to start_with(">=") expect(generated_gemspec.required_ruby_version.to_s).to start_with(">=")
end end
it "does not include the gemspec file in files" do
bundle "gem #{gem_name}"
bundler_gemspec = Bundler::GemHelper.new(bundled_app(gem_name), gem_name).gemspec
expect(bundler_gemspec.files).not_to include("#{gem_name}.gemspec")
end
it "does not include the Gemfile file in files" do
bundle "gem #{gem_name}"
bundler_gemspec = Bundler::GemHelper.new(bundled_app(gem_name), gem_name).gemspec
expect(bundler_gemspec.files).not_to include("Gemfile")
end
it "runs rake without problems" do
bundle "gem #{gem_name}"
system_gems ["rake-#{rake_version}"]
rakefile = <<~RAKEFILE
task :default do
puts 'SUCCESS'
end
RAKEFILE
File.open(bundled_app("#{gem_name}/Rakefile"), "w") do |file|
file.puts rakefile
end
sys_exec(rake, dir: bundled_app(gem_name))
expect(out).to include("SUCCESS")
end
context "--exe parameter set" do
before do
bundle "gem #{gem_name} --exe"
end
it "builds exe skeleton" do
expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to exist
unless Gem.win_platform?
expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to be_executable
end
end
end
context "--bin parameter set" do
before do
bundle "gem #{gem_name} --bin"
end
it "builds exe skeleton" do
expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to exist
end
end
context "no --test parameter" do
before do
bundle "gem #{gem_name}"
end
it_behaves_like "test framework is absent"
end
context "--test parameter set to rspec" do
before do
bundle "gem #{gem_name} --test=rspec"
end
it "builds spec skeleton" do
expect(bundled_app("#{gem_name}/.rspec")).to exist
expect(bundled_app("#{gem_name}/spec/#{gem_name}_spec.rb")).to exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to exist
end
it "includes .rspec and spec/ into ignore list" do
expect(ignore_paths).to include(".rspec")
expect(ignore_paths).to include("spec/")
end
it "depends on a specific version of rspec in generated Gemfile" do
allow(Bundler::SharedHelpers).to receive(:find_gemfile).and_return(bundled_app_gemfile)
builder = Bundler::Dsl.new
builder.eval_gemfile(bundled_app("#{gem_name}/Gemfile"))
builder.dependencies
rspec_dep = builder.dependencies.find {|d| d.name == "rspec" }
expect(rspec_dep).to be_specific
end
end
context "init_gems_rb setting to true" do context "init_gems_rb setting to true" do
before do before do
bundle "config set init_gems_rb true" bundle "config set init_gems_rb true"
@ -725,6 +843,79 @@ RSpec.describe "bundle gem" do
end end
end end
context "gem.test setting set to rspec" do
before do
bundle "config set gem.test rspec"
bundle "gem #{gem_name}"
end
it "builds spec skeleton" do
expect(bundled_app("#{gem_name}/.rspec")).to exist
expect(bundled_app("#{gem_name}/spec/#{gem_name}_spec.rb")).to exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to exist
end
it "includes .rspec and spec/ into ignore list" do
expect(ignore_paths).to include(".rspec")
expect(ignore_paths).to include("spec/")
end
end
context "gem.test setting set to rspec and --test is set to minitest" do
before do
bundle "config set gem.test rspec"
bundle "gem #{gem_name} --test=minitest"
end
it "builds spec skeleton" do
expect(bundled_app("#{gem_name}/test/test_#{gem_name}.rb")).to exist
expect(bundled_app("#{gem_name}/test/test_helper.rb")).to exist
end
it "includes test/ into ignore list" do
expect(ignore_paths).to include("test/")
end
end
context "--test parameter set to minitest" do
before do
bundle "gem #{gem_name} --test=minitest"
end
it "depends on a specific version of minitest" do
allow(Bundler::SharedHelpers).to receive(:find_gemfile).and_return(bundled_app_gemfile)
builder = Bundler::Dsl.new
builder.eval_gemfile(bundled_app("#{gem_name}/Gemfile"))
builder.dependencies
minitest_dep = builder.dependencies.find {|d| d.name == "minitest" }
expect(minitest_dep).to be_specific
end
it "builds spec skeleton" do
expect(bundled_app("#{gem_name}/test/test_#{gem_name}.rb")).to exist
expect(bundled_app("#{gem_name}/test/test_helper.rb")).to exist
end
it "includes test/ into ignore list" do
expect(ignore_paths).to include("test/")
end
it "creates a default rake task to run the test suite" do
rakefile = <<~RAKEFILE
# frozen_string_literal: true
require "bundler/gem_tasks"
require "minitest/test_task"
Minitest::TestTask.create
task default: :test
RAKEFILE
expect(bundled_app("#{gem_name}/Rakefile").read).to eq(rakefile)
end
end
context "gem.test setting set to minitest" do context "gem.test setting set to minitest" do
before do before do
bundle "config set gem.test minitest" bundle "config set gem.test minitest"
@ -747,21 +938,27 @@ RSpec.describe "bundle gem" do
end end
end end
context "--test parameter set to an invalid value" do context "--test parameter set to test-unit" do
before do before do
bundle "gem #{gem_name} --test=foo", raise_on_error: false bundle "gem #{gem_name} --test=test-unit"
end end
it "fails loudly" do it "depends on a specific version of test-unit" do
expect(last_command).to be_failure allow(Bundler::SharedHelpers).to receive(:find_gemfile).and_return(bundled_app_gemfile)
expect(err).to match(/Expected '--test' to be one of .*; got foo/) builder = Bundler::Dsl.new
end builder.eval_gemfile(bundled_app("#{gem_name}/Gemfile"))
builder.dependencies
test_unit_dep = builder.dependencies.find {|d| d.name == "test-unit" }
expect(test_unit_dep).to be_specific
end end
context "gem.test setting set to test-unit" do it "builds spec skeleton" do
before do expect(bundled_app("#{gem_name}/test/#{gem_name}_test.rb")).to exist
bundle "config set gem.test test-unit" expect(bundled_app("#{gem_name}/test/test_helper.rb")).to exist
bundle "gem #{gem_name}" end
it "includes test/ into ignore list" do
expect(ignore_paths).to include("test/")
end end
it "creates a default rake task to run the test suite" do it "creates a default rake task to run the test suite" do
@ -784,6 +981,88 @@ RSpec.describe "bundle gem" do
end end
end end
context "--test parameter set to an invalid value" do
before do
bundle "gem #{gem_name} --test=foo", raise_on_error: false
end
it "fails loudly" do
expect(last_command).to be_failure
expect(err).to match(/Expected '--test' to be one of .*; got foo/)
end
end
context "gem.test set to rspec and --test with no arguments" do
before do
bundle "config set gem.test rspec"
bundle "gem #{gem_name} --test"
end
it "builds spec skeleton" do
expect(bundled_app("#{gem_name}/.rspec")).to exist
expect(bundled_app("#{gem_name}/spec/#{gem_name}_spec.rb")).to exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to exist
end
it "includes .rspec and spec/ into ignore list" do
expect(ignore_paths).to include(".rspec")
expect(ignore_paths).to include("spec/")
end
it "hints that --test is already configured" do
expect(out).to match("rspec is already configured, ignoring --test flag.")
end
end
context "gem.test setting set to false and --test with no arguments", :readline do
before do
bundle "config set gem.test false"
bundle "gem #{gem_name} --test" do |input, _, _|
input.puts
end
end
it "asks to generate test files" do
expect(out).to match("Do you want to generate tests with your gem?")
end
it "hints that the choice will only be applied to the current gem" do
expect(out).to match("Your choice will only be applied to this gem.")
end
it_behaves_like "test framework is absent"
end
context "gem.test setting not set and --test with no arguments", :readline do
before do
global_config "BUNDLE_GEM__TEST" => nil
bundle "gem #{gem_name} --test" do |input, _, _|
input.puts
end
end
it "asks to generate test files" do
expect(out).to match("Do you want to generate tests with your gem?")
end
it "hints that the choice will be applied to future bundle gem calls" do
hint = "Future `bundle gem` calls will use your choice. " \
"This setting can be changed anytime with `bundle config gem.test`."
expect(out).to match(hint)
end
it_behaves_like "test framework is absent"
end
context "gem.test setting set to a test framework and --no-test" do
before do
bundle "config set gem.test rspec"
bundle "gem #{gem_name} --no-test"
end
it_behaves_like "test framework is absent"
end
context "--ci with no argument" do context "--ci with no argument" do
before do before do
bundle "gem #{gem_name}" bundle "gem #{gem_name}"
@ -1165,52 +1444,16 @@ RSpec.describe "bundle gem" do
end end
end end
shared_examples_for "generating a gem" do shared_examples_for "paths that depend on gem name" do
it "generates a gem skeleton" do it "generates entrypoint, version file and signatures file at the proper path, with the proper content" do
bundle "gem #{gem_name}" bundle "gem #{gem_name}"
expect(bundled_app("#{gem_name}/#{gem_name}.gemspec")).to exist
expect(bundled_app("#{gem_name}/Gemfile")).to exist
expect(bundled_app("#{gem_name}/Rakefile")).to exist
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb")).to exist expect(bundled_app("#{gem_name}/lib/#{require_path}.rb")).to exist
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(%r{require_relative "#{require_relative_path}/version"})
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(/class Error < StandardError; end$/)
expect(bundled_app("#{gem_name}/lib/#{require_path}/version.rb")).to exist expect(bundled_app("#{gem_name}/lib/#{require_path}/version.rb")).to exist
expect(bundled_app("#{gem_name}/sig/#{require_path}.rbs")).to exist expect(bundled_app("#{gem_name}/sig/#{require_path}.rbs")).to exist
expect(bundled_app("#{gem_name}/.gitignore")).to exist
expect(bundled_app("#{gem_name}/bin/setup")).to exist
expect(bundled_app("#{gem_name}/bin/console")).to exist
unless Gem.win_platform?
expect(bundled_app("#{gem_name}/bin/setup")).to be_executable
expect(bundled_app("#{gem_name}/bin/console")).to be_executable
end
expect(bundled_app("#{gem_name}/bin/setup").read).to start_with("#!")
expect(bundled_app("#{gem_name}/bin/console").read).to start_with("#!")
end
it "starts with version 0.1.0" do
bundle "gem #{gem_name}"
expect(bundled_app("#{gem_name}/lib/#{require_path}/version.rb").read).to match(/VERSION = "0.1.0"/)
end
it "declare String type for VERSION constant" do
bundle "gem #{gem_name}"
expect(bundled_app("#{gem_name}/sig/#{require_path}.rbs").read).to match(/VERSION: String/)
end
it "requires the version file" do
bundle "gem #{gem_name}"
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(%r{require_relative "#{require_relative_path}/version"})
end
it "creates a base error class" do
bundle "gem #{gem_name}"
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(/class Error < StandardError; end$/)
end end
context "--exe parameter set" do context "--exe parameter set" do
@ -1218,14 +1461,8 @@ RSpec.describe "bundle gem" do
bundle "gem #{gem_name} --exe" bundle "gem #{gem_name} --exe"
end end
it "builds exe skeleton" do it "builds an exe file that requires the proper entrypoint" do
expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to exist expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to exist
unless Gem.win_platform?
expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to be_executable
end
end
it "requires the main file" do
expect(bundled_app("#{gem_name}/exe/#{gem_name}").read).to match(/require "#{require_path}"/) expect(bundled_app("#{gem_name}/exe/#{gem_name}").read).to match(/require "#{require_path}"/)
end end
end end
@ -1235,88 +1472,22 @@ RSpec.describe "bundle gem" do
bundle "gem #{gem_name} --bin" bundle "gem #{gem_name} --bin"
end end
it "builds exe skeleton" do it "builds an exe file that requires the proper entrypoint" do
expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to exist expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to exist
end
it "requires the main file" do
expect(bundled_app("#{gem_name}/exe/#{gem_name}").read).to match(/require "#{require_path}"/) expect(bundled_app("#{gem_name}/exe/#{gem_name}").read).to match(/require "#{require_path}"/)
end end
end end
context "no --test parameter" do
before do
bundle "gem #{gem_name}"
end
it_behaves_like "test framework is absent"
end
context "--test parameter set to rspec" do context "--test parameter set to rspec" do
before do before do
bundle "gem #{gem_name} --test=rspec" bundle "gem #{gem_name} --test=rspec"
end end
it "builds spec skeleton" do it "builds a spec helper that requires the proper entrypoint, and a default test in the proper path which fails" do
expect(bundled_app("#{gem_name}/.rspec")).to exist
expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb")).to exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to exist expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to exist
end
it "includes .rspec and spec/ into ignore list" do
expect(ignore_paths).to include(".rspec")
expect(ignore_paths).to include("spec/")
end
it "depends on a specific version of rspec in generated Gemfile" do
allow(Bundler::SharedHelpers).to receive(:find_gemfile).and_return(bundled_app_gemfile)
builder = Bundler::Dsl.new
builder.eval_gemfile(bundled_app("#{gem_name}/Gemfile"))
builder.dependencies
rspec_dep = builder.dependencies.find {|d| d.name == "rspec" }
expect(rspec_dep).to be_specific
end
it "requires the main file" do
expect(bundled_app("#{gem_name}/spec/spec_helper.rb").read).to include(%(require "#{require_path}")) expect(bundled_app("#{gem_name}/spec/spec_helper.rb").read).to include(%(require "#{require_path}"))
end
it "creates a default test which fails" do
expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb").read).to include("expect(false).to eq(true)")
end
end
context "gem.test setting set to rspec" do
before do
bundle "config set gem.test rspec"
bundle "gem #{gem_name}"
end
it "builds spec skeleton" do
expect(bundled_app("#{gem_name}/.rspec")).to exist
expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb")).to exist expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb")).to exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to exist expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb").read).to include("expect(false).to eq(true)")
end
it "includes .rspec and spec/ into ignore list" do
expect(ignore_paths).to include(".rspec")
expect(ignore_paths).to include("spec/")
end
end
context "gem.test setting set to rspec and --test is set to minitest" do
before do
bundle "config set gem.test rspec"
bundle "gem #{gem_name} --test=minitest"
end
it "builds spec skeleton" do
expect(bundled_app("#{gem_name}/#{minitest_test_file_path}")).to exist
expect(bundled_app("#{gem_name}/test/test_helper.rb")).to exist
end
it "includes test/ into ignore list" do
expect(ignore_paths).to include("test/")
end end
end end
@ -1325,37 +1496,13 @@ RSpec.describe "bundle gem" do
bundle "gem #{gem_name} --test=minitest" bundle "gem #{gem_name} --test=minitest"
end end
it "depends on a specific version of minitest" do it "builds a test helper that requires the proper entrypoint, and default test file in the proper path that defines the proper test class name, requires helper, and fails" do
allow(Bundler::SharedHelpers).to receive(:find_gemfile).and_return(bundled_app_gemfile)
builder = Bundler::Dsl.new
builder.eval_gemfile(bundled_app("#{gem_name}/Gemfile"))
builder.dependencies
minitest_dep = builder.dependencies.find {|d| d.name == "minitest" }
expect(minitest_dep).to be_specific
end
it "builds spec skeleton" do
expect(bundled_app("#{gem_name}/#{minitest_test_file_path}")).to exist
expect(bundled_app("#{gem_name}/test/test_helper.rb")).to exist expect(bundled_app("#{gem_name}/test/test_helper.rb")).to exist
end
it "includes test/ into ignore list" do
expect(ignore_paths).to include("test/")
end
it "requires the main file" do
expect(bundled_app("#{gem_name}/test/test_helper.rb").read).to include(%(require "#{require_path}")) expect(bundled_app("#{gem_name}/test/test_helper.rb").read).to include(%(require "#{require_path}"))
end
it "requires 'test_helper'" do expect(bundled_app("#{gem_name}/#{minitest_test_file_path}")).to exist
expect(bundled_app("#{gem_name}/#{minitest_test_file_path}").read).to include(%(require "test_helper"))
end
it "defines valid test class name" do
expect(bundled_app("#{gem_name}/#{minitest_test_file_path}").read).to include(minitest_test_class_name) expect(bundled_app("#{gem_name}/#{minitest_test_file_path}").read).to include(minitest_test_class_name)
end expect(bundled_app("#{gem_name}/#{minitest_test_file_path}").read).to include(%(require "test_helper"))
it "creates a default test which fails" do
expect(bundled_app("#{gem_name}/#{minitest_test_file_path}").read).to include("assert false") expect(bundled_app("#{gem_name}/#{minitest_test_file_path}").read).to include("assert false")
end end
end end
@ -1365,111 +1512,16 @@ RSpec.describe "bundle gem" do
bundle "gem #{gem_name} --test=test-unit" bundle "gem #{gem_name} --test=test-unit"
end end
it "depends on a specific version of test-unit" do it "builds a test helper that requires the proper entrypoint, and default test file in the proper path which requires helper and fails" do
allow(Bundler::SharedHelpers).to receive(:find_gemfile).and_return(bundled_app_gemfile)
builder = Bundler::Dsl.new
builder.eval_gemfile(bundled_app("#{gem_name}/Gemfile"))
builder.dependencies
test_unit_dep = builder.dependencies.find {|d| d.name == "test-unit" }
expect(test_unit_dep).to be_specific
end
it "builds spec skeleton" do
expect(bundled_app("#{gem_name}/test/#{require_path}_test.rb")).to exist
expect(bundled_app("#{gem_name}/test/test_helper.rb")).to exist expect(bundled_app("#{gem_name}/test/test_helper.rb")).to exist
end
it "includes test/ into ignore list" do
expect(ignore_paths).to include("test/")
end
it "requires the main file" do
expect(bundled_app("#{gem_name}/test/test_helper.rb").read).to include(%(require "#{require_path}")) expect(bundled_app("#{gem_name}/test/test_helper.rb").read).to include(%(require "#{require_path}"))
end expect(bundled_app("#{gem_name}/test/#{require_path}_test.rb")).to exist
it "requires 'test_helper'" do
expect(bundled_app("#{gem_name}/test/#{require_path}_test.rb").read).to include(%(require "test_helper")) expect(bundled_app("#{gem_name}/test/#{require_path}_test.rb").read).to include(%(require "test_helper"))
end
it "creates a default test which fails" do
expect(bundled_app("#{gem_name}/test/#{require_path}_test.rb").read).to include("assert_equal(\"expected\", \"actual\")") expect(bundled_app("#{gem_name}/test/#{require_path}_test.rb").read).to include("assert_equal(\"expected\", \"actual\")")
end end
end end
context "gem.test set to rspec and --test with no arguments" do
before do
bundle "config set gem.test rspec"
bundle "gem #{gem_name} --test"
end end
it "builds spec skeleton" do
expect(bundled_app("#{gem_name}/.rspec")).to exist
expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb")).to exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to exist
end
it "includes .rspec and spec/ into ignore list" do
expect(ignore_paths).to include(".rspec")
expect(ignore_paths).to include("spec/")
end
it "hints that --test is already configured" do
expect(out).to match("rspec is already configured, ignoring --test flag.")
end
end
context "gem.test setting set to false and --test with no arguments", :readline do
before do
bundle "config set gem.test false"
bundle "gem #{gem_name} --test" do |input, _, _|
input.puts
end
end
it "asks to generate test files" do
expect(out).to match("Do you want to generate tests with your gem?")
end
it "hints that the choice will only be applied to the current gem" do
expect(out).to match("Your choice will only be applied to this gem.")
end
it_behaves_like "test framework is absent"
end
context "gem.test setting not set and --test with no arguments", :readline do
before do
global_config "BUNDLE_GEM__TEST" => nil
bundle "gem #{gem_name} --test" do |input, _, _|
input.puts
end
end
it "asks to generate test files" do
expect(out).to match("Do you want to generate tests with your gem?")
end
it "hints that the choice will be applied to future bundle gem calls" do
hint = "Future `bundle gem` calls will use your choice. " \
"This setting can be changed anytime with `bundle config gem.test`."
expect(out).to match(hint)
end
it_behaves_like "test framework is absent"
end
context "gem.test setting set to a test framework and --no-test" do
before do
bundle "config set gem.test rspec"
bundle "gem #{gem_name} --no-test"
end
it_behaves_like "test framework is absent"
end
end
include_examples "generating a gem"
context "with mit option in bundle config settings set to true" do context "with mit option in bundle config settings set to true" do
before do before do
global_config "BUNDLE_GEM__MIT" => "true" global_config "BUNDLE_GEM__MIT" => "true"
@ -1632,6 +1684,18 @@ RSpec.describe "bundle gem" do
end end
end end
context "standard gem naming" do
let(:require_path) { gem_name }
let(:require_relative_path) { gem_name }
let(:minitest_test_file_path) { "test/test_#{gem_name}.rb" }
let(:minitest_test_class_name) { "class TestMygem < Minitest::Test" }
include_examples "paths that depend on gem name"
end
context "gem naming with underscore" do context "gem naming with underscore" do
let(:gem_name) { "test_gem" } let(:gem_name) { "test_gem" }
@ -1651,7 +1715,7 @@ RSpec.describe "bundle gem" do
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(/module TestGem/) expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(/module TestGem/)
end end
include_examples "generating a gem" include_examples "paths that depend on gem name"
context "--ext parameter with no value" do context "--ext parameter with no value" do
context "is deprecated" do context "is deprecated" do
@ -1781,7 +1845,7 @@ RSpec.describe "bundle gem" do
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(/module Test\n module Gem/) expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(/module Test\n module Gem/)
end end
include_examples "generating a gem" include_examples "paths that depend on gem name"
end end
describe "uncommon gem names" do describe "uncommon gem names" do