mongoid 1.2.14 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. data/lib/mongoid.rb +10 -3
  2. data/lib/mongoid/associations.rb +133 -97
  3. data/lib/mongoid/associations/belongs_to_related.rb +2 -3
  4. data/lib/mongoid/associations/{belongs_to.rb → embedded_in.rb} +14 -6
  5. data/lib/mongoid/associations/{has_many.rb → embeds_many.rb} +89 -31
  6. data/lib/mongoid/associations/{has_one.rb → embeds_one.rb} +8 -7
  7. data/lib/mongoid/associations/has_many_related.rb +52 -7
  8. data/lib/mongoid/associations/has_one_related.rb +8 -4
  9. data/lib/mongoid/associations/meta_data.rb +2 -1
  10. data/lib/mongoid/associations/options.rb +6 -1
  11. data/lib/mongoid/associations/proxy.rb +14 -21
  12. data/lib/mongoid/attributes.rb +27 -12
  13. data/lib/mongoid/collection.rb +4 -3
  14. data/lib/mongoid/collections.rb +41 -0
  15. data/lib/mongoid/collections/master.rb +3 -2
  16. data/lib/mongoid/collections/slaves.rb +3 -2
  17. data/lib/mongoid/components.rb +21 -19
  18. data/lib/mongoid/concern.rb +31 -0
  19. data/lib/mongoid/config.rb +117 -12
  20. data/lib/mongoid/contexts.rb +1 -1
  21. data/lib/mongoid/contexts/enumerable.rb +1 -1
  22. data/lib/mongoid/contexts/mongo.rb +1 -1
  23. data/lib/mongoid/contexts/paging.rb +10 -2
  24. data/lib/mongoid/criterion/inclusion.rb +17 -0
  25. data/lib/mongoid/criterion/optional.rb +1 -1
  26. data/lib/mongoid/dirty.rb +253 -0
  27. data/lib/mongoid/document.rb +81 -52
  28. data/lib/mongoid/errors.rb +32 -1
  29. data/lib/mongoid/extensions.rb +11 -9
  30. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  31. data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
  32. data/lib/mongoid/extensions/date/conversions.rb +13 -4
  33. data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
  34. data/lib/mongoid/extensions/float/conversions.rb +5 -1
  35. data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
  36. data/lib/mongoid/extensions/hash/conversions.rb +34 -4
  37. data/lib/mongoid/extensions/integer/conversions.rb +5 -1
  38. data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
  39. data/lib/mongoid/extensions/object/conversions.rb +1 -1
  40. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  41. data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
  42. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  43. data/lib/mongoid/extras.rb +6 -9
  44. data/lib/mongoid/factory.rb +2 -1
  45. data/lib/mongoid/field.rb +9 -2
  46. data/lib/mongoid/fields.rb +1 -0
  47. data/lib/mongoid/identity.rb +3 -3
  48. data/lib/mongoid/indexes.rb +3 -3
  49. data/lib/mongoid/memoization.rb +8 -2
  50. data/lib/mongoid/named_scope.rb +0 -3
  51. data/lib/mongoid/observable.rb +30 -0
  52. data/lib/mongoid/paths.rb +62 -0
  53. data/lib/mongoid/persistence.rb +222 -0
  54. data/lib/mongoid/persistence/command.rb +39 -0
  55. data/lib/mongoid/persistence/insert.rb +50 -0
  56. data/lib/mongoid/persistence/insert_embedded.rb +38 -0
  57. data/lib/mongoid/persistence/remove.rb +39 -0
  58. data/lib/mongoid/persistence/remove_all.rb +37 -0
  59. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  60. data/lib/mongoid/persistence/update.rb +63 -0
  61. data/lib/mongoid/state.rb +28 -21
  62. data/lib/mongoid/timestamps.rb +5 -8
  63. data/lib/mongoid/version.rb +4 -0
  64. data/lib/mongoid/versioning.rb +6 -7
  65. metadata +81 -300
  66. data/.gitignore +0 -6
  67. data/.watchr +0 -29
  68. data/Rakefile +0 -53
  69. data/VERSION +0 -1
  70. data/caliper.yml +0 -4
  71. data/lib/mongoid/collections/mimic.rb +0 -46
  72. data/lib/mongoid/commands.rb +0 -174
  73. data/lib/mongoid/commands/create.rb +0 -21
  74. data/lib/mongoid/commands/delete.rb +0 -16
  75. data/lib/mongoid/commands/delete_all.rb +0 -23
  76. data/lib/mongoid/commands/deletion.rb +0 -18
  77. data/lib/mongoid/commands/destroy.rb +0 -19
  78. data/lib/mongoid/commands/destroy_all.rb +0 -23
  79. data/lib/mongoid/commands/save.rb +0 -27
  80. data/lib/mongoid/extensions/time/conversions.rb +0 -18
  81. data/mongoid.gemspec +0 -395
  82. data/perf/benchmark.rb +0 -77
  83. data/spec/integration/mongoid/associations_spec.rb +0 -340
  84. data/spec/integration/mongoid/attributes_spec.rb +0 -22
  85. data/spec/integration/mongoid/commands_spec.rb +0 -218
  86. data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
  87. data/spec/integration/mongoid/criteria_spec.rb +0 -272
  88. data/spec/integration/mongoid/document_spec.rb +0 -593
  89. data/spec/integration/mongoid/extensions_spec.rb +0 -26
  90. data/spec/integration/mongoid/finders_spec.rb +0 -119
  91. data/spec/integration/mongoid/inheritance_spec.rb +0 -137
  92. data/spec/integration/mongoid/named_scope_spec.rb +0 -46
  93. data/spec/models/address.rb +0 -39
  94. data/spec/models/animal.rb +0 -6
  95. data/spec/models/callbacks.rb +0 -18
  96. data/spec/models/comment.rb +0 -8
  97. data/spec/models/country_code.rb +0 -6
  98. data/spec/models/employer.rb +0 -5
  99. data/spec/models/game.rb +0 -7
  100. data/spec/models/inheritance.rb +0 -56
  101. data/spec/models/location.rb +0 -5
  102. data/spec/models/mixed_drink.rb +0 -4
  103. data/spec/models/name.rb +0 -13
  104. data/spec/models/namespacing.rb +0 -11
  105. data/spec/models/patient.rb +0 -4
  106. data/spec/models/person.rb +0 -99
  107. data/spec/models/pet.rb +0 -7
  108. data/spec/models/pet_owner.rb +0 -6
  109. data/spec/models/phone.rb +0 -7
  110. data/spec/models/post.rb +0 -15
  111. data/spec/models/translation.rb +0 -5
  112. data/spec/models/vet_visit.rb +0 -5
  113. data/spec/spec.opts +0 -3
  114. data/spec/spec_helper.rb +0 -31
  115. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
  116. data/spec/unit/mongoid/associations/belongs_to_spec.rb +0 -193
  117. data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -420
  118. data/spec/unit/mongoid/associations/has_many_spec.rb +0 -519
  119. data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
  120. data/spec/unit/mongoid/associations/has_one_spec.rb +0 -282
  121. data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
  122. data/spec/unit/mongoid/associations/options_spec.rb +0 -192
  123. data/spec/unit/mongoid/associations_spec.rb +0 -595
  124. data/spec/unit/mongoid/attributes_spec.rb +0 -507
  125. data/spec/unit/mongoid/callbacks_spec.rb +0 -55
  126. data/spec/unit/mongoid/collection_spec.rb +0 -187
  127. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
  128. data/spec/unit/mongoid/collections/master_spec.rb +0 -41
  129. data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
  130. data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
  131. data/spec/unit/mongoid/commands/create_spec.rb +0 -30
  132. data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
  133. data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
  134. data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -23
  135. data/spec/unit/mongoid/commands/destroy_spec.rb +0 -50
  136. data/spec/unit/mongoid/commands/save_spec.rb +0 -105
  137. data/spec/unit/mongoid/commands_spec.rb +0 -275
  138. data/spec/unit/mongoid/config_spec.rb +0 -172
  139. data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
  140. data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
  141. data/spec/unit/mongoid/contexts_spec.rb +0 -25
  142. data/spec/unit/mongoid/criteria_spec.rb +0 -824
  143. data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
  144. data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
  145. data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
  146. data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
  147. data/spec/unit/mongoid/cursor_spec.rb +0 -74
  148. data/spec/unit/mongoid/deprecation_spec.rb +0 -24
  149. data/spec/unit/mongoid/document_spec.rb +0 -952
  150. data/spec/unit/mongoid/errors_spec.rb +0 -103
  151. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
  152. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
  153. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
  154. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
  155. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
  156. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
  157. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
  158. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
  159. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -70
  160. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
  161. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
  162. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
  163. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
  164. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
  165. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
  166. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
  167. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
  168. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
  169. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
  170. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
  171. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
  172. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
  173. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
  174. data/spec/unit/mongoid/extras_spec.rb +0 -102
  175. data/spec/unit/mongoid/factory_spec.rb +0 -31
  176. data/spec/unit/mongoid/field_spec.rb +0 -143
  177. data/spec/unit/mongoid/fields_spec.rb +0 -181
  178. data/spec/unit/mongoid/finders_spec.rb +0 -404
  179. data/spec/unit/mongoid/identity_spec.rb +0 -109
  180. data/spec/unit/mongoid/indexes_spec.rb +0 -93
  181. data/spec/unit/mongoid/javascript_spec.rb +0 -48
  182. data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
  183. data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
  184. data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
  185. data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
  186. data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
  187. data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
  188. data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
  189. data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
  190. data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
  191. data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
  192. data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
  193. data/spec/unit/mongoid/matchers_spec.rb +0 -329
  194. data/spec/unit/mongoid/memoization_spec.rb +0 -75
  195. data/spec/unit/mongoid/named_scope_spec.rb +0 -123
  196. data/spec/unit/mongoid/scope_spec.rb +0 -240
  197. data/spec/unit/mongoid/state_spec.rb +0 -83
  198. data/spec/unit/mongoid/timestamps_spec.rb +0 -25
  199. data/spec/unit/mongoid/versioning_spec.rb +0 -41
  200. data/spec/unit/mongoid_spec.rb +0 -46
@@ -1,25 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Contexts do
4
-
5
- context ".context_for" do
6
- let(:klass) { stub('klass', :embedded => false) }
7
- let(:criteria) { stub('criteria', :klass => klass) }
8
-
9
- context "when criteria is for a top-level Mongoid::Document" do
10
- it "creates a Mongo context" do
11
- Mongoid::Contexts::Mongo.expects(:new).with(criteria)
12
- Mongoid::Contexts.context_for(criteria)
13
- end
14
- end
15
-
16
- context "when criteria is for an embedded Mongoid::Document" do
17
- it "creates a Mongo context" do
18
- klass.stubs(:embedded).returns(true)
19
- Mongoid::Contexts::Enumerable.expects(:new).with(criteria)
20
- Mongoid::Contexts.context_for(criteria)
21
- end
22
- end
23
- end
24
-
25
- end
@@ -1,824 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Criteria do
4
-
5
- before do
6
- @criteria = Mongoid::Criteria.new(Person)
7
- @canvas_criteria = Mongoid::Criteria.new(Canvas)
8
- end
9
-
10
- describe "#+" do
11
-
12
- before do
13
- @sir = Person.new(:title => "Sir")
14
- @canvas = Canvas.new
15
- end
16
-
17
- context "when the criteria has not been executed" do
18
-
19
- before do
20
- @collection = mock
21
- @cursor = stub(:count => 1)
22
- @cursor.expects(:each).at_least_once.yields(@sir)
23
- Person.expects(:collection).at_least_once.returns(@collection)
24
- @collection.expects(:find).at_least_once.returns(@cursor)
25
- end
26
-
27
- it "executes the criteria and concats the results" do
28
- results = @criteria + [ @canvas ]
29
- results.should == [ @sir, @canvas ]
30
- end
31
-
32
- end
33
-
34
- context "when the other is a criteria" do
35
-
36
- before do
37
- @collection = mock
38
- @canvas_collection = mock
39
- @cursor = stub(:count => 1)
40
- @canvas_cursor = stub(:count => 1)
41
- @cursor.expects(:each).at_least_once.yields(@sir)
42
- @canvas_cursor.expects(:each).at_least_once.yields(@canvas)
43
- Person.expects(:collection).at_least_once.returns(@collection)
44
- @collection.expects(:find).at_least_once.returns(@cursor)
45
- Canvas.expects(:collection).at_least_once.returns(@canvas_collection)
46
- @canvas_collection.expects(:find).at_least_once.returns(@canvas_cursor)
47
- end
48
-
49
- it "concats the results" do
50
- results = @criteria + @canvas_criteria
51
- results.should == [ @sir, @canvas ]
52
- end
53
-
54
- end
55
-
56
- end
57
-
58
- describe "#-" do
59
-
60
- before do
61
- @sir = Person.new(:title => "Sir")
62
- @madam = Person.new(:title => "Madam")
63
- end
64
-
65
- context "when the criteria has not been executed" do
66
-
67
- before do
68
- @collection = mock
69
- @cursor = stub(:count => 1)
70
- @cursor.expects(:each).yields(@madam)
71
- Person.expects(:collection).returns(@collection)
72
- @collection.expects(:find).returns(@cursor)
73
- end
74
-
75
- it "executes the criteria and returns the difference" do
76
- results = @criteria - [ @sir ]
77
- results.should == [ @madam ]
78
- end
79
-
80
- end
81
-
82
- end
83
-
84
- describe "#[]" do
85
-
86
- before do
87
- @criteria.where(:title => "Sir")
88
- @collection = stub
89
- @person = Person.new(:title => "Sir")
90
- @cursor = stub(:count => 10)
91
- @cursor.expects(:each).yields(@person)
92
- end
93
-
94
- context "when the criteria has not been executed" do
95
-
96
- before do
97
- Person.expects(:collection).returns(@collection)
98
- @collection.expects(:find).with({ :title => "Sir", :_type => { "$in" => ["Doctor", "Person"] } }, {}).returns(@cursor)
99
- end
100
-
101
- it "executes the criteria and returns the element at the index" do
102
- @criteria[0].should == @person
103
- end
104
-
105
- end
106
-
107
- end
108
-
109
- describe "#aggregate" do
110
-
111
- before do
112
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
113
- @criteria.instance_variable_set(:@context, @context)
114
- end
115
-
116
- it "delegates to the context" do
117
- @context.expects(:aggregate)
118
- @criteria.aggregate
119
- end
120
-
121
- end
122
-
123
- describe "#avg" do
124
-
125
- before do
126
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
127
- @criteria.instance_variable_set(:@context, @context)
128
- end
129
-
130
- it "delegates to the context" do
131
- @context.expects(:avg).with(:age)
132
- @criteria.avg(:age)
133
- end
134
- end
135
-
136
- describe "#blank?" do
137
-
138
- before do
139
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
140
- @criteria.instance_variable_set(:@context, @context)
141
- end
142
-
143
- context "when the context is blank" do
144
-
145
- before do
146
- @context.expects(:blank?).returns(true)
147
- end
148
-
149
- it "returns true" do
150
- @criteria.blank?.should be_true
151
- end
152
- end
153
-
154
- context "when the context is not blank" do
155
-
156
- before do
157
- @context.expects(:blank?).returns(false)
158
- end
159
-
160
- it "returns false" do
161
- @criteria.blank?.should be_false
162
- end
163
- end
164
- end
165
-
166
- describe "#context" do
167
-
168
- context "when the context has been set" do
169
-
170
- before do
171
- @context = stub
172
- @criteria.instance_variable_set(:@context, @context)
173
- end
174
-
175
- it "returns the memoized context" do
176
- @criteria.context.should == @context
177
- end
178
-
179
- end
180
-
181
- context "when the context has not been set" do
182
-
183
- before do
184
- @context = stub
185
- end
186
-
187
- it "creates a new context" do
188
- Mongoid::Contexts::Mongo.expects(:new).with(@criteria).returns(@context)
189
- @criteria.context.should == @context
190
- end
191
-
192
- end
193
-
194
- context "when the class is embedded" do
195
-
196
- before do
197
- @criteria = Mongoid::Criteria.new(Address)
198
- end
199
-
200
- it "returns an enumerable context" do
201
- @criteria.context.should be_a_kind_of(Mongoid::Contexts::Enumerable)
202
- end
203
-
204
- end
205
-
206
- context "when the class is not embedded" do
207
-
208
- it "returns a mongo context" do
209
- @criteria.context.should be_a_kind_of(Mongoid::Contexts::Mongo)
210
- end
211
-
212
- end
213
-
214
- end
215
-
216
- describe "#distinct" do
217
-
218
- before do
219
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
220
- @criteria.instance_variable_set(:@context, @context)
221
- end
222
-
223
- it "delegates to the context" do
224
- @context.expects(:distinct).with(:title)
225
- @criteria.distinct(:title)
226
- end
227
- end
228
-
229
- describe "#entries" do
230
-
231
- context "filtering" do
232
-
233
- before do
234
- @collection = mock
235
- Person.expects(:collection).returns(@collection)
236
- @criteria = Mongoid::Criteria.new(Person).extras(:page => 1, :per_page => 20)
237
- @collection.expects(:find).with(@criteria.selector, @criteria.options).returns([])
238
- end
239
-
240
- it "filters out unused params" do
241
- @criteria.entries
242
- @criteria.options[:page].should be_nil
243
- @criteria.options[:per_page].should be_nil
244
- end
245
-
246
- end
247
-
248
- context "when type is :all" do
249
-
250
- before do
251
- @collection = mock
252
- Person.expects(:collection).returns(@collection)
253
- @criteria = Mongoid::Criteria.new(Person).extras(:page => 1, :per_page => 20)
254
- @cursor = stub(:count => 44)
255
- @cursor.expects(:each)
256
- @collection.expects(:find).with(@criteria.selector, @criteria.options).returns(@cursor)
257
- end
258
-
259
- it "does not add the count instance variable" do
260
- @criteria.entries.should == []
261
- @criteria.instance_variable_get(:@count).should be_nil
262
- end
263
-
264
- end
265
-
266
- context "when type is not :first" do
267
-
268
- it "calls find on the collection with the selector and options" do
269
- criteria = Mongoid::Criteria.new(Person)
270
- collection = mock
271
- Person.expects(:collection).returns(collection)
272
- collection.expects(:find).with(criteria.selector, criteria.options).returns([])
273
- criteria.entries.should == []
274
- end
275
-
276
- end
277
-
278
- end
279
-
280
- describe "#count" do
281
-
282
- before do
283
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
284
- @criteria.instance_variable_set(:@context, @context)
285
- end
286
-
287
- it "delegates to the context" do
288
- @context.expects(:count).returns(10)
289
- @criteria.count.should == 10
290
- end
291
-
292
- end
293
-
294
- describe "#each" do
295
-
296
- before do
297
- @criteria.where(:title => "Sir")
298
- @collection = stub
299
- @person = Person.new(:title => "Sir")
300
- @cursor = stub(:count => 10)
301
- end
302
-
303
- it "delegates to the context#iterate" do
304
- @context = stub('context')
305
- @criteria.stubs(:context).returns(@context)
306
- @context.expects(:iterate)
307
- @criteria.each
308
- end
309
-
310
- context "when the criteria has not been executed" do
311
-
312
- before do
313
- Person.expects(:collection).returns(@collection)
314
- @collection.expects(:find).with({ :_type => { "$in" => ["Doctor", "Person"] }, :title => "Sir" }, {}).returns(@cursor)
315
- @cursor.expects(:each).yields(@person)
316
- end
317
-
318
- it "executes the criteria" do
319
- @criteria.each do |doc|
320
- doc.should == @person
321
- end
322
- end
323
-
324
- end
325
-
326
- context "when the criteria has been executed" do
327
-
328
- before do
329
- Person.expects(:collection).returns(@collection)
330
- @collection.expects(:find).with({ :_type => { "$in" => ["Doctor", "Person"] }, :title => "Sir" }, {}).returns(@cursor)
331
- @cursor.expects(:each).yields(@person)
332
- end
333
-
334
- it "calls each on the existing results" do
335
- @criteria.each do |person|
336
- person.should == @person
337
- end
338
- end
339
-
340
- end
341
-
342
- context "when no block is passed" do
343
-
344
- it "returns self" do
345
- @criteria.each.should == @criteria
346
- end
347
-
348
- end
349
-
350
- context "when caching" do
351
-
352
- before do
353
- Person.expects(:collection).returns(@collection)
354
- @collection.expects(:find).with(
355
- { :_type => { "$in" => ["Doctor", "Person"] },
356
- :title => "Sir"
357
- },
358
- { :cache => true }
359
- ).returns(@cursor)
360
- @cursor.expects(:each).yields(@person)
361
- @criteria.cache
362
- @criteria.each do |doc|
363
- doc.should == @person
364
- end
365
- end
366
-
367
- it "caches the results of the cursor iteration" do
368
- @criteria.each do |doc|
369
- doc.should == @person
370
- end
371
- # Do it again for sanity's sake.
372
- @criteria.each do |doc|
373
- doc.should == @person
374
- end
375
- end
376
-
377
- end
378
-
379
- end
380
-
381
- describe "#first" do
382
-
383
- before do
384
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
385
- @criteria.instance_variable_set(:@context, @context)
386
- end
387
-
388
- it "delegates to the context" do
389
- @context.expects(:first).returns([])
390
- @criteria.first.should == []
391
- end
392
-
393
- end
394
-
395
- describe "#group" do
396
-
397
- before do
398
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
399
- @criteria.instance_variable_set(:@context, @context)
400
- end
401
-
402
- it "delegates to the context" do
403
- @context.expects(:group).returns({})
404
- @criteria.group.should == {}
405
- end
406
-
407
- end
408
-
409
- describe "#initialize" do
410
-
411
- let(:criteria) { Mongoid::Criteria.new(Person) }
412
-
413
- it "sets the selector to an empty hash" do
414
- criteria.selector.should == {}
415
- end
416
-
417
- it "sets the options to an empty hash" do
418
- criteria.options.should == {}
419
- end
420
-
421
- it "sets the documents to an empty array" do
422
- criteria.documents.should == []
423
- end
424
-
425
- it "sets the klass to the given class" do
426
- criteria.klass.should == Person
427
- end
428
-
429
- end
430
-
431
- describe "#last" do
432
-
433
- before do
434
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
435
- @criteria.instance_variable_set(:@context, @context)
436
- end
437
-
438
- it "delegates to the context" do
439
- @context.expects(:last).returns([])
440
- @criteria.last.should == []
441
- end
442
-
443
- end
444
-
445
- describe "#max" do
446
-
447
- before do
448
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
449
- @criteria.instance_variable_set(:@context, @context)
450
- end
451
-
452
- it "delegates to the context" do
453
- @context.expects(:max).with(:field).returns(100)
454
- @criteria.max(:field).should == 100
455
- end
456
-
457
- end
458
-
459
- describe "#merge" do
460
-
461
- before do
462
- @criteria.where(:title => "Sir", :age => 30).skip(40).limit(20)
463
- end
464
-
465
- context "with another criteria" do
466
-
467
- context "when the other has a selector and options" do
468
-
469
- before do
470
- @other = Mongoid::Criteria.new(Person)
471
- @other.where(:name => "Chloe").order_by([[:name, :asc]])
472
- @selector = { :title => "Sir", :age => 30, :name => "Chloe" }
473
- @options = { :skip => 40, :limit => 20, :sort => [[:name, :asc]] }
474
- end
475
-
476
- it "merges the selector and options hashes together" do
477
- @criteria.merge(@other)
478
- @criteria.selector.should == @selector
479
- @criteria.options.should == @options
480
- end
481
-
482
- end
483
-
484
- context "when the other has no selector or options" do
485
-
486
- before do
487
- @other = Mongoid::Criteria.new(Person)
488
- @selector = { :title => "Sir", :age => 30 }
489
- @options = { :skip => 40, :limit => 20 }
490
- end
491
-
492
- it "merges the selector and options hashes together" do
493
- @criteria.merge(@other)
494
- @criteria.selector.should == @selector
495
- @criteria.options.should == @options
496
- end
497
-
498
- end
499
-
500
- context "when the other has a document collection" do
501
-
502
- before do
503
- @documents = [ stub ]
504
- @other = Mongoid::Criteria.new(Person)
505
- @other.documents = @documents
506
- end
507
-
508
- it "merges the documents collection in" do
509
- @criteria.merge(@other)
510
- @criteria.documents.should == @documents
511
- end
512
-
513
- end
514
-
515
- end
516
-
517
- end
518
-
519
- describe "#method_missing" do
520
-
521
- before do
522
- @criteria = Mongoid::Criteria.new(Person)
523
- @criteria.where(:title => "Sir")
524
- end
525
-
526
- it "merges the criteria with the next one" do
527
- @new_criteria = @criteria.accepted
528
- @new_criteria.selector.should == { :title => "Sir", :terms => true }
529
- end
530
-
531
- context "chaining more than one scope" do
532
-
533
- before do
534
- @criteria = Person.accepted.old.knight
535
- end
536
-
537
- it "returns the final merged criteria" do
538
- @criteria.selector.should == { :title => "Sir", :terms => true, :age => { "$gt" => 50 } }
539
- end
540
-
541
- end
542
-
543
- context "when expecting behaviour of an array" do
544
-
545
- before do
546
- @array = mock
547
- @document = mock
548
- end
549
-
550
- describe "#[]" do
551
-
552
- it "collects the criteria and calls []" do
553
- @criteria.expects(:entries).returns([@document])
554
- @criteria[0].should == @document
555
- end
556
-
557
- end
558
-
559
- describe "#rand" do
560
-
561
- it "collects the criteria and call rand" do
562
- @criteria.expects(:entries).returns(@array)
563
- @array.expects(:send).with(:rand).returns(@document)
564
- @criteria.rand
565
- end
566
-
567
- end
568
-
569
- end
570
-
571
- end
572
-
573
- describe "#min" do
574
-
575
- before do
576
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
577
- @criteria.instance_variable_set(:@context, @context)
578
- end
579
-
580
- it "delegates to the context" do
581
- @context.expects(:min).with(:field).returns(100)
582
- @criteria.min(:field).should == 100
583
- end
584
-
585
- end
586
-
587
- describe "#offset" do
588
-
589
- end
590
-
591
- describe "#one" do
592
-
593
- before do
594
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
595
- @criteria.instance_variable_set(:@context, @context)
596
- end
597
-
598
- it "delegates to the context" do
599
- @context.expects(:one)
600
- @criteria.one
601
- end
602
-
603
- end
604
-
605
- describe "#page" do
606
-
607
- before do
608
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
609
- @criteria.instance_variable_set(:@context, @context)
610
- end
611
-
612
- it "delegates to the context" do
613
- @context.expects(:page).returns(1)
614
- @criteria.page.should == 1
615
- end
616
-
617
- end
618
-
619
- describe "#paginate" do
620
-
621
- before do
622
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
623
- @criteria.instance_variable_set(:@context, @context)
624
- end
625
-
626
- it "delegates to the context" do
627
- @context.expects(:paginate).returns([])
628
- @criteria.paginate.should == []
629
- end
630
-
631
- end
632
-
633
- describe "#per_page" do
634
-
635
- before do
636
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
637
- @criteria.instance_variable_set(:@context, @context)
638
- end
639
-
640
- it "delegates to the context" do
641
- @context.expects(:per_page).returns(20)
642
- @criteria.per_page.should == 20
643
- end
644
-
645
- end
646
-
647
- describe "#scoped" do
648
-
649
- before do
650
- @criteria = Person.where(:title => "Sir").skip(20)
651
- end
652
-
653
- it "returns the selector plus the options" do
654
- @criteria.scoped.should == { :where => { :title => "Sir" }, :skip => 20 }
655
- end
656
-
657
- end
658
-
659
- describe "#sum" do
660
-
661
- before do
662
- @context = stub.quacks_like(Mongoid::Contexts::Mongo.allocate)
663
- @criteria.instance_variable_set(:@context, @context)
664
- end
665
-
666
- it "delegates to the context" do
667
- @context.expects(:sum).with(:field).returns(20)
668
- @criteria.sum(:field).should == 20
669
- end
670
-
671
- end
672
-
673
- describe ".translate" do
674
-
675
- context "with a single argument" do
676
-
677
- context "when the arg is a string" do
678
-
679
- before do
680
- @id = Mongo::ObjectID.new.to_s
681
- @document = stub
682
- @criteria = mock
683
- Mongoid::Criteria.expects(:new).returns(@criteria)
684
- end
685
-
686
- it "delegates to #id_criteria" do
687
- @criteria.expects(:id_criteria).with(@id).returns(@document)
688
- Mongoid::Criteria.translate(Person, @id).should == @document
689
- end
690
- end
691
-
692
- context "when the arg is an object id" do
693
-
694
- before do
695
- @id = Mongo::ObjectID.new
696
- @document = stub
697
- @criteria = mock
698
- Mongoid::Criteria.expects(:new).returns(@criteria)
699
- end
700
-
701
- it "delegates to #id_criteria" do
702
- @criteria.expects(:id_criteria).with(@id).returns(@document)
703
- Mongoid::Criteria.translate(Person, @id).should == @document
704
- end
705
- end
706
- end
707
-
708
- context "multiple arguments" do
709
-
710
- context "when an array of ids" do
711
-
712
- before do
713
- @ids = []
714
- @documents = []
715
- 3.times do
716
- @ids << Mongo::ObjectID.new.to_s
717
- @documents << stub
718
- end
719
- @criteria = mock
720
- Mongoid::Criteria.expects(:new).returns(@criteria)
721
- end
722
-
723
- it "delegates to #id_criteria" do
724
- @criteria.expects(:id_criteria).with(@ids).returns(@documents)
725
- Mongoid::Criteria.translate(Person, @ids).should == @documents
726
- end
727
-
728
- end
729
-
730
- context "when Person, :conditions => {}" do
731
-
732
- before do
733
- @criteria = Mongoid::Criteria.translate(Person, :conditions => { :title => "Test" })
734
- end
735
-
736
- it "returns a criteria with a selector from the conditions" do
737
- @criteria.selector.should == { :title => "Test" }
738
- end
739
-
740
- it "returns a criteria with klass Person" do
741
- @criteria.klass.should == Person
742
- end
743
-
744
- end
745
-
746
- context "when Person, :conditions => {:id => id}" do
747
-
748
- before do
749
- @criteria = Mongoid::Criteria.translate(Person, :conditions => { :id => "1234e567" })
750
- end
751
-
752
- it "returns a criteria with a selector from the conditions" do
753
- @criteria.selector.should == { :_id => "1234e567" }
754
- end
755
-
756
- it "returns a criteria with klass Person" do
757
- @criteria.klass.should == Person
758
- end
759
-
760
- end
761
-
762
- context "when :all, :conditions => {}" do
763
-
764
- before do
765
- @criteria = Mongoid::Criteria.translate(Person, :conditions => { :title => "Test" })
766
- end
767
-
768
- it "returns a criteria with a selector from the conditions" do
769
- @criteria.selector.should == { :title => "Test" }
770
- end
771
-
772
- it "returns a criteria with klass Person" do
773
- @criteria.klass.should == Person
774
- end
775
-
776
- end
777
-
778
- context "when :last, :conditions => {}" do
779
-
780
- before do
781
- @criteria = Mongoid::Criteria.translate(Person, :conditions => { :title => "Test" })
782
- end
783
-
784
- it "returns a criteria with a selector from the conditions" do
785
- @criteria.selector.should == { :title => "Test" }
786
- end
787
-
788
- it "returns a criteria with klass Person" do
789
- @criteria.klass.should == Person
790
- end
791
- end
792
-
793
- context "when options are provided" do
794
-
795
- before do
796
- @criteria = Mongoid::Criteria.translate(Person, :conditions => { :title => "Test" }, :skip => 10)
797
- end
798
-
799
- it "adds the criteria and the options" do
800
- @criteria.selector.should == { :title => "Test" }
801
- @criteria.options.should == { :skip => 10 }
802
- end
803
-
804
- end
805
-
806
- end
807
-
808
- end
809
-
810
- context "#fuse" do
811
-
812
- it ":where => {:title => 'Test'} returns a criteria with the correct selector" do
813
- @result = @criteria.fuse(:where => { :title => 'Test' })
814
- @result.selector[:title].should == 'Test'
815
- end
816
-
817
- it ":where => {:title => 'Test'}, :skip => 10 returns a criteria with the correct selector and options" do
818
- @result = @criteria.fuse(:where => { :title => 'Test' }, :skip => 10)
819
- @result.selector[:title].should == 'Test'
820
- @result.options.should == { :skip => 10 }
821
- end
822
- end
823
-
824
- end