diff options
author | Rick Olson <technoweenie@gmail.com> | 2007-11-09 14:59:15 +0000 |
---|---|---|
committer | Rick Olson <technoweenie@gmail.com> | 2007-11-09 14:59:15 +0000 |
commit | 5dc3f91832fd8580287e5cbeba478bb8b9580dc1 (patch) | |
tree | 855cfa84f7002222dff496a4f8247447463045e7 /activemodel/spec/observing_spec.rb | |
parent | fcfcc707d4ae94441496d36e78a598914df3cebc (diff) | |
download | rails-5dc3f91832fd8580287e5cbeba478bb8b9580dc1.tar.gz rails-5dc3f91832fd8580287e5cbeba478bb8b9580dc1.tar.bz2 rails-5dc3f91832fd8580287e5cbeba478bb8b9580dc1.zip |
initial experimental commit of active_model
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8118 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activemodel/spec/observing_spec.rb')
-rw-r--r-- | activemodel/spec/observing_spec.rb | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/activemodel/spec/observing_spec.rb b/activemodel/spec/observing_spec.rb new file mode 100644 index 0000000000..1919bb5991 --- /dev/null +++ b/activemodel/spec/observing_spec.rb @@ -0,0 +1,120 @@ +require File.join(File.dirname(__FILE__), 'spec_helper') + +class ObservedModel < ActiveModel::Base + class Observer + end +end + +class FooObserver < ActiveModel::Observer + class << self + public :new + end + + attr_accessor :stub + + def on_spec(record) + stub.event_with(record) if stub + end +end + +class Foo < ActiveModel::Base +end + +module ActiveModel + describe Observing do + before do + ObservedModel.observers.clear + end + + it "initializes model with no cached observers" do + ObservedModel.observers.should be_empty + end + + it "stores cached observers in an array" do + ObservedModel.observers << :foo + ObservedModel.observers.should include(:foo) + end + + it "flattens array of assigned cached observers" do + ObservedModel.observers = [[:foo], :bar] + ObservedModel.observers.should include(:foo) + ObservedModel.observers.should include(:bar) + end + + it "instantiates observer names passed as strings" do + ObservedModel.observers << 'foo_observer' + FooObserver.should_receive(:instance) + ObservedModel.instantiate_observers + end + + it "instantiates observer names passed as symbols" do + ObservedModel.observers << :foo_observer + FooObserver.should_receive(:instance) + ObservedModel.instantiate_observers + end + + it "instantiates observer classes" do + ObservedModel.observers << ObservedModel::Observer + ObservedModel::Observer.should_receive(:instance) + ObservedModel.instantiate_observers + end + + it "should pass observers to subclasses" do + FooObserver.instance + bar = Class.new(Foo) + bar.count_observers.should == 1 + end + end + + describe Observer do + before do + ObservedModel.observers = :foo_observer + FooObserver.models = nil + end + + it "guesses implicit observable model name" do + FooObserver.observed_class_name.should == 'Foo' + end + + it "tracks implicit observable models" do + instance = FooObserver.new + instance.send(:observed_classes).should include(Foo) + instance.send(:observed_classes).should_not include(ObservedModel) + end + + it "tracks explicit observed model class" do + FooObserver.new.send(:observed_classes).should_not include(ObservedModel) + FooObserver.observe ObservedModel + instance = FooObserver.new + instance.send(:observed_classes).should include(ObservedModel) + end + + it "tracks explicit observed model as string" do + FooObserver.new.send(:observed_classes).should_not include(ObservedModel) + FooObserver.observe 'observed_model' + instance = FooObserver.new + instance.send(:observed_classes).should include(ObservedModel) + end + + it "tracks explicit observed model as symbol" do + FooObserver.new.send(:observed_classes).should_not include(ObservedModel) + FooObserver.observe :observed_model + instance = FooObserver.new + instance.send(:observed_classes).should include(ObservedModel) + end + + it "calls existing observer event" do + foo = Foo.new + FooObserver.instance.stub = stub!(:stub) + FooObserver.instance.stub.should_receive(:event_with).with(foo) + Foo.send(:changed) + Foo.send(:notify_observers, :on_spec, foo) + end + + it "skips nonexistent observer event" do + foo = Foo.new + Foo.send(:changed) + Foo.send(:notify_observers, :whatever, foo) + end + end +end
\ No newline at end of file |