2009-09-16 22:53:49 +00:00
|
|
|
require 'abstract_unit'
|
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
module Notifications
|
|
|
|
class TestCase < ActiveSupport::TestCase
|
|
|
|
def setup
|
2010-01-06 21:23:29 +00:00
|
|
|
ActiveSupport::Notifications.notifier = nil
|
|
|
|
@notifier = ActiveSupport::Notifications.notifier
|
2009-11-28 20:49:07 +00:00
|
|
|
@events = []
|
2010-04-25 02:12:02 +00:00
|
|
|
@named_events = []
|
2010-03-02 00:01:08 +00:00
|
|
|
@subscription = @notifier.subscribe { |*args| @events << event(*args) }
|
2010-04-25 02:12:02 +00:00
|
|
|
@named_subscription = @notifier.subscribe("named.subscription") { |*args| @named_events << event(*args) }
|
2009-11-28 20:49:07 +00:00
|
|
|
end
|
2009-09-30 11:59:15 +00:00
|
|
|
|
2010-07-20 15:07:18 +00:00
|
|
|
private
|
2009-09-16 22:53:49 +00:00
|
|
|
|
2010-07-20 15:07:18 +00:00
|
|
|
def event(*args)
|
|
|
|
ActiveSupport::Notifications::Event.new(*args)
|
|
|
|
end
|
2009-09-16 22:53:49 +00:00
|
|
|
end
|
2009-10-15 17:49:29 +00:00
|
|
|
|
2010-03-02 00:01:08 +00:00
|
|
|
class UnsubscribeTest < TestCase
|
2010-03-02 01:33:59 +00:00
|
|
|
def test_unsubscribing_removes_a_subscription
|
2010-03-02 00:01:08 +00:00
|
|
|
@notifier.publish :foo
|
|
|
|
@notifier.wait
|
|
|
|
assert_equal [[:foo]], @events
|
|
|
|
@notifier.unsubscribe(@subscription)
|
2010-03-02 01:33:59 +00:00
|
|
|
@notifier.publish :foo
|
2010-03-02 00:01:08 +00:00
|
|
|
@notifier.wait
|
|
|
|
assert_equal [[:foo]], @events
|
|
|
|
end
|
2010-03-02 01:33:59 +00:00
|
|
|
|
2010-04-25 02:12:02 +00:00
|
|
|
def test_unsubscribing_by_name_removes_a_subscription
|
|
|
|
@notifier.publish "named.subscription", :foo
|
|
|
|
@notifier.wait
|
|
|
|
assert_equal [["named.subscription", :foo]], @named_events
|
|
|
|
@notifier.unsubscribe("named.subscription")
|
|
|
|
@notifier.publish "named.subscription", :foo
|
|
|
|
@notifier.wait
|
|
|
|
assert_equal [["named.subscription", :foo]], @named_events
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_unsubscribing_by_name_leaves_the_other_subscriptions
|
|
|
|
@notifier.publish "named.subscription", :foo
|
|
|
|
@notifier.wait
|
|
|
|
assert_equal [["named.subscription", :foo]], @events
|
|
|
|
@notifier.unsubscribe("named.subscription")
|
|
|
|
@notifier.publish "named.subscription", :foo
|
|
|
|
@notifier.wait
|
|
|
|
assert_equal [["named.subscription", :foo], ["named.subscription", :foo]], @events
|
|
|
|
end
|
|
|
|
|
2010-03-02 01:33:59 +00:00
|
|
|
private
|
|
|
|
def event(*args)
|
|
|
|
args
|
|
|
|
end
|
2010-03-02 00:01:08 +00:00
|
|
|
end
|
|
|
|
|
2010-01-21 12:05:30 +00:00
|
|
|
class SyncPubSubTest < TestCase
|
2009-11-28 20:49:07 +00:00
|
|
|
def test_events_are_published_to_a_listener
|
|
|
|
@notifier.publish :foo
|
|
|
|
@notifier.wait
|
|
|
|
assert_equal [[:foo]], @events
|
|
|
|
end
|
2009-10-27 07:07:21 +00:00
|
|
|
|
2010-03-02 01:33:59 +00:00
|
|
|
def test_publishing_multiple_times_works
|
|
|
|
@notifier.publish :foo
|
|
|
|
@notifier.publish :foo
|
|
|
|
@notifier.wait
|
|
|
|
assert_equal [[:foo], [:foo]], @events
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_publishing_after_a_new_subscribe_works
|
|
|
|
@notifier.publish :foo
|
|
|
|
@notifier.publish :foo
|
|
|
|
|
|
|
|
@notifier.subscribe("not_existant") do |*args|
|
|
|
|
@events << ActiveSupport::Notifications::Event.new(*args)
|
|
|
|
end
|
|
|
|
|
|
|
|
@notifier.publish :foo
|
|
|
|
@notifier.publish :foo
|
|
|
|
@notifier.wait
|
|
|
|
|
|
|
|
assert_equal [[:foo]] * 4, @events
|
|
|
|
end
|
|
|
|
|
2010-03-17 22:44:03 +00:00
|
|
|
def test_log_subscriber_with_string
|
2009-11-28 20:49:07 +00:00
|
|
|
events = []
|
|
|
|
@notifier.subscribe('1') { |*args| events << args }
|
2009-10-15 17:49:29 +00:00
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
@notifier.publish '1'
|
|
|
|
@notifier.publish '1.a'
|
|
|
|
@notifier.publish 'a.1'
|
|
|
|
@notifier.wait
|
2009-10-15 17:49:29 +00:00
|
|
|
|
2010-03-17 22:44:03 +00:00
|
|
|
assert_equal [['1']], events
|
2009-11-28 20:49:07 +00:00
|
|
|
end
|
2009-10-27 07:07:21 +00:00
|
|
|
|
2010-03-17 22:44:03 +00:00
|
|
|
def test_log_subscriber_with_pattern
|
2009-11-28 20:49:07 +00:00
|
|
|
events = []
|
|
|
|
@notifier.subscribe(/\d/) { |*args| events << args }
|
2009-10-15 17:49:29 +00:00
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
@notifier.publish '1'
|
|
|
|
@notifier.publish 'a.1'
|
|
|
|
@notifier.publish '1.a'
|
|
|
|
@notifier.wait
|
2009-09-16 22:53:49 +00:00
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
assert_equal [['1'], ['a.1'], ['1.a']], events
|
2009-10-28 04:01:31 +00:00
|
|
|
end
|
2009-09-16 22:53:49 +00:00
|
|
|
|
2010-02-15 14:44:30 +00:00
|
|
|
def test_multiple_log_subscribers
|
2009-11-28 20:49:07 +00:00
|
|
|
@another = []
|
|
|
|
@notifier.subscribe { |*args| @another << args }
|
|
|
|
@notifier.publish :foo
|
|
|
|
@notifier.wait
|
2009-09-16 22:53:49 +00:00
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
assert_equal [[:foo]], @events
|
|
|
|
assert_equal [[:foo]], @another
|
2009-09-16 22:53:49 +00:00
|
|
|
end
|
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
private
|
|
|
|
def event(*args)
|
|
|
|
args
|
|
|
|
end
|
2009-09-16 22:53:49 +00:00
|
|
|
end
|
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
class InstrumentationTest < TestCase
|
2010-02-04 09:39:55 +00:00
|
|
|
delegate :instrument, :to => ActiveSupport::Notifications
|
2010-01-06 21:23:29 +00:00
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
def test_instrument_returns_block_result
|
2010-01-06 21:23:29 +00:00
|
|
|
assert_equal 2, instrument(:awesome) { 1 + 1 }
|
2010-01-13 21:28:18 +00:00
|
|
|
end
|
|
|
|
|
2010-01-15 10:01:37 +00:00
|
|
|
def test_instrument_yields_the_paylod_for_further_modification
|
|
|
|
assert_equal 2, instrument(:awesome) { |p| p[:result] = 1 + 1 }
|
2010-01-13 21:28:18 +00:00
|
|
|
assert_equal 1, @events.size
|
|
|
|
assert_equal :awesome, @events.first.name
|
|
|
|
assert_equal Hash[:result => 2], @events.first.payload
|
2009-09-16 22:53:49 +00:00
|
|
|
end
|
|
|
|
|
2010-01-04 21:22:21 +00:00
|
|
|
def test_instrumenter_exposes_its_id
|
2010-01-06 21:23:29 +00:00
|
|
|
assert_equal 20, ActiveSupport::Notifications.instrumenter.id.size
|
2010-01-04 21:22:21 +00:00
|
|
|
end
|
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
def test_nested_events_can_be_instrumented
|
2010-01-06 21:23:29 +00:00
|
|
|
instrument(:awesome, :payload => "notifications") do
|
|
|
|
instrument(:wot, :payload => "child") do
|
2009-11-28 20:49:07 +00:00
|
|
|
1 + 1
|
|
|
|
end
|
2009-10-06 12:42:42 +00:00
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
assert_equal 1, @events.size
|
|
|
|
assert_equal :wot, @events.first.name
|
|
|
|
assert_equal Hash[:payload => "child"], @events.first.payload
|
2009-09-16 22:53:49 +00:00
|
|
|
end
|
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
assert_equal 2, @events.size
|
|
|
|
assert_equal :awesome, @events.last.name
|
|
|
|
assert_equal Hash[:payload => "notifications"], @events.last.payload
|
2009-09-16 22:53:49 +00:00
|
|
|
end
|
|
|
|
|
2010-04-27 21:13:47 +00:00
|
|
|
def test_instrument_publishes_when_exception_is_raised
|
2009-11-28 20:49:07 +00:00
|
|
|
begin
|
2010-01-06 21:23:29 +00:00
|
|
|
instrument(:awesome, :payload => "notifications") do
|
2010-01-31 05:27:24 +00:00
|
|
|
raise "FAIL"
|
2009-11-28 20:49:07 +00:00
|
|
|
end
|
2010-01-12 12:07:04 +00:00
|
|
|
rescue RuntimeError => e
|
2010-01-31 05:27:24 +00:00
|
|
|
assert_equal "FAIL", e.message
|
2009-11-28 20:49:07 +00:00
|
|
|
end
|
2009-10-28 08:58:33 +00:00
|
|
|
|
2010-04-27 21:13:47 +00:00
|
|
|
assert_equal 1, @events.size
|
2010-05-02 20:40:20 +00:00
|
|
|
assert_equal Hash[:payload => "notifications",
|
|
|
|
:exception => ["RuntimeError", "FAIL"]], @events.last.payload
|
2009-10-28 08:58:33 +00:00
|
|
|
end
|
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
def test_event_is_pushed_even_without_block
|
2010-01-06 21:23:29 +00:00
|
|
|
instrument(:awesome, :payload => "notifications")
|
2009-11-28 20:49:07 +00:00
|
|
|
assert_equal 1, @events.size
|
|
|
|
assert_equal :awesome, @events.last.name
|
|
|
|
assert_equal Hash[:payload => "notifications"], @events.last.payload
|
2009-10-28 04:01:31 +00:00
|
|
|
end
|
2009-10-07 14:17:50 +00:00
|
|
|
end
|
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
class EventTest < TestCase
|
|
|
|
def test_events_are_initialized_with_details
|
|
|
|
time = Time.now
|
2009-12-26 19:28:53 +00:00
|
|
|
event = event(:foo, time, time + 0.01, random_id, {})
|
2009-09-16 22:53:49 +00:00
|
|
|
|
2010-07-12 01:51:37 +00:00
|
|
|
assert_equal :foo, event.name
|
|
|
|
assert_equal time, event.time
|
2010-07-18 17:19:34 +00:00
|
|
|
assert_in_delta 10.0, event.duration, 0.00001
|
2009-10-28 04:01:31 +00:00
|
|
|
end
|
2009-09-16 22:53:49 +00:00
|
|
|
|
2009-12-26 19:28:53 +00:00
|
|
|
def test_events_consumes_information_given_as_payload
|
|
|
|
event = event(:foo, Time.now, Time.now + 1, random_id, :payload => :bar)
|
|
|
|
assert_equal Hash[:payload => :bar], event.payload
|
|
|
|
end
|
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
def test_event_is_parent_based_on_time_frame
|
|
|
|
time = Time.utc(2009, 01, 01, 0, 0, 1)
|
2009-09-16 22:53:49 +00:00
|
|
|
|
2009-12-26 19:28:53 +00:00
|
|
|
parent = event(:foo, Time.utc(2009), Time.utc(2009) + 100, random_id, {})
|
|
|
|
child = event(:foo, time, time + 10, random_id, {})
|
|
|
|
not_child = event(:foo, time, time + 100, random_id, {})
|
2009-09-16 22:53:49 +00:00
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
assert parent.parent_of?(child)
|
|
|
|
assert !child.parent_of?(parent)
|
|
|
|
assert !parent.parent_of?(not_child)
|
|
|
|
assert !not_child.parent_of?(parent)
|
|
|
|
end
|
2009-09-30 11:59:15 +00:00
|
|
|
|
2009-11-28 20:49:07 +00:00
|
|
|
protected
|
|
|
|
def random_id
|
|
|
|
@random_id ||= ActiveSupport::SecureRandom.hex(10)
|
|
|
|
end
|
2009-09-16 22:53:49 +00:00
|
|
|
end
|
|
|
|
end
|