cc7dbf8c2a5fdc0e2880aa3c162a8f30955143f8
[packages/precise/mcollective.git] / spec / unit / data_spec.rb
1 #!/usr/bin/env rspec
2
3 require 'spec_helper'
4
5 module MCollective
6   describe Data do
7     describe "#load_data_sources" do
8       it "should use the pluginmanager to load data sources" do
9         PluginManager.expects(:find_and_load).with("data").returns([])
10         Data.load_data_sources
11       end
12
13       it "should remove plugins that should not be active on this node" do
14         PluginManager.expects(:find_and_load).with("data").returns(["rspec_data"])
15         PluginManager.expects(:grep).returns(["rspec_data"])
16         PluginManager.expects(:delete).with("rspec_data")
17
18         ddl = mock
19         ddl.stubs(:meta).returns({:timeout => 1})
20         ddl.stubs(:dataquery_interface).returns({:rspec => nil})
21         ddl.stubs(:dataquery_interface).returns({:output => {}})
22         DDL.stubs(:new).returns(ddl)
23         Data::Base.expects(:activate?).returns(false)
24         PluginManager.expects("[]").with("rspec_data").returns(Data::Base.new)
25         Data.load_data_sources
26       end
27
28       it "should handle exceptions and delete broken plugins" do
29         PluginManager.expects(:find_and_load).with("data").returns(["rspec_data"])
30         PluginManager.expects(:grep).returns(["rspec_data"])
31         PluginManager.expects(:delete).with("rspec_data")
32
33         ddl = mock
34         ddl.stubs(:meta).returns({:timeout => 1})
35         ddl.stubs(:dataquery_interface).returns({:output => {}})
36         DDL.stubs(:new).returns(ddl)
37         Data::Base.expects(:activate?).raises("rspec failure")
38         Log.expects(:debug).once.with("Disabling data plugin rspec_data due to exception RuntimeError: rspec failure")
39         PluginManager.expects("[]").with("rspec_data").returns(Data::Base.new)
40         Data.load_data_sources
41       end
42     end
43
44     describe "#ddl" do
45       it "should load the right data ddl" do
46         DDL.expects(:new).with("fstat_data", :data).times(3)
47         Data.ddl("fstat")
48         Data.ddl("fstat_data")
49         Data.ddl(:fstat)
50       end
51     end
52
53     describe "#pluginname" do
54       it "should return the correct plugin name" do
55         Data.pluginname("Rspec").should == "rspec_data"
56         Data.pluginname("Rspec_data").should == "rspec_data"
57       end
58     end
59
60     describe "#[]" do
61       it "should return the correct plugin" do
62         PluginManager.expects("[]").with("rspec_data").times(4)
63         Data["Rspec"]
64         Data["rspec"]
65         Data["rspec_data"]
66         Data["rspec_Data"]
67       end
68     end
69
70     describe "#method_missing" do
71       it "should raise errors for unknown plugins" do
72         PluginManager.expects("include?").with("rspec_data").returns(false)
73         expect { Data.rspec_data }.to raise_error(NoMethodError)
74       end
75
76       it "should do a lookup on the right plugin" do
77         rspec_data = mock
78         rspec_data.expects(:lookup).returns("rspec")
79
80         PluginManager.expects("include?").with("rspec_data").returns(true)
81         PluginManager.expects("[]").with("rspec_data").returns(rspec_data)
82
83         Data.rspec_data("rspec").should == "rspec"
84       end
85     end
86
87     describe "#ddl_transform_intput" do
88       it "should convert boolean data" do
89         ddl = mock
90         ddl.stubs(:entities).returns({:data => {:input => {:query => {:type => :boolean}}}})
91         Data.ddl_transform_input(ddl, "1").should == true
92         Data.ddl_transform_input(ddl, "0").should == false
93       end
94
95       it "should conver numeric data" do
96         ddl = mock
97         ddl.stubs(:entities).returns({:data => {:input => {:query => {:type => :number}}}})
98         Data.ddl_transform_input(ddl, "1").should == 1
99         Data.ddl_transform_input(ddl, "0").should == 0
100         Data.ddl_transform_input(ddl, "1.1").should == 1.1
101       end
102
103       it "should return the original input on any failure" do
104         ddl = mock
105         ddl.expects(:entities).raises("rspec failure")
106         Data.ddl_transform_input(ddl, 1).should == 1
107       end
108     end
109
110     describe "#ddl_has_output?" do
111       it "should correctly verify output keys" do
112         ddl = mock
113         ddl.stubs(:entities).returns({:data => {:output => {:rspec => {}}}})
114         Data.ddl_has_output?(ddl, "rspec").should == true
115         Data.ddl_has_output?(ddl, :rspec).should == true
116         Data.ddl_has_output?(ddl, :foo).should == false
117         Data.ddl_has_output?(ddl, "foo").should == false
118       end
119
120       it "should return false for any exception" do
121         ddl = mock
122         ddl.stubs(:entities).returns(nil)
123         Data.ddl_has_output?(ddl, "rspec").should == false
124       end
125     end
126
127     describe "#ddl_validate" do
128       before do
129         @ddl = mock
130         @ddl.expects(:meta).returns({:name => "rspec test"})
131       end
132
133       it "should ensure the ddl has a dataquery" do
134         @ddl.expects(:entities).returns({})
135         expect { Data.ddl_validate(@ddl, "rspec") }.to raise_code(:PLMC31, :plugin => "rspec test")
136       end
137
138       it "should allow ddls without any input defined" do
139         @ddl.expects(:entities).returns({:data => {:input => {}, :output => {:x => {}}}})
140         Data.ddl_validate(@ddl, nil)
141       end
142
143       it "should not allow input arguments when no query were defined" do
144         @ddl.expects(:entities).returns({:data => {:input => {}, :output => {:x => {}}}})
145         expect { Data.ddl_validate(@ddl, "rspec") }.to raise_code(:PLMC33, :plugin => "rspec test")
146       end
147
148       it "should ensure the ddl has output" do
149         @ddl.expects(:entities).returns({:data => {:input => {:query => {}}, :output => {}}})
150         expect { Data.ddl_validate(@ddl, "rspec") }.to raise_code(:PLMC32, :plugin => "rspec test")
151       end
152
153       it "should skip optional arguments that were not supplied" do
154         @ddl.expects(:entities).returns({:data => {:input => {:query => {:optional => true}}, :output => {:test => {}}}})
155         @ddl.expects(:validate_input_argument).never
156         Data.ddl_validate(@ddl, nil).should == true
157       end
158
159       it "should validate the argument" do
160         @ddl.expects(:entities).returns({:data => {:input => {:query => {}}, :output => {:test => {}}}})
161         @ddl.expects(:validate_input_argument).returns("rspec validated")
162         Data.ddl_validate(@ddl, "rspec").should == "rspec validated"
163       end
164     end
165   end
166 end