1require 'rubygems/test_case' 2require 'rubygems/commands/install_command' 3require 'rubygems/rdoc' 4 5class TestGemCommandsInstallCommand < Gem::TestCase 6 7 def setup 8 super 9 10 @cmd = Gem::Commands::InstallCommand.new 11 @cmd.options[:document] = [] 12 13 @gemdeps = "tmp_install_gemdeps" 14 @orig_args = Gem::Command.build_args 15 end 16 17 def teardown 18 super 19 20 Gem::Command.build_args = @orig_args 21 File.unlink @gemdeps if File.file? @gemdeps 22 end 23 24 def test_execute_exclude_prerelease 25 util_setup_fake_fetcher :prerelease 26 util_setup_spec_fetcher 27 28 @fetcher.data["#{@gem_repo}gems/#{@a2.file_name}"] = 29 read_binary(@a2.cache_file) 30 @fetcher.data["#{@gem_repo}gems/#{@a2_pre.file_name}"] = 31 read_binary(@a2_pre.cache_file) 32 33 @cmd.options[:args] = [@a2.name] 34 35 use_ui @ui do 36 e = assert_raises Gem::SystemExitException do 37 @cmd.execute 38 end 39 assert_equal 0, e.exit_code, @ui.error 40 end 41 42 assert_equal %w[a-2], @cmd.installed_specs.map { |spec| spec.full_name } 43 end 44 45 def test_execute_explicit_version_includes_prerelease 46 util_setup_fake_fetcher :prerelease 47 util_setup_spec_fetcher 48 49 @fetcher.data["#{@gem_repo}gems/#{@a2.file_name}"] = 50 read_binary(@a2.cache_file) 51 @fetcher.data["#{@gem_repo}gems/#{@a2_pre.file_name}"] = 52 read_binary(@a2_pre.cache_file) 53 54 @cmd.handle_options [@a2_pre.name, '--version', @a2_pre.version.to_s, 55 "--no-ri", "--no-rdoc"] 56 assert @cmd.options[:prerelease] 57 assert @cmd.options[:version].satisfied_by?(@a2_pre.version) 58 59 use_ui @ui do 60 e = assert_raises Gem::SystemExitException do 61 @cmd.execute 62 end 63 assert_equal 0, e.exit_code, @ui.error 64 end 65 66 assert_equal %w[a-2.a], @cmd.installed_specs.map { |spec| spec.full_name } 67 end 68 69 def test_execute_local 70 util_setup_fake_fetcher 71 @cmd.options[:domain] = :local 72 73 FileUtils.mv @a2.cache_file, @tempdir 74 75 @cmd.options[:args] = [@a2.name] 76 77 use_ui @ui do 78 orig_dir = Dir.pwd 79 begin 80 Dir.chdir @tempdir 81 e = assert_raises Gem::SystemExitException do 82 @cmd.execute 83 end 84 assert_equal 0, e.exit_code 85 ensure 86 Dir.chdir orig_dir 87 end 88 end 89 90 assert_equal %w[a-2], @cmd.installed_specs.map { |spec| spec.full_name } 91 92 out = @ui.output.split "\n" 93 assert_equal "1 gem installed", out.shift 94 assert out.empty?, out.inspect 95 end 96 97 def test_execute_no_user_install 98 skip 'skipped on MS Windows (chmod has no effect)' if win_platform? 99 100 util_setup_fake_fetcher 101 @cmd.options[:user_install] = false 102 103 FileUtils.mv @a2.cache_file, @tempdir 104 105 @cmd.options[:args] = [@a2.name] 106 107 use_ui @ui do 108 orig_dir = Dir.pwd 109 begin 110 FileUtils.chmod 0755, @userhome 111 FileUtils.chmod 0555, @gemhome 112 113 Dir.chdir @tempdir 114 assert_raises Gem::FilePermissionError do 115 @cmd.execute 116 end 117 ensure 118 Dir.chdir orig_dir 119 FileUtils.chmod 0755, @gemhome 120 end 121 end 122 end 123 124 def test_execute_local_missing 125 util_setup_fake_fetcher 126 @cmd.options[:domain] = :local 127 128 @cmd.options[:args] = %w[no_such_gem] 129 130 use_ui @ui do 131 e = assert_raises Gem::SystemExitException do 132 @cmd.execute 133 end 134 assert_equal 2, e.exit_code 135 end 136 137 # HACK no repository was checked 138 assert_match(/ould not find a valid gem 'no_such_gem'/, @ui.error) 139 end 140 141 def test_execute_no_gem 142 @cmd.options[:args] = %w[] 143 144 assert_raises Gem::CommandLineError do 145 @cmd.execute 146 end 147 end 148 149 def test_execute_nonexistent 150 util_setup_fake_fetcher 151 util_setup_spec_fetcher 152 153 @cmd.options[:args] = %w[nonexistent] 154 155 use_ui @ui do 156 e = assert_raises Gem::SystemExitException do 157 @cmd.execute 158 end 159 assert_equal 2, e.exit_code 160 end 161 162 assert_match(/ould not find a valid gem 'nonexistent'/, @ui.error) 163 end 164 165 def test_execute_bad_source 166 util_setup_fake_fetcher 167 util_setup_spec_fetcher 168 169 # This is needed because we need to exercise the cache path 170 # within SpecFetcher 171 path = File.join Gem.user_home, '.gem', 'specs', "not-there.nothing%80", 172 "latest_specs.4.8" 173 174 FileUtils.mkdir_p File.dirname(path) 175 176 File.open path, "w" do |f| 177 f.write Marshal.dump([]) 178 end 179 180 Gem.sources.replace ["http://not-there.nothing"] 181 182 @cmd.options[:args] = %w[nonexistent] 183 184 use_ui @ui do 185 e = assert_raises Gem::SystemExitException do 186 @cmd.execute 187 end 188 assert_equal 2, e.exit_code 189 end 190 191 errs = @ui.error.split("\n") 192 193 assert_match(/ould not find a valid gem 'nonexistent'/, errs.shift) 194 assert_match(%r!Unable to download data from http://not-there.nothing!, errs.shift) 195 end 196 197 def test_execute_nonexistent_with_hint 198 misspelled = "nonexistent_with_hint" 199 correctly_spelled = "non_existent_with_hint" 200 201 util_setup_fake_fetcher 202 util_setup_spec_fetcher quick_spec(correctly_spelled, '2') 203 204 @cmd.options[:args] = [misspelled] 205 206 use_ui @ui do 207 e = assert_raises Gem::SystemExitException do 208 @cmd.execute 209 end 210 211 assert_equal 2, e.exit_code 212 end 213 214 expected = "ERROR: Could not find a valid gem 'nonexistent_with_hint' (>= 0) in any repository 215ERROR: Possible alternatives: non_existent_with_hint 216" 217 218 assert_equal expected, @ui.error 219 end 220 221 def test_execute_nonexistent_with_dashes 222 misspelled = "non-existent_with-hint" 223 correctly_spelled = "nonexistent-with_hint" 224 225 util_setup_fake_fetcher 226 util_setup_spec_fetcher quick_spec(correctly_spelled, '2') 227 228 @cmd.options[:args] = [misspelled] 229 230 use_ui @ui do 231 e = assert_raises Gem::SystemExitException do 232 @cmd.execute 233 end 234 235 assert_equal 2, e.exit_code 236 end 237 238 expected = ["ERROR: Could not find a valid gem 'non-existent_with-hint' (>= 0) in any repository", "ERROR: Possible alternatives: nonexistent-with_hint"] 239 240 output = @ui.error.split "\n" 241 242 assert_equal expected, output 243 end 244 245 def test_execute_conflicting_install_options 246 @cmd.options[:user_install] = true 247 @cmd.options[:install_dir] = "whatever" 248 249 use_ui @ui do 250 assert_raises Gem::MockGemUi::TermError do 251 @cmd.execute 252 end 253 end 254 255 expected = "ERROR: Use --install-dir or --user-install but not both\n" 256 257 assert_equal expected, @ui.error 258 end 259 260 def test_execute_prerelease_skipped_when_no_flag_set 261 util_setup_fake_fetcher :prerelease 262 util_clear_gems 263 util_setup_spec_fetcher @a1, @a2_pre 264 265 @fetcher.data["#{@gem_repo}gems/#{@a1.file_name}"] = 266 read_binary(@a1.cache_file) 267 @fetcher.data["#{@gem_repo}gems/#{@a2_pre.file_name}"] = 268 read_binary(@a2_pre.cache_file) 269 270 @cmd.options[:prerelease] = false 271 @cmd.options[:args] = [@a2_pre.name] 272 273 use_ui @ui do 274 e = assert_raises Gem::SystemExitException do 275 @cmd.execute 276 end 277 assert_equal 0, e.exit_code, @ui.error 278 end 279 280 assert_equal %w[a-1], @cmd.installed_specs.map { |spec| spec.full_name } 281 end 282 283 def test_execute_prerelease_wins_over_previous_ver 284 util_setup_fake_fetcher :prerelease 285 util_clear_gems 286 util_setup_spec_fetcher @a1, @a2_pre 287 288 @fetcher.data["#{@gem_repo}gems/#{@a1.file_name}"] = 289 read_binary(@a1.cache_file) 290 @fetcher.data["#{@gem_repo}gems/#{@a2_pre.file_name}"] = 291 read_binary(@a2_pre.cache_file) 292 293 @cmd.options[:prerelease] = true 294 @cmd.options[:args] = [@a2_pre.name] 295 296 use_ui @ui do 297 e = assert_raises Gem::SystemExitException do 298 @cmd.execute 299 end 300 assert_equal 0, e.exit_code, @ui.error 301 end 302 303 assert_equal %w[a-2.a], @cmd.installed_specs.map { |spec| spec.full_name } 304 end 305 306 def test_execute_prerelease_skipped_when_non_pre_available 307 util_setup_fake_fetcher :prerelease 308 util_clear_gems 309 util_setup_spec_fetcher @a2, @a2_pre 310 311 @fetcher.data["#{@gem_repo}gems/#{@a2.file_name}"] = 312 read_binary(@a2.cache_file) 313 @fetcher.data["#{@gem_repo}gems/#{@a2_pre.file_name}"] = 314 read_binary(@a2_pre.cache_file) 315 316 @cmd.options[:prerelease] = true 317 @cmd.options[:args] = [@a2_pre.name] 318 319 use_ui @ui do 320 e = assert_raises Gem::SystemExitException do 321 @cmd.execute 322 end 323 assert_equal 0, e.exit_code, @ui.error 324 end 325 326 assert_equal %w[a-2], @cmd.installed_specs.map { |spec| spec.full_name } 327 end 328 329 def test_execute_rdoc 330 util_setup_fake_fetcher 331 332 Gem.done_installing(&Gem::RDoc.method(:generation_hook)) 333 334 @cmd.options[:document] = %w[rdoc ri] 335 @cmd.options[:domain] = :local 336 337 FileUtils.mv @a2.cache_file, @tempdir 338 339 @cmd.options[:args] = [@a2.name] 340 341 use_ui @ui do 342 # Don't use Dir.chdir with a block, it warnings a lot because 343 # of a downstream Dir.chdir with a block 344 old = Dir.getwd 345 346 begin 347 Dir.chdir @tempdir 348 e = assert_raises Gem::SystemExitException do 349 @cmd.execute 350 end 351 ensure 352 Dir.chdir old 353 end 354 355 assert_equal 0, e.exit_code 356 end 357 358 wait_for_child_process_to_exit 359 360 assert_path_exists File.join(@a2.doc_dir, 'ri') 361 assert_path_exists File.join(@a2.doc_dir, 'rdoc') 362 end 363 364 def test_execute_saves_build_args 365 util_setup_fake_fetcher 366 367 args = %w!--with-awesome=true --more-awesome=yes! 368 369 Gem::Command.build_args = args 370 371 @cmd.options[:domain] = :local 372 373 FileUtils.mv @a2.cache_file, @tempdir 374 375 @cmd.options[:args] = [@a2.name] 376 377 use_ui @ui do 378 # Don't use Dir.chdir with a block, it warnings a lot because 379 # of a downstream Dir.chdir with a block 380 old = Dir.getwd 381 382 begin 383 Dir.chdir @tempdir 384 e = assert_raises Gem::SystemExitException do 385 @cmd.execute 386 end 387 ensure 388 Dir.chdir old 389 end 390 391 assert_equal 0, e.exit_code 392 end 393 394 path = @a2.build_info_file 395 assert_path_exists path 396 397 assert_equal args, @a2.build_args 398 end 399 400 401 def test_execute_remote 402 util_setup_fake_fetcher 403 util_setup_spec_fetcher 404 405 @fetcher.data["#{@gem_repo}gems/#{@a2.file_name}"] = 406 read_binary(@a2.cache_file) 407 408 @cmd.options[:args] = [@a2.name] 409 410 use_ui @ui do 411 e = assert_raises Gem::SystemExitException do 412 capture_io do 413 @cmd.execute 414 end 415 end 416 assert_equal 0, e.exit_code 417 end 418 419 assert_equal %w[a-2], @cmd.installed_specs.map { |spec| spec.full_name } 420 421 out = @ui.output.split "\n" 422 assert_equal "1 gem installed", out.shift 423 assert out.empty?, out.inspect 424 end 425 426 def test_execute_remote_ignores_files 427 util_setup_fake_fetcher 428 util_setup_spec_fetcher 429 430 @cmd.options[:domain] = :remote 431 432 FileUtils.mv @a2.cache_file, @tempdir 433 434 @fetcher.data["#{@gem_repo}gems/#{@a2.file_name}"] = 435 read_binary(@a1.cache_file) 436 437 @cmd.options[:args] = [@a2.name] 438 439 gemdir = File.join @gemhome, 'specifications' 440 441 a2_gemspec = File.join(gemdir, "a-2.gemspec") 442 a1_gemspec = File.join(gemdir, "a-1.gemspec") 443 444 FileUtils.rm_rf a1_gemspec 445 FileUtils.rm_rf a2_gemspec 446 447 start = Dir["#{gemdir}/*"] 448 449 use_ui @ui do 450 Dir.chdir @tempdir do 451 e = assert_raises Gem::SystemExitException do 452 @cmd.execute 453 end 454 assert_equal 0, e.exit_code 455 end 456 end 457 458 assert_equal %w[a-1], @cmd.installed_specs.map { |spec| spec.full_name } 459 460 out = @ui.output.split "\n" 461 assert_equal "1 gem installed", out.shift 462 assert out.empty?, out.inspect 463 464 fin = Dir["#{gemdir}/*"] 465 466 assert_equal [a1_gemspec], fin - start 467 end 468 469 def test_execute_two 470 util_setup_fake_fetcher 471 @cmd.options[:domain] = :local 472 473 FileUtils.mv @a2.cache_file, @tempdir 474 475 FileUtils.mv @b2.cache_file, @tempdir 476 477 @cmd.options[:args] = [@a2.name, @b2.name] 478 479 use_ui @ui do 480 orig_dir = Dir.pwd 481 begin 482 Dir.chdir @tempdir 483 e = assert_raises Gem::SystemExitException do 484 @cmd.execute 485 end 486 assert_equal 0, e.exit_code 487 ensure 488 Dir.chdir orig_dir 489 end 490 end 491 492 assert_equal %w[a-2 b-2], @cmd.installed_specs.map { |spec| spec.full_name } 493 494 out = @ui.output.split "\n" 495 assert_equal "2 gems installed", out.shift 496 assert out.empty?, out.inspect 497 end 498 499 def test_execute_two_version 500 @cmd.options[:args] = %w[a b] 501 @cmd.options[:version] = Gem::Requirement.new("> 1") 502 503 use_ui @ui do 504 e = assert_raises Gem::MockGemUi::TermError do 505 @cmd.execute 506 end 507 508 assert_equal 1, e.exit_code 509 end 510 511 assert_empty @cmd.installed_specs 512 513 msg = "ERROR: Can't use --version w/ multiple gems. Use name:ver instead." 514 515 assert_empty @ui.output 516 assert_equal msg, @ui.error.chomp 517 end 518 519 def test_execute_conservative 520 util_setup_fake_fetcher 521 util_setup_spec_fetcher 522 523 @fetcher.data["#{@gem_repo}gems/#{@b2.file_name}"] = 524 read_binary(@b2.cache_file) 525 526 uninstall_gem(@b2) 527 528 @cmd.options[:conservative] = true 529 530 @cmd.options[:args] = [@a2.name, @b2.name] 531 532 use_ui @ui do 533 orig_dir = Dir.pwd 534 begin 535 Dir.chdir @tempdir 536 assert_raises Gem::SystemExitException do 537 @cmd.execute 538 end 539 ensure 540 Dir.chdir orig_dir 541 end 542 end 543 544 assert_equal %w[b-2], @cmd.installed_specs.map { |spec| spec.full_name } 545 546 out = @ui.output.split "\n" 547 assert_equal "", @ui.error 548 assert_equal "1 gem installed", out.shift 549 assert out.empty?, out.inspect 550 end 551 552 def test_parses_requirement_from_gemname 553 util_setup_fake_fetcher 554 @cmd.options[:domain] = :local 555 556 FileUtils.mv @a2.cache_file, @tempdir 557 558 FileUtils.mv @b2.cache_file, @tempdir 559 560 req = "#{@a2.name}:10.0" 561 562 @cmd.options[:args] = [req] 563 564 e = nil 565 use_ui @ui do 566 orig_dir = Dir.pwd 567 begin 568 Dir.chdir @tempdir 569 e = assert_raises Gem::SystemExitException do 570 @cmd.execute 571 end 572 ensure 573 Dir.chdir orig_dir 574 end 575 end 576 577 assert_equal 2, e.exit_code 578 assert_match %r!Could not find a valid gem 'a' \(= 10.0\)!, @ui.error 579 end 580 581 def test_show_errors_on_failure 582 Gem.sources.replace ["http://not-there.nothing"] 583 584 @cmd.options[:args] = ["blah"] 585 586 e = nil 587 use_ui @ui do 588 orig_dir = Dir.pwd 589 begin 590 Dir.chdir @tempdir 591 e = assert_raises Gem::SystemExitException do 592 @cmd.execute 593 end 594 ensure 595 Dir.chdir orig_dir 596 end 597 end 598 599 assert_equal 2, e.exit_code 600 assert_match %r!Could not find a valid gem 'blah' \(>= 0\)!, @ui.error 601 assert_match %r!Unable to download data from http://not-there\.nothing!, @ui.error 602 end 603 604 def test_show_source_problems_even_on_success 605 util_setup_fake_fetcher 606 util_setup_spec_fetcher 607 608 Gem.sources << "http://nonexistent.example" 609 610 @fetcher.data["#{@gem_repo}gems/#{@a2.file_name}"] = 611 read_binary(@a2.cache_file) 612 613 @cmd.options[:args] = [@a2.name] 614 615 use_ui @ui do 616 e = assert_raises Gem::SystemExitException do 617 capture_io do 618 @cmd.execute 619 end 620 end 621 assert_equal 0, e.exit_code 622 end 623 624 assert_equal %w[a-2], @cmd.installed_specs.map { |spec| spec.full_name } 625 626 out = @ui.output.split "\n" 627 assert_equal "1 gem installed", out.shift 628 assert out.empty?, out.inspect 629 630 e = @ui.error 631 632 x = "WARNING: Unable to pull data from 'http://nonexistent.example': no data for http://nonexistent.example/latest_specs.4.8.gz (http://nonexistent.example/latest_specs.4.8.gz)\n" 633 assert_equal x, e 634 end 635 636 def test_execute_installs_dependencies 637 r, r_gem = util_gem 'r', '1', 'q' => '= 1' 638 q, q_gem = util_gem 'q', '1' 639 640 util_setup_fake_fetcher 641 util_setup_spec_fetcher r, q 642 643 Gem::Specification.reset 644 645 @fetcher.data["#{@gem_repo}gems/#{q.file_name}"] = read_binary(q_gem) 646 @fetcher.data["#{@gem_repo}gems/#{r.file_name}"] = read_binary(r_gem) 647 648 @cmd.options[:args] = ["r"] 649 650 e = nil 651 use_ui @ui do 652 e = assert_raises Gem::SystemExitException do 653 capture_io do 654 @cmd.execute 655 end 656 end 657 end 658 659 out = @ui.output.split "\n" 660 assert_equal "2 gems installed", out.shift 661 assert out.empty?, out.inspect 662 663 assert_equal %w[q-1 r-1], @cmd.installed_specs.map { |spec| spec.full_name } 664 665 assert_equal 0, e.exit_code 666 end 667 668 def test_execute_satisfy_deps_of_local_from_sources 669 r, r_gem = util_gem 'r', '1', 'q' => '= 1' 670 q, q_gem = util_gem 'q', '1' 671 672 util_setup_fake_fetcher 673 util_setup_spec_fetcher r, q 674 675 Gem::Specification.reset 676 677 @fetcher.data["#{@gem_repo}gems/#{q.file_name}"] = read_binary(q_gem) 678 679 @cmd.options[:args] = [r_gem] 680 681 use_ui @ui do 682 e = assert_raises Gem::SystemExitException do 683 capture_io do 684 @cmd.execute 685 end 686 end 687 assert_equal 0, e.exit_code 688 end 689 690 assert_equal %w[q-1 r-1], @cmd.installed_specs.map { |spec| spec.full_name } 691 692 out = @ui.output.split "\n" 693 assert_equal "2 gems installed", out.shift 694 assert out.empty?, out.inspect 695 end 696 697 def test_execute_uses_from_a_gemdeps 698 util_setup_fake_fetcher 699 util_setup_spec_fetcher 700 701 @fetcher.data["#{@gem_repo}gems/#{@a2.file_name}"] = 702 read_binary(@a2.cache_file) 703 704 File.open @gemdeps, "w" do |f| 705 f << "gem 'a'" 706 end 707 708 @cmd.options[:gemdeps] = @gemdeps 709 710 use_ui @ui do 711 e = assert_raises Gem::SystemExitException do 712 capture_io do 713 @cmd.execute 714 end 715 end 716 assert_equal 0, e.exit_code 717 end 718 719 assert_equal %w[], @cmd.installed_specs.map { |spec| spec.full_name } 720 721 out = @ui.output.split "\n" 722 assert_equal "Using a (2)", out.shift 723 assert out.empty?, out.inspect 724 end 725 726 def test_execute_installs_from_a_gemdeps 727 util_setup_fake_fetcher 728 util_setup_spec_fetcher @a2 729 util_clear_gems 730 731 @fetcher.data["#{@gem_repo}gems/#{@a2.file_name}"] = 732 read_binary(@a2.cache_file) 733 734 File.open @gemdeps, "w" do |f| 735 f << "gem 'a'" 736 end 737 738 @cmd.options[:gemdeps] = @gemdeps 739 740 use_ui @ui do 741 e = assert_raises Gem::SystemExitException do 742 capture_io do 743 @cmd.execute 744 end 745 end 746 assert_equal 0, e.exit_code 747 end 748 749 assert_equal %w[a-2], @cmd.installed_specs.map { |spec| spec.full_name } 750 751 out = @ui.output.split "\n" 752 assert_equal "Installing a (2)", out.shift 753 assert out.empty?, out.inspect 754 end 755 756 def test_execute_installs_deps_a_gemdeps 757 q, q_gem = util_gem 'q', '1.0' 758 r, r_gem = util_gem 'r', '2.0', 'q' => nil 759 760 util_setup_fake_fetcher 761 util_setup_spec_fetcher q, r 762 util_clear_gems 763 764 add_to_fetcher q, q_gem 765 add_to_fetcher r, r_gem 766 767 File.open @gemdeps, "w" do |f| 768 f << "gem 'r'" 769 end 770 771 @cmd.options[:gemdeps] = @gemdeps 772 773 use_ui @ui do 774 e = assert_raises Gem::SystemExitException do 775 capture_io do 776 @cmd.execute 777 end 778 end 779 assert_equal 0, e.exit_code 780 end 781 782 names = @cmd.installed_specs.map { |spec| spec.full_name } 783 784 assert_equal %w[q-1.0 r-2.0], names 785 786 out = @ui.output.split "\n" 787 assert_equal "Installing q (1.0)", out.shift 788 assert_equal "Installing r (2.0)", out.shift 789 assert out.empty?, out.inspect 790 end 791 792 def test_execute_uses_deps_a_gemdeps 793 q, _ = util_gem 'q', '1.0' 794 r, r_gem = util_gem 'r', '2.0', 'q' => nil 795 796 util_setup_fake_fetcher 797 util_setup_spec_fetcher q, r 798 util_clear_gems 799 800 add_to_fetcher r, r_gem 801 802 Gem::Specification.add_specs q 803 804 File.open @gemdeps, "w" do |f| 805 f << "gem 'r'" 806 end 807 808 @cmd.options[:gemdeps] = @gemdeps 809 810 use_ui @ui do 811 e = assert_raises Gem::SystemExitException do 812 capture_io do 813 @cmd.execute 814 end 815 end 816 assert_equal 0, e.exit_code 817 end 818 819 names = @cmd.installed_specs.map { |spec| spec.full_name } 820 821 assert_equal %w[r-2.0], names 822 823 out = @ui.output.split "\n" 824 assert_equal "Using q (1.0)", out.shift 825 assert_equal "Installing r (2.0)", out.shift 826 assert out.empty?, out.inspect 827 end 828 829 def test_execute_installs_deps_a_gemdeps_into_a_path 830 q, q_gem = util_gem 'q', '1.0' 831 r, r_gem = util_gem 'r', '2.0', 'q' => nil 832 833 util_setup_fake_fetcher 834 util_setup_spec_fetcher q, r 835 util_clear_gems 836 837 add_to_fetcher q, q_gem 838 add_to_fetcher r, r_gem 839 840 File.open @gemdeps, "w" do |f| 841 f << "gem 'r'" 842 end 843 844 @cmd.options[:install_dir] = "gf-path" 845 @cmd.options[:gemdeps] = @gemdeps 846 847 use_ui @ui do 848 e = assert_raises Gem::SystemExitException do 849 capture_io do 850 @cmd.execute 851 end 852 end 853 assert_equal 0, e.exit_code 854 end 855 856 names = @cmd.installed_specs.map { |spec| spec.full_name } 857 858 assert_equal %w[q-1.0 r-2.0], names 859 860 out = @ui.output.split "\n" 861 assert_equal "Installing q (1.0)", out.shift 862 assert_equal "Installing r (2.0)", out.shift 863 assert out.empty?, out.inspect 864 865 assert File.file?("gf-path/specifications/q-1.0.gemspec"), "not installed" 866 assert File.file?("gf-path/specifications/r-2.0.gemspec"), "not installed" 867 end 868 869 def test_execute_with_gemdeps_path_ignores_system 870 q, q_gem = util_gem 'q', '1.0' 871 r, r_gem = util_gem 'r', '2.0', 'q' => nil 872 873 util_setup_fake_fetcher 874 util_setup_spec_fetcher q, r 875 util_clear_gems 876 877 add_to_fetcher q, q_gem 878 add_to_fetcher r, r_gem 879 880 Gem::Specification.add_specs q 881 882 File.open @gemdeps, "w" do |f| 883 f << "gem 'r'" 884 end 885 886 @cmd.options[:install_dir] = "gf-path" 887 @cmd.options[:gemdeps] = @gemdeps 888 889 use_ui @ui do 890 e = assert_raises Gem::SystemExitException do 891 capture_io do 892 @cmd.execute 893 end 894 end 895 assert_equal 0, e.exit_code 896 end 897 898 names = @cmd.installed_specs.map { |spec| spec.full_name } 899 900 assert_equal %w[q-1.0 r-2.0], names 901 902 out = @ui.output.split "\n" 903 assert_equal "Installing q (1.0)", out.shift 904 assert_equal "Installing r (2.0)", out.shift 905 assert out.empty?, out.inspect 906 907 assert File.file?("gf-path/specifications/q-1.0.gemspec"), "not installed" 908 assert File.file?("gf-path/specifications/r-2.0.gemspec"), "not installed" 909 end 910 911 def test_execute_uses_deps_a_gemdeps_with_a_path 912 q, q_gem = util_gem 'q', '1.0' 913 r, r_gem = util_gem 'r', '2.0', 'q' => nil 914 915 util_setup_fake_fetcher 916 util_setup_spec_fetcher q, r 917 util_clear_gems 918 919 add_to_fetcher r, r_gem 920 921 i = Gem::Installer.new q_gem, :install_dir => "gf-path" 922 i.install 923 924 assert File.file?("gf-path/specifications/q-1.0.gemspec"), "not installed" 925 926 File.open @gemdeps, "w" do |f| 927 f << "gem 'r'" 928 end 929 930 @cmd.options[:install_dir] = "gf-path" 931 @cmd.options[:gemdeps] = @gemdeps 932 933 use_ui @ui do 934 e = assert_raises Gem::SystemExitException do 935 capture_io do 936 @cmd.execute 937 end 938 end 939 assert_equal 0, e.exit_code 940 end 941 942 names = @cmd.installed_specs.map { |spec| spec.full_name } 943 944 assert_equal %w[r-2.0], names 945 946 out = @ui.output.split "\n" 947 assert_equal "Using q (1.0)", out.shift 948 assert_equal "Installing r (2.0)", out.shift 949 assert out.empty?, out.inspect 950 end 951 952 953end 954 955