1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/bundler/bundler/settings_spec.rb
hsbt 59c8d50653 Added bundler as default gems. Revisit [Feature #12733]
* bin/*, lib/bundler/*, lib/bundler.rb, spec/bundler, man/*:
    Merge from latest stable branch of bundler/bundler repository and
    added workaround patches. I will backport them into upstream.
  * common.mk, defs/gmake.mk: Added `test-bundler` task for test suite
    of bundler.
  * tool/sync_default_gems.rb: Added sync task for bundler.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65509 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-11-02 23:07:56 +00:00

326 lines
10 KiB
Ruby

# frozen_string_literal: true
require "bundler/settings"
RSpec.describe Bundler::Settings do
subject(:settings) { described_class.new(bundled_app) }
describe "#set_local" do
context "when the local config file is not found" do
subject(:settings) { described_class.new(nil) }
it "raises a GemfileNotFound error with explanation" do
expect { subject.set_local("foo", "bar") }.
to raise_error(Bundler::GemfileNotFound, "Could not locate Gemfile")
end
end
end
describe "load_config" do
let(:hash) do
{
"build.thrift" => "--with-cppflags=-D_FORTIFY_SOURCE=0",
"build.libv8" => "--with-system-v8",
"build.therubyracer" => "--with-v8-dir",
"build.pg" => "--with-pg-config=/usr/local/Cellar/postgresql92/9.2.8_1/bin/pg_config",
"gem.coc" => "false",
"gem.mit" => "false",
"gem.test" => "minitest",
"thingy" => <<-EOS.tr("\n", " "),
--asdf --fdsa --ty=oh man i hope this doesnt break bundler because
that would suck --ehhh=oh geez it looks like i might have broken bundler somehow
--very-important-option=DontDeleteRoo
--very-important-option=DontDeleteRoo
--very-important-option=DontDeleteRoo
--very-important-option=DontDeleteRoo
EOS
"xyz" => "zyx",
}
end
before do
hash.each do |key, value|
settings.set_local key, value
end
end
it "can load the config" do
loaded = settings.send(:load_config, bundled_app("config"))
expected = Hash[hash.map do |k, v|
[settings.send(:key_for, k), v.to_s]
end]
expect(loaded).to eq(expected)
end
context "when BUNDLE_IGNORE_CONFIG is set" do
before { ENV["BUNDLE_IGNORE_CONFIG"] = "TRUE" }
it "ignores the config" do
loaded = settings.send(:load_config, bundled_app("config"))
expect(loaded).to eq({})
end
end
end
describe "#global_config_file" do
context "when $HOME is not accessible" do
context "when $TMPDIR is not writable" do
it "does not raise" do
expect(Bundler.rubygems).to receive(:user_home).twice.and_return(nil)
expect(FileUtils).to receive(:mkpath).twice.with(File.join(Dir.tmpdir, "bundler", "home")).and_raise(Errno::EROFS, "Read-only file system @ dir_s_mkdir - /tmp/bundler")
expect(subject.send(:global_config_file)).to be_nil
end
end
end
end
describe "#[]" do
context "when the local config file is not found" do
subject(:settings) { described_class.new }
it "does not raise" do
expect do
subject["foo"]
end.not_to raise_error
end
end
context "when not set" do
context "when default value present" do
it "retrieves value" do
expect(settings[:retry]).to be 3
end
end
it "returns nil" do
expect(settings[:buttermilk]).to be nil
end
end
context "when is boolean" do
it "returns a boolean" do
settings.set_local :frozen, "true"
expect(settings[:frozen]).to be true
end
context "when specific gem is configured" do
it "returns a boolean" do
settings.set_local "ignore_messages.foobar", "true"
expect(settings["ignore_messages.foobar"]).to be true
end
end
end
context "when is number" do
it "returns a number" do
settings.set_local :ssl_verify_mode, "1"
expect(settings[:ssl_verify_mode]).to be 1
end
end
context "when it's not possible to write to the file" do
it "raises an PermissionError with explanation" do
expect(bundler_fileutils).to receive(:mkdir_p).with(settings.send(:local_config_file).dirname).
and_raise(Errno::EACCES)
expect { settings.set_local :frozen, "1" }.
to raise_error(Bundler::PermissionError, /config/)
end
end
end
describe "#temporary" do
it "reset after used" do
Bundler.settings.set_local :no_install, true
Bundler.settings.temporary(:no_install => false) do
expect(Bundler.settings[:no_install]).to eq false
end
expect(Bundler.settings[:no_install]).to eq true
end
it "returns the return value of the block" do
ret = Bundler.settings.temporary({}) { :ret }
expect(ret).to eq :ret
end
context "when called without a block" do
it "leaves the setting changed" do
Bundler.settings.temporary(:foo => :random)
expect(Bundler.settings[:foo]).to eq "random"
end
it "returns nil" do
expect(Bundler.settings.temporary(:foo => :bar)).to be_nil
end
end
end
describe "#set_global" do
context "when it's not possible to write to the file" do
it "raises an PermissionError with explanation" do
expect(bundler_fileutils).to receive(:mkdir_p).with(settings.send(:global_config_file).dirname).
and_raise(Errno::EACCES)
expect { settings.set_global(:frozen, "1") }.
to raise_error(Bundler::PermissionError, %r{\.bundle/config})
end
end
end
describe "#pretty_values_for" do
it "prints the converted value rather than the raw string" do
bool_key = described_class::BOOL_KEYS.first
settings.set_local(bool_key, "false")
expect(subject.pretty_values_for(bool_key)).to eq [
"Set for your local app (#{bundled_app("config")}): false",
]
end
end
describe "#mirror_for" do
let(:uri) { URI("https://rubygems.org/") }
context "with no configured mirror" do
it "returns the original URI" do
expect(settings.mirror_for(uri)).to eq(uri)
end
it "converts a string parameter to a URI" do
expect(settings.mirror_for("https://rubygems.org/")).to eq(uri)
end
end
context "with a configured mirror" do
let(:mirror_uri) { URI("https://rubygems-mirror.org/") }
before { settings.set_local "mirror.https://rubygems.org/", mirror_uri.to_s }
it "returns the mirror URI" do
expect(settings.mirror_for(uri)).to eq(mirror_uri)
end
it "converts a string parameter to a URI" do
expect(settings.mirror_for("https://rubygems.org/")).to eq(mirror_uri)
end
it "normalizes the URI" do
expect(settings.mirror_for("https://rubygems.org")).to eq(mirror_uri)
end
it "is case insensitive" do
expect(settings.mirror_for("HTTPS://RUBYGEMS.ORG/")).to eq(mirror_uri)
end
context "with a file URI" do
let(:mirror_uri) { URI("file:/foo/BAR/baz/qUx/") }
it "returns the mirror URI" do
expect(settings.mirror_for(uri)).to eq(mirror_uri)
end
it "converts a string parameter to a URI" do
expect(settings.mirror_for("file:/foo/BAR/baz/qUx/")).to eq(mirror_uri)
end
it "normalizes the URI" do
expect(settings.mirror_for("file:/foo/BAR/baz/qUx")).to eq(mirror_uri)
end
end
end
end
describe "#credentials_for" do
let(:uri) { URI("https://gemserver.example.org/") }
let(:credentials) { "username:password" }
context "with no configured credentials" do
it "returns nil" do
expect(settings.credentials_for(uri)).to be_nil
end
end
context "with credentials configured by URL" do
before { settings.set_local "https://gemserver.example.org/", credentials }
it "returns the configured credentials" do
expect(settings.credentials_for(uri)).to eq(credentials)
end
end
context "with credentials configured by hostname" do
before { settings.set_local "gemserver.example.org", credentials }
it "returns the configured credentials" do
expect(settings.credentials_for(uri)).to eq(credentials)
end
end
end
describe "URI normalization" do
it "normalizes HTTP URIs in credentials configuration" do
settings.set_local "http://gemserver.example.org", "username:password"
expect(settings.all).to include("http://gemserver.example.org/")
end
it "normalizes HTTPS URIs in credentials configuration" do
settings.set_local "https://gemserver.example.org", "username:password"
expect(settings.all).to include("https://gemserver.example.org/")
end
it "normalizes HTTP URIs in mirror configuration" do
settings.set_local "mirror.http://rubygems.org", "http://rubygems-mirror.org"
expect(settings.all).to include("mirror.http://rubygems.org/")
end
it "normalizes HTTPS URIs in mirror configuration" do
settings.set_local "mirror.https://rubygems.org", "http://rubygems-mirror.org"
expect(settings.all).to include("mirror.https://rubygems.org/")
end
it "does not normalize other config keys that happen to contain 'http'" do
settings.set_local "local.httparty", home("httparty")
expect(settings.all).to include("local.httparty")
end
it "does not normalize other config keys that happen to contain 'https'" do
settings.set_local "local.httpsmarty", home("httpsmarty")
expect(settings.all).to include("local.httpsmarty")
end
it "reads older keys without trailing slashes" do
settings.set_local "mirror.https://rubygems.org", "http://rubygems-mirror.org"
expect(settings.mirror_for("https://rubygems.org/")).to eq(
URI("http://rubygems-mirror.org/")
)
end
it "normalizes URIs with a fallback_timeout option" do
settings.set_local "mirror.https://rubygems.org/.fallback_timeout", "true"
expect(settings.all).to include("mirror.https://rubygems.org/.fallback_timeout")
end
it "normalizes URIs with a fallback_timeout option without a trailing slash" do
settings.set_local "mirror.https://rubygems.org.fallback_timeout", "true"
expect(settings.all).to include("mirror.https://rubygems.org/.fallback_timeout")
end
end
describe "BUNDLE_ keys format" do
let(:settings) { described_class.new(bundled_app(".bundle")) }
it "converts older keys without double dashes" do
config("BUNDLE_MY__PERSONAL.RACK" => "~/Work/git/rack")
expect(settings["my.personal.rack"]).to eq("~/Work/git/rack")
end
it "converts older keys without trailing slashes and double dashes" do
config("BUNDLE_MIRROR__HTTPS://RUBYGEMS.ORG" => "http://rubygems-mirror.org")
expect(settings["mirror.https://rubygems.org/"]).to eq("http://rubygems-mirror.org")
end
it "reads newer keys format properly" do
config("BUNDLE_MIRROR__HTTPS://RUBYGEMS__ORG/" => "http://rubygems-mirror.org")
expect(settings["mirror.https://rubygems.org/"]).to eq("http://rubygems-mirror.org")
end
end
end