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,215 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Associations::Options do
4
+
5
+ describe "#stored_as" do
6
+
7
+ before do
8
+ @attributes = { :stored_as => :array }
9
+ @options = Mongoid::Associations::Options.new(@attributes)
10
+ end
11
+
12
+ it "returns the association storage" do
13
+ @options.stored_as.should == :array
14
+ end
15
+
16
+ end
17
+
18
+ describe "#name" do
19
+
20
+ before do
21
+ @attributes = { :name => :addresses }
22
+ @options = Mongoid::Associations::Options.new(@attributes)
23
+ end
24
+
25
+ it "returns the association name" do
26
+ @options.name.should == "addresses"
27
+ end
28
+
29
+ end
30
+
31
+ describe "#extend" do
32
+
33
+ context "when extension exists" do
34
+
35
+ before do
36
+ @attributes = { :extend => lambda { "Test" } }
37
+ @options = Mongoid::Associations::Options.new(@attributes)
38
+ end
39
+
40
+ it "returns the proc" do
41
+ @options.extension.should == @attributes[:extend]
42
+ end
43
+
44
+ end
45
+
46
+ context "when extension doesnt exist" do
47
+
48
+ before do
49
+ @options = Mongoid::Associations::Options.new({})
50
+ end
51
+
52
+ it "returns nil" do
53
+ @options.extension.should be_nil
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+
60
+ describe "extension?" do
61
+
62
+ context "when extension exists" do
63
+
64
+ before do
65
+ @attributes = { :extend => lambda { "Test" } }
66
+ @options = Mongoid::Associations::Options.new(@attributes)
67
+ end
68
+
69
+ it "returns true" do
70
+ @options.extension?.should be_true
71
+ end
72
+
73
+ end
74
+
75
+ context "when extension doesnt exist" do
76
+
77
+ before do
78
+ @options = Mongoid::Associations::Options.new({})
79
+ end
80
+
81
+ it "returns false" do
82
+ @options.extension?.should be_false
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+ describe "#foreign_key" do
90
+
91
+ context "when no custom key defined" do
92
+
93
+ before do
94
+ @attributes = { :name => :posts }
95
+ @options = Mongoid::Associations::Options.new(@attributes)
96
+ end
97
+
98
+ it "returns the association foreign_key" do
99
+ @options.foreign_key.should == "post_id"
100
+ end
101
+ end
102
+
103
+ context "when a custom key is defined" do
104
+
105
+ before do
106
+ @attributes = { :name => :posts, :foreign_key => "blog_post_id" }
107
+ @options = Mongoid::Associations::Options.new(@attributes)
108
+ end
109
+
110
+ it "returns the custom foreign_key" do
111
+ @options.foreign_key.should == "blog_post_id"
112
+ end
113
+ end
114
+ end
115
+
116
+ describe "#inverse_of" do
117
+
118
+ before do
119
+ @attributes = { :inverse_of => :addresses }
120
+ @options = Mongoid::Associations::Options.new(@attributes)
121
+ end
122
+
123
+ it "returns the inverse_of value" do
124
+ @options.inverse_of.should == :addresses
125
+ end
126
+
127
+ end
128
+
129
+ describe "#class_name" do
130
+
131
+ context "when class_name provided" do
132
+
133
+ before do
134
+ @attributes = { :class_name => "Person" }
135
+ @options = Mongoid::Associations::Options.new(@attributes)
136
+ end
137
+
138
+ it "constantizes the class name" do
139
+ @options.class_name.should == "Person"
140
+ end
141
+
142
+ end
143
+
144
+ context "when no class_name provided" do
145
+
146
+ context "when association name is singular" do
147
+
148
+ before do
149
+ @attributes = { :name => :person }
150
+ @options = Mongoid::Associations::Options.new(@attributes)
151
+ end
152
+
153
+ it "classifies and constantizes the association name" do
154
+ @options.class_name.should == "Person"
155
+ end
156
+
157
+ end
158
+
159
+ context "when association name is plural" do
160
+
161
+ before do
162
+ @attributes = { :name => :people }
163
+ @options = Mongoid::Associations::Options.new(@attributes)
164
+ end
165
+
166
+ it "classifies and constantizes the association name" do
167
+ @options.class_name.should == "Person"
168
+ end
169
+
170
+ end
171
+
172
+ end
173
+
174
+ end
175
+
176
+ describe "#klass" do
177
+ before do
178
+ @options = Mongoid::Associations::Options.new(:name => :person)
179
+ end
180
+
181
+ it "constantizes the class_name" do
182
+ @options.klass.should == Person
183
+ end
184
+ end
185
+
186
+ describe "#polymorphic" do
187
+
188
+ context "when attribute provided" do
189
+
190
+ before do
191
+ @attributes = { :polymorphic => true }
192
+ @options = Mongoid::Associations::Options.new(@attributes)
193
+ end
194
+
195
+ it "returns the attribute" do
196
+ @options.polymorphic.should be_true
197
+ end
198
+
199
+ end
200
+
201
+ context "when attribute not provided" do
202
+
203
+ before do
204
+ @options = Mongoid::Associations::Options.new
205
+ end
206
+
207
+ it "returns false" do
208
+ @options.polymorphic.should be_false
209
+ end
210
+
211
+ end
212
+
213
+ end
214
+
215
+ end
@@ -0,0 +1,145 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Associations::ReferencedIn do
4
+
5
+ describe ".initialize" do
6
+
7
+ context "when related id has been set" do
8
+
9
+ before do
10
+ @document = stub(:person_id => "5")
11
+ @options = Mongoid::Associations::Options.new(:name => :person)
12
+ @related = stub
13
+ end
14
+
15
+ it "finds the object by id" do
16
+ Person.expects(:find).with(@document.person_id).returns(@related)
17
+ association = Mongoid::Associations::ReferencedIn.new(@document, "5", @options)
18
+ association.should == @related
19
+ end
20
+
21
+ end
22
+
23
+ context "when options have an extension" do
24
+
25
+ before do
26
+ @document = stub(:person_id => "5")
27
+ @block = Proc.new {
28
+ def extension
29
+ "Testing"
30
+ end
31
+ }
32
+ @options = Mongoid::Associations::Options.new(:name => :person, :extend => @block)
33
+ @related = stub
34
+ Person.expects(:find).with(@document.person_id).returns(@related)
35
+ @association = Mongoid::Associations::ReferencedIn.new(@document, "5", @options)
36
+ end
37
+
38
+ it "adds the extension module" do
39
+ @association.extension.should == "Testing"
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ describe ".instantiate" do
47
+
48
+ context "when foreign key is not nil" do
49
+
50
+ before do
51
+ @document = stub(:person_id => "5")
52
+ @options = Mongoid::Associations::Options.new(:name => :person)
53
+ end
54
+
55
+ it "delegates to new" do
56
+ Mongoid::Associations::ReferencedIn.expects(:new).with(@document, "5", @options, nil)
57
+ Mongoid::Associations::ReferencedIn.instantiate(@document, @options)
58
+ end
59
+
60
+ end
61
+
62
+ context "when foreign key is nil" do
63
+
64
+ before do
65
+ @document = stub(:person_id => nil)
66
+ @options = Mongoid::Associations::Options.new(:name => :person)
67
+ end
68
+
69
+ it "returns nil" do
70
+ Mongoid::Associations::ReferencedIn.instantiate(@document, @options).should be_nil
71
+ end
72
+
73
+ end
74
+
75
+ end
76
+
77
+ describe "#method_missing" do
78
+
79
+ before do
80
+ @person = Person.new(:title => "Mr")
81
+ @document = stub(:person_id => "5")
82
+ @options = Mongoid::Associations::Options.new(:name => :person)
83
+ Person.expects(:find).with(@document.person_id).returns(@person)
84
+ @association = Mongoid::Associations::ReferencedIn.new(@document, "5", @options)
85
+ end
86
+
87
+ context "when getting values" do
88
+
89
+ it "delegates to the document" do
90
+ @association.title.should == "Mr"
91
+ end
92
+
93
+ end
94
+
95
+ context "when setting values" do
96
+
97
+ it "delegates to the document" do
98
+ @association.title = "Sir"
99
+ @association.title.should == "Sir"
100
+ end
101
+
102
+ end
103
+
104
+ end
105
+
106
+ describe ".macro" do
107
+
108
+ it "returns :referenced_in" do
109
+ Mongoid::Associations::ReferencedIn.macro.should == :referenced_in
110
+ end
111
+
112
+ end
113
+
114
+ describe ".update" do
115
+
116
+ before do
117
+ @related = stub(:id => "5")
118
+ @child = Game.new
119
+ @options = Mongoid::Associations::Options.new(:name => :person)
120
+ @association = Mongoid::Associations::ReferencedIn.update(@related, @child, @options)
121
+ end
122
+
123
+ it "sets the related object id on the parent" do
124
+ @child.person_id.should == "5"
125
+ end
126
+
127
+ it "returns the proxy" do
128
+ @association.target.should == @related
129
+ end
130
+
131
+ context "when target is nil" do
132
+
133
+ it "returns nil" do
134
+ Mongoid::Associations::ReferencedIn.update(nil, @child, @options).should be_nil
135
+ end
136
+
137
+ it "removes the association" do
138
+ Mongoid::Associations::ReferencedIn.update(nil, @child, @options)
139
+ @child.person.should be_nil
140
+ end
141
+ end
142
+
143
+ end
144
+
145
+ end
@@ -0,0 +1,424 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Associations::ReferencesManyAsArray do
4
+
5
+ let(:block) do
6
+ Proc.new do
7
+ def extension
8
+ "Testing"
9
+ end
10
+ end
11
+ end
12
+
13
+ let(:options) do
14
+ Mongoid::Associations::Options.new(
15
+ :name => :preferences,
16
+ :foreign_key => "preference_ids",
17
+ :extend => block,
18
+ :inverse_of => :people
19
+ )
20
+ end
21
+
22
+ describe "#<<" do
23
+
24
+ context "when the parent document is new" do
25
+
26
+ let(:person) do
27
+ Person.new
28
+ end
29
+
30
+ let(:preference) do
31
+ Preference.new(:name => "Brightness")
32
+ end
33
+
34
+ before do
35
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
36
+ person, options
37
+ )
38
+ @association << preference
39
+ end
40
+
41
+ it "appends the document to the association" do
42
+ @association.target.first.should == preference
43
+ end
44
+
45
+ it "adds the id to the association ids" do
46
+ person.preference_ids.should include(preference.id)
47
+ end
48
+
49
+ it "adds the reverse association id" do
50
+ preference.person_ids.should include(person.id)
51
+ end
52
+ end
53
+
54
+ context "when the parent document is not new" do
55
+
56
+ let(:person) do
57
+ Person.new
58
+ end
59
+
60
+ let(:preference) do
61
+ Preference.new(:name => "Brightness")
62
+ end
63
+
64
+ before do
65
+ person.instance_variable_set(:@new_record, false)
66
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
67
+ person, options, []
68
+ )
69
+ @association << preference
70
+ end
71
+
72
+ it "appends the document to the association" do
73
+ @association.target.first.should == preference
74
+ end
75
+
76
+ it "adds the id to the association ids" do
77
+ person.preference_ids.should include(preference.id)
78
+ end
79
+
80
+ it "adds the reverse association id" do
81
+ preference.person_ids.should include(person.id)
82
+ end
83
+ end
84
+ end
85
+
86
+ describe "#build" do
87
+
88
+ context "when the parent is new" do
89
+
90
+ let(:person) do
91
+ Person.new
92
+ end
93
+
94
+ before do
95
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
96
+ person, options
97
+ )
98
+ @preference = @association.build(:name => "Brightness")
99
+ end
100
+
101
+ it "appends the document to the association" do
102
+ @association.target.first.should == @preference
103
+ end
104
+
105
+ it "adds the id to the association ids" do
106
+ person.preference_ids.should include(@preference.id)
107
+ end
108
+
109
+ it "adds the reverse association id" do
110
+ @preference.person_ids.should include(person.id)
111
+ end
112
+ end
113
+
114
+ context "when the parent is not new" do
115
+
116
+ let(:person) do
117
+ Person.new
118
+ end
119
+
120
+ before do
121
+ person.instance_variable_set(:@new_record, false)
122
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
123
+ person, options, []
124
+ )
125
+ @preference = @association.build(:name => "Brightness")
126
+ end
127
+
128
+ it "appends the document to the association" do
129
+ @association.target.first.should == @preference
130
+ end
131
+
132
+ it "adds the id to the association ids" do
133
+ person.preference_ids.should include(@preference.id)
134
+ end
135
+
136
+ it "adds the reverse association id" do
137
+ @preference.person_ids.should include(person.id)
138
+ end
139
+ end
140
+ end
141
+
142
+ describe "#create" do
143
+
144
+ context "when the parent is new" do
145
+
146
+ let(:person) do
147
+ Person.new
148
+ end
149
+
150
+ before do
151
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
152
+ person, options
153
+ )
154
+ @preference = @association.create(:name => "Brightness")
155
+ end
156
+
157
+ it "appends the document to the association" do
158
+ @association.target.first.should == @preference
159
+ end
160
+
161
+ it "adds the id to the association ids" do
162
+ person.preference_ids.should include(@preference.id)
163
+ end
164
+
165
+ it "adds the reverse association id" do
166
+ @preference.person_ids.should include(person.id)
167
+ end
168
+
169
+ it "saves the association" do
170
+ @preference.new_record?.should == false
171
+ end
172
+ end
173
+
174
+ context "when the parent is not new" do
175
+
176
+ let(:person) do
177
+ Person.new
178
+ end
179
+
180
+ before do
181
+ person.instance_variable_set(:@new_record, false)
182
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
183
+ person, options, []
184
+ )
185
+ @preference = @association.create(:name => "Brightness")
186
+ end
187
+
188
+ it "appends the document to the association" do
189
+ @association.target.first.should == @preference
190
+ end
191
+
192
+ it "adds the id to the association ids" do
193
+ person.preference_ids.should include(@preference.id)
194
+ end
195
+
196
+ it "adds the reverse association id" do
197
+ @preference.person_ids.should include(person.id)
198
+ end
199
+
200
+ it "saves the association" do
201
+ @preference.new_record?.should == false
202
+ end
203
+ end
204
+ end
205
+
206
+ describe "#create!" do
207
+
208
+ context "when validation passes" do
209
+
210
+ let(:person) do
211
+ Person.new
212
+ end
213
+
214
+ before do
215
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
216
+ person, options
217
+ )
218
+ @preference = @association.create!(:name => "Brightness")
219
+ end
220
+
221
+ it "saves the association" do
222
+ @preference.new_record?.should == false
223
+ end
224
+ end
225
+
226
+ context "when validation fails" do
227
+
228
+ let(:person) do
229
+ Person.new
230
+ end
231
+
232
+ before do
233
+ person.instance_variable_set(:@new_record, false)
234
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
235
+ person, options, []
236
+ )
237
+ end
238
+
239
+ it "raises an error" do
240
+ lambda { @association.create!(:name => "B") }.should
241
+ raise_error(Mongoid::Errors::Validations)
242
+ end
243
+ end
244
+ end
245
+
246
+ describe "#initialize" do
247
+
248
+ let(:person) do
249
+ Person.new
250
+ end
251
+
252
+ context "when a target is not provided" do
253
+
254
+ before do
255
+ person.preference_ids = ["1", "2", "3"]
256
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
257
+ person, options
258
+ )
259
+ @criteria = Preference.any_in(:_id => ["1", "2", "3"])
260
+ end
261
+
262
+ it "sets the association options" do
263
+ @association.options.should == options
264
+ end
265
+
266
+ it "sets the target to the criteria for finding by ids" do
267
+ @association.target.should == @criteria
268
+ end
269
+ end
270
+
271
+ context "when a target is provided" do
272
+ before do
273
+ @preferences = [
274
+ Preference.new,
275
+ Preference.new
276
+ ]
277
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
278
+ person, options, @preferences
279
+ )
280
+ end
281
+
282
+ it "sets the target to the entries provided" do
283
+ @association.target.should == @preferences
284
+ end
285
+ end
286
+ end
287
+
288
+ describe "#concat" do
289
+
290
+ let(:person) do
291
+ Person.new
292
+ end
293
+
294
+ let(:preference) do
295
+ Preference.new(:name => "Brightness")
296
+ end
297
+
298
+ before do
299
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
300
+ person, options
301
+ )
302
+ @association.concat(preference)
303
+ end
304
+
305
+ it "delegates to <<" do
306
+ @association.target.first.should == preference
307
+ end
308
+ end
309
+
310
+ describe ".instantiate" do
311
+
312
+ let(:person) do
313
+ Person.new
314
+ end
315
+
316
+ context "when a target is not provided" do
317
+
318
+ before do
319
+ person.preference_ids = ["1", "2", "3"]
320
+ @association = Mongoid::Associations::ReferencesManyAsArray.instantiate(
321
+ person, options
322
+ )
323
+ @criteria = Preference.any_in(:_id => ["1", "2", "3"])
324
+ end
325
+
326
+ it "sets the association options" do
327
+ @association.options.should == options
328
+ end
329
+
330
+ it "sets the target to the criteria for finding by ids" do
331
+ @association.target.should == @criteria
332
+ end
333
+ end
334
+
335
+ context "when a target is provided" do
336
+ before do
337
+ @preferences = [
338
+ Preference.new,
339
+ Preference.new
340
+ ]
341
+ @association = Mongoid::Associations::ReferencesManyAsArray.instantiate(
342
+ person, options, @preferences
343
+ )
344
+ end
345
+
346
+ it "sets the target to the entries provided" do
347
+ @association.target.should == @preferences
348
+ end
349
+ end
350
+ end
351
+
352
+ describe "#method_missing" do
353
+
354
+ let(:person) do
355
+ Person.new
356
+ end
357
+
358
+ context "when target is a criteria" do
359
+
360
+ before do
361
+ person.preference_ids = ["1", "2", "3"]
362
+ @association = Mongoid::Associations::ReferencesManyAsArray.instantiate(
363
+ person, options
364
+ )
365
+ end
366
+
367
+ it "executes the criteria and sends to the result" do
368
+ Preference.expects(:any_in).with(:_id => ["1", "2", "3"]).returns([])
369
+ @association.entries.should == []
370
+ end
371
+ end
372
+
373
+ context "when target is an array" do
374
+
375
+ end
376
+ end
377
+
378
+ describe "#push" do
379
+
380
+ let(:person) do
381
+ Person.new
382
+ end
383
+
384
+ let(:preference) do
385
+ Preference.new(:name => "Brightness")
386
+ end
387
+
388
+ before do
389
+ @association = Mongoid::Associations::ReferencesManyAsArray.new(
390
+ person, options
391
+ )
392
+ @association.push(preference)
393
+ end
394
+
395
+ it "delegates to <<" do
396
+ @association.target.first.should == preference
397
+ end
398
+ end
399
+
400
+ describe ".update" do
401
+
402
+ before do
403
+ @first = Preference.new
404
+ @second = Preference.new
405
+ @related = [@first, @second]
406
+ @parent = Person.new
407
+ @proxy = Mongoid::Associations::ReferencesManyAsArray.update(@related, @parent, options)
408
+ end
409
+
410
+ it "sets the related object id on the parent" do
411
+ @first.person_ids.should include(@parent.id)
412
+ @second.person_ids.should include(@parent.id)
413
+ end
414
+
415
+ it "sets the target" do
416
+ @proxy.target.should == @related
417
+ end
418
+
419
+ it "sets the reverse association ids" do
420
+ @parent.preference_ids.should include(@first.id)
421
+ @parent.preference_ids.should include(@second.id)
422
+ end
423
+ end
424
+ end