diff options
Diffstat (limited to 'spec')
-rw-r--r-- | spec/bundler/bundler_spec.rb | 67 | ||||
-rw-r--r-- | spec/bundler/plugin/index_spec.rb | 8 | ||||
-rw-r--r-- | spec/bundler/source/git_spec.rb | 28 | ||||
-rw-r--r-- | spec/commands/add_spec.rb | 5 | ||||
-rw-r--r-- | spec/commands/binstubs_spec.rb | 23 | ||||
-rw-r--r-- | spec/commands/exec_spec.rb | 16 | ||||
-rw-r--r-- | spec/commands/lock_spec.rb | 8 | ||||
-rw-r--r-- | spec/install/gems/resolving_spec.rb | 5 | ||||
-rw-r--r-- | spec/install/path_spec.rb | 12 |
9 files changed, 153 insertions, 19 deletions
diff --git a/spec/bundler/bundler_spec.rb b/spec/bundler/bundler_spec.rb index 94d4096cd3..131146119e 100644 --- a/spec/bundler/bundler_spec.rb +++ b/spec/bundler/bundler_spec.rb @@ -2,6 +2,7 @@ # frozen_string_literal: true require "bundler" +require "tmpdir" RSpec.describe Bundler do describe "#load_gemspec_uncached" do @@ -228,6 +229,72 @@ EOF end end + describe "#requires_sudo?" do + let!(:tmpdir) { Dir.mktmpdir } + let(:bundle_path) { Pathname("#{tmpdir}/bundle") } + + def clear_cached_requires_sudo + # Private in ruby 1.8.7 + return unless Bundler.instance_variable_defined?(:@requires_sudo_ran) + Bundler.send(:remove_instance_variable, :@requires_sudo_ran) + Bundler.send(:remove_instance_variable, :@requires_sudo) + end + + before do + clear_cached_requires_sudo + allow(Bundler).to receive(:which).with("sudo").and_return("/usr/bin/sudo") + allow(Bundler).to receive(:bundle_path).and_return(bundle_path) + end + + after do + FileUtils.rm_rf(tmpdir) + clear_cached_requires_sudo + end + + subject { Bundler.requires_sudo? } + + context "bundle_path doesn't exist" do + it { should be false } + + context "and parent dir can't be written" do + before do + FileUtils.chmod(0o500, tmpdir) + end + + it { should be true } + end + + context "with unwritable files in a parent dir" do + # Regression test for https://github.com/bundler/bundler/pull/6316 + # It doesn't matter if there are other unwritable files so long as + # bundle_path can be created + before do + file = File.join(tmpdir, "unrelated_file") + FileUtils.touch(file) + FileUtils.chmod(0o400, file) + end + + it { should be false } + end + end + + context "bundle_path exists" do + before do + FileUtils.mkdir_p(bundle_path) + end + + it { should be false } + + context "and is unwritable" do + before do + FileUtils.chmod(0o500, bundle_path) + end + + it { should be true } + end + end + end + context "user cache dir" do let(:home_path) { Pathname.new(ENV["HOME"]) } diff --git a/spec/bundler/plugin/index_spec.rb b/spec/bundler/plugin/index_spec.rb index 163b563b2a..ca3476ea2a 100644 --- a/spec/bundler/plugin/index_spec.rb +++ b/spec/bundler/plugin/index_spec.rb @@ -175,4 +175,12 @@ RSpec.describe Bundler::Plugin::Index do include_examples "it cleans up" end end + + describe "readonly disk without home" do + it "ignores being unable to create temp home dir" do + expect_any_instance_of(Bundler::Plugin::Index).to receive(:global_index_file). + and_raise(Bundler::GenericSystemCallError.new("foo", "bar")) + Bundler::Plugin::Index.new + end + end end diff --git a/spec/bundler/source/git_spec.rb b/spec/bundler/source/git_spec.rb new file mode 100644 index 0000000000..f7475a35aa --- /dev/null +++ b/spec/bundler/source/git_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +RSpec.describe Bundler::Source::Git do + before do + allow(Bundler).to receive(:root) { Pathname.new("root") } + end + + let(:uri) { "https://github.com/foo/bar.git" } + let(:options) do + { "uri" => uri } + end + + subject { described_class.new(options) } + + describe "#to_s" do + it "returns a description" do + expect(subject.to_s).to eq "https://github.com/foo/bar.git (at master)" + end + + context "when the URI contains credentials" do + let(:uri) { "https://my-secret-token:x-oauth-basic@github.com/foo/bar.git" } + + it "filters credentials" do + expect(subject.to_s).to eq "https://x-oauth-basic@github.com/foo/bar.git (at master)" + end + end + end +end diff --git a/spec/commands/add_spec.rb b/spec/commands/add_spec.rb index 7916db960a..d1f2050aa0 100644 --- a/spec/commands/add_spec.rb +++ b/spec/commands/add_spec.rb @@ -51,8 +51,9 @@ RSpec.describe "bundle add" do end it "adds multiple version constraints when specified" do - bundle "add 'foo' --version='< 3.0, > 1.1'" - expect(bundled_app("Gemfile").read).to match(/gem "foo", "< 3.0", "> 1.1"/) + requirements = ["< 3.0", "> 1.0"] + bundle "add 'foo' --version='#{requirements.join(", ")}'" + expect(bundled_app("Gemfile").read).to match(/gem "foo", #{Gem::Requirement.new(requirements).as_list.map(&:dump).join(', ')}/) expect(the_bundle).to include_gems "foo 2.0" end end diff --git a/spec/commands/binstubs_spec.rb b/spec/commands/binstubs_spec.rb index 8157173b42..ad859a21d5 100644 --- a/spec/commands/binstubs_spec.rb +++ b/spec/commands/binstubs_spec.rb @@ -39,6 +39,18 @@ RSpec.describe "bundle binstubs <gem>" do expect(bundled_app("bin/rails")).to exist end + it "allows installing all binstubs" do + install_gemfile! <<-G + source "file://#{gem_repo1}" + gem "rails" + G + + bundle! :binstubs, :all => true + + expect(bundled_app("bin/rails")).to exist + expect(bundled_app("bin/rake")).to exist + end + it "displays an error when used without any gem" do install_gemfile <<-G source "file://#{gem_repo1}" @@ -50,6 +62,17 @@ RSpec.describe "bundle binstubs <gem>" do expect(out).to include("`bundle binstubs` needs at least one gem to run.") end + it "displays an error when used with --all and gems" do + install_gemfile <<-G + source "file://#{gem_repo1}" + gem "rack" + G + + bundle "binstubs rack", :all => true + expect(last_command).to be_failure + expect(last_command.bundler_err).to include("Cannot specify --all with specific gems") + end + context "when generating bundle binstub outside bundler" do it "should abort" do install_gemfile <<-G diff --git a/spec/commands/exec_spec.rb b/spec/commands/exec_spec.rb index 30972b5e46..2fe2667363 100644 --- a/spec/commands/exec_spec.rb +++ b/spec/commands/exec_spec.rb @@ -610,13 +610,7 @@ RSpec.describe "bundle exec" do let(:executable) { super() << "\nclass Err < Exception\ndef backtrace; end;\nend\nraise Err" } let(:exit_code) { 1 } let(:expected) { super() << "\nbundler: failed to load command: #{path} (#{path})" } - let(:expected_err) do - if ENV["BUNDLER_SPEC_SUB_VERSION"] == "1.98" - "Err: Err" - else - "bundler: failed to load command: #{path} (#{path})\nErr: Err" - end - end + let(:expected_err) { "Err: Err" } it_behaves_like "it runs" end @@ -625,13 +619,7 @@ RSpec.describe "bundle exec" do let(:executable) { super() << "\nclass Err < Exception\ndef backtrace; end;\nend\nraise Err" } let(:exit_code) { 1 } let(:expected_err) { "bundler: failed to load command: #{path} (#{path})\nErr: Err" } - let(:expected) do - if ENV["BUNDLER_SPEC_SUB_VERSION"] == "1.98" - super() << "\nbundler: failed to load command: #{path} (#{path})" - else - super() - end - end + let(:expected) { super() } it_behaves_like "it runs" end diff --git a/spec/commands/lock_spec.rb b/spec/commands/lock_spec.rb index bd5bdfff2f..81eba1ceda 100644 --- a/spec/commands/lock_spec.rb +++ b/spec/commands/lock_spec.rb @@ -97,6 +97,14 @@ RSpec.describe "bundle lock" do expect { read_lockfile }.to raise_error(Errno::ENOENT) end + it "writes to custom location using --lockfile when a default lockfile is present" do + bundle "install" + bundle "lock --lockfile=lock" + + expect(out).to match(/Writing lockfile to.+lock/) + expect(read_lockfile("lock")).to eq(@lockfile) + end + it "update specific gems using --update" do lockfile @lockfile.gsub("2.3.2", "2.3.1").gsub("10.0.2", "10.0.1") diff --git a/spec/install/gems/resolving_spec.rb b/spec/install/gems/resolving_spec.rb index 2925542d86..e58f32836c 100644 --- a/spec/install/gems/resolving_spec.rb +++ b/spec/install/gems/resolving_spec.rb @@ -166,8 +166,9 @@ RSpec.describe "bundle install with install-time dependencies" do end describe "with a compound requirement" do - let(:ruby_requirement) { %("< 5000", "> 0.1") } - let(:error_message_requirement) { "< 5000, > 0.1" } + let(:reqs) { ["> 0.1", "< 5000"] } + let(:ruby_requirement) { reqs.map(&:dump).join(", ") } + let(:error_message_requirement) { Gem::Requirement.new(reqs).to_s } it_behaves_like "ruby version conflicts" end diff --git a/spec/install/path_spec.rb b/spec/install/path_spec.rb index 467e95ec57..3ed2b30cce 100644 --- a/spec/install/path_spec.rb +++ b/spec/install/path_spec.rb @@ -98,7 +98,7 @@ RSpec.describe "bundle install" do if type == :env ENV["BUNDLE_PATH"] = location elsif type == :global - bundle "config path #{location}", "no-color" => nil + bundle! "config path #{location}", "no-color" => nil end end @@ -112,6 +112,16 @@ RSpec.describe "bundle install" do expect(the_bundle).to include_gems "rack 1.0.0" end + it "installs gems to ." do + set_bundle_path(type, ".") + bundle! "config --global disable_shared_gems true" + + bundle! :install + + expect([bundled_app("cache/rack-1.0.0.gem"), bundled_app("gems/rack-1.0.0"), bundled_app("specifications/rack-1.0.0.gemspec")]).to all exist + expect(the_bundle).to include_gems "rack 1.0.0" + end + it "installs gems to BUNDLE_PATH with #{type}" do set_bundle_path(type, bundled_app("vendor").to_s) |