mongo_mapper-unstable 2010.1.6 → 2010.1.12
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/VERSION +1 -1
- data/lib/mongo_mapper/descendant_appends.rb +44 -0
- data/lib/mongo_mapper/document.rb +54 -98
- data/lib/mongo_mapper/embedded_document.rb +28 -348
- data/lib/mongo_mapper/finder_options.rb +15 -33
- data/lib/mongo_mapper/plugins/associations/base.rb +121 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +28 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +23 -0
- data/lib/mongo_mapper/plugins/associations/collection.rb +21 -0
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +49 -0
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +139 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +28 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +117 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +31 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +23 -0
- data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +13 -0
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +66 -0
- data/lib/mongo_mapper/plugins/associations/proxy.rb +118 -0
- data/lib/mongo_mapper/plugins/associations.rb +104 -0
- data/lib/mongo_mapper/plugins/callbacks.rb +65 -0
- data/lib/mongo_mapper/plugins/clone.rb +13 -0
- data/lib/mongo_mapper/plugins/descendants.rb +16 -0
- data/lib/mongo_mapper/plugins/dirty.rb +119 -0
- data/lib/mongo_mapper/plugins/equality.rb +11 -0
- data/lib/mongo_mapper/plugins/identity_map.rb +66 -0
- data/lib/mongo_mapper/plugins/inspect.rb +14 -0
- data/lib/mongo_mapper/plugins/keys.rb +295 -0
- data/lib/mongo_mapper/plugins/logger.rb +17 -0
- data/lib/mongo_mapper/plugins/pagination.rb +85 -0
- data/lib/mongo_mapper/plugins/rails.rb +45 -0
- data/lib/mongo_mapper/plugins/serialization.rb +109 -0
- data/lib/mongo_mapper/plugins/validations.rb +48 -0
- data/lib/mongo_mapper/plugins.rb +19 -0
- data/lib/mongo_mapper/support.rb +36 -15
- data/lib/mongo_mapper.rb +23 -22
- data/performance/read_write.rb +52 -0
- data/specs.watchr +23 -2
- data/test/functional/associations/test_belongs_to_proxy.rb +1 -1
- data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +58 -39
- data/test/functional/associations/test_many_embedded_proxy.rb +103 -69
- data/test/functional/test_dirty.rb +1 -1
- data/test/functional/test_document.rb +25 -25
- data/test/functional/test_embedded_document.rb +66 -63
- data/test/functional/test_identity_map.rb +233 -0
- data/test/functional/test_modifiers.rb +14 -0
- data/test/functional/test_string_id_compatibility.rb +4 -4
- data/test/functional/test_validations.rb +13 -0
- data/test/models.rb +0 -39
- data/test/test_helper.rb +8 -2
- data/test/unit/associations/test_base.rb +1 -1
- data/test/unit/associations/test_proxy.rb +3 -3
- data/test/unit/test_descendant_appends.rb +71 -0
- data/test/unit/test_document.rb +35 -46
- data/test/unit/test_embedded_document.rb +218 -271
- data/test/unit/{test_key.rb → test_keys.rb} +0 -0
- data/test/unit/test_pagination.rb +10 -2
- data/test/unit/test_plugins.rb +42 -0
- data/test/unit/test_rails.rb +123 -0
- data/test/unit/{test_serializations.rb → test_serialization.rb} +0 -0
- data/test/unit/test_support.rb +10 -6
- data/test/unit/test_time_zones.rb +2 -2
- metadata +44 -31
- data/lib/mongo_mapper/associations/base.rb +0 -119
- data/lib/mongo_mapper/associations/belongs_to_polymorphic_proxy.rb +0 -26
- data/lib/mongo_mapper/associations/belongs_to_proxy.rb +0 -21
- data/lib/mongo_mapper/associations/collection.rb +0 -19
- data/lib/mongo_mapper/associations/in_array_proxy.rb +0 -137
- data/lib/mongo_mapper/associations/many_documents_as_proxy.rb +0 -26
- data/lib/mongo_mapper/associations/many_documents_proxy.rb +0 -115
- data/lib/mongo_mapper/associations/many_embedded_polymorphic_proxy.rb +0 -31
- data/lib/mongo_mapper/associations/many_embedded_proxy.rb +0 -54
- data/lib/mongo_mapper/associations/many_polymorphic_proxy.rb +0 -11
- data/lib/mongo_mapper/associations/one_proxy.rb +0 -64
- data/lib/mongo_mapper/associations/proxy.rb +0 -116
- data/lib/mongo_mapper/associations.rb +0 -78
- data/lib/mongo_mapper/callbacks.rb +0 -61
- data/lib/mongo_mapper/dirty.rb +0 -117
- data/lib/mongo_mapper/key.rb +0 -36
- data/lib/mongo_mapper/mongo_mapper.rb +0 -125
- data/lib/mongo_mapper/pagination.rb +0 -66
- data/lib/mongo_mapper/rails_compatibility/document.rb +0 -15
- data/lib/mongo_mapper/rails_compatibility/embedded_document.rb +0 -28
- data/lib/mongo_mapper/serialization.rb +0 -54
- data/lib/mongo_mapper/serializers/json_serializer.rb +0 -48
- data/lib/mongo_mapper/validations.rb +0 -39
- data/test/functional/test_rails_compatibility.rb +0 -25
@@ -17,7 +17,7 @@ end
|
|
17
17
|
|
18
18
|
module KeyOverride
|
19
19
|
def other_child
|
20
|
-
|
20
|
+
self[:other_child] || "special result"
|
21
21
|
end
|
22
22
|
|
23
23
|
def other_child=(value)
|
@@ -32,17 +32,12 @@ class OtherChild < Parent
|
|
32
32
|
key :other_child, String
|
33
33
|
end
|
34
34
|
|
35
|
-
class EmbeddedDocumentTest < Test::Unit::TestCase
|
35
|
+
class EmbeddedDocumentTest < Test::Unit::TestCase
|
36
36
|
context "Including MongoMapper::EmbeddedDocument in a class" do
|
37
37
|
setup do
|
38
38
|
@klass = EDoc()
|
39
39
|
end
|
40
40
|
|
41
|
-
should "give class access to logger" do
|
42
|
-
@klass.logger.should == MongoMapper.logger
|
43
|
-
@klass.logger.should be_instance_of(Logger)
|
44
|
-
end
|
45
|
-
|
46
41
|
should "add _id key" do
|
47
42
|
@klass.keys['_id'].should_not be_nil
|
48
43
|
end
|
@@ -55,8 +50,22 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
55
50
|
@klass.key :_id, String
|
56
51
|
@klass.using_object_id?.should be_false
|
57
52
|
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "Class Methods" do
|
56
|
+
should "include logger" do
|
57
|
+
@klass = EDoc()
|
58
|
+
@klass.logger.should == MongoMapper.logger
|
59
|
+
@klass.logger.should be_instance_of(Logger)
|
60
|
+
end
|
61
|
+
|
62
|
+
should "return false for embeddable" do
|
63
|
+
EDoc().embeddable?.should be_true
|
64
|
+
end
|
58
65
|
|
59
66
|
context "#to_mongo" do
|
67
|
+
setup { @klass = EDoc() }
|
68
|
+
|
60
69
|
should "be nil if nil" do
|
61
70
|
@klass.to_mongo(nil).should be_nil
|
62
71
|
end
|
@@ -70,6 +79,8 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
70
79
|
end
|
71
80
|
|
72
81
|
context "#from_mongo" do
|
82
|
+
setup { @klass = EDoc() }
|
83
|
+
|
73
84
|
should "be nil if nil" do
|
74
85
|
@klass.from_mongo(nil).should be_nil
|
75
86
|
end
|
@@ -85,195 +96,110 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
85
96
|
doc.foo.should == 'bar'
|
86
97
|
end
|
87
98
|
end
|
88
|
-
end
|
89
|
-
|
90
|
-
context "parent_model" do
|
91
|
-
should "be nil if none of parents ancestors include EmbeddedDocument" do
|
92
|
-
parent = Class.new
|
93
|
-
document = Class.new(parent) { include MongoMapper::EmbeddedDocument }
|
94
|
-
document.parent_model.should be_nil
|
95
|
-
end
|
96
99
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
example_module = Module.new
|
102
|
-
document = Class.new(parent) do
|
103
|
-
include MongoMapper::EmbeddedDocument
|
104
|
-
include example_module
|
100
|
+
context "defining a key" do
|
101
|
+
setup do
|
102
|
+
@document = EDoc()
|
105
103
|
end
|
106
|
-
|
107
|
-
document.parent_model.should == parent
|
108
|
-
end
|
109
|
-
|
110
|
-
should "find parent" do
|
111
|
-
Parent.parent_model.should == Grandparent
|
112
|
-
Child.parent_model.should == Parent
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
context "defining a key" do
|
117
|
-
setup do
|
118
|
-
@document = EDoc()
|
119
|
-
end
|
120
|
-
|
121
|
-
should "work with name" do
|
122
|
-
key = @document.key(:name)
|
123
|
-
key.name.should == 'name'
|
124
|
-
end
|
125
|
-
|
126
|
-
should "work with name and type" do
|
127
|
-
key = @document.key(:name, String)
|
128
|
-
key.name.should == 'name'
|
129
|
-
key.type.should == String
|
130
|
-
end
|
131
|
-
|
132
|
-
should "work with name, type and options" do
|
133
|
-
key = @document.key(:name, String, :required => true)
|
134
|
-
key.name.should == 'name'
|
135
|
-
key.type.should == String
|
136
|
-
key.options[:required].should be_true
|
137
|
-
end
|
138
|
-
|
139
|
-
should "work with name and options" do
|
140
|
-
key = @document.key(:name, :required => true)
|
141
|
-
key.name.should == 'name'
|
142
|
-
key.options[:required].should be_true
|
143
|
-
end
|
144
|
-
|
145
|
-
should "be tracked per document" do
|
146
|
-
@document.key(:name, String)
|
147
|
-
@document.key(:age, Integer)
|
148
|
-
@document.keys['name'].name.should == 'name'
|
149
|
-
@document.keys['name'].type.should == String
|
150
|
-
@document.keys['age'].name.should == 'age'
|
151
|
-
@document.keys['age'].type.should == Integer
|
152
|
-
end
|
153
|
-
|
154
|
-
should "be redefinable" do
|
155
|
-
@document.key(:foo, String)
|
156
|
-
@document.keys['foo'].type.should == String
|
157
|
-
@document.key(:foo, Integer)
|
158
|
-
@document.keys['foo'].type.should == Integer
|
159
|
-
end
|
160
|
-
|
161
|
-
should "create reader method" do
|
162
|
-
@document.new.should_not respond_to(:foo)
|
163
|
-
@document.key(:foo, String)
|
164
|
-
@document.new.should respond_to(:foo)
|
165
|
-
end
|
166
|
-
|
167
|
-
should "create reader before typecast method" do
|
168
|
-
@document.new.should_not respond_to(:foo_before_typecast)
|
169
|
-
@document.key(:foo, String)
|
170
|
-
@document.new.should respond_to(:foo_before_typecast)
|
171
|
-
end
|
172
|
-
|
173
|
-
should "create writer method" do
|
174
|
-
@document.new.should_not respond_to(:foo=)
|
175
|
-
@document.key(:foo, String)
|
176
|
-
@document.new.should respond_to(:foo=)
|
177
|
-
end
|
178
|
-
|
179
|
-
should "create boolean method" do
|
180
|
-
@document.new.should_not respond_to(:foo?)
|
181
|
-
@document.key(:foo, String)
|
182
|
-
@document.new.should respond_to(:foo?)
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
context "keys" do
|
187
|
-
should "be inherited" do
|
188
|
-
Grandparent.keys.keys.sort.should == ['_id', 'grandparent']
|
189
|
-
Parent.keys.keys.sort.should == ['_id', 'grandparent', 'parent']
|
190
|
-
Child.keys.keys.sort.should == ['_id', 'child', 'grandparent', 'parent']
|
191
|
-
end
|
192
|
-
|
193
|
-
should "propogate to subclasses if key added after class definition" do
|
194
|
-
Grandparent.key :_type, String
|
195
|
-
|
196
|
-
Grandparent.keys.keys.sort.should == ['_id', '_type', 'grandparent']
|
197
|
-
Parent.keys.keys.sort.should == ['_id', '_type', 'grandparent', 'parent']
|
198
|
-
Child.keys.keys.sort.should == ['_id', '_type', 'child', 'grandparent', 'parent']
|
199
|
-
end
|
200
104
|
|
201
|
-
|
202
|
-
|
203
|
-
|
105
|
+
should "work with name" do
|
106
|
+
key = @document.key(:name)
|
107
|
+
key.name.should == 'name'
|
108
|
+
end
|
204
109
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
110
|
+
should "work with name and type" do
|
111
|
+
key = @document.key(:name, String)
|
112
|
+
key.name.should == 'name'
|
113
|
+
key.type.should == String
|
114
|
+
end
|
209
115
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
key
|
116
|
+
should "work with name, type and options" do
|
117
|
+
key = @document.key(:name, String, :required => true)
|
118
|
+
key.name.should == 'name'
|
119
|
+
key.type.should == String
|
120
|
+
key.options[:required].should be_true
|
214
121
|
end
|
215
|
-
end
|
216
122
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
key
|
242
|
-
|
243
|
-
|
244
|
-
|
123
|
+
should "work with name and options" do
|
124
|
+
key = @document.key(:name, :required => true)
|
125
|
+
key.name.should == 'name'
|
126
|
+
key.options[:required].should be_true
|
127
|
+
end
|
128
|
+
|
129
|
+
should "be tracked per document" do
|
130
|
+
@document.key(:name, String)
|
131
|
+
@document.key(:age, Integer)
|
132
|
+
@document.keys['name'].name.should == 'name'
|
133
|
+
@document.keys['name'].type.should == String
|
134
|
+
@document.keys['age'].name.should == 'age'
|
135
|
+
@document.keys['age'].type.should == Integer
|
136
|
+
end
|
137
|
+
|
138
|
+
should "be redefinable" do
|
139
|
+
@document.key(:foo, String)
|
140
|
+
@document.keys['foo'].type.should == String
|
141
|
+
@document.key(:foo, Integer)
|
142
|
+
@document.keys['foo'].type.should == Integer
|
143
|
+
end
|
144
|
+
|
145
|
+
should "create reader method" do
|
146
|
+
@document.new.should_not respond_to(:foo)
|
147
|
+
@document.key(:foo, String)
|
148
|
+
@document.new.should respond_to(:foo)
|
149
|
+
end
|
150
|
+
|
151
|
+
should "create reader before typecast method" do
|
152
|
+
@document.new.should_not respond_to(:foo_before_typecast)
|
153
|
+
@document.key(:foo, String)
|
154
|
+
@document.new.should respond_to(:foo_before_typecast)
|
155
|
+
end
|
156
|
+
|
157
|
+
should "create writer method" do
|
158
|
+
@document.new.should_not respond_to(:foo=)
|
159
|
+
@document.key(:foo, String)
|
160
|
+
@document.new.should respond_to(:foo=)
|
161
|
+
end
|
162
|
+
|
163
|
+
should "create boolean method" do
|
164
|
+
@document.new.should_not respond_to(:foo?)
|
165
|
+
@document.key(:foo, String)
|
166
|
+
@document.new.should respond_to(:foo?)
|
245
167
|
end
|
246
|
-
|
247
|
-
@doc = @document.new
|
248
|
-
end
|
249
|
-
|
250
|
-
should "work for strings" do
|
251
|
-
@doc.name.should == 'foo'
|
252
|
-
end
|
253
|
-
|
254
|
-
should "work for integers" do
|
255
|
-
@doc.age.should == 20
|
256
|
-
end
|
257
|
-
|
258
|
-
should "work for floats" do
|
259
|
-
@doc.net_worth.should == 100.00
|
260
|
-
end
|
261
|
-
|
262
|
-
should "work for booleans" do
|
263
|
-
@doc.active.should == true
|
264
|
-
@doc.smart.should == false
|
265
168
|
end
|
266
169
|
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
170
|
+
context "keys" do
|
171
|
+
should "be inherited" do
|
172
|
+
Grandparent.keys.keys.sort.should == ['_id', 'grandparent']
|
173
|
+
Parent.keys.keys.sort.should == ['_id', 'grandparent', 'parent']
|
174
|
+
Child.keys.keys.sort.should == ['_id', 'child', 'grandparent', 'parent']
|
175
|
+
end
|
176
|
+
|
177
|
+
should "propogate to descendants if key added after class definition" do
|
178
|
+
Grandparent.key :_type, String
|
179
|
+
|
180
|
+
Grandparent.keys.keys.sort.should == ['_id', '_type', 'grandparent']
|
181
|
+
Parent.keys.keys.sort.should == ['_id', '_type', 'grandparent', 'parent']
|
182
|
+
Child.keys.keys.sort.should == ['_id', '_type', 'child', 'grandparent', 'parent']
|
183
|
+
end
|
184
|
+
|
185
|
+
should "not add anonymous objects to the ancestor tree" do
|
186
|
+
OtherChild.ancestors.any? { |a| a.name.blank? }.should be_false
|
187
|
+
end
|
188
|
+
|
189
|
+
should "not include descendant keys" do
|
190
|
+
lambda { Parent.new.other_child }.should raise_error
|
191
|
+
end
|
271
192
|
end
|
272
193
|
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
194
|
+
context "descendants" do
|
195
|
+
should "default to nil" do
|
196
|
+
Child.descendants.should be_nil
|
197
|
+
end
|
198
|
+
|
199
|
+
should "be recorded" do
|
200
|
+
Grandparent.descendants.should == [Parent]
|
201
|
+
Parent.descendants.should == [Child, OtherChild]
|
202
|
+
end
|
277
203
|
end
|
278
204
|
end
|
279
205
|
|
@@ -301,47 +227,47 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
301
227
|
@document.keys.keys.should include('_id')
|
302
228
|
end
|
303
229
|
|
230
|
+
should "create id during initialization" do
|
231
|
+
@document.new._id.should be_instance_of(Mongo::ObjectID)
|
232
|
+
end
|
233
|
+
|
304
234
|
should "have id method returns _id" do
|
305
235
|
id = Mongo::ObjectID.new
|
306
236
|
doc = @document.new(:_id => id)
|
307
237
|
doc.id.should == id
|
308
238
|
end
|
309
239
|
|
310
|
-
|
311
|
-
|
312
|
-
doc = @document.new
|
313
|
-
doc.using_custom_id?.should be_false
|
314
|
-
doc.id = Mongo::ObjectID.new
|
315
|
-
doc.using_custom_id?.should be_false
|
316
|
-
end
|
240
|
+
should "convert string object id to mongo object id when assigning id with _id object id type" do
|
241
|
+
id = Mongo::ObjectID.new
|
317
242
|
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
243
|
+
doc = @document.new(:id => id.to_s)
|
244
|
+
doc._id.should == id
|
245
|
+
doc.id.should == id
|
246
|
+
|
247
|
+
doc = @document.new(:_id => id.to_s)
|
248
|
+
doc._id.should == id
|
249
|
+
doc.id.should == id
|
325
250
|
end
|
326
251
|
|
327
|
-
context "
|
328
|
-
should "
|
329
|
-
@document.
|
330
|
-
doc = @document.new(:id => '1234')
|
331
|
-
doc._id.should == '1234'
|
252
|
+
context "_root_document" do
|
253
|
+
should "default to nil" do
|
254
|
+
@document.new._root_document.should be_nil
|
332
255
|
end
|
333
|
-
|
334
|
-
should "
|
335
|
-
|
336
|
-
doc
|
337
|
-
|
338
|
-
doc.
|
339
|
-
doc.using_custom_id?.should be_true
|
256
|
+
|
257
|
+
should "allow setting when initialized" do
|
258
|
+
root = Doc().new
|
259
|
+
doc = @document.new :_root_document => root
|
260
|
+
|
261
|
+
doc._root_document.should be(root)
|
340
262
|
end
|
341
|
-
end
|
342
263
|
|
343
|
-
|
344
|
-
|
264
|
+
should "also be set on many embedded documents" do
|
265
|
+
root = Doc().new
|
266
|
+
klass = EDoc { many :children }
|
267
|
+
doc = klass.new(:_root_document => root, :children => [{}])
|
268
|
+
|
269
|
+
doc.children.first._root_document.should == root
|
270
|
+
end
|
345
271
|
end
|
346
272
|
|
347
273
|
context "being initialized" do
|
@@ -358,43 +284,26 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
358
284
|
doc.skills.should == ['ruby', 'rails']
|
359
285
|
end
|
360
286
|
|
361
|
-
should "set the root on embedded documents" do
|
362
|
-
document = Class.new(@document) do
|
363
|
-
many :children
|
364
|
-
end
|
365
|
-
|
366
|
-
doc = document.new :_root_document => 'document', 'children' => [{}]
|
367
|
-
doc.children.first._root_document.should == 'document'
|
368
|
-
end
|
369
|
-
|
370
287
|
should "not throw error if initialized with nil" do
|
371
|
-
|
372
|
-
@document.new(nil)
|
373
|
-
}.should_not raise_error
|
288
|
+
assert_nothing_raised { @document.new(nil) }
|
374
289
|
end
|
375
290
|
end
|
376
291
|
|
377
292
|
context "initialized when _type key present" do
|
378
293
|
setup do
|
379
|
-
|
380
|
-
key :_type, String
|
381
|
-
end
|
382
|
-
end
|
383
|
-
|
384
|
-
teardown do
|
385
|
-
Object.send(:remove_const, :FooBar)
|
294
|
+
@klass = EDoc('FooBar') { key :_type, String }
|
386
295
|
end
|
387
296
|
|
388
297
|
should "set _type to class name" do
|
389
|
-
|
298
|
+
@klass.new._type.should == 'FooBar'
|
390
299
|
end
|
391
300
|
|
392
301
|
should "not change _type if already set" do
|
393
|
-
|
302
|
+
@klass.new(:_type => 'Foo')._type.should == 'Foo'
|
394
303
|
end
|
395
304
|
end
|
396
305
|
|
397
|
-
context "
|
306
|
+
context "attributes=" do
|
398
307
|
should "update values for keys provided" do
|
399
308
|
doc = @document.new(:name => 'foobar', :age => 10)
|
400
309
|
doc.attributes = {:name => 'new value', :age => 5}
|
@@ -409,7 +318,7 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
409
318
|
doc.attributes[:age].should == 10
|
410
319
|
end
|
411
320
|
|
412
|
-
should "
|
321
|
+
should "work with pre-defined methods" do
|
413
322
|
@document.class_eval do
|
414
323
|
attr_writer :password
|
415
324
|
|
@@ -441,29 +350,27 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
441
350
|
doc.attributes.values.should include('string')
|
442
351
|
doc.attributes.values.should include(nil)
|
443
352
|
end
|
353
|
+
|
354
|
+
should "have indifferent access" do
|
355
|
+
doc = @document.new(:name => 'string')
|
356
|
+
doc.attributes[:name].should == 'string'
|
357
|
+
doc.attributes['name'].should == 'string'
|
358
|
+
end
|
444
359
|
end
|
445
360
|
|
446
361
|
context "to_mongo" do
|
447
362
|
should "default to hash with _id key" do
|
448
363
|
doc = @document.new
|
449
|
-
doc.to_mongo.keys.should == ['_id']
|
364
|
+
doc.to_mongo.keys.sort.should == ['_id', 'age', 'name']
|
450
365
|
end
|
451
366
|
|
452
|
-
should "return all keys
|
367
|
+
should "return all keys" do
|
453
368
|
doc = @document.new(:name => 'string', :age => nil)
|
454
|
-
doc.to_mongo.keys.sort.should == ['_id', 'name']
|
369
|
+
doc.to_mongo.keys.sort.should == ['_id', 'age', 'name']
|
455
370
|
doc.to_mongo.values.should include('string')
|
456
|
-
doc.to_mongo.values.
|
371
|
+
doc.to_mongo.values.should include(nil)
|
457
372
|
end
|
458
373
|
end
|
459
|
-
|
460
|
-
should "convert dates into times" do
|
461
|
-
document = Class.new(@document) do
|
462
|
-
key :start_date, Date
|
463
|
-
end
|
464
|
-
doc = document.new :start_date => "12/05/2009"
|
465
|
-
doc.start_date.should == Date.new(2009, 12, 05)
|
466
|
-
end
|
467
374
|
|
468
375
|
context "clone" do
|
469
376
|
should "regenerate the id" do
|
@@ -491,9 +398,7 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
491
398
|
|
492
399
|
should "raise exception when key not found" do
|
493
400
|
doc = @document.new(:name => 'string')
|
494
|
-
|
495
|
-
doc[:not_here]
|
496
|
-
}.should raise_error(MongoMapper::KeyNotFound)
|
401
|
+
assert_raises(MongoMapper::KeyNotFound) { doc[:not_here] }
|
497
402
|
end
|
498
403
|
end
|
499
404
|
|
@@ -507,27 +412,19 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
507
412
|
should "create key and write value for missing key" do
|
508
413
|
doc = @document.new
|
509
414
|
doc[:foo] = 'string'
|
510
|
-
doc.
|
415
|
+
doc.class.keys.include?('foo').should be_true
|
511
416
|
doc[:foo].should == 'string'
|
512
417
|
end
|
513
418
|
|
514
|
-
should "
|
419
|
+
should "share the new key with the class" do
|
515
420
|
doc = @document.new
|
516
421
|
doc[:foo] = 'string'
|
517
|
-
@document.keys.
|
422
|
+
@document.keys.should include('foo')
|
518
423
|
end
|
519
424
|
end
|
520
425
|
end
|
521
|
-
|
522
|
-
context "indifferent access" do
|
523
|
-
should "be enabled for keys" do
|
524
|
-
doc = @document.new(:name => 'string')
|
525
|
-
doc.attributes[:name].should == 'string'
|
526
|
-
doc.attributes['name'].should == 'string'
|
527
|
-
end
|
528
|
-
end
|
529
426
|
|
530
|
-
context "reading
|
427
|
+
context "reading a key" do
|
531
428
|
should "work for defined keys" do
|
532
429
|
doc = @document.new(:name => 'string')
|
533
430
|
doc.name.should == 'string'
|
@@ -541,7 +438,7 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
541
438
|
should "be accessible for use in the model" do
|
542
439
|
@document.class_eval do
|
543
440
|
def name_and_age
|
544
|
-
"#{
|
441
|
+
"#{self[:name]} (#{self[:age]})"
|
545
442
|
end
|
546
443
|
end
|
547
444
|
|
@@ -572,7 +469,7 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
572
469
|
end
|
573
470
|
end
|
574
471
|
|
575
|
-
context "reading
|
472
|
+
context "reading a key before typcasting" do
|
576
473
|
should "work for defined keys" do
|
577
474
|
doc = @document.new(:name => 12)
|
578
475
|
doc.name_before_typecast.should == 12
|
@@ -586,7 +483,7 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
586
483
|
should "be accessible for use in a document" do
|
587
484
|
@document.class_eval do
|
588
485
|
def untypcasted_name
|
589
|
-
|
486
|
+
read_key_before_typecast(:name)
|
590
487
|
end
|
591
488
|
end
|
592
489
|
|
@@ -596,7 +493,7 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
596
493
|
end
|
597
494
|
end
|
598
495
|
|
599
|
-
context "writing
|
496
|
+
context "writing a key" do
|
600
497
|
should "work for defined keys" do
|
601
498
|
doc = @document.new
|
602
499
|
doc.name = 'John'
|
@@ -620,8 +517,8 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
620
517
|
@document.class_eval do
|
621
518
|
def name_and_age=(new_value)
|
622
519
|
new_value.match(/([^\(\s]+) \((.*)\)/)
|
623
|
-
|
624
|
-
|
520
|
+
write_key :name, $1
|
521
|
+
write_key :age, $2
|
625
522
|
end
|
626
523
|
end
|
627
524
|
|
@@ -644,9 +541,9 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
644
541
|
overriden_child = @document.new(:other_child => 'foo')
|
645
542
|
overriden_child.other_child.should == 'foo modified'
|
646
543
|
end
|
647
|
-
end # writing
|
544
|
+
end # writing a key
|
648
545
|
|
649
|
-
context "checking if
|
546
|
+
context "checking if a keys value is present" do
|
650
547
|
should "work for defined keys" do
|
651
548
|
doc = @document.new
|
652
549
|
doc.name?.should be_false
|
@@ -660,6 +557,11 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
660
557
|
end
|
661
558
|
end
|
662
559
|
|
560
|
+
should "call inspect on the document's attributes instead of to_s when inspecting the document" do
|
561
|
+
doc = @document.new(:animals => %w(dog cat))
|
562
|
+
doc.inspect.should include(%(animals: ["dog", "cat"]))
|
563
|
+
end
|
564
|
+
|
663
565
|
context "equality" do
|
664
566
|
setup do
|
665
567
|
@oid = Mongo::ObjectID.new
|
@@ -677,5 +579,50 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
677
579
|
(@document.new('_id' => @oid) == another_document.new('_id' => @oid)).should be_false
|
678
580
|
end
|
679
581
|
end
|
582
|
+
|
583
|
+
context "reading keys with default values" do
|
584
|
+
setup do
|
585
|
+
@document = EDoc do
|
586
|
+
key :name, String, :default => 'foo'
|
587
|
+
key :age, Integer, :default => 20
|
588
|
+
key :net_worth, Float, :default => 100.00
|
589
|
+
key :active, Boolean, :default => true
|
590
|
+
key :smart, Boolean, :default => false
|
591
|
+
key :skills, Array, :default => [1]
|
592
|
+
key :options, Hash, :default => {'foo' => 'bar'}
|
593
|
+
end
|
594
|
+
|
595
|
+
@doc = @document.new
|
596
|
+
end
|
597
|
+
|
598
|
+
should "work for strings" do
|
599
|
+
@doc.name.should == 'foo'
|
600
|
+
end
|
601
|
+
|
602
|
+
should "work for integers" do
|
603
|
+
@doc.age.should == 20
|
604
|
+
end
|
605
|
+
|
606
|
+
should "work for floats" do
|
607
|
+
@doc.net_worth.should == 100.00
|
608
|
+
end
|
609
|
+
|
610
|
+
should "work for booleans" do
|
611
|
+
@doc.active.should == true
|
612
|
+
@doc.smart.should == false
|
613
|
+
end
|
614
|
+
|
615
|
+
should "work for arrays" do
|
616
|
+
@doc.skills.should == [1]
|
617
|
+
@doc.skills << 2
|
618
|
+
@doc.skills.should == [1, 2]
|
619
|
+
end
|
620
|
+
|
621
|
+
should "work for hashes" do
|
622
|
+
@doc.options['foo'].should == 'bar'
|
623
|
+
@doc.options['baz'] = 'wick'
|
624
|
+
@doc.options['baz'].should == 'wick'
|
625
|
+
end
|
626
|
+
end
|
680
627
|
end # instance of a embedded document
|
681
628
|
end
|
File without changes
|