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,172 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Config do
4
-
5
- after :all do
6
- config.raise_not_found_error = true
7
- end
8
-
9
- let(:config) { Mongoid::Config.instance }
10
-
11
- describe "#database=" do
12
-
13
- context "when object provided is not a Mongo::DB" do
14
-
15
- it "raises an error" do
16
- lambda { config.database = "Test" }.should raise_error
17
- end
18
-
19
- end
20
-
21
- end
22
-
23
- describe "#master=" do
24
-
25
- context "when object provided is not a Mongo::DB" do
26
-
27
- it "raises an error" do
28
- lambda { config.master = "Test" }.should raise_error
29
- end
30
-
31
- end
32
-
33
- end
34
-
35
- describe "#parameterize_keys" do
36
-
37
- it "defaults to true" do
38
- config.parameterize_keys.should == true
39
- end
40
- end
41
-
42
- describe "#persist_types" do
43
-
44
- it "defaults to true" do
45
- config.persist_types.should == true
46
- end
47
- end
48
-
49
- describe "#persist_in_safe_mode=" do
50
-
51
- context "when setting to true" do
52
-
53
- before do
54
- config.persist_in_safe_mode = true
55
- end
56
-
57
- it "sets the value" do
58
- config.persist_in_safe_mode.should == true
59
- end
60
-
61
- end
62
-
63
- context "when setting to false" do
64
-
65
- before do
66
- config.persist_in_safe_mode = false
67
- end
68
-
69
- it "sets the value" do
70
- config.persist_in_safe_mode.should == false
71
- end
72
-
73
- end
74
-
75
- end
76
-
77
- describe "#raise_not_found_error=" do
78
-
79
- context "when setting to true" do
80
-
81
- before do
82
- config.raise_not_found_error = true
83
- end
84
-
85
- it "sets the value" do
86
- config.raise_not_found_error.should == true
87
- end
88
-
89
- end
90
-
91
- context "when setting to false" do
92
-
93
- before do
94
- config.raise_not_found_error = false
95
- end
96
-
97
- it "sets the value" do
98
- config.raise_not_found_error.should == false
99
- end
100
-
101
- end
102
-
103
- end
104
-
105
- describe "#reconnect_time" do
106
-
107
- it "defaults to 3" do
108
- config.reconnect_time.should == 3
109
- end
110
-
111
- end
112
-
113
- describe "#reconnect_time=" do
114
-
115
- after do
116
- config.reconnect_time = 3
117
- end
118
-
119
- it "sets the time" do
120
- config.reconnect_time = 5
121
- config.reconnect_time.should == 5
122
- end
123
- end
124
-
125
- describe "#slaves=" do
126
-
127
- context "when object provided is not a Mongo::DB" do
128
-
129
- it "raises an error" do
130
- lambda { config.slaves = ["Test"] }.should raise_error
131
- end
132
-
133
- end
134
-
135
- end
136
-
137
- describe "#allow_dynamic_fields=" do
138
-
139
- context "when setting to true" do
140
-
141
- before do
142
- config.allow_dynamic_fields = true
143
- end
144
-
145
- it "sets the value" do
146
- config.allow_dynamic_fields.should == true
147
- end
148
-
149
- end
150
-
151
- context "when setting to false" do
152
-
153
- before do
154
- config.allow_dynamic_fields = false
155
- end
156
-
157
- it "sets the value" do
158
- config.allow_dynamic_fields.should == false
159
- end
160
-
161
- end
162
-
163
- end
164
-
165
- describe "#use_object_ids" do
166
-
167
- it "defaults to false" do
168
- config.use_object_ids.should == false
169
- end
170
- end
171
-
172
- end
@@ -1,421 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Contexts::Enumerable do
4
-
5
- before do
6
- @london = Address.new(:number => 1, :street => "Bond Street")
7
- @shanghai = Address.new(:number => 10, :street => "Nan Jing Dong Lu")
8
- @melbourne = Address.new(:number => 20, :street => "Bourke Street")
9
- @new_york = Address.new(:number => 20, :street => "Broadway")
10
- @docs = [ @london, @shanghai, @melbourne, @new_york ]
11
- @criteria = Mongoid::Criteria.new(Address)
12
- @criteria.documents = @docs
13
- @criteria.where(:street => "Bourke Street").only(:number)
14
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
15
- end
16
-
17
- describe "#aggregate" do
18
-
19
- before do
20
- @counts = @context.aggregate
21
- end
22
-
23
- it "groups by the fields provided in the options" do
24
- @counts.size.should == 3
25
- end
26
-
27
- it "stores the counts in proper groups" do
28
- @counts[1].should == 1
29
- @counts[10].should == 1
30
- @counts[20].should == 2
31
- end
32
- end
33
-
34
- describe "#avg" do
35
-
36
- it "returns the avg value for the supplied field" do
37
- @context.avg(:number).should == 12.75
38
- end
39
- end
40
-
41
- describe "#count" do
42
-
43
- it "returns the size of the enumerable" do
44
- @context.count.should == 4
45
- end
46
-
47
- end
48
-
49
- describe "#distinct" do
50
-
51
- context "when the criteria is limited" do
52
-
53
- it "returns an array of distinct values for the field" do
54
- @context.distinct(:street).should == [ "Bourke Street" ]
55
- end
56
- end
57
-
58
- context "when the criteria is not limited" do
59
-
60
- before do
61
- @criteria = Mongoid::Criteria.new(Address)
62
- @criteria.documents = @docs
63
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
64
- end
65
-
66
- it "returns an array of distinct values for the field" do
67
- @context.distinct(:street).should ==
68
- [ "Bond Street", "Nan Jing Dong Lu", "Bourke Street", "Broadway" ]
69
- end
70
- end
71
- end
72
-
73
- describe "#execute" do
74
-
75
- before do
76
- @criteria = Mongoid::Criteria.new(Address)
77
- @criteria.documents = @docs
78
- end
79
-
80
- it "returns the matching documents from the array" do
81
- @context.execute.should == [ @melbourne ]
82
- end
83
-
84
- context "when selector is empty" do
85
-
86
- before do
87
- @criteria.only(:number)
88
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
89
- end
90
-
91
- it "returns all the documents" do
92
- @context.execute.should == @docs
93
- end
94
- end
95
-
96
- context "when skip and limit are in the options" do
97
-
98
- before do
99
- @criteria.skip(2).limit(2)
100
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
101
- end
102
-
103
- it "properly narrows down the matching results" do
104
- @context.execute.should == [ @melbourne, @new_york ]
105
- end
106
- end
107
-
108
- context "when limit is set without skip in the options" do
109
-
110
- before do
111
- @criteria.limit(2)
112
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
113
- end
114
-
115
- it "properly narrows down the matching results" do
116
- @context.execute.size.should == 2
117
- end
118
-
119
- end
120
-
121
- end
122
-
123
- describe "#first" do
124
-
125
- context "when a selector is present" do
126
-
127
- it "returns the first that matches the selector" do
128
- @context.first.should == @melbourne
129
- end
130
- end
131
-
132
- end
133
-
134
- describe "#group" do
135
-
136
- before do
137
- @group = @context.group
138
- end
139
-
140
- it "groups by the fields provided in the options" do
141
- @group.size.should == 3
142
- end
143
-
144
- it "stores the documents in proper groups" do
145
- @group[1].should == [ @london ]
146
- @group[10].should == [ @shanghai ]
147
- @group[20].should == [ @melbourne, @new_york ]
148
- end
149
-
150
- end
151
-
152
- describe ".initialize" do
153
-
154
- let(:selector) { { :field => "value" } }
155
- let(:options) { { :skip => 20 } }
156
- let(:documents) { [stub] }
157
-
158
- before do
159
- @criteria = Mongoid::Criteria.new(Address)
160
- @criteria.documents = documents
161
- @criteria.where(selector).skip(20)
162
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
163
- end
164
-
165
- it "sets the selector" do
166
- @context.selector.should == selector
167
- end
168
-
169
- it "sets the options" do
170
- @context.options.should == options
171
- end
172
-
173
- it "sets the documents" do
174
- @context.documents.should == documents
175
- end
176
-
177
- end
178
-
179
- describe "#iterate" do
180
- before do
181
- @criteria.where(:street => "Bourke Street")
182
- @criteria.documents = @docs
183
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
184
- end
185
-
186
- it "executes the criteria" do
187
- acc = []
188
- @context.iterate do |doc|
189
- acc << doc
190
- end
191
- acc.should == [@melbourne]
192
- end
193
- end
194
-
195
- describe "#last" do
196
-
197
- it "returns the last matching in the enumerable" do
198
- @context.last.should == @melbourne
199
- end
200
-
201
- end
202
-
203
- describe "#max" do
204
-
205
- it "returns the max value for the supplied field" do
206
- @context.max(:number).should == 20
207
- end
208
-
209
- end
210
-
211
- describe "#min" do
212
-
213
- it "returns the min value for the supplied field" do
214
- @context.min(:number).should == 1
215
- end
216
-
217
- end
218
-
219
- describe "#one" do
220
-
221
- it "returns the first matching in the enumerable" do
222
- @context.one.should == @melbourne
223
- end
224
-
225
- end
226
-
227
- describe "#page" do
228
-
229
- context "when the page option exists" do
230
-
231
- before do
232
- @criteria = Mongoid::Criteria.new(Person).extras({ :page => 5 })
233
- @criteria.documents = []
234
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
235
- end
236
-
237
- it "returns the page option" do
238
- @context.page.should == 5
239
- end
240
-
241
- end
242
-
243
- context "when the page option does not exist" do
244
-
245
- before do
246
- @criteria = Mongoid::Criteria.new(Person)
247
- @criteria.documents = []
248
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
249
- end
250
-
251
- it "returns 1" do
252
- @context.page.should == 1
253
- end
254
-
255
- end
256
-
257
- end
258
-
259
- describe "#paginate" do
260
-
261
- before do
262
- @criteria = Person.criteria.skip(2).limit(2)
263
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
264
- @results = @context.paginate
265
- end
266
-
267
- it "executes and paginates the results" do
268
- @results.current_page.should == 2
269
- @results.per_page.should == 2
270
- end
271
-
272
- end
273
-
274
- describe "#per_page" do
275
-
276
- context "when a limit option exists" do
277
-
278
- it "returns 20" do
279
- @context.per_page.should == 20
280
- end
281
-
282
- end
283
-
284
- context "when a limit option does not exist" do
285
-
286
- before do
287
- @criteria = Person.criteria.limit(50)
288
- @criteria.documents = []
289
- @context = Mongoid::Contexts::Enumerable.new(@criteria)
290
- end
291
-
292
- it "returns the limit" do
293
- @context.per_page.should == 50
294
- end
295
-
296
- end
297
-
298
- end
299
-
300
- describe "#sum" do
301
-
302
- it "returns the sum of all the field values" do
303
- @context.sum(:number).should == 51
304
- end
305
-
306
- end
307
-
308
- context "#id_criteria" do
309
-
310
- let(:criteria) do
311
- criteria = Mongoid::Criteria.new(Address)
312
- criteria.documents = []
313
- criteria
314
- end
315
- let(:context) { criteria.context }
316
-
317
- context "with a single argument" do
318
-
319
- let(:id) { Mongo::ObjectID.new.to_s }
320
-
321
- before do
322
- criteria.expects(:id).with(id).returns(criteria)
323
- end
324
-
325
- context "when the document is found" do
326
-
327
- let(:document) { stub }
328
-
329
- it "returns a matching document" do
330
- context.expects(:one).returns(document)
331
- document.expects(:blank? => false)
332
- context.id_criteria(id).should == document
333
- end
334
-
335
- end
336
-
337
- context "when the document is not found" do
338
-
339
- it "raises an error" do
340
- context.expects(:one).returns(nil)
341
- lambda { context.id_criteria(id) }.should raise_error
342
- end
343
-
344
- end
345
-
346
- end
347
-
348
- context "multiple arguments" do
349
-
350
- context "when an array of ids" do
351
-
352
- let(:ids) do
353
- (0..2).inject([]) { |ary, i| ary << Mongo::ObjectID.new.to_s }
354
- end
355
-
356
- context "when documents are found" do
357
-
358
- let(:docs) do
359
- (0..2).inject([]) { |ary, i| ary << stub }
360
- end
361
-
362
- before do
363
- criteria.expects(:id).with(ids).returns(criteria)
364
- end
365
-
366
- it "returns matching documents" do
367
- context.expects(:execute).returns(docs)
368
- context.id_criteria(ids).should == docs
369
- end
370
-
371
- end
372
-
373
- context "when documents are not found" do
374
-
375
- it "raises an error" do
376
- context.expects(:execute).returns([])
377
- lambda { context.id_criteria(ids) }.should raise_error
378
- end
379
-
380
- end
381
-
382
- end
383
-
384
- context "when an array of object ids" do
385
-
386
- let(:ids) do
387
- (0..2).inject([]) { |ary, i| ary << Mongo::ObjectID.new }
388
- end
389
-
390
- context "when documents are found" do
391
-
392
- let(:docs) do
393
- (0..2).inject([]) { |ary, i| ary << stub }
394
- end
395
-
396
- before do
397
- criteria.expects(:id).with(ids).returns(criteria)
398
- end
399
-
400
- it "returns matching documents" do
401
- context.expects(:execute).returns(docs)
402
- context.id_criteria(ids).should == docs
403
- end
404
-
405
- end
406
-
407
- context "when documents are not found" do
408
-
409
- it "raises an error" do
410
- context.expects(:execute).returns([])
411
- lambda { context.id_criteria(ids) }.should raise_error
412
- end
413
-
414
- end
415
-
416
- end
417
- end
418
-
419
- end
420
-
421
- end