aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/spec
diff options
context:
space:
mode:
authorRick Olson <technoweenie@gmail.com>2007-11-09 14:59:15 +0000
committerRick Olson <technoweenie@gmail.com>2007-11-09 14:59:15 +0000
commit5dc3f91832fd8580287e5cbeba478bb8b9580dc1 (patch)
tree855cfa84f7002222dff496a4f8247447463045e7 /activemodel/spec
parentfcfcc707d4ae94441496d36e78a598914df3cebc (diff)
downloadrails-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')
-rw-r--r--activemodel/spec/observing_spec.rb120
-rw-r--r--activemodel/spec/spec_helper.rb17
2 files changed, 137 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
diff --git a/activemodel/spec/spec_helper.rb b/activemodel/spec/spec_helper.rb
new file mode 100644
index 0000000000..004fdfca07
--- /dev/null
+++ b/activemodel/spec/spec_helper.rb
@@ -0,0 +1,17 @@
+ENV['LOG_NAME'] = 'spec'
+$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'vendor', 'rspec', 'lib')
+$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
+require 'active_model'
+begin
+ require 'spec'
+rescue LoadError
+ require 'rubygems'
+ require 'spec'
+end
+
+begin
+ require 'ruby-debug'
+ Debugger.start
+rescue LoadError
+ # you do not know the ways of ruby-debug yet, what a shame
+end \ No newline at end of file