mongo_mapper 0.8.6 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/UPGRADES +10 -0
- data/bin/mmconsole +0 -1
- data/examples/identity_map/automatic.rb +1 -7
- data/examples/plugins.rb +9 -9
- data/examples/safe.rb +43 -0
- data/lib/mongo_mapper.rb +46 -33
- data/lib/mongo_mapper/document.rb +33 -32
- data/lib/mongo_mapper/embedded_document.rb +22 -22
- data/lib/mongo_mapper/locale/en.yml +5 -0
- data/lib/mongo_mapper/middleware/identity_map.rb +16 -0
- data/lib/mongo_mapper/plugins.rb +16 -3
- data/lib/mongo_mapper/plugins/accessible.rb +2 -0
- data/lib/mongo_mapper/plugins/active_model.rb +18 -0
- data/lib/mongo_mapper/plugins/associations.rb +37 -42
- data/lib/mongo_mapper/plugins/associations/base.rb +14 -50
- data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +58 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +6 -1
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +30 -2
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +4 -0
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +12 -6
- data/lib/mongo_mapper/plugins/associations/many_association.rb +67 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +5 -5
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -1
- data/lib/mongo_mapper/plugins/associations/one_association.rb +20 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +5 -0
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +7 -7
- data/lib/mongo_mapper/plugins/associations/proxy.rb +2 -2
- data/lib/mongo_mapper/plugins/caching.rb +3 -1
- data/lib/mongo_mapper/plugins/callbacks.rb +12 -221
- data/lib/mongo_mapper/plugins/clone.rb +3 -1
- data/lib/mongo_mapper/plugins/dirty.rb +38 -91
- data/lib/mongo_mapper/plugins/document.rb +4 -2
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +2 -0
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +43 -0
- data/lib/mongo_mapper/plugins/embedded_document.rb +16 -9
- data/lib/mongo_mapper/plugins/equality.rb +2 -0
- data/lib/mongo_mapper/plugins/identity_map.rb +4 -2
- data/lib/mongo_mapper/plugins/indexes.rb +2 -0
- data/lib/mongo_mapper/plugins/inspect.rb +3 -1
- data/lib/mongo_mapper/plugins/keys.rb +28 -22
- data/lib/mongo_mapper/plugins/keys/key.rb +12 -6
- data/lib/mongo_mapper/plugins/logger.rb +2 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +3 -1
- data/lib/mongo_mapper/plugins/pagination.rb +2 -0
- data/lib/mongo_mapper/plugins/persistence.rb +2 -0
- data/lib/mongo_mapper/plugins/protected.rb +2 -0
- data/lib/mongo_mapper/plugins/querying.rb +5 -4
- data/lib/mongo_mapper/plugins/rails.rb +3 -5
- data/lib/mongo_mapper/plugins/safe.rb +2 -0
- data/lib/mongo_mapper/plugins/sci.rb +2 -0
- data/lib/mongo_mapper/plugins/scopes.rb +2 -0
- data/lib/mongo_mapper/plugins/serialization.rb +67 -46
- data/lib/mongo_mapper/plugins/timestamps.rb +3 -1
- data/lib/mongo_mapper/plugins/userstamps.rb +2 -0
- data/lib/mongo_mapper/plugins/validations.rb +40 -24
- data/lib/mongo_mapper/railtie.rb +49 -0
- data/lib/mongo_mapper/railtie/database.rake +60 -0
- data/lib/mongo_mapper/support/descendant_appends.rb +11 -11
- data/lib/mongo_mapper/translation.rb +10 -0
- data/lib/mongo_mapper/version.rb +1 -1
- data/lib/rails/generators/mongo_mapper/config/config_generator.rb +24 -0
- data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +18 -0
- data/lib/rails/generators/mongo_mapper/model/model_generator.rb +23 -0
- data/lib/rails/generators/mongo_mapper/model/templates/model.rb +11 -0
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +1 -0
- data/test/functional/associations/test_belongs_to_proxy.rb +131 -1
- data/test/functional/associations/test_in_array_proxy.rb +30 -0
- data/test/functional/associations/test_many_documents_proxy.rb +30 -2
- data/test/functional/associations/test_many_embedded_proxy.rb +33 -0
- data/test/functional/associations/test_many_polymorphic_proxy.rb +1 -0
- data/test/functional/associations/test_one_embedded_proxy.rb +21 -2
- data/test/functional/associations/test_one_proxy.rb +49 -9
- data/test/functional/test_associations.rb +2 -0
- data/test/functional/test_caching.rb +3 -2
- data/test/functional/test_callbacks.rb +25 -18
- data/test/functional/test_dirty.rb +123 -1
- data/test/functional/test_document.rb +26 -2
- data/test/functional/test_embedded_document.rb +68 -2
- data/test/functional/test_identity_map.rb +3 -4
- data/test/functional/test_querying.rb +11 -0
- data/test/functional/test_userstamps.rb +2 -2
- data/test/functional/test_validations.rb +31 -29
- data/test/models.rb +10 -0
- data/test/test_active_model_lint.rb +1 -1
- data/test/test_helper.rb +9 -10
- data/test/unit/associations/test_base.rb +24 -100
- data/test/unit/associations/test_belongs_to_association.rb +29 -0
- data/test/unit/associations/test_many_association.rb +63 -0
- data/test/unit/associations/test_one_association.rb +18 -0
- data/test/unit/serializers/test_json_serializer.rb +0 -1
- data/test/unit/test_descendant_appends.rb +8 -16
- data/test/unit/test_document.rb +4 -9
- data/test/unit/test_dynamic_finder.rb +1 -1
- data/test/unit/test_embedded_document.rb +51 -18
- data/test/unit/test_identity_map_middleware.rb +34 -0
- data/test/unit/test_inspect.rb +22 -0
- data/test/unit/test_key.rb +21 -1
- data/test/unit/test_keys.rb +0 -2
- data/test/unit/test_plugins.rb +106 -20
- data/test/unit/test_rails.rb +8 -8
- data/test/unit/test_serialization.rb +116 -1
- data/test/unit/test_translation.rb +27 -0
- data/test/unit/test_validations.rb +66 -81
- metadata +103 -43
- data/examples/identity_map/middleware.rb +0 -14
- data/lib/mongo_mapper/plugins/descendants.rb +0 -17
- data/rails/init.rb +0 -19
@@ -66,7 +66,7 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
66
66
|
@klass.key :foo, @address_class
|
67
67
|
end
|
68
68
|
|
69
|
-
should "be true until document is
|
69
|
+
should "be true until document is created" do
|
70
70
|
address = @address_class.new(:city => 'South Bend', :state => 'IN')
|
71
71
|
doc = @klass.new(:foo => address)
|
72
72
|
address.new?.should be_true
|
@@ -89,7 +89,7 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
-
context "new? (embedded association)" do
|
92
|
+
context "new? (embedded many association)" do
|
93
93
|
setup do
|
94
94
|
@doc = @klass.new(:pets => [{:name => 'poo bear'}])
|
95
95
|
end
|
@@ -110,6 +110,61 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
110
110
|
@doc.reload
|
111
111
|
@doc.pets.first.should_not be_new
|
112
112
|
end
|
113
|
+
|
114
|
+
should "be true until existing document is saved" do
|
115
|
+
@doc.save
|
116
|
+
pet = @doc.pets.build(:name => 'Rasmus')
|
117
|
+
pet.new?.should be_true
|
118
|
+
@doc.save
|
119
|
+
pet.new?.should be_false
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "new? (nested embedded many association)" do
|
124
|
+
setup do
|
125
|
+
@pet_klass.many :addresses, :class=> @address_class
|
126
|
+
@doc = @klass.new
|
127
|
+
@doc.pets.build(:name => 'Rasmus')
|
128
|
+
@doc.save
|
129
|
+
end
|
130
|
+
|
131
|
+
should "be true until existing document is saved" do
|
132
|
+
address = @doc.pets.first.addresses.build(:city => 'Holland', :state => 'MI')
|
133
|
+
address.new?.should be_true
|
134
|
+
@doc.save
|
135
|
+
address.new?.should be_false
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context "new? (embedded one association)" do
|
140
|
+
setup do
|
141
|
+
@klass.one :address, :class => @address_class
|
142
|
+
@doc = @klass.new
|
143
|
+
end
|
144
|
+
|
145
|
+
should "be true until existing document is saved" do
|
146
|
+
@doc.save
|
147
|
+
@doc.build_address(:city => 'Holland', :state => 'MI')
|
148
|
+
@doc.address.new?.should be_true
|
149
|
+
@doc.save
|
150
|
+
@doc.address.new?.should be_false
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context "new? (nested embedded one association)" do
|
155
|
+
setup do
|
156
|
+
@pet_klass.one :address, :class => @address_class
|
157
|
+
@doc = @klass.new
|
158
|
+
@doc.pets.build(:name => 'Rasmus')
|
159
|
+
@doc.save
|
160
|
+
end
|
161
|
+
|
162
|
+
should "be true until existing document is saved" do
|
163
|
+
address = @doc.pets.first.build_address(:city => 'Holland', :stats => 'MI')
|
164
|
+
address.new?.should be_true
|
165
|
+
@doc.save
|
166
|
+
address.new?.should be_false
|
167
|
+
end
|
113
168
|
end
|
114
169
|
|
115
170
|
context "#destroyed?" do
|
@@ -164,6 +219,17 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
164
219
|
person.pets.first.should == pet
|
165
220
|
end
|
166
221
|
|
222
|
+
should "be able to save!" do
|
223
|
+
person = @klass.create
|
224
|
+
|
225
|
+
pet = @pet_klass.new(:name => 'sparky')
|
226
|
+
person.pets << pet
|
227
|
+
pet.should be_new
|
228
|
+
|
229
|
+
person.expects(:save!)
|
230
|
+
pet.save!
|
231
|
+
end
|
232
|
+
|
167
233
|
should "be able to dynamically add new keys and save" do
|
168
234
|
person = @klass.create
|
169
235
|
|
@@ -410,7 +410,6 @@ class IdentityMapTest < Test::Unit::TestCase
|
|
410
410
|
assert_in_map(root)
|
411
411
|
|
412
412
|
blog = Blog.create(:title => 'Jill', :parent => root)
|
413
|
-
blog.parent.inspect
|
414
413
|
assert_in_map(blog)
|
415
414
|
root.should equal(blog.parent.target)
|
416
415
|
end
|
@@ -426,7 +425,7 @@ class IdentityMapTest < Test::Unit::TestCase
|
|
426
425
|
|
427
426
|
should "work correctly with one proxy create" do
|
428
427
|
root = Item.create(:title => 'Root')
|
429
|
-
blog = root.
|
428
|
+
blog = root.create_blog(:title => 'Blog')
|
430
429
|
blog.parent.should equal(root)
|
431
430
|
end
|
432
431
|
end
|
@@ -465,11 +464,11 @@ class IdentityMapTest < Test::Unit::TestCase
|
|
465
464
|
loaded.should_not equal(post)
|
466
465
|
end
|
467
466
|
end
|
468
|
-
|
467
|
+
|
469
468
|
should "not load attributes from map when finding" do
|
470
469
|
post = @post_class.create(:title => 'Awesome!')
|
471
470
|
post.title = 'Temporary'
|
472
|
-
@post_class.without_identity_map do
|
471
|
+
@post_class.without_identity_map do
|
473
472
|
@post_class.find(post.id).title.should == 'Awesome!'
|
474
473
|
end
|
475
474
|
end
|
@@ -677,6 +677,17 @@ class QueryingTesting < Test::Unit::TestCase
|
|
677
677
|
end
|
678
678
|
end
|
679
679
|
|
680
|
+
context "#update_attribute" do
|
681
|
+
setup do
|
682
|
+
@doc = @document.create(:first_name => 'John', :age => '27')
|
683
|
+
end
|
684
|
+
|
685
|
+
should "update the attribute" do
|
686
|
+
@doc.update_attribute(:first_name, 'Chris').should be_true
|
687
|
+
@doc.reload.first_name.should == 'Chris'
|
688
|
+
end
|
689
|
+
end
|
690
|
+
|
680
691
|
context "#save (new document)" do
|
681
692
|
setup do
|
682
693
|
@doc = @document.new(:first_name => 'John', :age => '27')
|
@@ -17,11 +17,11 @@ class UserstampsTest < Test::Unit::TestCase
|
|
17
17
|
end
|
18
18
|
|
19
19
|
should "add belongs_to creator" do
|
20
|
-
@document.associations.keys.should include(
|
20
|
+
@document.associations.keys.should include(:creator)
|
21
21
|
end
|
22
22
|
|
23
23
|
should "add belongs_to updater" do
|
24
|
-
@document.associations.keys.should include(
|
24
|
+
@document.associations.keys.should include(:updater)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -18,7 +18,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
18
18
|
doc = @document.new
|
19
19
|
doc.errors.size.should == 0
|
20
20
|
doc.save
|
21
|
-
doc.errors.full_messages.should == ["Name can't be
|
21
|
+
doc.errors.full_messages.should == ["Name can't be blank"]
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -70,7 +70,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
70
70
|
should "populate document's errors" do
|
71
71
|
@doc.name = nil
|
72
72
|
@doc.save
|
73
|
-
@doc.errors.full_messages.should == ["Name can't be
|
73
|
+
@doc.errors.full_messages.should == ["Name can't be blank"]
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
@@ -84,23 +84,19 @@ class ValidationsTest < Test::Unit::TestCase
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
should "work with
|
88
|
-
@document.
|
87
|
+
should "work with validate :on => :create callback" do
|
88
|
+
@document.validate :action_present, :on => :create
|
89
89
|
|
90
|
-
doc = @document.
|
91
|
-
doc.action = nil
|
90
|
+
doc = @document.create(:action => nil)
|
92
91
|
doc.should have_error_on(:action)
|
93
92
|
|
94
93
|
doc.action = 'kick'
|
95
|
-
doc.should_not have_error_on(:action)
|
96
94
|
doc.save
|
97
|
-
|
98
|
-
doc.action = nil
|
99
95
|
doc.should_not have_error_on(:action)
|
100
96
|
end
|
101
97
|
|
102
|
-
should "work with
|
103
|
-
@document.
|
98
|
+
should "work with validate :on => :update callback" do
|
99
|
+
@document.validate :action_present, :on => :update
|
104
100
|
|
105
101
|
doc = @document.new
|
106
102
|
doc.action = nil
|
@@ -141,6 +137,12 @@ class ValidationsTest < Test::Unit::TestCase
|
|
141
137
|
doc2.should be_valid
|
142
138
|
end
|
143
139
|
|
140
|
+
should "work with i18n taken message" do
|
141
|
+
@document.create(:name => 'joe')
|
142
|
+
doc = @document.create(:name => 'joe')
|
143
|
+
doc.should have_error_on(:name, 'has already been taken')
|
144
|
+
end
|
145
|
+
|
144
146
|
should "allow to update an object" do
|
145
147
|
doc = @document.new("name" => "joe")
|
146
148
|
doc.save.should be_true
|
@@ -321,22 +323,22 @@ class ValidationsTest < Test::Unit::TestCase
|
|
321
323
|
end
|
322
324
|
end
|
323
325
|
|
324
|
-
context "validates uniqueness of with :unique shortcut" do
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
end
|
326
|
+
# context "validates uniqueness of with :unique shortcut" do
|
327
|
+
# should "work" do
|
328
|
+
# @document = Doc do
|
329
|
+
# key :name, String, :unique => true
|
330
|
+
# end
|
331
|
+
#
|
332
|
+
# doc = @document.create(:name => 'John')
|
333
|
+
# doc.should_not have_error_on(:name)
|
334
|
+
#
|
335
|
+
# @document \
|
336
|
+
# .stubs(:first) \
|
337
|
+
# .with(:name => 'John') \
|
338
|
+
# .returns(doc)
|
339
|
+
#
|
340
|
+
# second_john = @document.create(:name => 'John')
|
341
|
+
# second_john.should have_error_on(:name, 'has already been taken')
|
342
|
+
# end
|
343
|
+
# end
|
342
344
|
end
|
data/test/models.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -6,17 +6,18 @@ require 'mongo_mapper'
|
|
6
6
|
require 'fileutils'
|
7
7
|
require 'ostruct'
|
8
8
|
|
9
|
-
require 'active_support/version'
|
10
9
|
require 'json'
|
11
10
|
require 'log_buddy'
|
12
11
|
require 'matchy'
|
13
12
|
require 'shoulda'
|
14
13
|
require 'timecop'
|
15
14
|
require 'mocha'
|
15
|
+
require 'ruby-debug'
|
16
16
|
|
17
17
|
class Test::Unit::TestCase
|
18
|
-
def Doc(name=
|
19
|
-
klass = Class.new
|
18
|
+
def Doc(name='Class', &block)
|
19
|
+
klass = Class.new
|
20
|
+
klass.class_eval do
|
20
21
|
include MongoMapper::Document
|
21
22
|
set_collection_name :test
|
22
23
|
|
@@ -31,7 +32,7 @@ class Test::Unit::TestCase
|
|
31
32
|
klass
|
32
33
|
end
|
33
34
|
|
34
|
-
def EDoc(name=
|
35
|
+
def EDoc(name='Class', &block)
|
35
36
|
klass = Class.new do
|
36
37
|
include MongoMapper::EmbeddedDocument
|
37
38
|
|
@@ -71,12 +72,12 @@ class Test::Unit::TestCase
|
|
71
72
|
if expected_message.nil?
|
72
73
|
matcher.positive_failure_message = "#{receiver} had no errors on #{attribute}"
|
73
74
|
matcher.negative_failure_message = "#{receiver} had errors on #{attribute} #{receiver.errors.inspect}"
|
74
|
-
!receiver.errors
|
75
|
+
!receiver.errors[attribute].blank?
|
75
76
|
else
|
76
|
-
actual = receiver.errors
|
77
|
+
actual = receiver.errors[attribute]
|
77
78
|
matcher.positive_failure_message = %Q(Expected error on #{attribute} to be "#{expected_message}" but was "#{actual}")
|
78
79
|
matcher.negative_failure_message = %Q(Expected error on #{attribute} not to be "#{expected_message}" but was "#{actual}")
|
79
|
-
actual
|
80
|
+
actual.include? expected_message
|
80
81
|
end
|
81
82
|
end
|
82
83
|
|
@@ -94,7 +95,5 @@ logger = Logger.new(log_dir + '/test.log')
|
|
94
95
|
|
95
96
|
LogBuddy.init(:logger => logger)
|
96
97
|
MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017, :logger => logger)
|
97
|
-
MongoMapper.database = "
|
98
|
+
MongoMapper.database = "test"
|
98
99
|
MongoMapper.database.collections.each { |c| c.drop_indexes }
|
99
|
-
|
100
|
-
puts "\n--- Active Support Version: #{ActiveSupport::VERSION::STRING} ---\n"
|
@@ -7,206 +7,130 @@ class AssociationBaseTest < Test::Unit::TestCase
|
|
7
7
|
include MongoMapper::Plugins::Associations
|
8
8
|
|
9
9
|
should "initialize with type and name" do
|
10
|
-
base =
|
11
|
-
base.type.should == :many
|
10
|
+
base = ManyAssociation.new(:foos)
|
12
11
|
base.name.should == :foos
|
13
12
|
end
|
14
13
|
|
15
14
|
should "also allow options when initializing" do
|
16
|
-
base =
|
15
|
+
base = ManyAssociation.new(:foos, :polymorphic => true)
|
17
16
|
base.options[:polymorphic].should be_true
|
18
17
|
end
|
19
18
|
|
20
|
-
context "class_name" do
|
21
|
-
should "work for belongs_to" do
|
22
|
-
Base.new(:belongs_to, :user).class_name.should == 'User'
|
23
|
-
end
|
24
|
-
|
25
|
-
should "work for many" do
|
26
|
-
Base.new(:many, :smart_people).class_name.should == 'SmartPerson'
|
27
|
-
end
|
28
|
-
|
29
|
-
should "be changeable using class_name option" do
|
30
|
-
base = Base.new(:many, :smart_people, :class_name => 'IntelligentPerson')
|
31
|
-
base.class_name.should == 'IntelligentPerson'
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
19
|
context "klass" do
|
36
20
|
should "default to class_name constantized" do
|
37
|
-
|
21
|
+
BelongsToAssociation.new(:foo_monster).klass.should == FooMonster
|
38
22
|
end
|
39
23
|
|
40
24
|
should "be the specified class" do
|
41
25
|
anonnymous_class = Class.new
|
42
|
-
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
context "many?" do
|
47
|
-
should "be true if many" do
|
48
|
-
Base.new(:many, :foos).many?.should be_true
|
49
|
-
end
|
50
|
-
|
51
|
-
should "be false if not many" do
|
52
|
-
Base.new(:belongs_to, :foo).many?.should be_false
|
53
|
-
Base.new(:one, :foo).many?.should be_false
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context "one?" do
|
58
|
-
should "be true if one" do
|
59
|
-
Base.new(:one, :foo).one?.should be_true
|
60
|
-
end
|
61
|
-
|
62
|
-
should "be false if not one" do
|
63
|
-
Base.new(:many, :foo).one?.should be_false
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context "belongs_to?" do
|
68
|
-
should "be true if belongs_to" do
|
69
|
-
Base.new(:belongs_to, :foo).belongs_to?.should be_true
|
70
|
-
end
|
71
|
-
|
72
|
-
should "be false if not belongs_to" do
|
73
|
-
Base.new(:many, :foos).belongs_to?.should be_false
|
26
|
+
BelongsToAssociation.new(:foo_monster, :class => anonnymous_class).klass.should == anonnymous_class
|
74
27
|
end
|
75
28
|
end
|
76
29
|
|
77
30
|
context "polymorphic?" do
|
78
31
|
should "be true if polymorphic" do
|
79
|
-
|
32
|
+
ManyAssociation.new(:foos, :polymorphic => true).polymorphic?.should be_true
|
80
33
|
end
|
81
34
|
|
82
35
|
should "be false if not polymorphic" do
|
83
|
-
|
36
|
+
ManyAssociation.new(:bars).polymorphic?.should be_false
|
84
37
|
end
|
85
38
|
end
|
86
39
|
|
87
40
|
context "as?" do
|
88
41
|
should "be true if one" do
|
89
|
-
|
42
|
+
OneAssociation.new(:foo, :as => :commentable).as?.should be_true
|
90
43
|
end
|
91
44
|
|
92
45
|
should "be false if not one" do
|
93
|
-
|
46
|
+
ManyAssociation.new(:foo).as?.should be_false
|
94
47
|
end
|
95
48
|
end
|
96
49
|
|
97
50
|
context "in_array?" do
|
98
51
|
should "be true if one" do
|
99
|
-
|
52
|
+
OneAssociation.new(:foo, :in => :list_ids).in_array?.should be_true
|
100
53
|
end
|
101
54
|
|
102
55
|
should "be false if not one" do
|
103
|
-
|
56
|
+
ManyAssociation.new(:foo).in_array?.should be_false
|
104
57
|
end
|
105
58
|
end
|
106
59
|
|
107
60
|
context "query_options" do
|
108
61
|
should "default to empty hash" do
|
109
|
-
base =
|
62
|
+
base = ManyAssociation.new(:foos)
|
110
63
|
base.query_options.should == {}
|
111
64
|
end
|
112
65
|
|
113
66
|
should "work with order" do
|
114
|
-
base =
|
67
|
+
base = ManyAssociation.new(:foos, :order => 'position')
|
115
68
|
base.query_options.should == {:order => 'position'}
|
116
69
|
end
|
117
70
|
|
118
71
|
should "correctly parse from options" do
|
119
|
-
base =
|
72
|
+
base = ManyAssociation.new(:foos, :order => 'position', :somekey => 'somevalue')
|
120
73
|
base.query_options.should == {:order => 'position', :somekey => 'somevalue'}
|
121
74
|
end
|
122
75
|
end
|
123
76
|
|
124
77
|
context "type_key_name" do
|
125
|
-
should "be _type for many" do
|
126
|
-
Base.new(:many, :foos).type_key_name.should == '_type'
|
127
|
-
end
|
128
|
-
|
129
78
|
should "be association name _ type for belongs_to" do
|
130
|
-
|
79
|
+
BelongsToAssociation.new(:foo).type_key_name.should == 'foo_type'
|
131
80
|
end
|
132
81
|
end
|
133
82
|
|
134
83
|
context "foreign_key" do
|
135
84
|
should "default to assocation name _id for belongs to" do
|
136
|
-
base =
|
85
|
+
base = BelongsToAssociation.new(:foo)
|
137
86
|
base.foreign_key.should == 'foo_id'
|
138
87
|
end
|
139
88
|
|
140
89
|
should "be overridable with :foreign_key option" do
|
141
|
-
base =
|
90
|
+
base = BelongsToAssociation.new(:foo, :foreign_key => 'foobar_id')
|
142
91
|
base.foreign_key.should == 'foobar_id'
|
143
92
|
end
|
144
93
|
end
|
145
94
|
|
146
95
|
should "have ivar that is association name" do
|
147
|
-
|
96
|
+
BelongsToAssociation.new(:foo).ivar.should == '@_foo'
|
148
97
|
end
|
149
98
|
|
150
99
|
context "embeddable?" do
|
151
100
|
should "be true if class is embeddable" do
|
152
|
-
base =
|
101
|
+
base = ManyAssociation.new(:medias)
|
153
102
|
base.embeddable?.should be_true
|
154
103
|
end
|
155
104
|
|
156
105
|
should "be false if class is not embeddable" do
|
157
|
-
base =
|
106
|
+
base = ManyAssociation.new(:statuses)
|
158
107
|
base.embeddable?.should be_false
|
159
108
|
|
160
|
-
base =
|
109
|
+
base = BelongsToAssociation.new(:project)
|
161
110
|
base.embeddable?.should be_false
|
162
111
|
end
|
163
112
|
end
|
164
113
|
|
165
114
|
context "proxy_class" do
|
166
|
-
should "be ManyDocumentsProxy for many" do
|
167
|
-
base = Base.new(:many, :statuses)
|
168
|
-
base.proxy_class.should == ManyDocumentsProxy
|
169
|
-
end
|
170
|
-
|
171
|
-
should "be ManyPolymorphicProxy for polymorphic many" do
|
172
|
-
base = Base.new(:many, :messages, :polymorphic => true)
|
173
|
-
base.proxy_class.should == ManyPolymorphicProxy
|
174
|
-
end
|
175
|
-
|
176
|
-
should "be ManyEmbeddedProxy for many embedded" do
|
177
|
-
base = Base.new(:many, :medias)
|
178
|
-
base.proxy_class.should == ManyEmbeddedProxy
|
179
|
-
end
|
180
|
-
|
181
|
-
should "be ManyEmbeddedPolymorphicProxy for polymorphic many embedded" do
|
182
|
-
base = Base.new(:many, :medias, :polymorphic => true)
|
183
|
-
base.proxy_class.should == ManyEmbeddedPolymorphicProxy
|
184
|
-
end
|
185
|
-
|
186
115
|
should "be BelongsToProxy for belongs_to" do
|
187
|
-
base =
|
116
|
+
base = BelongsToAssociation.new(:project)
|
188
117
|
base.proxy_class.should == BelongsToProxy
|
189
118
|
end
|
190
119
|
|
191
120
|
should "be BelongsToPolymorphicProxy for polymorphic belongs_to" do
|
192
|
-
base =
|
121
|
+
base = BelongsToAssociation.new(:target, :polymorphic => true)
|
193
122
|
base.proxy_class.should == BelongsToPolymorphicProxy
|
194
123
|
end
|
195
124
|
|
196
125
|
should "be OneProxy for one" do
|
197
|
-
base =
|
126
|
+
base = OneAssociation.new(:status, :polymorphic => true)
|
198
127
|
base.proxy_class.should == OneProxy
|
199
128
|
end
|
200
129
|
|
201
130
|
should "be OneEmbeddedProxy for one embedded" do
|
202
|
-
base =
|
131
|
+
base = OneAssociation.new(:media)
|
203
132
|
base.proxy_class.should == OneEmbeddedProxy
|
204
133
|
end
|
205
|
-
|
206
|
-
should "be InArrayProxy for many with :in option" do
|
207
|
-
base = Base.new(:many, :messages, :in => :message_ids)
|
208
|
-
base.proxy_class.should == InArrayProxy
|
209
|
-
end
|
210
134
|
end
|
211
135
|
|
212
136
|
end
|