summaryrefslogtreecommitdiff
path: root/spec/bundler/install/gemfile_spec.rb
blob: 96ed174e9bf7f9de13a53aa4a6e8c5191e2aa69b (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
142
143
# frozen_string_literal: true

RSpec.describe "bundle install" do
  context "with duplicated gems" do
    it "will display a warning" do
      install_gemfile <<-G, raise_on_error: false
        source "https://gem.repo1"

        gem 'rails', '~> 4.0.0'
        gem 'rails', '~> 4.0.0'
      G
      expect(err).to include("more than once")
    end
  end

  context "with --gemfile" do
    it "finds the gemfile" do
      gemfile bundled_app("NotGemfile"), <<-G
        source "https://gem.repo1"
        gem 'myrack'
      G

      bundle :install, gemfile: bundled_app("NotGemfile")

      # Specify BUNDLE_GEMFILE for `the_bundle`
      # to retrieve the proper Gemfile
      ENV["BUNDLE_GEMFILE"] = "NotGemfile"
      expect(the_bundle).to include_gems "myrack 1.0.0"
    end
  end

  context "with gemfile set via config" do
    before do
      gemfile bundled_app("NotGemfile"), <<-G
        source "https://gem.repo1"
        gem 'myrack'
      G

      bundle "config set --local gemfile #{bundled_app("NotGemfile")}"
    end
    it "uses the gemfile to install" do
      bundle "install"
      bundle "list"

      expect(out).to include("myrack (1.0.0)")
    end
    it "uses the gemfile while in a subdirectory" do
      bundled_app("subdir").mkpath
      bundle "install", dir: bundled_app("subdir")
      bundle "list", dir: bundled_app("subdir")

      expect(out).to include("myrack (1.0.0)")
    end
  end

  context "with deprecated features" do
    it "reports that lib is an invalid option" do
      gemfile <<-G
        source "https://gem.repo1"

        gem "myrack", :lib => "myrack"
      G

      bundle :install, raise_on_error: false
      expect(err).to match(/You passed :lib as an option for gem 'myrack', but it is invalid/)
    end
  end

  context "when an internal error happens" do
    let(:bundler_bug) do
      create_file("bundler_bug.rb", <<~RUBY)
        require "bundler"

        module Bundler
          class Dsl
            def source(source, *args, &blk)
              nil.name
            end
          end
        end
      RUBY

      bundled_app("bundler_bug.rb").to_s
    end

    it "shows culprit file and line" do
      skip "ruby-core test setup has always \"lib\" in $LOAD_PATH so `require \"bundler\"` always activates the local version rather than using RubyGems gem activation stuff, causing conflicts" if ruby_core?

      install_gemfile "source 'https://gem.repo1'", requires: [bundler_bug], artifice: nil, raise_on_error: false
      expect(err).to include("bundler_bug.rb:6")
    end
  end

  context "with engine specified in symbol", :jruby_only do
    it "does not raise any error parsing Gemfile" do
      install_gemfile <<-G
        source "https://gem.repo1"
        ruby "#{RUBY_VERSION}", :engine => :jruby, :engine_version => "#{RUBY_ENGINE_VERSION}"
      G

      expect(out).to match(/Bundle complete!/)
    end

    it "installation succeeds" do
      install_gemfile <<-G
        source "https://gem.repo1"
        ruby "#{RUBY_VERSION}", :engine => :jruby, :engine_version => "#{RUBY_ENGINE_VERSION}"
        gem "myrack"
      G

      expect(the_bundle).to include_gems "myrack 1.0.0"
    end
  end

  context "with a Gemfile containing non-US-ASCII characters" do
    it "reads the Gemfile with the UTF-8 encoding by default" do
      install_gemfile <<-G
        source "https://gem.repo1"

        str = "Il était une fois ..."
        puts "The source encoding is: " + str.encoding.name
      G

      expect(out).to include("The source encoding is: UTF-8")
      expect(out).not_to include("The source encoding is: ASCII-8BIT")
      expect(out).to include("Bundle complete!")
    end

    it "respects the magic encoding comment" do
      # NOTE: This works thanks to #eval interpreting the magic encoding comment
      install_gemfile <<-G
        # encoding: iso-8859-1
        source "https://gem.repo1"

        str = "Il #{"\xE9".dup.force_encoding("binary")}tait une fois ..."
        puts "The source encoding is: " + str.encoding.name
      G

      expect(out).to include("The source encoding is: ISO-8859-1")
      expect(out).to include("Bundle complete!")
    end
  end
end