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,623 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Document do
4
+
5
+ before do
6
+ @database = mock
7
+ @collection = stub(:name => "people")
8
+ @canvas_collection = stub(:name => "canvases")
9
+ Person.stubs(:collection).returns(@collection)
10
+ Canvas.stubs(:collection).returns(@canvas_collection)
11
+ @collection.stubs(:create_index).with(:_type, false)
12
+ @canvas_collection.stubs(:create_index).with(:_type, false)
13
+ end
14
+
15
+ describe "#==" do
16
+
17
+ context "when other object is a Document" do
18
+
19
+ context "when attributes are equal" do
20
+
21
+ before do
22
+ @document = Person.new(:_id => 1, :title => "Sir")
23
+ @other = Person.new(:_id => 1, :title => "Sir")
24
+ end
25
+
26
+ it "returns true" do
27
+ @document.should == @other
28
+ end
29
+
30
+ end
31
+
32
+ context "when attributes are not equal" do
33
+
34
+ before do
35
+ @document = Person.new(:title => "Sir")
36
+ @other = Person.new(:title => "Madam")
37
+ end
38
+
39
+ it "returns false" do
40
+ @document.should_not == @other
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ context "when other object is not a Document" do
48
+
49
+ it "returns false" do
50
+ Person.new.==("Test").should be_false
51
+ end
52
+
53
+ end
54
+
55
+ context "when comapring parent to its subclass" do
56
+
57
+ it "returns false" do
58
+ Canvas.new.should_not == Firefox.new
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+
65
+ describe "#eql?" do
66
+
67
+ context "when other object is a Document" do
68
+
69
+ context "when attributes are equal" do
70
+
71
+ before do
72
+ @document = Person.new(:_id => 1, :title => "Sir")
73
+ @other = Person.new(:_id => 1, :title => "Sir")
74
+ end
75
+
76
+ it "returns true" do
77
+ @document.eql?(@other).should be_true
78
+ end
79
+
80
+ end
81
+
82
+ context "when attributes are not equal" do
83
+
84
+ before do
85
+ @document = Person.new(:title => "Sir")
86
+ @other = Person.new(:title => "Madam")
87
+ end
88
+
89
+ it "returns false" do
90
+ @document.eql?(@other).should_not be_true
91
+ end
92
+
93
+ end
94
+
95
+ end
96
+
97
+ context "when other object is not a Document" do
98
+
99
+ it "returns false" do
100
+ Person.new.eql?("Test").should be_false
101
+ end
102
+
103
+ end
104
+
105
+ context "when comapring parent to its subclass" do
106
+
107
+ it "returns false" do
108
+ Canvas.new.eql?(Firefox.new).should_not be_true
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+
115
+ describe "#hash" do
116
+
117
+ before do
118
+ @document = Person.new(:_id => 1, :title => "Sir")
119
+ @other = Person.new(:_id => 2, :title => "Sir")
120
+ end
121
+
122
+ it "deligates to id" do
123
+ @document.hash.should == @document.id.hash
124
+ end
125
+
126
+ it "has unique hash per id" do
127
+ @document.hash.should_not == @other.hash
128
+ end
129
+
130
+ end
131
+
132
+ describe "#alias_method_chain" do
133
+
134
+ context "on a field setter" do
135
+
136
+ before do
137
+ @person = Person.new
138
+ end
139
+
140
+ it "chains the method properly" do
141
+ @person.score = 10
142
+ @person.rescored.should == 30
143
+ end
144
+
145
+ end
146
+
147
+ end
148
+
149
+ describe "#assimilate" do
150
+
151
+ before do
152
+ @child = Name.new(:first_name => "Hank", :last_name => "Moody")
153
+ @parent = Person.new(:title => "Mr.")
154
+ @options = Mongoid::Associations::Options.new(:name => :name)
155
+ end
156
+
157
+ it "sets up all associations in the object graph" do
158
+ @child.assimilate(@parent, @options)
159
+ @parent.name.should == @child
160
+ end
161
+
162
+ end
163
+
164
+ describe ".db" do
165
+
166
+ before do
167
+ @db = stub
168
+ @collection.expects(:db).returns(@db)
169
+ end
170
+
171
+ it "returns the database from the collection" do
172
+ Person.db.should == @db
173
+ end
174
+ end
175
+
176
+ describe "#clone" do
177
+
178
+ before do
179
+ @comment = Comment.new(:text => "Woooooo")
180
+ @clone = @comment.clone
181
+ end
182
+
183
+ it "returns a new document sans id and versions" do
184
+ @clone.id.should_not == @comment.id
185
+ @clone.versions.should be_empty
186
+ end
187
+
188
+ end
189
+
190
+ describe ".embedded" do
191
+
192
+ context "when the document is embedded" do
193
+
194
+ it "returns true" do
195
+ address = Address.new
196
+ address.embedded.should be_true
197
+ end
198
+
199
+ end
200
+
201
+ context "when the document is not embedded" do
202
+
203
+ it "returns false" do
204
+ person = Person.new
205
+ person.embedded.should be_false
206
+ end
207
+
208
+ end
209
+
210
+ context "when a subclass is embedded" do
211
+
212
+ it "returns true" do
213
+ circle = Circle.new
214
+ circle.embedded.should be_true
215
+ end
216
+
217
+ end
218
+
219
+ end
220
+
221
+ describe ".hereditary" do
222
+
223
+ context "when the class is part of a hierarchy" do
224
+
225
+ it "returns true" do
226
+ Canvas.hereditary.should be_true
227
+ end
228
+
229
+ end
230
+
231
+ context "when the class is not part of a hierarchy" do
232
+
233
+ it "returns false" do
234
+ Game.hereditary.should be_false
235
+ end
236
+
237
+ end
238
+
239
+ end
240
+
241
+ describe ".human_name" do
242
+
243
+ it "returns the class name underscored and humanized" do
244
+ MixedDrink.model_name.human.should == "Mixed drink"
245
+ end
246
+
247
+ end
248
+
249
+ describe ".initialize" do
250
+
251
+ context "when passed a block" do
252
+
253
+ it "yields self to the block" do
254
+ person = Person.new do |p|
255
+ p.title = "Sir"
256
+ p.age = 60
257
+ end
258
+ person.title.should == "Sir"
259
+ person.age.should == 60
260
+ end
261
+
262
+ end
263
+
264
+ context "with no attributes" do
265
+
266
+ it "sets default attributes" do
267
+ person = Person.new
268
+ person.attributes.empty?.should be_false
269
+ person.age.should == 100
270
+ person.blood_alcohol_content.should == 0.0
271
+ end
272
+
273
+ end
274
+
275
+ context "with nil attributes" do
276
+
277
+ before do
278
+ @person = Person.new(nil)
279
+ end
280
+
281
+ it "sets default attributes" do
282
+ @person.attributes.empty?.should be_false
283
+ @person.age.should == 100
284
+ @person.blood_alcohol_content.should == 0.0
285
+ end
286
+
287
+ end
288
+
289
+ context "with attributes from another document" do
290
+
291
+ let(:person) do
292
+ Person.new(Person.new.attributes)
293
+ end
294
+
295
+ it "is a new record with a new id" do
296
+ person.new_record?.should be_true
297
+ end
298
+ end
299
+
300
+ context "with attributes" do
301
+
302
+ before do
303
+ @attributes = {
304
+ :_id => "1",
305
+ :title => "value",
306
+ :age => "30",
307
+ :terms => "true",
308
+ :name => {
309
+ :_id => "2", :first_name => "Test", :last_name => "User"
310
+ },
311
+ :addresses => [
312
+ { :_id => "3", :street => "First Street" },
313
+ { :_id => "4", :street => "Second Street" }
314
+ ]
315
+ }
316
+ end
317
+
318
+ it "sets the attributes hash on the object properly casted" do
319
+ person = Person.new(@attributes)
320
+ person.attributes[:age].should == 30
321
+ person.attributes[:terms].should be_true
322
+ end
323
+
324
+ it "is a new record" do
325
+ Person.new(@attributes).new_record?.should == true
326
+ end
327
+ end
328
+
329
+ context "with a primary key" do
330
+
331
+ context "when the value for the key exists" do
332
+
333
+ before do
334
+ Address.key :street
335
+ @address = Address.new(:street => "Test")
336
+ end
337
+
338
+ it "sets the primary key" do
339
+ @address.id.should == "test"
340
+ end
341
+
342
+ end
343
+
344
+ end
345
+
346
+ context "without a type specified" do
347
+
348
+ it "sets the type" do
349
+ Person.new._type.should == "Person"
350
+ end
351
+
352
+ end
353
+
354
+ end
355
+
356
+ describe ".instantiate" do
357
+
358
+ context "when attributes have an id" do
359
+
360
+ before do
361
+ @attributes = { "_id" => "1", "_type" => "Person", "title" => "Sir", "age" => 30 }
362
+ end
363
+
364
+ it "sets the attributes directly" do
365
+ person = Person.instantiate(@attributes)
366
+ person._id.should == "1"
367
+ person._type.should == "Person"
368
+ person.title.should == "Sir"
369
+ person.age.should == 30
370
+ end
371
+
372
+ end
373
+
374
+ context "with nil attributes" do
375
+
376
+ it "sets the attributes directly" do
377
+ person = Person.instantiate(nil)
378
+ person.id.should_not be_nil
379
+ end
380
+
381
+ end
382
+
383
+ end
384
+
385
+ describe ".key" do
386
+
387
+ context "when key is single field" do
388
+
389
+ before do
390
+ Address.key :street
391
+ @address = Address.new(:street => "Testing Street Name")
392
+ end
393
+
394
+ it "adds the callback for primary key generation" do
395
+ @address.run_callbacks(:save)
396
+ @address.id.should == "testing-street-name"
397
+ end
398
+
399
+ end
400
+
401
+ context "when key is composite" do
402
+
403
+ before do
404
+ Address.key :street, :post_code
405
+ @address = Address.new(:street => "Testing Street Name", :post_code => "94123")
406
+ end
407
+
408
+ it "combines all fields" do
409
+ @address.run_callbacks(:save)
410
+ @address.id.should == "testing-street-name-94123"
411
+ end
412
+
413
+ end
414
+
415
+ context "when key is on a subclass" do
416
+
417
+ before do
418
+ Firefox.key :name
419
+ end
420
+
421
+ it "sets the key for the entire hierarchy" do
422
+ Canvas.primary_key.should == [:name]
423
+ end
424
+
425
+ end
426
+
427
+ end
428
+
429
+ describe "#_parent" do
430
+
431
+ before do
432
+ @attributes = { :title => "Sir",
433
+ :addresses => [
434
+ { :street => "Street 1" },
435
+ { :street => "Street 2" } ] }
436
+ @person = Person.new(@attributes)
437
+ end
438
+
439
+ context "when document is embedded" do
440
+
441
+ it "returns the parent document" do
442
+ @person.addresses.first._parent.should == @person
443
+ end
444
+
445
+ end
446
+
447
+ context "when document is root" do
448
+
449
+ it "returns nil" do
450
+ @person._parent.should be_nil
451
+ end
452
+
453
+ end
454
+
455
+ end
456
+
457
+ describe "#parentize" do
458
+
459
+ before do
460
+ @parent = Person.new
461
+ @child = Name.new
462
+ end
463
+
464
+ it "sets the parent on each element" do
465
+ @child.parentize(@parent, :child)
466
+ @child._parent.should == @parent
467
+ end
468
+
469
+ end
470
+
471
+ describe "#reload" do
472
+
473
+ before do
474
+ @attributes = { "title" => "Herr" }
475
+ @person = Person.new(:_id => BSON::ObjectID.new.to_s)
476
+ @collection.expects(:find_one).with(:_id => @person.id).returns(@attributes)
477
+ end
478
+
479
+ it "reloads the object attribtues from the database" do
480
+ @person.reload
481
+ @person.attributes.should == @attributes
482
+ end
483
+
484
+ it 'should return a person object' do
485
+ @person.reload.should be_kind_of(Person)
486
+ end
487
+
488
+ end
489
+
490
+ describe "#remove" do
491
+
492
+ context "when removing an element from a has many" do
493
+
494
+ before do
495
+ @person = Person.new
496
+ @address = Address.new(:street => "Testing")
497
+ @person.addresses << @address
498
+ end
499
+
500
+ it "removes the child document attributes" do
501
+ @person.remove(@address)
502
+ @person.addresses.size.should == 0
503
+ end
504
+
505
+ end
506
+
507
+ context "when removing a has one" do
508
+
509
+ before do
510
+ @person = Person.new
511
+ @name = Name.new(:first_name => "Neytiri")
512
+ @person.name = @name
513
+ end
514
+
515
+ it "removes the child document attributes" do
516
+ @person.remove(@name)
517
+ @person.name.should be_nil
518
+ end
519
+ end
520
+ end
521
+
522
+ describe "#_root" do
523
+
524
+ before do
525
+ @person = Person.new(:title => "Mr")
526
+ @phone_number = Phone.new(:number => "415-555-1212")
527
+ @country_code = CountryCode.new(:code => 1)
528
+ @phone_number.country_code = @country_code
529
+ @person.phone_numbers << @phone_number
530
+ end
531
+
532
+ context "when document is the root" do
533
+
534
+ it "returns self" do
535
+ @person._root.should == @person
536
+ end
537
+ end
538
+
539
+ context "when document is embedded one level" do
540
+
541
+ it "returns the parent" do
542
+ @phone_number._root.should == @person
543
+ end
544
+ end
545
+
546
+ context "when document is embedded multiple levels" do
547
+
548
+ it "returns the top level parent" do
549
+ @country_code._root.should == @person
550
+ end
551
+ end
552
+ end
553
+
554
+ describe "._types" do
555
+
556
+ it "returns all subclasses for the class plus the class" do
557
+ types = Canvas._types
558
+ types.size.should == 3
559
+ types.should include("Firefox")
560
+ types.should include("Browser")
561
+ types.should include("Canvas")
562
+ end
563
+
564
+ it "does not return parent classes" do
565
+ types = Browser._types
566
+ types.size.should == 2
567
+ types.should include("Firefox")
568
+ types.should include("Browser")
569
+ end
570
+
571
+ it 'should return strings' do
572
+ types = Canvas._types
573
+ types.each do |type|
574
+ type.should be_an_instance_of String
575
+ end
576
+ end
577
+
578
+ end
579
+
580
+ describe "#to_a" do
581
+
582
+ it "returns an array with the document in it" do
583
+ person = Person.new
584
+ person.to_a.should == [ person ]
585
+ end
586
+
587
+ end
588
+
589
+ describe "#to_key" do
590
+
591
+ context "when the document is new" do
592
+
593
+ before do
594
+ @person = Person.new
595
+ end
596
+
597
+ it "returns nil" do
598
+ @person.to_key.should be_nil
599
+ end
600
+ end
601
+
602
+ context "when the document is not new" do
603
+
604
+ before do
605
+ @id = BSON::ObjectID.new.to_s
606
+ @person = Person.instantiate("_id" => @id)
607
+ end
608
+
609
+ it "returns the id in an array" do
610
+ @person.to_key.should == [ @id ]
611
+ end
612
+ end
613
+ end
614
+
615
+ describe "#to_param" do
616
+
617
+ it "returns the id" do
618
+ id = BSON::ObjectID.new.to_s
619
+ Person.instantiate("_id" => id).to_param.should == id.to_s
620
+ end
621
+
622
+ end
623
+ end