summaryrefslogtreecommitdiff
path: root/test/rubygems/test_kernel.rb
blob: d862b26fe98d2a52ddd79079c75686e1b72d8edb (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
# frozen_string_literal: true

require_relative "helper"

class TestGemKernel < Gem::TestCase
  def setup
    super

    util_make_gems

    without_any_upwards_gemfiles
  end

  def test_gem
    assert gem("a", "= 1"), "Should load"
    assert $:.any? {|p| p.include?("a-1/lib") }
  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_raise 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, $:.count {|p| p.include?("a-1/lib") }
  end

  def test_gem_overlapping
    assert gem("a", "= 1"), "Should load"
    refute gem("a", ">= 1"), "Should not load"
    assert_equal 1, $:.count {|p| p.include?("a-1/lib") }
  end

  def test_gem_prerelease_is_the_only_available
    quick_gem "d", "1.1.a"

    assert gem("d", ">= 1"), "release requirement may load prerelease when sole option"
    assert $:.one? {|p| p.include?("/d-1.1.a/lib") }
  end

  def test_release_favored_over_prerelease
    quick_gem "d", "1.1.a"
    quick_gem "d", "1.2"
    gem("d", ">= 1")

    refute $:.any? {|p| p.include?("/d-1.1.a/lib") }
    assert $:.one? {|p| p.include?("/d-1.2/lib") }
  end

  def test_gem_env_req
    ENV["GEM_REQUIREMENT_A"] = "~> 2.0"
    assert_raise(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_raise 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| p.include?("a-1/lib") }
    refute $:.any? {|p| p.include?("a-2/lib") }
  end

  def test_gem_not_adding_bin
    assert gem("a", "= 1"), "Should load"
    refute $:.any? {|p| p.include?("a-1/bin") }
  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| p.include?("bundler-1/lib") }
  end

  def test_gem_bundler_inferred_bundler_version
    require "rubygems/bundler_version_finder"

    Gem::BundlerVersionFinder.stub(:bundler_version, Gem::Version.new("1")) do
      quick_gem "bundler", "1"
      quick_gem "bundler", "2.a"

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