mongoid-pre 2.0.0.beta1

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 (246) hide show
  1. data/.gitignore +6 -0
  2. data/.watchr +24 -0
  3. data/MIT_LICENSE +20 -0
  4. data/README.rdoc +49 -0
  5. data/Rakefile +52 -0
  6. data/VERSION +1 -0
  7. data/caliper.yml +4 -0
  8. data/lib/mongoid.rb +135 -0
  9. data/lib/mongoid/associations.rb +263 -0
  10. data/lib/mongoid/associations/belongs_to_related.rb +59 -0
  11. data/lib/mongoid/associations/embedded_in.rb +64 -0
  12. data/lib/mongoid/associations/embeds_many.rb +193 -0
  13. data/lib/mongoid/associations/embeds_one.rb +95 -0
  14. data/lib/mongoid/associations/has_many_related.rb +133 -0
  15. data/lib/mongoid/associations/has_one_related.rb +81 -0
  16. data/lib/mongoid/associations/meta_data.rb +28 -0
  17. data/lib/mongoid/associations/options.rb +52 -0
  18. data/lib/mongoid/associations/proxy.rb +31 -0
  19. data/lib/mongoid/attributes.rb +185 -0
  20. data/lib/mongoid/callbacks.rb +18 -0
  21. data/lib/mongoid/collection.rb +119 -0
  22. data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
  23. data/lib/mongoid/collections/master.rb +28 -0
  24. data/lib/mongoid/collections/mimic.rb +46 -0
  25. data/lib/mongoid/collections/operations.rb +41 -0
  26. data/lib/mongoid/collections/slaves.rb +44 -0
  27. data/lib/mongoid/commands.rb +161 -0
  28. data/lib/mongoid/commands/create.rb +19 -0
  29. data/lib/mongoid/commands/delete.rb +16 -0
  30. data/lib/mongoid/commands/delete_all.rb +25 -0
  31. data/lib/mongoid/commands/deletion.rb +18 -0
  32. data/lib/mongoid/commands/destroy.rb +17 -0
  33. data/lib/mongoid/commands/destroy_all.rb +25 -0
  34. data/lib/mongoid/commands/save.rb +30 -0
  35. data/lib/mongoid/components.rb +31 -0
  36. data/lib/mongoid/config.rb +86 -0
  37. data/lib/mongoid/contexts.rb +25 -0
  38. data/lib/mongoid/contexts/enumerable.rb +151 -0
  39. data/lib/mongoid/contexts/ids.rb +25 -0
  40. data/lib/mongoid/contexts/mongo.rb +285 -0
  41. data/lib/mongoid/contexts/paging.rb +42 -0
  42. data/lib/mongoid/criteria.rb +239 -0
  43. data/lib/mongoid/criterion/complex.rb +21 -0
  44. data/lib/mongoid/criterion/exclusion.rb +65 -0
  45. data/lib/mongoid/criterion/inclusion.rb +93 -0
  46. data/lib/mongoid/criterion/optional.rb +136 -0
  47. data/lib/mongoid/cursor.rb +82 -0
  48. data/lib/mongoid/deprecation.rb +22 -0
  49. data/lib/mongoid/dirty.rb +203 -0
  50. data/lib/mongoid/document.rb +306 -0
  51. data/lib/mongoid/errors.rb +77 -0
  52. data/lib/mongoid/extensions.rb +99 -0
  53. data/lib/mongoid/extensions/array/accessors.rb +17 -0
  54. data/lib/mongoid/extensions/array/aliasing.rb +4 -0
  55. data/lib/mongoid/extensions/array/assimilation.rb +26 -0
  56. data/lib/mongoid/extensions/array/conversions.rb +27 -0
  57. data/lib/mongoid/extensions/array/parentization.rb +13 -0
  58. data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
  59. data/lib/mongoid/extensions/binary/conversions.rb +17 -0
  60. data/lib/mongoid/extensions/boolean/conversions.rb +16 -0
  61. data/lib/mongoid/extensions/date/conversions.rb +15 -0
  62. data/lib/mongoid/extensions/datetime/conversions.rb +17 -0
  63. data/lib/mongoid/extensions/float/conversions.rb +16 -0
  64. data/lib/mongoid/extensions/hash/accessors.rb +38 -0
  65. data/lib/mongoid/extensions/hash/assimilation.rb +30 -0
  66. data/lib/mongoid/extensions/hash/conversions.rb +15 -0
  67. data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
  68. data/lib/mongoid/extensions/hash/scoping.rb +12 -0
  69. data/lib/mongoid/extensions/integer/conversions.rb +16 -0
  70. data/lib/mongoid/extensions/nil/assimilation.rb +13 -0
  71. data/lib/mongoid/extensions/object/conversions.rb +27 -0
  72. data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
  73. data/lib/mongoid/extensions/proc/scoping.rb +12 -0
  74. data/lib/mongoid/extensions/string/conversions.rb +15 -0
  75. data/lib/mongoid/extensions/string/inflections.rb +97 -0
  76. data/lib/mongoid/extensions/symbol/inflections.rb +36 -0
  77. data/lib/mongoid/extensions/time/conversions.rb +18 -0
  78. data/lib/mongoid/extras.rb +61 -0
  79. data/lib/mongoid/factory.rb +19 -0
  80. data/lib/mongoid/field.rb +52 -0
  81. data/lib/mongoid/fields.rb +62 -0
  82. data/lib/mongoid/finders.rb +136 -0
  83. data/lib/mongoid/identity.rb +39 -0
  84. data/lib/mongoid/indexes.rb +27 -0
  85. data/lib/mongoid/javascript.rb +21 -0
  86. data/lib/mongoid/javascript/functions.yml +37 -0
  87. data/lib/mongoid/matchers.rb +36 -0
  88. data/lib/mongoid/matchers/all.rb +11 -0
  89. data/lib/mongoid/matchers/default.rb +26 -0
  90. data/lib/mongoid/matchers/exists.rb +13 -0
  91. data/lib/mongoid/matchers/gt.rb +11 -0
  92. data/lib/mongoid/matchers/gte.rb +11 -0
  93. data/lib/mongoid/matchers/in.rb +11 -0
  94. data/lib/mongoid/matchers/lt.rb +11 -0
  95. data/lib/mongoid/matchers/lte.rb +11 -0
  96. data/lib/mongoid/matchers/ne.rb +11 -0
  97. data/lib/mongoid/matchers/nin.rb +11 -0
  98. data/lib/mongoid/matchers/size.rb +11 -0
  99. data/lib/mongoid/memoization.rb +27 -0
  100. data/lib/mongoid/named_scope.rb +42 -0
  101. data/lib/mongoid/observable.rb +30 -0
  102. data/lib/mongoid/paths.rb +54 -0
  103. data/lib/mongoid/persistence.rb +27 -0
  104. data/lib/mongoid/persistence/command.rb +20 -0
  105. data/lib/mongoid/persistence/insert.rb +71 -0
  106. data/lib/mongoid/persistence/update.rb +78 -0
  107. data/lib/mongoid/scope.rb +75 -0
  108. data/lib/mongoid/state.rb +32 -0
  109. data/lib/mongoid/timestamps.rb +27 -0
  110. data/lib/mongoid/validations.rb +51 -0
  111. data/lib/mongoid/validations/associated.rb +32 -0
  112. data/lib/mongoid/validations/locale/en.yml +4 -0
  113. data/lib/mongoid/validations/uniqueness.rb +22 -0
  114. data/lib/mongoid/versioning.rb +26 -0
  115. data/mongoid.gemspec +413 -0
  116. data/perf/benchmark.rb +77 -0
  117. data/spec/integration/mongoid/associations_spec.rb +340 -0
  118. data/spec/integration/mongoid/attributes_spec.rb +22 -0
  119. data/spec/integration/mongoid/commands_spec.rb +230 -0
  120. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  121. data/spec/integration/mongoid/criteria_spec.rb +272 -0
  122. data/spec/integration/mongoid/dirty_spec.rb +70 -0
  123. data/spec/integration/mongoid/document_spec.rb +650 -0
  124. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  125. data/spec/integration/mongoid/finders_spec.rb +119 -0
  126. data/spec/integration/mongoid/inheritance_spec.rb +137 -0
  127. data/spec/integration/mongoid/named_scope_spec.rb +46 -0
  128. data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
  129. data/spec/models/address.rb +39 -0
  130. data/spec/models/animal.rb +6 -0
  131. data/spec/models/callbacks.rb +18 -0
  132. data/spec/models/comment.rb +8 -0
  133. data/spec/models/country_code.rb +6 -0
  134. data/spec/models/employer.rb +5 -0
  135. data/spec/models/game.rb +7 -0
  136. data/spec/models/inheritance.rb +56 -0
  137. data/spec/models/location.rb +5 -0
  138. data/spec/models/mixed_drink.rb +4 -0
  139. data/spec/models/name.rb +13 -0
  140. data/spec/models/namespacing.rb +11 -0
  141. data/spec/models/patient.rb +6 -0
  142. data/spec/models/person.rb +99 -0
  143. data/spec/models/pet.rb +7 -0
  144. data/spec/models/pet_owner.rb +6 -0
  145. data/spec/models/phone.rb +7 -0
  146. data/spec/models/post.rb +15 -0
  147. data/spec/models/translation.rb +5 -0
  148. data/spec/models/vet_visit.rb +5 -0
  149. data/spec/spec.opts +3 -0
  150. data/spec/spec_helper.rb +31 -0
  151. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +145 -0
  152. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  153. data/spec/unit/mongoid/associations/embeds_many_spec.rb +516 -0
  154. data/spec/unit/mongoid/associations/embeds_one_spec.rb +282 -0
  155. data/spec/unit/mongoid/associations/has_many_related_spec.rb +418 -0
  156. data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
  157. data/spec/unit/mongoid/associations/meta_data_spec.rb +88 -0
  158. data/spec/unit/mongoid/associations/options_spec.rb +192 -0
  159. data/spec/unit/mongoid/associations_spec.rb +595 -0
  160. data/spec/unit/mongoid/attributes_spec.rb +507 -0
  161. data/spec/unit/mongoid/callbacks_spec.rb +55 -0
  162. data/spec/unit/mongoid/collection_spec.rb +187 -0
  163. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  164. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  165. data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
  166. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  167. data/spec/unit/mongoid/commands/create_spec.rb +31 -0
  168. data/spec/unit/mongoid/commands/delete_all_spec.rb +59 -0
  169. data/spec/unit/mongoid/commands/delete_spec.rb +38 -0
  170. data/spec/unit/mongoid/commands/destroy_all_spec.rb +21 -0
  171. data/spec/unit/mongoid/commands/destroy_spec.rb +51 -0
  172. data/spec/unit/mongoid/commands/save_spec.rb +107 -0
  173. data/spec/unit/mongoid/commands_spec.rb +270 -0
  174. data/spec/unit/mongoid/config_spec.rb +176 -0
  175. data/spec/unit/mongoid/contexts/enumerable_spec.rb +421 -0
  176. data/spec/unit/mongoid/contexts/mongo_spec.rb +682 -0
  177. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  178. data/spec/unit/mongoid/criteria_spec.rb +824 -0
  179. data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
  180. data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
  181. data/spec/unit/mongoid/criterion/inclusion_spec.rb +219 -0
  182. data/spec/unit/mongoid/criterion/optional_spec.rb +319 -0
  183. data/spec/unit/mongoid/cursor_spec.rb +74 -0
  184. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  185. data/spec/unit/mongoid/dirty_spec.rb +286 -0
  186. data/spec/unit/mongoid/document_spec.rb +818 -0
  187. data/spec/unit/mongoid/errors_spec.rb +103 -0
  188. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  189. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  190. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
  191. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  192. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
  193. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  194. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  195. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
  196. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +67 -0
  197. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  198. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  199. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
  200. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
  201. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  202. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  203. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  204. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
  205. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +57 -0
  206. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  207. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
  208. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  209. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
  210. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
  211. data/spec/unit/mongoid/extras_spec.rb +102 -0
  212. data/spec/unit/mongoid/factory_spec.rb +31 -0
  213. data/spec/unit/mongoid/field_spec.rb +143 -0
  214. data/spec/unit/mongoid/fields_spec.rb +181 -0
  215. data/spec/unit/mongoid/finders_spec.rb +404 -0
  216. data/spec/unit/mongoid/identity_spec.rb +109 -0
  217. data/spec/unit/mongoid/indexes_spec.rb +93 -0
  218. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  219. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  220. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  221. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  222. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  223. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  224. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  225. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  226. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  227. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  228. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  229. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  230. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  231. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  232. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  233. data/spec/unit/mongoid/observable_spec.rb +46 -0
  234. data/spec/unit/mongoid/paths_spec.rb +124 -0
  235. data/spec/unit/mongoid/persistence/insert_spec.rb +175 -0
  236. data/spec/unit/mongoid/persistence/update_spec.rb +148 -0
  237. data/spec/unit/mongoid/persistence_spec.rb +40 -0
  238. data/spec/unit/mongoid/scope_spec.rb +240 -0
  239. data/spec/unit/mongoid/state_spec.rb +83 -0
  240. data/spec/unit/mongoid/timestamps_spec.rb +25 -0
  241. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  242. data/spec/unit/mongoid/validations/uniqueness_spec.rb +47 -0
  243. data/spec/unit/mongoid/validations_spec.rb +190 -0
  244. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  245. data/spec/unit/mongoid_spec.rb +46 -0
  246. metadata +476 -0
@@ -0,0 +1,176 @@
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
+ after do
70
+ config.persist_in_safe_mode = true
71
+ end
72
+
73
+ it "sets the value" do
74
+ config.persist_in_safe_mode.should == false
75
+ end
76
+
77
+ end
78
+
79
+ end
80
+
81
+ describe "#raise_not_found_error=" do
82
+
83
+ context "when setting to true" do
84
+
85
+ before do
86
+ config.raise_not_found_error = true
87
+ end
88
+
89
+ it "sets the value" do
90
+ config.raise_not_found_error.should == true
91
+ end
92
+
93
+ end
94
+
95
+ context "when setting to false" do
96
+
97
+ before do
98
+ config.raise_not_found_error = false
99
+ end
100
+
101
+ it "sets the value" do
102
+ config.raise_not_found_error.should == false
103
+ end
104
+
105
+ end
106
+
107
+ end
108
+
109
+ describe "#reconnect_time" do
110
+
111
+ it "defaults to 3" do
112
+ config.reconnect_time.should == 3
113
+ end
114
+
115
+ end
116
+
117
+ describe "#reconnect_time=" do
118
+
119
+ after do
120
+ config.reconnect_time = 3
121
+ end
122
+
123
+ it "sets the time" do
124
+ config.reconnect_time = 5
125
+ config.reconnect_time.should == 5
126
+ end
127
+ end
128
+
129
+ describe "#slaves=" do
130
+
131
+ context "when object provided is not a Mongo::DB" do
132
+
133
+ it "raises an error" do
134
+ lambda { config.slaves = ["Test"] }.should raise_error
135
+ end
136
+
137
+ end
138
+
139
+ end
140
+
141
+ describe "#allow_dynamic_fields=" do
142
+
143
+ context "when setting to true" do
144
+
145
+ before do
146
+ config.allow_dynamic_fields = true
147
+ end
148
+
149
+ it "sets the value" do
150
+ config.allow_dynamic_fields.should == true
151
+ end
152
+
153
+ end
154
+
155
+ context "when setting to false" do
156
+
157
+ before do
158
+ config.allow_dynamic_fields = false
159
+ end
160
+
161
+ it "sets the value" do
162
+ config.allow_dynamic_fields.should == false
163
+ end
164
+
165
+ end
166
+
167
+ end
168
+
169
+ describe "#use_object_ids" do
170
+
171
+ it "defaults to false" do
172
+ config.use_object_ids.should == false
173
+ end
174
+ end
175
+
176
+ end
@@ -0,0 +1,421 @@
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