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