Vagrant::Action::Warden unit tests
This commit is contained in:
parent
3cd262ed75
commit
e3426211bc
|
@ -0,0 +1,92 @@
|
||||||
|
require File.expand_path("../../../base", __FILE__)
|
||||||
|
|
||||||
|
describe Vagrant::Action::Warden do
|
||||||
|
let(:data) { { :data => [] } }
|
||||||
|
let(:instance) { described_class.new }
|
||||||
|
|
||||||
|
# This returns a proc that can be used with the builder
|
||||||
|
# that simply appends data to an array in the env.
|
||||||
|
def appender_proc(data)
|
||||||
|
Proc.new { |env| env[:data] << data }
|
||||||
|
end
|
||||||
|
|
||||||
|
it "calls the actions like normal" do
|
||||||
|
instance = described_class.new([appender_proc(1), appender_proc(2)], data)
|
||||||
|
instance.call(data)
|
||||||
|
|
||||||
|
data[:data].should == [1, 2]
|
||||||
|
end
|
||||||
|
|
||||||
|
it "starts a recovery sequence when an exception is raised" do
|
||||||
|
class Action
|
||||||
|
def initialize(app, env)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
@app.call(env)
|
||||||
|
end
|
||||||
|
|
||||||
|
def recover(env)
|
||||||
|
env[:recover] << 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class ActionTwo
|
||||||
|
def initialize(app, env)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
@app.call(env)
|
||||||
|
end
|
||||||
|
|
||||||
|
def recover(env)
|
||||||
|
env[:recover] << 2
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
error_proc = Proc.new { raise "ERROR!" }
|
||||||
|
|
||||||
|
data = { :recover => [] }
|
||||||
|
instance = described_class.new([Action, ActionTwo, error_proc], data)
|
||||||
|
|
||||||
|
# The error should be raised back up
|
||||||
|
expect { instance.call(data) }.
|
||||||
|
to raise_error(RuntimeError)
|
||||||
|
|
||||||
|
# Verify the recovery process goes in reverse order
|
||||||
|
data[:recover].should == [2, 1]
|
||||||
|
|
||||||
|
# Verify that the error is available in the data
|
||||||
|
data["vagrant.error"].should be_kind_of(RuntimeError)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "does not do a recovery sequence if SystemExit is raised" do
|
||||||
|
class Action
|
||||||
|
def initialize(app, env)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
@app.call(env)
|
||||||
|
end
|
||||||
|
|
||||||
|
def recover(env)
|
||||||
|
env[:recover] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Make a proc that just calls "abort" which raises a
|
||||||
|
# SystemExit exception.
|
||||||
|
error_proc = Proc.new { abort }
|
||||||
|
|
||||||
|
instance = described_class.new([Action, error_proc], data)
|
||||||
|
|
||||||
|
# The SystemExit should come through
|
||||||
|
expect { instance.call(data) }.to raise_error(SystemExit)
|
||||||
|
|
||||||
|
# The recover should not have been called
|
||||||
|
data.has_key?(:recover).should_not be
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,125 +0,0 @@
|
||||||
require "test_helper"
|
|
||||||
require "logger"
|
|
||||||
|
|
||||||
class ActionWardenTest < Test::Unit::TestCase
|
|
||||||
setup do
|
|
||||||
@klass = Vagrant::Action::Warden
|
|
||||||
@instance = @klass.new([], {})
|
|
||||||
end
|
|
||||||
|
|
||||||
context "initializing" do
|
|
||||||
should "finalize the middleware" do
|
|
||||||
env = new_env
|
|
||||||
middleware = [1,2,3]
|
|
||||||
middleware.each do |m|
|
|
||||||
@klass.any_instance.expects(:finalize_action).with(m, env).returns(m)
|
|
||||||
end
|
|
||||||
@warden = @klass.new(middleware, env)
|
|
||||||
assert_equal @warden.actions, [1,2,3]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "setting up middleware" do
|
|
||||||
should "make non-classes lambdas" do
|
|
||||||
env = new_env
|
|
||||||
env.expects(:foo).once
|
|
||||||
|
|
||||||
func = lambda { |x| x.foo }
|
|
||||||
@instance.finalize_action(func, env).call(env)
|
|
||||||
end
|
|
||||||
|
|
||||||
should "raise exception if given invalid middleware" do
|
|
||||||
assert_raises(RuntimeError) {
|
|
||||||
@instance.finalize_action(7, nil)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "calling" do
|
|
||||||
should "return if there are no actions to execute" do
|
|
||||||
@instance.actions.expects(:pop).never
|
|
||||||
assert !@instance.call(new_env)
|
|
||||||
end
|
|
||||||
|
|
||||||
should "move the last action to the front of the stack" do
|
|
||||||
@instance.actions << lambda { |env| }
|
|
||||||
assert @instance.stack.empty?
|
|
||||||
@instance.call(new_env)
|
|
||||||
assert !@instance.stack.empty?
|
|
||||||
assert @instance.actions.empty?
|
|
||||||
end
|
|
||||||
|
|
||||||
should "call the next action" do
|
|
||||||
env = new_env
|
|
||||||
action = mock('action')
|
|
||||||
action.expects(:call).with(env)
|
|
||||||
@instance.actions << action
|
|
||||||
@instance.call(env)
|
|
||||||
end
|
|
||||||
|
|
||||||
should "begin recovery sequence when the called action raises an exception" do
|
|
||||||
class Foo
|
|
||||||
def initialize(*args); end
|
|
||||||
def call(env)
|
|
||||||
raise "An exception"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@instance.actions << Foo.new
|
|
||||||
@instance.expects(:begin_rescue).with() do |env|
|
|
||||||
assert env["vagrant.error"].is_a?(RuntimeError)
|
|
||||||
true
|
|
||||||
end
|
|
||||||
assert_raises(RuntimeError) { @instance.call(new_env) }
|
|
||||||
end
|
|
||||||
|
|
||||||
should "not begin recovery sequence if a SystemExit is raised" do
|
|
||||||
class Foo
|
|
||||||
def initialize(*args); end
|
|
||||||
def call(env)
|
|
||||||
# Raises a system exit
|
|
||||||
abort
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@instance.actions << Foo.new
|
|
||||||
@instance.expects(:begin_rescue).never
|
|
||||||
assert_raises(SystemExit) { @instance.call(new_env) }
|
|
||||||
end
|
|
||||||
|
|
||||||
should "raise interrupt if the environment is interupted" do
|
|
||||||
env = new_env
|
|
||||||
env.expects(:interrupted?).returns(true)
|
|
||||||
@instance.actions << lambda { |env| }
|
|
||||||
|
|
||||||
assert_raises(Vagrant::Errors::VagrantInterrupt) {
|
|
||||||
@instance.call(env)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "recover" do
|
|
||||||
should "call recover on all items in the stack" do
|
|
||||||
env = new_env
|
|
||||||
seq = sequence("sequence")
|
|
||||||
@instance.stack = [rescueable_mock("action"), rescueable_mock("another")]
|
|
||||||
@instance.stack.each do |action|
|
|
||||||
action.expects(:recover).with(env).in_sequence(seq)
|
|
||||||
end
|
|
||||||
|
|
||||||
@instance.begin_rescue(env)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def new_env
|
|
||||||
env = Vagrant::Action::Environment.new(nil)
|
|
||||||
env["logger"] = Logger.new(nil)
|
|
||||||
env
|
|
||||||
end
|
|
||||||
|
|
||||||
def rescueable_mock(name)
|
|
||||||
mock_action = mock(name)
|
|
||||||
mock_action.stubs(:respond_to?).with(:recover).returns(true)
|
|
||||||
mock_action
|
|
||||||
end
|
|
||||||
end
|
|
Loading…
Reference in New Issue