aboutsummaryrefslogtreecommitdiffstats
path: root/railties/test/subscriber_test.rb
blob: 724e8a75d6cffc1b6859e75bc5eb5a1c26bca30f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
require 'abstract_unit'
require 'rails/subscriber/test_helper'

class MySubscriber < Rails::Subscriber
  attr_reader :event

  def some_event(event)
    @event = event
    info event.name
  end

  def foo(event)
    debug "debug"
    info "info"
    warn "warn"
  end

  def bar(event)
    info "#{color("cool", :red)}, #{color("isn't it?", :blue, true)}"
  end

  def puke(event)
    raise "puke"
  end
end

module SubscriberTest
  def setup
    super
    @subscriber = MySubscriber.new
    Rails::Subscriber.instance_variable_set(:@log_tailer, nil)
  end

  def teardown
    super
    Rails::Subscriber.subscribers.clear
    Rails::Subscriber.instance_variable_set(:@log_tailer, nil)
  end

  def instrument(*args, &block)
    ActiveSupport::Notifications.instrument(*args, &block)
  end

  def test_proxies_method_to_rails_logger
    @subscriber.foo(nil)
    assert_equal %w(debug), @logger.logged(:debug)
    assert_equal %w(info), @logger.logged(:info)
    assert_equal %w(warn), @logger.logged(:warn)
  end

  def test_set_color_for_messages
    Rails::Subscriber.colorize_logging = true
    @subscriber.bar(nil)
    assert_equal "\e[31mcool\e[0m, \e[1m\e[34misn't it?\e[0m", @logger.logged(:info).last
  end

  def test_does_not_set_color_if_colorize_logging_is_set_to_false
    @subscriber.bar(nil)
    assert_equal "cool, isn't it?", @logger.logged(:info).last
  end

  def test_event_is_sent_to_the_registered_class
    Rails::Subscriber.add :my_subscriber, @subscriber
    instrument "my_subscriber.some_event"
    wait
    assert_equal %w(my_subscriber.some_event), @logger.logged(:info)
  end

  def test_event_is_an_active_support_notifications_event
    Rails::Subscriber.add :my_subscriber, @subscriber
    instrument "my_subscriber.some_event"
    wait
    assert_kind_of ActiveSupport::Notifications::Event, @subscriber.event
  end

  def test_does_not_send_the_event_if_it_doesnt_match_the_class
    Rails::Subscriber.add :my_subscriber, @subscriber
    instrument "my_subscriber.unknown_event"
    wait
    # If we get here, it means that NoMethodError was raised.
  end

  def test_does_not_send_the_event_if_logger_is_nil
    Rails.logger = nil
    @subscriber.expects(:some_event).never
    Rails::Subscriber.add :my_subscriber, @subscriber
    instrument "my_subscriber.some_event"
    wait
  end

  def test_flushes_loggers
    Rails::Subscriber.add :my_subscriber, @subscriber
    Rails::Subscriber.flush_all!
    assert_equal 1, @logger.flush_count
  end

  def test_flushes_loggers_when_action_dispatch_callback_is_received
    Rails::Subscriber.add :my_subscriber, @subscriber
    instrument "action_dispatch.after_dispatch"
    wait
    assert_equal 1, @logger.flush_count
  end

  def test_flushes_the_same_logger_just_once
    Rails::Subscriber.add :my_subscriber, @subscriber
    Rails::Subscriber.add :another, @subscriber
    instrument "action_dispatch.after_dispatch"
    wait
    assert_equal 1, @logger.flush_count
  end

  def test_logging_thread_does_not_die_on_failures
    Rails::Subscriber.add :my_subscriber, @subscriber
    instrument "my_subscriber.puke"
    instrument "action_dispatch.after_dispatch"
    wait
    assert_equal 1, @logger.flush_count
    assert_equal 1, @logger.logged(:error).size
    assert_equal 'Could not log "my_subscriber.puke" event. RuntimeError: puke', @logger.logged(:error).last
  end

  def test_tails_logs_when_action_dispatch_callback_is_received
    log_tailer = mock()
    log_tailer.expects(:tail!)
    Rails::Subscriber.log_tailer = log_tailer

    Rails::Subscriber.add :my_subscriber, @subscriber
    instrument "action_dispatch.after_dispatch"
    wait
  ensure
    Rails::Subscriber.log_tailer = nil
  end

  class SyncSubscriberTest < ActiveSupport::TestCase
    include Rails::Subscriber::SyncTestHelper
    include SubscriberTest
  end

  class AsyncSubscriberTest < ActiveSupport::TestCase
    include Rails::Subscriber::AsyncTestHelper
    include SubscriberTest
  end

end