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,287 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Associations::EmbedsOne do
4
+
5
+ before do
6
+ @attributes = { "mixed_drink" => {
7
+ "name" => "Jack and Coke", "_type" => "MixedDrink" },
8
+ "writer" => { "speed" => 50, "_type" => "HtmlWriter" }
9
+ }
10
+ @document = stub(:raw_attributes => @attributes, :observe => true, :update_child => nil)
11
+ end
12
+
13
+ describe "#build_*" do
14
+
15
+ context "when attributes provided" do
16
+
17
+ before do
18
+ @association = Mongoid::Associations::EmbedsOne.new(
19
+ @document,
20
+ @attributes["mixed_drink"],
21
+ Mongoid::Associations::Options.new(:name => :mixed_drink)
22
+ )
23
+ end
24
+
25
+ it "replaces the existing has_one" do
26
+ drink = @association.send(:build, { :name => "Sapphire and Tonic" })
27
+ drink.name.should == "Sapphire and Tonic"
28
+ end
29
+
30
+ end
31
+
32
+ context "when a type is supplied" do
33
+
34
+ before do
35
+ @association = Mongoid::Associations::EmbedsOne.new(
36
+ @document,
37
+ @attributes["writer"],
38
+ Mongoid::Associations::Options.new(:name => :writer)
39
+ )
40
+ end
41
+
42
+ it "instantiates a class of that type" do
43
+ writer = @association.send(:build, { :speed => 500 }, HtmlWriter)
44
+ writer.should be_a_kind_of(HtmlWriter)
45
+ writer.speed.should == 500
46
+ end
47
+
48
+ end
49
+
50
+ context "setting the parent relationship" do
51
+
52
+ before do
53
+ @person = Person.new
54
+ end
55
+
56
+ it "happens before any other operation" do
57
+ name = @person.build_name(:set_parent => true, :first_name => "Steve")
58
+ name._parent.should == @person
59
+ @person.name.should == name
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+
66
+ describe "#initialize" do
67
+
68
+ before do
69
+ @parent = Person.new(:title => "Dr")
70
+ @name = Name.new(:first_name => "Richard", :last_name => "Dawkins")
71
+ @parent.name = @name
72
+ @block = Proc.new {
73
+ def extension
74
+ "Testing"
75
+ end
76
+ }
77
+ @options = Mongoid::Associations::Options.new(:name => :name, :extend => @block)
78
+ @association = Mongoid::Associations::EmbedsOne.new(@parent, {}, @options)
79
+ end
80
+
81
+ context "when the options have an extension" do
82
+
83
+ it "adds the extension module" do
84
+ @association.extension.should == "Testing"
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+
91
+ describe ".instantiate" do
92
+
93
+ context "when the attributes are nil" do
94
+
95
+ before do
96
+ @document = Person.new
97
+ @association = Mongoid::Associations::EmbedsOne.instantiate(
98
+ @document,
99
+ Mongoid::Associations::Options.new(:name => :name)
100
+ )
101
+ end
102
+
103
+ it "returns nil" do
104
+ @association.should be_nil
105
+ end
106
+
107
+ end
108
+
109
+ context "when attributes are empty" do
110
+
111
+ before do
112
+ @document = stub(:raw_attributes => { "name" => {} })
113
+ @association = Mongoid::Associations::EmbedsOne.instantiate(
114
+ @document,
115
+ Mongoid::Associations::Options.new(:name => :name)
116
+ )
117
+ end
118
+
119
+ it "returns nil" do
120
+ @association.should be_nil
121
+ end
122
+
123
+ end
124
+
125
+ context "when attributes exist" do
126
+
127
+ before do
128
+ @document = stub(:raw_attributes => { "name" => { "first_name" => "Test" } })
129
+ @options = Mongoid::Associations::Options.new(:name => :name)
130
+ end
131
+
132
+ it "delegates to new" do
133
+ Mongoid::Associations::EmbedsOne.expects(:new).with(
134
+ @document,
135
+ { "first_name" => "Test" },
136
+ @options,
137
+ nil
138
+ )
139
+ Mongoid::Associations::EmbedsOne.instantiate(@document, @options)
140
+ end
141
+
142
+ end
143
+
144
+ end
145
+
146
+ describe "#method_missing" do
147
+
148
+ before do
149
+ @association = Mongoid::Associations::EmbedsOne.new(
150
+ @document,
151
+ @attributes["mixed_drink"],
152
+ Mongoid::Associations::Options.new(:name => :mixed_drink)
153
+ )
154
+ end
155
+
156
+ context "when getting values" do
157
+
158
+ it "delegates to the document" do
159
+ @association.name.should == "Jack and Coke"
160
+ end
161
+
162
+ end
163
+
164
+ context "when setting values" do
165
+
166
+ it "delegates to the document" do
167
+ @association.name = "Jack and Coke"
168
+ @association.name.should == "Jack and Coke"
169
+ end
170
+
171
+ end
172
+
173
+ end
174
+
175
+ describe "#nested_build" do
176
+
177
+ context "when attributes provided" do
178
+
179
+ before do
180
+ @association = Mongoid::Associations::EmbedsOne.new(
181
+ @document,
182
+ @attributes["mixed_drink"],
183
+ Mongoid::Associations::Options.new(:name => :mixed_drink)
184
+ )
185
+ end
186
+
187
+ it "replaces the existing has_one" do
188
+ drink = @association.nested_build({ :name => "Sapphire and Tonic" })
189
+ drink.name.should == "Sapphire and Tonic"
190
+ end
191
+
192
+ end
193
+
194
+ end
195
+
196
+ describe ".macro" do
197
+
198
+ it "returns :embeds_one" do
199
+ Mongoid::Associations::EmbedsOne.macro.should == :embeds_one
200
+ end
201
+
202
+ end
203
+
204
+ describe ".update" do
205
+
206
+ context "when setting to a non-nil value" do
207
+
208
+ before do
209
+ @name = Name.new(:first_name => "Donald")
210
+ @person = Person.new(:title => "Sir")
211
+ @association = Mongoid::Associations::EmbedsOne.update(
212
+ @name,
213
+ @person,
214
+ Mongoid::Associations::Options.new(:name => :name)
215
+ )
216
+ end
217
+
218
+ it "parentizes the child document" do
219
+ @name._parent.should == @person
220
+ end
221
+
222
+ it "sets the attributes of the child on the parent" do
223
+ @person.attributes[:name].should ==
224
+ { "_id" => "donald", "first_name" => "Donald" }
225
+ end
226
+
227
+ it "returns the proxy" do
228
+ @association.target.should == @name
229
+ end
230
+
231
+ end
232
+
233
+ context "when setting the object to nil" do
234
+
235
+ before do
236
+ @name = Name.new(:first_name => "Donald")
237
+ @person = Person.new(:title => "Sir")
238
+ Mongoid::Associations::EmbedsOne.update(
239
+ nil,
240
+ @person,
241
+ Mongoid::Associations::Options.new(:name => :name)
242
+ )
243
+ end
244
+
245
+ it "clears out the association" do
246
+ @person.name.should be_nil
247
+ end
248
+
249
+ end
250
+
251
+ end
252
+
253
+ describe "#to_a" do
254
+
255
+ before do
256
+ @association = Mongoid::Associations::EmbedsOne.new(
257
+ @document,
258
+ @attributes["mixed_drink"],
259
+ Mongoid::Associations::Options.new(:name => :mixed_drink)
260
+ )
261
+ end
262
+
263
+ it "returns the target in a new array" do
264
+ @association.to_a.first.should be_a_kind_of(MixedDrink)
265
+ end
266
+
267
+ end
268
+
269
+ describe "#valid?" do
270
+
271
+ context "when the document is not nil" do
272
+
273
+ before do
274
+ @document = stub(:raw_attributes => { "name" => { "first_name" => "Test" } }, :observe => true, :update_child => nil)
275
+ @options = Mongoid::Associations::Options.new(:name => :name)
276
+ @association = Mongoid::Associations::EmbedsOne.instantiate(@document, @options)
277
+ end
278
+
279
+ it "validates the document" do
280
+ @association.valid?.should be_true
281
+ end
282
+
283
+ end
284
+
285
+ end
286
+
287
+ end
@@ -0,0 +1,90 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Associations::ForeignKey do
4
+
5
+ describe ".constraint" do
6
+
7
+ context "when foreign key option provided" do
8
+
9
+ it "returns the key" do
10
+ Person.constraint(
11
+ :post,
12
+ { :foreign_key => :user_id },
13
+ :in
14
+ ).should == "user_id"
15
+ end
16
+ end
17
+
18
+ context "for a references_one" do
19
+
20
+ context "when the class is one word" do
21
+
22
+ it "returns the class name plus _id" do
23
+ Person.constraint(
24
+ :post,
25
+ {},
26
+ :one
27
+ ).should == "person_id"
28
+ end
29
+ end
30
+
31
+ context "when the class is multiple words" do
32
+
33
+ it "returns the underscored class name plus _id" do
34
+ MixedDrink.constraint(
35
+ :post,
36
+ {},
37
+ :one
38
+ ).should == "mixed_drink_id"
39
+ end
40
+ end
41
+ end
42
+
43
+ context "for a references_many" do
44
+
45
+ context "when the class is one word" do
46
+
47
+ it "returns the class name plus _id" do
48
+ Person.constraint(
49
+ :posts,
50
+ {},
51
+ :many
52
+ ).should == "person_id"
53
+ end
54
+ end
55
+
56
+ context "when the class is multiple words" do
57
+
58
+ it "returns the underscored class name plus _id" do
59
+ MixedDrink.constraint(
60
+ :posts,
61
+ {},
62
+ :many
63
+ ).should == "mixed_drink_id"
64
+ end
65
+ end
66
+ end
67
+
68
+ context "for a references_many_as_array" do
69
+
70
+ it "returns the singularized association name plus _ids" do
71
+ Person.constraint(
72
+ :posts,
73
+ {},
74
+ :many_as_array
75
+ ).should == "post_ids"
76
+ end
77
+ end
78
+
79
+ context "for a referenced_in" do
80
+
81
+ it "returns the name plus _id" do
82
+ Post.constraint(
83
+ :person,
84
+ {},
85
+ :in
86
+ ).should == "person_id"
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,110 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Associations::MetaData do
4
+
5
+ before do
6
+ @extension = lambda { "Test" }
7
+ end
8
+
9
+ let(:association) do
10
+ Mongoid::Associations::ReferencesMany
11
+ end
12
+
13
+ let(:options) do
14
+ Mongoid::Associations::Options.new(
15
+ :name => :games,
16
+ :extend => @extension,
17
+ :foreign_key => "person_id",
18
+ :inverse_of => :people
19
+ )
20
+ end
21
+
22
+ let(:metadata) do
23
+ Mongoid::Associations::MetaData.new(association, options)
24
+ end
25
+
26
+ describe "#embedded?" do
27
+
28
+ context "when association is embedded" do
29
+
30
+ before do
31
+ @embedded = Mongoid::Associations::EmbedsOne
32
+ @meta = Mongoid::Associations::MetaData.new(@embedded, nil)
33
+ end
34
+
35
+ it "returns true" do
36
+ @meta.embedded?.should == true
37
+ end
38
+ end
39
+
40
+ context "when association is not embedded" do
41
+
42
+ it "returns false" do
43
+ metadata.embedded?.should == false
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "#extension" do
49
+
50
+ it "delegates to the options" do
51
+ metadata.extension.should == @extension
52
+ end
53
+ end
54
+
55
+ describe "#foreign_key" do
56
+
57
+ it "delegates to the options" do
58
+ metadata.foreign_key.should == "person_id"
59
+ end
60
+ end
61
+
62
+ describe "#inverse_of" do
63
+
64
+ it "delegates to the options" do
65
+ metadata.inverse_of.should == :people
66
+ end
67
+ end
68
+
69
+ describe "#klass" do
70
+
71
+ it "returns the associated klass" do
72
+ metadata.klass.should == Game
73
+ end
74
+ end
75
+
76
+ describe "#macro" do
77
+
78
+ it "returns the association macro" do
79
+ metadata.macro.should == :references_many
80
+ end
81
+ end
82
+
83
+ describe "#name" do
84
+
85
+ it "delegates to the options" do
86
+ metadata.name.should == "games"
87
+ end
88
+ end
89
+
90
+ describe "#options" do
91
+
92
+ it "returns the association options" do
93
+ metadata.options.should == options
94
+ end
95
+ end
96
+
97
+ describe "#polymorphic" do
98
+
99
+ it "delegates to the options" do
100
+ metadata.polymorphic.should be_false
101
+ end
102
+ end
103
+
104
+ describe "#association" do
105
+
106
+ it "returns the association type" do
107
+ metadata.association.should == Mongoid::Associations::ReferencesMany
108
+ end
109
+ end
110
+ end