mongoid 1.2.8 → 1.2.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/Rakefile +1 -1
  2. data/VERSION +1 -1
  3. data/lib/mongoid.rb +2 -3
  4. data/lib/mongoid/associations.rb +5 -3
  5. data/lib/mongoid/associations/belongs_to_related.rb +6 -9
  6. data/lib/mongoid/associations/has_many.rb +2 -0
  7. data/lib/mongoid/associations/has_many_related.rb +10 -0
  8. data/lib/mongoid/attributes.rb +6 -1
  9. data/lib/mongoid/commands.rb +2 -10
  10. data/lib/mongoid/components.rb +11 -12
  11. data/lib/mongoid/contexts/enumerable.rb +21 -11
  12. data/lib/mongoid/contexts/mongo.rb +40 -1
  13. data/lib/mongoid/criteria.rb +3 -29
  14. data/lib/mongoid/criterion/inclusion.rb +2 -1
  15. data/lib/mongoid/document.rb +5 -6
  16. data/lib/mongoid/extensions.rb +10 -0
  17. data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
  18. data/lib/mongoid/extensions/binary/conversions.rb +17 -0
  19. data/lib/mongoid/{caching.rb → extras.rb} +26 -3
  20. data/lib/mongoid/field.rb +20 -7
  21. data/lib/mongoid/finders.rb +10 -80
  22. data/mongoid.gemspec +15 -13
  23. data/spec/integration/mongoid/document_spec.rb +1 -1
  24. data/spec/models/person.rb +1 -0
  25. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +4 -0
  26. data/spec/unit/mongoid/associations/has_many_related_spec.rb +42 -13
  27. data/spec/unit/mongoid/associations/has_many_spec.rb +12 -7
  28. data/spec/unit/mongoid/associations_spec.rb +16 -0
  29. data/spec/unit/mongoid/attributes_spec.rb +23 -0
  30. data/spec/unit/mongoid/commands/destroy_spec.rb +3 -0
  31. data/spec/unit/mongoid/commands_spec.rb +4 -11
  32. data/spec/unit/mongoid/contexts/enumerable_spec.rb +16 -0
  33. data/spec/unit/mongoid/contexts/mongo_spec.rb +96 -0
  34. data/spec/unit/mongoid/criteria_spec.rb +11 -4
  35. data/spec/unit/mongoid/document_spec.rb +11 -0
  36. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
  37. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  38. data/spec/unit/mongoid/{enslavement_spec.rb → extras_spec.rb} +55 -2
  39. data/spec/unit/mongoid/field_spec.rb +62 -0
  40. data/spec/unit/mongoid/finders_spec.rb +36 -0
  41. metadata +69 -37
  42. data/HISTORY +0 -342
  43. data/lib/mongoid/enslavement.rb +0 -38
  44. data/spec/unit/mongoid/caching_spec.rb +0 -63
@@ -4,6 +4,8 @@ require "mongoid/extensions/array/aliasing"
4
4
  require "mongoid/extensions/array/assimilation"
5
5
  require "mongoid/extensions/array/conversions"
6
6
  require "mongoid/extensions/array/parentization"
7
+ require "mongoid/extensions/big_decimal/conversions"
8
+ require "mongoid/extensions/binary/conversions"
7
9
  require "mongoid/extensions/boolean/conversions"
8
10
  require "mongoid/extensions/date/conversions"
9
11
  require "mongoid/extensions/datetime/conversions"
@@ -29,6 +31,14 @@ class Array #:nodoc
29
31
  include Mongoid::Extensions::Array::Parentization
30
32
  end
31
33
 
34
+ class BigDecimal #:nodoc
35
+ extend Mongoid::Extensions::BigDecimal::Conversions
36
+ end
37
+
38
+ class Binary #:nodoc
39
+ extend Mongoid::Extensions::Binary::Conversions
40
+ end
41
+
32
42
  class Boolean #:nodoc
33
43
  extend Mongoid::Extensions::Boolean::Conversions
34
44
  end
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+ require "bigdecimal"
3
+
4
+ module Mongoid #:nodoc:
5
+ module Extensions #:nodoc:
6
+ module BigDecimal #:nodoc:
7
+ module Conversions #:nodoc:
8
+ # Get the string as a +BigDecimal+
9
+ def get(value)
10
+ ::BigDecimal.new(value)
11
+ end
12
+ # Set the value in the hash as a string.
13
+ def set(value)
14
+ value.to_s
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module Binary #:nodoc:
5
+ module Conversions #:nodoc:
6
+ # Get the value from the db hash.
7
+ def get(value)
8
+ value
9
+ end
10
+ # Set the value in the db hash.
11
+ def set(value)
12
+ value
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,13 +1,14 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
- module Caching #:nodoc:
3
+ module Extras #:nodoc:
4
4
  def self.included(base)
5
5
  base.class_eval do
6
6
  extend ClassMethods
7
- class_inheritable_accessor :cached
7
+ class_inheritable_accessor :cached, :enslaved
8
8
  self.cached = false
9
+ self.enslaved = false
9
10
 
10
- delegate :cached?, :to => "self.class"
11
+ delegate :cached?, :enslaved?, :to => "self.class"
11
12
  end
12
13
  end
13
14
 
@@ -36,6 +37,28 @@ module Mongoid #:nodoc:
36
37
  def cached?
37
38
  self.cached == true
38
39
  end
40
+
41
+ # Set whether or not this documents read operations should delegate to
42
+ # the slave database by default.
43
+ #
44
+ # Example:
45
+ #
46
+ # class Person
47
+ # include Mongoid::Document
48
+ # enslave
49
+ # end
50
+ def enslave
51
+ self.enslaved = true
52
+ end
53
+
54
+ # Determines if the class is enslaved or not.
55
+ #
56
+ # Returns:
57
+ #
58
+ # True if enslaved, false if not.
59
+ def enslaved?
60
+ self.enslaved == true
61
+ end
39
62
  end
40
63
  end
41
64
  end
@@ -1,11 +1,25 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  class Field
4
+ attr_reader :name, :type
4
5
 
5
- attr_reader \
6
- :default,
7
- :name,
8
- :type
6
+ # Determine if the field is able to be accessible via a mass update.
7
+ #
8
+ # Returns:
9
+ #
10
+ # true if accessible, false if not.
11
+ def accessible?
12
+ !!@accessible
13
+ end
14
+
15
+ # Get the default value for the field.
16
+ #
17
+ # Returns:
18
+ #
19
+ # The primitive value or a copy of the default.
20
+ def default
21
+ (@default.is_a?(Array) || @default.is_a?(Hash)) ? @default.dup : @default
22
+ end
9
23
 
10
24
  # Create the new field with a name and optional additional options. Valid
11
25
  # options are :default
@@ -19,9 +33,9 @@ module Mongoid #:nodoc:
19
33
  #
20
34
  # <tt>Field.new(:score, :default => 0)</tt>
21
35
  def initialize(name, options = {})
22
- @name = name
23
- @default = options[:default]
36
+ @name, @default = name, options[:default]
24
37
  @type = options[:type] || String
38
+ @accessible = options.has_key?(:accessible) ? options[:accessible] : true
25
39
  end
26
40
 
27
41
  # Used for setting an object in the attributes hash. If nil is provided the
@@ -34,6 +48,5 @@ module Mongoid #:nodoc:
34
48
  def get(object)
35
49
  type.get(object)
36
50
  end
37
-
38
51
  end
39
52
  end
@@ -1,6 +1,16 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Finders #:nodoc:
4
+
5
+ # Delegate to the criteria methods that are natural for creating a new
6
+ # criteria.
7
+ [ :all_in, :any_in, :excludes, :limit, :max, :min,
8
+ :not_in, :only, :order_by, :skip, :sum, :where ].each do |name|
9
+ define_method(name) do |*args|
10
+ criteria.send(name, *args)
11
+ end
12
+ end
13
+
4
14
  # Find +Documents+ given the conditions.
5
15
  #
6
16
  # Options:
@@ -100,36 +110,6 @@ module Mongoid #:nodoc:
100
110
  find(:last, *args)
101
111
  end
102
112
 
103
- # Convenience method for returning the max value of a field.
104
- #
105
- # Options:
106
- #
107
- # field: The field to use when calculating the max.
108
- #
109
- # Example:
110
- #
111
- # <tt>Person.max(:age)</tt>
112
- #
113
- # Returns: <tt>Float</tt> max value.
114
- def max(field)
115
- criteria.max(field)
116
- end
117
-
118
- # Convenience method for returning the min value of a field.
119
- #
120
- # Options:
121
- #
122
- # field: The field to use when calculating the min.
123
- #
124
- # Example:
125
- #
126
- # <tt>Person.min(:age)</tt>
127
- #
128
- # Returns: <tt>Float</tt> min value.
129
- def min(field)
130
- criteria.min(field)
131
- end
132
-
133
113
  # Find all documents in paginated fashion given the supplied arguments.
134
114
  # If no parameters are passed just default to offset 0 and limit 20.
135
115
  #
@@ -147,56 +127,6 @@ module Mongoid #:nodoc:
147
127
  Criteria.translate(self, params).paginate
148
128
  end
149
129
 
150
- # Entry point for creating a new criteria from a Document. This will
151
- # instantiate a new +Criteria+ object with the supplied select criterion
152
- # already added to it.
153
- #
154
- # Options:
155
- #
156
- # args: A list of field names to retrict the returned fields to.
157
- #
158
- # Example:
159
- #
160
- # <tt>Person.only(:field1, :field2, :field3)</tt>
161
- #
162
- # Returns: <tt>Criteria</tt>
163
- def only(*args)
164
- criteria.only(*args)
165
- end
166
-
167
- # Convenience method for returning the sum of a specified field for all
168
- # documents in the database.
169
- #
170
- # Options:
171
- #
172
- # field: The field to use when calculating the sum.
173
- #
174
- # Example:
175
- #
176
- # <tt>Person.sum(:age)</tt>
177
- #
178
- # Returns: <tt>Float</tt> of the sum.
179
- def sum(field)
180
- criteria.sum(field)
181
- end
182
-
183
- # Entry point for creating a new criteria from a Document. This will
184
- # instantiate a new +Criteria+ object with the supplied select criterion
185
- # already added to it.
186
- #
187
- # Options:
188
- #
189
- # selector: A where criteria to initialize.
190
- #
191
- # Example:
192
- #
193
- # <tt>Person.where(:field1 => "Value")</tt>
194
- #
195
- # Returns: <tt>Criteria</tt>
196
- def where(selector = nil)
197
- criteria.where(selector)
198
- end
199
-
200
130
  protected
201
131
  # Find the first object or create/initialize it.
202
132
  def find_or(method, attrs = {})
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid}
8
- s.version = "1.2.8"
8
+ s.version = "1.2.9"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Durran Jordan"]
12
- s.date = %q{2010-02-25}
12
+ s.date = %q{2010-03-09}
13
13
  s.email = %q{durran@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.rdoc"
@@ -17,7 +17,6 @@ Gem::Specification.new do |s|
17
17
  s.files = [
18
18
  ".gitignore",
19
19
  ".watchr",
20
- "HISTORY",
21
20
  "MIT_LICENSE",
22
21
  "README.rdoc",
23
22
  "Rakefile",
@@ -35,7 +34,6 @@ Gem::Specification.new do |s|
35
34
  "lib/mongoid/associations/options.rb",
36
35
  "lib/mongoid/associations/proxy.rb",
37
36
  "lib/mongoid/attributes.rb",
38
- "lib/mongoid/caching.rb",
39
37
  "lib/mongoid/callbacks.rb",
40
38
  "lib/mongoid/collection.rb",
41
39
  "lib/mongoid/collections/cyclic_iterator.rb",
@@ -65,7 +63,6 @@ Gem::Specification.new do |s|
65
63
  "lib/mongoid/criterion/optional.rb",
66
64
  "lib/mongoid/cursor.rb",
67
65
  "lib/mongoid/document.rb",
68
- "lib/mongoid/enslavement.rb",
69
66
  "lib/mongoid/errors.rb",
70
67
  "lib/mongoid/extensions.rb",
71
68
  "lib/mongoid/extensions/array/accessors.rb",
@@ -73,6 +70,8 @@ Gem::Specification.new do |s|
73
70
  "lib/mongoid/extensions/array/assimilation.rb",
74
71
  "lib/mongoid/extensions/array/conversions.rb",
75
72
  "lib/mongoid/extensions/array/parentization.rb",
73
+ "lib/mongoid/extensions/big_decimal/conversions.rb",
74
+ "lib/mongoid/extensions/binary/conversions.rb",
76
75
  "lib/mongoid/extensions/boolean/conversions.rb",
77
76
  "lib/mongoid/extensions/date/conversions.rb",
78
77
  "lib/mongoid/extensions/datetime/conversions.rb",
@@ -90,6 +89,7 @@ Gem::Specification.new do |s|
90
89
  "lib/mongoid/extensions/string/inflections.rb",
91
90
  "lib/mongoid/extensions/symbol/inflections.rb",
92
91
  "lib/mongoid/extensions/time/conversions.rb",
92
+ "lib/mongoid/extras.rb",
93
93
  "lib/mongoid/factory.rb",
94
94
  "lib/mongoid/field.rb",
95
95
  "lib/mongoid/fields.rb",
@@ -158,7 +158,6 @@ Gem::Specification.new do |s|
158
158
  "spec/unit/mongoid/associations/options_spec.rb",
159
159
  "spec/unit/mongoid/associations_spec.rb",
160
160
  "spec/unit/mongoid/attributes_spec.rb",
161
- "spec/unit/mongoid/caching_spec.rb",
162
161
  "spec/unit/mongoid/callbacks_spec.rb",
163
162
  "spec/unit/mongoid/collection_spec.rb",
164
163
  "spec/unit/mongoid/collections/cyclic_iterator_spec.rb",
@@ -183,12 +182,13 @@ Gem::Specification.new do |s|
183
182
  "spec/unit/mongoid/criterion/optional_spec.rb",
184
183
  "spec/unit/mongoid/cursor_spec.rb",
185
184
  "spec/unit/mongoid/document_spec.rb",
186
- "spec/unit/mongoid/enslavement_spec.rb",
187
185
  "spec/unit/mongoid/errors_spec.rb",
188
186
  "spec/unit/mongoid/extensions/array/accessors_spec.rb",
189
187
  "spec/unit/mongoid/extensions/array/assimilation_spec.rb",
190
188
  "spec/unit/mongoid/extensions/array/conversions_spec.rb",
191
189
  "spec/unit/mongoid/extensions/array/parentization_spec.rb",
190
+ "spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb",
191
+ "spec/unit/mongoid/extensions/binary/conversions_spec.rb",
192
192
  "spec/unit/mongoid/extensions/boolean/conversions_spec.rb",
193
193
  "spec/unit/mongoid/extensions/date/conversions_spec.rb",
194
194
  "spec/unit/mongoid/extensions/datetime/conversions_spec.rb",
@@ -206,6 +206,7 @@ Gem::Specification.new do |s|
206
206
  "spec/unit/mongoid/extensions/string/inflections_spec.rb",
207
207
  "spec/unit/mongoid/extensions/symbol/inflections_spec.rb",
208
208
  "spec/unit/mongoid/extensions/time/conversions_spec.rb",
209
+ "spec/unit/mongoid/extras_spec.rb",
209
210
  "spec/unit/mongoid/factory_spec.rb",
210
211
  "spec/unit/mongoid/field_spec.rb",
211
212
  "spec/unit/mongoid/fields_spec.rb",
@@ -235,7 +236,7 @@ Gem::Specification.new do |s|
235
236
  s.homepage = %q{http://mongoid.org}
236
237
  s.rdoc_options = ["--charset=UTF-8"]
237
238
  s.require_paths = ["lib"]
238
- s.rubygems_version = %q{1.3.5}
239
+ s.rubygems_version = %q{1.3.6}
239
240
  s.summary = %q{ODM framework for MongoDB}
240
241
  s.test_files = [
241
242
  "spec/integration/mongoid/associations_spec.rb",
@@ -278,7 +279,6 @@ Gem::Specification.new do |s|
278
279
  "spec/unit/mongoid/associations/options_spec.rb",
279
280
  "spec/unit/mongoid/associations_spec.rb",
280
281
  "spec/unit/mongoid/attributes_spec.rb",
281
- "spec/unit/mongoid/caching_spec.rb",
282
282
  "spec/unit/mongoid/callbacks_spec.rb",
283
283
  "spec/unit/mongoid/collection_spec.rb",
284
284
  "spec/unit/mongoid/collections/cyclic_iterator_spec.rb",
@@ -303,12 +303,13 @@ Gem::Specification.new do |s|
303
303
  "spec/unit/mongoid/criterion/optional_spec.rb",
304
304
  "spec/unit/mongoid/cursor_spec.rb",
305
305
  "spec/unit/mongoid/document_spec.rb",
306
- "spec/unit/mongoid/enslavement_spec.rb",
307
306
  "spec/unit/mongoid/errors_spec.rb",
308
307
  "spec/unit/mongoid/extensions/array/accessors_spec.rb",
309
308
  "spec/unit/mongoid/extensions/array/assimilation_spec.rb",
310
309
  "spec/unit/mongoid/extensions/array/conversions_spec.rb",
311
310
  "spec/unit/mongoid/extensions/array/parentization_spec.rb",
311
+ "spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb",
312
+ "spec/unit/mongoid/extensions/binary/conversions_spec.rb",
312
313
  "spec/unit/mongoid/extensions/boolean/conversions_spec.rb",
313
314
  "spec/unit/mongoid/extensions/date/conversions_spec.rb",
314
315
  "spec/unit/mongoid/extensions/datetime/conversions_spec.rb",
@@ -326,6 +327,7 @@ Gem::Specification.new do |s|
326
327
  "spec/unit/mongoid/extensions/string/inflections_spec.rb",
327
328
  "spec/unit/mongoid/extensions/symbol/inflections_spec.rb",
328
329
  "spec/unit/mongoid/extensions/time/conversions_spec.rb",
330
+ "spec/unit/mongoid/extras_spec.rb",
329
331
  "spec/unit/mongoid/factory_spec.rb",
330
332
  "spec/unit/mongoid/field_spec.rb",
331
333
  "spec/unit/mongoid/fields_spec.rb",
@@ -361,14 +363,14 @@ Gem::Specification.new do |s|
361
363
  s.add_runtime_dependency(%q<activesupport>, ["<= 2.3.5"])
362
364
  s.add_runtime_dependency(%q<mongo>, [">= 0.18.3"])
363
365
  s.add_runtime_dependency(%q<durran-validatable>, [">= 2.0.1"])
364
- s.add_runtime_dependency(%q<will_paginate>, ["< 3.0.pre"])
366
+ s.add_runtime_dependency(%q<will_paginate>, ["< 2.9"])
365
367
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
366
368
  s.add_development_dependency(%q<mocha>, [">= 0.9.8"])
367
369
  else
368
370
  s.add_dependency(%q<activesupport>, ["<= 2.3.5"])
369
371
  s.add_dependency(%q<mongo>, [">= 0.18.3"])
370
372
  s.add_dependency(%q<durran-validatable>, [">= 2.0.1"])
371
- s.add_dependency(%q<will_paginate>, ["< 3.0.pre"])
373
+ s.add_dependency(%q<will_paginate>, ["< 2.9"])
372
374
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
373
375
  s.add_dependency(%q<mocha>, [">= 0.9.8"])
374
376
  end
@@ -376,7 +378,7 @@ Gem::Specification.new do |s|
376
378
  s.add_dependency(%q<activesupport>, ["<= 2.3.5"])
377
379
  s.add_dependency(%q<mongo>, [">= 0.18.3"])
378
380
  s.add_dependency(%q<durran-validatable>, [">= 2.0.1"])
379
- s.add_dependency(%q<will_paginate>, ["< 3.0.pre"])
381
+ s.add_dependency(%q<will_paginate>, ["< 2.9"])
380
382
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
381
383
  s.add_dependency(%q<mocha>, [">= 0.9.8"])
382
384
  end
@@ -244,7 +244,7 @@ describe Mongoid::Document do
244
244
 
245
245
  before do
246
246
  5.times do |num|
247
- Person.create(:title => "Sir", :age => num)
247
+ Person.create(:title => "Sir", :age => num, :ssn => num)
248
248
  end
249
249
  end
250
250
 
@@ -15,6 +15,7 @@ class Person
15
15
  field :score, :type => Integer
16
16
  field :blood_alcohol_content, :type => Float, :default => lambda{ 0.0 }
17
17
  field :ssn
18
+ field :owner_id, :accessible => false, :type => Integer
18
19
 
19
20
  index :age
20
21
  index :addresses
@@ -134,6 +134,10 @@ describe Mongoid::Associations::BelongsToRelated do
134
134
  Mongoid::Associations::BelongsToRelated.update(nil, @child, @options).should be_nil
135
135
  end
136
136
 
137
+ it "removes the association" do
138
+ Mongoid::Associations::BelongsToRelated.update(nil, @child, @options)
139
+ @child.person.should be_nil
140
+ end
137
141
  end
138
142
 
139
143
  end
@@ -45,16 +45,36 @@ describe Mongoid::Associations::HasManyRelated do
45
45
 
46
46
  context "when parent document has not been saved" do
47
47
 
48
- before do
49
- @parent = stub(:id => "1", :new_record? => true, :class => Person)
50
- Post.expects(:all).returns([])
51
- @association = Mongoid::Associations::HasManyRelated.new(@parent, options)
48
+ context "when appending a non mongoid object" do
49
+
50
+ before do
51
+ @parent = stub(:id => "1", :new_record? => true, :class => Person)
52
+ Post.expects(:all).returns([])
53
+ @association = Mongoid::Associations::HasManyRelated.new(@parent, options)
54
+ end
55
+
56
+ it "appends the child document" do
57
+ @child.expects(:person_id=).with(@parent.id)
58
+ @association << @child
59
+ @association.size.should == 1
60
+ end
52
61
  end
53
62
 
54
- it "appends the child document" do
55
- @child.expects(:person_id=).with(@parent.id)
56
- @association << @child
57
- @association.size.should == 1
63
+ context "when appending a mongoid document" do
64
+
65
+ before do
66
+ @criteria = mock
67
+ @parent = stub(:id => "1", :new_record? => true, :class => Person)
68
+ Post.expects(:all).returns(@criteria)
69
+ @association = Mongoid::Associations::HasManyRelated.new(@parent, options)
70
+ end
71
+
72
+ it "appends the child document" do
73
+ @criteria.expects(:entries).returns([])
74
+ @child.expects(:person_id=).with(@parent.id)
75
+ @association << @child
76
+ @association.size.should == 1
77
+ end
58
78
  end
59
79
 
60
80
  end
@@ -81,8 +101,10 @@ describe Mongoid::Associations::HasManyRelated do
81
101
  describe "#build" do
82
102
 
83
103
  before do
84
- @parent = stub(:id => "5", :class => Person)
85
- Post.expects(:all).returns([])
104
+ @criteria = mock
105
+ @criteria.expects(:entries).returns([])
106
+ @parent = stub(:id => "5", :class => Person, :new_record? => true)
107
+ Post.expects(:all).returns(@criteria)
86
108
  @association = Mongoid::Associations::HasManyRelated.new(@parent, options)
87
109
  end
88
110
 
@@ -169,18 +191,25 @@ describe Mongoid::Associations::HasManyRelated do
169
191
  describe "#create" do
170
192
 
171
193
  before do
172
- @parent = stub(:id => "5", :class => Person)
194
+ @post = mock
195
+ @parent = stub(:id => "5", :class => Person, :new_record? => true)
173
196
  Post.expects(:all).returns([])
174
- Mongoid::Commands::Save.expects(:execute)
175
197
  @association = Mongoid::Associations::HasManyRelated.new(@parent, options)
198
+ Post.expects(:instantiate).returns(@post)
176
199
  end
177
200
 
178
201
  it "builds and saves the new object" do
202
+ @post.expects(:run_callbacks).with(:before_create)
203
+ @post.expects(:save).returns(true)
204
+ @post.expects(:run_callbacks).with(:after_create)
179
205
  @association.create(:title => "Sassy")
180
206
  end
181
207
 
182
208
  it "returns the new object" do
183
- @association.create(:title => "Sassy").should be_a_kind_of(Post)
209
+ @post.expects(:run_callbacks).with(:before_create)
210
+ @post.expects(:save).returns(true)
211
+ @post.expects(:run_callbacks).with(:after_create)
212
+ @association.create(:title => "Sassy").should == @post
184
213
  end
185
214
 
186
215
  end