aboutsummaryrefslogtreecommitdiffstats
path: root/railties/test/boot_test.rb
blob: 5d5fb09b414a229893273007735f1acf7b30ab14 (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
require "#{File.dirname(__FILE__)}/abstract_unit"
require 'initializer'
require "#{File.dirname(__FILE__)}/../environments/boot"

uses_mocha 'boot tests' do

class BootTest < Test::Unit::TestCase
  def test_boot_returns_if_booted
    Rails.expects(:booted?).returns(true)
    Rails.expects(:pick_boot).never
    assert_nil Rails.boot!
  end

  def test_boot_picks_and_runs_if_not_booted
    Rails.expects(:booted?).returns(false)
    Rails.expects(:pick_boot).returns(mock(:run => 'result'))
    assert_equal 'result', Rails.boot!
  end

  def test_boot_vendor_rails_by_default
    Rails.expects(:booted?).returns(false)
    File.expects(:exist?).with("#{RAILS_ROOT}/vendor/rails").returns(true)
    Rails::VendorBoot.any_instance.expects(:run).returns('result')
    assert_equal 'result', Rails.boot!
  end

  def test_boot_gem_rails_otherwise
    Rails.expects(:booted?).returns(false)
    File.expects(:exist?).with("#{RAILS_ROOT}/vendor/rails").returns(false)
    Rails::GemBoot.any_instance.expects(:run).returns('result')
    assert_equal 'result', Rails.boot!
  end

  def test_run_loads_initializer_and_sets_load_path
    boot = Rails::Boot.new
    boot.expects(:load_initializer)
    Rails::Initializer.expects(:run).with(:set_load_path)
    boot.run
  end
end

class VendorBootTest < Test::Unit::TestCase
  include Rails

  def test_load_initializer_requires_from_vendor_rails
    boot = VendorBoot.new
    boot.expects(:require).with("#{RAILS_ROOT}/vendor/rails/railties/lib/initializer")
    boot.load_initializer
  end
end

class GemBootTest < Test::Unit::TestCase
  include Rails

  def test_load_initializer_loads_rubygems_and_the_rails_gem
    boot = GemBoot.new
    GemBoot.expects(:load_rubygems)
    boot.expects(:load_rails_gem)
    boot.expects(:require).with('initializer')
    boot.load_initializer
  end

  def test_load_rubygems_exits_with_error_if_missing
    GemBoot.expects(:require).with('rubygems').raises(LoadError, 'missing rubygems')
    STDERR.expects(:puts)
    GemBoot.expects(:exit).with(1)
    GemBoot.load_rubygems
  end

  def test_load_rubygems_exits_with_error_if_too_old
    GemBoot.stubs(:rubygems_version).returns('0.0.1')
    GemBoot.expects(:require).with('rubygems').returns(true)
    STDERR.expects(:puts)
    GemBoot.expects(:exit).with(1)
    GemBoot.load_rubygems
  end

  def test_load_rails_gem_activates_specific_gem_if_version_given
    GemBoot.stubs(:gem_version).returns('0.0.1')

    boot = GemBoot.new
    boot.expects(:gem).with('rails', '=0.0.1')
    boot.load_rails_gem
  end

  def test_load_rails_gem_activates_latest_gem_if_no_version_given
    GemBoot.stubs(:gem_version).returns(nil)

    boot = GemBoot.new
    boot.expects(:gem).with('rails')
    boot.load_rails_gem
  end

  def test_load_rails_gem_exits_with_error_if_missing
    GemBoot.stubs(:gem_version).returns('0.0.1')

    boot = GemBoot.new
    boot.expects(:gem).with('rails', '=0.0.1').raises(Gem::LoadError, 'missing rails 0.0.1 gem')
    STDERR.expects(:puts)
    boot.expects(:exit).with(1)
    boot.load_rails_gem
  end
end

end # uses_mocha


class ParseGemVersionTest < Test::Unit::TestCase
  def test_should_return_nil_if_no_lines_are_passed
    assert_equal nil, parse('')
    assert_equal nil, parse(nil)
  end

  def test_should_return_nil_if_no_lines_match
    assert_equal nil, parse('nothing matches on this line\nor on this line')
  end

  def test_should_parse_with_no_leading_space
    assert_equal "1.2.3", parse("RAILS_GEM_VERSION = '1.2.3' unless defined? RAILS_GEM_VERSION")
    assert_equal "1.2.3", parse("RAILS_GEM_VERSION = '1.2.3'")
  end

  def test_should_parse_with_any_number_of_leading_spaces
    assert_equal nil, parse([])
    assert_equal "1.2.3", parse(" RAILS_GEM_VERSION = '1.2.3' unless defined? RAILS_GEM_VERSION")
    assert_equal "1.2.3", parse("   RAILS_GEM_VERSION = '1.2.3' unless defined? RAILS_GEM_VERSION")
    assert_equal "1.2.3", parse(" RAILS_GEM_VERSION = '1.2.3'")
    assert_equal "1.2.3", parse("   RAILS_GEM_VERSION = '1.2.3'")
  end

  def test_should_ignore_unrelated_comments
    assert_equal "1.2.3", parse("# comment\nRAILS_GEM_VERSION = '1.2.3'\n# comment")
  end

  def test_should_ignore_commented_version_lines
    assert_equal "1.2.3", parse("#RAILS_GEM_VERSION = '9.8.7'\nRAILS_GEM_VERSION = '1.2.3'")
    assert_equal "1.2.3", parse("# RAILS_GEM_VERSION = '9.8.7'\nRAILS_GEM_VERSION = '1.2.3'")
    assert_equal "1.2.3", parse("RAILS_GEM_VERSION = '1.2.3'\n# RAILS_GEM_VERSION = '9.8.7'")
  end

  private
    def parse(text)
      Rails::GemBoot.parse_gem_version(text)
    end
end