mongoid-locomotive 2.0.0.beta9

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 (274) hide show
  1. data/MIT_LICENSE +20 -0
  2. data/README.rdoc +47 -0
  3. data/lib/mongoid.rb +141 -0
  4. data/lib/mongoid/associations.rb +306 -0
  5. data/lib/mongoid/associations/embedded_in.rb +74 -0
  6. data/lib/mongoid/associations/embeds_many.rb +280 -0
  7. data/lib/mongoid/associations/embeds_one.rb +97 -0
  8. data/lib/mongoid/associations/foreign_key.rb +35 -0
  9. data/lib/mongoid/associations/meta_data.rb +38 -0
  10. data/lib/mongoid/associations/options.rb +62 -0
  11. data/lib/mongoid/associations/proxy.rb +33 -0
  12. data/lib/mongoid/associations/referenced_in.rb +59 -0
  13. data/lib/mongoid/associations/references_many.rb +245 -0
  14. data/lib/mongoid/associations/references_many_as_array.rb +78 -0
  15. data/lib/mongoid/associations/references_one.rb +99 -0
  16. data/lib/mongoid/atomicity.rb +55 -0
  17. data/lib/mongoid/attributes.rb +242 -0
  18. data/lib/mongoid/callbacks.rb +21 -0
  19. data/lib/mongoid/collection.rb +120 -0
  20. data/lib/mongoid/collections.rb +71 -0
  21. data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
  22. data/lib/mongoid/collections/master.rb +29 -0
  23. data/lib/mongoid/collections/operations.rb +41 -0
  24. data/lib/mongoid/collections/slaves.rb +45 -0
  25. data/lib/mongoid/components.rb +34 -0
  26. data/lib/mongoid/config.rb +263 -0
  27. data/lib/mongoid/contexts.rb +24 -0
  28. data/lib/mongoid/contexts/enumerable.rb +156 -0
  29. data/lib/mongoid/contexts/ids.rb +25 -0
  30. data/lib/mongoid/contexts/mongo.rb +285 -0
  31. data/lib/mongoid/contexts/paging.rb +50 -0
  32. data/lib/mongoid/criteria.rb +248 -0
  33. data/lib/mongoid/criterion/complex.rb +21 -0
  34. data/lib/mongoid/criterion/exclusion.rb +65 -0
  35. data/lib/mongoid/criterion/inclusion.rb +110 -0
  36. data/lib/mongoid/criterion/optional.rb +189 -0
  37. data/lib/mongoid/cursor.rb +81 -0
  38. data/lib/mongoid/deprecation.rb +21 -0
  39. data/lib/mongoid/dirty.rb +252 -0
  40. data/lib/mongoid/document.rb +210 -0
  41. data/lib/mongoid/errors.rb +131 -0
  42. data/lib/mongoid/extensions.rb +115 -0
  43. data/lib/mongoid/extensions/array/accessors.rb +17 -0
  44. data/lib/mongoid/extensions/array/assimilation.rb +26 -0
  45. data/lib/mongoid/extensions/array/conversions.rb +23 -0
  46. data/lib/mongoid/extensions/array/parentization.rb +13 -0
  47. data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
  48. data/lib/mongoid/extensions/binary/conversions.rb +17 -0
  49. data/lib/mongoid/extensions/boolean/conversions.rb +27 -0
  50. data/lib/mongoid/extensions/date/conversions.rb +24 -0
  51. data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
  52. data/lib/mongoid/extensions/false_class/equality.rb +13 -0
  53. data/lib/mongoid/extensions/float/conversions.rb +20 -0
  54. data/lib/mongoid/extensions/hash/accessors.rb +42 -0
  55. data/lib/mongoid/extensions/hash/assimilation.rb +40 -0
  56. data/lib/mongoid/extensions/hash/conversions.rb +42 -0
  57. data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
  58. data/lib/mongoid/extensions/hash/scoping.rb +12 -0
  59. data/lib/mongoid/extensions/integer/conversions.rb +20 -0
  60. data/lib/mongoid/extensions/nil/assimilation.rb +17 -0
  61. data/lib/mongoid/extensions/object/conversions.rb +21 -0
  62. data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
  63. data/lib/mongoid/extensions/proc/scoping.rb +12 -0
  64. data/lib/mongoid/extensions/set/conversions.rb +20 -0
  65. data/lib/mongoid/extensions/string/conversions.rb +15 -0
  66. data/lib/mongoid/extensions/string/inflections.rb +97 -0
  67. data/lib/mongoid/extensions/symbol/inflections.rb +40 -0
  68. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  69. data/lib/mongoid/extensions/true_class/equality.rb +13 -0
  70. data/lib/mongoid/extras.rb +61 -0
  71. data/lib/mongoid/factory.rb +20 -0
  72. data/lib/mongoid/field.rb +83 -0
  73. data/lib/mongoid/fields.rb +62 -0
  74. data/lib/mongoid/finders.rb +145 -0
  75. data/lib/mongoid/hierarchy.rb +74 -0
  76. data/lib/mongoid/identity.rb +47 -0
  77. data/lib/mongoid/indexes.rb +27 -0
  78. data/lib/mongoid/javascript.rb +21 -0
  79. data/lib/mongoid/javascript/functions.yml +37 -0
  80. data/lib/mongoid/logger.rb +19 -0
  81. data/lib/mongoid/matchers.rb +35 -0
  82. data/lib/mongoid/matchers/all.rb +11 -0
  83. data/lib/mongoid/matchers/default.rb +26 -0
  84. data/lib/mongoid/matchers/exists.rb +13 -0
  85. data/lib/mongoid/matchers/gt.rb +11 -0
  86. data/lib/mongoid/matchers/gte.rb +11 -0
  87. data/lib/mongoid/matchers/in.rb +11 -0
  88. data/lib/mongoid/matchers/lt.rb +11 -0
  89. data/lib/mongoid/matchers/lte.rb +11 -0
  90. data/lib/mongoid/matchers/ne.rb +11 -0
  91. data/lib/mongoid/matchers/nin.rb +11 -0
  92. data/lib/mongoid/matchers/size.rb +11 -0
  93. data/lib/mongoid/memoization.rb +33 -0
  94. data/lib/mongoid/named_scope.rb +37 -0
  95. data/lib/mongoid/paranoia.rb +106 -0
  96. data/lib/mongoid/paths.rb +61 -0
  97. data/lib/mongoid/persistence.rb +216 -0
  98. data/lib/mongoid/persistence/command.rb +39 -0
  99. data/lib/mongoid/persistence/insert.rb +48 -0
  100. data/lib/mongoid/persistence/insert_embedded.rb +44 -0
  101. data/lib/mongoid/persistence/remove.rb +39 -0
  102. data/lib/mongoid/persistence/remove_all.rb +38 -0
  103. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  104. data/lib/mongoid/persistence/update.rb +71 -0
  105. data/lib/mongoid/railtie.rb +67 -0
  106. data/lib/mongoid/railties/database.rake +60 -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 +5 -0
  113. data/lib/mongoid/validations/uniqueness.rb +56 -0
  114. data/lib/mongoid/version.rb +4 -0
  115. data/lib/mongoid/versioning.rb +26 -0
  116. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  117. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
  118. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  119. data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
  120. data/lib/rails/generators/mongoid_generator.rb +61 -0
  121. data/spec/integration/mongoid/association_attributes_spec.rb +71 -0
  122. data/spec/integration/mongoid/associations_spec.rb +768 -0
  123. data/spec/integration/mongoid/attributes_spec.rb +59 -0
  124. data/spec/integration/mongoid/callback_spec.rb +33 -0
  125. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  126. data/spec/integration/mongoid/criteria_spec.rb +281 -0
  127. data/spec/integration/mongoid/dirty_spec.rb +85 -0
  128. data/spec/integration/mongoid/document_spec.rb +741 -0
  129. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  130. data/spec/integration/mongoid/finders_spec.rb +119 -0
  131. data/spec/integration/mongoid/inheritance_spec.rb +171 -0
  132. data/spec/integration/mongoid/named_scope_spec.rb +58 -0
  133. data/spec/integration/mongoid/paranoia_spec.rb +44 -0
  134. data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
  135. data/spec/integration/mongoid/persistence_spec.rb +311 -0
  136. data/spec/integration/mongoid/validations/uniqueness_spec.rb +206 -0
  137. data/spec/models/account.rb +5 -0
  138. data/spec/models/address.rb +40 -0
  139. data/spec/models/agent.rb +7 -0
  140. data/spec/models/animal.rb +15 -0
  141. data/spec/models/answer.rb +4 -0
  142. data/spec/models/callbacks.rb +47 -0
  143. data/spec/models/category.rb +13 -0
  144. data/spec/models/comment.rb +10 -0
  145. data/spec/models/country_code.rb +6 -0
  146. data/spec/models/employer.rb +5 -0
  147. data/spec/models/favorite.rb +8 -0
  148. data/spec/models/game.rb +9 -0
  149. data/spec/models/inheritance.rb +72 -0
  150. data/spec/models/location.rb +5 -0
  151. data/spec/models/login.rb +6 -0
  152. data/spec/models/mixed_drink.rb +4 -0
  153. data/spec/models/name.rb +13 -0
  154. data/spec/models/namespacing.rb +11 -0
  155. data/spec/models/paranoid_post.rb +18 -0
  156. data/spec/models/parents.rb +32 -0
  157. data/spec/models/patient.rb +15 -0
  158. data/spec/models/person.rb +106 -0
  159. data/spec/models/pet.rb +7 -0
  160. data/spec/models/pet_owner.rb +6 -0
  161. data/spec/models/phone.rb +7 -0
  162. data/spec/models/post.rb +25 -0
  163. data/spec/models/preference.rb +7 -0
  164. data/spec/models/question.rb +8 -0
  165. data/spec/models/survey.rb +6 -0
  166. data/spec/models/translation.rb +5 -0
  167. data/spec/models/user.rb +6 -0
  168. data/spec/models/user_accout.rb +5 -0
  169. data/spec/models/vet_visit.rb +5 -0
  170. data/spec/models/video.rb +5 -0
  171. data/spec/spec_helper.rb +33 -0
  172. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  173. data/spec/unit/mongoid/associations/embeds_many_spec.rb +626 -0
  174. data/spec/unit/mongoid/associations/embeds_one_spec.rb +287 -0
  175. data/spec/unit/mongoid/associations/foreign_key_spec.rb +90 -0
  176. data/spec/unit/mongoid/associations/meta_data_spec.rb +110 -0
  177. data/spec/unit/mongoid/associations/options_spec.rb +215 -0
  178. data/spec/unit/mongoid/associations/referenced_in_spec.rb +145 -0
  179. data/spec/unit/mongoid/associations/references_many_as_array_spec.rb +424 -0
  180. data/spec/unit/mongoid/associations/references_many_spec.rb +502 -0
  181. data/spec/unit/mongoid/associations/references_one_spec.rb +204 -0
  182. data/spec/unit/mongoid/associations_spec.rb +688 -0
  183. data/spec/unit/mongoid/atomicity_spec.rb +164 -0
  184. data/spec/unit/mongoid/attributes_spec.rb +646 -0
  185. data/spec/unit/mongoid/callbacks_spec.rb +85 -0
  186. data/spec/unit/mongoid/collection_spec.rb +187 -0
  187. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  188. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  189. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  190. data/spec/unit/mongoid/collections_spec.rb +98 -0
  191. data/spec/unit/mongoid/config_spec.rb +298 -0
  192. data/spec/unit/mongoid/contexts/enumerable_spec.rb +447 -0
  193. data/spec/unit/mongoid/contexts/mongo_spec.rb +703 -0
  194. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  195. data/spec/unit/mongoid/criteria_spec.rb +873 -0
  196. data/spec/unit/mongoid/criterion/complex_spec.rb +17 -0
  197. data/spec/unit/mongoid/criterion/exclusion_spec.rb +121 -0
  198. data/spec/unit/mongoid/criterion/inclusion_spec.rb +274 -0
  199. data/spec/unit/mongoid/criterion/optional_spec.rb +483 -0
  200. data/spec/unit/mongoid/cursor_spec.rb +80 -0
  201. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  202. data/spec/unit/mongoid/dirty_spec.rb +430 -0
  203. data/spec/unit/mongoid/document_spec.rb +623 -0
  204. data/spec/unit/mongoid/errors_spec.rb +154 -0
  205. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  206. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  207. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +52 -0
  208. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  209. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +36 -0
  210. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  211. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  212. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +145 -0
  213. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +14 -0
  214. data/spec/unit/mongoid/extensions/false_class/equality_spec.rb +35 -0
  215. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  216. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  217. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +59 -0
  218. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +35 -0
  219. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  220. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  221. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  222. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +29 -0
  223. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +44 -0
  224. data/spec/unit/mongoid/extensions/objectid/conversions_spec.rb +22 -0
  225. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  226. data/spec/unit/mongoid/extensions/set/conversions_spec.rb +21 -0
  227. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +28 -0
  228. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  229. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +107 -0
  230. data/spec/unit/mongoid/extensions/time_conversions_spec.rb +186 -0
  231. data/spec/unit/mongoid/extensions/true_class/equality_spec.rb +35 -0
  232. data/spec/unit/mongoid/extras_spec.rb +102 -0
  233. data/spec/unit/mongoid/factory_spec.rb +31 -0
  234. data/spec/unit/mongoid/field_spec.rb +169 -0
  235. data/spec/unit/mongoid/fields_spec.rb +181 -0
  236. data/spec/unit/mongoid/finders_spec.rb +439 -0
  237. data/spec/unit/mongoid/hierarchy_spec.rb +68 -0
  238. data/spec/unit/mongoid/identity_spec.rb +109 -0
  239. data/spec/unit/mongoid/indexes_spec.rb +99 -0
  240. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  241. data/spec/unit/mongoid/logger_spec.rb +38 -0
  242. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  243. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  244. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  245. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  246. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  247. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  248. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  249. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  250. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  251. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  252. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  253. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  254. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  255. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  256. data/spec/unit/mongoid/paranoia_spec.rb +108 -0
  257. data/spec/unit/mongoid/paths_spec.rb +272 -0
  258. data/spec/unit/mongoid/persistence/insert_embedded_spec.rb +154 -0
  259. data/spec/unit/mongoid/persistence/insert_spec.rb +144 -0
  260. data/spec/unit/mongoid/persistence/remove_all_spec.rb +82 -0
  261. data/spec/unit/mongoid/persistence/remove_embedded_spec.rb +152 -0
  262. data/spec/unit/mongoid/persistence/remove_spec.rb +89 -0
  263. data/spec/unit/mongoid/persistence/update_spec.rb +177 -0
  264. data/spec/unit/mongoid/persistence_spec.rb +452 -0
  265. data/spec/unit/mongoid/scope_spec.rb +240 -0
  266. data/spec/unit/mongoid/serialization_spec.rb +43 -0
  267. data/spec/unit/mongoid/state_spec.rb +94 -0
  268. data/spec/unit/mongoid/timestamps_spec.rb +30 -0
  269. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  270. data/spec/unit/mongoid/validations/uniqueness_spec.rb +201 -0
  271. data/spec/unit/mongoid/validations_spec.rb +43 -0
  272. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  273. data/spec/unit/mongoid_spec.rb +46 -0
  274. metadata +433 -0
@@ -0,0 +1,59 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Attributes do
4
+
5
+ context "when persisting nil attributes" do
6
+
7
+ before do
8
+ @person = Person.create(:score => nil, :ssn => "555-66-7777")
9
+ end
10
+
11
+ after do
12
+ Person.delete_all
13
+ end
14
+
15
+ it "the field should exist with a nil value" do
16
+ from_db = Person.find(@person.id)
17
+ from_db.attributes.has_key?(:score).should be_true
18
+ end
19
+
20
+ end
21
+
22
+ context "when persisting nested attributes" do
23
+
24
+ before do
25
+ @survey = Survey.new
26
+ 3.times do
27
+ @question = @survey.questions.build
28
+ 4.times { @question.answers.build }
29
+ end
30
+ end
31
+
32
+ end
33
+
34
+ context "when persisting nested with accepts_nested_attributes_for" do
35
+
36
+ before do
37
+ @survey = Survey.new
38
+ @survey.questions.build(:content => 'Do you like cheesecake ?')
39
+ @survey.questions.build(:content => 'Do you like cuppcake ?')
40
+ @survey.questions.build(:content => 'Do you like ace cream ?')
41
+ @survey.save
42
+ @attributes = {
43
+ "0" => { :content => "lorem", "_destroy" => "true" },
44
+ "1" => { :content => "lorem", "_destroy" => "true" },
45
+ "2" => { :content => "Do you like ice cream ?" },
46
+ "new_record" => { :content => "Do you carrot cake ?" }
47
+ }
48
+ end
49
+
50
+ it "adds/updates/removes embedded documents" do
51
+ @survey.update_attributes(:questions_attributes => @attributes)
52
+ @survey.reload
53
+ @survey.questions.size.should == 2
54
+ @survey.questions.first.content.should == "Do you like ice cream ?"
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Callbacks do
4
+
5
+ before do
6
+ ValidationCallback.delete_all
7
+ ParentDoc.delete_all
8
+ end
9
+
10
+ context "callback on valid?" do
11
+ it 'should go in all validation callback in good order' do
12
+ shin = ValidationCallback.new
13
+ shin.valid?
14
+ shin.history.should == [:before_validation, :validate, :after_validation]
15
+ end
16
+ end
17
+
18
+ context "when creating child documents in callbacks" do
19
+
20
+ let(:parent) do
21
+ ParentDoc.new
22
+ end
23
+
24
+ before do
25
+ parent.save
26
+ end
27
+
28
+ it "does not duplicate the child documents" do
29
+ parent.child_docs.create(:position => 1)
30
+ ParentDoc.find(parent.id).child_docs.size.should == 1
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Contexts::Enumerable do
4
+
5
+ before do
6
+ @person = Person.new(:title => "Sir")
7
+ 10.times do |n|
8
+ @person.addresses << Address.new(:number => n, :street => "Upper Street")
9
+ end
10
+ end
11
+
12
+ describe "#paginate" do
13
+
14
+ it "paginates the embedded documents" do
15
+ addresses = @person.addresses.paginate(:page => nil, :per_page => 5)
16
+ addresses.current_page.should == 1
17
+ addresses.size.should == 5
18
+ end
19
+ end
20
+
21
+ describe "limit and skip" do
22
+
23
+ it "limits" do
24
+ @person.addresses.criteria.limit(5).size.should == 5
25
+ end
26
+
27
+ it "skips" do
28
+ @person.addresses.criteria.skip(5).limit(10).
29
+ map(&:number).should == [5, 6, 7, 8, 9]
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,281 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Criteria do
4
+
5
+ before do
6
+ Person.delete_all
7
+ end
8
+
9
+ after do
10
+ Person.delete_all
11
+ end
12
+
13
+ describe "#avg" do
14
+
15
+ context "without results" do
16
+ it "should return nil" do
17
+ Person.avg(:age).should == nil
18
+ end
19
+ end
20
+
21
+ context "with results" do
22
+ before do
23
+ 10.times do |n|
24
+ Person.create(:title => "Sir", :age => ((n + 1) * 10), :aliases => ["D", "Durran"], :ssn => "#{n}")
25
+ end
26
+ end
27
+
28
+ it "provides min for the field provided" do
29
+ Person.avg(:age).should == 55
30
+ end
31
+ end
32
+ end
33
+
34
+ describe "#excludes" do
35
+
36
+ before do
37
+ @person = Person.create(:title => "Sir", :age => 100, :aliases => ["D", "Durran"], :ssn => "666666666")
38
+ end
39
+
40
+ context "when passed id" do
41
+
42
+ it "it properly excludes ids" do
43
+ Person.criteria.excludes(:id => @person.id).entries.should be_empty
44
+ end
45
+
46
+ end
47
+
48
+ context "when passed _id" do
49
+
50
+ it "it properly excludes ids" do
51
+ Person.criteria.excludes(:_id => @person.id).entries.should be_empty
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ describe "#execute" do
59
+
60
+ context "when reiterating" do
61
+
62
+ before do
63
+ @person = Person.create(:title => "Sir", :age => 100, :aliases => ["D", "Durran"], :ssn => "666666666")
64
+ end
65
+
66
+ it "executes the query again" do
67
+ criteria = Person.all
68
+ criteria.size.should == 1
69
+ criteria.should_not be_empty
70
+ end
71
+ end
72
+ end
73
+
74
+ describe "#in" do
75
+
76
+ context "when searching nil values" do
77
+
78
+ before do
79
+ @person = Person.create(:title => nil)
80
+ end
81
+
82
+ it "returns the correct document" do
83
+ from_db = Person.any_in(:title => [ true, false, nil ]).first
84
+ from_db.should == @person
85
+ end
86
+ end
87
+
88
+ context "when searching false values" do
89
+
90
+ before do
91
+ @person = Person.create(:terms => false)
92
+ end
93
+
94
+ it "returns the correct document" do
95
+ from_db = Person.criteria.in(:terms => [ true, false, nil ]).first
96
+ from_db.should == @person
97
+ end
98
+ end
99
+ end
100
+
101
+ describe "#max" do
102
+
103
+ context "without results" do
104
+ it "should return nil" do
105
+ Person.max(:age).should == nil
106
+ end
107
+ end
108
+
109
+ context "with results" do
110
+ before do
111
+ 10.times do |n|
112
+ Person.create(:title => "Sir", :age => (n * 10), :aliases => ["D", "Durran"], :ssn => "#{n}")
113
+ end
114
+ end
115
+
116
+ it "provides max for the field provided" do
117
+ Person.max(:age).should == 90.0
118
+ end
119
+ end
120
+ end
121
+
122
+ describe "#min" do
123
+
124
+ context "without results" do
125
+ it "should return nil" do
126
+ Person.min(:age).should == nil
127
+ end
128
+ end
129
+
130
+ context "with results" do
131
+ before do
132
+ 10.times do |n|
133
+ Person.create(:title => "Sir", :age => ((n + 1) * 10), :aliases => ["D", "Durran"], :ssn => "#{n}")
134
+ end
135
+ end
136
+
137
+ it "provides min for the field provided" do
138
+ Person.min(:age).should == 10.0
139
+ end
140
+ end
141
+ end
142
+
143
+ describe "#sum" do
144
+
145
+ context "without results" do
146
+ it "should return nil" do
147
+ Person.sum(:age).should == nil
148
+ end
149
+ end
150
+
151
+ context "with results" do
152
+ before do
153
+ 10.times do |n|
154
+ Person.create(:title => "Sir", :age => 5, :aliases => ["D", "Durran"], :ssn => "#{n}")
155
+ end
156
+ end
157
+
158
+ it "provides sum for the field provided" do
159
+ Person.where(:age.gt => 3).sum(:age).should == 50.0
160
+ end
161
+ end
162
+ end
163
+
164
+ describe "#where" do
165
+
166
+ before do
167
+ @person = Person.create(:title => "Sir", :age => 33, :aliases => ["D", "Durran"], :things => [{:phone => 'HTC Incredible'}])
168
+ end
169
+
170
+ context "with complex criterion" do
171
+
172
+ context "#all" do
173
+
174
+ it "returns those matching an all clause" do
175
+ Person.criteria.where(:title.all => ["Sir"]).should == [@person]
176
+ end
177
+
178
+ end
179
+
180
+ context "#exists" do
181
+
182
+ it "returns those matching an exists clause" do
183
+ Person.criteria.where(:title.exists => true).should == [@person]
184
+ end
185
+
186
+ end
187
+
188
+ context "#gt" do
189
+
190
+ it "returns those matching a gt clause" do
191
+ Person.criteria.where(:age.gt => 30).should == [@person]
192
+ end
193
+
194
+ end
195
+
196
+ context "#gte" do
197
+
198
+ it "returns those matching a gte clause" do
199
+ Person.criteria.where(:age.gte => 33).should == [@person]
200
+ end
201
+
202
+ end
203
+
204
+ context "#in" do
205
+
206
+ it "returns those matching an in clause" do
207
+ Person.criteria.where(:title.in => ["Sir", "Madam"]).should == [@person]
208
+ end
209
+
210
+ end
211
+
212
+ context "#lt" do
213
+
214
+ it "returns those matching a lt clause" do
215
+ Person.criteria.where(:age.lt => 34).should == [@person]
216
+ end
217
+
218
+ end
219
+
220
+ context "#lte" do
221
+
222
+ it "returns those matching a lte clause" do
223
+ Person.criteria.where(:age.lte => 33).should == [@person]
224
+ end
225
+
226
+ end
227
+
228
+ context "#ne" do
229
+
230
+ it "returns those matching a ne clause" do
231
+ Person.criteria.where(:age.ne => 50).should == [@person]
232
+ end
233
+
234
+ end
235
+
236
+ context "#nin" do
237
+
238
+ it "returns those matching a nin clause" do
239
+ Person.criteria.where(:title.nin => ["Esquire", "Congressman"]).should == [@person]
240
+ end
241
+
242
+ end
243
+
244
+ context "#size" do
245
+
246
+ it "returns those matching a size clause" do
247
+ Person.criteria.where(:aliases.size => 2).should == [@person]
248
+ end
249
+
250
+ end
251
+
252
+ context "#match" do
253
+
254
+ it "returns those matching a partial element in a list" do
255
+ Person.where(:things.matches => { :phone => "HTC Incredible" }).should == [@person]
256
+ end
257
+
258
+ end
259
+
260
+ end
261
+
262
+ end
263
+
264
+ context "when caching" do
265
+
266
+ before do
267
+ 10.times do |n|
268
+ Person.create!(:title => "Sir", :age => (n * 10), :aliases => ["D", "Durran"], :ssn => "#{n}")
269
+ end
270
+ end
271
+
272
+ it "iterates over the cursor only once" do
273
+ criteria = Person.where(:title => "Sir").cache
274
+
275
+ criteria.collect.to_a.size.should == 10
276
+ # Do it again!
277
+ criteria.collect.to_a.size.should == 10
278
+ end
279
+ end
280
+
281
+ end
@@ -0,0 +1,85 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Dirty do
4
+
5
+ before do
6
+ Person.collection.remove
7
+ end
8
+
9
+ after do
10
+ Person.collection.remove
11
+ end
12
+
13
+ context "when fields are getting changed" do
14
+
15
+ before do
16
+ @person = Person.create(:title => "MC", :ssn => "234-11-2533", :some_dynamic_field => 'blah')
17
+ @person.title = "DJ"
18
+ @person.write_attribute(:ssn, "222-22-2222")
19
+
20
+ @person.some_dynamic_field = 'bloop'
21
+ end
22
+
23
+ it "marks the document as changed" do
24
+ @person.changed?.should == true
25
+ end
26
+
27
+ it "marks field changes" do
28
+ @person.changes.should == {
29
+ "title" => [ "MC", "DJ" ],
30
+ "ssn" => [ "234-11-2533", "222-22-2222" ],
31
+ "some_dynamic_field" => [ "blah", "bloop" ]
32
+ }
33
+ end
34
+
35
+ it "marks changed fields" do
36
+ @person.changed.should == [ "title", "ssn", "some_dynamic_field" ]
37
+ end
38
+
39
+ it "marks the field as changed" do
40
+ @person.title_changed?.should == true
41
+ end
42
+
43
+ it "stores previous field values" do
44
+ @person.title_was.should == "MC"
45
+ end
46
+
47
+ it "marks field changes" do
48
+ @person.title_change.should == [ "MC", "DJ" ]
49
+ end
50
+
51
+ it "allows reset of field changes" do
52
+ @person.reset_title!
53
+ @person.title.should == "MC"
54
+ @person.changed.should == [ "ssn", "some_dynamic_field" ]
55
+ end
56
+
57
+ context "after a save" do
58
+
59
+ before do
60
+ @person.save!
61
+ end
62
+
63
+ it "clears changes" do
64
+ @person.changed?.should == false
65
+ end
66
+
67
+ it "stores previous changes" do
68
+ @person.previous_changes["title"].should == [ "MC", "DJ" ]
69
+ @person.previous_changes["ssn"].should == [ "234-11-2533", "222-22-2222" ]
70
+ end
71
+ end
72
+ end
73
+
74
+ context "when associations are getting changed" do
75
+
76
+ before do
77
+ @person = Person.create(:addresses => [Address.new])
78
+ @person.addresses = [Address.new]
79
+ end
80
+
81
+ it "should not set the association to nil when hitting the database" do
82
+ @person.setters.should_not == {"addresses" => nil}
83
+ end
84
+ end
85
+ end