pwnash-mongo_mapper 0.7.5 → 0.7.6
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/lib/mongo_mapper.rb +6 -8
- data/lib/mongo_mapper/document.rb +6 -281
- data/lib/mongo_mapper/embedded_document.rb +5 -45
- data/lib/mongo_mapper/extensions.rb +190 -0
- data/lib/mongo_mapper/plugins.rb +27 -18
- data/lib/mongo_mapper/plugins/associations.rb +7 -6
- data/lib/mongo_mapper/plugins/associations/base.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +2 -1
- data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +4 -4
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/callbacks.rb +4 -3
- data/lib/mongo_mapper/plugins/clone.rb +1 -0
- data/lib/mongo_mapper/plugins/descendants.rb +1 -0
- data/lib/mongo_mapper/plugins/dirty.rb +1 -0
- data/lib/mongo_mapper/plugins/document.rb +40 -0
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +42 -0
- data/lib/mongo_mapper/{support/find.rb → plugins/dynamic_querying/dynamic_finder.rb} +2 -36
- data/lib/mongo_mapper/plugins/embedded_document.rb +48 -0
- data/lib/mongo_mapper/plugins/equality.rb +1 -0
- data/lib/mongo_mapper/plugins/identity_map.rb +8 -11
- data/lib/mongo_mapper/plugins/indexes.rb +11 -0
- data/lib/mongo_mapper/plugins/inspect.rb +1 -0
- data/lib/mongo_mapper/plugins/keys.rb +7 -9
- data/lib/mongo_mapper/plugins/keys/key.rb +12 -2
- data/lib/mongo_mapper/plugins/logger.rb +1 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +3 -2
- data/lib/mongo_mapper/plugins/pagination.rb +1 -0
- data/lib/mongo_mapper/plugins/pagination/proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/persistence.rb +1 -0
- data/lib/mongo_mapper/plugins/protected.rb +1 -0
- data/lib/mongo_mapper/plugins/query_logger.rb +5 -10
- data/lib/mongo_mapper/plugins/querying.rb +236 -0
- data/lib/mongo_mapper/plugins/rails.rb +1 -0
- data/lib/mongo_mapper/plugins/sci.rb +31 -0
- data/lib/mongo_mapper/plugins/serialization.rb +1 -0
- data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
- data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
- data/lib/mongo_mapper/plugins/validations.rb +5 -1
- data/lib/mongo_mapper/query.rb +53 -120
- data/lib/mongo_mapper/support.rb +2 -213
- data/lib/mongo_mapper/support/descendant_appends.rb +3 -6
- data/lib/mongo_mapper/version.rb +2 -1
- metadata +156 -190
- data/.gitignore +0 -10
- data/Rakefile +0 -37
- data/mongo_mapper.gemspec +0 -216
- data/performance/read_write.rb +0 -52
- data/specs.watchr +0 -51
- data/test/NOTE_ON_TESTING +0 -1
- data/test/active_model_lint_test.rb +0 -13
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +0 -63
- data/test/functional/associations/test_belongs_to_proxy.rb +0 -101
- data/test/functional/associations/test_in_array_proxy.rb +0 -325
- data/test/functional/associations/test_many_documents_as_proxy.rb +0 -229
- data/test/functional/associations/test_many_documents_proxy.rb +0 -536
- data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +0 -176
- data/test/functional/associations/test_many_embedded_proxy.rb +0 -256
- data/test/functional/associations/test_many_polymorphic_proxy.rb +0 -302
- data/test/functional/associations/test_one_embedded_proxy.rb +0 -68
- data/test/functional/associations/test_one_proxy.rb +0 -196
- data/test/functional/test_associations.rb +0 -44
- data/test/functional/test_binary.rb +0 -27
- data/test/functional/test_callbacks.rb +0 -151
- data/test/functional/test_dirty.rb +0 -163
- data/test/functional/test_document.rb +0 -1219
- data/test/functional/test_embedded_document.rb +0 -210
- data/test/functional/test_identity_map.rb +0 -507
- data/test/functional/test_indexing.rb +0 -44
- data/test/functional/test_logger.rb +0 -20
- data/test/functional/test_modifiers.rb +0 -416
- data/test/functional/test_pagination.rb +0 -93
- data/test/functional/test_protected.rb +0 -163
- data/test/functional/test_string_id_compatibility.rb +0 -67
- data/test/functional/test_timestamps.rb +0 -64
- data/test/functional/test_userstamps.rb +0 -28
- data/test/functional/test_validations.rb +0 -342
- data/test/models.rb +0 -227
- data/test/support/custom_matchers.rb +0 -37
- data/test/support/timing.rb +0 -16
- data/test/test_helper.rb +0 -64
- data/test/unit/associations/test_base.rb +0 -212
- data/test/unit/associations/test_proxy.rb +0 -105
- data/test/unit/serializers/test_json_serializer.rb +0 -202
- data/test/unit/test_descendant_appends.rb +0 -71
- data/test/unit/test_document.rb +0 -225
- data/test/unit/test_dynamic_finder.rb +0 -123
- data/test/unit/test_embedded_document.rb +0 -657
- data/test/unit/test_keys.rb +0 -216
- data/test/unit/test_mongo_mapper.rb +0 -118
- data/test/unit/test_pagination.rb +0 -160
- data/test/unit/test_plugins.rb +0 -50
- data/test/unit/test_query.rb +0 -374
- data/test/unit/test_rails.rb +0 -181
- data/test/unit/test_rails_compatibility.rb +0 -52
- data/test/unit/test_serialization.rb +0 -51
- data/test/unit/test_support.rb +0 -390
- data/test/unit/test_time_zones.rb +0 -39
- data/test/unit/test_validations.rb +0 -544
@@ -1,536 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'models'
|
3
|
-
|
4
|
-
class ManyDocumentsProxyTest < Test::Unit::TestCase
|
5
|
-
def setup
|
6
|
-
Project.collection.remove
|
7
|
-
Status.collection.remove
|
8
|
-
|
9
|
-
@pet_class = Doc do
|
10
|
-
key :name, String
|
11
|
-
key :owner_id, ObjectId
|
12
|
-
end
|
13
|
-
|
14
|
-
@owner_class = Doc do
|
15
|
-
key :name, String
|
16
|
-
end
|
17
|
-
@owner_class.many :pets, :class => @pet_class, :foreign_key => :owner_id, :order => 'name'
|
18
|
-
end
|
19
|
-
|
20
|
-
should "default reader to empty array" do
|
21
|
-
project = Project.new
|
22
|
-
project.statuses.should == []
|
23
|
-
end
|
24
|
-
|
25
|
-
should "allow assignment of many associated documents using a hash" do
|
26
|
-
person_attributes = {
|
27
|
-
'name' => 'Mr. Pet Lover',
|
28
|
-
'pets' => [
|
29
|
-
{'name' => 'Jimmy', 'species' => 'Cocker Spainel'},
|
30
|
-
{'name' => 'Sasha', 'species' => 'Siberian Husky'},
|
31
|
-
]
|
32
|
-
}
|
33
|
-
|
34
|
-
owner = @owner_class.new(person_attributes)
|
35
|
-
owner.name.should == 'Mr. Pet Lover'
|
36
|
-
owner.pets[0].name.should == 'Jimmy'
|
37
|
-
owner.pets[0].species.should == 'Cocker Spainel'
|
38
|
-
owner.pets[1].name.should == 'Sasha'
|
39
|
-
owner.pets[1].species.should == 'Siberian Husky'
|
40
|
-
|
41
|
-
owner.save.should be_true
|
42
|
-
owner.reload
|
43
|
-
|
44
|
-
owner.name.should == 'Mr. Pet Lover'
|
45
|
-
owner.pets[0].name.should == 'Jimmy'
|
46
|
-
owner.pets[0].species.should == 'Cocker Spainel'
|
47
|
-
owner.pets[1].name.should == 'Sasha'
|
48
|
-
owner.pets[1].species.should == 'Siberian Husky'
|
49
|
-
end
|
50
|
-
|
51
|
-
should "allow adding to association like it was an array" do
|
52
|
-
project = Project.new
|
53
|
-
project.statuses << Status.new(:name => 'Foo1!')
|
54
|
-
project.statuses.push Status.new(:name => 'Foo2!')
|
55
|
-
project.statuses.concat Status.new(:name => 'Foo3!')
|
56
|
-
project.statuses.size.should == 3
|
57
|
-
end
|
58
|
-
|
59
|
-
context "replacing the association" do
|
60
|
-
context "with objects of the class" do
|
61
|
-
should "work" do
|
62
|
-
project = Project.new
|
63
|
-
project.statuses = [Status.new(:name => "ready")]
|
64
|
-
project.save.should be_true
|
65
|
-
|
66
|
-
project.reload
|
67
|
-
project.statuses.size.should == 1
|
68
|
-
project.statuses[0].name.should == "ready"
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
context "with Hashes" do
|
73
|
-
should "convert to objects of the class and work" do
|
74
|
-
project = Project.new
|
75
|
-
project.statuses = [{ 'name' => 'ready' }]
|
76
|
-
project.save.should be_true
|
77
|
-
|
78
|
-
project.reload
|
79
|
-
project.statuses.size.should == 1
|
80
|
-
project.statuses[0].name.should == "ready"
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
context "using <<, push and concat" do
|
86
|
-
context "with objects of the class" do
|
87
|
-
should "correctly assign foreign key" do
|
88
|
-
project = Project.new
|
89
|
-
project.statuses << Status.new(:name => '<<')
|
90
|
-
project.statuses.push Status.new(:name => 'push')
|
91
|
-
project.statuses.concat Status.new(:name => 'concat')
|
92
|
-
|
93
|
-
project.reload
|
94
|
-
project.statuses[0].project_id.should == project.id
|
95
|
-
project.statuses[1].project_id.should == project.id
|
96
|
-
project.statuses[2].project_id.should == project.id
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
context "with Hashes" do
|
101
|
-
should "correctly convert to objects and assign foreign key" do
|
102
|
-
project = Project.new
|
103
|
-
project.statuses << { 'name' => '<<' }
|
104
|
-
project.statuses.push( { 'name' => 'push' })
|
105
|
-
project.statuses.concat({ 'name' => 'concat' })
|
106
|
-
|
107
|
-
project.reload
|
108
|
-
project.statuses[0].project_id.should == project.id
|
109
|
-
project.statuses[1].project_id.should == project.id
|
110
|
-
project.statuses[2].project_id.should == project.id
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
context "build" do
|
116
|
-
should "assign foreign key" do
|
117
|
-
project = Project.create
|
118
|
-
status = project.statuses.build
|
119
|
-
status.project_id.should == project.id
|
120
|
-
end
|
121
|
-
|
122
|
-
should "allow assigning attributes" do
|
123
|
-
project = Project.create
|
124
|
-
status = project.statuses.build(:name => 'Foo')
|
125
|
-
status.name.should == 'Foo'
|
126
|
-
end
|
127
|
-
|
128
|
-
should "reset cache" do
|
129
|
-
project = Project.create
|
130
|
-
project.statuses.size.should == 0
|
131
|
-
status = project.statuses.build(:name => 'Foo')
|
132
|
-
status.save!
|
133
|
-
project.statuses.size.should == 1
|
134
|
-
end
|
135
|
-
|
136
|
-
should "update collection without save" do
|
137
|
-
project = Project.create
|
138
|
-
project.statuses.build(:name => 'Foo')
|
139
|
-
project.statuses.size.should == 1
|
140
|
-
end
|
141
|
-
|
142
|
-
should "save built document when saving parent" do
|
143
|
-
project = Project.create
|
144
|
-
status = project.statuses.build(:name => 'Foo')
|
145
|
-
project.save!
|
146
|
-
status.should_not be_new
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
context "create" do
|
151
|
-
should "assign foreign key" do
|
152
|
-
project = Project.create
|
153
|
-
status = project.statuses.create(:name => 'Foo!')
|
154
|
-
status.project_id.should == project.id
|
155
|
-
end
|
156
|
-
|
157
|
-
should "save record" do
|
158
|
-
project = Project.create
|
159
|
-
lambda {
|
160
|
-
project.statuses.create(:name => 'Foo!')
|
161
|
-
}.should change { Status.count }
|
162
|
-
end
|
163
|
-
|
164
|
-
should "allow passing attributes" do
|
165
|
-
project = Project.create
|
166
|
-
status = project.statuses.create(:name => 'Foo!')
|
167
|
-
status.name.should == 'Foo!'
|
168
|
-
end
|
169
|
-
|
170
|
-
should "reset cache" do
|
171
|
-
project = Project.create
|
172
|
-
project.statuses.size.should == 0
|
173
|
-
project.statuses.create(:name => 'Foo!')
|
174
|
-
project.statuses.size.should == 1
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
context "create!" do
|
179
|
-
should "assign foreign key" do
|
180
|
-
project = Project.create
|
181
|
-
status = project.statuses.create!(:name => 'Foo!')
|
182
|
-
status.project_id.should == project.id
|
183
|
-
end
|
184
|
-
|
185
|
-
should "save record" do
|
186
|
-
project = Project.create
|
187
|
-
lambda {
|
188
|
-
project.statuses.create!(:name => 'Foo!')
|
189
|
-
}.should change { Status.count }
|
190
|
-
end
|
191
|
-
|
192
|
-
should "allow passing attributes" do
|
193
|
-
project = Project.create
|
194
|
-
status = project.statuses.create!(:name => 'Foo!')
|
195
|
-
status.name.should == 'Foo!'
|
196
|
-
end
|
197
|
-
|
198
|
-
should "raise exception if not valid" do
|
199
|
-
project = Project.create
|
200
|
-
lambda {
|
201
|
-
project.statuses.create!(:name => nil)
|
202
|
-
}.should raise_error(MongoMapper::DocumentNotValid)
|
203
|
-
end
|
204
|
-
|
205
|
-
should "reset cache" do
|
206
|
-
project = Project.create
|
207
|
-
project.statuses.size.should == 0
|
208
|
-
project.statuses.create!(:name => 'Foo!')
|
209
|
-
project.statuses.size.should == 1
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
context "count" do
|
214
|
-
should "work scoped to association" do
|
215
|
-
project = Project.create
|
216
|
-
3.times { project.statuses.create(:name => 'Foo!') }
|
217
|
-
|
218
|
-
other_project = Project.create
|
219
|
-
2.times { other_project.statuses.create(:name => 'Foo!') }
|
220
|
-
|
221
|
-
project.statuses.count.should == 3
|
222
|
-
other_project.statuses.count.should == 2
|
223
|
-
end
|
224
|
-
|
225
|
-
should "work with conditions" do
|
226
|
-
project = Project.create
|
227
|
-
project.statuses.create(:name => 'Foo')
|
228
|
-
project.statuses.create(:name => 'Other 1')
|
229
|
-
project.statuses.create(:name => 'Other 2')
|
230
|
-
|
231
|
-
project.statuses.count(:name => 'Foo').should == 1
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
context "Unassociating documents" do
|
236
|
-
setup do
|
237
|
-
@project = Project.create
|
238
|
-
@project.statuses << Status.create(:name => '1')
|
239
|
-
@project.statuses << Status.create(:name => '2')
|
240
|
-
|
241
|
-
@project2 = Project.create
|
242
|
-
@project2.statuses << Status.create(:name => '1')
|
243
|
-
@project2.statuses << Status.create(:name => '2')
|
244
|
-
end
|
245
|
-
|
246
|
-
should "work with destroy all" do
|
247
|
-
@project.statuses.count.should == 2
|
248
|
-
@project.statuses.destroy_all
|
249
|
-
@project.statuses.count.should == 0
|
250
|
-
|
251
|
-
@project2.statuses.count.should == 2
|
252
|
-
Status.count.should == 2
|
253
|
-
end
|
254
|
-
|
255
|
-
should "work with destroy all and conditions" do
|
256
|
-
@project.statuses.count.should == 2
|
257
|
-
@project.statuses.destroy_all(:name => '1')
|
258
|
-
@project.statuses.count.should == 1
|
259
|
-
|
260
|
-
@project2.statuses.count.should == 2
|
261
|
-
Status.count.should == 3
|
262
|
-
end
|
263
|
-
|
264
|
-
should "work with delete all" do
|
265
|
-
@project.statuses.count.should == 2
|
266
|
-
@project.statuses.delete_all
|
267
|
-
@project.statuses.count.should == 0
|
268
|
-
|
269
|
-
@project2.statuses.count.should == 2
|
270
|
-
Status.count.should == 2
|
271
|
-
end
|
272
|
-
|
273
|
-
should "work with delete all and conditions" do
|
274
|
-
@project.statuses.count.should == 2
|
275
|
-
@project.statuses.delete_all(:name => '1')
|
276
|
-
@project.statuses.count.should == 1
|
277
|
-
|
278
|
-
@project2.statuses.count.should == 2
|
279
|
-
Status.count.should == 3
|
280
|
-
end
|
281
|
-
|
282
|
-
should "work with nullify" do
|
283
|
-
@project.statuses.count.should == 2
|
284
|
-
@project.statuses.nullify
|
285
|
-
@project.statuses.count.should == 0
|
286
|
-
|
287
|
-
@project2.statuses.count.should == 2
|
288
|
-
Status.count.should == 4
|
289
|
-
Status.count(:name => '1').should == 2
|
290
|
-
Status.count(:name => '2').should == 2
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
context "Finding scoped to association" do
|
295
|
-
setup do
|
296
|
-
@project1 = Project.new(:name => 'Project 1')
|
297
|
-
@brand_new = Status.create(:name => 'New', :position => 1 )
|
298
|
-
@complete = Status.create(:name => 'Complete', :position => 2)
|
299
|
-
@project1.statuses = [@brand_new, @complete]
|
300
|
-
@project1.save
|
301
|
-
|
302
|
-
@project2 = Project.create(:name => 'Project 2')
|
303
|
-
@in_progress = Status.create(:name => 'In Progress')
|
304
|
-
@archived = Status.create(:name => 'Archived')
|
305
|
-
@another_complete = Status.create(:name => 'Complete')
|
306
|
-
@project2.statuses = [@in_progress, @archived, @another_complete]
|
307
|
-
@project2.save
|
308
|
-
end
|
309
|
-
|
310
|
-
context "dynamic finders" do
|
311
|
-
should "work with single key" do
|
312
|
-
@project1.statuses.find_by_name('New').should == @brand_new
|
313
|
-
@project1.statuses.find_by_name!('New').should == @brand_new
|
314
|
-
@project2.statuses.find_by_name('In Progress').should == @in_progress
|
315
|
-
@project2.statuses.find_by_name!('In Progress').should == @in_progress
|
316
|
-
end
|
317
|
-
|
318
|
-
should "work with multiple keys" do
|
319
|
-
@project1.statuses.find_by_name_and_position('New', 1).should == @brand_new
|
320
|
-
@project1.statuses.find_by_name_and_position!('New', 1).should == @brand_new
|
321
|
-
@project1.statuses.find_by_name_and_position('New', 2).should be_nil
|
322
|
-
end
|
323
|
-
|
324
|
-
should "raise error when using !" do
|
325
|
-
lambda {
|
326
|
-
@project1.statuses.find_by_name!('Fake')
|
327
|
-
}.should raise_error(MongoMapper::DocumentNotFound)
|
328
|
-
end
|
329
|
-
|
330
|
-
context "find_or_create_by" do
|
331
|
-
should "not create document if found" do
|
332
|
-
lambda {
|
333
|
-
status = @project1.statuses.find_or_create_by_name('New')
|
334
|
-
status.project.should == @project1
|
335
|
-
status.should == @brand_new
|
336
|
-
}.should_not change { Status.count }
|
337
|
-
end
|
338
|
-
|
339
|
-
should "create document if not found" do
|
340
|
-
lambda {
|
341
|
-
status = @project1.statuses.find_or_create_by_name('Delivered')
|
342
|
-
status.project.should == @project1
|
343
|
-
}.should change { Status.count }
|
344
|
-
end
|
345
|
-
end
|
346
|
-
end
|
347
|
-
|
348
|
-
context "all" do
|
349
|
-
should "work" do
|
350
|
-
@project1.statuses.all(:order => "position asc").should == [@brand_new, @complete]
|
351
|
-
end
|
352
|
-
|
353
|
-
should "work with conditions" do
|
354
|
-
@project1.statuses.all(:name => 'Complete').should == [@complete]
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
|
-
context "first" do
|
359
|
-
should "work" do
|
360
|
-
@project1.statuses.first(:order => 'name').should == @complete
|
361
|
-
end
|
362
|
-
|
363
|
-
should "work with conditions" do
|
364
|
-
@project1.statuses.first(:name => 'Complete').should == @complete
|
365
|
-
end
|
366
|
-
end
|
367
|
-
|
368
|
-
context "last" do
|
369
|
-
should "work" do
|
370
|
-
@project1.statuses.last(:order => "position asc").should == @complete
|
371
|
-
end
|
372
|
-
|
373
|
-
should "work with conditions" do
|
374
|
-
@project1.statuses.last(:order => 'position', :name => 'New').should == @brand_new
|
375
|
-
end
|
376
|
-
end
|
377
|
-
|
378
|
-
context "with one id" do
|
379
|
-
should "work for id in association" do
|
380
|
-
@project1.statuses.find(@complete.id).should == @complete
|
381
|
-
end
|
382
|
-
|
383
|
-
should "not work for id not in association" do
|
384
|
-
lambda {
|
385
|
-
@project1.statuses.find!(@archived.id)
|
386
|
-
}.should raise_error(MongoMapper::DocumentNotFound)
|
387
|
-
end
|
388
|
-
end
|
389
|
-
|
390
|
-
context "with multiple ids" do
|
391
|
-
should "work for ids in association" do
|
392
|
-
statuses = @project1.statuses.find(@brand_new.id, @complete.id)
|
393
|
-
statuses.should == [@brand_new, @complete]
|
394
|
-
end
|
395
|
-
|
396
|
-
should "not work for ids not in association" do
|
397
|
-
assert_raises(MongoMapper::DocumentNotFound) do
|
398
|
-
@project1.statuses.find!(@brand_new.id, @complete.id, @archived.id)
|
399
|
-
end
|
400
|
-
end
|
401
|
-
end
|
402
|
-
|
403
|
-
context "with #paginate" do
|
404
|
-
setup do
|
405
|
-
@statuses = @project2.statuses.paginate(:per_page => 2, :page => 1, :order => 'name asc')
|
406
|
-
end
|
407
|
-
|
408
|
-
should "return total pages" do
|
409
|
-
@statuses.total_pages.should == 2
|
410
|
-
end
|
411
|
-
|
412
|
-
should "return total entries" do
|
413
|
-
@statuses.total_entries.should == 3
|
414
|
-
end
|
415
|
-
|
416
|
-
should "return the subject" do
|
417
|
-
@statuses.collect(&:name).should == %w(Archived Complete)
|
418
|
-
end
|
419
|
-
end
|
420
|
-
end
|
421
|
-
|
422
|
-
context "extending the association" do
|
423
|
-
should "work using a block passed to many" do
|
424
|
-
project = Project.new(:name => "Some Project")
|
425
|
-
status1 = Status.new(:name => "New")
|
426
|
-
status2 = Status.new(:name => "Assigned")
|
427
|
-
status3 = Status.new(:name => "Closed")
|
428
|
-
project.statuses = [status1, status2, status3]
|
429
|
-
project.save
|
430
|
-
|
431
|
-
open_statuses = project.statuses.open
|
432
|
-
open_statuses.should include(status1)
|
433
|
-
open_statuses.should include(status2)
|
434
|
-
open_statuses.should_not include(status3)
|
435
|
-
end
|
436
|
-
|
437
|
-
should "work using many's :extend option" do
|
438
|
-
project = Project.new(:name => "Some Project")
|
439
|
-
collaborator1 = Collaborator.new(:name => "zing")
|
440
|
-
collaborator2 = Collaborator.new(:name => "zang")
|
441
|
-
project.collaborators = [collaborator1, collaborator2]
|
442
|
-
project.save
|
443
|
-
project.collaborators.top.should == collaborator1
|
444
|
-
end
|
445
|
-
end
|
446
|
-
|
447
|
-
context ":dependent" do
|
448
|
-
setup do
|
449
|
-
# FIXME: make use of already defined models
|
450
|
-
class ::Property
|
451
|
-
include MongoMapper::Document
|
452
|
-
end
|
453
|
-
Property.collection.remove
|
454
|
-
|
455
|
-
class ::Thing
|
456
|
-
include MongoMapper::Document
|
457
|
-
key :name, String
|
458
|
-
end
|
459
|
-
Thing.collection.remove
|
460
|
-
end
|
461
|
-
|
462
|
-
teardown do
|
463
|
-
Object.send :remove_const, 'Property' if defined?(::Property)
|
464
|
-
Object.send :remove_const, 'Thing' if defined?(::Thing)
|
465
|
-
end
|
466
|
-
|
467
|
-
context "=> destroy" do
|
468
|
-
setup do
|
469
|
-
Property.key :thing_id, ObjectId
|
470
|
-
Property.belongs_to :thing, :dependent => :destroy
|
471
|
-
Thing.many :properties, :dependent => :destroy
|
472
|
-
|
473
|
-
@thing = Thing.create(:name => "Tree")
|
474
|
-
@property1 = Property.create
|
475
|
-
@property2 = Property.create
|
476
|
-
@property3 = Property.create
|
477
|
-
@thing.properties << @property1
|
478
|
-
@thing.properties << @property2
|
479
|
-
@thing.properties << @property3
|
480
|
-
end
|
481
|
-
|
482
|
-
should "should destroy the associated documents" do
|
483
|
-
@thing.properties.count.should == 3
|
484
|
-
@thing.destroy
|
485
|
-
@thing.properties.count.should == 0
|
486
|
-
Property.count.should == 0
|
487
|
-
end
|
488
|
-
end
|
489
|
-
|
490
|
-
context "=> delete_all" do
|
491
|
-
setup do
|
492
|
-
Property.key :thing_id, ObjectId
|
493
|
-
Property.belongs_to :thing
|
494
|
-
Thing.has_many :properties, :dependent => :delete_all
|
495
|
-
|
496
|
-
@thing = Thing.create(:name => "Tree")
|
497
|
-
@property1 = Property.create
|
498
|
-
@property2 = Property.create
|
499
|
-
@property3 = Property.create
|
500
|
-
@thing.properties << @property1
|
501
|
-
@thing.properties << @property2
|
502
|
-
@thing.properties << @property3
|
503
|
-
end
|
504
|
-
|
505
|
-
should "should delete associated documents" do
|
506
|
-
@thing.properties.count.should == 3
|
507
|
-
@thing.destroy
|
508
|
-
@thing.properties.count.should == 0
|
509
|
-
Property.count.should == 0
|
510
|
-
end
|
511
|
-
end
|
512
|
-
|
513
|
-
context "=> nullify" do
|
514
|
-
setup do
|
515
|
-
Property.key :thing_id, ObjectId
|
516
|
-
Property.belongs_to :thing
|
517
|
-
Thing.has_many :properties, :dependent => :nullify
|
518
|
-
|
519
|
-
@thing = Thing.create(:name => "Tree")
|
520
|
-
@property1 = Property.create
|
521
|
-
@property2 = Property.create
|
522
|
-
@property3 = Property.create
|
523
|
-
@thing.properties << @property1
|
524
|
-
@thing.properties << @property2
|
525
|
-
@thing.properties << @property3
|
526
|
-
end
|
527
|
-
|
528
|
-
should "should nullify relationship but not destroy associated documents" do
|
529
|
-
@thing.properties.count.should == 3
|
530
|
-
@thing.destroy
|
531
|
-
@thing.properties.count.should == 0
|
532
|
-
Property.count.should == 3
|
533
|
-
end
|
534
|
-
end
|
535
|
-
end
|
536
|
-
end
|