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