diff options
Diffstat (limited to 'spec/bundler/commands/update_spec.rb')
-rw-r--r-- | spec/bundler/commands/update_spec.rb | 838 |
1 files changed, 0 insertions, 838 deletions
diff --git a/spec/bundler/commands/update_spec.rb b/spec/bundler/commands/update_spec.rb deleted file mode 100644 index 33679dd649..0000000000 --- a/spec/bundler/commands/update_spec.rb +++ /dev/null @@ -1,838 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe "bundle update" do - before :each do - build_repo2 - - install_gemfile <<-G - source "file://#{gem_repo2}" - gem "activesupport" - gem "rack-obama" - G - end - - describe "with no arguments", :bundler => "< 2" do - it "updates the entire bundle" do - update_repo2 do - build_gem "activesupport", "3.0" - end - - bundle "update" - expect(out).to include("Bundle updated!") - expect(the_bundle).to include_gems "rack 1.2", "rack-obama 1.0", "activesupport 3.0" - end - - it "doesn't delete the Gemfile.lock file if something goes wrong" do - gemfile <<-G - source "file://#{gem_repo2}" - gem "activesupport" - gem "rack-obama" - exit! - G - bundle "update" - expect(bundled_app("Gemfile.lock")).to exist - end - end - - describe "with --all", :bundler => "2" do - it "updates the entire bundle" do - update_repo2 do - build_gem "activesupport", "3.0" - end - - bundle! "update", :all => true - expect(out).to include("Bundle updated!") - expect(the_bundle).to include_gems "rack 1.2", "rack-obama 1.0", "activesupport 3.0" - end - - it "doesn't delete the Gemfile.lock file if something goes wrong" do - gemfile <<-G - source "file://#{gem_repo2}" - gem "activesupport" - gem "rack-obama" - exit! - G - bundle "update", :all => true - expect(bundled_app("Gemfile.lock")).to exist - end - end - - context "when update_requires_all_flag is set" do - before { bundle! "config update_requires_all_flag true" } - - it "errors when passed nothing" do - install_gemfile! "" - bundle :update - expect(out).to eq("To update everything, pass the `--all` flag.") - end - - it "errors when passed --all and another option" do - install_gemfile! "" - bundle "update --all foo" - expect(out).to eq("Cannot specify --all along with specific options.") - end - - it "updates everything when passed --all" do - install_gemfile! "" - bundle "update --all" - expect(out).to include("Bundle updated!") - end - end - - describe "--quiet argument" do - it "hides UI messages" do - bundle "update --quiet" - expect(out).not_to include("Bundle updated!") - end - end - - describe "with a top level dependency" do - it "unlocks all child dependencies that are unrelated to other locked dependencies" do - update_repo2 do - build_gem "activesupport", "3.0" - end - - bundle "update rack-obama" - expect(the_bundle).to include_gems "rack 1.2", "rack-obama 1.0", "activesupport 2.3.5" - end - end - - describe "with an unknown dependency" do - it "should inform the user" do - bundle "update halting-problem-solver" - expect(out).to include "Could not find gem 'halting-problem-solver'" - end - it "should suggest alternatives" do - bundle "update active-support" - expect(out).to include "Did you mean activesupport?" - end - end - - describe "with a child dependency" do - it "should update the child dependency" do - update_repo2 - bundle "update rack" - expect(the_bundle).to include_gems "rack 1.2" - end - end - - describe "when a possible resolve requires an older version of a locked gem" do - context "and only_update_to_newer_versions is set" do - before do - bundle! "config only_update_to_newer_versions true" - end - it "does not go to an older version" do - build_repo4 do - build_gem "a" do |s| - s.add_dependency "b" - s.add_dependency "c" - end - build_gem "b" - build_gem "c" - build_gem "c", "2.0" - end - - install_gemfile! <<-G - source "file:#{gem_repo4}" - gem "a" - G - - expect(the_bundle).to include_gems("a 1.0", "b 1.0", "c 2.0") - - update_repo4 do - build_gem "b", "2.0" do |s| - s.add_dependency "c", "< 2" - end - end - - bundle! "update", :all => bundle_update_requires_all? - - expect(the_bundle).to include_gems("a 1.0", "b 1.0", "c 2.0") - end - end - end - - describe "with --local option" do - it "doesn't hit repo2" do - FileUtils.rm_rf(gem_repo2) - - bundle "update --local --all" - expect(out).not_to include("Fetching source index") - end - end - - describe "with --group option" do - it "should update only specified group gems" do - install_gemfile <<-G - source "file://#{gem_repo2}" - gem "activesupport", :group => :development - gem "rack" - G - update_repo2 do - build_gem "activesupport", "3.0" - end - bundle "update --group development" - expect(the_bundle).to include_gems "activesupport 3.0" - expect(the_bundle).not_to include_gems "rack 1.2" - end - - context "when there is a source with the same name as a gem in a group" do - before :each do - build_git "foo", :path => lib_path("activesupport") - install_gemfile <<-G - source "file://#{gem_repo2}" - gem "activesupport", :group => :development - gem "foo", :git => "#{lib_path("activesupport")}" - G - end - - it "should not update the gems from that source" do - update_repo2 { build_gem "activesupport", "3.0" } - update_git "foo", "2.0", :path => lib_path("activesupport") - - bundle "update --group development" - expect(the_bundle).to include_gems "activesupport 3.0" - expect(the_bundle).not_to include_gems "foo 2.0" - end - end - - context "when bundler itself is a transitive dependency" do - it "executes without error" do - install_gemfile <<-G - source "file://#{gem_repo1}" - gem "activesupport", :group => :development - gem "rack" - G - update_repo2 do - build_gem "activesupport", "3.0" - end - bundle "update --group development" - expect(the_bundle).to include_gems "activesupport 2.3.5" - expect(the_bundle).to include_gems "bundler #{Bundler::VERSION}" - expect(the_bundle).not_to include_gems "rack 1.2" - end - end - end - - describe "in a frozen bundle" do - it "should fail loudly", :bundler => "< 2" do - bundle! "install --deployment" - bundle "update", :all => bundle_update_requires_all? - - expect(last_command).to be_failure - expect(out).to match(/You are trying to install in deployment mode after changing.your Gemfile/m) - expect(out).to match(/freeze \nby running `bundle install --no-deployment`./m) - end - - it "should suggest different command when frozen is set globally", :bundler => "< 2" do - bundle! "config --global frozen 1" - bundle "update", :all => bundle_update_requires_all? - expect(out).to match(/You are trying to install in deployment mode after changing.your Gemfile/m). - and match(/freeze \nby running `bundle config --delete frozen`./m) - end - - it "should suggest different command when frozen is set globally", :bundler => "2" do - bundle! "config --global deployment true" - bundle "update", :all => bundle_update_requires_all? - expect(out).to match(/You are trying to install in deployment mode after changing.your Gemfile/m). - and match(/freeze \nby running `bundle config --delete deployment`./m) - end - end - - describe "with --source option" do - it "should not update gems not included in the source that happen to have the same name", :bundler => "< 2" do - install_gemfile! <<-G - source "file://#{gem_repo2}" - gem "activesupport" - G - update_repo2 { build_gem "activesupport", "3.0" } - - bundle! "update --source activesupport" - expect(the_bundle).to include_gem "activesupport 3.0" - end - - it "should not update gems not included in the source that happen to have the same name", :bundler => "2" do - install_gemfile! <<-G - source "file://#{gem_repo2}" - gem "activesupport" - G - update_repo2 { build_gem "activesupport", "3.0" } - - bundle! "update --source activesupport" - expect(the_bundle).not_to include_gem "activesupport 3.0" - end - - context "with unlock_source_unlocks_spec set to false" do - before { bundle! "config unlock_source_unlocks_spec false" } - - it "should not update gems not included in the source that happen to have the same name" do - install_gemfile <<-G - source "file://#{gem_repo2}" - gem "activesupport" - G - update_repo2 { build_gem "activesupport", "3.0" } - - bundle "update --source activesupport" - expect(the_bundle).not_to include_gems "activesupport 3.0" - end - end - end - - context "when there is a child dependency that is also in the gemfile" do - before do - build_repo2 do - build_gem "fred", "1.0" - build_gem "harry", "1.0" do |s| - s.add_dependency "fred" - end - end - - install_gemfile <<-G - source "file://#{gem_repo2}" - gem "harry" - gem "fred" - G - end - - it "should not update the child dependencies of a gem that has the same name as the source", :bundler => "< 2" do - update_repo2 do - build_gem "fred", "2.0" - build_gem "harry", "2.0" do |s| - s.add_dependency "fred" - end - end - - bundle "update --source harry" - expect(the_bundle).to include_gems "harry 2.0" - expect(the_bundle).to include_gems "fred 1.0" - end - - it "should not update the child dependencies of a gem that has the same name as the source", :bundler => "2" do - update_repo2 do - build_gem "fred", "2.0" - build_gem "harry", "2.0" do |s| - s.add_dependency "fred" - end - end - - bundle "update --source harry" - expect(the_bundle).to include_gems "harry 1.0", "fred 1.0" - end - end - - context "when there is a child dependency that appears elsewhere in the dependency graph" do - before do - build_repo2 do - build_gem "fred", "1.0" do |s| - s.add_dependency "george" - end - build_gem "george", "1.0" - build_gem "harry", "1.0" do |s| - s.add_dependency "george" - end - end - - install_gemfile <<-G - source "file://#{gem_repo2}" - gem "harry" - gem "fred" - G - end - - it "should not update the child dependencies of a gem that has the same name as the source", :bundler => "< 2" do - update_repo2 do - build_gem "george", "2.0" - build_gem "harry", "2.0" do |s| - s.add_dependency "george" - end - end - - bundle "update --source harry" - expect(the_bundle).to include_gems "harry 2.0" - expect(the_bundle).to include_gems "fred 1.0" - expect(the_bundle).to include_gems "george 1.0" - end - - it "should not update the child dependencies of a gem that has the same name as the source", :bundler => "2" do - update_repo2 do - build_gem "george", "2.0" - build_gem "harry", "2.0" do |s| - s.add_dependency "george" - end - end - - bundle "update --source harry" - expect(the_bundle).to include_gems "harry 1.0", "fred 1.0", "george 1.0" - end - end -end - -RSpec.describe "bundle update in more complicated situations" do - before :each do - build_repo2 - end - - it "will eagerly unlock dependencies of a specified gem" do - install_gemfile <<-G - source "file://#{gem_repo2}" - - gem "thin" - gem "rack-obama" - G - - update_repo2 do - build_gem "thin", "2.0" do |s| - s.add_dependency "rack" - end - end - - bundle "update thin" - expect(the_bundle).to include_gems "thin 2.0", "rack 1.2", "rack-obama 1.0" - end - - it "will warn when some explicitly updated gems are not updated" do - install_gemfile! <<-G - source "file:#{gem_repo2}" - - gem "thin" - gem "rack-obama" - G - - update_repo2 do - build_gem("thin", "2.0") {|s| s.add_dependency "rack" } - build_gem "rack", "10.0" - end - - bundle! "update thin rack-obama" - expect(last_command.stdboth).to include "Bundler attempted to update rack-obama but its version stayed the same" - expect(the_bundle).to include_gems "thin 2.0", "rack 10.0", "rack-obama 1.0" - end - - it "will update only from pinned source" do - install_gemfile <<-G - source "file://#{gem_repo2}" - - source "file://#{gem_repo1}" do - gem "thin" - end - G - - update_repo2 do - build_gem "thin", "2.0" - end - - bundle "update" - expect(the_bundle).to include_gems "thin 1.0" - end -end - -RSpec.describe "bundle update without a Gemfile.lock" do - it "should not explode" do - build_repo2 - - gemfile <<-G - source "file://#{gem_repo2}" - - gem "rack", "1.0" - G - - bundle "update", :all => bundle_update_requires_all? - - expect(the_bundle).to include_gems "rack 1.0.0" - end -end - -RSpec.describe "bundle update when a gem depends on a newer version of bundler" do - before(:each) do - build_repo2 do - build_gem "rails", "3.0.1" do |s| - s.add_dependency "bundler", Bundler::VERSION.succ - end - end - - gemfile <<-G - source "file://#{gem_repo2}" - gem "rails", "3.0.1" - G - end - - it "should explain that bundler conflicted", :bundler => "< 2" do - bundle "update", :all => bundle_update_requires_all? - expect(last_command.stdboth).not_to match(/in snapshot/i) - expect(last_command.bundler_err).to match(/current Bundler version/i). - and match(/perhaps you need to update bundler/i) - end - - it "should warn that the newer version of Bundler would conflict", :bundler => "2" do - bundle! "update", :all => true - expect(last_command.bundler_err).to include("rails (3.0.1) has dependency bundler"). - and include("so the dependency is being ignored") - expect(the_bundle).to include_gem "rails 3.0.1" - end -end - -RSpec.describe "bundle update" do - it "shows the previous version of the gem when updated from rubygems source", :bundler => "< 2" do - build_repo2 - - install_gemfile <<-G - source "file://#{gem_repo2}" - gem "activesupport" - G - - bundle "update", :all => bundle_update_requires_all? - expect(out).to include("Using activesupport 2.3.5") - - update_repo2 do - build_gem "activesupport", "3.0" - end - - bundle "update", :all => bundle_update_requires_all? - expect(out).to include("Installing activesupport 3.0 (was 2.3.5)") - end - - context "with suppress_install_using_messages set" do - before { bundle! "config suppress_install_using_messages true" } - - it "only prints `Using` for versions that have changed" do - build_repo4 do - build_gem "bar" - build_gem "foo" - end - - install_gemfile! <<-G - source "file://#{gem_repo4}" - gem "bar" - gem "foo" - G - - bundle! "update", :all => bundle_update_requires_all? - out.gsub!(/RubyGems [\d\.]+ is not threadsafe.*\n?/, "") - expect(out).to include "Resolving dependencies...\nBundle updated!" - - update_repo4 do - build_gem "foo", "2.0" - end - - bundle! "update", :all => bundle_update_requires_all? - out.sub!("Removing foo (1.0)\n", "") - out.gsub!(/RubyGems [\d\.]+ is not threadsafe.*\n?/, "") - expect(out).to include strip_whitespace(<<-EOS).strip - Resolving dependencies... - Fetching foo 2.0 (was 1.0) - Installing foo 2.0 (was 1.0) - Bundle updated - EOS - end - end - - it "shows error message when Gemfile.lock is not preset and gem is specified" do - install_gemfile <<-G - source "file://#{gem_repo2}" - gem "activesupport" - G - - bundle "update nonexisting" - expect(out).to include("This Bundle hasn't been installed yet. Run `bundle install` to update and install the bundled gems.") - expect(exitstatus).to eq(22) if exitstatus - end -end - -RSpec.describe "bundle update --ruby" do - before do - install_gemfile <<-G - ::RUBY_VERSION = '2.1.3' - ::RUBY_PATCHLEVEL = 100 - ruby '~> 2.1.0' - G - bundle "update --ruby" - end - - context "when the Gemfile removes the ruby" do - before do - install_gemfile <<-G - ::RUBY_VERSION = '2.1.4' - ::RUBY_PATCHLEVEL = 222 - G - end - it "removes the Ruby from the Gemfile.lock" do - bundle "update --ruby" - - lockfile_should_be <<-L - GEM - specs: - - PLATFORMS - #{lockfile_platforms} - - DEPENDENCIES - - BUNDLED WITH - #{Bundler::VERSION} - L - end - end - - context "when the Gemfile specified an updated Ruby version" do - before do - install_gemfile <<-G - ::RUBY_VERSION = '2.1.4' - ::RUBY_PATCHLEVEL = 222 - ruby '~> 2.1.0' - G - end - it "updates the Gemfile.lock with the latest version" do - bundle "update --ruby" - - lockfile_should_be <<-L - GEM - specs: - - PLATFORMS - #{lockfile_platforms} - - DEPENDENCIES - - RUBY VERSION - ruby 2.1.4p222 - - BUNDLED WITH - #{Bundler::VERSION} - L - end - end - - context "when a different Ruby is being used than has been versioned" do - before do - install_gemfile <<-G - ::RUBY_VERSION = '2.2.2' - ::RUBY_PATCHLEVEL = 505 - ruby '~> 2.1.0' - G - end - it "shows a helpful error message" do - bundle "update --ruby" - - expect(out).to include("Your Ruby version is 2.2.2, but your Gemfile specified ~> 2.1.0") - end - end - - context "when updating Ruby version and Gemfile `ruby`" do - before do - install_gemfile <<-G - ::RUBY_VERSION = '1.8.3' - ::RUBY_PATCHLEVEL = 55 - ruby '~> 1.8.0' - G - end - it "updates the Gemfile.lock with the latest version" do - bundle "update --ruby" - - lockfile_should_be <<-L - GEM - specs: - - PLATFORMS - #{lockfile_platforms} - - DEPENDENCIES - - RUBY VERSION - ruby 1.8.3p55 - - BUNDLED WITH - #{Bundler::VERSION} - L - end - end -end - -RSpec.describe "bundle update --bundler" do - it "updates the bundler version in the lockfile without re-resolving" do - build_repo4 do - build_gem "rack", "1.0" - end - - install_gemfile! <<-G - source "file:#{gem_repo4}" - gem "rack" - G - lockfile lockfile.sub(/(^\s*)#{Bundler::VERSION}($)/, '\11.0.0\2') - - FileUtils.rm_r gem_repo4 - - bundle! :update, :bundler => true, :verbose => true - expect(the_bundle).to include_gem "rack 1.0" - - expect(the_bundle.locked_gems.bundler_version).to eq v(Bundler::VERSION) - end -end - -# these specs are slow and focus on integration and therefore are not exhaustive. unit specs elsewhere handle that. -RSpec.describe "bundle update conservative" do - context "patch and minor options" do - before do - build_repo4 do - build_gem "foo", %w[1.4.3 1.4.4] do |s| - s.add_dependency "bar", "~> 2.0" - end - build_gem "foo", %w[1.4.5 1.5.0] do |s| - s.add_dependency "bar", "~> 2.1" - end - build_gem "foo", %w[1.5.1] do |s| - s.add_dependency "bar", "~> 3.0" - end - build_gem "bar", %w[2.0.3 2.0.4 2.0.5 2.1.0 2.1.1 3.0.0] - build_gem "qux", %w[1.0.0 1.0.1 1.1.0 2.0.0] - end - - # establish a lockfile set to 1.4.3 - install_gemfile <<-G - source "file://#{gem_repo4}" - gem 'foo', '1.4.3' - gem 'bar', '2.0.3' - gem 'qux', '1.0.0' - G - - # remove 1.4.3 requirement and bar altogether - # to setup update specs below - gemfile <<-G - source "file://#{gem_repo4}" - gem 'foo' - gem 'qux' - G - end - - context "patch preferred" do - it "single gem updates dependent gem to minor" do - bundle! "update --patch foo" - - expect(the_bundle).to include_gems "foo 1.4.5", "bar 2.1.1", "qux 1.0.0" - end - - it "update all" do - bundle! "update --patch", :all => bundle_update_requires_all? - - expect(the_bundle).to include_gems "foo 1.4.5", "bar 2.1.1", "qux 1.0.1" - end - end - - context "minor preferred" do - it "single gem updates dependent gem to major" do - bundle! "update --minor foo" - - expect(the_bundle).to include_gems "foo 1.5.1", "bar 3.0.0", "qux 1.0.0" - end - end - - context "strict" do - it "patch preferred" do - bundle! "update --patch foo bar --strict" - - expect(the_bundle).to include_gems "foo 1.4.4", "bar 2.0.5", "qux 1.0.0" - end - - it "minor preferred" do - bundle! "update --minor --strict", :all => bundle_update_requires_all? - - expect(the_bundle).to include_gems "foo 1.5.0", "bar 2.1.1", "qux 1.1.0" - end - end - end - - context "eager unlocking" do - before do - build_repo4 do - build_gem "isolated_owner", %w[1.0.1 1.0.2] do |s| - s.add_dependency "isolated_dep", "~> 2.0" - end - build_gem "isolated_dep", %w[2.0.1 2.0.2] - - build_gem "shared_owner_a", %w[3.0.1 3.0.2] do |s| - s.add_dependency "shared_dep", "~> 5.0" - end - build_gem "shared_owner_b", %w[4.0.1 4.0.2] do |s| - s.add_dependency "shared_dep", "~> 5.0" - end - build_gem "shared_dep", %w[5.0.1 5.0.2] - end - - gemfile <<-G - source "file://#{gem_repo4}" - gem 'isolated_owner' - - gem 'shared_owner_a' - gem 'shared_owner_b' - G - - lockfile <<-L - GEM - remote: file://#{gem_repo4} - specs: - isolated_dep (2.0.1) - isolated_owner (1.0.1) - isolated_dep (~> 2.0) - shared_dep (5.0.1) - shared_owner_a (3.0.1) - shared_dep (~> 5.0) - shared_owner_b (4.0.1) - shared_dep (~> 5.0) - - PLATFORMS - ruby - - DEPENDENCIES - shared_owner_a - shared_owner_b - isolated_owner - - BUNDLED WITH - 1.13.0 - L - end - - it "should eagerly unlock isolated dependency" do - bundle "update isolated_owner" - - expect(the_bundle).to include_gems "isolated_owner 1.0.2", "isolated_dep 2.0.2", "shared_dep 5.0.1", "shared_owner_a 3.0.1", "shared_owner_b 4.0.1" - end - - it "should eagerly unlock shared dependency" do - bundle "update shared_owner_a" - - expect(the_bundle).to include_gems "isolated_owner 1.0.1", "isolated_dep 2.0.1", "shared_dep 5.0.2", "shared_owner_a 3.0.2", "shared_owner_b 4.0.1" - end - - it "should not eagerly unlock with --conservative" do - bundle "update --conservative shared_owner_a isolated_owner" - - expect(the_bundle).to include_gems "isolated_owner 1.0.2", "isolated_dep 2.0.2", "shared_dep 5.0.1", "shared_owner_a 3.0.2", "shared_owner_b 4.0.1" - end - - it "should match bundle install conservative update behavior when not eagerly unlocking" do - gemfile <<-G - source "file://#{gem_repo4}" - gem 'isolated_owner', '1.0.2' - - gem 'shared_owner_a', '3.0.2' - gem 'shared_owner_b' - G - - bundle "install" - - expect(the_bundle).to include_gems "isolated_owner 1.0.2", "isolated_dep 2.0.2", "shared_dep 5.0.1", "shared_owner_a 3.0.2", "shared_owner_b 4.0.1" - end - end - - context "error handling" do - before do - gemfile "" - end - - it "raises if too many flags are provided" do - bundle "update --patch --minor", :all => bundle_update_requires_all? - - expect(last_command.bundler_err).to eq "Provide only one of the following options: minor, patch" - end - end -end |