mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
05d4653cef
This reverts commit 2a25c5818b
.
I'm going to add another commit that keeps the same behavior of fixes
the problems of leaking memory in development.
161 lines
5.3 KiB
Ruby
161 lines
5.3 KiB
Ruby
require 'cases/helper'
|
|
require 'models/observers'
|
|
|
|
class ObserverArrayTest < ActiveModel::TestCase
|
|
def teardown
|
|
ORM.observers.enable :all
|
|
Budget.observers.enable :all
|
|
Widget.observers.enable :all
|
|
end
|
|
|
|
def assert_observer_notified(model_class, observer_class)
|
|
observer_class.instance.before_save_invocations.clear
|
|
model_instance = model_class.new
|
|
model_instance.save
|
|
assert_equal [model_instance], observer_class.instance.before_save_invocations
|
|
end
|
|
|
|
def assert_observer_not_notified(model_class, observer_class)
|
|
observer_class.instance.before_save_invocations.clear
|
|
model_instance = model_class.new
|
|
model_instance.save
|
|
assert_equal [], observer_class.instance.before_save_invocations
|
|
end
|
|
|
|
test "all observers are enabled by default" do
|
|
assert_observer_notified Widget, WidgetObserver
|
|
assert_observer_notified Budget, BudgetObserver
|
|
assert_observer_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
|
|
test "can disable individual observers using a class constant" do
|
|
ORM.observers.disable WidgetObserver
|
|
|
|
assert_observer_not_notified Widget, WidgetObserver
|
|
assert_observer_notified Budget, BudgetObserver
|
|
assert_observer_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
|
|
test "can disable individual observers using a symbol" do
|
|
ORM.observers.disable :budget_observer
|
|
|
|
assert_observer_notified Widget, WidgetObserver
|
|
assert_observer_not_notified Budget, BudgetObserver
|
|
assert_observer_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
|
|
test "can disable all observers using :all" do
|
|
ORM.observers.disable :all
|
|
|
|
assert_observer_not_notified Widget, WidgetObserver
|
|
assert_observer_not_notified Budget, BudgetObserver
|
|
assert_observer_not_notified Widget, AuditTrail
|
|
assert_observer_not_notified Budget, AuditTrail
|
|
end
|
|
|
|
test "can disable observers on individual models without affecting observers on other models" do
|
|
Widget.observers.disable :all
|
|
|
|
assert_observer_not_notified Widget, WidgetObserver
|
|
assert_observer_notified Budget, BudgetObserver
|
|
assert_observer_not_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
|
|
test "can disable observers for the duration of a block" do
|
|
yielded = false
|
|
ORM.observers.disable :budget_observer do
|
|
yielded = true
|
|
assert_observer_notified Widget, WidgetObserver
|
|
assert_observer_not_notified Budget, BudgetObserver
|
|
assert_observer_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
|
|
assert yielded
|
|
assert_observer_notified Widget, WidgetObserver
|
|
assert_observer_notified Budget, BudgetObserver
|
|
assert_observer_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
|
|
test "can enable observers for the duration of a block" do
|
|
yielded = false
|
|
Widget.observers.disable :all
|
|
|
|
Widget.observers.enable :all do
|
|
yielded = true
|
|
assert_observer_notified Widget, WidgetObserver
|
|
assert_observer_notified Budget, BudgetObserver
|
|
assert_observer_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
|
|
assert yielded
|
|
assert_observer_not_notified Widget, WidgetObserver
|
|
assert_observer_notified Budget, BudgetObserver
|
|
assert_observer_not_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
|
|
test "raises an appropriate error when a developer accidentally enables or disables the wrong class (i.e. Widget instead of WidgetObserver)" do
|
|
assert_raise ArgumentError do
|
|
ORM.observers.enable :widget
|
|
end
|
|
|
|
assert_raise ArgumentError do
|
|
ORM.observers.enable Widget
|
|
end
|
|
|
|
assert_raise ArgumentError do
|
|
ORM.observers.disable :widget
|
|
end
|
|
|
|
assert_raise ArgumentError do
|
|
ORM.observers.disable Widget
|
|
end
|
|
end
|
|
|
|
test "allows #enable at the superclass level to override #disable at the subclass level when called last" do
|
|
Widget.observers.disable :all
|
|
ORM.observers.enable :all
|
|
|
|
assert_observer_notified Widget, WidgetObserver
|
|
assert_observer_notified Budget, BudgetObserver
|
|
assert_observer_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
|
|
test "allows #disable at the superclass level to override #enable at the subclass level when called last" do
|
|
Budget.observers.enable :audit_trail
|
|
ORM.observers.disable :audit_trail
|
|
|
|
assert_observer_notified Widget, WidgetObserver
|
|
assert_observer_notified Budget, BudgetObserver
|
|
assert_observer_not_notified Widget, AuditTrail
|
|
assert_observer_not_notified Budget, AuditTrail
|
|
end
|
|
|
|
test "can use the block form at different levels of the hierarchy" do
|
|
yielded = false
|
|
Widget.observers.disable :all
|
|
|
|
ORM.observers.enable :all do
|
|
yielded = true
|
|
assert_observer_notified Widget, WidgetObserver
|
|
assert_observer_notified Budget, BudgetObserver
|
|
assert_observer_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
|
|
assert yielded
|
|
assert_observer_not_notified Widget, WidgetObserver
|
|
assert_observer_notified Budget, BudgetObserver
|
|
assert_observer_not_notified Widget, AuditTrail
|
|
assert_observer_notified Budget, AuditTrail
|
|
end
|
|
end
|
|
|