mongoid 1.2.14 → 1.9.0

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 (200) hide show
  1. data/lib/mongoid.rb +10 -3
  2. data/lib/mongoid/associations.rb +133 -97
  3. data/lib/mongoid/associations/belongs_to_related.rb +2 -3
  4. data/lib/mongoid/associations/{belongs_to.rb → embedded_in.rb} +14 -6
  5. data/lib/mongoid/associations/{has_many.rb → embeds_many.rb} +89 -31
  6. data/lib/mongoid/associations/{has_one.rb → embeds_one.rb} +8 -7
  7. data/lib/mongoid/associations/has_many_related.rb +52 -7
  8. data/lib/mongoid/associations/has_one_related.rb +8 -4
  9. data/lib/mongoid/associations/meta_data.rb +2 -1
  10. data/lib/mongoid/associations/options.rb +6 -1
  11. data/lib/mongoid/associations/proxy.rb +14 -21
  12. data/lib/mongoid/attributes.rb +27 -12
  13. data/lib/mongoid/collection.rb +4 -3
  14. data/lib/mongoid/collections.rb +41 -0
  15. data/lib/mongoid/collections/master.rb +3 -2
  16. data/lib/mongoid/collections/slaves.rb +3 -2
  17. data/lib/mongoid/components.rb +21 -19
  18. data/lib/mongoid/concern.rb +31 -0
  19. data/lib/mongoid/config.rb +117 -12
  20. data/lib/mongoid/contexts.rb +1 -1
  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/criterion/inclusion.rb +17 -0
  25. data/lib/mongoid/criterion/optional.rb +1 -1
  26. data/lib/mongoid/dirty.rb +253 -0
  27. data/lib/mongoid/document.rb +81 -52
  28. data/lib/mongoid/errors.rb +32 -1
  29. data/lib/mongoid/extensions.rb +11 -9
  30. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  31. data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
  32. data/lib/mongoid/extensions/date/conversions.rb +13 -4
  33. data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
  34. data/lib/mongoid/extensions/float/conversions.rb +5 -1
  35. data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
  36. data/lib/mongoid/extensions/hash/conversions.rb +34 -4
  37. data/lib/mongoid/extensions/integer/conversions.rb +5 -1
  38. data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
  39. data/lib/mongoid/extensions/object/conversions.rb +1 -1
  40. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  41. data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
  42. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  43. data/lib/mongoid/extras.rb +6 -9
  44. data/lib/mongoid/factory.rb +2 -1
  45. data/lib/mongoid/field.rb +9 -2
  46. data/lib/mongoid/fields.rb +1 -0
  47. data/lib/mongoid/identity.rb +3 -3
  48. data/lib/mongoid/indexes.rb +3 -3
  49. data/lib/mongoid/memoization.rb +8 -2
  50. data/lib/mongoid/named_scope.rb +0 -3
  51. data/lib/mongoid/observable.rb +30 -0
  52. data/lib/mongoid/paths.rb +62 -0
  53. data/lib/mongoid/persistence.rb +222 -0
  54. data/lib/mongoid/persistence/command.rb +39 -0
  55. data/lib/mongoid/persistence/insert.rb +50 -0
  56. data/lib/mongoid/persistence/insert_embedded.rb +38 -0
  57. data/lib/mongoid/persistence/remove.rb +39 -0
  58. data/lib/mongoid/persistence/remove_all.rb +37 -0
  59. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  60. data/lib/mongoid/persistence/update.rb +63 -0
  61. data/lib/mongoid/state.rb +28 -21
  62. data/lib/mongoid/timestamps.rb +5 -8
  63. data/lib/mongoid/version.rb +4 -0
  64. data/lib/mongoid/versioning.rb +6 -7
  65. metadata +81 -300
  66. data/.gitignore +0 -6
  67. data/.watchr +0 -29
  68. data/Rakefile +0 -53
  69. data/VERSION +0 -1
  70. data/caliper.yml +0 -4
  71. data/lib/mongoid/collections/mimic.rb +0 -46
  72. data/lib/mongoid/commands.rb +0 -174
  73. data/lib/mongoid/commands/create.rb +0 -21
  74. data/lib/mongoid/commands/delete.rb +0 -16
  75. data/lib/mongoid/commands/delete_all.rb +0 -23
  76. data/lib/mongoid/commands/deletion.rb +0 -18
  77. data/lib/mongoid/commands/destroy.rb +0 -19
  78. data/lib/mongoid/commands/destroy_all.rb +0 -23
  79. data/lib/mongoid/commands/save.rb +0 -27
  80. data/lib/mongoid/extensions/time/conversions.rb +0 -18
  81. data/mongoid.gemspec +0 -395
  82. data/perf/benchmark.rb +0 -77
  83. data/spec/integration/mongoid/associations_spec.rb +0 -340
  84. data/spec/integration/mongoid/attributes_spec.rb +0 -22
  85. data/spec/integration/mongoid/commands_spec.rb +0 -218
  86. data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
  87. data/spec/integration/mongoid/criteria_spec.rb +0 -272
  88. data/spec/integration/mongoid/document_spec.rb +0 -593
  89. data/spec/integration/mongoid/extensions_spec.rb +0 -26
  90. data/spec/integration/mongoid/finders_spec.rb +0 -119
  91. data/spec/integration/mongoid/inheritance_spec.rb +0 -137
  92. data/spec/integration/mongoid/named_scope_spec.rb +0 -46
  93. data/spec/models/address.rb +0 -39
  94. data/spec/models/animal.rb +0 -6
  95. data/spec/models/callbacks.rb +0 -18
  96. data/spec/models/comment.rb +0 -8
  97. data/spec/models/country_code.rb +0 -6
  98. data/spec/models/employer.rb +0 -5
  99. data/spec/models/game.rb +0 -7
  100. data/spec/models/inheritance.rb +0 -56
  101. data/spec/models/location.rb +0 -5
  102. data/spec/models/mixed_drink.rb +0 -4
  103. data/spec/models/name.rb +0 -13
  104. data/spec/models/namespacing.rb +0 -11
  105. data/spec/models/patient.rb +0 -4
  106. data/spec/models/person.rb +0 -99
  107. data/spec/models/pet.rb +0 -7
  108. data/spec/models/pet_owner.rb +0 -6
  109. data/spec/models/phone.rb +0 -7
  110. data/spec/models/post.rb +0 -15
  111. data/spec/models/translation.rb +0 -5
  112. data/spec/models/vet_visit.rb +0 -5
  113. data/spec/spec.opts +0 -3
  114. data/spec/spec_helper.rb +0 -31
  115. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
  116. data/spec/unit/mongoid/associations/belongs_to_spec.rb +0 -193
  117. data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -420
  118. data/spec/unit/mongoid/associations/has_many_spec.rb +0 -519
  119. data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
  120. data/spec/unit/mongoid/associations/has_one_spec.rb +0 -282
  121. data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
  122. data/spec/unit/mongoid/associations/options_spec.rb +0 -192
  123. data/spec/unit/mongoid/associations_spec.rb +0 -595
  124. data/spec/unit/mongoid/attributes_spec.rb +0 -507
  125. data/spec/unit/mongoid/callbacks_spec.rb +0 -55
  126. data/spec/unit/mongoid/collection_spec.rb +0 -187
  127. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
  128. data/spec/unit/mongoid/collections/master_spec.rb +0 -41
  129. data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
  130. data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
  131. data/spec/unit/mongoid/commands/create_spec.rb +0 -30
  132. data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
  133. data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
  134. data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -23
  135. data/spec/unit/mongoid/commands/destroy_spec.rb +0 -50
  136. data/spec/unit/mongoid/commands/save_spec.rb +0 -105
  137. data/spec/unit/mongoid/commands_spec.rb +0 -275
  138. data/spec/unit/mongoid/config_spec.rb +0 -172
  139. data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
  140. data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
  141. data/spec/unit/mongoid/contexts_spec.rb +0 -25
  142. data/spec/unit/mongoid/criteria_spec.rb +0 -824
  143. data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
  144. data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
  145. data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
  146. data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
  147. data/spec/unit/mongoid/cursor_spec.rb +0 -74
  148. data/spec/unit/mongoid/deprecation_spec.rb +0 -24
  149. data/spec/unit/mongoid/document_spec.rb +0 -952
  150. data/spec/unit/mongoid/errors_spec.rb +0 -103
  151. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
  152. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
  153. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
  154. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
  155. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
  156. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
  157. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
  158. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
  159. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -70
  160. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
  161. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
  162. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
  163. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
  164. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
  165. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
  166. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
  167. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
  168. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
  169. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
  170. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
  171. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
  172. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
  173. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
  174. data/spec/unit/mongoid/extras_spec.rb +0 -102
  175. data/spec/unit/mongoid/factory_spec.rb +0 -31
  176. data/spec/unit/mongoid/field_spec.rb +0 -143
  177. data/spec/unit/mongoid/fields_spec.rb +0 -181
  178. data/spec/unit/mongoid/finders_spec.rb +0 -404
  179. data/spec/unit/mongoid/identity_spec.rb +0 -109
  180. data/spec/unit/mongoid/indexes_spec.rb +0 -93
  181. data/spec/unit/mongoid/javascript_spec.rb +0 -48
  182. data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
  183. data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
  184. data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
  185. data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
  186. data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
  187. data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
  188. data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
  189. data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
  190. data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
  191. data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
  192. data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
  193. data/spec/unit/mongoid/matchers_spec.rb +0 -329
  194. data/spec/unit/mongoid/memoization_spec.rb +0 -75
  195. data/spec/unit/mongoid/named_scope_spec.rb +0 -123
  196. data/spec/unit/mongoid/scope_spec.rb +0 -240
  197. data/spec/unit/mongoid/state_spec.rb +0 -83
  198. data/spec/unit/mongoid/timestamps_spec.rb +0 -25
  199. data/spec/unit/mongoid/versioning_spec.rb +0 -41
  200. data/spec/unit/mongoid_spec.rb +0 -46
@@ -1,5 +0,0 @@
1
- class Location
2
- include Mongoid::Document
3
- field :name
4
- belongs_to :address, :inverse_of => :locations
5
- end
@@ -1,4 +0,0 @@
1
- class MixedDrink
2
- include Mongoid::Document
3
- field :name
4
- end
@@ -1,13 +0,0 @@
1
- class Name
2
- include Mongoid::Document
3
- field :first_name
4
- field :last_name
5
- field :parent_title
6
- key :first_name, :last_name
7
- has_many :translations
8
- belongs_to :person, :inverse_of => :name
9
-
10
- def set_parent=(set = false)
11
- self.parent_title = person.title if set
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- module Medical
2
- class Patient
3
- include Mongoid::Document
4
- field :name
5
- has_many :prescriptions, :class_name => "Medical::Prescription"
6
- end
7
- class Prescription
8
- include Mongoid::Document
9
- field :name
10
- end
11
- end
@@ -1,4 +0,0 @@
1
- class Patient
2
- include Mongoid::Document
3
- store_in :inpatient
4
- end
@@ -1,99 +0,0 @@
1
- class Person
2
- include Mongoid::Document
3
- include Mongoid::Timestamps
4
-
5
- field :title
6
- field :terms, :type => Boolean
7
- field :pets, :type => Boolean, :default => false
8
- field :age, :type => Integer, :default => 100
9
- field :dob, :type => Date
10
- field :mixed_drink, :type => MixedDrink
11
- field :employer_id
12
- field :lunch_time, :type => Time
13
- field :aliases, :type => Array
14
- field :map, :type => Hash
15
- field :score, :type => Integer
16
- field :blood_alcohol_content, :type => Float, :default => lambda{ 0.0 }
17
- field :ssn
18
- field :owner_id, :accessible => false, :type => Integer
19
-
20
- index :age
21
- index :addresses
22
- index :dob
23
- index :name
24
- index :title
25
- index :ssn, :unique => true
26
-
27
- attr_reader :rescored
28
-
29
- has_many :addresses do
30
- def extension
31
- "Testing"
32
- end
33
- def find_by_street(street)
34
- @target.select { |doc| doc.street == street }
35
- end
36
- end
37
-
38
- has_many :phone_numbers, :class_name => "Phone"
39
-
40
- has_one :name do
41
- def extension
42
- "Testing"
43
- end
44
- def dawkins?
45
- first_name == "Richard" && last_name == "Dawkins"
46
- end
47
- end
48
-
49
- has_one :pet, :class_name => "Animal"
50
-
51
- accepts_nested_attributes_for :addresses, :reject_if => lambda { |attrs| attrs["street"].blank? }
52
- accepts_nested_attributes_for :name
53
-
54
- has_one_related :game do
55
- def extension
56
- "Testing"
57
- end
58
- end
59
-
60
- has_many_related :posts do
61
- def extension
62
- "Testing"
63
- end
64
- end
65
-
66
- def score_with_rescoring=(score)
67
- @rescored = score.to_i + 20
68
- self.score_without_rescoring = score
69
- end
70
-
71
- alias_method_chain :score=, :rescoring
72
-
73
- def update_addresses
74
- addresses.each do |address|
75
- address.street = "Updated Address"
76
- end
77
- end
78
-
79
- def employer=(emp)
80
- self.employer_id = emp.id
81
- end
82
-
83
- class << self
84
- def accepted
85
- criteria.where(:terms => true)
86
- end
87
- def knight
88
- criteria.where(:title => "Sir")
89
- end
90
- def old
91
- criteria.where(:age => { "$gt" => 50 })
92
- end
93
- end
94
-
95
- end
96
-
97
- class Doctor < Person
98
- field :specialty
99
- end
@@ -1,7 +0,0 @@
1
- class Pet
2
- include Mongoid::Document
3
- field :name
4
- field :weight, :type => Float, :default => 0.0
5
- has_many :vet_visits
6
- belongs_to :pet_owner, :inverse_of => :pet
7
- end
@@ -1,6 +0,0 @@
1
- class PetOwner
2
- include Mongoid::Document
3
- field :title
4
- has_one :pet
5
- has_one :address
6
- end
@@ -1,7 +0,0 @@
1
- class Phone
2
- include Mongoid::Document
3
- field :number
4
- key :number
5
- belongs_to :person, :inverse_of => :phone_numbers
6
- has_one :country_code
7
- end
@@ -1,15 +0,0 @@
1
- class Post
2
- include Mongoid::Document
3
- include Mongoid::Versioning
4
- include Mongoid::Timestamps
5
- field :title
6
- belongs_to_related :person
7
-
8
- named_scope :recent, where(:created_at => { "$lt" => Time.now, "$gt" => 30.days.ago })
9
-
10
- class << self
11
- def old
12
- where(:created_at => { "$lt" => 30.days.ago })
13
- end
14
- end
15
- end
@@ -1,5 +0,0 @@
1
- class Translation
2
- include Mongoid::Document
3
- field :language
4
- belongs_to :name, :inverse_of => :translations
5
- end
@@ -1,5 +0,0 @@
1
- class VetVisit
2
- include Mongoid::Document
3
- field :date, :type => Date
4
- belongs_to :pet, :inverse_of => :vet_visits
5
- end
@@ -1,3 +0,0 @@
1
- --colour
2
- --format nested
3
- --drb
@@ -1,31 +0,0 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
-
4
- MODELS = File.join(File.dirname(__FILE__), "models")
5
- $LOAD_PATH.unshift(MODELS)
6
-
7
- require 'rubygems'
8
-
9
- gem "mocha", ">= 0.9.8"
10
-
11
- require "mocha"
12
- require "mongoid"
13
- require "spec"
14
-
15
- Mongoid.configure do |config|
16
- name = "mongoid_test"
17
- host = "localhost"
18
- config.master = Mongo::Connection.new.db(name)
19
- # config.slaves = [
20
- # Mongo::Connection.new(host, 27018, :slave_ok => true).db(name)
21
- # ]
22
- end
23
-
24
- Dir[ File.join(MODELS, "*.rb") ].sort.each { |file| require File.basename(file) }
25
-
26
- Spec::Runner.configure do |config|
27
- config.mock_with :mocha
28
- config.after :suite do
29
- Mongoid.master.collections.each(&:drop)
30
- end
31
- end
@@ -1,145 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Associations::BelongsToRelated 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::BelongsToRelated.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::BelongsToRelated.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::BelongsToRelated.expects(:new).with(@document, "5", @options, nil)
57
- Mongoid::Associations::BelongsToRelated.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::BelongsToRelated.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::BelongsToRelated.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 :belongs_to_related" do
109
- Mongoid::Associations::BelongsToRelated.macro.should == :belongs_to_related
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::BelongsToRelated.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::BelongsToRelated.update(nil, @child, @options).should be_nil
135
- end
136
-
137
- it "removes the association" do
138
- Mongoid::Associations::BelongsToRelated.update(nil, @child, @options)
139
- @child.person.should be_nil
140
- end
141
- end
142
-
143
- end
144
-
145
- end
@@ -1,193 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Associations::BelongsTo 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::BelongsTo.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::BelongsTo.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::BelongsTo.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::BelongsTo.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::BelongsTo.instantiate(@document, options).should be_nil
102
- end
103
-
104
- end
105
-
106
- end
107
-
108
- describe ".macro" do
109
-
110
- it "returns :belongs_to" do
111
- Mongoid::Associations::BelongsTo.macro.should == :belongs_to
112
- end
113
-
114
- end
115
-
116
- describe "#method_missing" do
117
-
118
- before do
119
- @association = Mongoid::Associations::BelongsTo.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::BelongsTo.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::BelongsTo.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