X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=spec%2Funit%2Fdata_spec.rb;fp=spec%2Funit%2Fdata_spec.rb;h=a117ce0bf4db828ea96f5ca49df758d85fc2d3a2;hb=b87d2f4e68281062df1913440ca5753ae63314a9;hp=0000000000000000000000000000000000000000;hpb=ab0ea530b8ac956091f17b104ab2311336cfc250;p=packages%2Fprecise%2Fmcollective.git diff --git a/spec/unit/data_spec.rb b/spec/unit/data_spec.rb new file mode 100644 index 0000000..a117ce0 --- /dev/null +++ b/spec/unit/data_spec.rb @@ -0,0 +1,163 @@ +#!/usr/bin/env rspec + +require 'spec_helper' + +module MCollective + describe Data do + describe "#load_data_sources" do + it "should use the pluginmanager to load data sources" do + PluginManager.expects(:find_and_load).with("data").returns([]) + Data.load_data_sources + end + + it "should remove plugins that should not be active on this node" do + PluginManager.expects(:find_and_load).with("data").returns(["rspec_data"]) + PluginManager.expects(:grep).returns(["rspec_data"]) + PluginManager.expects(:delete).with("rspec_data") + + ddl = mock + ddl.stubs(:meta).returns({:timeout => 1}) + DDL.stubs(:new).returns(ddl) + Data::Base.expects(:activate?).returns(false) + PluginManager.expects("[]").with("rspec_data").returns(Data::Base.new) + Data.load_data_sources + end + + it "should handle exceptions and delete broken plugins" do + PluginManager.expects(:find_and_load).with("data").returns(["rspec_data"]) + PluginManager.expects(:grep).returns(["rspec_data"]) + PluginManager.expects(:delete).with("rspec_data") + + ddl = mock + ddl.stubs(:meta).returns({:timeout => 1}) + DDL.stubs(:new).returns(ddl) + Data::Base.expects(:activate?).raises("rspec failure") + Log.expects(:debug).once.with("Disabling data plugin rspec_data due to exception RuntimeError: rspec failure") + PluginManager.expects("[]").with("rspec_data").returns(Data::Base.new) + Data.load_data_sources + end + end + + describe "#ddl" do + it "should load the right data ddl" do + DDL.expects(:new).with("fstat_data", :data).times(3) + Data.ddl("fstat") + Data.ddl("fstat_data") + Data.ddl(:fstat) + end + end + + describe "#pluginname" do + it "should return the correct plugin name" do + Data.pluginname("Rspec").should == "rspec_data" + Data.pluginname("Rspec_data").should == "rspec_data" + end + end + + describe "#[]" do + it "should return the correct plugin" do + PluginManager.expects("[]").with("rspec_data").times(4) + Data["Rspec"] + Data["rspec"] + Data["rspec_data"] + Data["rspec_Data"] + end + end + + describe "#method_missing" do + it "should raise errors for unknown plugins" do + PluginManager.expects("include?").with("rspec_data").returns(false) + expect { Data.rspec_data }.to raise_error(NoMethodError) + end + + it "should do a lookup on the right plugin" do + rspec_data = mock + rspec_data.expects(:lookup).returns("rspec") + + PluginManager.expects("include?").with("rspec_data").returns(true) + PluginManager.expects("[]").with("rspec_data").returns(rspec_data) + + Data.rspec_data("rspec").should == "rspec" + end + end + + describe "#ddl_transform_intput" do + it "should convert boolean data" do + ddl = mock + ddl.stubs(:entities).returns({:data => {:input => {:query => {:type => :boolean}}}}) + Data.ddl_transform_input(ddl, "1").should == true + Data.ddl_transform_input(ddl, "0").should == false + end + + it "should conver numeric data" do + ddl = mock + ddl.stubs(:entities).returns({:data => {:input => {:query => {:type => :number}}}}) + Data.ddl_transform_input(ddl, "1").should == 1 + Data.ddl_transform_input(ddl, "0").should == 0 + Data.ddl_transform_input(ddl, "1.1").should == 1.1 + end + + it "should return the original input on any failure" do + ddl = mock + ddl.expects(:entities).raises("rspec failure") + Data.ddl_transform_input(ddl, 1).should == 1 + end + end + + describe "#ddl_has_output?" do + it "should correctly verify output keys" do + ddl = mock + ddl.stubs(:entities).returns({:data => {:output => {:rspec => {}}}}) + Data.ddl_has_output?(ddl, "rspec").should == true + Data.ddl_has_output?(ddl, :rspec).should == true + Data.ddl_has_output?(ddl, :foo).should == false + Data.ddl_has_output?(ddl, "foo").should == false + end + + it "should return false for any exception" do + ddl = mock + ddl.stubs(:entities).returns(nil) + Data.ddl_has_output?(ddl, "rspec").should == false + end + end + + describe "#ddl_validate" do + before do + @ddl = mock + @ddl.expects(:meta).returns({:name => "rspec test"}) + end + + it "should ensure the ddl has a dataquery" do + @ddl.expects(:entities).returns({}) + expect { Data.ddl_validate(@ddl, "rspec") }.to raise_code(:PLMC31, :plugin => "rspec test") + end + + it "should allow ddls without any input defined" do + @ddl.expects(:entities).returns({:data => {:input => {}, :output => {:x => {}}}}) + Data.ddl_validate(@ddl, nil) + end + + it "should not allow input arguments when no query were defined" do + @ddl.expects(:entities).returns({:data => {:input => {}, :output => {:x => {}}}}) + expect { Data.ddl_validate(@ddl, "rspec") }.to raise_code(:PLMC33, :plugin => "rspec test") + end + + it "should ensure the ddl has output" do + @ddl.expects(:entities).returns({:data => {:input => {:query => {}}, :output => {}}}) + expect { Data.ddl_validate(@ddl, "rspec") }.to raise_code(:PLMC32, :plugin => "rspec test") + end + + it "should skip optional arguments that were not supplied" do + @ddl.expects(:entities).returns({:data => {:input => {:query => {:optional => true}}, :output => {:test => {}}}}) + @ddl.expects(:validate_input_argument).never + Data.ddl_validate(@ddl, nil).should == true + end + + it "should validate the argument" do + @ddl.expects(:entities).returns({:data => {:input => {:query => {}}, :output => {:test => {}}}}) + @ddl.expects(:validate_input_argument).returns("rspec validated") + Data.ddl_validate(@ddl, "rspec").should == "rspec validated" + end + end + end +end