require 'spec/spec_helper' class ErrorPlugin < Scout::Plugin def build_report raise 'FOO' end end class FooPlugin < Scout::Plugin OPTIONS=<<-EOS username: name: Username notes: The MySQL username to use default: other EOS end class FooPlugin::NestedPlugin < Scout::Plugin end class OptionsPlugin < Scout::Plugin OPTIONS=<<-EOS host: name: Host notes: The slave host to monitor default: 127.0.0.1 username: name: Username notes: The MySQL username to use default: root EOS end describe Deputy do it "has a VERSION" do Deputy::VERSION.should =~ /^\d+\.\d+\.\d+$/ end def klass(name, options={}) <<-CODE module TEMP_#{options[:rand]||rand(11111)} def self.interval 60 end class #{name} < Scout::Plugin #{options[:class_eval]} def build_report #{options[:code]} end end end CODE end describe Scout do describe :plugins do it "finds plugins" do Scout.plugins(klass('A', :rand => 1111)).inspect.should == '[[60, TEMP_1111::A]]' end it "reports non-plugins" do Deputy.should_receive(:send_report) Scout.plugins("module TEMP_XXX;def self.interval;60;end;class Foo;def self.interval;11;end;end;end").inspect.should == '[]' end end describe :option do it "get default" do OptionsPlugin.new.send(:option, :username).should == 'root' end it "get nil when no default is there" do OptionsPlugin.new.send(:option, :foo).should == nil end it "get nil when no OPTIONS are there" do ErrorPlugin.new.send(:option, :foo).should == nil end it "does not overwrite others" do FooPlugin.new.send(:option, :username).should == 'other' end end describe :report do it "sends a report" do Deputy.should_receive(:send_report).with("NestedPlugin.x", 1) FooPlugin::NestedPlugin.new.send(:report, :x => 1) end it "sends multiple reports" do Deputy.should_receive(:send_report).with("NestedPlugin.x", 1) Deputy.should_receive(:send_report).with("NestedPlugin.y", 2) FooPlugin::NestedPlugin.new.send(:report, :x => 1, 'y' => 2) end it "sends alerts" do Deputy.should_receive(:send_report).with("NestedPlugin.alert", '1, "2"') FooPlugin::NestedPlugin.new.send(:alert, 1, "2") end it "sends errors" do Deputy.should_receive(:send_report).with("NestedPlugin.error", '1, "2"') FooPlugin::NestedPlugin.new.send(:error, 1, "2") end end describe :memory do before do `rm -f #{FooPlugin::NestedPlugin.new.send(:memory_file)}` `rm -f #{FooPlugin.new.send(:memory_file)}` end it "remembers" do FooPlugin::NestedPlugin.new.send(:remember, 'foo' => 1) FooPlugin::NestedPlugin.new.send(:memory, 'foo').should == 1 end it "remembers different stuff" do FooPlugin::NestedPlugin.new.send(:remember, :foo => 1) FooPlugin::NestedPlugin.new.send(:remember, :bar => 1) FooPlugin::NestedPlugin.new.send(:memory, :foo).should == 1 FooPlugin::NestedPlugin.new.send(:memory, :bar).should == 1 end it "is nil for unremembered" do FooPlugin::NestedPlugin.new.send(:memory, :asdsa).should == nil FooPlugin.new.send(:memory, :asdsa).should == nil end end describe :needs do it "can create plugins with needs" do Scout.plugins(klass('D', :class_eval => "needs 'fastercsv'", :rand => 1112)).inspect.should == '[[60, TEMP_1112::D]]' defined?(FasterCSV).should == "constant" end end end describe :run_plugins do it "executes all plugins" do $notify = 0 Deputy.stub!(:sheriff_url).and_return 'http://sheri.ff' FakeWeb.register_uri(:get, "http://sheri.ff/plugins.rb", :body => klass('C', :code => '$notify=1')) FakeWeb.register_uri(:get, "http://sheri.ff/notify?group=Deputies.finished&value=1", :body => 'OK') Deputy.run_plugins $notify.should == 1 end end describe :send_report do it "sends a report" do Deputy.stub!(:sheriff_url).and_return 'http://sheri.ff' FakeWeb.register_uri(:get, "http://sheri.ff/notify?group=Xxx.yyy&value=123", :body => 'OK') Deputy.send_report('Xxx.yyy', '123').should == 'OK' end it "escapes metric names" do Deputy.stub!(:sheriff_url).and_return 'http://sheri.ff' FakeWeb.register_uri(:get, "http://sheri.ff/notify?group=Xxx.yy%3Fy&value=123", :body => 'OK') Deputy.send_report('Xxx.yy?y', '123').should == 'OK' end end end