bundle-new/spec/install/gems/sources_spec.rb

248 lines
7.2 KiB
Ruby

require "spec_helper"
describe "bundle install with gems on multiple sources" do
# repo1 is built automatically before all of the specs run
# it contains rack-obama 1.0.0 and rack 0.9.1 & 1.0.0 amongst other gems
context "without source affinity" do
before do
# Oh no! Someone evil is trying to hijack rack :(
# need this to be broken to check for correct source ordering
build_repo gem_repo3 do
build_gem "rack", repo3_rack_version do |s|
s.write "lib/rack.rb", "RACK = 'FAIL'"
end
end
end
context "when the same version of the same gem is in multiple sources" do
let(:repo3_rack_version) { "1.0.0" }
before do
gemfile <<-G
source "file://#{gem_repo3}"
source "file://#{gem_repo1}"
gem "rack-obama"
gem "rack"
G
end
it "warns about ambiguous gems, but installs anyway, prioritizing sources last to first" do
bundle :install
expect(out).to include("Warning: the gem 'rack' was found in multiple sources.")
expect(out).to include("Installed from: file:#{gem_repo1}")
should_be_installed("rack-obama 1.0.0", "rack 1.0.0")
end
end
context "when different versions of the same gem are in multiple sources" do
let(:repo3_rack_version) { "1.2" }
before do
gemfile <<-G
source "file://#{gem_repo3}"
source "file://#{gem_repo1}"
gem "rack-obama"
gem "rack", "1.0.0" # force it to install the working version in repo1
G
end
it "warns about ambiguous gems, but installs anyway" do
bundle :install
expect(out).to include("Warning: the gem 'rack' was found in multiple sources.")
expect(out).to include("Installed from: file:#{gem_repo1}")
should_be_installed("rack-obama 1.0.0", "rack 1.0.0")
end
end
end
context "with source affinity" do
context "with sources given by a block" do
before do
# Oh no! Someone evil is trying to hijack rack :(
# need this to be broken to check for correct source ordering
build_repo gem_repo3 do
build_gem "rack", "1.0.0" do |s|
s.write "lib/rack.rb", "RACK = 'FAIL'"
end
end
gemfile <<-G
source "file://#{gem_repo3}"
source "file://#{gem_repo1}" do
gem "rack"
end
gem "rack-obama" # shoud come from repo3!
G
end
it "installs the gems without any warning" do
bundle :install
expect(out).not_to include("Warning")
should_be_installed("rack-obama 1.0.0", "rack 1.0.0")
end
end
context "with sources set by an option" do
before do
# Oh no! Someone evil is trying to hijack rack :(
# need this to be broken to check for correct source ordering
build_repo gem_repo3 do
build_gem "rack", "1.0.0" do |s|
s.write "lib/rack.rb", "RACK = 'FAIL'"
end
end
gemfile <<-G
source "file://#{gem_repo3}"
gem "rack-obama" # should come from repo3!
gem "rack", :source => "file://#{gem_repo1}"
G
end
it "installs the gems without any warning" do
bundle :install
expect(out).not_to include("Warning")
should_be_installed("rack-obama 1.0.0", "rack 1.0.0")
end
end
context "with an indirect dependency" do
before do
build_repo gem_repo3 do
build_gem "depends_on_rack", "1.0.1" do |s|
s.add_dependency "rack"
end
end
end
context "when the indirect dependency is in the pinned source" do
before do
# we need a working rack gem in repo3
update_repo gem_repo3 do
build_gem "rack", "1.0.0"
end
gemfile <<-G
source "file://#{gem_repo2}"
source "file://#{gem_repo3}" do
gem "depends_on_rack"
end
G
end
context "and not in any other sources" do
before do
build_repo(gem_repo2) {}
end
it "installs from the same source without any warning" do
bundle :install
expect(out).not_to include("Warning")
should_be_installed("depends_on_rack 1.0.1", "rack 1.0.0")
end
end
context "and in another source" do
before do
# need this to be broken to check for correct source ordering
build_repo gem_repo2 do
build_gem "rack", "1.0.0" do |s|
s.write "lib/rack.rb", "RACK = 'FAIL'"
end
end
end
it "installs from the same source without any warning" do
bundle :install
expect(out).not_to include("Warning")
should_be_installed("depends_on_rack 1.0.1", "rack 1.0.0")
end
end
end
context "when the indirect dependency is in a different source" do
before do
# In these tests, we need a working rack gem in repo2 and not repo3
build_repo gem_repo2 do
build_gem "rack", "1.0.0"
end
end
context "and not in any other sources" do
before do
gemfile <<-G
source "file://#{gem_repo2}"
source "file://#{gem_repo3}" do
gem "depends_on_rack"
end
G
end
it "installs from the other source without any warning" do
bundle :install
expect(out).not_to include("Warning")
should_be_installed("depends_on_rack 1.0.1", "rack 1.0.0")
end
end
context "and in yet another source" do
before do
gemfile <<-G
source "file://#{gem_repo1}"
source "file://#{gem_repo2}"
source "file://#{gem_repo3}" do
gem "depends_on_rack"
end
G
end
it "installs from the other source and warns about ambiguous gems" do
bundle :install
expect(out).to include("Warning: the gem 'rack' was found in multiple sources.")
expect(out).to include("Installed from: file:#{gem_repo2}")
should_be_installed("depends_on_rack 1.0.1", "rack 1.0.0")
end
end
end
end
context "with a gem that is only found in the wrong source" do
before do
build_repo gem_repo3 do
build_gem "not_in_repo1", "1.0.0"
end
gemfile <<-G
source "file://#{gem_repo3}"
gem "not_in_repo1", :source => "file://#{gem_repo1}"
G
end
it "does not install the gem" do
bundle :install
expect(out).to include("Could not find gem 'not_in_repo1 (>= 0) ruby'")
end
end
end
context "when an older version of the same gem also ships with Ruby" do
before do
system_gems "rack-0.9.1"
gemfile <<-G
source "file://#{gem_repo1}"
gem "rack" # shoud come from repo1!
G
end
it "installs the gems without any warning" do
bundle :install
expect(out).not_to include("Warning")
should_be_installed("rack 1.0.0")
end
end
end