mongoid 2.0.0.alpha → 2.0.0.beta.5

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.
Files changed (216) hide show
  1. data/lib/mongoid.rb +11 -5
  2. data/lib/mongoid/associations.rb +112 -107
  3. data/lib/mongoid/associations/belongs_to_related.rb +2 -3
  4. data/lib/mongoid/associations/embedded_in.rb +12 -4
  5. data/lib/mongoid/associations/{embed_many.rb → embeds_many.rb} +101 -32
  6. data/lib/mongoid/associations/{embed_one.rb → embeds_one.rb} +10 -10
  7. data/lib/mongoid/associations/has_many_related.rb +51 -5
  8. data/lib/mongoid/associations/has_one_related.rb +9 -5
  9. data/lib/mongoid/associations/meta_data.rb +2 -1
  10. data/lib/mongoid/associations/options.rb +15 -6
  11. data/lib/mongoid/associations/proxy.rb +14 -21
  12. data/lib/mongoid/attributes.rb +34 -13
  13. data/lib/mongoid/callbacks.rb +1 -2
  14. data/lib/mongoid/collection.rb +4 -3
  15. data/lib/mongoid/collections.rb +41 -0
  16. data/lib/mongoid/collections/master.rb +3 -2
  17. data/lib/mongoid/collections/slaves.rb +3 -2
  18. data/lib/mongoid/components.rb +4 -1
  19. data/lib/mongoid/config.rb +163 -13
  20. data/lib/mongoid/contexts.rb +1 -2
  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/criteria.rb +13 -22
  25. data/lib/mongoid/criterion/exclusion.rb +3 -3
  26. data/lib/mongoid/criterion/inclusion.rb +17 -0
  27. data/lib/mongoid/criterion/optional.rb +1 -1
  28. data/lib/mongoid/dirty.rb +253 -0
  29. data/lib/mongoid/document.rb +40 -85
  30. data/lib/mongoid/errors.rb +48 -1
  31. data/lib/mongoid/extensions.rb +11 -9
  32. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  33. data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
  34. data/lib/mongoid/extensions/date/conversions.rb +13 -4
  35. data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
  36. data/lib/mongoid/extensions/float/conversions.rb +5 -1
  37. data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
  38. data/lib/mongoid/extensions/hash/conversions.rb +34 -4
  39. data/lib/mongoid/extensions/integer/conversions.rb +5 -1
  40. data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
  41. data/lib/mongoid/extensions/object/conversions.rb +3 -3
  42. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  43. data/lib/mongoid/extensions/symbol/inflections.rb +5 -2
  44. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  45. data/lib/mongoid/factory.rb +2 -1
  46. data/lib/mongoid/field.rb +15 -2
  47. data/lib/mongoid/fields.rb +1 -1
  48. data/lib/mongoid/identity.rb +3 -3
  49. data/lib/mongoid/indexes.rb +3 -3
  50. data/lib/mongoid/matchers.rb +1 -2
  51. data/lib/mongoid/memoization.rb +8 -2
  52. data/lib/mongoid/named_scope.rb +0 -5
  53. data/lib/mongoid/observable.rb +1 -1
  54. data/lib/mongoid/paths.rb +30 -22
  55. data/lib/mongoid/persistence.rb +218 -0
  56. data/lib/mongoid/persistence/command.rb +39 -0
  57. data/lib/mongoid/persistence/insert.rb +47 -0
  58. data/lib/mongoid/persistence/insert_embedded.rb +38 -0
  59. data/lib/mongoid/persistence/remove.rb +39 -0
  60. data/lib/mongoid/persistence/remove_all.rb +37 -0
  61. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  62. data/lib/mongoid/persistence/update.rb +63 -0
  63. data/lib/mongoid/railtie.rb +53 -0
  64. data/lib/mongoid/railties/database.rake +37 -0
  65. data/lib/mongoid/timestamps.rb +2 -2
  66. data/lib/mongoid/validations.rb +2 -2
  67. data/lib/mongoid/validations/associated.rb +2 -2
  68. data/lib/mongoid/validations/uniqueness.rb +13 -2
  69. data/lib/mongoid/version.rb +4 -0
  70. data/lib/mongoid/versioning.rb +3 -2
  71. data/lib/rails/generators/mongoid/config/config_generator.rb +41 -0
  72. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
  73. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  74. data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
  75. data/lib/rails/generators/mongoid_generator.rb +61 -0
  76. metadata +76 -301
  77. data/.gitignore +0 -6
  78. data/.watchr +0 -29
  79. data/Rakefile +0 -52
  80. data/VERSION +0 -1
  81. data/caliper.yml +0 -4
  82. data/lib/mongoid/collections/mimic.rb +0 -46
  83. data/lib/mongoid/commands.rb +0 -161
  84. data/lib/mongoid/commands/create.rb +0 -19
  85. data/lib/mongoid/commands/delete.rb +0 -16
  86. data/lib/mongoid/commands/delete_all.rb +0 -23
  87. data/lib/mongoid/commands/deletion.rb +0 -18
  88. data/lib/mongoid/commands/destroy.rb +0 -17
  89. data/lib/mongoid/commands/destroy_all.rb +0 -23
  90. data/lib/mongoid/commands/save.rb +0 -29
  91. data/lib/mongoid/extensions/time/conversions.rb +0 -18
  92. data/mongoid.gemspec +0 -408
  93. data/perf/benchmark.rb +0 -77
  94. data/spec/integration/mongoid/associations_spec.rb +0 -340
  95. data/spec/integration/mongoid/attributes_spec.rb +0 -22
  96. data/spec/integration/mongoid/commands_spec.rb +0 -227
  97. data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
  98. data/spec/integration/mongoid/criteria_spec.rb +0 -272
  99. data/spec/integration/mongoid/document_spec.rb +0 -650
  100. data/spec/integration/mongoid/extensions_spec.rb +0 -22
  101. data/spec/integration/mongoid/finders_spec.rb +0 -119
  102. data/spec/integration/mongoid/inheritance_spec.rb +0 -137
  103. data/spec/integration/mongoid/named_scope_spec.rb +0 -46
  104. data/spec/models/address.rb +0 -39
  105. data/spec/models/animal.rb +0 -6
  106. data/spec/models/callbacks.rb +0 -18
  107. data/spec/models/comment.rb +0 -8
  108. data/spec/models/country_code.rb +0 -6
  109. data/spec/models/employer.rb +0 -5
  110. data/spec/models/game.rb +0 -7
  111. data/spec/models/inheritance.rb +0 -56
  112. data/spec/models/location.rb +0 -5
  113. data/spec/models/mixed_drink.rb +0 -4
  114. data/spec/models/name.rb +0 -13
  115. data/spec/models/namespacing.rb +0 -11
  116. data/spec/models/patient.rb +0 -4
  117. data/spec/models/person.rb +0 -99
  118. data/spec/models/pet.rb +0 -7
  119. data/spec/models/pet_owner.rb +0 -6
  120. data/spec/models/phone.rb +0 -7
  121. data/spec/models/post.rb +0 -15
  122. data/spec/models/translation.rb +0 -5
  123. data/spec/models/vet_visit.rb +0 -5
  124. data/spec/spec.opts +0 -3
  125. data/spec/spec_helper.rb +0 -31
  126. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
  127. data/spec/unit/mongoid/associations/embed_many_spec.rb +0 -516
  128. data/spec/unit/mongoid/associations/embed_one_spec.rb +0 -282
  129. data/spec/unit/mongoid/associations/embedded_in_spec.rb +0 -193
  130. data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -418
  131. data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
  132. data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
  133. data/spec/unit/mongoid/associations/options_spec.rb +0 -192
  134. data/spec/unit/mongoid/associations_spec.rb +0 -595
  135. data/spec/unit/mongoid/attributes_spec.rb +0 -507
  136. data/spec/unit/mongoid/callbacks_spec.rb +0 -55
  137. data/spec/unit/mongoid/collection_spec.rb +0 -187
  138. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
  139. data/spec/unit/mongoid/collections/master_spec.rb +0 -41
  140. data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
  141. data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
  142. data/spec/unit/mongoid/commands/create_spec.rb +0 -31
  143. data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
  144. data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
  145. data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -21
  146. data/spec/unit/mongoid/commands/destroy_spec.rb +0 -51
  147. data/spec/unit/mongoid/commands/save_spec.rb +0 -107
  148. data/spec/unit/mongoid/commands_spec.rb +0 -270
  149. data/spec/unit/mongoid/config_spec.rb +0 -172
  150. data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
  151. data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
  152. data/spec/unit/mongoid/contexts_spec.rb +0 -25
  153. data/spec/unit/mongoid/criteria_spec.rb +0 -824
  154. data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
  155. data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
  156. data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
  157. data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
  158. data/spec/unit/mongoid/cursor_spec.rb +0 -74
  159. data/spec/unit/mongoid/deprecation_spec.rb +0 -24
  160. data/spec/unit/mongoid/document_spec.rb +0 -818
  161. data/spec/unit/mongoid/errors_spec.rb +0 -103
  162. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
  163. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
  164. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
  165. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
  166. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
  167. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
  168. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
  169. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
  170. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -67
  171. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
  172. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
  173. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
  174. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
  175. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
  176. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
  177. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
  178. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
  179. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
  180. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
  181. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
  182. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
  183. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
  184. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
  185. data/spec/unit/mongoid/extras_spec.rb +0 -102
  186. data/spec/unit/mongoid/factory_spec.rb +0 -31
  187. data/spec/unit/mongoid/field_spec.rb +0 -143
  188. data/spec/unit/mongoid/fields_spec.rb +0 -181
  189. data/spec/unit/mongoid/finders_spec.rb +0 -404
  190. data/spec/unit/mongoid/identity_spec.rb +0 -109
  191. data/spec/unit/mongoid/indexes_spec.rb +0 -93
  192. data/spec/unit/mongoid/javascript_spec.rb +0 -48
  193. data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
  194. data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
  195. data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
  196. data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
  197. data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
  198. data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
  199. data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
  200. data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
  201. data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
  202. data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
  203. data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
  204. data/spec/unit/mongoid/matchers_spec.rb +0 -329
  205. data/spec/unit/mongoid/memoization_spec.rb +0 -75
  206. data/spec/unit/mongoid/named_scope_spec.rb +0 -123
  207. data/spec/unit/mongoid/observable_spec.rb +0 -46
  208. data/spec/unit/mongoid/paths_spec.rb +0 -124
  209. data/spec/unit/mongoid/scope_spec.rb +0 -240
  210. data/spec/unit/mongoid/state_spec.rb +0 -83
  211. data/spec/unit/mongoid/timestamps_spec.rb +0 -25
  212. data/spec/unit/mongoid/validations/associated_spec.rb +0 -103
  213. data/spec/unit/mongoid/validations/uniqueness_spec.rb +0 -47
  214. data/spec/unit/mongoid/validations_spec.rb +0 -190
  215. data/spec/unit/mongoid/versioning_spec.rb +0 -41
  216. 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