datamapper 0.3.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. data/History.txt +0 -0
  2. data/Manifest.txt +5 -0
  3. data/README.txt +11 -0
  4. data/Rakefile +70 -0
  5. data/lib/datamapper.rb +8 -0
  6. metadata +152 -319
  7. data/CHANGELOG +0 -145
  8. data/FAQ +0 -96
  9. data/MIT-LICENSE +0 -22
  10. data/QUICKLINKS +0 -12
  11. data/README +0 -105
  12. data/environment.rb +0 -62
  13. data/example.rb +0 -156
  14. data/lib/data_mapper.rb +0 -88
  15. data/lib/data_mapper/adapters/abstract_adapter.rb +0 -43
  16. data/lib/data_mapper/adapters/data_object_adapter.rb +0 -480
  17. data/lib/data_mapper/adapters/mysql_adapter.rb +0 -72
  18. data/lib/data_mapper/adapters/postgresql_adapter.rb +0 -258
  19. data/lib/data_mapper/adapters/sql/coersion.rb +0 -134
  20. data/lib/data_mapper/adapters/sql/commands/load_command.rb +0 -545
  21. data/lib/data_mapper/adapters/sql/mappings/associations_set.rb +0 -34
  22. data/lib/data_mapper/adapters/sql/mappings/column.rb +0 -279
  23. data/lib/data_mapper/adapters/sql/mappings/conditions.rb +0 -172
  24. data/lib/data_mapper/adapters/sql/mappings/schema.rb +0 -60
  25. data/lib/data_mapper/adapters/sql/mappings/table.rb +0 -459
  26. data/lib/data_mapper/adapters/sql/quoting.rb +0 -24
  27. data/lib/data_mapper/adapters/sqlite3_adapter.rb +0 -159
  28. data/lib/data_mapper/associations.rb +0 -106
  29. data/lib/data_mapper/associations/belongs_to_association.rb +0 -160
  30. data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +0 -437
  31. data/lib/data_mapper/associations/has_many_association.rb +0 -283
  32. data/lib/data_mapper/associations/has_n_association.rb +0 -143
  33. data/lib/data_mapper/associations/reference.rb +0 -47
  34. data/lib/data_mapper/attributes.rb +0 -73
  35. data/lib/data_mapper/auto_migrations.rb +0 -36
  36. data/lib/data_mapper/base.rb +0 -17
  37. data/lib/data_mapper/callbacks.rb +0 -107
  38. data/lib/data_mapper/context.rb +0 -112
  39. data/lib/data_mapper/database.rb +0 -234
  40. data/lib/data_mapper/dependency_queue.rb +0 -28
  41. data/lib/data_mapper/embedded_value.rb +0 -145
  42. data/lib/data_mapper/identity_map.rb +0 -47
  43. data/lib/data_mapper/is/tree.rb +0 -121
  44. data/lib/data_mapper/migration.rb +0 -155
  45. data/lib/data_mapper/persistence.rb +0 -852
  46. data/lib/data_mapper/property.rb +0 -310
  47. data/lib/data_mapper/query.rb +0 -164
  48. data/lib/data_mapper/support/blank.rb +0 -35
  49. data/lib/data_mapper/support/connection_pool.rb +0 -117
  50. data/lib/data_mapper/support/enumerable.rb +0 -35
  51. data/lib/data_mapper/support/errors.rb +0 -16
  52. data/lib/data_mapper/support/inflector.rb +0 -265
  53. data/lib/data_mapper/support/object.rb +0 -54
  54. data/lib/data_mapper/support/serialization.rb +0 -96
  55. data/lib/data_mapper/support/silence.rb +0 -10
  56. data/lib/data_mapper/support/string.rb +0 -72
  57. data/lib/data_mapper/support/struct.rb +0 -7
  58. data/lib/data_mapper/support/symbol.rb +0 -82
  59. data/lib/data_mapper/support/typed_set.rb +0 -65
  60. data/lib/data_mapper/types/base.rb +0 -44
  61. data/lib/data_mapper/types/string.rb +0 -34
  62. data/lib/data_mapper/validatable_extensions/errors.rb +0 -12
  63. data/lib/data_mapper/validatable_extensions/macros.rb +0 -7
  64. data/lib/data_mapper/validatable_extensions/validatable_instance_methods.rb +0 -62
  65. data/lib/data_mapper/validatable_extensions/validation_base.rb +0 -18
  66. data/lib/data_mapper/validatable_extensions/validations/formats/email.rb +0 -43
  67. data/lib/data_mapper/validatable_extensions/validations/validates_acceptance_of.rb +0 -7
  68. data/lib/data_mapper/validatable_extensions/validations/validates_confirmation_of.rb +0 -7
  69. data/lib/data_mapper/validatable_extensions/validations/validates_each.rb +0 -7
  70. data/lib/data_mapper/validatable_extensions/validations/validates_format_of.rb +0 -28
  71. data/lib/data_mapper/validatable_extensions/validations/validates_length_of.rb +0 -15
  72. data/lib/data_mapper/validatable_extensions/validations/validates_numericality_of.rb +0 -7
  73. data/lib/data_mapper/validatable_extensions/validations/validates_presence_of.rb +0 -7
  74. data/lib/data_mapper/validatable_extensions/validations/validates_true_for.rb +0 -7
  75. data/lib/data_mapper/validatable_extensions/validations/validates_uniqueness_of.rb +0 -40
  76. data/lib/data_mapper/validations.rb +0 -20
  77. data/lib/data_mapper/validations/number_validator.rb +0 -40
  78. data/lib/data_mapper/validations/string_validator.rb +0 -20
  79. data/lib/data_mapper/validations/validator.rb +0 -13
  80. data/performance.rb +0 -307
  81. data/plugins/can_has_sphinx/LICENSE +0 -23
  82. data/plugins/can_has_sphinx/README +0 -4
  83. data/plugins/can_has_sphinx/REVISION +0 -1
  84. data/plugins/can_has_sphinx/Rakefile +0 -22
  85. data/plugins/can_has_sphinx/init.rb +0 -1
  86. data/plugins/can_has_sphinx/install.rb +0 -1
  87. data/plugins/can_has_sphinx/lib/acts_as_sphinx.rb +0 -123
  88. data/plugins/can_has_sphinx/lib/sphinx.rb +0 -460
  89. data/plugins/can_has_sphinx/scripts/sphinx.sh +0 -47
  90. data/plugins/can_has_sphinx/tasks/acts_as_sphinx_tasks.rake +0 -41
  91. data/profile_data_mapper.rb +0 -40
  92. data/rakefile.rb +0 -159
  93. data/spec/acts_as_tree_spec.rb +0 -67
  94. data/spec/adapters/data_object_adapter_spec.rb +0 -31
  95. data/spec/associations/belongs_to_association_spec.rb +0 -98
  96. data/spec/associations/has_and_belongs_to_many_association_spec.rb +0 -377
  97. data/spec/associations/has_many_association_spec.rb +0 -337
  98. data/spec/attributes_spec.rb +0 -52
  99. data/spec/auto_migrations_spec.rb +0 -101
  100. data/spec/callbacks_spec.rb +0 -186
  101. data/spec/can_has_sphinx.rb +0 -5
  102. data/spec/coersion_spec.rb +0 -41
  103. data/spec/column_spec.rb +0 -114
  104. data/spec/count_command_spec.rb +0 -45
  105. data/spec/database_spec.rb +0 -18
  106. data/spec/dataobjects_spec.rb +0 -27
  107. data/spec/delete_command_spec.rb +0 -11
  108. data/spec/dependency_spec.rb +0 -29
  109. data/spec/embedded_value_spec.rb +0 -161
  110. data/spec/fixtures/animals.yaml +0 -33
  111. data/spec/fixtures/animals_exhibits.yaml +0 -2
  112. data/spec/fixtures/careers.yaml +0 -5
  113. data/spec/fixtures/comments.yaml +0 -1
  114. data/spec/fixtures/exhibits.yaml +0 -90
  115. data/spec/fixtures/fruit.yaml +0 -6
  116. data/spec/fixtures/people.yaml +0 -37
  117. data/spec/fixtures/posts.yaml +0 -3
  118. data/spec/fixtures/projects.yaml +0 -13
  119. data/spec/fixtures/sections.yaml +0 -5
  120. data/spec/fixtures/serializers.yaml +0 -6
  121. data/spec/fixtures/tasks.yaml +0 -6
  122. data/spec/fixtures/tasks_tasks.yaml +0 -2
  123. data/spec/fixtures/tomatoes.yaml +0 -1
  124. data/spec/fixtures/users.yaml +0 -1
  125. data/spec/fixtures/zoos.yaml +0 -24
  126. data/spec/is_a_tree_spec.rb +0 -149
  127. data/spec/legacy_spec.rb +0 -16
  128. data/spec/load_command_spec.rb +0 -322
  129. data/spec/magic_columns_spec.rb +0 -26
  130. data/spec/migration_spec.rb +0 -267
  131. data/spec/mock_adapter.rb +0 -20
  132. data/spec/models/animal.rb +0 -12
  133. data/spec/models/candidate.rb +0 -8
  134. data/spec/models/career.rb +0 -7
  135. data/spec/models/chain.rb +0 -8
  136. data/spec/models/comment.rb +0 -6
  137. data/spec/models/exhibit.rb +0 -14
  138. data/spec/models/fence.rb +0 -7
  139. data/spec/models/fruit.rb +0 -8
  140. data/spec/models/job.rb +0 -8
  141. data/spec/models/person.rb +0 -30
  142. data/spec/models/post.rb +0 -14
  143. data/spec/models/project.rb +0 -41
  144. data/spec/models/sales_person.rb +0 -5
  145. data/spec/models/section.rb +0 -8
  146. data/spec/models/serializer.rb +0 -5
  147. data/spec/models/task.rb +0 -9
  148. data/spec/models/tomato.rb +0 -27
  149. data/spec/models/user.rb +0 -12
  150. data/spec/models/zoo.rb +0 -13
  151. data/spec/natural_key_spec.rb +0 -36
  152. data/spec/paranoia_spec.rb +0 -38
  153. data/spec/persistence_spec.rb +0 -479
  154. data/spec/postgres_spec.rb +0 -96
  155. data/spec/property_spec.rb +0 -151
  156. data/spec/query_spec.rb +0 -77
  157. data/spec/save_command_spec.rb +0 -94
  158. data/spec/schema_spec.rb +0 -8
  159. data/spec/serialize_spec.rb +0 -19
  160. data/spec/single_table_inheritance_spec.rb +0 -43
  161. data/spec/spec_helper.rb +0 -45
  162. data/spec/support/blank_spec.rb +0 -8
  163. data/spec/support/inflector_spec.rb +0 -41
  164. data/spec/support/object_spec.rb +0 -9
  165. data/spec/support/serialization_spec.rb +0 -61
  166. data/spec/support/silence_spec.rb +0 -15
  167. data/spec/support/string_spec.rb +0 -7
  168. data/spec/support/struct_spec.rb +0 -12
  169. data/spec/support/typed_set_spec.rb +0 -66
  170. data/spec/symbolic_operators_spec.rb +0 -27
  171. data/spec/table_spec.rb +0 -79
  172. data/spec/types/string.rb +0 -81
  173. data/spec/validates_confirmation_of_spec.rb +0 -55
  174. data/spec/validates_format_of_spec.rb +0 -78
  175. data/spec/validates_length_of_spec.rb +0 -117
  176. data/spec/validates_uniqueness_of_spec.rb +0 -92
  177. data/spec/validations/number_validator.rb +0 -59
  178. data/spec/validations/string_validator.rb +0 -14
  179. data/spec/validations_spec.rb +0 -141
  180. data/tasks/fixtures.rb +0 -53
@@ -1,377 +0,0 @@
1
- require File.dirname(__FILE__) + "/../spec_helper"
2
-
3
- describe DataMapper::Associations::HasAndBelongsToManyAssociation do
4
-
5
- before(:all) do
6
- fixtures(:animals)
7
- fixtures(:exhibits)
8
- end
9
-
10
- before(:each) do
11
- @amazonia = Exhibit.first :name => 'Amazonia'
12
- end
13
-
14
- it "should generate the SQL for a join statement" do
15
- animals_association = database(:mock).schema[Exhibit].associations.find { |a| a.name == :animals }
16
-
17
- animals_association.to_sql.should == <<-EOS.compress_lines
18
- JOIN `animals_exhibits` ON `animals_exhibits`.`exhibit_id` = `exhibits`.`id`
19
- JOIN `animals` ON `animals`.`id` = `animals_exhibits`.`animal_id`
20
- EOS
21
- end
22
-
23
- it "should load associations" do
24
- database do
25
- froggy = Animal.first(:name => 'Frog')
26
- froggy.exhibits.size.should == 1
27
- froggy.exhibits.first.should == Exhibit.first(:name => 'Amazonia')
28
- end
29
- end
30
-
31
- it 'has an animals association' do
32
- [@amazonia, Exhibit.new].each do |exhibit|
33
- exhibit.animals.class.should == DataMapper::Associations::HasAndBelongsToManyAssociation::Set
34
- end
35
- end
36
-
37
- it 'has many animals' do
38
- @amazonia.animals.size.should == 1
39
- end
40
-
41
- it 'should load associations magically' do
42
- Exhibit.all.each do |exhibit|
43
- exhibit.animals.each do |animal|
44
- animal.exhibits.should include(exhibit)
45
- end
46
- end
47
- end
48
-
49
- it 'should allow association of additional objects' do
50
- buffalo = Animal.create(:name => "Buffalo")
51
- @amazonia.animals << buffalo
52
- @amazonia.animals.size.should == 2
53
- @amazonia.save!
54
- @amazonia.reload!
55
- @amazonia.animals.should have(2).entries
56
-
57
- other = Exhibit[@amazonia.id]
58
- other.animals.should have(2).entries
59
-
60
- @amazonia.animals.delete(buffalo).should_not be_nil
61
- @amazonia.animals.should be_dirty
62
- @amazonia.save!
63
-
64
- other = Exhibit[@amazonia.id]
65
- other.animals.should have(1).entries
66
- end
67
-
68
- it "should allow association of additional objects (CLEAN)" do
69
- # pending "http://wm.lighthouseapp.com/projects/4819-datamapper/tickets/92"
70
-
71
- ted = Exhibit.create(:name => 'Ted')
72
- ted.should_not be_dirty
73
-
74
- zest = Animal.create(:name => 'Zest')
75
- zest.should_not be_dirty
76
-
77
- ted.animals << zest
78
- ted.should be_dirty
79
- ted.save
80
-
81
- ted.reload!
82
- ted.should_not be_dirty
83
- ted.should have(1).animals
84
-
85
- ted2 = Exhibit[ted.key]
86
- ted2.should_not be_dirty
87
- ted2.should have(1).animals
88
-
89
- ted2.destroy!
90
- zest.destroy!
91
- end
92
-
93
- it 'should allow you to fill and clear an association' do
94
- marcy = Exhibit.create(:name => 'marcy')
95
-
96
- Animal.all.each do |animal|
97
- marcy.animals << animal
98
- end
99
-
100
- marcy.save.should eql(true)
101
- marcy.should have(Animal.count).animals
102
-
103
- marcy.animals.clear
104
- marcy.should have(0).animals
105
-
106
- marcy.save.should eql(true)
107
-
108
- marcys_stand_in = Exhibit[marcy.id]
109
- marcys_stand_in.should have(0).animals
110
-
111
- marcy.destroy!
112
- end
113
-
114
- it 'should allow you to delete a specific association member' do
115
- walter = Exhibit.create(:name => 'walter')
116
-
117
- Animal.all.each do |animal|
118
- walter.animals << animal
119
- end
120
-
121
- walter.save.should eql(true)
122
- walter.should have(Animal.count).animals
123
-
124
- delete_me = walter.animals.first
125
- walter.animals.delete(delete_me).should eql(delete_me)
126
- walter.animals.delete(delete_me).should eql(nil)
127
-
128
- walter.should have(Animal.count - 1).animals
129
- walter.save.should eql(true)
130
-
131
- walters_stand_in = Exhibit[walter.id]
132
- walters_stand_in.animals.size.should eql(walter.animals.size)
133
-
134
- walter.destroy!
135
- end
136
-
137
- it "should allow updates to associations using association_keys=" do
138
- # pending "http://wm.lighthouseapp.com/projects/4819-datamapper/tickets/109-associations-should-support-association_keys-methods"
139
- database(:default) do
140
- meerkat = Animal.create(:name => "Meerkat")
141
- dunes = Exhibit.create(:name => "Dunes")
142
-
143
-
144
- dunes.animals.should be_empty
145
- dunes.send(:animals_keys=, meerkat.key)
146
- dunes.save.should be_true
147
-
148
- dunes.should have(1).animals
149
- dunes.animals.should include(meerkat)
150
-
151
- dunes.reload!
152
- dunes.should have(1).animals
153
-
154
- dunes.destroy!
155
- meerkat.destroy!
156
- end
157
- end
158
-
159
- it "should allow you to 'append' multiple associated objects at once" do
160
- dunes = Exhibit.create(:name => 'Dunes')
161
-
162
- lambda { dunes.animals << @amazonia.animals }.should_not raise_error(ArgumentError)
163
- lambda { dunes.animals << Animal.all }.should_not raise_error(ArgumentError)
164
-
165
- dunes.destroy!
166
- end
167
-
168
- it "should raise an error when attempting to associate an object not of the correct type (assuming added model doesn't inherit from the correct type)" do
169
- # pending("see: http://wm.lighthouseapp.com/projects/4819-datamapper/tickets/91")
170
- @amazonia.animals.should_not be_empty
171
- chuck = Person.new(:name => "Chuck")
172
-
173
- ## InvalidRecord isn't the error we should use here....needs to be changed
174
- lambda { @amazonia.animals << chuck }.should raise_error(ArgumentError)
175
-
176
- end
177
-
178
- it "should associate an object which has inherited from the correct type into an association" do
179
- # pending("see: http://wm.lighthouseapp.com/projects/4819-datamapper/tickets/91")
180
- programmer = Career.first(:name => 'Programmer')
181
- programmer.followers.should_not be_empty
182
-
183
- sales_person = SalesPerson.new(:name => 'Chuck')
184
-
185
- lambda { programmer.followers << sales_person }.should_not raise_error(ArgumentError)
186
-
187
- end
188
-
189
- it "should correctly handle dependent associations ~cascading destroy~ (:destroy)" do
190
- class Chain
191
- has_and_belongs_to_many :chains, :dependent => :destroy
192
- end
193
- Chain.auto_migrate!
194
-
195
- chain = Chain.create(:name => "1")
196
- chain.chains << Chain.create(:name => "2")
197
- chain.chains << Chain.create(:name => "3")
198
- chain.chains << Chain.create(:name => "4")
199
- chain.save
200
- chain4 = Chain.create(:name => "5")
201
- chain.chains.first.chains << chain4
202
- chain.chains.first.save
203
- chain4.chains << Chain.first(:name => "3")
204
- chain4.save
205
- chain = Chain[chain.key]
206
-
207
- chain.destroy!
208
- Chain.first(:name => "2").should be_nil
209
- Chain.first(:name => "3").should be_nil
210
- Chain.first(:name => "4").should be_nil
211
- Chain.first(:name => "5").should be_nil
212
-
213
- Chain.delete_all
214
- end
215
-
216
- it "should correctly handle dependent associations ~no cascade~ (:delete)" do
217
- class Chain
218
- has_and_belongs_to_many :chains, :dependent => :delete
219
- end
220
- Chain.auto_migrate!
221
-
222
- chain = Chain.create(:name => "1")
223
- chain.chains << Chain.create(:name => "2")
224
- chain.chains << Chain.create(:name => "3")
225
- chain.chains << Chain.create(:name => "4")
226
- chain.save
227
- chain5 = Chain.create(:name => "5")
228
- chain.chains.first.chains << chain5
229
- chain.chains.first.save
230
- chain = Chain[chain.key]
231
-
232
- chain.destroy!
233
- Chain.first(:name => "2").should be_nil
234
- Chain.first(:name => "3").should be_nil
235
- Chain.first(:name => "4").should be_nil
236
- Chain.first(:name => "5").should_not be_nil
237
-
238
- Chain.delete_all
239
- end
240
-
241
- it "should correctly handle dependent associations (:protect)" do
242
- class Chain
243
- has_and_belongs_to_many :chains, :dependent => :protect
244
- end
245
- Chain.auto_migrate!
246
-
247
- chain = Chain.create(:name => "1")
248
- chain.chains << Chain.create(:name => "2")
249
- chain.chains << Chain.create(:name => "3")
250
- chain.chains << Chain.create(:name => "4")
251
- chain.save
252
- chain4 = Chain.create(:name => "5")
253
- chain.chains.first.chains << chain4
254
- chain.chains.first.save
255
- chain = Chain[chain.key]
256
-
257
- lambda { chain.destroy! }.should raise_error(DataMapper::AssociationProtectedError)
258
-
259
- Chain.delete_all
260
- end
261
-
262
- it "should throw AssociationProtectedError even when @items have not been loaded yet (:protect)" do
263
- class Chain
264
- has_and_belongs_to_many :chains, :dependent => :protect
265
- end
266
- Chain.auto_migrate!
267
-
268
- chain = Chain.create(:name => "1")
269
- chain.chains << Chain.create(:name => "2")
270
- chain.chains << Chain.create(:name => "3")
271
- chain.chains << Chain.create(:name => "4")
272
- chain.save
273
- chain4 = Chain.create(:name => "5")
274
- chain.chains.first.chains << chain4
275
- chain.chains.first.save
276
- chain = Chain[chain.key]
277
-
278
- lambda { chain.destroy! }.should raise_error(DataMapper::AssociationProtectedError)
279
-
280
- Chain.delete_all
281
- end
282
-
283
- it "should correctly handle dependent associations (:nullify)" do
284
- class Chain
285
- has_and_belongs_to_many :chains, :dependent => :nullify
286
- end
287
- Chain.auto_migrate!
288
-
289
- chain = Chain.create(:name => "1")
290
- chain.chains << Chain.create(:name => "2")
291
- chain.chains << Chain.create(:name => "3")
292
- chain.chains << Chain.create(:name => "4")
293
- chain.save
294
- chain4 = Chain.create(:name => "5")
295
- chain.chains.first.chains << chain4
296
- chain.chains.first.save
297
- chain = Chain[chain.key]
298
-
299
- chain.destroy!
300
- Chain.first(:name => "2").should_not be_nil
301
- Chain.first(:name => "3").should_not be_nil
302
- Chain.first(:name => "4").should_not be_nil
303
-
304
- Chain.delete_all
305
- end
306
-
307
- end
308
-
309
- describe DataMapper::Associations::HasAndBelongsToManyAssociation, "self-referential relationship" do
310
-
311
- before(:all) do
312
- fixtures(:tasks)
313
- end
314
-
315
- before(:each) do
316
- @task_relax = Task.first(:name => "task_relax")
317
- end
318
-
319
- it "should allow a self-referential habtm by creating a related_* column for the right foreign key" do
320
- tasks_assocation = database(:mock).schema[Task].associations.find { |a| a.name == :tasks }
321
-
322
- tasks_assocation.right_foreign_key.name.should == :related_task_id
323
- end
324
-
325
- it "should load the self-referential association" do
326
- database do
327
- task_relax = Task.first(:name => "task_relax")
328
- task_relax.tasks.size.should == 1
329
- task_relax.tasks.first.should == Task.first(:name => "task_drink_heartily")
330
- end
331
- end
332
-
333
- it "should allow a mirrored relationship between two rows (no infinite recursion)" do
334
- task_vacation = Task.first(:name => "task_vacation")
335
-
336
- @task_relax.tasks << task_vacation
337
- @task_relax.save
338
-
339
- task_vacation.tasks << @task_relax
340
- task_vacation.save
341
-
342
- @task_relax.reload!
343
- @task_relax.tasks.should include(task_vacation)
344
-
345
- task_vacation.reload!
346
- task_vacation.tasks.should include(@task_relax)
347
- end
348
-
349
- end
350
-
351
- describe DataMapper::Associations::HasAndBelongsToManyAssociation, "compatibility with belongs_to" do
352
-
353
- it "should be able to save a job without interferring with applications" do
354
- programmer = Job.create(:name => 'Programmer')
355
- manager = Job.create(:name => 'Manager')
356
-
357
- bob = Candidate.create(:name => 'Bob')
358
-
359
- bob.applications << programmer << manager
360
-
361
- bob.applications.should have(2).entries
362
- bob.job.should be_nil
363
-
364
- bob.job = programmer
365
-
366
- bob.should be_dirty
367
- bob.applications.should be_dirty
368
- bob.job.should_not be_dirty # Because no property is changed on the has_many side.
369
-
370
- bob.save!.should == true
371
-
372
- impostor = Candidate[bob.id]
373
-
374
- impostor.applications.should have(2).entries
375
- impostor.job.should == programmer
376
- end
377
- end
@@ -1,337 +0,0 @@
1
- require File.dirname(__FILE__) + "/../spec_helper"
2
-
3
- describe DataMapper::Associations::HasManyAssociation do
4
-
5
- before(:all) do
6
- fixtures(:zoos)
7
- fixtures(:exhibits)
8
- fixtures(:fruit)
9
- fixtures(:animals)
10
- end
11
-
12
- after(:all) do
13
- fixtures(:fruit)
14
- fixtures(:animals)
15
- end
16
-
17
- before(:each) do
18
- @zoo = Zoo.new(:name => "ZOO")
19
- @zoo.save
20
- end
21
-
22
- after(:each) do
23
- @zoo.destroy!
24
- Chain.delete_all
25
- Fence.delete_all
26
- end
27
-
28
- it "should provide a shallow_append method that doesn't impact the complementary association" do
29
- project = Project.new
30
- section = Section.new
31
- project.sections.shallow_append(section)
32
- section.project.should be_nil
33
- end
34
-
35
- it "assignment should not force associated items to load" do
36
- dallas = Zoo.first(:name => 'Dallas')
37
- Exhibit.new(:name => 'Weasel World!', :zoo => dallas)
38
- dallas.exhibits.instance_variable_get('@items').should be_nil
39
- end
40
-
41
- it "should use << for assignment" do
42
- bob_land = Zoo.new(:name => 'Bob Land!')
43
- bob_land.exhibits << Exhibit.new(:name => 'Cow')
44
- bob_land.exhibits.should have(1).entries
45
- end
46
-
47
- it "should return an empty Enumerable for new objects" do
48
- project = Project.new
49
- project.sections.should be_a_kind_of(Enumerable)
50
- project.sections.should be_empty
51
- project.sections.should be_nil
52
- end
53
-
54
- it "should display correctly when inspected" do
55
- Zoo.first(:name => 'Dallas').exhibits.inspect.should match(/\#\<Exhibit\:0x.{7}/)
56
- end
57
-
58
- it 'should lazily-load the association when Enumerable methods are called' do
59
- database do |db|
60
- san_diego = Zoo.first(:name => 'San Diego')
61
- san_diego.exhibits.size.should == 2
62
- san_diego.exhibits.should include(Exhibit.first(:name => 'Monkey Mayhem'))
63
- end
64
- end
65
-
66
- it 'should eager-load associations for an entire set' do
67
- database do
68
- zoos = Zoo.all
69
- zoos.each do |zoo|
70
- zoo.exhibits.each do |exhibit|
71
- exhibit.zoo.should == zoo
72
- end
73
- end
74
- end
75
- end
76
-
77
- it "should be dirty even when clean objects are associated" do
78
- zoo = Zoo.first(:name => 'New York')
79
- zoo.exhibits << Exhibit.first
80
- zoo.should be_dirty
81
- end
82
-
83
- it "should proxy associations on the associated type" do
84
- Zoo.first(:name => 'Miami').exhibits.animals.size.should == 1
85
- end
86
-
87
- it "should have a valid zoo setup for testing" do
88
- @zoo.should be_valid
89
- @zoo.should_not be_a_new_record
90
- @zoo.id.should_not be_nil
91
- end
92
-
93
- it "should generate the SQL for a join statement" do
94
- exhibits_association = database(:mock).schema[Zoo].associations.find { |a| a.name == :exhibits }
95
-
96
- exhibits_association.to_sql.should == <<-EOS.compress_lines
97
- JOIN `exhibits` ON `exhibits`.`zoo_id` = `zoos`.`id`
98
- EOS
99
- end
100
-
101
- it "should add an item to an association" do
102
- bear = Exhibit.new( :name => "Bear")
103
- @zoo.exhibits << bear
104
- @zoo.exhibits.should include(bear)
105
- end
106
-
107
- it "should build a new item" do
108
- bear = @zoo.exhibits.build( :name => "Bear" )
109
- bear.should be_kind_of(Exhibit)
110
- @zoo.exhibits.should include(bear)
111
- end
112
-
113
- it "should not save the item when building" do
114
- bear = @zoo.exhibits.build( :name => "Bear" )
115
- bear.should be_new_record
116
- end
117
-
118
- it "should create a new item" do
119
- bear = @zoo.exhibits.create( :name => "Bear" )
120
- bear.should be_kind_of(Exhibit)
121
- @zoo.exhibits.should include(bear)
122
- end
123
-
124
- it "should save the item when creating" do
125
- bear = @zoo.exhibits.create( :name => "Bear" )
126
- bear.should_not be_new_record
127
- end
128
-
129
- it "should set the association to a saved target when added with <<" do
130
- pirahna = Exhibit.new(:name => "Pirahna")
131
- pirahna.zoo_id.should be_nil
132
-
133
- @zoo.exhibits << pirahna
134
- pirahna.zoo.should == @zoo
135
- end
136
-
137
- it "should set the association to a non-saved target when added with <<" do
138
- zoo = Zoo.new(:name => "My Zoo")
139
- kangaroo = Exhibit.new(:name => "Kangaroo")
140
- zoo.exhibits << kangaroo
141
- kangaroo.zoo.should == zoo
142
- end
143
-
144
- it "should set the id of the exhibit when the associated zoo is saved" do
145
- snake = Exhibit.new(:name => "Snake")
146
- @zoo.exhibits << snake
147
- @zoo.save
148
- @zoo.id.should == snake.zoo_id
149
- end
150
-
151
- it "should update the foreign_key of already saved exhibits with a new zoo on zoo creation" do
152
- zoo = Zoo.new(:name => "My Zoo")
153
- snake = Exhibit.create(:name => "Snake")
154
- tiger = Exhibit.create(:name => "Tiger")
155
- zoo.exhibits << snake << tiger
156
- zoo.save
157
- snake.zoo_id.should == zoo.key
158
- tiger.zoo_id.should == zoo.key
159
- end
160
-
161
- it "should set the id of an already saved exibit if it's added to a different zoo" do
162
- beaver = Exhibit.new(:name => "Beaver")
163
- beaver.save
164
- beaver.should_not be_a_new_record
165
- @zoo.exhibits << beaver
166
- @zoo.save
167
- beaver.zoo.should == @zoo
168
- beaver.zoo_id.should == @zoo.id
169
- end
170
-
171
- it "should set the size of the assocation" do
172
- @zoo.exhibits << Exhibit.new(:name => "anonymous")
173
- @zoo.exhibits.size.should == 1
174
- end
175
-
176
- it "should give the association when an inspect is done on it" do
177
- whale = Exhibit.new(:name => "Whale")
178
- @zoo.exhibits << whale
179
- @zoo.exhibits.should_not == "nil"
180
- @zoo.exhibits.inspect.should_not be_nil
181
- end
182
-
183
- it "should generate the SQL for a join statement" do
184
- fruit_association = database(:mock).schema[Animal].associations.find { |a| a.name == :favourite_fruit }
185
-
186
- fruit_association.to_sql.should == <<-EOS.compress_lines
187
- JOIN `fruit` ON `fruit`.`devourer_id` = `animals`.`id`
188
- EOS
189
- end
190
-
191
- it "is assigned a devourer_id" do
192
- bob = Animal.new(:name => 'bob')
193
- fruit = Fruit.first
194
- bob.favourite_fruit = fruit
195
-
196
- bob.save
197
-
198
- bob.reload!
199
- fruit.devourer_id.should eql(bob.id)
200
- bob.favourite_fruit.should == fruit
201
-
202
- fruit.reload!
203
- fruit.devourer_of_souls.should == bob
204
- end
205
-
206
- it "Should handle setting complementary associations" do
207
- # pending "http://wm.lighthouseapp.com/projects/4819/tickets/84-belongs_to-associations-not-working-for-me"
208
- u1 = User.create(:name => "u1", :email => "test@email.com")
209
- u1.comments.should be_empty
210
-
211
- c1 = Comment.create(:comment => "c", :author => u1)
212
-
213
- u1.comments.should_not be_empty
214
- u1.comments.should include(c1)
215
-
216
- u1.reload!
217
- u1.comments.should_not be_empty
218
- u1.comments.should include(c1)
219
- end
220
-
221
- it "should allow updates to associations using association_keys=" do
222
- # pending "http://wm.lighthouseapp.com/projects/4819-datamapper/tickets/109-associations-should-support-association_keys-methods"
223
- database(:default) do
224
- london = Zoo.create(:name => "London")
225
- dunes = Exhibit.create(:name => "Dunes")
226
-
227
- london.exhibits.should be_empty
228
- london.send(:exhibits_keys=, dunes.key)
229
- london.save!.should be_true
230
-
231
- london.should have(1).exhibits
232
- london.exhibits.should include(dunes)
233
-
234
- london.reload!
235
- london.should have(1).exhibits
236
-
237
- london.destroy!
238
- dunes.destroy!
239
- end
240
- end
241
-
242
- it "should correctly handle dependent associations (:destroy)" do
243
- class Fence
244
- has_many :chains, :dependent => :destroy
245
- end
246
- #Chain.should_receive(:destroy!).and_return(true)
247
-
248
- fence = Fence.create(:name => "Great Wall of China")
249
- fence.chains << Chain.create(:name => "1")
250
- fence.chains << Chain.create(:name => "2")
251
- fence.chains << Chain.create(:name => "3")
252
- fence.save
253
- chain = Chain.create(:name => "4")
254
- fence = Fence[fence.key]
255
-
256
- fence.destroy!
257
- Chain.first(:name => "1").should be_nil
258
- Chain.first(:name => "2").should be_nil
259
- Chain.first(:name => "3").should be_nil
260
- Chain.first(:name => "4").should_not be_nil
261
- end
262
-
263
- it "should correctly handle dependent associations (:delete)" do
264
- class Fence
265
- has_many :chains, :dependent => :delete
266
- end
267
-
268
- fence = Fence.create(:name => "Great Wall of China")
269
- fence.chains << Chain.create(:name => "1")
270
- fence.chains << Chain.create(:name => "2")
271
- fence.chains << Chain.create(:name => "3")
272
- fence.save
273
- chain = Chain.create(:name => "4")
274
- fence = Fence[fence.key]
275
-
276
- fence.destroy!
277
- Chain.first(:name => "1").should be_nil
278
- Chain.first(:name => "2").should be_nil
279
- Chain.first(:name => "3").should be_nil
280
- Chain.first(:name => "4").should_not be_nil
281
- end
282
-
283
- it "should correctly handle dependent associations (:protect)" do
284
- class Fence
285
- has_many :chains, :dependent => :protect
286
- end
287
-
288
- fence = Fence.create(:name => "Great Wall of China")
289
- fence.chains << Chain.create(:name => "1")
290
- fence.chains << Chain.create(:name => "2")
291
- fence.chains << Chain.create(:name => "3")
292
- fence.save
293
- chain = Chain.create(:name => "4")
294
- fence = Fence[fence.key]
295
-
296
- lambda { fence.destroy! }.should raise_error(DataMapper::AssociationProtectedError)
297
- end
298
-
299
- it "should throw AssociationProtectedError even when @items have not been loaded yet (:protect)" do
300
- class Fence
301
- has_many :chains, :dependent => :protect
302
- end
303
-
304
- fence = Fence.create(:name => "Great Wall of China")
305
- fence.chains << Chain.create(:name => "1")
306
- fence.chains << Chain.create(:name => "2")
307
- fence.chains << Chain.create(:name => "3")
308
- fence.save
309
- chain = Chain.create(:name => "4")
310
- fence = Fence[fence.key]
311
-
312
- lambda { fence.destroy! }.should raise_error(DataMapper::AssociationProtectedError)
313
- end
314
-
315
- it "should correctly handle dependent associations (:nullify)" do
316
- class Fence
317
- has_many :chains, :dependent => :nullify
318
- end
319
-
320
- fence = Fence.create(:name => "Great Wall of China")
321
- fence.chains << Chain.create(:name => "1")
322
- fence.chains << Chain.create(:name => "2")
323
- fence.chains << Chain.create(:name => "3")
324
- fence.save
325
- chain = Chain.create(:name => "4")
326
- fence = Fence[fence.key]
327
-
328
- fence.destroy!
329
- Chain.first(:name => "1").should_not be_nil
330
- Chain.first(:name => "1").fence_id.should be_nil
331
- Chain.first(:name => "2").should_not be_nil
332
- Chain.first(:name => "2").fence_id.should be_nil
333
- Chain.first(:name => "3").should_not be_nil
334
- Chain.first(:name => "3").fence_id.should be_nil
335
- end
336
-
337
- end