| 1 |
require File.join(File.dirname(__FILE__), 'spec_helper') |
|---|
| 2 |
|
|---|
| 3 |
class ObservedModel < ActiveModel::Base |
|---|
| 4 |
class Observer |
|---|
| 5 |
end |
|---|
| 6 |
end |
|---|
| 7 |
|
|---|
| 8 |
class FooObserver < ActiveModel::Observer |
|---|
| 9 |
class << self |
|---|
| 10 |
public :new |
|---|
| 11 |
end |
|---|
| 12 |
|
|---|
| 13 |
attr_accessor :stub |
|---|
| 14 |
|
|---|
| 15 |
def on_spec(record) |
|---|
| 16 |
stub.event_with(record) if stub |
|---|
| 17 |
end |
|---|
| 18 |
end |
|---|
| 19 |
|
|---|
| 20 |
class Foo < ActiveModel::Base |
|---|
| 21 |
end |
|---|
| 22 |
|
|---|
| 23 |
module ActiveModel |
|---|
| 24 |
describe Observing do |
|---|
| 25 |
before do |
|---|
| 26 |
ObservedModel.observers.clear |
|---|
| 27 |
end |
|---|
| 28 |
|
|---|
| 29 |
it "initializes model with no cached observers" do |
|---|
| 30 |
ObservedModel.observers.should be_empty |
|---|
| 31 |
end |
|---|
| 32 |
|
|---|
| 33 |
it "stores cached observers in an array" do |
|---|
| 34 |
ObservedModel.observers << :foo |
|---|
| 35 |
ObservedModel.observers.should include(:foo) |
|---|
| 36 |
end |
|---|
| 37 |
|
|---|
| 38 |
it "flattens array of assigned cached observers" do |
|---|
| 39 |
ObservedModel.observers = [[:foo], :bar] |
|---|
| 40 |
ObservedModel.observers.should include(:foo) |
|---|
| 41 |
ObservedModel.observers.should include(:bar) |
|---|
| 42 |
end |
|---|
| 43 |
|
|---|
| 44 |
it "instantiates observer names passed as strings" do |
|---|
| 45 |
ObservedModel.observers << 'foo_observer' |
|---|
| 46 |
FooObserver.should_receive(:instance) |
|---|
| 47 |
ObservedModel.instantiate_observers |
|---|
| 48 |
end |
|---|
| 49 |
|
|---|
| 50 |
it "instantiates observer names passed as symbols" do |
|---|
| 51 |
ObservedModel.observers << :foo_observer |
|---|
| 52 |
FooObserver.should_receive(:instance) |
|---|
| 53 |
ObservedModel.instantiate_observers |
|---|
| 54 |
end |
|---|
| 55 |
|
|---|
| 56 |
it "instantiates observer classes" do |
|---|
| 57 |
ObservedModel.observers << ObservedModel::Observer |
|---|
| 58 |
ObservedModel::Observer.should_receive(:instance) |
|---|
| 59 |
ObservedModel.instantiate_observers |
|---|
| 60 |
end |
|---|
| 61 |
|
|---|
| 62 |
it "should pass observers to subclasses" do |
|---|
| 63 |
FooObserver.instance |
|---|
| 64 |
bar = Class.new(Foo) |
|---|
| 65 |
bar.count_observers.should == 1 |
|---|
| 66 |
end |
|---|
| 67 |
end |
|---|
| 68 |
|
|---|
| 69 |
describe Observer do |
|---|
| 70 |
before do |
|---|
| 71 |
ObservedModel.observers = :foo_observer |
|---|
| 72 |
FooObserver.models = nil |
|---|
| 73 |
end |
|---|
| 74 |
|
|---|
| 75 |
it "guesses implicit observable model name" do |
|---|
| 76 |
FooObserver.observed_class_name.should == 'Foo' |
|---|
| 77 |
end |
|---|
| 78 |
|
|---|
| 79 |
it "tracks implicit observable models" do |
|---|
| 80 |
instance = FooObserver.new |
|---|
| 81 |
instance.send(:observed_classes).should include(Foo) |
|---|
| 82 |
instance.send(:observed_classes).should_not include(ObservedModel) |
|---|
| 83 |
end |
|---|
| 84 |
|
|---|
| 85 |
it "tracks explicit observed model class" do |
|---|
| 86 |
FooObserver.new.send(:observed_classes).should_not include(ObservedModel) |
|---|
| 87 |
FooObserver.observe ObservedModel |
|---|
| 88 |
instance = FooObserver.new |
|---|
| 89 |
instance.send(:observed_classes).should include(ObservedModel) |
|---|
| 90 |
end |
|---|
| 91 |
|
|---|
| 92 |
it "tracks explicit observed model as string" do |
|---|
| 93 |
FooObserver.new.send(:observed_classes).should_not include(ObservedModel) |
|---|
| 94 |
FooObserver.observe 'observed_model' |
|---|
| 95 |
instance = FooObserver.new |
|---|
| 96 |
instance.send(:observed_classes).should include(ObservedModel) |
|---|
| 97 |
end |
|---|
| 98 |
|
|---|
| 99 |
it "tracks explicit observed model as symbol" do |
|---|
| 100 |
FooObserver.new.send(:observed_classes).should_not include(ObservedModel) |
|---|
| 101 |
FooObserver.observe :observed_model |
|---|
| 102 |
instance = FooObserver.new |
|---|
| 103 |
instance.send(:observed_classes).should include(ObservedModel) |
|---|
| 104 |
end |
|---|
| 105 |
|
|---|
| 106 |
it "calls existing observer event" do |
|---|
| 107 |
foo = Foo.new |
|---|
| 108 |
FooObserver.instance.stub = stub!(:stub) |
|---|
| 109 |
FooObserver.instance.stub.should_receive(:event_with).with(foo) |
|---|
| 110 |
Foo.send(:changed) |
|---|
| 111 |
Foo.send(:notify_observers, :on_spec, foo) |
|---|
| 112 |
end |
|---|
| 113 |
|
|---|
| 114 |
it "skips nonexistent observer event" do |
|---|
| 115 |
foo = Foo.new |
|---|
| 116 |
Foo.send(:changed) |
|---|
| 117 |
Foo.send(:notify_observers, :whatever, foo) |
|---|
| 118 |
end |
|---|
| 119 |
end |
|---|
| 120 |
end |
|---|