mongo_mapper 0.12.0 → 0.13.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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