mongoid 2.0.0.alpha → 2.0.0.beta.5

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 (216) hide show
  1. data/lib/mongoid.rb +11 -5
  2. data/lib/mongoid/associations.rb +112 -107
  3. data/lib/mongoid/associations/belongs_to_related.rb +2 -3
  4. data/lib/mongoid/associations/embedded_in.rb +12 -4
  5. data/lib/mongoid/associations/{embed_many.rb → embeds_many.rb} +101 -32
  6. data/lib/mongoid/associations/{embed_one.rb → embeds_one.rb} +10 -10
  7. data/lib/mongoid/associations/has_many_related.rb +51 -5
  8. data/lib/mongoid/associations/has_one_related.rb +9 -5
  9. data/lib/mongoid/associations/meta_data.rb +2 -1
  10. data/lib/mongoid/associations/options.rb +15 -6
  11. data/lib/mongoid/associations/proxy.rb +14 -21
  12. data/lib/mongoid/attributes.rb +34 -13
  13. data/lib/mongoid/callbacks.rb +1 -2
  14. data/lib/mongoid/collection.rb +4 -3
  15. data/lib/mongoid/collections.rb +41 -0
  16. data/lib/mongoid/collections/master.rb +3 -2
  17. data/lib/mongoid/collections/slaves.rb +3 -2
  18. data/lib/mongoid/components.rb +4 -1
  19. data/lib/mongoid/config.rb +163 -13
  20. data/lib/mongoid/contexts.rb +1 -2
  21. data/lib/mongoid/contexts/enumerable.rb +1 -1
  22. data/lib/mongoid/contexts/mongo.rb +1 -1
  23. data/lib/mongoid/contexts/paging.rb +10 -2
  24. data/lib/mongoid/criteria.rb +13 -22
  25. data/lib/mongoid/criterion/exclusion.rb +3 -3
  26. data/lib/mongoid/criterion/inclusion.rb +17 -0
  27. data/lib/mongoid/criterion/optional.rb +1 -1
  28. data/lib/mongoid/dirty.rb +253 -0
  29. data/lib/mongoid/document.rb +40 -85
  30. data/lib/mongoid/errors.rb +48 -1
  31. data/lib/mongoid/extensions.rb +11 -9
  32. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  33. data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
  34. data/lib/mongoid/extensions/date/conversions.rb +13 -4
  35. data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
  36. data/lib/mongoid/extensions/float/conversions.rb +5 -1
  37. data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
  38. data/lib/mongoid/extensions/hash/conversions.rb +34 -4
  39. data/lib/mongoid/extensions/integer/conversions.rb +5 -1
  40. data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
  41. data/lib/mongoid/extensions/object/conversions.rb +3 -3
  42. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  43. data/lib/mongoid/extensions/symbol/inflections.rb +5 -2
  44. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  45. data/lib/mongoid/factory.rb +2 -1
  46. data/lib/mongoid/field.rb +15 -2
  47. data/lib/mongoid/fields.rb +1 -1
  48. data/lib/mongoid/identity.rb +3 -3
  49. data/lib/mongoid/indexes.rb +3 -3
  50. data/lib/mongoid/matchers.rb +1 -2
  51. data/lib/mongoid/memoization.rb +8 -2
  52. data/lib/mongoid/named_scope.rb +0 -5
  53. data/lib/mongoid/observable.rb +1 -1
  54. data/lib/mongoid/paths.rb +30 -22
  55. data/lib/mongoid/persistence.rb +218 -0
  56. data/lib/mongoid/persistence/command.rb +39 -0
  57. data/lib/mongoid/persistence/insert.rb +47 -0
  58. data/lib/mongoid/persistence/insert_embedded.rb +38 -0
  59. data/lib/mongoid/persistence/remove.rb +39 -0
  60. data/lib/mongoid/persistence/remove_all.rb +37 -0
  61. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  62. data/lib/mongoid/persistence/update.rb +63 -0
  63. data/lib/mongoid/railtie.rb +53 -0
  64. data/lib/mongoid/railties/database.rake +37 -0
  65. data/lib/mongoid/timestamps.rb +2 -2
  66. data/lib/mongoid/validations.rb +2 -2
  67. data/lib/mongoid/validations/associated.rb +2 -2
  68. data/lib/mongoid/validations/uniqueness.rb +13 -2
  69. data/lib/mongoid/version.rb +4 -0
  70. data/lib/mongoid/versioning.rb +3 -2
  71. data/lib/rails/generators/mongoid/config/config_generator.rb +41 -0
  72. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
  73. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  74. data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
  75. data/lib/rails/generators/mongoid_generator.rb +61 -0
  76. metadata +76 -301
  77. data/.gitignore +0 -6
  78. data/.watchr +0 -29
  79. data/Rakefile +0 -52
  80. data/VERSION +0 -1
  81. data/caliper.yml +0 -4
  82. data/lib/mongoid/collections/mimic.rb +0 -46
  83. data/lib/mongoid/commands.rb +0 -161
  84. data/lib/mongoid/commands/create.rb +0 -19
  85. data/lib/mongoid/commands/delete.rb +0 -16
  86. data/lib/mongoid/commands/delete_all.rb +0 -23
  87. data/lib/mongoid/commands/deletion.rb +0 -18
  88. data/lib/mongoid/commands/destroy.rb +0 -17
  89. data/lib/mongoid/commands/destroy_all.rb +0 -23
  90. data/lib/mongoid/commands/save.rb +0 -29
  91. data/lib/mongoid/extensions/time/conversions.rb +0 -18
  92. data/mongoid.gemspec +0 -408
  93. data/perf/benchmark.rb +0 -77
  94. data/spec/integration/mongoid/associations_spec.rb +0 -340
  95. data/spec/integration/mongoid/attributes_spec.rb +0 -22
  96. data/spec/integration/mongoid/commands_spec.rb +0 -227
  97. data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
  98. data/spec/integration/mongoid/criteria_spec.rb +0 -272
  99. data/spec/integration/mongoid/document_spec.rb +0 -650
  100. data/spec/integration/mongoid/extensions_spec.rb +0 -22
  101. data/spec/integration/mongoid/finders_spec.rb +0 -119
  102. data/spec/integration/mongoid/inheritance_spec.rb +0 -137
  103. data/spec/integration/mongoid/named_scope_spec.rb +0 -46
  104. data/spec/models/address.rb +0 -39
  105. data/spec/models/animal.rb +0 -6
  106. data/spec/models/callbacks.rb +0 -18
  107. data/spec/models/comment.rb +0 -8
  108. data/spec/models/country_code.rb +0 -6
  109. data/spec/models/employer.rb +0 -5
  110. data/spec/models/game.rb +0 -7
  111. data/spec/models/inheritance.rb +0 -56
  112. data/spec/models/location.rb +0 -5
  113. data/spec/models/mixed_drink.rb +0 -4
  114. data/spec/models/name.rb +0 -13
  115. data/spec/models/namespacing.rb +0 -11
  116. data/spec/models/patient.rb +0 -4
  117. data/spec/models/person.rb +0 -99
  118. data/spec/models/pet.rb +0 -7
  119. data/spec/models/pet_owner.rb +0 -6
  120. data/spec/models/phone.rb +0 -7
  121. data/spec/models/post.rb +0 -15
  122. data/spec/models/translation.rb +0 -5
  123. data/spec/models/vet_visit.rb +0 -5
  124. data/spec/spec.opts +0 -3
  125. data/spec/spec_helper.rb +0 -31
  126. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
  127. data/spec/unit/mongoid/associations/embed_many_spec.rb +0 -516
  128. data/spec/unit/mongoid/associations/embed_one_spec.rb +0 -282
  129. data/spec/unit/mongoid/associations/embedded_in_spec.rb +0 -193
  130. data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -418
  131. data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
  132. data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
  133. data/spec/unit/mongoid/associations/options_spec.rb +0 -192
  134. data/spec/unit/mongoid/associations_spec.rb +0 -595
  135. data/spec/unit/mongoid/attributes_spec.rb +0 -507
  136. data/spec/unit/mongoid/callbacks_spec.rb +0 -55
  137. data/spec/unit/mongoid/collection_spec.rb +0 -187
  138. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
  139. data/spec/unit/mongoid/collections/master_spec.rb +0 -41
  140. data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
  141. data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
  142. data/spec/unit/mongoid/commands/create_spec.rb +0 -31
  143. data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
  144. data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
  145. data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -21
  146. data/spec/unit/mongoid/commands/destroy_spec.rb +0 -51
  147. data/spec/unit/mongoid/commands/save_spec.rb +0 -107
  148. data/spec/unit/mongoid/commands_spec.rb +0 -270
  149. data/spec/unit/mongoid/config_spec.rb +0 -172
  150. data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
  151. data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
  152. data/spec/unit/mongoid/contexts_spec.rb +0 -25
  153. data/spec/unit/mongoid/criteria_spec.rb +0 -824
  154. data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
  155. data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
  156. data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
  157. data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
  158. data/spec/unit/mongoid/cursor_spec.rb +0 -74
  159. data/spec/unit/mongoid/deprecation_spec.rb +0 -24
  160. data/spec/unit/mongoid/document_spec.rb +0 -818
  161. data/spec/unit/mongoid/errors_spec.rb +0 -103
  162. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
  163. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
  164. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
  165. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
  166. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
  167. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
  168. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
  169. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
  170. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -67
  171. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
  172. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
  173. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
  174. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
  175. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
  176. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
  177. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
  178. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
  179. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
  180. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
  181. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
  182. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
  183. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
  184. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
  185. data/spec/unit/mongoid/extras_spec.rb +0 -102
  186. data/spec/unit/mongoid/factory_spec.rb +0 -31
  187. data/spec/unit/mongoid/field_spec.rb +0 -143
  188. data/spec/unit/mongoid/fields_spec.rb +0 -181
  189. data/spec/unit/mongoid/finders_spec.rb +0 -404
  190. data/spec/unit/mongoid/identity_spec.rb +0 -109
  191. data/spec/unit/mongoid/indexes_spec.rb +0 -93
  192. data/spec/unit/mongoid/javascript_spec.rb +0 -48
  193. data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
  194. data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
  195. data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
  196. data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
  197. data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
  198. data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
  199. data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
  200. data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
  201. data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
  202. data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
  203. data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
  204. data/spec/unit/mongoid/matchers_spec.rb +0 -329
  205. data/spec/unit/mongoid/memoization_spec.rb +0 -75
  206. data/spec/unit/mongoid/named_scope_spec.rb +0 -123
  207. data/spec/unit/mongoid/observable_spec.rb +0 -46
  208. data/spec/unit/mongoid/paths_spec.rb +0 -124
  209. data/spec/unit/mongoid/scope_spec.rb +0 -240
  210. data/spec/unit/mongoid/state_spec.rb +0 -83
  211. data/spec/unit/mongoid/timestamps_spec.rb +0 -25
  212. data/spec/unit/mongoid/validations/associated_spec.rb +0 -103
  213. data/spec/unit/mongoid/validations/uniqueness_spec.rb +0 -47
  214. data/spec/unit/mongoid/validations_spec.rb +0 -190
  215. data/spec/unit/mongoid/versioning_spec.rb +0 -41
  216. data/spec/unit/mongoid_spec.rb +0 -46
@@ -1,282 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Associations::EmbedOne 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, :update => true)
11
- end
12
-
13
- describe "#build_*" do
14
-
15
- context "when attributes provided" do
16
-
17
- before do
18
- @association = Mongoid::Associations::EmbedOne.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::EmbedOne.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, :street => "Madison Ave")
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::EmbedOne.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::EmbedOne.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::EmbedOne.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::EmbedOne.expects(:new).with(@document, { "first_name" => "Test" }, @options)
134
- Mongoid::Associations::EmbedOne.instantiate(@document, @options)
135
- end
136
-
137
- end
138
-
139
- end
140
-
141
- describe "#method_missing" do
142
-
143
- before do
144
- @association = Mongoid::Associations::EmbedOne.new(
145
- @document,
146
- @attributes["mixed_drink"],
147
- Mongoid::Associations::Options.new(:name => :mixed_drink)
148
- )
149
- end
150
-
151
- context "when getting values" do
152
-
153
- it "delegates to the document" do
154
- @association.name.should == "Jack and Coke"
155
- end
156
-
157
- end
158
-
159
- context "when setting values" do
160
-
161
- it "delegates to the document" do
162
- @association.name = "Jack and Coke"
163
- @association.name.should == "Jack and Coke"
164
- end
165
-
166
- end
167
-
168
- end
169
-
170
- describe "#nested_build" do
171
-
172
- context "when attributes provided" do
173
-
174
- before do
175
- @association = Mongoid::Associations::EmbedOne.new(
176
- @document,
177
- @attributes["mixed_drink"],
178
- Mongoid::Associations::Options.new(:name => :mixed_drink)
179
- )
180
- end
181
-
182
- it "replaces the existing has_one" do
183
- drink = @association.nested_build({ :name => "Sapphire and Tonic" })
184
- drink.name.should == "Sapphire and Tonic"
185
- end
186
-
187
- end
188
-
189
- end
190
-
191
- describe ".macro" do
192
-
193
- it "returns :embed_one" do
194
- Mongoid::Associations::EmbedOne.macro.should == :embed_one
195
- end
196
-
197
- end
198
-
199
- describe ".update" do
200
-
201
- context "when setting to a non-nil value" do
202
-
203
- before do
204
- @name = Name.new(:first_name => "Donald")
205
- @person = Person.new(:title => "Sir")
206
- @association = Mongoid::Associations::EmbedOne.update(
207
- @name,
208
- @person,
209
- Mongoid::Associations::Options.new(:name => :name)
210
- )
211
- end
212
-
213
- it "parentizes the child document" do
214
- @name._parent.should == @person
215
- end
216
-
217
- it "sets the attributes of the child on the parent" do
218
- @person.attributes[:name].should ==
219
- { "_id" => "donald", "first_name" => "Donald", "_type" => "Name" }
220
- end
221
-
222
- it "returns the proxy" do
223
- @association.target.should == @name
224
- end
225
-
226
- end
227
-
228
- context "when setting the object to nil" do
229
-
230
- before do
231
- @name = Name.new(:first_name => "Donald")
232
- @person = Person.new(:title => "Sir")
233
- Mongoid::Associations::EmbedOne.update(
234
- nil,
235
- @person,
236
- Mongoid::Associations::Options.new(:name => :name)
237
- )
238
- end
239
-
240
- it "clears out the association" do
241
- @person.name.should be_nil
242
- end
243
-
244
- end
245
-
246
- end
247
-
248
- describe "#to_a" do
249
-
250
- before do
251
- @association = Mongoid::Associations::EmbedOne.new(
252
- @document,
253
- @attributes["mixed_drink"],
254
- Mongoid::Associations::Options.new(:name => :mixed_drink)
255
- )
256
- end
257
-
258
- it "returns the target in a new array" do
259
- @association.to_a.first.should be_a_kind_of(MixedDrink)
260
- end
261
-
262
- end
263
-
264
- describe "#valid?" do
265
-
266
- context "when the document is not nil" do
267
-
268
- before do
269
- @document = stub(:raw_attributes => { "name" => { "first_name" => "Test" } }, :update => true)
270
- @options = Mongoid::Associations::Options.new(:name => :name)
271
- @association = Mongoid::Associations::EmbedOne.instantiate(@document, @options)
272
- end
273
-
274
- it "validates the document" do
275
- @association.valid?.should be_true
276
- end
277
-
278
- end
279
-
280
- end
281
-
282
- end
@@ -1,193 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Associations::EmbeddedIn do
4
-
5
- let(:child) do
6
- Name.new(:first_name => "Drexel", :last_name => "Spivey")
7
- end
8
-
9
- let(:target) do
10
- Person.new(:title => "Pimp")
11
- end
12
-
13
- let(:options) do
14
- Mongoid::Associations::Options.new(:name => :person, :inverse_of => :name)
15
- end
16
-
17
- let(:has_many_options) do
18
- Mongoid::Associations::Options.new(:name => :person, :inverse_of => :addresses)
19
- end
20
-
21
- describe "#find" do
22
-
23
- before do
24
- @association = Mongoid::Associations::EmbeddedIn.new(target, options)
25
- end
26
-
27
- context "when finding by id" do
28
-
29
- it "always returns the target document" do
30
- @association.find("").should == target
31
- end
32
-
33
- end
34
-
35
- end
36
-
37
- describe "#initialize" do
38
-
39
- before do
40
- @association = Mongoid::Associations::EmbeddedIn.new(target, options)
41
- end
42
-
43
- it "sets the target" do
44
- @association.target.should == target
45
- end
46
-
47
- it "sets the options" do
48
- @association.options.should == options
49
- end
50
-
51
- end
52
-
53
- describe "#initialize" do
54
-
55
- before do
56
- @parent = Person.new(:title => "Dr")
57
- @name = Name.new(:first_name => "Richard", :last_name => "Dawkins")
58
- @parent.name = @name
59
- @block = Proc.new {
60
- def extension
61
- "Testing"
62
- end
63
- }
64
- @options = Mongoid::Associations::Options.new(:name => :person, :extend => @block)
65
- @association = Mongoid::Associations::EmbeddedIn.new(@parent, @options)
66
- end
67
-
68
- context "when the options have an extension" do
69
-
70
- it "adds the extension module" do
71
- @association.extension.should == "Testing"
72
- end
73
-
74
- end
75
-
76
- end
77
-
78
- describe ".instantiate" do
79
-
80
- context "when parent exists" do
81
-
82
- before do
83
- @parent = stub
84
- @target = stub(:_parent => @parent)
85
- @association = Mongoid::Associations::EmbeddedIn.instantiate(@target, options)
86
- end
87
-
88
- it "sets the parent to the target" do
89
- @association.target.should == @parent
90
- end
91
-
92
- end
93
-
94
- context "when parent is nil" do
95
-
96
- before do
97
- @document = stub(:_parent => nil)
98
- end
99
-
100
- it "returns nil" do
101
- Mongoid::Associations::EmbeddedIn.instantiate(@document, options).should be_nil
102
- end
103
-
104
- end
105
-
106
- end
107
-
108
- describe ".macro" do
109
-
110
- it "returns :embedded_in" do
111
- Mongoid::Associations::EmbeddedIn.macro.should == :embedded_in
112
- end
113
-
114
- end
115
-
116
- describe "#method_missing" do
117
-
118
- before do
119
- @association = Mongoid::Associations::EmbeddedIn.new(target, options)
120
- end
121
-
122
- context "when method is a getter" do
123
-
124
- it "delegates to the target" do
125
- @association.title.should == "Pimp"
126
- end
127
-
128
- end
129
-
130
- context "when method is a setter" do
131
-
132
- before do
133
- @association.title = "Dealer"
134
- end
135
-
136
- it "delegates to the target" do
137
- @association.title.should == "Dealer"
138
- end
139
-
140
- end
141
-
142
- context "when method does not exist" do
143
-
144
- it "raises an error" do
145
- lambda { @association.nothing }.should raise_error(NoMethodError)
146
- end
147
-
148
- end
149
-
150
- end
151
-
152
- describe ".update" do
153
-
154
- context "when child is a has one" do
155
-
156
- before do
157
- @name = Name.new(:first_name => "Test", :last_name => "User")
158
- @person = Person.new(:title => "Mrs")
159
- @association = Mongoid::Associations::EmbeddedIn.update(@person, @name, options)
160
- end
161
-
162
- it "updates the parent document" do
163
- @person.name.should == @name
164
- end
165
-
166
- it "updates the parent attributes" do
167
- @person.attributes[:name].except(:_id).should ==
168
- { "first_name" => "Test", "last_name" => "User", "_type" => "Name" }
169
- end
170
-
171
- it "returns the proxy association" do
172
- @association.target.should == @person
173
- end
174
-
175
- end
176
-
177
- context "when child is a has many" do
178
-
179
- before do
180
- @address = Address.new(:street => "Broadway")
181
- @person = Person.new(:title => "Mrs")
182
- Mongoid::Associations::EmbeddedIn.update(@person, @address, has_many_options)
183
- end
184
-
185
- it "updates the parent document" do
186
- @person.addresses.first.should == @address
187
- end
188
-
189
- end
190
-
191
- end
192
-
193
- end