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
|
require 'abstract_unit'
require 'active_support/ruby/shim'
module Rails
class Initializer
class Error < StandardError ; end
class Runner
def initialize
@names = {}
@initializers = []
end
def add(name, options = {}, &block)
# If :before or :after is specified, set the index to the right spot
if other = options[:before] || options[:after]
raise Error, "The #{other.inspect} initializer does not exist" unless @names[other]
index = @initializers.index(@names[other])
index += 1 if options[:after]
end
Class.new(Initializer, &block).new.tap do |initializer|
@initializers.insert(index || -1, initializer)
@names[name] = initializer
end
end
def run
@initializers.each { |init| init.run }
end
end
def self.run(&blk)
define_method(:run, &blk)
end
end
end
class InitializerRunnerTest < ActiveSupport::TestCase
def setup
@runner = Rails::Initializer::Runner.new
end
test "A new runner can be created" do
assert @runner
end
test "You can create initializers" do
init = @runner.add :foo do
end
assert_kind_of Rails::Initializer, init
end
test "The initializers actually get run when the runner is run" do
state = nil
@runner.add :foo do
run { state = true }
end
@runner.run
assert state
end
test "By default, initializers get run in the order that they are added" do
state = []
@runner.add :first do
run { state << :first }
end
@runner.add :second do
run { state << :second }
end
@runner.run
assert_equal [:first, :second], state
end
test "Raises an exception if :before or :after are specified, but don't exist" do
assert_raise(Rails::Initializer::Error) do
@runner.add(:fail, :before => :whale) { 1 }
end
assert_raise(Rails::Initializer::Error) do
@runner.add(:fail, :after => :whale) { 1 }
end
end
test "When adding an initializer, specifying :after allows you to move an initializer after another" do
state = []
@runner.add :first do
run { state << :first }
end
@runner.add :second do
run { state << :second }
end
@runner.add :third, :after => :first do
run { state << :third }
end
@runner.run
assert_equal [:first, :third, :second], state
end
end
|