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

387 lines
9.7 KiB
Ruby

require "spec_helper"
describe "bundle install with gem sources" do
describe "the simple case" do
it "prints output and returns if no dependencies are specified" do
gemfile <<-G
source "file://#{gem_repo1}"
G
bundle :install
expect(out).to match(/no dependencies/)
end
it "does not make a lockfile if the install fails" do
install_gemfile <<-G, :expect_err => true
raise StandardError, "FAIL"
G
expect(err).to match(/FAIL \(StandardError\)/)
expect(bundled_app("Gemfile.lock")).not_to exist
end
it "creates a Gemfile.lock" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "rack"
G
expect(bundled_app('Gemfile.lock')).to exist
end
it "creates lock files based on the Gemfile name" do
gemfile bundled_app('OmgFile'), <<-G
source "file://#{gem_repo1}"
gem "rack", "1.0"
G
bundle 'install --gemfile OmgFile'
expect(bundled_app("OmgFile.lock")).to exist
end
it "doesn't delete the lockfile if one already exists" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem 'rack'
G
lockfile = File.read(bundled_app("Gemfile.lock"))
install_gemfile <<-G, :expect_err => true
raise StandardError, "FAIL"
G
expect(File.read(bundled_app("Gemfile.lock"))).to eq(lockfile)
end
it "does not touch the lockfile if nothing changed" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "rack"
G
expect { run '1' }.not_to change { File.mtime(bundled_app('Gemfile.lock')) }
end
it "fetches gems" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem 'rack'
G
expect(default_bundle_path("gems/rack-1.0.0")).to exist
should_be_installed("rack 1.0.0")
end
it "fetches gems when multiple versions are specified" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem 'rack', "> 0.9", "< 1.0"
G
expect(default_bundle_path("gems/rack-0.9.1")).to exist
should_be_installed("rack 0.9.1")
end
it "fetches gems when multiple versions are specified take 2" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem 'rack', "< 1.0", "> 0.9"
G
expect(default_bundle_path("gems/rack-0.9.1")).to exist
should_be_installed("rack 0.9.1")
end
it "raises an appropriate error when gems are specified using symbols" do
status = install_gemfile(<<-G, :exitstatus => true)
source "file://#{gem_repo1}"
gem :rack
G
expect(status).to eq(4)
end
it "pulls in dependencies" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "rails"
G
should_be_installed "actionpack 2.3.2", "rails 2.3.2"
end
it "does the right version" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "rack", "0.9.1"
G
should_be_installed "rack 0.9.1"
end
it "does not install the development dependency" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "with_development_dependency"
G
should_be_installed "with_development_dependency 1.0.0"
should_not_be_installed "activesupport 2.3.5"
end
it "resolves correctly" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "activemerchant"
gem "rails"
G
should_be_installed "activemerchant 1.0", "activesupport 2.3.2", "actionpack 2.3.2"
end
it "activates gem correctly according to the resolved gems" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "activesupport", "2.3.5"
G
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "activemerchant"
gem "rails"
G
should_be_installed "activemerchant 1.0", "activesupport 2.3.2", "actionpack 2.3.2"
end
it "does not reinstall any gem that is already available locally" do
system_gems "activesupport-2.3.2"
build_repo2 do
build_gem "activesupport", "2.3.2" do |s|
s.write "lib/activesupport.rb", "ACTIVESUPPORT = 'fail'"
end
end
install_gemfile <<-G
source "file://#{gem_repo2}"
gem "activerecord", "2.3.2"
G
should_be_installed "activesupport 2.3.2"
end
it "works when the gemfile specifies gems that only exist in the system" do
build_gem "foo", :to_system => true
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "rack"
gem "foo"
G
should_be_installed "rack 1.0.0", "foo 1.0.0"
end
it "prioritizes local gems over remote gems" do
build_gem 'rack', '1.0.0', :to_system => true do |s|
s.add_dependency "activesupport", "2.3.5"
end
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "rack"
G
should_be_installed "rack 1.0.0", "activesupport 2.3.5"
end
describe "with a gem that installs multiple platforms" do
it "installs gems for the local platform as first choice" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "platform_specific"
G
run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
expect(out).to eq("1.0.0 #{Gem::Platform.local}")
end
it "falls back on plain ruby" do
simulate_platform "foo-bar-baz"
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "platform_specific"
G
run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
expect(out).to eq("1.0.0 RUBY")
end
it "installs gems for java" do
simulate_platform "java"
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "platform_specific"
G
run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
expect(out).to eq("1.0.0 JAVA")
end
it "installs gems for windows" do
simulate_platform mswin
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "platform_specific"
G
run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
expect(out).to eq("1.0.0 MSWIN")
end
end
describe "doing bundle install foo" do
before do
gemfile <<-G
source "file://#{gem_repo1}"
gem "rack"
G
end
it "works" do
bundle "install --path vendor"
should_be_installed "rack 1.0"
end
it "allows running bundle install --system without deleting foo" do
bundle "install --path vendor"
bundle "install --system"
FileUtils.rm_rf(bundled_app("vendor"))
should_be_installed "rack 1.0"
end
it "allows running bundle install --system after deleting foo" do
bundle "install --path vendor"
FileUtils.rm_rf(bundled_app("vendor"))
bundle "install --system"
should_be_installed "rack 1.0"
end
end
it "finds gems in multiple sources" do
build_repo2
update_repo2
install_gemfile <<-G
source "file://#{gem_repo1}"
source "file://#{gem_repo2}"
gem "activesupport", "1.2.3"
gem "rack", "1.2"
G
should_be_installed "rack 1.2", "activesupport 1.2.3"
end
it "gives a useful error if no sources are set" do
install_gemfile <<-G
gem "rack"
G
bundle :install, :expect_err => true
expect(out).to match(/Your Gemfile has no gem server sources/i)
end
it "creates a Gemfile.lock on a blank Gemfile" do
install_gemfile <<-G
G
expect(File.exist?(bundled_app("Gemfile.lock"))).to eq(true)
end
it "gracefully handles error when rubygems server is unavailable" do
install_gemfile <<-G
source "file://#{gem_repo1}"
source "http://localhost:9384"
gem 'foo'
G
bundle :install
expect(out).to include("Could not fetch specs from http://localhost:9384/")
expect(out).not_to include("file://")
end
it "doesn't blow up when the local .bundle/config is empty" do
FileUtils.mkdir_p(bundled_app(".bundle"))
FileUtils.touch(bundled_app(".bundle/config"))
install_gemfile(<<-G, :exitstatus => true)
source "file://#{gem_repo1}"
gem 'foo'
G
expect(exitstatus).to eq(0)
end
it "doesn't blow up when the global .bundle/config is empty" do
FileUtils.mkdir_p("#{Bundler.rubygems.user_home}/.bundle")
FileUtils.touch("#{Bundler.rubygems.user_home}/.bundle/config")
install_gemfile(<<-G, :exitstatus => true)
source "file://#{gem_repo1}"
gem 'foo'
G
expect(exitstatus).to eq(0)
end
end
describe "when Bundler root contains regex chars" do
before do
root_dir = tmp("foo[]bar")
FileUtils.mkdir_p(root_dir)
in_app_root_custom(root_dir)
end
it "doesn't blow up" do
build_lib "foo"
gemfile = <<-G
gem 'foo', :path => "#{lib_path('foo-1.0')}"
G
File.open('Gemfile', 'w') do |file|
file.puts gemfile
end
bundle :install, :exitstatus => true
expect(exitstatus).to eq(0)
end
end
describe "when requesting a quiet install via --quiet" do
it "should be quiet if there are no warnings" do
gemfile <<-G
source "file://#{gem_repo1}"
gem 'rack'
G
bundle :install, :quiet => true
expect(out).to eq("")
end
it "should still display warnings" do
gemfile <<-G
gem 'rack'
G
bundle :install, :quiet => true
expect(out).to match(/Your Gemfile has no gem server sources/)
end
end
end