2011-12-03 15:44:08 -08:00

126 lines
3.7 KiB
Ruby

require "test_helper"
class DownloadBoxActionTest < Test::Unit::TestCase
setup do
@klass = Vagrant::Action::Box::Download
@app, @env = action_env
@env["box"] = Vagrant::Box.new(vagrant_env, "foo")
@env["box"].uri = "http://google.com"
end
context "initializing" do
should "initialize download classes" do
@klass.new(@app, @env)
assert_equal [Vagrant::Downloaders::HTTP, Vagrant::Downloaders::File], @env["download.classes"]
end
end
context "with an instance" do
setup do
@instance = @klass.new(@app, @env)
end
context "calling" do
should "call the proper methods in sequence" do
seq = sequence("seq")
@instance.expects(:instantiate_downloader).in_sequence(seq).returns(true)
@instance.expects(:download).in_sequence(seq)
@app.expects(:call).with(@env).in_sequence(seq)
@instance.expects(:recover).with(@env).in_sequence(seq)
@instance.call(@env)
end
end
context "instantiating downloader" do
should "instantiate the proper class" do
instance = mock("instance")
Vagrant::Downloaders::HTTP.expects(:new).with(@env).returns(instance)
instance.expects(:prepare).with(@env["box"].uri).once
assert @instance.instantiate_downloader
end
should "complain that the file doesn't exist if the URI is invalid for any downloaders" do
@env["box"].uri = "foobar"
assert_raises(Vagrant::Errors::DownloaderFileDoesntExist) {
@instance.instantiate_downloader
}
end
end
context "downloading" do
setup do
@path = "foo"
@tempfile = mock("tempfile")
@tempfile.stubs(:path).returns(@path)
@instance.stubs(:with_tempfile).yields(@tempfile)
@instance.stubs(:download_to)
end
should "make a tempfile and copy the URI contents to it" do
@instance.expects(:with_tempfile).yields(@tempfile)
@instance.expects(:download_to).with(@tempfile)
@instance.download
end
should "save the tempfile path" do
@instance.download
assert @env.has_key?("download.temp_path")
assert_equal @tempfile.path, @env["download.temp_path"]
assert_equal @tempfile.path, @instance.temp_path
end
end
context "tempfile" do
should "create a tempfile in the vagrant tmp directory" do
File.expects(:open).with { |name, bitmask|
name.to_s =~ /#{Vagrant::Action::Box::Download::BASENAME}/ && name.to_s =~ /#{@env.env.tmp_path}/
}.once
@instance.with_tempfile
end
should "yield the tempfile object" do
@tempfile = mock("tempfile")
File.expects(:open).yields(@tempfile)
@instance.with_tempfile do |otherfile|
assert @tempfile.equal?(otherfile)
end
end
end
context "cleaning up" do
setup do
@temp_path = "foo"
@instance.stubs(:temp_path).returns(@temp_path)
File.stubs(:exist?).returns(true)
end
should "delete the temporary file if it exists" do
File.expects(:unlink).with(@temp_path).once
@instance.recover(@env)
end
should "not delete anything if it doesn't exist" do
File.stubs(:exist?).returns(false)
File.expects(:unlink).never
@instance.recover(@env)
end
end
context "downloading to" do
setup do
@downloader = mock("downloader")
@instance.instance_variable_set(:@downloader, @downloader)
end
should "call download! on the download with the URI and tempfile" do
tempfile = "foo"
@downloader.expects(:download!).with(@env["box"].uri, tempfile)
@instance.download_to(tempfile)
end
end
end
end