add a new function called tfile
authormh <mh@immerda.ch>
Thu, 30 Dec 2010 13:04:53 +0000 (14:04 +0100)
committermh <mh@immerda.ch>
Thu, 30 Dec 2010 13:04:53 +0000 (14:04 +0100)
lib/puppet/parser/functions/tfile.rb [new file with mode: 0644]
spec/unit/parser/functions/tfile.rb [new file with mode: 0644]

diff --git a/lib/puppet/parser/functions/tfile.rb b/lib/puppet/parser/functions/tfile.rb
new file mode 100644 (file)
index 0000000..2e792f9
--- /dev/null
@@ -0,0 +1,18 @@
+Puppet::Parser::Functions::newfunction(
+  :tfile,
+  :type => :rvalue,
+  :doc => "Returns the content of a file. If the file or the path does not
+    yet exist, it will create the path and touch the file."
+) do |args|
+  raise Puppet::ParseError, 'tfile() needs one argument' if args.length != 1
+  path = args.to_a.first
+  unless File.exists?(path)
+    dir = File.dirname(path)
+    unless File.directory?(dir)
+      Puppet::Util.recmkdir(dir,0700)
+    end
+    require 'fileutils'
+    FileUtils.touch(path)
+  end
+  function_file([path])
+end
diff --git a/spec/unit/parser/functions/tfile.rb b/spec/unit/parser/functions/tfile.rb
new file mode 100644 (file)
index 0000000..e64170a
--- /dev/null
@@ -0,0 +1,54 @@
+#! /usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+require 'mocha'
+
+describe "the tfile function" do
+
+  before :each do
+    @scope = Puppet::Parser::Scope.new
+  end
+
+  it "should exist" do
+    Puppet::Parser::Functions.function("tfile").should == "function_tfile"
+  end
+
+  it "should raise a ParseError if there is less than 1 arguments" do
+    lambda { @scope.function_tfile([]) }.should( raise_error(Puppet::ParseError))
+  end
+
+  it "should raise a ParseError if there is more than 1 arguments" do
+    lambda { @scope.function_tfile(["bar", "gazonk"]) }.should( raise_error(Puppet::ParseError))
+  end
+
+  describe "when executed properly" do
+
+    before :each do
+       Puppet::Parser::Scope.any_instance.stubs(:function_file).with(['/some_path/aa']).returns("foo1\nfoo2\n")
+    end
+
+    it "should return the content of the file by calling the puppet file function" do
+      File.stubs(:exists?).with('/some_path/aa').returns(true)
+      result = @scope.function_tfile(['/some_path/aa'])
+      result.should == "foo1\nfoo2\n"
+    end
+
+    it "should touch a file if it does not exist" do
+      File.stubs(:exists?).with('/some_path/aa').returns(false)
+      File.stubs(:directory?).with('/some_path').returns(true)
+      FileUtils.expects(:touch).with('/some_path/aa')
+      result = @scope.function_tfile(['/some_path/aa'])
+      result.should == "foo1\nfoo2\n"
+    end
+
+    it "should create the path if it does not exist" do
+      File.stubs(:exists?).with('/some_path/aa').returns(false)
+      File.stubs(:directory?).with('/some_path').returns(false)
+      Puppet::Util.expects(:recmkdir).with("/some_path",0700)
+      FileUtils.expects(:touch).with('/some_path/aa')
+      result = @scope.function_tfile(['/some_path/aa'])
+      result.should == "foo1\nfoo2\n"
+    end
+  end
+
+end