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,75 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Memoization do
4
+
5
+ let(:memo) { "Memo" }
6
+
7
+ before do
8
+ @person = Person.new
9
+ end
10
+
11
+ describe "#memoized" do
12
+
13
+ context "when variable has been defined" do
14
+
15
+ before do
16
+ @person.instance_variable_set("@memo", memo)
17
+ end
18
+
19
+ it "returns the memoized value" do
20
+ @person.memoized(:memo) { nil }.should == memo
21
+ end
22
+
23
+ end
24
+
25
+ context "when variable has not been defined" do
26
+
27
+ it "returns the new value" do
28
+ @person.memoized(:memo) { memo }.should == memo
29
+ end
30
+
31
+ it "memoizes the new value" do
32
+ @person.memoized(:memo) { memo }
33
+ @person.instance_variable_get("@memo").should == memo
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+
40
+ describe "#reset" do
41
+
42
+ context "when variable has been defined" do
43
+
44
+ before do
45
+ @person.instance_variable_set("@memo", memo)
46
+ end
47
+
48
+ it "removes the memoized value" do
49
+ @person.reset(:memo) { nil }
50
+ @person.instance_variable_defined?("@memo").should be_false
51
+ end
52
+
53
+ it "returns the new value" do
54
+ @person.reset(:memo) { memo }.should == memo
55
+ end
56
+
57
+ end
58
+
59
+ context "when variable has not been defined" do
60
+
61
+ it "memoizes the new value" do
62
+ @person.reset(:memo) { memo }
63
+ @person.instance_variable_get("@memo").should == memo
64
+ end
65
+
66
+ it "returns the value" do
67
+ @person.reset(:memo) { memo }.should == memo
68
+ end
69
+
70
+ end
71
+
72
+
73
+ end
74
+
75
+ end
@@ -0,0 +1,123 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::NamedScope do
4
+
5
+ class Player
6
+ include Mongoid::Document
7
+ field :active, :type => Boolean
8
+ field :frags, :type => Integer
9
+ field :deaths, :type => Integer
10
+ field :status
11
+
12
+ named_scope :active, criteria.where(:active => true) do
13
+ def extension
14
+ "extension"
15
+ end
16
+ end
17
+ named_scope :inactive, :where => { :active => false }
18
+ named_scope :frags_over, lambda { |count| { :where => { :frags.gt => count } } }
19
+ named_scope :deaths_under, lambda { |count| criteria.where(:deaths.lt => count) }
20
+ scope :deaths_over, lambda { |count| criteria.where(:deaths.gt => count) }
21
+
22
+ class << self
23
+ def alive
24
+ criteria.where(:status => "Alive")
25
+ end
26
+ end
27
+ end
28
+
29
+ describe ".named_scope" do
30
+
31
+ it "adds a class method for the scope" do
32
+ Player.should respond_to(:active)
33
+ end
34
+
35
+ it "adds the scope to the scopes" do
36
+ Player.scopes.should include(:active)
37
+ end
38
+
39
+ context "when options are a hash" do
40
+
41
+ it "adds the selector to the scope" do
42
+ Player.inactive.selector[:active].should be_false
43
+ end
44
+
45
+ end
46
+
47
+ context "when options are a criteria" do
48
+
49
+ it "adds the selector to the scope" do
50
+ Player.active.selector[:active].should be_true
51
+ end
52
+
53
+ end
54
+
55
+ context "when options are a proc" do
56
+
57
+ context "when the proc delegates to a hash" do
58
+
59
+ it "adds the selector to the scope" do
60
+ Player.frags_over(50).selector[:frags].should == { "$gt" => 50 }
61
+ end
62
+
63
+ end
64
+
65
+ context "when the proc delegates to a criteria" do
66
+
67
+ it "adds the selector to the scope" do
68
+ Player.deaths_under(40).selector[:deaths].should == { "$lt" => 40 }
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ context "when a block is supplied" do
76
+
77
+ it "adds a class method for the scope" do
78
+ Player.should respond_to(:deaths_over)
79
+ end
80
+
81
+ it "adds the scope to the scopes" do
82
+ Player.scopes.should include(:deaths_over)
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+ describe ".scope" do
90
+
91
+ it "aliases to named_scope" do
92
+ Player.should respond_to(:deaths_over)
93
+ end
94
+
95
+ end
96
+
97
+ context "chained scopes" do
98
+
99
+ context "when chaining two named scopes" do
100
+
101
+ it "merges the criteria" do
102
+ selector = Player.active.frags_over(10).selector
103
+ selector[:active].should be_true
104
+ selector[:frags].should == { "$gt" => 10 }
105
+ end
106
+
107
+ end
108
+
109
+ context "when chaining named scoped with criteria class methods" do
110
+
111
+ it "merges the criteria" do
112
+ selector = Player.active.frags_over(10).alive.selector
113
+ selector[:active].should be_true
114
+ selector[:frags].should == { "$gt" => 10 }
115
+ selector[:status].should == "Alive"
116
+ end
117
+
118
+ end
119
+
120
+ end
121
+
122
+ end
123
+
@@ -0,0 +1,108 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Paranoia do
4
+
5
+ let(:collection) do
6
+ stub.quacks_like(Mongoid::Collection.allocate)
7
+ end
8
+
9
+ let(:command) do
10
+ stub.quacks_like(Mongoid::Persistence::Remove.allocate)
11
+ end
12
+
13
+ describe "#delete!" do
14
+
15
+ before do
16
+ @post = ParanoidPost.new
17
+ end
18
+
19
+ it "removes the document from the database" do
20
+ Mongoid::Persistence::Remove.expects(:new).with(@post).returns(command)
21
+ command.expects(:persist).returns(true)
22
+ @post.delete!
23
+ end
24
+
25
+ it "sets destroyed to true" do
26
+ Mongoid::Persistence::Remove.expects(:new).with(@post).returns(command)
27
+ command.expects(:persist).returns(true)
28
+ @post.delete!
29
+ @post.destroyed?.should == true
30
+ end
31
+ end
32
+
33
+ describe "#destroyed?" do
34
+
35
+ context "when the document was marked as deleted" do
36
+
37
+ before do
38
+ @post = ParanoidPost.new
39
+ @post.deleted_at = Time.now
40
+ end
41
+
42
+ it "returns true" do
43
+ @post.destroyed?.should == true
44
+ end
45
+ end
46
+
47
+ context "when the document was not marked as deleted" do
48
+
49
+ before do
50
+ @post = ParanoidPost.new
51
+ end
52
+
53
+ it "returns true" do
54
+ @post.destroyed?.should == false
55
+ end
56
+ end
57
+ end
58
+
59
+ describe "#_remove" do
60
+
61
+ before do
62
+ @post = ParanoidPost.new
63
+ @post.expects(:collection).returns(collection)
64
+ @time = Time.now
65
+ Time.stubs(:now).returns(@time)
66
+ end
67
+
68
+ it "sets the deleted_at flag in the database" do
69
+ collection.expects(:update).with(
70
+ { :_id => @post.id }, { "$set" => { :deleted_at => @time } }
71
+ ).returns(true)
72
+ @post._remove
73
+ end
74
+
75
+ it "sets the deleted flag" do
76
+ collection.expects(:update).with(
77
+ { :_id => @post.id }, { "$set" => { :deleted_at => @time } }
78
+ ).returns(true)
79
+ @post._remove
80
+ @post.destroyed?.should == true
81
+ end
82
+ end
83
+
84
+ describe "#_restore" do
85
+
86
+ before do
87
+ @post = ParanoidPost.new(:deleted_at => Time.now)
88
+ @post.expects(:collection).returns(collection)
89
+ @time = Time.now
90
+ Time.stubs(:now).returns(@time)
91
+ end
92
+
93
+ it "removes the deleted_at flag from the database" do
94
+ collection.expects(:update).with(
95
+ { :_id => @post.id }, { "$unset" => { :deleted_at => true } }
96
+ ).returns(true)
97
+ @post.restore
98
+ end
99
+
100
+ it "removes the deleted flag" do
101
+ collection.expects(:update).with(
102
+ { :_id => @post.id }, { "$unset" => { :deleted_at => true } }
103
+ ).returns(true)
104
+ @post.restore
105
+ @post.destroyed?.should == false
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,272 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Paths do
4
+
5
+ let(:person) do
6
+ Person.new
7
+ end
8
+
9
+ let(:address) do
10
+ Address.new(:street => "testing")
11
+ end
12
+
13
+ let(:location) do
14
+ Location.new
15
+ end
16
+
17
+ let(:name) do
18
+ Name.new
19
+ end
20
+
21
+ describe "#._remover" do
22
+
23
+ before do
24
+ person.addresses << address
25
+ person.name = name
26
+ end
27
+
28
+ context "when document is root" do
29
+
30
+ it "returns nil" do
31
+ person._remover.should be_nil
32
+ end
33
+ end
34
+
35
+ context "when document is an embeds_one" do
36
+
37
+ it "returns $unset" do
38
+ name._remover.should == "$unset"
39
+ end
40
+ end
41
+
42
+ context "when document is an embeds_many" do
43
+
44
+ it "returns $pull" do
45
+ address._remover.should == "$pull"
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "#._inserter" do
51
+
52
+ before do
53
+ person.addresses << address
54
+ person.name = name
55
+ end
56
+
57
+ context "when document is root" do
58
+
59
+ it "returns nil" do
60
+ person._inserter.should be_nil
61
+ end
62
+ end
63
+
64
+ context "when document is an embeds_one" do
65
+
66
+ it "returns $set" do
67
+ name._inserter.should == "$set"
68
+ end
69
+ end
70
+
71
+ context "when document is an embeds_many" do
72
+
73
+ it "returns $push" do
74
+ address._inserter.should == "$push"
75
+ end
76
+ end
77
+ end
78
+
79
+ describe "#._path" do
80
+
81
+ context "when the document is a parent" do
82
+
83
+ it "returns an empty string" do
84
+ person._path.should == ""
85
+ end
86
+ end
87
+
88
+ context "when the document is embedded" do
89
+
90
+ before do
91
+ person.addresses << address
92
+ end
93
+
94
+ it "returns the inverse_of value of the association" do
95
+ address._path.should == "addresses"
96
+ end
97
+ end
98
+
99
+ context "when document embedded multiple levels" do
100
+
101
+ before do
102
+ address.locations << location
103
+ person.addresses << address
104
+ end
105
+
106
+ it "returns the JSON notation to the document" do
107
+ location._path.should == "addresses.locations"
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "#._selector" do
113
+
114
+ context "when the document is a parent" do
115
+
116
+ it "returns an id._selector" do
117
+ person._selector.should == { "_id" => person.id }
118
+ end
119
+ end
120
+
121
+ context "when the document is embedded" do
122
+
123
+ before do
124
+ person.addresses << address
125
+ end
126
+
127
+ it "returns the association with id._selector" do
128
+ address._selector.should == { "_id" => person.id, "addresses._id" => address.id }
129
+ end
130
+ end
131
+
132
+ context "when document embedded multiple levels" do
133
+
134
+ before do
135
+ address.locations << location
136
+ person.addresses << address
137
+ end
138
+
139
+ it "returns the JSON notation to the document with ids" do
140
+ location._selector.should ==
141
+ { "_id" => person.id, "addresses._id" => address.id, "addresses.locations._id" => location.id }
142
+ end
143
+ end
144
+ end
145
+
146
+ describe "#._position" do
147
+
148
+ context "when the document is a parent" do
149
+
150
+ it "returns an empty string" do
151
+ person._position.should == ""
152
+ end
153
+ end
154
+
155
+ context "when the document is embedded" do
156
+
157
+ before do
158
+ person.addresses << address
159
+ end
160
+
161
+ context "when the document is new" do
162
+
163
+ it "returns the._path without index" do
164
+ address._position.should == "addresses"
165
+ end
166
+ end
167
+
168
+ context "when the document is not new" do
169
+
170
+ before do
171
+ address.instance_variable_set(:@new_record, false)
172
+ end
173
+
174
+ it "returns the._path plus index" do
175
+ address._position.should == "addresses.0"
176
+ end
177
+ end
178
+ end
179
+
180
+ context "when document embedded multiple levels" do
181
+
182
+ before do
183
+ @other = Location.new
184
+ address.locations << [ @other, location ]
185
+ address.instance_variable_set(:@new_record, false)
186
+ person.addresses << address
187
+ end
188
+
189
+ context "when the document is new" do
190
+
191
+ it "returns the._path with parent indexes" do
192
+ location._position.should == "addresses.0.locations"
193
+ end
194
+ end
195
+
196
+ context "when the document is not new" do
197
+
198
+ before do
199
+ location.instance_variable_set(:@new_record, false)
200
+ end
201
+
202
+ it "returns the._path plus index" do
203
+ location._position.should == "addresses.0.locations.1"
204
+ end
205
+ end
206
+ end
207
+ end
208
+
209
+ describe "#._pull" do
210
+
211
+ context "when the document is a parent" do
212
+
213
+ it "returns an empty string" do
214
+ person._pull.should == ""
215
+ end
216
+ end
217
+
218
+ context "when the document is embedded" do
219
+
220
+ before do
221
+ person.addresses << address
222
+ end
223
+
224
+ context "when the document is not new" do
225
+
226
+ before do
227
+ address.instance_variable_set(:@new_record, false)
228
+ end
229
+
230
+ it "returns the._path without the index" do
231
+ address._pull.should == "addresses"
232
+ end
233
+
234
+ context "and there are 10 or more documents" do
235
+
236
+ before do
237
+ 10.times do
238
+ person.addresses << address
239
+ end
240
+ end
241
+
242
+ it "returns the._path without the index" do
243
+ address._pull.should == "addresses"
244
+ end
245
+
246
+ end
247
+ end
248
+ end
249
+
250
+ context "when document embedded multiple levels" do
251
+
252
+ before do
253
+ @other = Location.new
254
+ address.locations << [ @other, location ]
255
+ address.instance_variable_set(:@new_record, false)
256
+ person.addresses << address
257
+ end
258
+
259
+ context "when the document is not new" do
260
+
261
+ before do
262
+ location.instance_variable_set(:@new_record, false)
263
+ end
264
+
265
+ it "returns the._path plus index" do
266
+ location._pull.should == "addresses.0.locations"
267
+ end
268
+
269
+ end
270
+ end
271
+ end
272
+ end