diff options
author | John Kerry <jk185160@ncr.com> | 2016-03-24 11:35:19 -0400 |
---|---|---|
committer | John Kerry <jk185160@ncr.com> | 2016-03-24 11:35:19 -0400 |
commit | c0d0e1cddcb4ead133428fe6ee30a84a51fd1db1 (patch) | |
tree | 52e5447340b0c93ffe0c40c9e8b381d921cc9792 /spec | |
parent | 360d506c9cdf0e94071f0a656eafbc7d2f302d9a (diff) | |
download | chef-c0d0e1cddcb4ead133428fe6ee30a84a51fd1db1.tar.gz |
Finishing off the sftp unit tests. Added some checks to the sftp provider to maintain the precedent set by the ftp provider
Diffstat (limited to 'spec')
-rw-r--r-- | spec/unit/provider/remote_file/sftp_spec.rb | 111 |
1 files changed, 107 insertions, 4 deletions
diff --git a/spec/unit/provider/remote_file/sftp_spec.rb b/spec/unit/provider/remote_file/sftp_spec.rb index 2cc473ae6b..c030ff83c1 100644 --- a/spec/unit/provider/remote_file/sftp_spec.rb +++ b/spec/unit/provider/remote_file/sftp_spec.rb @@ -28,23 +28,126 @@ describe Chef::Provider::RemoteFile::SFTP do } let(:new_resource) do - r = Chef::Resource::RemoteFile.new("remote file ftp backend test (new resource)") + r = Chef::Resource::RemoteFile.new("remote file sftp backend test (new resource)") r.path(resource_path) r end let(:current_resource) do - Chef::Resource::RemoteFile.new("remote file ftp backend test (current resource)'") + Chef::Resource::RemoteFile.new("remote file sftp backend test (current resource)'") end - let(:uri) { URI.parse("sftp://opscode.com/seattle.txt") } - describe "on initialization" do + + let(:uri) { URI.parse("sftp://conan:cthu1hu@opscode.com/seattle.txt") } + + let(:sftp) do + sftp = double(Net::SFTP, {}) + allow(sftp).to receive(:download!) + sftp + end + + let(:tempfile_path) { "/tmp/somedir/remote-file-sftp-backend-spec-test" } + + let(:tempfile) do + t = StringIO.new + allow(t).to receive(:path).and_return(tempfile_path) + t + end + + before(:each) do + allow(Net::SFTP).to receive(:start).with(any_args).and_return(sftp) + allow(Tempfile).to receive(:new).and_return(tempfile) + end + describe "on initialization without user and password provided in the URI" do + it "throws an argument exception with no userinfo is given" do + uri.userinfo = nil + uri.password = nil + uri.user = nil + expect { Chef::Provider::RemoteFile::SFTP.new(uri, new_resource, current_resource) }.to raise_error(ArgumentError) + end + + it "throws an argument exception with no user name is given" do + uri.userinfo = ":cthu1hu" + uri.password = "cthu1hu" + uri.user = nil + expect { Chef::Provider::RemoteFile::SFTP.new(uri, new_resource, current_resource) }.to raise_error(ArgumentError) + end + + it "throws an argument exception with no password is given" do + uri.userinfo = "conan:" + uri.password = nil + uri.user = "conan" + expect { Chef::Provider::RemoteFile::SFTP.new(uri, new_resource, current_resource) }.to raise_error(ArgumentError) + end + + end + + describe "on initialization with user and password provided in the URI" do it "throws an argument exception when no path is given" do uri.path = "" expect { Chef::Provider::RemoteFile::SFTP.new(uri, new_resource, current_resource) }.to raise_error(ArgumentError) end + it "throws an argument exception when only a / is given" do + uri.path = "/" + expect { Chef::Provider::RemoteFile::SFTP.new(uri, new_resource, current_resource) }.to raise_error(ArgumentError) + end + + it "throws an argument exception when no filename is given" do + uri.path = "/the/whole/path/" + expect { Chef::Provider::RemoteFile::SFTP.new(uri, new_resource, current_resource) }.to raise_error(ArgumentError) + end + + + end + + describe "when fetching the object" do + + let(:cache_control_data) { Chef::Provider::RemoteFile::CacheControlData.new(uri) } + let(:current_resource_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" } + + subject(:fetcher) { Chef::Provider::RemoteFile::SFTP.new(uri, new_resource, current_resource) } + + before do + current_resource.checksum(current_resource_checksum) + end + + it "should attempt to download a file from the provided url and path" do + expect(sftp).to receive(:download!).with("/seattle.txt", "/tmp/somedir/remote-file-sftp-backend-spec-test") + fetcher.fetch + end + + context "and the URI specifies an alternate port" do + let(:uri) { URI.parse("ftp://conan:cthu1hu@opscode.com:8021/seattle.txt") } + + it "should connect on an alternate port when one is provided" do + expect(Net::SFTP).to receive(:start).with("opscode.com:8021", "conan", :password => "cthu1hu") + fetcher.fetch + end + + end + + context "and the uri specifies a nested path" do + let(:uri) { URI.parse("ftp://conan:cthu1hu@opscode.com/the/whole/path/seattle.txt") } + + it "should fetch the file from the correct path" do + expect(sftp).to receive(:download!).with("the/whole/path/seattle.txt", "/tmp/somedir/remote-file-sftp-backend-spec-test") + fetcher.fetch + end + end + + context "when not using last modified based conditional fetching" do + before do + new_resource.use_last_modified(false) + end + + it "should return a tempfile in the result" do + result = fetcher.fetch + expect(result).to equal(tempfile) + end + + end end end |