Updated mcollective.init according to OSCI-658
[packages/precise/mcollective.git] / spec / unit / plugins / mcollective / packagers / rpmpackage_packager_spec.rb
diff --git a/spec/unit/plugins/mcollective/packagers/rpmpackage_packager_spec.rb b/spec/unit/plugins/mcollective/packagers/rpmpackage_packager_spec.rb
new file mode 100644 (file)
index 0000000..9f06e27
--- /dev/null
@@ -0,0 +1,169 @@
+#!/usr/bin/env rspec
+require 'spec_helper'
+require File.dirname(__FILE__) + '/../../../../../plugins/mcollective/pluginpackager/rpmpackage_packager.rb'
+
+module MCollective
+  module PluginPackager
+    describe RpmpackagePackager do
+      let(:maketmpdir) do
+        tmpdir = Dir.mktmpdir("mc-test")
+        @tmpdirs << tmpdir
+        tmpdir
+      end
+
+      before :all do
+        @tmpdirs = []
+      end
+
+      before :each do
+        PluginPackager.stubs(:build_tool?).with("rpmbuild-md5").returns(true)
+        PluginPackager.stubs(:build_tool?).with("rpmbuild").returns(true)
+        @plugin = mock()
+        @plugin.stubs(:iteration).returns("1")
+        @plugin.stubs(:metadata).returns({:name => "test", :version => "1"})
+        @plugin.stubs(:mcname).returns("mcollective")
+        RpmpackagePackager.any_instance.stubs(:rpmdir).returns('rpmdir')
+        RpmpackagePackager.any_instance.stubs(:srpmdir).returns('srpmdir')
+      end
+
+      after :all do
+        @tmpdirs.each{|tmpdir| FileUtils.rm_rf tmpdir if File.directory? tmpdir}
+      end
+
+      describe "#initialize" do
+
+        it "should raise and exception if neither rpmbuild or rpmbuild-md5 is installed is not present" do
+          PluginPackager.expects(:build_tool?).with("rpmbuild-md5").returns(false)
+          PluginPackager.expects(:build_tool?).with("rpmbuild").returns(false)
+          expect{
+            RpmpackagePackager.new("plugin")
+          }.to raise_exception(RuntimeError, "creating rpms require 'rpmbuild' or 'rpmbuild-md5' to be installed")
+        end
+
+        it "should set the correct libdir" do
+          packager = RpmpackagePackager.new("plugin")
+          packager.libdir.should == "/usr/libexec/mcollective/mcollective/"
+
+          packager = RpmpackagePackager.new("plugin", "/tmp/")
+          packager.libdir.should == "/tmp/"
+        end
+
+      end
+
+      describe "#create_packages" do
+        before :each do
+          @packager = RpmpackagePackager.new(@plugin)
+          @packager.tmpdir = maketmpdir
+          @packager.stubs(:create_package)
+          @packager.stubs(:cleanup_tmpdirs)
+          @plugin.stubs(:packagedata).returns(:test => {:files => ["test.rb"]})
+          @packager.stubs(:prepare_tmpdirs)
+          Dir.stubs(:mktmpdir)
+        end
+
+        it "should set the package instance variables" do
+          @packager.create_packages
+          @packager.current_package_type.should == :test
+          @packager.current_package_data.should == {:files => ["test.rb"]}
+          @packager.current_package_name.should == "mcollective-test-test"
+        end
+
+        it "should create the build dir" do
+          @packager.expects(:prepare_tmpdirs)
+          @packager.create_packages
+        end
+
+        it "should create packages" do
+          @packager.expects(:create_package)
+          @packager.create_packages
+        end
+
+      end
+
+      describe "#create_package" do
+        before :each do
+          @packager = RpmpackagePackager.new(@plugin)
+        end
+
+        it "should create the package" do
+          Dir.expects(:chdir)
+          PluginPackager.expects(:safe_system).with("rpmbuild-md5 -ta   /tmp/mcollective-testplugin-test-1.tgz")
+          FileUtils.expects(:cp).times(2)
+          @packager.tmpdir = "/tmp"
+          @packager.verbose = "true"
+          @packager.expects(:make_spec_file)
+          @packager.current_package_name = "mcollective-testplugin-test"
+          @packager.expects(:puts).with('Created RPM and SRPM packages for mcollective-testplugin-test')
+          @packager.create_package(:test, {:files => ["foo.rb"]})
+        end
+
+        it "should sign the package if a signature is given" do
+          Dir.expects(:chdir)
+          PluginPackager.expects(:safe_system).with("rpmbuild-md5 -ta  --sign /tmp/mcollective-testplugin-test-1.tgz")
+          FileUtils.expects(:cp).times(2)
+          @packager.signature = true
+          @packager.tmpdir = "/tmp"
+          @packager.verbose = "true"
+          @packager.expects(:make_spec_file)
+          @packager.current_package_name = "mcollective-testplugin-test"
+          @packager.expects(:puts).with('Created RPM and SRPM packages for mcollective-testplugin-test')
+          @packager.create_package(:test, {:files => ["foo.rb"]})
+        end
+
+        it "should raise an error if the package can't be built" do
+          @packager = RpmpackagePackager.new(@plugin)
+          @packager.tmpdir = "/tmp"
+          @packager.expects(:make_spec_file)
+          PluginPackager.stubs(:do_quietly?).raises("foo")
+          expect{
+            @packager.create_package("", "")
+          }.to raise_error(RuntimeError, "Could not build package. Reason - foo")
+        end
+      end
+
+      describe "#make_spec_file" do
+        before :each do
+          @plugin = mock
+          @packager = RpmpackagePackager.new(@plugin)
+        end
+
+        it "should raise an exception if specfile cannot be built" do
+          File.expects(:dirname).raises("test error")
+          expect{
+            @packager.make_spec_file
+          }.to raise_error(RuntimeError, "Could not create specfile - test error")
+        end
+
+        it "should create the specfile from the erb" do
+          File.stubs(:read).returns("specfile")
+          @plugin.stubs(:metadata).returns({:version => 2})
+          @packager.current_package_name = "test"
+          @packager.tmpdir = maketmpdir
+          Dir.mkdir(File.join(@packager.tmpdir, "test-2"))
+          @packager.make_spec_file
+          File.read(File.join(@packager.tmpdir, "test-2", "test-2.spec")).should == "specfile"
+        end
+      end
+
+      describe "#prepare_tmpdirs" do
+        it "should create the tmp dirs and cp the package files" do
+          @plugin.stubs(:target_path).returns("")
+          packager = RpmpackagePackager.new(@plugin)
+          FileUtils.expects(:mkdir_p)
+          File.stubs(:join).returns("/target")
+          FileUtils.expects(:cp_r).with("test.rb", "/target")
+          packager.prepare_tmpdirs({:files => ["test.rb"]})
+        end
+      end
+
+      describe "#cleanup_tmpdirs" do
+        it "should remove the temp directories" do
+          packager = RpmpackagePackager.new("package")
+          packager.tmpdir = maketmpdir
+          packager.cleanup_tmpdirs
+          File.directory?(packager.tmpdir).should == false
+        end
+      end
+    end
+  end
+end