mongo_mapper 0.12.0 → 0.13.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.rdoc +35 -13
- data/bin/mmconsole +1 -1
- data/lib/mongo_mapper.rb +4 -0
- data/lib/mongo_mapper/connection.rb +17 -6
- data/lib/mongo_mapper/document.rb +1 -0
- data/lib/mongo_mapper/exceptions.rb +4 -1
- data/lib/mongo_mapper/extensions/binary.rb +1 -1
- data/lib/mongo_mapper/extensions/boolean.rb +20 -23
- data/lib/mongo_mapper/extensions/date.rb +3 -3
- data/lib/mongo_mapper/extensions/integer.rb +5 -1
- data/lib/mongo_mapper/extensions/kernel.rb +2 -0
- data/lib/mongo_mapper/extensions/ordered_hash.rb +23 -0
- data/lib/mongo_mapper/extensions/string.rb +2 -2
- data/lib/mongo_mapper/extensions/time.rb +7 -5
- data/lib/mongo_mapper/middleware/identity_map.rb +3 -4
- data/lib/mongo_mapper/plugins.rb +1 -1
- data/lib/mongo_mapper/plugins/associations.rb +11 -5
- data/lib/mongo_mapper/plugins/associations/base.rb +5 -3
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +0 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +8 -8
- data/lib/mongo_mapper/plugins/associations/collection.rb +2 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +32 -7
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +2 -2
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +12 -12
- data/lib/mongo_mapper/plugins/associations/proxy.rb +5 -1
- data/lib/mongo_mapper/plugins/associations/single_association.rb +6 -6
- data/lib/mongo_mapper/plugins/clone.rb +4 -2
- data/lib/mongo_mapper/plugins/dirty.rb +22 -21
- data/lib/mongo_mapper/plugins/document.rb +4 -4
- data/lib/mongo_mapper/plugins/dumpable.rb +22 -0
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +58 -9
- data/lib/mongo_mapper/plugins/identity_map.rb +42 -32
- data/lib/mongo_mapper/plugins/keys.rb +133 -54
- data/lib/mongo_mapper/plugins/keys/key.rb +68 -22
- data/lib/mongo_mapper/plugins/modifiers.rb +26 -19
- data/lib/mongo_mapper/plugins/persistence.rb +15 -5
- data/lib/mongo_mapper/plugins/querying.rb +15 -40
- data/lib/mongo_mapper/plugins/querying/{decorator.rb → decorated_plucky_query.rb} +24 -4
- data/lib/mongo_mapper/plugins/rails.rb +22 -2
- data/lib/mongo_mapper/plugins/safe.rb +8 -5
- data/lib/mongo_mapper/plugins/sci.rb +26 -4
- data/lib/mongo_mapper/plugins/scopes.rb +5 -4
- data/lib/mongo_mapper/plugins/timestamps.rb +11 -4
- data/lib/mongo_mapper/plugins/validations.rb +1 -1
- data/lib/mongo_mapper/utils.rb +12 -0
- data/lib/mongo_mapper/version.rb +1 -1
- data/lib/rails/generators/mongo_mapper/config/config_generator.rb +20 -7
- data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +6 -0
- data/lib/rails/generators/mongo_mapper/model/model_generator.rb +18 -1
- data/lib/rails/generators/mongo_mapper/model/templates/model.rb +9 -5
- data/{test/functional/test_accessible.rb → spec/functional/accessible_spec.rb} +29 -29
- data/{test/functional/associations/test_belongs_to_polymorphic_proxy.rb → spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb} +10 -10
- data/{test/functional/associations/test_belongs_to_proxy.rb → spec/functional/associations/belongs_to_proxy_spec.rb} +82 -64
- data/{test/functional/associations/test_in_array_proxy.rb → spec/functional/associations/in_array_proxy_spec.rb} +68 -68
- data/{test/functional/associations/test_many_documents_as_proxy.rb → spec/functional/associations/many_documents_as_proxy_spec.rb} +37 -38
- data/{test/functional/associations/test_many_documents_proxy.rb → spec/functional/associations/many_documents_proxy_spec.rb} +233 -146
- data/{test/functional/associations/test_many_embedded_polymorphic_proxy.rb → spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb} +19 -20
- data/{test/functional/associations/test_many_embedded_proxy.rb → spec/functional/associations/many_embedded_proxy_spec.rb} +23 -24
- data/{test/functional/associations/test_many_polymorphic_proxy.rb → spec/functional/associations/many_polymorphic_proxy_spec.rb} +45 -46
- data/{test/functional/associations/test_one_as_proxy.rb → spec/functional/associations/one_as_proxy_spec.rb} +75 -77
- data/{test/functional/associations/test_one_embedded_polymorphic_proxy.rb → spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb} +31 -32
- data/{test/functional/associations/test_one_embedded_proxy.rb → spec/functional/associations/one_embedded_proxy_spec.rb} +10 -10
- data/{test/functional/associations/test_one_proxy.rb → spec/functional/associations/one_proxy_spec.rb} +125 -102
- data/spec/functional/associations_spec.rb +48 -0
- data/{test/functional/test_binary.rb → spec/functional/binary_spec.rb} +6 -6
- data/spec/functional/caching_spec.rb +75 -0
- data/{test/functional/test_callbacks.rb → spec/functional/callbacks_spec.rb} +84 -26
- data/{test/functional/test_dirty.rb → spec/functional/dirty_spec.rb} +57 -42
- data/{test/functional/test_document.rb → spec/functional/document_spec.rb} +52 -52
- data/spec/functional/dumpable_spec.rb +24 -0
- data/{test/functional/test_dynamic_querying.rb → spec/functional/dynamic_querying_spec.rb} +14 -14
- data/{test/functional/test_embedded_document.rb → spec/functional/embedded_document_spec.rb} +51 -42
- data/{test/functional/test_equality.rb → spec/functional/equality_spec.rb} +4 -4
- data/spec/functional/extensions_spec.rb +16 -0
- data/{test/functional/test_identity_map.rb → spec/functional/identity_map_spec.rb} +73 -61
- data/spec/functional/indexes_spec.rb +48 -0
- data/spec/functional/keys_spec.rb +224 -0
- data/{test/functional/test_logger.rb → spec/functional/logger_spec.rb} +6 -6
- data/spec/functional/modifiers_spec.rb +550 -0
- data/spec/functional/pagination_spec.rb +89 -0
- data/spec/functional/protected_spec.rb +199 -0
- data/spec/functional/querying_spec.rb +1003 -0
- data/spec/functional/rails_spec.rb +55 -0
- data/spec/functional/safe_spec.rb +163 -0
- data/{test/functional/test_sci.rb → spec/functional/sci_spec.rb} +123 -34
- data/{test/functional/test_scopes.rb → spec/functional/scopes_spec.rb} +59 -26
- data/spec/functional/timestamps_spec.rb +97 -0
- data/{test/functional/test_touch.rb → spec/functional/touch_spec.rb} +13 -13
- data/spec/functional/userstamps_spec.rb +46 -0
- data/{test/functional/test_validations.rb → spec/functional/validations_spec.rb} +64 -64
- data/spec/spec_helper.rb +81 -0
- data/spec/support/matchers.rb +24 -0
- data/{test → spec/support}/models.rb +1 -6
- data/spec/unit/associations/base_spec.rb +146 -0
- data/spec/unit/associations/belongs_to_association_spec.rb +30 -0
- data/spec/unit/associations/many_association_spec.rb +64 -0
- data/spec/unit/associations/one_association_spec.rb +48 -0
- data/{test/unit/associations/test_proxy.rb → spec/unit/associations/proxy_spec.rb} +21 -21
- data/{test/unit/test_clone.rb → spec/unit/clone_spec.rb} +21 -11
- data/spec/unit/config_generator_spec.rb +24 -0
- data/{test/unit/test_document.rb → spec/unit/document_spec.rb} +42 -42
- data/{test/unit/test_dynamic_finder.rb → spec/unit/dynamic_finder_spec.rb} +28 -28
- data/{test/unit/test_embedded_document.rb → spec/unit/embedded_document_spec.rb} +102 -108
- data/{test/unit/test_equality.rb → spec/unit/equality_spec.rb} +7 -7
- data/{test/unit/test_exceptions.rb → spec/unit/exceptions_spec.rb} +3 -3
- data/{test/unit/test_extensions.rb → spec/unit/extensions_spec.rb} +85 -71
- data/spec/unit/identity_map_middleware_spec.rb +134 -0
- data/{test/unit/test_inspect.rb → spec/unit/inspect_spec.rb} +8 -8
- data/{test/unit/test_key.rb → spec/unit/key_spec.rb} +82 -52
- data/spec/unit/keys_spec.rb +155 -0
- data/spec/unit/model_generator_spec.rb +47 -0
- data/spec/unit/mongo_mapper_spec.rb +184 -0
- data/spec/unit/pagination_spec.rb +11 -0
- data/{test/unit/test_plugins.rb → spec/unit/plugins_spec.rb} +14 -14
- data/spec/unit/rails_compatibility_spec.rb +40 -0
- data/{test/unit/test_rails_reflect_on_association.rb → spec/unit/rails_reflect_on_association_spec.rb} +9 -9
- data/{test/unit/test_rails.rb → spec/unit/rails_spec.rb} +31 -31
- data/spec/unit/serialization_spec.rb +169 -0
- data/spec/unit/serializers/json_serializer_spec.rb +218 -0
- data/spec/unit/serializers/xml_serializer_spec.rb +198 -0
- data/{test/unit/test_time_zones.rb → spec/unit/time_zones_spec.rb} +8 -8
- data/{test/unit/test_translation.rb → spec/unit/translation_spec.rb} +6 -6
- data/{test/unit/test_validations.rb → spec/unit/validations_spec.rb} +72 -59
- metadata +199 -179
- data/test/_NOTE_ON_TESTING +0 -1
- data/test/functional/test_associations.rb +0 -46
- data/test/functional/test_caching.rb +0 -77
- data/test/functional/test_indexes.rb +0 -50
- data/test/functional/test_modifiers.rb +0 -537
- data/test/functional/test_pagination.rb +0 -91
- data/test/functional/test_protected.rb +0 -201
- data/test/functional/test_querying.rb +0 -935
- data/test/functional/test_safe.rb +0 -76
- data/test/functional/test_timestamps.rb +0 -62
- data/test/functional/test_userstamps.rb +0 -44
- data/test/support/railtie.rb +0 -4
- data/test/support/railtie/autoloaded.rb +0 -2
- data/test/support/railtie/not_autoloaded.rb +0 -3
- data/test/support/railtie/parent.rb +0 -3
- data/test/test_active_model_lint.rb +0 -18
- data/test/test_helper.rb +0 -93
- data/test/unit/associations/test_base.rb +0 -146
- data/test/unit/associations/test_belongs_to_association.rb +0 -29
- data/test/unit/associations/test_many_association.rb +0 -63
- data/test/unit/associations/test_one_association.rb +0 -47
- data/test/unit/serializers/test_json_serializer.rb +0 -216
- data/test/unit/serializers/test_xml_serializer.rb +0 -196
- data/test/unit/test_identity_map_middleware.rb +0 -132
- data/test/unit/test_keys.rb +0 -65
- data/test/unit/test_mongo_mapper.rb +0 -157
- data/test/unit/test_pagination.rb +0 -11
- data/test/unit/test_rails_compatibility.rb +0 -38
- data/test/unit/test_serialization.rb +0 -166
@@ -1,25 +1,24 @@
|
|
1
|
-
require '
|
2
|
-
require 'models'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
describe "ManyEmbeddedPolymorphicProxy" do
|
4
|
+
before do
|
6
5
|
Catalog.collection.remove
|
7
6
|
TrModels::Fleet.collection.remove
|
8
7
|
end
|
9
8
|
|
10
|
-
should
|
9
|
+
it "should default reader to empty array" do
|
11
10
|
catalog = Catalog.new
|
12
11
|
catalog.medias.should == []
|
13
12
|
end
|
14
13
|
|
15
|
-
should
|
14
|
+
it "should allow adding to association like it was an array" do
|
16
15
|
catalog = Catalog.new
|
17
16
|
catalog.medias << Video.new
|
18
17
|
catalog.medias.push Video.new
|
19
18
|
catalog.medias.size.should == 2
|
20
19
|
end
|
21
20
|
|
22
|
-
should
|
21
|
+
it "should be able to replace the association" do
|
23
22
|
catalog = Catalog.new
|
24
23
|
catalog.medias = [Video.new('file' => 'video.mpg', 'length' => 3600)]
|
25
24
|
catalog.save.should be_true
|
@@ -31,7 +30,7 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
|
|
31
30
|
end
|
32
31
|
|
33
32
|
context "associating objects of non-SCI class" do
|
34
|
-
should
|
33
|
+
it "should work on replacement" do
|
35
34
|
catalog = Catalog.new
|
36
35
|
catalog.medias = [Human.new(:name => 'Frank'), Robot.new(:serial_number => '1B')]
|
37
36
|
|
@@ -51,7 +50,7 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
|
|
51
50
|
catalog.medias[1].class.should == Robot
|
52
51
|
end
|
53
52
|
|
54
|
-
should
|
53
|
+
it "should work on replacement with hashes" do
|
55
54
|
catalog = Catalog.new
|
56
55
|
catalog.medias = [{:name => 'Frank', '_type' => 'Human'}, {:serial_number => '1B', '_type' => 'Robot'}]
|
57
56
|
|
@@ -71,7 +70,7 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
|
|
71
70
|
catalog.medias[1].class.should == Robot
|
72
71
|
end
|
73
72
|
|
74
|
-
should
|
73
|
+
it "should work with concatination" do
|
75
74
|
catalog = Catalog.new
|
76
75
|
catalog.medias << Human.new(:name => 'Frank')
|
77
76
|
catalog.medias << Robot.new(:serial_number => '1B')
|
@@ -94,11 +93,11 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
|
|
94
93
|
end
|
95
94
|
|
96
95
|
context "count" do
|
97
|
-
should
|
96
|
+
it "should default to 0" do
|
98
97
|
Catalog.new.medias.count.should == 0
|
99
98
|
end
|
100
99
|
|
101
|
-
should
|
100
|
+
it 'should return correct count if any are embedded' do
|
102
101
|
catalog = Catalog.new
|
103
102
|
catalog.medias = [
|
104
103
|
Video.new('file' => 'video.mpg', 'length' => 3600),
|
@@ -112,7 +111,7 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
|
|
112
111
|
end
|
113
112
|
end
|
114
113
|
|
115
|
-
should
|
114
|
+
it "should store different associations" do
|
116
115
|
catalog = Catalog.new
|
117
116
|
catalog.medias = [
|
118
117
|
Video.new('file' => 'video.mpg', 'length' => 3600),
|
@@ -133,7 +132,7 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
|
|
133
132
|
end
|
134
133
|
|
135
134
|
context "With modularized models" do
|
136
|
-
should
|
135
|
+
it "should set associations correctly" do
|
137
136
|
fleet_attributes = {
|
138
137
|
'name' => 'My Fleet',
|
139
138
|
'transports' => [
|
@@ -170,19 +169,19 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
|
|
170
169
|
fleet.transports[2].year.should == 2008
|
171
170
|
end
|
172
171
|
|
173
|
-
should
|
172
|
+
it "should default reader to empty array" do
|
174
173
|
fleet = TrModels::Fleet.new
|
175
174
|
fleet.transports.should == []
|
176
175
|
end
|
177
176
|
|
178
|
-
should
|
177
|
+
it "should allow adding to association like it was an array" do
|
179
178
|
fleet = TrModels::Fleet.new
|
180
179
|
fleet.transports << TrModels::Car.new
|
181
180
|
fleet.transports.push TrModels::Bus.new
|
182
181
|
fleet.transports.size.should == 2
|
183
182
|
end
|
184
183
|
|
185
|
-
should
|
184
|
+
it "should be able to replace the association" do
|
186
185
|
fleet = TrModels::Fleet.new
|
187
186
|
fleet.transports = [TrModels::Car.new('license_plate' => 'DCU2013', 'model' => 'Honda Civic')]
|
188
187
|
fleet.save.should be_true
|
@@ -192,7 +191,7 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
|
|
192
191
|
fleet.transports[0].license_plate.should == 'DCU2013'
|
193
192
|
end
|
194
193
|
|
195
|
-
should
|
194
|
+
it "should store different associations" do
|
196
195
|
fleet = TrModels::Fleet.new
|
197
196
|
fleet.transports = [
|
198
197
|
TrModels::Car.new('license_plate' => 'ABC1223', 'model' => 'Honda Civic', 'year' => 2003),
|
@@ -214,7 +213,7 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
|
|
214
213
|
end
|
215
214
|
|
216
215
|
context "extending the association" do
|
217
|
-
should
|
216
|
+
it "should work using a block passed to many" do
|
218
217
|
catalog = Catalog.new
|
219
218
|
medias = catalog.medias = [
|
220
219
|
Video.new('file' => 'video.mpg', 'length' => 3600, :visible => true),
|
@@ -225,7 +224,7 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
|
|
225
224
|
catalog.medias.visible.should == [medias[0], medias[1]]
|
226
225
|
end
|
227
226
|
|
228
|
-
should
|
227
|
+
it "should work using many's :extend option" do
|
229
228
|
fleet = TrModels::Fleet.new
|
230
229
|
transports = fleet.transports = [
|
231
230
|
TrModels::Car.new('license_plate' => 'ABC1223', 'model' => 'Honda Civic', 'year' => 2003, :purchased_on => 2.years.ago.to_date),
|
@@ -1,8 +1,7 @@
|
|
1
|
-
require '
|
2
|
-
require 'models'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
describe "ManyEmbeddedProxy" do
|
4
|
+
before do
|
6
5
|
@comment_class = EDoc do
|
7
6
|
key :name, String
|
8
7
|
key :body, String
|
@@ -28,18 +27,18 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
28
27
|
@owner_class.many :pets, :class => @pet_class
|
29
28
|
end
|
30
29
|
|
31
|
-
should
|
30
|
+
it "should default reader to empty array" do
|
32
31
|
@post_class.new.comments.should == []
|
33
32
|
end
|
34
33
|
|
35
|
-
should
|
34
|
+
it "should allow adding to association like it was an array" do
|
36
35
|
post = @post_class.new
|
37
36
|
post.comments << @comment_class.new
|
38
37
|
post.comments.push @comment_class.new
|
39
38
|
post.comments.size.should == 2
|
40
39
|
end
|
41
40
|
|
42
|
-
should
|
41
|
+
it "should be embedded in document on save" do
|
43
42
|
frank = @comment_class.new(:name => 'Frank', :body => 'Hi!')
|
44
43
|
bill = @comment_class.new(:name => 'Bill', :body => 'Hi!')
|
45
44
|
post = @post_class.new
|
@@ -55,7 +54,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
55
54
|
post.comments[1].new?.should == false
|
56
55
|
end
|
57
56
|
|
58
|
-
should
|
57
|
+
it "should allow embedding arbitrarily deep" do
|
59
58
|
@klass = Doc()
|
60
59
|
@klass.key :person, @person_class
|
61
60
|
|
@@ -72,7 +71,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
72
71
|
doc.person.child.child.name.should == 'Linda'
|
73
72
|
end
|
74
73
|
|
75
|
-
should
|
74
|
+
it "should allow assignment of many embedded documents using a hash" do
|
76
75
|
person_attributes = {
|
77
76
|
'name' => 'Mr. Pet Lover',
|
78
77
|
'pets' => [
|
@@ -103,7 +102,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
103
102
|
end
|
104
103
|
|
105
104
|
context "passing documents between versions of code" do
|
106
|
-
|
105
|
+
before do
|
107
106
|
@old_klass = Doc do
|
108
107
|
set_collection_name 'generic_parents'
|
109
108
|
key :name, String
|
@@ -116,7 +115,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
116
115
|
@updated_klass.many :pets, :class => @pet_class
|
117
116
|
end
|
118
117
|
|
119
|
-
should
|
118
|
+
it "should not break many embedded proxy" do
|
120
119
|
@old_klass.collection.drop
|
121
120
|
created_by_new_code = @updated_klass.create!
|
122
121
|
created_by_new_code.pets.should == []
|
@@ -132,12 +131,12 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
132
131
|
end
|
133
132
|
|
134
133
|
context "embedding many embedded documents" do
|
135
|
-
|
134
|
+
before do
|
136
135
|
@klass = Doc()
|
137
136
|
@klass.many :people, :class => @person_class
|
138
137
|
end
|
139
138
|
|
140
|
-
should
|
139
|
+
it "should persist all embedded documents" do
|
141
140
|
meg = @person_class.new(:name => 'Meg', :pets => [
|
142
141
|
@pet_class.new(:name => 'Sparky', :species => 'Dog'),
|
143
142
|
@pet_class.new(:name => 'Koda', :species => 'Dog')
|
@@ -156,7 +155,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
156
155
|
doc.people.first.pets[1].species.should == 'Dog'
|
157
156
|
end
|
158
157
|
|
159
|
-
should
|
158
|
+
it "should create a reference to the root document for all embedded documents before save" do
|
160
159
|
doc = @klass.new
|
161
160
|
meg = @person_class.new(:name => 'Meg')
|
162
161
|
pet = @pet_class.new(:name => 'Sparky', :species => 'Dog')
|
@@ -167,7 +166,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
167
166
|
doc.people.first._root_document.should == doc
|
168
167
|
doc.people.first.pets.first._root_document.should == doc
|
169
168
|
end
|
170
|
-
should
|
169
|
+
it "should create a reference to the owning document for all embedded documents before save" do
|
171
170
|
doc = @klass.new
|
172
171
|
meg = @person_class.new(:name => 'Meg')
|
173
172
|
pet = @pet_class.new(:name => 'Sparky', :species => 'Dog')
|
@@ -179,7 +178,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
179
178
|
doc.people.first.pets.first._parent_document.should == doc.people.first
|
180
179
|
end
|
181
180
|
|
182
|
-
should
|
181
|
+
it "should create a reference to the root document for all embedded documents" do
|
183
182
|
sparky = @pet_class.new(:name => 'Sparky', :species => 'Dog')
|
184
183
|
meg = @person_class.new(:name => 'Meg', :pets => [sparky])
|
185
184
|
doc = @klass.new
|
@@ -190,7 +189,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
190
189
|
doc.people.first._root_document.should == doc
|
191
190
|
doc.people.first.pets.first._root_document.should == doc
|
192
191
|
end
|
193
|
-
should
|
192
|
+
it "should create a reference to the owning document for all embedded documents" do
|
194
193
|
doc = @klass.new
|
195
194
|
meg = @person_class.new(:name => 'Meg')
|
196
195
|
pet = @pet_class.new(:name => 'Sparky', :species => 'Dog')
|
@@ -204,7 +203,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
204
203
|
doc.people.first.pets.first._parent_document.should == doc.people.first
|
205
204
|
end
|
206
205
|
|
207
|
-
should
|
206
|
+
it "should create embedded_in relationship for embedded docs" do
|
208
207
|
doc = @klass.new
|
209
208
|
meg = @person_class.new(:name => 'Meg')
|
210
209
|
pet = @pet_class.new(:name => 'Sparky', :species => 'Dog')
|
@@ -218,7 +217,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
218
217
|
end
|
219
218
|
end
|
220
219
|
|
221
|
-
should
|
220
|
+
it "should allow finding by id" do
|
222
221
|
sparky = @pet_class.new(:name => 'Sparky', :species => 'Dog')
|
223
222
|
meg = @owner_class.create(:name => 'Meg', :pets => [sparky])
|
224
223
|
|
@@ -227,11 +226,11 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
227
226
|
end
|
228
227
|
|
229
228
|
context "count" do
|
230
|
-
should
|
229
|
+
it "should default to 0" do
|
231
230
|
@owner_class.new.pets.count.should == 0
|
232
231
|
end
|
233
232
|
|
234
|
-
should
|
233
|
+
it "should return correct count if any are embedded" do
|
235
234
|
owner = @owner_class.new(:name => 'Meg')
|
236
235
|
owner.pets = [@pet_class.new, @pet_class.new]
|
237
236
|
owner.pets.count.should == 2
|
@@ -242,7 +241,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
242
241
|
end
|
243
242
|
|
244
243
|
context "extending the association" do
|
245
|
-
|
244
|
+
before do
|
246
245
|
@address_class = EDoc do
|
247
246
|
key :address, String
|
248
247
|
key :city, String
|
@@ -255,7 +254,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
255
254
|
end
|
256
255
|
end
|
257
256
|
|
258
|
-
should
|
257
|
+
it "should work using a block passed to many" do
|
259
258
|
@project_class.many :addresses, :class => @address_class do
|
260
259
|
def find_all_by_state(state)
|
261
260
|
find_all { |a| a.state == state }
|
@@ -270,7 +269,7 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
|
|
270
269
|
project.addresses.find_all_by_state("CA").should == [addr1, addr2]
|
271
270
|
end
|
272
271
|
|
273
|
-
should
|
272
|
+
it "should work using many's :extend option" do
|
274
273
|
module FindByCity
|
275
274
|
def find_by_city(city)
|
276
275
|
find_all { |a| a.city == city }
|
@@ -1,21 +1,20 @@
|
|
1
|
-
require '
|
2
|
-
require 'models'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
describe "ManyPolymorphicProxy" do
|
4
|
+
before do
|
6
5
|
Room.collection.remove
|
7
6
|
Message.collection.remove
|
8
7
|
end
|
9
8
|
|
10
|
-
should
|
9
|
+
it "should default reader to empty array" do
|
11
10
|
Room.new.messages.should == []
|
12
11
|
end
|
13
12
|
|
14
|
-
should
|
13
|
+
it "should add type key to polymorphic class base" do
|
15
14
|
Message.keys.keys.should include('_type')
|
16
15
|
end
|
17
16
|
|
18
|
-
should
|
17
|
+
it "should allow adding to assiciation like it was an array" do
|
19
18
|
room = Room.new
|
20
19
|
room.messages << Enter.new
|
21
20
|
room.messages.push Exit.new
|
@@ -23,7 +22,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
23
22
|
room.messages.size.should == 3
|
24
23
|
end
|
25
24
|
|
26
|
-
should
|
25
|
+
it "should be able to replace the association" do
|
27
26
|
room = Room.create(:name => 'Lounge')
|
28
27
|
|
29
28
|
lambda {
|
@@ -42,7 +41,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
42
41
|
messages[2].body.should == 'John exited room'
|
43
42
|
end
|
44
43
|
|
45
|
-
should
|
44
|
+
it "should correctly store type when using <<, push and concat" do
|
46
45
|
room = Room.new
|
47
46
|
room.messages << Enter.new(:body => 'John entered the room', :position => 1)
|
48
47
|
room.messages.push Exit.new(:body => 'John entered the room', :position => 2)
|
@@ -56,19 +55,19 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
56
55
|
end
|
57
56
|
|
58
57
|
context "build" do
|
59
|
-
should
|
58
|
+
it "should assign foreign key" do
|
60
59
|
room = Room.create
|
61
60
|
message = room.messages.build
|
62
61
|
message.room_id.should == room._id
|
63
62
|
end
|
64
63
|
|
65
|
-
should
|
64
|
+
it "should assign _type" do
|
66
65
|
room = Room.create
|
67
66
|
message = room.messages.build
|
68
67
|
message._type.should == 'Message'
|
69
68
|
end
|
70
69
|
|
71
|
-
should
|
70
|
+
it "should allow assigning attributes" do
|
72
71
|
room = Room.create
|
73
72
|
message = room.messages.build(:body => 'Foo!')
|
74
73
|
message.body.should == 'Foo!'
|
@@ -76,26 +75,26 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
76
75
|
end
|
77
76
|
|
78
77
|
context "create" do
|
79
|
-
should
|
78
|
+
it "should assign foreign key" do
|
80
79
|
room = Room.create
|
81
80
|
message = room.messages.create
|
82
81
|
message.room_id.should == room._id
|
83
82
|
end
|
84
83
|
|
85
|
-
should
|
84
|
+
it "should assign _type" do
|
86
85
|
room = Room.create
|
87
86
|
message = room.messages.create
|
88
87
|
message._type.should == 'Message'
|
89
88
|
end
|
90
89
|
|
91
|
-
should
|
90
|
+
it "should save record" do
|
92
91
|
room = Room.create
|
93
92
|
lambda {
|
94
93
|
room.messages.create
|
95
94
|
}.should change { Message.count }
|
96
95
|
end
|
97
96
|
|
98
|
-
should
|
97
|
+
it "should allow passing attributes" do
|
99
98
|
room = Room.create
|
100
99
|
message = room.messages.create(:body => 'Foo!')
|
101
100
|
message.body.should == 'Foo!'
|
@@ -103,7 +102,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
103
102
|
end
|
104
103
|
|
105
104
|
context "count" do
|
106
|
-
should
|
105
|
+
it "should work scoped to association" do
|
107
106
|
room = Room.create
|
108
107
|
3.times { room.messages.create }
|
109
108
|
|
@@ -114,7 +113,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
114
113
|
other_room.messages.count.should == 2
|
115
114
|
end
|
116
115
|
|
117
|
-
should
|
116
|
+
it "should work with conditions" do
|
118
117
|
room = Room.create
|
119
118
|
room.messages.create(:body => 'Foo')
|
120
119
|
room.messages.create(:body => 'Other 1')
|
@@ -125,7 +124,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
125
124
|
end
|
126
125
|
|
127
126
|
context "Finding scoped to association" do
|
128
|
-
|
127
|
+
before do
|
129
128
|
@lounge = Room.create(:name => 'Lounge')
|
130
129
|
@lm1 = Message.create(:body => 'Loungin!', :position => 1)
|
131
130
|
@lm2 = Message.create(:body => 'I love loungin!', :position => 2)
|
@@ -142,24 +141,24 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
142
141
|
end
|
143
142
|
|
144
143
|
context "dynamic finders" do
|
145
|
-
should
|
144
|
+
it "should work with single key" do
|
146
145
|
@lounge.messages.find_by_position(1).should == @lm1
|
147
146
|
@hall.messages.find_by_position(2).should == @hm2
|
148
147
|
end
|
149
148
|
|
150
|
-
should
|
149
|
+
it "should work with multiple keys" do
|
151
150
|
@lounge.messages.find_by_body_and_position('Loungin!', 1).should == @lm1
|
152
151
|
@lounge.messages.find_by_body_and_position('Loungin!', 2).should be_nil
|
153
152
|
end
|
154
153
|
|
155
|
-
should
|
154
|
+
it "should raise error when using !" do
|
156
155
|
lambda {
|
157
156
|
@lounge.messages.find_by_position!(222)
|
158
157
|
}.should raise_error(MongoMapper::DocumentNotFound)
|
159
158
|
end
|
160
159
|
|
161
160
|
context "find_or_create_by" do
|
162
|
-
should
|
161
|
+
it "should not create document if found" do
|
163
162
|
lambda {
|
164
163
|
message = @lounge.messages.find_or_create_by_body('Loungin!')
|
165
164
|
message.room.should == @lounge
|
@@ -167,7 +166,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
167
166
|
}.should_not change { Message.count }
|
168
167
|
end
|
169
168
|
|
170
|
-
should
|
169
|
+
it "should create document if not found" do
|
171
170
|
lambda {
|
172
171
|
message = @lounge.messages.find_or_create_by_body('Yo dawg!')
|
173
172
|
message.room.should == @lounge
|
@@ -178,49 +177,49 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
178
177
|
end
|
179
178
|
|
180
179
|
context "with #all" do
|
181
|
-
should
|
180
|
+
it "should work" do
|
182
181
|
@lounge.messages.all(:order => "position").should == [@lm1, @lm2]
|
183
182
|
end
|
184
183
|
|
185
|
-
should
|
184
|
+
it "should work with conditions" do
|
186
185
|
messages = @lounge.messages.all(:body => 'Loungin!', :order => "position")
|
187
186
|
messages.should == [@lm1]
|
188
187
|
end
|
189
188
|
|
190
|
-
should
|
189
|
+
it "should work with order" do
|
191
190
|
messages = @lounge.messages.all(:order => 'position desc')
|
192
191
|
messages.should == [@lm2, @lm1]
|
193
192
|
end
|
194
193
|
end
|
195
194
|
|
196
195
|
context "with #first" do
|
197
|
-
should
|
196
|
+
it "should work" do
|
198
197
|
@lounge.messages.first(:order => "position asc").should == @lm1
|
199
198
|
end
|
200
199
|
|
201
|
-
should
|
200
|
+
it "should work with conditions" do
|
202
201
|
message = @lounge.messages.first(:body => 'I love loungin!', :order => "position asc")
|
203
202
|
message.should == @lm2
|
204
203
|
end
|
205
204
|
end
|
206
205
|
|
207
206
|
context "with #last" do
|
208
|
-
should
|
207
|
+
it "should work" do
|
209
208
|
@lounge.messages.last(:order => "position asc").should == @lm2
|
210
209
|
end
|
211
210
|
|
212
|
-
should
|
211
|
+
it "should work with conditions" do
|
213
212
|
message = @lounge.messages.last(:body => 'Loungin!', :order => "position asc")
|
214
213
|
message.should == @lm1
|
215
214
|
end
|
216
215
|
end
|
217
216
|
|
218
217
|
context "with one id" do
|
219
|
-
should
|
218
|
+
it "should work for id in association" do
|
220
219
|
@lounge.messages.find(@lm2._id).should == @lm2
|
221
220
|
end
|
222
221
|
|
223
|
-
should
|
222
|
+
it "should not work for id not in association" do
|
224
223
|
lambda {
|
225
224
|
@lounge.messages.find!(@hm2._id)
|
226
225
|
}.should raise_error(MongoMapper::DocumentNotFound)
|
@@ -228,53 +227,53 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
228
227
|
end
|
229
228
|
|
230
229
|
context "with query options/criteria" do
|
231
|
-
should
|
230
|
+
it "should work with order on association" do
|
232
231
|
@lounge.messages.should == [@lm1, @lm2]
|
233
232
|
end
|
234
233
|
|
235
|
-
should
|
234
|
+
it "should allow overriding the order provided to the association" do
|
236
235
|
@lounge.messages.all(:order => 'position').should == [@lm1, @lm2]
|
237
236
|
end
|
238
237
|
|
239
|
-
should
|
238
|
+
it "should allow using conditions on association" do
|
240
239
|
@hall.latest_messages.should == [@hm3, @hm2]
|
241
240
|
end
|
242
241
|
end
|
243
242
|
|
244
243
|
context "with multiple ids" do
|
245
|
-
should
|
244
|
+
it "should work for ids in association" do
|
246
245
|
messages = @lounge.messages.find(@lm1._id, @lm2._id)
|
247
246
|
messages.should == [@lm1, @lm2]
|
248
247
|
end
|
249
248
|
|
250
|
-
should
|
251
|
-
|
249
|
+
it "should not work for ids not in association" do
|
250
|
+
expect {
|
252
251
|
@lounge.messages.find!(@lm1._id, @lm2._id, @hm2._id)
|
253
|
-
|
252
|
+
}.to raise_error(MongoMapper::DocumentNotFound)
|
254
253
|
end
|
255
254
|
end
|
256
255
|
|
257
256
|
context "with #paginate" do
|
258
|
-
|
257
|
+
before do
|
259
258
|
@messages = @hall.messages.paginate(:per_page => 2, :page => 1, :order => 'position asc')
|
260
259
|
end
|
261
260
|
|
262
|
-
should
|
261
|
+
it "should return total pages" do
|
263
262
|
@messages.total_pages.should == 2
|
264
263
|
end
|
265
264
|
|
266
|
-
should
|
265
|
+
it "should return total entries" do
|
267
266
|
@messages.total_entries.should == 3
|
268
267
|
end
|
269
268
|
|
270
|
-
should
|
269
|
+
it "should return the subject" do
|
271
270
|
@messages.should == [@hm1, @hm2]
|
272
271
|
end
|
273
272
|
end
|
274
273
|
end
|
275
274
|
|
276
275
|
context "extending the association" do
|
277
|
-
should
|
276
|
+
it "should work using a block passed to many" do
|
278
277
|
room = Room.new(:name => "Amazing Room")
|
279
278
|
messages = room.messages = [
|
280
279
|
Enter.new(:body => 'John entered room', :position => 3),
|
@@ -288,7 +287,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
288
287
|
room.messages.older.should == messages[3..5]
|
289
288
|
end
|
290
289
|
|
291
|
-
should
|
290
|
+
it "should work using many's :extend option" do
|
292
291
|
|
293
292
|
room = Room.new(:name => "Amazing Room")
|
294
293
|
accounts = room.accounts = [
|