mongo_mapper 0.12.0 → 0.13.0.beta1

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 (154) hide show
  1. checksums.yaml +7 -0
  2. data/README.rdoc +35 -13
  3. data/bin/mmconsole +1 -1
  4. data/lib/mongo_mapper.rb +4 -0
  5. data/lib/mongo_mapper/connection.rb +17 -6
  6. data/lib/mongo_mapper/document.rb +1 -0
  7. data/lib/mongo_mapper/exceptions.rb +4 -1
  8. data/lib/mongo_mapper/extensions/binary.rb +1 -1
  9. data/lib/mongo_mapper/extensions/boolean.rb +20 -23
  10. data/lib/mongo_mapper/extensions/date.rb +3 -3
  11. data/lib/mongo_mapper/extensions/integer.rb +5 -1
  12. data/lib/mongo_mapper/extensions/kernel.rb +2 -0
  13. data/lib/mongo_mapper/extensions/ordered_hash.rb +23 -0
  14. data/lib/mongo_mapper/extensions/string.rb +2 -2
  15. data/lib/mongo_mapper/extensions/time.rb +7 -5
  16. data/lib/mongo_mapper/middleware/identity_map.rb +3 -4
  17. data/lib/mongo_mapper/plugins.rb +1 -1
  18. data/lib/mongo_mapper/plugins/associations.rb +11 -5
  19. data/lib/mongo_mapper/plugins/associations/base.rb +5 -3
  20. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +0 -0
  21. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +8 -8
  22. data/lib/mongo_mapper/plugins/associations/collection.rb +2 -0
  23. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +32 -7
  24. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +2 -2
  25. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +12 -12
  26. data/lib/mongo_mapper/plugins/associations/proxy.rb +5 -1
  27. data/lib/mongo_mapper/plugins/associations/single_association.rb +6 -6
  28. data/lib/mongo_mapper/plugins/clone.rb +4 -2
  29. data/lib/mongo_mapper/plugins/dirty.rb +22 -21
  30. data/lib/mongo_mapper/plugins/document.rb +4 -4
  31. data/lib/mongo_mapper/plugins/dumpable.rb +22 -0
  32. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +58 -9
  33. data/lib/mongo_mapper/plugins/identity_map.rb +42 -32
  34. data/lib/mongo_mapper/plugins/keys.rb +133 -54
  35. data/lib/mongo_mapper/plugins/keys/key.rb +68 -22
  36. data/lib/mongo_mapper/plugins/modifiers.rb +26 -19
  37. data/lib/mongo_mapper/plugins/persistence.rb +15 -5
  38. data/lib/mongo_mapper/plugins/querying.rb +15 -40
  39. data/lib/mongo_mapper/plugins/querying/{decorator.rb → decorated_plucky_query.rb} +24 -4
  40. data/lib/mongo_mapper/plugins/rails.rb +22 -2
  41. data/lib/mongo_mapper/plugins/safe.rb +8 -5
  42. data/lib/mongo_mapper/plugins/sci.rb +26 -4
  43. data/lib/mongo_mapper/plugins/scopes.rb +5 -4
  44. data/lib/mongo_mapper/plugins/timestamps.rb +11 -4
  45. data/lib/mongo_mapper/plugins/validations.rb +1 -1
  46. data/lib/mongo_mapper/utils.rb +12 -0
  47. data/lib/mongo_mapper/version.rb +1 -1
  48. data/lib/rails/generators/mongo_mapper/config/config_generator.rb +20 -7
  49. data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +6 -0
  50. data/lib/rails/generators/mongo_mapper/model/model_generator.rb +18 -1
  51. data/lib/rails/generators/mongo_mapper/model/templates/model.rb +9 -5
  52. data/{test/functional/test_accessible.rb → spec/functional/accessible_spec.rb} +29 -29
  53. data/{test/functional/associations/test_belongs_to_polymorphic_proxy.rb → spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb} +10 -10
  54. data/{test/functional/associations/test_belongs_to_proxy.rb → spec/functional/associations/belongs_to_proxy_spec.rb} +82 -64
  55. data/{test/functional/associations/test_in_array_proxy.rb → spec/functional/associations/in_array_proxy_spec.rb} +68 -68
  56. data/{test/functional/associations/test_many_documents_as_proxy.rb → spec/functional/associations/many_documents_as_proxy_spec.rb} +37 -38
  57. data/{test/functional/associations/test_many_documents_proxy.rb → spec/functional/associations/many_documents_proxy_spec.rb} +233 -146
  58. data/{test/functional/associations/test_many_embedded_polymorphic_proxy.rb → spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb} +19 -20
  59. data/{test/functional/associations/test_many_embedded_proxy.rb → spec/functional/associations/many_embedded_proxy_spec.rb} +23 -24
  60. data/{test/functional/associations/test_many_polymorphic_proxy.rb → spec/functional/associations/many_polymorphic_proxy_spec.rb} +45 -46
  61. data/{test/functional/associations/test_one_as_proxy.rb → spec/functional/associations/one_as_proxy_spec.rb} +75 -77
  62. data/{test/functional/associations/test_one_embedded_polymorphic_proxy.rb → spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb} +31 -32
  63. data/{test/functional/associations/test_one_embedded_proxy.rb → spec/functional/associations/one_embedded_proxy_spec.rb} +10 -10
  64. data/{test/functional/associations/test_one_proxy.rb → spec/functional/associations/one_proxy_spec.rb} +125 -102
  65. data/spec/functional/associations_spec.rb +48 -0
  66. data/{test/functional/test_binary.rb → spec/functional/binary_spec.rb} +6 -6
  67. data/spec/functional/caching_spec.rb +75 -0
  68. data/{test/functional/test_callbacks.rb → spec/functional/callbacks_spec.rb} +84 -26
  69. data/{test/functional/test_dirty.rb → spec/functional/dirty_spec.rb} +57 -42
  70. data/{test/functional/test_document.rb → spec/functional/document_spec.rb} +52 -52
  71. data/spec/functional/dumpable_spec.rb +24 -0
  72. data/{test/functional/test_dynamic_querying.rb → spec/functional/dynamic_querying_spec.rb} +14 -14
  73. data/{test/functional/test_embedded_document.rb → spec/functional/embedded_document_spec.rb} +51 -42
  74. data/{test/functional/test_equality.rb → spec/functional/equality_spec.rb} +4 -4
  75. data/spec/functional/extensions_spec.rb +16 -0
  76. data/{test/functional/test_identity_map.rb → spec/functional/identity_map_spec.rb} +73 -61
  77. data/spec/functional/indexes_spec.rb +48 -0
  78. data/spec/functional/keys_spec.rb +224 -0
  79. data/{test/functional/test_logger.rb → spec/functional/logger_spec.rb} +6 -6
  80. data/spec/functional/modifiers_spec.rb +550 -0
  81. data/spec/functional/pagination_spec.rb +89 -0
  82. data/spec/functional/protected_spec.rb +199 -0
  83. data/spec/functional/querying_spec.rb +1003 -0
  84. data/spec/functional/rails_spec.rb +55 -0
  85. data/spec/functional/safe_spec.rb +163 -0
  86. data/{test/functional/test_sci.rb → spec/functional/sci_spec.rb} +123 -34
  87. data/{test/functional/test_scopes.rb → spec/functional/scopes_spec.rb} +59 -26
  88. data/spec/functional/timestamps_spec.rb +97 -0
  89. data/{test/functional/test_touch.rb → spec/functional/touch_spec.rb} +13 -13
  90. data/spec/functional/userstamps_spec.rb +46 -0
  91. data/{test/functional/test_validations.rb → spec/functional/validations_spec.rb} +64 -64
  92. data/spec/spec_helper.rb +81 -0
  93. data/spec/support/matchers.rb +24 -0
  94. data/{test → spec/support}/models.rb +1 -6
  95. data/spec/unit/associations/base_spec.rb +146 -0
  96. data/spec/unit/associations/belongs_to_association_spec.rb +30 -0
  97. data/spec/unit/associations/many_association_spec.rb +64 -0
  98. data/spec/unit/associations/one_association_spec.rb +48 -0
  99. data/{test/unit/associations/test_proxy.rb → spec/unit/associations/proxy_spec.rb} +21 -21
  100. data/{test/unit/test_clone.rb → spec/unit/clone_spec.rb} +21 -11
  101. data/spec/unit/config_generator_spec.rb +24 -0
  102. data/{test/unit/test_document.rb → spec/unit/document_spec.rb} +42 -42
  103. data/{test/unit/test_dynamic_finder.rb → spec/unit/dynamic_finder_spec.rb} +28 -28
  104. data/{test/unit/test_embedded_document.rb → spec/unit/embedded_document_spec.rb} +102 -108
  105. data/{test/unit/test_equality.rb → spec/unit/equality_spec.rb} +7 -7
  106. data/{test/unit/test_exceptions.rb → spec/unit/exceptions_spec.rb} +3 -3
  107. data/{test/unit/test_extensions.rb → spec/unit/extensions_spec.rb} +85 -71
  108. data/spec/unit/identity_map_middleware_spec.rb +134 -0
  109. data/{test/unit/test_inspect.rb → spec/unit/inspect_spec.rb} +8 -8
  110. data/{test/unit/test_key.rb → spec/unit/key_spec.rb} +82 -52
  111. data/spec/unit/keys_spec.rb +155 -0
  112. data/spec/unit/model_generator_spec.rb +47 -0
  113. data/spec/unit/mongo_mapper_spec.rb +184 -0
  114. data/spec/unit/pagination_spec.rb +11 -0
  115. data/{test/unit/test_plugins.rb → spec/unit/plugins_spec.rb} +14 -14
  116. data/spec/unit/rails_compatibility_spec.rb +40 -0
  117. data/{test/unit/test_rails_reflect_on_association.rb → spec/unit/rails_reflect_on_association_spec.rb} +9 -9
  118. data/{test/unit/test_rails.rb → spec/unit/rails_spec.rb} +31 -31
  119. data/spec/unit/serialization_spec.rb +169 -0
  120. data/spec/unit/serializers/json_serializer_spec.rb +218 -0
  121. data/spec/unit/serializers/xml_serializer_spec.rb +198 -0
  122. data/{test/unit/test_time_zones.rb → spec/unit/time_zones_spec.rb} +8 -8
  123. data/{test/unit/test_translation.rb → spec/unit/translation_spec.rb} +6 -6
  124. data/{test/unit/test_validations.rb → spec/unit/validations_spec.rb} +72 -59
  125. metadata +199 -179
  126. data/test/_NOTE_ON_TESTING +0 -1
  127. data/test/functional/test_associations.rb +0 -46
  128. data/test/functional/test_caching.rb +0 -77
  129. data/test/functional/test_indexes.rb +0 -50
  130. data/test/functional/test_modifiers.rb +0 -537
  131. data/test/functional/test_pagination.rb +0 -91
  132. data/test/functional/test_protected.rb +0 -201
  133. data/test/functional/test_querying.rb +0 -935
  134. data/test/functional/test_safe.rb +0 -76
  135. data/test/functional/test_timestamps.rb +0 -62
  136. data/test/functional/test_userstamps.rb +0 -44
  137. data/test/support/railtie.rb +0 -4
  138. data/test/support/railtie/autoloaded.rb +0 -2
  139. data/test/support/railtie/not_autoloaded.rb +0 -3
  140. data/test/support/railtie/parent.rb +0 -3
  141. data/test/test_active_model_lint.rb +0 -18
  142. data/test/test_helper.rb +0 -93
  143. data/test/unit/associations/test_base.rb +0 -146
  144. data/test/unit/associations/test_belongs_to_association.rb +0 -29
  145. data/test/unit/associations/test_many_association.rb +0 -63
  146. data/test/unit/associations/test_one_association.rb +0 -47
  147. data/test/unit/serializers/test_json_serializer.rb +0 -216
  148. data/test/unit/serializers/test_xml_serializer.rb +0 -196
  149. data/test/unit/test_identity_map_middleware.rb +0 -132
  150. data/test/unit/test_keys.rb +0 -65
  151. data/test/unit/test_mongo_mapper.rb +0 -157
  152. data/test/unit/test_pagination.rb +0 -11
  153. data/test/unit/test_rails_compatibility.rb +0 -38
  154. data/test/unit/test_serialization.rb +0 -166
@@ -1,8 +1,7 @@
1
- require 'test_helper.rb'
2
- require 'models'
1
+ require 'spec_helper.rb'
3
2
 
4
- class ManyDocumentsProxyTest < Test::Unit::TestCase
5
- def setup
3
+ describe "ManyDocumentsProxy" do
4
+ before do
6
5
  Project.collection.remove
7
6
  Status.collection.remove
8
7
 
@@ -17,12 +16,39 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
17
16
  @owner_class.many :pets, :class => @pet_class, :foreign_key => :owner_id, :order => 'name'
18
17
  end
19
18
 
20
- should "default reader to empty array" do
19
+ it "should return results if found via method_missing" do
20
+ @pet_class.class_eval do
21
+ def self.from_param(name)
22
+ find_by_name(name)
23
+ end
24
+
25
+ def self.all_from_param(names)
26
+ where(:name => names).all
27
+ end
28
+ end
29
+
30
+ instance = @owner_class.new
31
+ instance.pets.build(:name => "Foo")
32
+ instance.pets.build(:name => "Bar")
33
+ instance.save
34
+
35
+ instance.reload.pets.from_param("Foo").tap do |pet|
36
+ pet.should be_a @pet_class
37
+ pet.name.should == "Foo"
38
+ end
39
+
40
+ instance.reload.pets.all_from_param(["Foo", "Bar"]).tap do |pet|
41
+ pet.should be_a Array
42
+ pet.map(&:name).should =~ %w(Foo Bar)
43
+ end
44
+ end
45
+
46
+ it "should default reader to empty array" do
21
47
  project = Project.new
22
48
  project.statuses.should == []
23
49
  end
24
50
 
25
- should "allow overriding association methods" do
51
+ it "should allow overriding association methods" do
26
52
  @owner_class.class_eval do
27
53
  def pets
28
54
  super
@@ -35,7 +61,35 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
35
61
  instance.pets.should_not be_empty
36
62
  end
37
63
 
38
- should "allow assignment of many associated documents using a hash" do
64
+ it "should be able to iterate associated documents in a callback" do
65
+ @owner_class.class_eval do
66
+ before_save :search_pets
67
+
68
+ def search_pets
69
+ pets.each { |p| p.name = "Animal" }
70
+ end
71
+ end
72
+
73
+ owner = @owner_class.new
74
+ sophie = owner.pets.build(:name => "Sophie")
75
+ pippa = owner.pets.build(:name => "Pippa")
76
+
77
+ owner.save
78
+ owner.reload
79
+ owner.pets.reload
80
+
81
+ pets = []
82
+ owner.pets.each { |p| pets << p }
83
+
84
+ pets.size.should == 2
85
+ pets.should include(sophie)
86
+ pets.should include(pippa)
87
+
88
+ sophie.reload.name.should == "Animal"
89
+ pippa.reload.name.should == "Animal"
90
+ end
91
+
92
+ it "should allow assignment of many associated documents using a hash" do
39
93
  person_attributes = {
40
94
  'name' => 'Mr. Pet Lover',
41
95
  'pets' => [
@@ -61,7 +115,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
61
115
  owner.pets[1].species.should == 'Siberian Husky'
62
116
  end
63
117
 
64
- should "allow adding to association like it was an array" do
118
+ it "should allow adding to association like it was an array" do
65
119
  project = Project.new
66
120
  project.statuses << Status.new(:name => 'Foo1!')
67
121
  project.statuses.push Status.new(:name => 'Foo2!')
@@ -71,7 +125,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
71
125
 
72
126
  context "replacing the association" do
73
127
  context "with objects of the class" do
74
- should "work" do
128
+ it "should work" do
75
129
  project = Project.new
76
130
  project.statuses = [Status.new(:name => "ready")]
77
131
  project.save.should be_true
@@ -83,7 +137,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
83
137
  end
84
138
 
85
139
  context "with Hashes" do
86
- should "convert to objects of the class and work" do
140
+ it "should convert to objects of the class and work" do
87
141
  project = Project.new
88
142
  project.statuses = [{ 'name' => 'ready' }]
89
143
  project.save.should be_true
@@ -93,20 +147,20 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
93
147
  project.statuses[0].name.should == "ready"
94
148
  end
95
149
  end
96
-
150
+
97
151
  context "with :dependent" do
98
- setup do
152
+ before do
99
153
  @broker_class = Doc('Broker')
100
154
  @property_class = Doc('Property') do
101
155
  key :broker_id, ObjectId
102
156
  belongs_to :broker
103
157
  end
104
158
  end
105
-
159
+
106
160
  context "=> destroy" do
107
- setup do
161
+ before do
108
162
  @broker_class.many :properties, :class => @property_class, :dependent => :destroy
109
-
163
+
110
164
  @broker = @broker_class.create(:name => "Bob")
111
165
  @property1 = @property_class.create
112
166
  @property2 = @property_class.create
@@ -115,32 +169,32 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
115
169
  @broker.properties << @property2
116
170
  @broker.properties << @property3
117
171
  end
118
-
119
- should "call destroy the existing documents" do
120
- @broker.properties[0].expects(:destroy).once
121
- @broker.properties[1].expects(:destroy).once
122
- @broker.properties[2].expects(:destroy).once
172
+
173
+ it "should call destroy the existing documents" do
174
+ @broker.properties[0].should_receive(:destroy).once
175
+ @broker.properties[1].should_receive(:destroy).once
176
+ @broker.properties[2].should_receive(:destroy).once
123
177
  @broker.properties = [@property_class.new]
124
178
  end
125
-
126
- should "remove the existing document from the database" do
179
+
180
+ it "should remove the existing document from the database" do
127
181
  @property_class.count.should == 3
128
182
  @broker.properties = []
129
183
  @property_class.count.should == 0
130
184
  end
131
-
132
- should "skip over documents that are the same" do
133
- @broker.properties[0].expects(:destroy).never
134
- @broker.properties[1].expects(:destroy).once
135
- @broker.properties[2].expects(:destroy).never
185
+
186
+ it "should skip over documents that are the same" do
187
+ @broker.properties[0].should_receive(:destroy).never
188
+ @broker.properties[1].should_receive(:destroy).once
189
+ @broker.properties[2].should_receive(:destroy).never
136
190
  @broker.properties = [@property3, @property1]
137
191
  end
138
192
  end
139
-
193
+
140
194
  context "=> delete_all" do
141
- setup do
195
+ before do
142
196
  @broker_class.many :properties, :class => @property_class, :dependent => :delete_all
143
-
197
+
144
198
  @broker = @broker_class.create(:name => "Bob")
145
199
  @property1 = @property_class.create
146
200
  @property2 = @property_class.create
@@ -149,32 +203,32 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
149
203
  @broker.properties << @property2
150
204
  @broker.properties << @property3
151
205
  end
152
-
153
- should "call delete the existing documents" do
154
- @broker.properties[0].expects(:delete).once
155
- @broker.properties[1].expects(:delete).once
156
- @broker.properties[2].expects(:delete).once
206
+
207
+ it "should call delete the existing documents" do
208
+ @broker.properties[0].should_receive(:delete).once
209
+ @broker.properties[1].should_receive(:delete).once
210
+ @broker.properties[2].should_receive(:delete).once
157
211
  @broker.properties = [@property_class.new]
158
212
  end
159
-
160
- should "remove the existing document from the database" do
213
+
214
+ it "should remove the existing document from the database" do
161
215
  @property_class.count.should == 3
162
216
  @broker.properties = []
163
217
  @property_class.count.should == 0
164
218
  end
165
-
166
- should "skip over documents that are the same" do
167
- @broker.properties[0].expects(:delete).never
168
- @broker.properties[1].expects(:delete).once
169
- @broker.properties[2].expects(:delete).never
219
+
220
+ it "should skip over documents that are the same" do
221
+ @broker.properties[0].should_receive(:delete).never
222
+ @broker.properties[1].should_receive(:delete).once
223
+ @broker.properties[2].should_receive(:delete).never
170
224
  @broker.properties = [@property3, @property1]
171
225
  end
172
226
  end
173
-
227
+
174
228
  context "=> nullify" do
175
- setup do
229
+ before do
176
230
  @broker_class.many :properties, :class => @property_class, :dependent => :nullify
177
-
231
+
178
232
  @broker = @broker_class.create(:name => "Bob")
179
233
  @property1 = @property_class.create
180
234
  @property2 = @property_class.create
@@ -183,38 +237,38 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
183
237
  @broker.properties << @property2
184
238
  @broker.properties << @property3
185
239
  end
186
-
187
- should "nullify the existing documents" do
240
+
241
+ it "should nullify the existing documents" do
188
242
  @property1.reload.broker_id.should == @broker.id
189
243
  @property2.reload.broker_id.should == @broker.id
190
244
  @property3.reload.broker_id.should == @broker.id
191
245
 
192
246
  @broker.properties = [@property_class.new]
193
-
247
+
194
248
  @property1.reload.broker_id.should be_nil
195
249
  @property2.reload.broker_id.should be_nil
196
250
  @property3.reload.broker_id.should be_nil
197
251
  end
198
-
199
- should "skip over documents that are the same" do
252
+
253
+ it "should skip over documents that are the same" do
200
254
  @broker.properties = [@property3, @property1]
201
255
 
202
256
  @property1.reload.broker_id.should == @broker.id
203
257
  @property2.reload.broker_id.should be_nil
204
258
  @property3.reload.broker_id.should == @broker.id
205
259
  end
206
-
207
- should "work" do
260
+
261
+ it "should work" do
208
262
  old_properties = @broker.properties
209
263
  @broker.properties = [@property1, @property2, @property3]
210
264
  old_properties.should == @broker.properties
211
265
  end
212
266
  end
213
-
267
+
214
268
  context "unspecified" do
215
- should "nullify the existing documents" do
269
+ it "should nullify the existing documents" do
216
270
  @broker_class.many :properties, :class => @property_class
217
-
271
+
218
272
  @broker = @broker_class.create(:name => "Bob")
219
273
  @property1 = @property_class.create
220
274
  @property2 = @property_class.create
@@ -224,7 +278,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
224
278
  @broker.properties << @property3
225
279
 
226
280
  @broker.properties = [@property_class.new]
227
-
281
+
228
282
  @property1.reload.broker_id.should be_nil
229
283
  @property2.reload.broker_id.should be_nil
230
284
  @property3.reload.broker_id.should be_nil
@@ -235,7 +289,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
235
289
 
236
290
  context "using <<, push and concat" do
237
291
  context "with objects of the class" do
238
- should "correctly assign foreign key" do
292
+ it "should correctly assign foreign key" do
239
293
  project = Project.new
240
294
  project.statuses << Status.new(:name => '<<')
241
295
  project.statuses.push Status.new(:name => 'push')
@@ -249,7 +303,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
249
303
  end
250
304
 
251
305
  context "with Hashes" do
252
- should "correctly convert to objects and assign foreign key" do
306
+ it "should correctly convert to objects and assign foreign key" do
253
307
  project = Project.new
254
308
  project.statuses << { 'name' => '<<' }
255
309
  project.statuses.push( { 'name' => 'push' })
@@ -263,20 +317,20 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
263
317
  end
264
318
  end
265
319
 
266
- context "build" do
267
- should "assign foreign key" do
320
+ context "#build" do
321
+ it "should assign foreign key" do
268
322
  project = Project.create
269
323
  status = project.statuses.build
270
324
  status.project_id.should == project.id
271
325
  end
272
326
 
273
- should "allow assigning attributes" do
327
+ it "should allow assigning attributes" do
274
328
  project = Project.create
275
329
  status = project.statuses.build(:name => 'Foo')
276
330
  status.name.should == 'Foo'
277
331
  end
278
332
 
279
- should "reset cache" do
333
+ it "should reset cache" do
280
334
  project = Project.create
281
335
  project.statuses.size.should == 0
282
336
  status = project.statuses.build(:name => 'Foo')
@@ -284,97 +338,121 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
284
338
  project.statuses.size.should == 1
285
339
  end
286
340
 
287
- should "update collection without save" do
341
+ it "should update collection without save" do
288
342
  project = Project.create
289
343
  project.statuses.build(:name => 'Foo')
290
344
  project.statuses.size.should == 1
291
345
  end
292
346
 
293
- should "save built document when saving parent" do
347
+ it "should save built document when saving parent" do
294
348
  project = Project.create
295
349
  status = project.statuses.build(:name => 'Foo')
296
350
  project.save!
297
351
  status.should_not be_new
298
352
  end
299
353
 
300
- should "not save the parent when building associations" do
354
+ it "should not save the parent when building associations" do
301
355
  project = Project.new
302
356
  status = project.statuses.build(:name => 'Foo')
303
357
  project.should be_new
304
358
  end
305
359
 
306
- should "not save the built object" do
360
+ it "should not save the built object" do
307
361
  project = Project.new
308
362
  status = project.statuses.build(:name => 'Foo')
309
363
  status.should be_new
310
364
  end
365
+
366
+ it "should accept a block" do
367
+ project = Project.new
368
+ status = project.statuses.build do |doc|
369
+ doc.name = "Foo"
370
+ end
371
+ project.statuses[0].name.should == "Foo"
372
+ end
311
373
  end
312
374
 
313
- context "create" do
314
- should "assign foreign key" do
375
+ context "#create" do
376
+ it "should assign foreign key" do
315
377
  project = Project.create
316
378
  status = project.statuses.create(:name => 'Foo!')
317
379
  status.project_id.should == project.id
318
380
  end
319
381
 
320
- should "save record" do
382
+ it "should save record" do
321
383
  project = Project.create
322
384
  lambda {
323
385
  project.statuses.create(:name => 'Foo!')
324
386
  }.should change { Status.count }
325
387
  end
326
388
 
327
- should "allow passing attributes" do
389
+ it "should allow passing attributes" do
328
390
  project = Project.create
329
391
  status = project.statuses.create(:name => 'Foo!')
330
392
  status.name.should == 'Foo!'
331
393
  end
332
394
 
333
- should "reset cache" do
395
+ it "should reset cache" do
334
396
  project = Project.create
335
397
  project.statuses.size.should == 0
336
398
  project.statuses.create(:name => 'Foo!')
337
399
  project.statuses.size.should == 1
338
400
  end
401
+
402
+ it "should accept a block" do
403
+ project = Project.new
404
+ status = project.statuses.create do |doc|
405
+ doc.name = "Foo"
406
+ end
407
+ project.statuses.first.name.should == "Foo"
408
+ end
339
409
  end
340
410
 
341
- context "create!" do
342
- should "assign foreign key" do
411
+ context "#create!" do
412
+ it "should assign foreign key" do
343
413
  project = Project.create
344
414
  status = project.statuses.create!(:name => 'Foo!')
345
415
  status.project_id.should == project.id
346
416
  end
347
417
 
348
- should "save record" do
418
+ it "should save record" do
349
419
  project = Project.create
350
420
  lambda {
351
421
  project.statuses.create!(:name => 'Foo!')
352
422
  }.should change { Status.count }
353
423
  end
354
424
 
355
- should "allow passing attributes" do
425
+ it "should allow passing attributes" do
356
426
  project = Project.create
357
427
  status = project.statuses.create!(:name => 'Foo!')
358
428
  status.name.should == 'Foo!'
359
429
  end
360
430
 
361
- should "raise exception if not valid" do
431
+ it "should raise exception if not valid" do
362
432
  project = Project.create
363
- lambda {
433
+ expect {
364
434
  project.statuses.create!(:name => nil)
365
- }.should raise_error(MongoMapper::DocumentNotValid)
435
+ }.to raise_error(MongoMapper::DocumentNotValid)
366
436
  end
367
437
 
368
- should "reset cache" do
438
+ it "should reset cache" do
369
439
  project = Project.create
370
440
  project.statuses.size.should == 0
371
441
  project.statuses.create!(:name => 'Foo!')
372
442
  project.statuses.size.should == 1
373
443
  end
444
+
445
+ it "should accept a block" do
446
+ project = Project.new
447
+ status = project.statuses.create! do |doc|
448
+ doc.name = "Foo"
449
+ end
450
+ status.name.should == "Foo"
451
+ end
374
452
  end
375
453
 
376
454
  context "count" do
377
- should "work scoped to association" do
455
+ it "should work scoped to association" do
378
456
  project = Project.create
379
457
  3.times { project.statuses.create(:name => 'Foo!') }
380
458
 
@@ -385,7 +463,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
385
463
  other_project.statuses.count.should == 2
386
464
  end
387
465
 
388
- should "work with conditions" do
466
+ it "should work with conditions" do
389
467
  project = Project.create
390
468
  project.statuses.create(:name => 'Foo')
391
469
  project.statuses.create(:name => 'Other 1')
@@ -394,7 +472,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
394
472
  project.statuses.count(:name => 'Foo').should == 1
395
473
  end
396
474
 
397
- should "ignore unpersisted documents" do
475
+ it "should ignore unpersisted documents" do
398
476
  project = Project.create
399
477
  project.statuses.build(:name => 'Foo')
400
478
  project.statuses.count.should == 0
@@ -402,7 +480,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
402
480
  end
403
481
 
404
482
  context "size" do
405
- should "reflect both persisted and new documents" do
483
+ it "should reflect both persisted and new documents" do
406
484
  project = Project.create
407
485
  3.times { project.statuses.create(:name => 'Foo!') }
408
486
  2.times { project.statuses.build(:name => 'Foo!') }
@@ -411,26 +489,26 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
411
489
  end
412
490
 
413
491
  context "empty?" do
414
- should "be true with no associated docs" do
492
+ it "should be true with no associated docs" do
415
493
  project = Project.create
416
494
  project.statuses.empty?.should be_true
417
495
  end
418
496
 
419
- should "be false if a document is built" do
497
+ it "should be false if a document is built" do
420
498
  project = Project.create
421
499
  project.statuses.build(:name => 'Foo!')
422
500
  project.statuses.empty?.should be_false
423
501
  end
424
502
 
425
- should "be false if a document is created" do
503
+ it "should be false if a document is created" do
426
504
  project = Project.create
427
505
  project.statuses.create(:name => 'Foo!')
428
506
  project.statuses.empty?.should be_false
429
507
  end
430
508
  end
431
509
 
432
- context "to_a" do
433
- should "include persisted and new documents" do
510
+ context "#to_a" do
511
+ it "should include persisted and new documents" do
434
512
  project = Project.create
435
513
  3.times { project.statuses.create(:name => 'Foo!') }
436
514
  2.times { project.statuses.build(:name => 'Foo!') }
@@ -438,8 +516,17 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
438
516
  end
439
517
  end
440
518
 
519
+ context "#map" do
520
+ it "should include persisted and new documents" do
521
+ project = Project.create
522
+ 3.times { project.statuses.create(:name => 'Foo!') }
523
+ 2.times { project.statuses.build(:name => 'Foo!') }
524
+ project.statuses.map(&:name).size.should == 5
525
+ end
526
+ end
527
+
441
528
  context "to_json" do
442
- should "work on association" do
529
+ it "should work on association" do
443
530
  project = Project.create
444
531
  3.times { |i| project.statuses.create(:name => i.to_s) }
445
532
 
@@ -448,7 +535,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
448
535
  end
449
536
 
450
537
  context "as_json" do
451
- should "work on association" do
538
+ it "should work on association" do
452
539
  project = Project.create
453
540
  3.times { |i| project.statuses.create(:name => i.to_s) }
454
541
 
@@ -457,7 +544,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
457
544
  end
458
545
 
459
546
  context "Unassociating documents" do
460
- setup do
547
+ before do
461
548
  @project = Project.create
462
549
  @project.statuses << Status.create(:name => '1')
463
550
  @project.statuses << Status.create(:name => '2')
@@ -467,7 +554,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
467
554
  @project2.statuses << Status.create(:name => '2')
468
555
  end
469
556
 
470
- should "work with destroy all" do
557
+ it "should work with destroy all" do
471
558
  @project.statuses.count.should == 2
472
559
  @project.statuses.destroy_all
473
560
  @project.statuses.count.should == 0
@@ -476,7 +563,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
476
563
  Status.count.should == 2
477
564
  end
478
565
 
479
- should "work with destroy all and conditions" do
566
+ it "should work with destroy all and conditions" do
480
567
  @project.statuses.count.should == 2
481
568
  @project.statuses.destroy_all(:name => '1')
482
569
  @project.statuses.count.should == 1
@@ -485,7 +572,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
485
572
  Status.count.should == 3
486
573
  end
487
574
 
488
- should "work with delete all" do
575
+ it "should work with delete all" do
489
576
  @project.statuses.count.should == 2
490
577
  @project.statuses.delete_all
491
578
  @project.statuses.count.should == 0
@@ -494,7 +581,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
494
581
  Status.count.should == 2
495
582
  end
496
583
 
497
- should "work with delete all and conditions" do
584
+ it "should work with delete all and conditions" do
498
585
  @project.statuses.count.should == 2
499
586
  @project.statuses.delete_all(:name => '1')
500
587
  @project.statuses.count.should == 1
@@ -503,7 +590,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
503
590
  Status.count.should == 3
504
591
  end
505
592
 
506
- should "work with nullify" do
593
+ it "should work with nullify" do
507
594
  @project.statuses.count.should == 2
508
595
  @project.statuses.nullify
509
596
  @project.statuses.count.should == 0
@@ -516,7 +603,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
516
603
  end
517
604
 
518
605
  context "Finding scoped to association" do
519
- setup do
606
+ before do
520
607
  @project1 = Project.new(:name => 'Project 1')
521
608
  @brand_new = Status.create(:name => 'New', :position => 1 )
522
609
  @complete = Status.create(:name => 'Complete', :position => 2)
@@ -532,37 +619,37 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
532
619
  end
533
620
 
534
621
  context "include?" do
535
- should "return true if in association" do
622
+ it "should return true if in association" do
536
623
  @project1.statuses.should include(@brand_new)
537
624
  end
538
625
 
539
- should "return false if not in association" do
626
+ it "should return false if not in association" do
540
627
  @project1.statuses.should_not include(@in_progress)
541
628
  end
542
629
  end
543
630
 
544
631
  context "dynamic finders" do
545
- should "work with single key" do
632
+ it "should work with single key" do
546
633
  @project1.statuses.find_by_name('New').should == @brand_new
547
634
  @project1.statuses.find_by_name!('New').should == @brand_new
548
635
  @project2.statuses.find_by_name('In Progress').should == @in_progress
549
636
  @project2.statuses.find_by_name!('In Progress').should == @in_progress
550
637
  end
551
638
 
552
- should "work with multiple keys" do
639
+ it "should work with multiple keys" do
553
640
  @project1.statuses.find_by_name_and_position('New', 1).should == @brand_new
554
641
  @project1.statuses.find_by_name_and_position!('New', 1).should == @brand_new
555
642
  @project1.statuses.find_by_name_and_position('New', 2).should be_nil
556
643
  end
557
644
 
558
- should "raise error when using !" do
645
+ it "should raise error when using !" do
559
646
  lambda {
560
647
  @project1.statuses.find_by_name!('Fake')
561
648
  }.should raise_error(MongoMapper::DocumentNotFound)
562
649
  end
563
650
 
564
651
  context "find_or_create_by" do
565
- should "not create document if found" do
652
+ it "should not create document if found" do
566
653
  lambda {
567
654
  status = @project1.statuses.find_or_create_by_name('New')
568
655
  status.project.should == @project1
@@ -570,7 +657,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
570
657
  }.should_not change { Status.count }
571
658
  end
572
659
 
573
- should "create document if not found" do
660
+ it "should create document if not found" do
574
661
  lambda {
575
662
  status = @project1.statuses.find_or_create_by_name('Delivered')
576
663
  status.project.should == @project1
@@ -580,38 +667,38 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
580
667
  end
581
668
 
582
669
  context "sexy querying" do
583
- should "work with where" do
670
+ it "should work with where" do
584
671
  @project1.statuses.where(:name => 'New').all.should == [@brand_new]
585
672
  end
586
673
 
587
- should "work with sort" do
674
+ it "should work with sort" do
588
675
  @project1.statuses.sort(:name).all.should == [@complete, @brand_new]
589
676
  end
590
677
 
591
- should "work with limit" do
678
+ it "should work with limit" do
592
679
  @project1.statuses.sort(:name).limit(1).all.should == [@complete]
593
680
  end
594
681
 
595
- should "work with skip" do
682
+ it "should work with skip" do
596
683
  @project1.statuses.sort(:name).skip(1).all.should == [@brand_new]
597
684
  end
598
685
 
599
- should "work with fields" do
686
+ it "should work with fields" do
600
687
  @project1.statuses.fields(:position).all.each do |status|
601
688
  status.position.should_not be_nil
602
689
  status.name.should be_nil
603
690
  end
604
691
  end
605
692
 
606
- should "work with scopes" do
693
+ it "should work with scopes" do
607
694
  @project1.statuses.complete.all.should == [@complete]
608
695
  end
609
696
 
610
- should "work with methods on class that return query" do
697
+ it "should work with methods on class that return query" do
611
698
  @project1.statuses.by_position(1).first.should == @brand_new
612
699
  end
613
700
 
614
- should "not work with methods on class that do not return query" do
701
+ it "should not work with methods on class that do not return query" do
615
702
  Status.class_eval { def self.foo; 'foo' end }
616
703
  lambda { @project1.statuses.foo }.
617
704
  should raise_error(NoMethodError)
@@ -619,41 +706,41 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
619
706
  end
620
707
 
621
708
  context "all" do
622
- should "work" do
709
+ it "should work" do
623
710
  @project1.statuses.all(:order => "position asc").should == [@brand_new, @complete]
624
711
  end
625
712
 
626
- should "work with conditions" do
713
+ it "should work with conditions" do
627
714
  @project1.statuses.all(:name => 'Complete').should == [@complete]
628
715
  end
629
716
  end
630
717
 
631
718
  context "first" do
632
- should "work" do
719
+ it "should work" do
633
720
  @project1.statuses.first(:order => 'name').should == @complete
634
721
  end
635
722
 
636
- should "work with conditions" do
723
+ it "should work with conditions" do
637
724
  @project1.statuses.first(:name => 'Complete').should == @complete
638
725
  end
639
726
  end
640
727
 
641
728
  context "last" do
642
- should "work" do
729
+ it "should work" do
643
730
  @project1.statuses.last(:order => "position asc").should == @complete
644
731
  end
645
732
 
646
- should "work with conditions" do
733
+ it "should work with conditions" do
647
734
  @project1.statuses.last(:order => 'position', :name => 'New').should == @brand_new
648
735
  end
649
736
  end
650
737
 
651
738
  context "with one id" do
652
- should "work for id in association" do
739
+ it "should work for id in association" do
653
740
  @project1.statuses.find(@complete.id).should == @complete
654
741
  end
655
742
 
656
- should "not work for id not in association" do
743
+ it "should not work for id not in association" do
657
744
  lambda {
658
745
  @project1.statuses.find!(@archived.id)
659
746
  }.should raise_error(MongoMapper::DocumentNotFound)
@@ -661,39 +748,39 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
661
748
  end
662
749
 
663
750
  context "with multiple ids" do
664
- should "work for ids in association" do
751
+ it "should work for ids in association" do
665
752
  statuses = @project1.statuses.find(@brand_new.id, @complete.id)
666
753
  statuses.should == [@brand_new, @complete]
667
754
  end
668
755
 
669
- should "not work for ids not in association" do
670
- assert_raises(MongoMapper::DocumentNotFound) do
756
+ it "should not work for ids not in association" do
757
+ expect {
671
758
  @project1.statuses.find!(@brand_new.id, @complete.id, @archived.id)
672
- end
759
+ }.to raise_error(MongoMapper::DocumentNotFound)
673
760
  end
674
761
  end
675
762
 
676
763
  context "with #paginate" do
677
- setup do
764
+ before do
678
765
  @statuses = @project2.statuses.paginate(:per_page => 2, :page => 1, :order => 'name asc')
679
766
  end
680
767
 
681
- should "return total pages" do
768
+ it "should return total pages" do
682
769
  @statuses.total_pages.should == 2
683
770
  end
684
771
 
685
- should "return total entries" do
772
+ it "should return total entries" do
686
773
  @statuses.total_entries.should == 3
687
774
  end
688
775
 
689
- should "return the subject" do
776
+ it "should return the subject" do
690
777
  @statuses.collect(&:name).should == %w(Archived Complete)
691
778
  end
692
779
  end
693
780
  end
694
781
 
695
782
  context "extending the association" do
696
- should "work using a block passed to many" do
783
+ it "should work using a block passed to many" do
697
784
  project = Project.new(:name => "Some Project")
698
785
  status1 = Status.new(:name => "New")
699
786
  status2 = Status.new(:name => "Assigned")
@@ -707,7 +794,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
707
794
  open_statuses.should_not include(status3)
708
795
  end
709
796
 
710
- should "work using many's :extend option" do
797
+ it "should work using many's :extend option" do
711
798
  project = Project.new(:name => "Some Project")
712
799
  collaborator1 = Collaborator.new(:name => "zing")
713
800
  collaborator2 = Collaborator.new(:name => "zang")
@@ -718,7 +805,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
718
805
  end
719
806
 
720
807
  context ":dependent" do
721
- setup do
808
+ before do
722
809
  # FIXME: make use of already defined models
723
810
  class ::Property
724
811
  include MongoMapper::Document
@@ -732,13 +819,13 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
732
819
  Thing.collection.remove
733
820
  end
734
821
 
735
- teardown do
822
+ after do
736
823
  Object.send :remove_const, 'Property' if defined?(::Property)
737
824
  Object.send :remove_const, 'Thing' if defined?(::Thing)
738
825
  end
739
826
 
740
827
  context "=> destroy" do
741
- setup do
828
+ before do
742
829
  Property.key :thing_id, ObjectId
743
830
  Property.belongs_to :thing, :dependent => :destroy
744
831
  Thing.many :properties, :dependent => :destroy
@@ -752,7 +839,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
752
839
  @thing.properties << @property3
753
840
  end
754
841
 
755
- should "should destroy the associated documents" do
842
+ it "should should destroy the associated documents" do
756
843
  @thing.properties.count.should == 3
757
844
  @thing.destroy
758
845
  @thing.properties.count.should == 0
@@ -761,7 +848,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
761
848
  end
762
849
 
763
850
  context "=> delete_all" do
764
- setup do
851
+ before do
765
852
  Property.key :thing_id, ObjectId
766
853
  Property.belongs_to :thing
767
854
  Thing.has_many :properties, :dependent => :delete_all
@@ -775,7 +862,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
775
862
  @thing.properties << @property3
776
863
  end
777
864
 
778
- should "should delete associated documents" do
865
+ it "should should delete associated documents" do
779
866
  @thing.properties.count.should == 3
780
867
  @thing.destroy
781
868
  @thing.properties.count.should == 0
@@ -784,7 +871,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
784
871
  end
785
872
 
786
873
  context "=> nullify" do
787
- setup do
874
+ before do
788
875
  Property.key :thing_id, ObjectId
789
876
  Property.belongs_to :thing
790
877
  Thing.has_many :properties, :dependent => :nullify
@@ -798,16 +885,16 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
798
885
  @thing.properties << @property3
799
886
  end
800
887
 
801
- should "should nullify relationship but not destroy associated documents" do
888
+ it "should should nullify relationship but not destroy associated documents" do
802
889
  @thing.properties.count.should == 3
803
890
  @thing.destroy
804
891
  @thing.properties.count.should == 0
805
892
  Property.count.should == 3
806
893
  end
807
894
  end
808
-
895
+
809
896
  context "unspecified" do
810
- setup do
897
+ before do
811
898
  Property.key :thing_id, ObjectId
812
899
  Property.belongs_to :thing
813
900
  Thing.has_many :properties, :dependent => :nullify
@@ -821,7 +908,7 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
821
908
  @thing.properties << @property3
822
909
  end
823
910
 
824
- should "should nullify relationship but not destroy associated documents" do
911
+ it "should should nullify relationship but not destroy associated documents" do
825
912
  @thing.properties.count.should == 3
826
913
  @thing.destroy
827
914
  @thing.properties.count.should == 0
@@ -831,14 +918,14 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
831
918
  end
832
919
 
833
920
  context "namespaced foreign keys" do
834
- setup do
921
+ before do
835
922
  News::Paper.many :articles, :class_name => 'News::Article'
836
923
  News::Article.belongs_to :paper, :class_name => 'News::Paper'
837
924
 
838
925
  @paper = News::Paper.create
839
926
  end
840
927
 
841
- should "properly infer the foreign key" do
928
+ it "should properly infer the foreign key" do
842
929
  article = @paper.articles.create
843
930
  article.should respond_to(:paper_id)
844
931
  article.paper_id.should == @paper.id
@@ -846,19 +933,19 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
846
933
  end
847
934
 
848
935
  context "criteria" do
849
- setup do
936
+ before do
850
937
  News::Paper.many :articles, :class_name => 'News::Article'
851
938
  News::Article.belongs_to :paper, :class_name => 'News::Paper'
852
939
 
853
940
  @paper = News::Paper.create
854
941
  end
855
942
 
856
- should "should find associated instances by an object ID" do
943
+ it "should should find associated instances by an object ID" do
857
944
  article = News::Article.create(:paper_id => @paper.id)
858
945
  @paper.articles.should include(article)
859
946
  end
860
947
 
861
- should "should find associated instances by a string" do
948
+ it "should should find associated instances by a string" do
862
949
  article = News::Article.create(:paper_id => @paper.id.to_s)
863
950
  @paper.articles.should include(article)
864
951
  end