require 'abstract_unit' require 'active_support/ruby/shim' require 'rails/initializer' class InitializerRunnerTest < ActiveSupport::TestCase def setup @runner = Rails::Initializer::Runner.new end test "A new runner can be created" do assert @runner 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 test "An initializer can be deleted" do state = [] @runner.add :first do run { state << :first } end @runner.add :second do run { state << :second } end @runner.delete(:second) @runner.run assert_equal [:first], state end test "A runner can be initialized with an existing runner, which it copies" do state = [] @runner.add :first do run { state << :first } end @runner.add :second do run { state << :second } end Rails::Initializer::Runner.new(@runner).run assert_equal [:first, :second], state end test "A child runner can be still be modified without modifying the parent" do state = [] @runner.add :first do run { state << :first } end @runner.add :second do run { state << :second } end new_runner = Rails::Initializer::Runner.new(@runner) new_runner.add :trois do run { state << :trois } end new_runner.delete(:second) new_runner.run assert_equal [:first, :trois], state state.clear @runner.run assert_equal [:first, :second], state end test "A child runner that is modified does not modify any other children of the same parent" do state = [] @runner.add :first do run { state << :first } end @runner.add :second do run { state << :second } end child_one = Rails::Initializer::Runner.new(@runner) child_two = Rails::Initializer::Runner.new(@runner) child_one.delete(:second) child_two.run assert_equal [:first, :second], state end test "It does not run the initializer block immediately" do state = [] @runner.add :first do state << :first end assert_equal [], state end test "It runs the block when the runner is run" do state = [] @runner.add :first do state << :first end @runner.run assert_equal [:first], state end end