summaryrefslogtreecommitdiff
path: root/spec/bundler/commands/console_spec.rb
blob: 6f1e96261efb5d0912468a3d154f6a01e58bc78c (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

RSpec.describe "bundle console", :bundler => "< 3", :readline => true do
  before :each do
    build_repo2 do
      # A minimal fake pry console
      build_gem "pry" do |s|
        s.write "lib/pry.rb", <<-RUBY
          class Pry
            class << self
              def toplevel_binding
                unless defined?(@toplevel_binding) && @toplevel_binding
                  TOPLEVEL_BINDING.eval %{
                    def self.__pry__; binding; end
                    Pry.instance_variable_set(:@toplevel_binding, __pry__)
                    class << self; undef __pry__; end
                  }
                end
                @toplevel_binding.eval('private')
                @toplevel_binding
              end

              def __pry__
                while line = gets
                  begin
                    puts eval(line, toplevel_binding).inspect.sub(/^"(.*)"$/, '=> \\1')
                  rescue Exception => e
                    puts "\#{e.class}: \#{e.message}"
                    puts e.backtrace.first
                  end
                end
              end
              alias start __pry__
            end
          end
        RUBY
      end
    end

    install_gemfile <<-G
      source "#{file_uri_for(gem_repo2)}"
      gem "rack"
      gem "activesupport", :group => :test
      gem "rack_middleware", :group => :development
    G
  end

  it "starts IRB with the default group loaded" do
    bundle "console" do |input, _, _|
      input.puts("puts RACK")
      input.puts("exit")
    end
    expect(out).to include("0.9.1")
  end

  it "uses IRB as default console" do
    bundle "console" do |input, _, _|
      input.puts("__method__")
      input.puts("exit")
    end
    expect(out).to include(":irb_binding")
  end

  it "starts another REPL if configured as such" do
    install_gemfile <<-G
      source "#{file_uri_for(gem_repo2)}"
      gem "pry"
    G
    bundle "config set console pry"

    bundle "console" do |input, _, _|
      input.puts("__method__")
      input.puts("exit")
    end
    expect(out).to include(":__pry__")
  end

  it "falls back to IRB if the other REPL isn't available" do
    bundle "config set console pry"
    # make sure pry isn't there

    bundle "console" do |input, _, _|
      input.puts("__method__")
      input.puts("exit")
    end
    expect(out).to include(":irb_binding")
  end

  it "doesn't load any other groups" do
    bundle "console" do |input, _, _|
      input.puts("puts ACTIVESUPPORT")
      input.puts("exit")
    end
    expect(out).to include("NameError")
  end

  describe "when given a group" do
    it "loads the given group" do
      bundle "console test" do |input, _, _|
        input.puts("puts ACTIVESUPPORT")
        input.puts("exit")
      end
      expect(out).to include("2.3.5")
    end

    it "loads the default group" do
      bundle "console test" do |input, _, _|
        input.puts("puts RACK")
        input.puts("exit")
      end
      expect(out).to include("0.9.1")
    end

    it "doesn't load other groups" do
      bundle "console test" do |input, _, _|
        input.puts("puts RACK_MIDDLEWARE")
        input.puts("exit")
      end
      expect(out).to include("NameError")
    end
  end

  it "performs an automatic bundle install" do
    gemfile <<-G
      source "#{file_uri_for(gem_repo2)}"
      gem "rack"
      gem "activesupport", :group => :test
      gem "rack_middleware", :group => :development
      gem "foo"
    G

    bundle "config set auto_install 1"
    bundle :console do |input, _, _|
      input.puts("puts 'hello'")
      input.puts("exit")
    end
    expect(out).to include("Installing foo 1.0")
    expect(out).to include("hello")
    expect(the_bundle).to include_gems "foo 1.0"
  end
end