summaryrefslogtreecommitdiff
path: root/test/rubygems/test_kernel.rb
blob: 6c07347a9f7b6bd60ea5e3450fa425fd6a2fedb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# frozen_string_literal: true
require 'rubygems/test_case'

class TestKernel < Gem::TestCase

  def setup
    super

    @old_path = $:.dup

    util_make_gems
  end

  def teardown
    super

    $:.replace @old_path
  end

  def test_gem
    assert gem('a', '= 1'), "Should load"
    assert $:.any? {|p| %r{a-1/lib} =~ p }
  end

  def test_gem_default
    assert gem('a', '>= 0')

    assert_equal @a2, Gem.loaded_specs['a']
  end

  def test_gem_default_re_gem
    assert gem('a', '=1')

    refute gem('a', '>= 0')

    assert_equal @a1, Gem.loaded_specs['a']
  end

  def test_gem_re_gem_mismatch
    assert gem('a', '=1')

    assert_raises Gem::LoadError do
      gem('a', '= 2')
    end

    assert_equal @a1, Gem.loaded_specs['a']
  end

  def test_gem_redundant
    assert gem('a', '= 1'), "Should load"
    refute gem('a', '= 1'), "Should not load"
    assert_equal 1, $:.select {|p| %r{a-1/lib} =~ p }.size
  end

  def test_gem_overlapping
    assert gem('a', '= 1'), "Should load"
    refute gem('a', '>= 1'), "Should not load"
    assert_equal 1, $:.select {|p| %r{a-1/lib} =~ p }.size
  end

  def test_gem_prerelease
    quick_gem 'd', '1.1.a'
    refute gem('d', '>= 1'),   'release requirement must not load prerelease'
    assert gem('d', '>= 1.a'), 'prerelease requirement may load prerelease'
  end

  def test_gem_env_req
    ENV["GEM_REQUIREMENT_A"] = '~> 2.0'
    assert_raises(Gem::MissingSpecVersionError) { gem('a', '= 1') }
    assert gem('a', '> 1')
    assert_equal @a2, Gem.loaded_specs['a']
  end

  def test_gem_conflicting
    assert gem('a', '= 1'), "Should load"

    ex = assert_raises Gem::LoadError do
      gem 'a', '= 2'
    end

    assert_equal "can't activate a-2, already activated a-1", ex.message
    assert_match(/activated a-1/, ex.message)
    assert_equal 'a', ex.name

    assert $:.any? {|p| %r{a-1/lib} =~ p }
    refute $:.any? {|p| %r{a-2/lib} =~ p }
  end

  def test_gem_not_adding_bin
    assert gem('a', '= 1'), "Should load"
    refute $:.any? {|p| %r{a-1/bin} =~ p }
  end

  def test_gem_failing_inside_require_doesnt_cause_double_exceptions
    File.write("activate.rb", "gem('a', '= 999')\n")

    require "open3"

    output, _ = Open3.capture2e(
      { "GEM_HOME" => Gem.paths.home },
      *ruby_with_rubygems_in_load_path,
      "-r",
      "./activate.rb"
    )

    load_errors = output.split("\n").select {|line| line.include?("Could not find") }

    assert_equal 1, load_errors.size
  end

  def test_gem_bundler
    quick_gem 'bundler', '1'
    quick_gem 'bundler', '2.a'

    assert gem('bundler')
    assert $:.any? {|p| %r{bundler-1/lib} =~ p }
  end

  def test_gem_bundler_missing_bundler_version
    Gem::BundlerVersionFinder.stub(:bundler_version_with_reason, ["55", "reason"]) do
      quick_gem 'bundler', '1'
      quick_gem 'bundler', '2.a'

      e = assert_raises Gem::MissingSpecVersionError do
        gem('bundler')
      end
      assert_match "Could not find 'bundler' (55) required by reason.", e.message
    end
  end

  def test_gem_bundler_inferred_bundler_version
    Gem::BundlerVersionFinder.stub(:bundler_version_with_reason, ["1", "reason"]) do
      quick_gem 'bundler', '1'
      quick_gem 'bundler', '2.a'

      assert gem('bundler', '>= 0.a')
      assert $:.any? {|p| %r{bundler-1/lib} =~ p }
    end
  end

end