Updated mcollective.init according to OSCI-658
[packages/precise/mcollective.git] / spec / unit / applications_spec.rb
diff --git a/spec/unit/applications_spec.rb b/spec/unit/applications_spec.rb
new file mode 100755 (executable)
index 0000000..ddc7225
--- /dev/null
@@ -0,0 +1,155 @@
+#!/usr/bin/env rspec
+
+require 'spec_helper'
+
+module MCollective
+  describe Applications do
+    before do
+      tmpfile = Tempfile.new("mc_applications_spec")
+      path = tmpfile.path
+      tmpfile.close!
+
+      @tmpdir = FileUtils.mkdir_p(path)
+      @tmpdir = @tmpdir[0] if @tmpdir.is_a?(Array) # ruby 1.9.2
+      $LOAD_PATH << @tmpdir
+
+      @appsdir = File.join([@tmpdir, "mcollective", "application"])
+      FileUtils.mkdir_p(@appsdir)
+
+      FileUtils.cp(File.join([File.dirname(__FILE__), "..", "fixtures", "application", "test.rb"]), @appsdir)
+    end
+
+    after do
+      FileUtils.rm_r(@tmpdir)
+    end
+
+    describe "[]" do
+      it "should load the config" do
+        Applications.expects(:load_config).once
+        PluginManager.expects("[]").once
+        Applications["test"]
+      end
+
+      it "should return the correct stored application" do
+        app = mock("app")
+        app.stubs(:run)
+
+        Applications.expects(:load_config).once
+        PluginManager.expects("[]").with("test_application").once.returns(app)
+        Applications["test"].should == app
+      end
+    end
+
+    describe "#run" do
+      it "should load the configuration" do
+        app = mock("app")
+        app.stubs(:run)
+
+        Applications.expects(:load_config).once
+        Applications.expects(:load_application).once
+        PluginManager.expects("[]").once.returns(app)
+
+        Applications.run("test")
+      end
+
+      it "should load the application" do
+        app = mock("app")
+        app.stubs(:run)
+
+        Applications.expects(:load_config).once
+        Applications.expects(:load_application).with("test").once
+        PluginManager.expects("[]").once.returns(app)
+
+        Applications.run("test")
+      end
+
+      it "should invoke the application run method" do
+        app = mock("app")
+        app.stubs(:run).returns("hello world")
+
+        Applications.expects(:load_config).once
+        Applications.expects(:load_application)
+        PluginManager.expects("[]").once.returns(app)
+
+        Applications.run("test").should == "hello world"
+      end
+    end
+
+    describe "#load_application" do
+      it "should return the existing application if already loaded" do
+        app = mock("app")
+        app.stubs(:run)
+
+        PluginManager << {:type => "test_application", :class => app}
+
+        Applications.expects("load_config").never
+
+        Applications.load_application("test")
+      end
+
+      it "should load the config" do
+        Applications.expects("load_config").returns(true).once
+        Applications.load_application("test")
+      end
+
+      it "should load the correct class from disk" do
+        PluginManager.expects("loadclass").with("MCollective::Application::Test")
+        Applications.expects("load_config").returns(true).once
+
+        Applications.load_application("test")
+      end
+
+      it "should add the class to the plugin manager" do
+        Applications.expects("load_config").returns(true).once
+
+        PluginManager.expects("<<").with({:type => "test_application", :class => "MCollective::Application::Test"})
+
+        Applications.load_application("test")
+      end
+    end
+
+    describe "#list" do
+      it "should load the configuration" do
+        Applications.expects("load_config").returns(true).once
+        Config.instance.expects("libdir").returns([@tmpdir])
+        Applications.list
+      end
+
+      it "should add found applications to the list" do
+        Applications.expects("load_config").returns(true).once
+        Config.instance.expects("libdir").returns([@tmpdir])
+
+        Applications.list.should == ["test"]
+      end
+
+      it "should print a friendly error and exit on failure" do
+        Applications.expects("load_config").raises(Exception)
+        IO.any_instance.expects(:puts).with(regexp_matches(/Failed to generate application list/)).once
+
+        expect {
+          Applications.list.should
+        }.to raise_error(SystemExit)
+      end
+    end
+
+    describe "#filter_extra_options" do
+      it "should parse --config=x" do
+        ["--config=x --foo=bar -f -f bar", "--foo=bar --config=x -f -f bar"].each do |t|
+          Applications.filter_extra_options(t).should == "--config=x"
+        end
+      end
+
+      it "should parse --config x" do
+        ["--config x --foo=bar -f -f bar", "--foo=bar --config x -f -f bar"].each do |t|
+          Applications.filter_extra_options(t).should == "--config=x"
+        end
+      end
+
+      it "should parse -c x" do
+        ["-c x --foo=bar -f -f bar", "--foo=bar -c x -f -f bar"].each do |t|
+          Applications.filter_extra_options(t).should == "--config=x"
+        end
+      end
+    end
+  end
+end