aboutsummaryrefslogtreecommitdiffstats
path: root/railties/test/commands/console_test.rb
blob: 4062905c16a6d1c98630ca27865643a1095c8f6e (plain) (blame)
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
144
145
146
147
148
149
150
151
152
require 'abstract_unit'
require 'rails/commands/console'

class Rails::ConsoleTest < ActiveSupport::TestCase
  class FakeConsole
    def self.start; end
  end

  def setup
  end

  def test_sandbox_option
    console = Rails::Console.new(app, parse_arguments(["--sandbox"]))
    assert console.sandbox?
  end

  def test_short_version_of_sandbox_option
    console = Rails::Console.new(app, parse_arguments(["-s"]))
    assert console.sandbox?
  end

  def test_debugger_option
    console = Rails::Console.new(app, parse_arguments(["--debugger"]))
    assert console.debugger?
  end

  def test_no_options
    console = Rails::Console.new(app, parse_arguments([]))
    assert !console.debugger?
    assert !console.sandbox?
  end

  def test_start
    FakeConsole.expects(:start)
    start
    assert_match(/Loading \w+ environment \(Rails/, output)
  end

  def test_start_with_debugger
    rails_console = Rails::Console.new(app, parse_arguments(["--debugger"]))
    rails_console.expects(:require_debugger).returns(nil)

    silence_stream(STDOUT) { rails_console.start }
  end

  def test_start_with_sandbox
    app.expects(:sandbox=).with(true)
    FakeConsole.expects(:start)

    start ["--sandbox"]

    assert_match(/Loading \w+ environment in sandbox \(Rails/, output)
  end

  def test_console_with_environment
    start ["-e production"]
    assert_match(/\sproduction\s/, output)
  end

  def test_console_defaults_to_IRB
    config = mock("config", console: nil)
    app = mock("app", config: config)
    app.expects(:load_console).returns(nil)

    assert_equal IRB, Rails::Console.new(app).console
  end

  def test_default_environment_with_no_rails_env
    with_rails_env nil do
      start
      assert_match(/\sdevelopment\s/, output)
    end
  end

  def test_default_environment_with_rails_env
    with_rails_env 'special-production' do
      start
      assert_match(/\sspecial-production\s/, output)
    end
  end

  def test_default_environment_with_rack_env
    with_rack_env 'production' do
      start
      assert_match(/\sproduction\s/, output)
    end
  end
  
  def test_e_option
    start ['-e', 'special-production']
    assert_match(/\sspecial-production\s/, output)
  end

  def test_environment_option
    start ['--environment=special-production']
    assert_match(/\sspecial-production\s/, output)
  end

  def test_rails_env_is_production_when_first_argument_is_p
    start ['p']
    assert_match(/\sproduction\s/, output)
  end

  def test_rails_env_is_test_when_first_argument_is_t
    start ['t']
    assert_match(/\stest\s/, output)
  end

  def test_rails_env_is_development_when_argument_is_d
    start ['d']
    assert_match(/\sdevelopment\s/, output)
  end

  private

  attr_reader :output

  def start(argv = [])
    rails_console = Rails::Console.new(app, parse_arguments(argv))
    @output = capture(:stdout) { rails_console.start }
  end

  def app
    @app ||= begin
      config = mock("config", console: FakeConsole)
      app = mock("app", config: config)
      app.stubs(:sandbox=).returns(nil)
      app.expects(:load_console)
      app
    end
  end

  def parse_arguments(args)
    Rails::Console.parse_arguments(args)
  end

  def with_rails_env(env)
    rails = ENV['RAILS_ENV']
    ENV['RAILS_ENV'] = env
    yield
  ensure
    ENV['RAILS_ENV'] = rails
  end

  def with_rack_env(env)
    rack = ENV['RACK_ENV']
    ENV['RACK_ENV'] = env
    with_rails_env(nil) { yield }
  ensure
    ENV['RACK_ENV'] = rack
  end
end