diff options
author | Patrick J Cherry <patrick@bytemark.co.uk> | 2012-04-27 11:12:27 +0100 |
---|---|---|
committer | Patrick J Cherry <patrick@bytemark.co.uk> | 2012-04-27 11:12:27 +0100 |
commit | dada535a41cba45be0eff77381d6c7e19ab49f51 (patch) | |
tree | f33ab8706c38f278fbdec539e69874d72a9e1b74 | |
parent | ffb9ad5713f0f7b895ec142028abae16d824e3b9 (diff) |
Added better time-based people list polling, and added a "calendar" method to
the config to easily generate Procs to call for people_lists.
-rw-r--r-- | debian/changelog | 4 | ||||
-rw-r--r-- | lib/mauve/configuration.rb | 4 | ||||
-rw-r--r-- | lib/mauve/notification.rb | 3 | ||||
-rw-r--r-- | lib/mauve/people_list.rb | 4 | ||||
-rw-r--r-- | test/tc_mauve_notification.rb | 37 | ||||
-rw-r--r-- | test/tc_mauve_people_list.rb | 31 |
6 files changed, 66 insertions, 17 deletions
diff --git a/debian/changelog b/debian/changelog index a271f9b..f41e76e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,8 +2,10 @@ mauvealert (3.8.2) stable; urgency=low * Reverted bad changes to mauveserver + example.conf * Added default options for a person + * Added calendar check for a people_list + * Added a time at which to check the people in a people_list - -- Patrick J Cherry <patrick@bytemark.co.uk> Fri, 27 Apr 2012 10:58:56 +0100 + -- Patrick J Cherry <patrick@bytemark.co.uk> Fri, 27 Apr 2012 11:00:21 +0100 mauvealert (3.8.1) stable; urgency=low diff --git a/lib/mauve/configuration.rb b/lib/mauve/configuration.rb index 3a8f9cc..8a0b982 100644 --- a/lib/mauve/configuration.rb +++ b/lib/mauve/configuration.rb @@ -165,5 +165,9 @@ module Mauve @max_acknowledgement_time = arg end + def calendar=(x) + lambda{|at| CalendarInterface.get_attendees(x,at)} + end + end end diff --git a/lib/mauve/notification.rb b/lib/mauve/notification.rb index 8a5d241..899972b 100644 --- a/lib/mauve/notification.rb +++ b/lib/mauve/notification.rb @@ -122,8 +122,9 @@ module Mauve # def no_one_in(people_list) return true unless Configuration.current.people_lists.has_key?(people_list) + @test_time = @time if @test_time.nil? - return Configuration.current.people_lists[people_list].people.empty? + return Configuration.current.people_lists[people_list].people(@test_time).empty? end # Returns true if the current hour is in the list of hours given. diff --git a/lib/mauve/people_list.rb b/lib/mauve/people_list.rb index 0433034..f632f78 100644 --- a/lib/mauve/people_list.rb +++ b/lib/mauve/people_list.rb @@ -63,9 +63,9 @@ module Mauve # Return the array of people # # @return [Array] - def people + def people(at = Time.now) l = list.collect do |name| - name.is_a?(Proc) ? name.call : name + name.is_a?(Proc) ? name.call(at) : name end.flatten.compact.uniq.collect do |name| Configuration.current.people[name] end.compact diff --git a/test/tc_mauve_notification.rb b/test/tc_mauve_notification.rb index 7a71c47..21ff41e 100644 --- a/test/tc_mauve_notification.rb +++ b/test/tc_mauve_notification.rb @@ -7,17 +7,22 @@ require 'mauve/configuration' require 'mauve/configuration_builder' require 'mauve/configuration_builders' require 'mauve/mauve_time' +require 'webmock' class TcMauveDuringRunner < Mauve::UnitTest include Mauve + include WebMock::API def setup super setup_database + WebMock.disable_net_connect! end def teardown + WebMock.reset! + WebMock.allow_net_connect! teardown_database super end @@ -187,6 +192,38 @@ EOF assert(!dr.send(:no_one_in, "not empty")) end + def test_no_one_in_with_calendar + config=<<EOF +bytemark_calendar_url "http://localhost" +person "test1" +person "test2" + +people_list "support", calendar("support_shift") +EOF + + Configuration.current = ConfigurationBuilder.parse(config) + + stub_request(:get, "http://localhost/api/attendees/support_shift/2011-08-01T00:00:00"). + to_return(:status => 200, :body => YAML.dump(%w(test1 test2))) + + stub_request(:get, "http://localhost/api/attendees/support_shift/2011-08-01T00:05:00"). + to_return(:status => 200, :body => YAML.dump([])) + + dr = DuringRunner.new(Time.now) + assert(!dr.send(:no_one_in, "support")) + + # advance by 5 minutes, and try again -- we should get the same answer. + Timecop.freeze(Time.now + 5.minutes) + assert(!dr.send(:no_one_in, "support")) + + # However a new runner should return true. + dr = DuringRunner.new(Time.now) + assert(dr.send(:no_one_in, "support")) + # + # We expect a warning about an empty list. + logger_pop + end + end class TcMauveNotification < Mauve::UnitTest diff --git a/test/tc_mauve_people_list.rb b/test/tc_mauve_people_list.rb index fd8bda9..78586d2 100644 --- a/test/tc_mauve_people_list.rb +++ b/test/tc_mauve_people_list.rb @@ -5,28 +5,28 @@ require 'mauve/people_list' require 'mauve/configuration' require 'mauve/configuration_builder' require 'mauve/configuration_builders' +require 'webmock' require 'pp' class TcMauvePeopleList < Mauve::UnitTest include Mauve + include WebMock::API def setup super setup_database + WebMock.disable_net_connect! end def teardown + WebMock.reset! + WebMock.allow_net_connect! teardown_database super end def test_send_alert - # - # Allows us to pick up notifications sent. - # - $sent_notifications = [] - config =<<EOF notification_method("email") { debug! @@ -119,27 +119,32 @@ EOF end def test_dynamic_people_list - # - # Allows us to pick up notifications sent. - # - $sent_notifications = [] - config =<<EOF +bytemark_calendar_url "http://localhost" person "test1" - person "test2" # # This should oscillate between test1 and test2. # -people_list "testers", lambda { $ans = ($ans == "test1" ? "test2" : "test1") } +people_list "testers", calendar("support_shift") EOF Configuration.current = ConfigurationBuilder.parse(config) + + # + # Stub HTTP requests to return test1 now, and tes2 later. + # + stub_request(:get, "http://localhost/api/attendees/support_shift/2011-08-01T00:00:00"). + to_return(:status => 200, :body => YAML.dump(%w(test1))) + + stub_request(:get, "http://localhost/api/attendees/support_shift/2011-08-01T00:05:00"). + to_return(:status => 200, :body => YAML.dump(%w(test2))) + people_list = Configuration.current.people_lists["testers"] assert_equal([Configuration.current.people["test1"]], people_list.people) - assert_equal([Configuration.current.people["test2"]], people_list.people) + assert_equal([Configuration.current.people["test2"]], people_list.people(Time.now + 5.minutes)) end end |