Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

root/branches/2-1-caching/activemodel/spec/observing_spec.rb

Revision 8118, 3.4 kB (checked in by rick, 1 year ago)

initial experimental commit of active_model

Line 
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
Note: See TracBrowser for help on using the browser.