Fixing and testing proxyable with associations and validation
This commit is contained in:
parent
8fa7e87019
commit
760d855845
27
Gemfile.lock
27
Gemfile.lock
|
@ -12,9 +12,9 @@ GEM
|
||||||
remote: http://rubygems.org/
|
remote: http://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
abstract (1.0.0)
|
abstract (1.0.0)
|
||||||
actionpack (3.0.4)
|
actionpack (3.0.5)
|
||||||
activemodel (= 3.0.4)
|
activemodel (= 3.0.5)
|
||||||
activesupport (= 3.0.4)
|
activesupport (= 3.0.5)
|
||||||
builder (~> 2.1.2)
|
builder (~> 2.1.2)
|
||||||
erubis (~> 2.6.6)
|
erubis (~> 2.6.6)
|
||||||
i18n (~> 0.4)
|
i18n (~> 0.4)
|
||||||
|
@ -22,11 +22,11 @@ GEM
|
||||||
rack-mount (~> 0.6.13)
|
rack-mount (~> 0.6.13)
|
||||||
rack-test (~> 0.5.7)
|
rack-test (~> 0.5.7)
|
||||||
tzinfo (~> 0.3.23)
|
tzinfo (~> 0.3.23)
|
||||||
activemodel (3.0.4)
|
activemodel (3.0.5)
|
||||||
activesupport (= 3.0.4)
|
activesupport (= 3.0.5)
|
||||||
builder (~> 2.1.2)
|
builder (~> 2.1.2)
|
||||||
i18n (~> 0.4)
|
i18n (~> 0.4)
|
||||||
activesupport (3.0.4)
|
activesupport (3.0.5)
|
||||||
builder (2.1.2)
|
builder (2.1.2)
|
||||||
couchrest (1.0.2)
|
couchrest (1.0.2)
|
||||||
json (~> 1.5.1)
|
json (~> 1.5.1)
|
||||||
|
@ -39,13 +39,13 @@ GEM
|
||||||
json (1.5.1)
|
json (1.5.1)
|
||||||
mime-types (1.16)
|
mime-types (1.16)
|
||||||
rack (1.2.1)
|
rack (1.2.1)
|
||||||
rack-mount (0.6.13)
|
rack-mount (0.6.14)
|
||||||
rack (>= 1.0.0)
|
rack (>= 1.0.0)
|
||||||
rack-test (0.5.7)
|
rack-test (0.5.7)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
railties (3.0.4)
|
railties (3.0.5)
|
||||||
actionpack (= 3.0.4)
|
actionpack (= 3.0.5)
|
||||||
activesupport (= 3.0.4)
|
activesupport (= 3.0.5)
|
||||||
rake (>= 0.8.7)
|
rake (>= 0.8.7)
|
||||||
thor (~> 0.14.4)
|
thor (~> 0.14.4)
|
||||||
rake (0.8.7)
|
rake (0.8.7)
|
||||||
|
@ -60,17 +60,12 @@ GEM
|
||||||
diff-lcs (~> 1.1.2)
|
diff-lcs (~> 1.1.2)
|
||||||
rspec-mocks (2.3.0)
|
rspec-mocks (2.3.0)
|
||||||
thor (0.14.6)
|
thor (0.14.6)
|
||||||
tzinfo (0.3.24)
|
tzinfo (0.3.26)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
activemodel (~> 3.0.0)
|
|
||||||
couchrest (~> 1.0.2)
|
|
||||||
couchrest_model!
|
couchrest_model!
|
||||||
mime-types (~> 1.15)
|
|
||||||
rack-test (>= 0.5.7)
|
rack-test (>= 0.5.7)
|
||||||
railties (~> 3.0.0)
|
|
||||||
rspec (>= 2.0.0)
|
rspec (>= 2.0.0)
|
||||||
tzinfo (~> 0.3.22)
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
* Minor enhancements:
|
* Minor enhancements:
|
||||||
* Time handling improved in accordance with CouchRest 1.0.3. Always set to UTC.
|
* Time handling improved in accordance with CouchRest 1.0.3. Always set to UTC.
|
||||||
|
* Refinements to associations and uniqueness validation for proxy (based on issue found by Gleb Kanterov)
|
||||||
|
|
||||||
== 1.1.0.beta
|
== 1.1.0.beta
|
||||||
|
|
||||||
|
|
|
@ -36,15 +36,12 @@ module CouchRest
|
||||||
# it can be set with the :proxy_name option.
|
# it can be set with the :proxy_name option.
|
||||||
#
|
#
|
||||||
def belongs_to(attrib, *options)
|
def belongs_to(attrib, *options)
|
||||||
|
opts = merge_belongs_to_association_options(attrib, options.first)
|
||||||
|
|
||||||
opts = merge_belongs_to_assocation_options(attrib, options.first)
|
property(opts[:foreign_key], opts)
|
||||||
|
|
||||||
prop = property(opts[:foreign_key], opts)
|
create_belongs_to_getter(attrib, opts)
|
||||||
|
create_belongs_to_setter(attrib, opts)
|
||||||
create_belongs_to_getter(attrib, prop, opts)
|
|
||||||
create_belongs_to_setter(attrib, prop, opts)
|
|
||||||
|
|
||||||
prop
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Provide access to a collection of objects where the associated
|
# Provide access to a collection of objects where the associated
|
||||||
|
@ -87,41 +84,27 @@ module CouchRest
|
||||||
# frequently! Use with prudence.
|
# frequently! Use with prudence.
|
||||||
#
|
#
|
||||||
def collection_of(attrib, *options)
|
def collection_of(attrib, *options)
|
||||||
|
opts = merge_belongs_to_association_options(attrib, options.first)
|
||||||
opts = merge_belongs_to_assocation_options(attrib, options.first)
|
|
||||||
opts[:foreign_key] = opts[:foreign_key].pluralize
|
opts[:foreign_key] = opts[:foreign_key].pluralize
|
||||||
opts[:readonly] = true
|
opts[:readonly] = true
|
||||||
|
|
||||||
prop = property(opts[:foreign_key], [], opts)
|
property(opts[:foreign_key], [], opts)
|
||||||
|
|
||||||
create_collection_of_property_setter(attrib, prop, opts)
|
create_collection_of_property_setter(attrib, opts)
|
||||||
create_collection_of_getter(attrib, prop, opts)
|
create_collection_of_getter(attrib, opts)
|
||||||
create_collection_of_setter(attrib, prop, opts)
|
create_collection_of_setter(attrib, opts)
|
||||||
|
|
||||||
prop
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def merge_belongs_to_assocation_options(attrib, options = nil)
|
def merge_belongs_to_association_options(attrib, options = nil)
|
||||||
opts = {
|
opts = {
|
||||||
:foreign_key => attrib.to_s + '_id',
|
:foreign_key => attrib.to_s.singularize + '_id',
|
||||||
:class_name => attrib.to_s.camelcase,
|
:class_name => attrib.to_s.singularize.camelcase,
|
||||||
:proxy_name => attrib.to_s.pluralize
|
:proxy_name => attrib.to_s.pluralize
|
||||||
}
|
}
|
||||||
|
opts.merge!(options) if options.is_a?(Hash)
|
||||||
# merge the options
|
|
||||||
case options
|
|
||||||
when Hash
|
|
||||||
opts.merge!(options)
|
|
||||||
end
|
|
||||||
# Get a class name
|
|
||||||
begin
|
|
||||||
opts[:class] = opts[:class_name].constantize
|
|
||||||
rescue NameError
|
|
||||||
raise NameError, "Unable to convert class name into Constant for #{self.name}##{attrib}"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Generate a string for the proxy method call
|
# Generate a string for the proxy method call
|
||||||
# Assumes that the proxy_owner_method from "proxyable" is available.
|
# Assumes that the proxy_owner_method from "proxyable" is available.
|
||||||
|
@ -129,14 +112,14 @@ module CouchRest
|
||||||
opts[:proxy] = if proxy_owner_method
|
opts[:proxy] = if proxy_owner_method
|
||||||
"self.#{proxy_owner_method}.#{opts[:proxy_name]}"
|
"self.#{proxy_owner_method}.#{opts[:proxy_name]}"
|
||||||
else
|
else
|
||||||
opts[:class_name].constantize
|
opts[:class_name]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
opts
|
opts
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_belongs_to_getter(attrib, property, options)
|
def create_belongs_to_getter(attrib, options)
|
||||||
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
||||||
def #{attrib}
|
def #{attrib}
|
||||||
@#{attrib} ||= #{options[:foreign_key]}.nil? ? nil : #{options[:proxy]}.get(self.#{options[:foreign_key]})
|
@#{attrib} ||= #{options[:foreign_key]}.nil? ? nil : #{options[:proxy]}.get(self.#{options[:foreign_key]})
|
||||||
|
@ -144,7 +127,7 @@ module CouchRest
|
||||||
EOS
|
EOS
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_belongs_to_setter(attrib, property, options)
|
def create_belongs_to_setter(attrib, options)
|
||||||
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
||||||
def #{attrib}=(value)
|
def #{attrib}=(value)
|
||||||
self.#{options[:foreign_key]} = value.nil? ? nil : value.id
|
self.#{options[:foreign_key]} = value.nil? ? nil : value.id
|
||||||
|
@ -155,7 +138,7 @@ module CouchRest
|
||||||
|
|
||||||
### collection_of support methods
|
### collection_of support methods
|
||||||
|
|
||||||
def create_collection_of_property_setter(attrib, property, options)
|
def create_collection_of_property_setter(attrib, options)
|
||||||
# ensure CollectionOfProxy is nil, ready to be reloaded on request
|
# ensure CollectionOfProxy is nil, ready to be reloaded on request
|
||||||
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
||||||
def #{options[:foreign_key]}=(value)
|
def #{options[:foreign_key]}=(value)
|
||||||
|
@ -165,18 +148,17 @@ module CouchRest
|
||||||
EOS
|
EOS
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_collection_of_getter(attrib, property, options)
|
def create_collection_of_getter(attrib, options)
|
||||||
base = options[:proxy] || options[:class_name]
|
|
||||||
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
||||||
def #{attrib}(reload = false)
|
def #{attrib}(reload = false)
|
||||||
return @#{attrib} unless @#{attrib}.nil? or reload
|
return @#{attrib} unless @#{attrib}.nil? or reload
|
||||||
ary = self.#{options[:foreign_key]}.collect{|i| #{base}.get(i)}
|
ary = self.#{options[:foreign_key]}.collect{|i| #{options[:proxy]}.get(i)}
|
||||||
@#{attrib} = ::CouchRest::CollectionOfProxy.new(ary, self, '#{options[:foreign_key]}')
|
@#{attrib} = ::CouchRest::CollectionOfProxy.new(ary, self, '#{options[:foreign_key]}')
|
||||||
end
|
end
|
||||||
EOS
|
EOS
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_collection_of_setter(attrib, property, options)
|
def create_collection_of_setter(attrib, options)
|
||||||
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
||||||
def #{attrib}=(value)
|
def #{attrib}=(value)
|
||||||
@#{attrib} = ::CouchRest::CollectionOfProxy.new(value, self, '#{options[:foreign_key]}')
|
@#{attrib} = ::CouchRest::CollectionOfProxy.new(value, self, '#{options[:foreign_key]}')
|
||||||
|
|
|
@ -6,14 +6,11 @@ module CouchRest
|
||||||
|
|
||||||
module ClassMethods
|
module ClassMethods
|
||||||
|
|
||||||
attr_reader :proxy_owner_method
|
|
||||||
|
|
||||||
# Define a collection that will use the base model for the database connection
|
# Define a collection that will use the base model for the database connection
|
||||||
# details.
|
# details.
|
||||||
def proxy_for(assoc_name, options = {})
|
def proxy_for(assoc_name, options = {})
|
||||||
db_method = options[:database_method] || "proxy_database"
|
db_method = options[:database_method] || "proxy_database"
|
||||||
options[:class_name] ||= assoc_name.to_s.singularize.camelize
|
options[:class_name] ||= assoc_name.to_s.singularize.camelize
|
||||||
attr_accessor :model_proxy
|
|
||||||
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
||||||
def #{assoc_name}
|
def #{assoc_name}
|
||||||
unless respond_to?('#{db_method}')
|
unless respond_to?('#{db_method}')
|
||||||
|
@ -27,8 +24,16 @@ module CouchRest
|
||||||
def proxied_by(model_name, options = {})
|
def proxied_by(model_name, options = {})
|
||||||
raise "Model can only be proxied once or ##{model_name} already defined" if method_defined?(model_name) || !proxy_owner_method.nil?
|
raise "Model can only be proxied once or ##{model_name} already defined" if method_defined?(model_name) || !proxy_owner_method.nil?
|
||||||
self.proxy_owner_method = model_name
|
self.proxy_owner_method = model_name
|
||||||
|
attr_accessor :model_proxy
|
||||||
attr_accessor model_name
|
attr_accessor model_name
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Define an a class variable accessor ready to be inherited and unique
|
||||||
|
# for each Class using the base.
|
||||||
|
# Perhaps there is a shorter way of writing this.
|
||||||
|
def proxy_owner_method=(name); @proxy_owner_method = name; end
|
||||||
|
def proxy_owner_method; @proxy_owner_method; end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class ModelProxy
|
class ModelProxy
|
||||||
|
@ -132,10 +137,10 @@ module CouchRest
|
||||||
# Update the document's proxy details, specifically, the fields that
|
# Update the document's proxy details, specifically, the fields that
|
||||||
# link back to the original document.
|
# link back to the original document.
|
||||||
def proxy_update(doc)
|
def proxy_update(doc)
|
||||||
if doc
|
if doc && doc.is_a?(model)
|
||||||
doc.database = @database if doc.respond_to?(:database=)
|
doc.database = @database
|
||||||
doc.model_proxy = self if doc.respond_to?(:model_proxy=)
|
doc.model_proxy = self
|
||||||
doc.send("#{owner_name}=", owner) if doc.respond_to?("#{owner_name}=")
|
doc.send("#{owner_name}=", owner)
|
||||||
end
|
end
|
||||||
doc
|
doc
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,7 +16,7 @@ module CouchRest
|
||||||
def validate_each(document, attribute, value)
|
def validate_each(document, attribute, value)
|
||||||
view_name = options[:view].nil? ? "by_#{attribute}" : options[:view]
|
view_name = options[:view].nil? ? "by_#{attribute}" : options[:view]
|
||||||
|
|
||||||
model = (respond_to?(:model_proxy) && model_proxy ? model_proxy : @model)
|
model = (document.respond_to?(:model_proxy) && document.model_proxy ? document.model_proxy : @model)
|
||||||
# Determine the base of the search
|
# Determine the base of the search
|
||||||
base = options[:proxy].nil? ? model : document.instance_eval(options[:proxy])
|
base = options[:proxy].nil? ? model : document.instance_eval(options[:proxy])
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,7 @@ module CouchRest
|
||||||
query = query.dup # Modifications made on copy!
|
query = query.dup # Modifications made on copy!
|
||||||
db = query.delete(:database) || database
|
db = query.delete(:database) || database
|
||||||
refresh_design_doc(db)
|
refresh_design_doc(db)
|
||||||
query[:raw] = true if query[:reduce]
|
query[:raw] = true if query[:reduce]
|
||||||
raw = query.delete(:raw)
|
raw = query.delete(:raw)
|
||||||
fetch_view_with_docs(db, name, query, raw, &block)
|
fetch_view_with_docs(db, name, query, raw, &block)
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,35 @@ require File.join(FIXTURE_PATH, 'more', 'sale_invoice')
|
||||||
|
|
||||||
describe "Assocations" do
|
describe "Assocations" do
|
||||||
|
|
||||||
|
describe ".merge_belongs_to_association_options" do
|
||||||
|
before :all do
|
||||||
|
def SaleInvoice.merge_assoc_opts(*args)
|
||||||
|
merge_belongs_to_association_options(*args)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return a default set of options" do
|
||||||
|
o = SaleInvoice.merge_assoc_opts(:cat)
|
||||||
|
o[:foreign_key].should eql('cat_id')
|
||||||
|
o[:class_name].should eql('Cat')
|
||||||
|
o[:proxy_name].should eql('cats')
|
||||||
|
o[:proxy].should eql('Cat') # same as class name
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should merge with provided options" do
|
||||||
|
o = SaleInvoice.merge_assoc_opts(:cat, :foreign_key => 'somecat_id', :proxy => 'some_cats')
|
||||||
|
o[:foreign_key].should eql('somecat_id')
|
||||||
|
o[:proxy].should eql('some_cats')
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should generate a proxy string if proxied" do
|
||||||
|
SaleInvoice.stub!(:proxy_owner_method).twice.and_return('company')
|
||||||
|
o = SaleInvoice.merge_assoc_opts(:cat)
|
||||||
|
o[:proxy].should eql('self.company.cats')
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
describe "of type belongs to" do
|
describe "of type belongs to" do
|
||||||
|
|
||||||
before :each do
|
before :each do
|
||||||
|
@ -43,14 +72,6 @@ describe "Assocations" do
|
||||||
@invoice.client
|
@invoice.client
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should raise error if class name does not exist" do
|
|
||||||
lambda do
|
|
||||||
class TestBadAssoc < CouchRest::Model::Base
|
|
||||||
belongs_to :test_bad_item
|
|
||||||
end
|
|
||||||
end.should raise_error(NameError, /TestBadAssoc#test_bad_item/)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "should allow override of foreign key" do
|
it "should allow override of foreign key" do
|
||||||
@invoice.respond_to?(:alternate_client).should be_true
|
@invoice.respond_to?(:alternate_client).should be_true
|
||||||
@invoice.respond_to?("alternate_client=").should be_true
|
@invoice.respond_to?("alternate_client=").should be_true
|
||||||
|
@ -78,8 +99,8 @@ describe "Assocations" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should create an associated property and collection proxy" do
|
it "should create an associated property and collection proxy" do
|
||||||
@invoice.respond_to?('entry_ids')
|
@invoice.respond_to?('entry_ids').should be_true
|
||||||
@invoice.respond_to?('entry_ids=')
|
@invoice.respond_to?('entry_ids=').should be_true
|
||||||
@invoice.entries.class.should eql(::CouchRest::CollectionOfProxy)
|
@invoice.entries.class.should eql(::CouchRest::CollectionOfProxy)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -13,16 +13,27 @@ end
|
||||||
|
|
||||||
describe "Proxyable" do
|
describe "Proxyable" do
|
||||||
|
|
||||||
it "should provide #model_proxy method" do
|
|
||||||
DummyProxyable.new.should respond_to(:model_proxy)
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "class methods" do
|
describe "class methods" do
|
||||||
|
|
||||||
|
before(:each) do
|
||||||
|
@class = DummyProxyable.clone
|
||||||
|
end
|
||||||
|
|
||||||
|
describe ".proxy_owner_method" do
|
||||||
|
it "should provide proxy_owner_method accessors" do
|
||||||
|
@class.should respond_to(:proxy_owner_method)
|
||||||
|
@class.should respond_to(:proxy_owner_method=)
|
||||||
|
end
|
||||||
|
it "should work as expected" do
|
||||||
|
@class.proxy_owner_method = "foo"
|
||||||
|
@class.proxy_owner_method.should eql("foo")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe ".proxy_for" do
|
describe ".proxy_for" do
|
||||||
|
|
||||||
it "should be provided" do
|
it "should be provided" do
|
||||||
DummyProxyable.should respond_to(:proxy_for)
|
@class.should respond_to(:proxy_for)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should create a new method" do
|
it "should create a new method" do
|
||||||
|
@ -54,42 +65,53 @@ describe "Proxyable" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should raise an error if the database method is missing" do
|
it "should raise an error if the database method is missing" do
|
||||||
DummyProxyable.proxy_for(:cats)
|
@class.proxy_for(:cats)
|
||||||
@obj = DummyProxyable.new
|
@obj = @class.new
|
||||||
@obj.should_receive(:respond_to?).with('proxy_database').and_return(false)
|
@obj.should_receive(:respond_to?).with('proxy_database').and_return(false)
|
||||||
lambda { @obj.cats }.should raise_error(StandardError, "Missing #proxy_database method for proxy")
|
lambda { @obj.cats }.should raise_error(StandardError, "Missing #proxy_database method for proxy")
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should raise an error if custom database method missing" do
|
it "should raise an error if custom database method missing" do
|
||||||
DummyProxyable.proxy_for(:proxy_kittens, :database_method => "foobardom")
|
@class.proxy_for(:proxy_kittens, :database_method => "foobardom")
|
||||||
@obj = DummyProxyable.new
|
@obj = @class.new
|
||||||
lambda { @obj.proxy_kittens }.should raise_error(StandardError, "Missing #foobardom method for proxy")
|
lambda { @obj.proxy_kittens }.should raise_error(StandardError, "Missing #foobardom method for proxy")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
describe ".proxied_by" do
|
describe ".proxied_by" do
|
||||||
it "should be provided" do
|
it "should be provided" do
|
||||||
DummyProxyable.should respond_to(:proxied_by)
|
@class.should respond_to(:proxied_by)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should add an attribute accessor" do
|
it "should add an attribute accessor" do
|
||||||
DummyProxyable.proxied_by(:foobar)
|
@class.proxied_by(:foobar)
|
||||||
DummyProxyable.new.should respond_to(:foobar)
|
@class.new.should respond_to(:foobar)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should provide #model_proxy method" do
|
||||||
|
@class.proxied_by(:foobar)
|
||||||
|
@class.new.should respond_to(:model_proxy)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should set the proxy_owner_method" do
|
||||||
|
@class.proxied_by(:foobar)
|
||||||
|
@class.proxy_owner_method.should eql(:foobar)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should raise an error if model name pre-defined" do
|
it "should raise an error if model name pre-defined" do
|
||||||
lambda { DummyProxyable.proxied_by(:object_id) }.should raise_error
|
lambda { @class.proxied_by(:object_id) }.should raise_error
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should raise an error if object already has a proxy" do
|
||||||
|
@class.proxied_by(:department)
|
||||||
|
lambda { @class.proxied_by(:company) }.should raise_error
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "ModelProxy" do
|
describe "ModelProxy" do
|
||||||
|
|
||||||
before :all do
|
before :all do
|
||||||
@klass = CouchRest::Model::Proxyable::ModelProxy
|
@klass = CouchRest::Model::Proxyable::ModelProxy
|
||||||
end
|
end
|
||||||
|
@ -241,22 +263,18 @@ describe "Proxyable" do
|
||||||
describe "#proxy_update" do
|
describe "#proxy_update" do
|
||||||
it "should set returned doc fields" do
|
it "should set returned doc fields" do
|
||||||
doc = mock(:Document)
|
doc = mock(:Document)
|
||||||
doc.should_receive(:respond_to?).with(:database=).and_return(true)
|
doc.should_receive(:is_a?).with(Cat).and_return(true)
|
||||||
doc.should_receive(:database=).with('database')
|
doc.should_receive(:database=).with('database')
|
||||||
doc.should_receive(:respond_to?).with(:model_proxy=).and_return(true)
|
|
||||||
doc.should_receive(:model_proxy=).with(@obj)
|
doc.should_receive(:model_proxy=).with(@obj)
|
||||||
doc.should_receive(:respond_to?).with('owner_name=').and_return(true)
|
|
||||||
doc.should_receive(:send).with('owner_name=', 'owner')
|
doc.should_receive(:send).with('owner_name=', 'owner')
|
||||||
@obj.send(:proxy_update, doc).should eql(doc)
|
@obj.send(:proxy_update, doc).should eql(doc)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should not fail if some fields missing" do
|
it "should not set anything if matching document not provided" do
|
||||||
doc = mock(:Document)
|
doc = mock(:DocumentFoo)
|
||||||
doc.should_receive(:respond_to?).with(:database=).and_return(true)
|
doc.should_receive(:is_a?).with(Cat).and_return(false)
|
||||||
doc.should_receive(:database=).with('database')
|
doc.should_not_receive(:database=)
|
||||||
doc.should_receive(:respond_to?).with(:model_proxy=).and_return(false)
|
|
||||||
doc.should_not_receive(:model_proxy=)
|
doc.should_not_receive(:model_proxy=)
|
||||||
doc.should_receive(:respond_to?).with('owner_name=').and_return(false)
|
|
||||||
doc.should_not_receive(:owner_name=)
|
doc.should_not_receive(:owner_name=)
|
||||||
@obj.send(:proxy_update, doc).should eql(doc)
|
@obj.send(:proxy_update, doc).should eql(doc)
|
||||||
end
|
end
|
||||||
|
@ -309,6 +327,7 @@ describe "Proxyable" do
|
||||||
|
|
||||||
it "should allow creation of new entries" do
|
it "should allow creation of new entries" do
|
||||||
inv = @company.proxyable_invoices.new(:client => "Lorena", :total => 35)
|
inv = @company.proxyable_invoices.new(:client => "Lorena", :total => 35)
|
||||||
|
inv.database.should_not be_nil
|
||||||
inv.save.should be_true
|
inv.save.should be_true
|
||||||
@company.proxyable_invoices.count.should eql(1)
|
@company.proxyable_invoices.count.should eql(1)
|
||||||
@company.proxyable_invoices.first.client.should eql("Lorena")
|
@company.proxyable_invoices.first.client.should eql("Lorena")
|
||||||
|
|
|
@ -77,7 +77,17 @@ describe "Validations" do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "when proxied" do
|
||||||
|
it "should lookup the model_proxy" do
|
||||||
|
mp = mock(:ModelProxy)
|
||||||
|
mp.should_receive(:view).and_return({'rows' => []})
|
||||||
|
@obj = WithUniqueValidation.new(:title => 'test 8')
|
||||||
|
@obj.stub!(:model_proxy).twice.and_return(mp)
|
||||||
|
@obj.valid?
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue