# # Author:: Adam Jacob () # Copyright:: Copyright (c) Chef Software Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require "spec_helper" describe Chef::FileCache do before do @file_cache_path = Dir.mktmpdir Chef::Config[:file_cache_path] = @file_cache_path @io = StringIO.new end after do FileUtils.rm_rf(Chef::Config[:file_cache_path]) end describe "when the relative path to the cache file doesn't exist" do it "creates intermediate directories as needed" do Chef::FileCache.store("whiz/bang", "I found a poop") expect(File).to exist(File.join(@file_cache_path, "whiz")) end it "creates the cached file at the correct relative path" do expect(File).to receive(:open).with(File.join(@file_cache_path, "whiz", "bang"), "w", 416).and_yield(@io) Chef::FileCache.store("whiz/bang", "borkborkbork") end end describe "when storing a file" do before do allow(File).to receive(:open).and_yield(@io) end it "should print the contents to the file" do Chef::FileCache.store("whiz/bang", "borkborkbork") expect(@io.string).to eq("borkborkbork") end end describe "when loading cached files" do it "finds and reads the cached file" do FileUtils.mkdir_p(File.join(@file_cache_path, "whiz")) File.open(File.join(@file_cache_path, "whiz", "bang"), "w") { |f| f.print("borkborkbork") } expect(Chef::FileCache.load("whiz/bang")).to eq("borkborkbork") end it "should raise a Chef::Exceptions::FileNotFound if the file doesn't exist" do expect { Chef::FileCache.load("whiz/bang") }.to raise_error(Chef::Exceptions::FileNotFound) end end describe "when deleting cached files" do before(:each) do FileUtils.mkdir_p(File.join(@file_cache_path, "whiz")) File.open(File.join(@file_cache_path, "whiz", "bang"), "w") { |f| f.print("borkborkbork") } end it "unlinks the file" do Chef::FileCache.delete("whiz/bang") expect(File).not_to exist(File.join(@file_cache_path, "whiz", "bang")) end end describe "when listing files in the cache" do before(:each) do FileUtils.mkdir_p(File.join(@file_cache_path, "whiz")) FileUtils.touch(File.join(@file_cache_path, "whiz", "bang")) FileUtils.mkdir_p(File.join(@file_cache_path, "snappy")) FileUtils.touch(File.join(@file_cache_path, "snappy", "patter")) end it "should return the relative paths" do expect(Chef::FileCache.list.sort).to eq(%w{snappy/patter whiz/bang}) end it "searches for cached files by globbing" do expect(Chef::FileCache.find("snappy/**/*")).to eq(%w{snappy/patter}) end end describe "when checking for the existence of a file" do before do FileUtils.mkdir_p(File.join(@file_cache_path, "whiz")) end it "has a key if the corresponding cache file exists" do FileUtils.touch(File.join(@file_cache_path, "whiz", "bang")) expect(Chef::FileCache).to have_key("whiz/bang") end it "doesn't have a key if the corresponding cache file doesn't exist" do expect(Chef::FileCache).not_to have_key("whiz/bang") end end end