Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 373
- Log:
Initial import of Radiant 0.9.1, which is now packaged as a gem. This is an
import of the tagged 0.9.1 source checked out from GitHub, which isn't quite
the same as the gem distribution - but it doesn't seem to be available in an
archived form and the installed gem already has modifications, so this is
the closest I can get.
- Author:
- rool
- Date:
- Mon Mar 21 13:40:05 +0000 2011
- Size:
- 14050 Bytes
1 | require "cases/helper" |
2 | require 'models/developer' |
3 | require 'models/project' |
4 | require 'models/company' |
5 | require 'models/topic' |
6 | require 'models/reply' |
7 | require 'models/computer' |
8 | require 'models/customer' |
9 | require 'models/order' |
10 | require 'models/post' |
11 | require 'models/author' |
12 | require 'models/tag' |
13 | require 'models/tagging' |
14 | require 'models/comment' |
15 | require 'models/sponsor' |
16 | require 'models/member' |
17 | require 'models/essay' |
18 | |
19 | class BelongsToAssociationsTest < ActiveRecord::TestCase |
20 | fixtures :accounts, :companies, :developers, :projects, :topics, |
21 | :developers_projects, :computers, :authors, :posts, :tags, :taggings, :comments |
22 | |
23 | def test_belongs_to |
24 | Client.find(3).firm.name |
25 | assert_equal companies(:first_firm).name, Client.find(3).firm.name |
26 | assert !Client.find(3).firm.nil?, "Microsoft should have a firm" |
27 | end |
28 | |
29 | def test_belongs_to_with_primary_key |
30 | client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name) |
31 | assert_equal companies(:first_firm).name, client.firm_with_primary_key.name |
32 | end |
33 | |
34 | def test_belongs_to_with_primary_key_joins_on_correct_column |
35 | sql = Client.send(:construct_finder_sql, :joins => :firm_with_primary_key) |
36 | assert sql !~ /\.id/ |
37 | assert sql =~ /\.name/ |
38 | end |
39 | |
40 | def test_proxy_assignment |
41 | account = Account.find(1) |
42 | assert_nothing_raised { account.firm = account.firm } |
43 | end |
44 | |
45 | def test_triple_equality |
46 | assert Client.find(3).firm === Firm |
47 | assert Firm === Client.find(3).firm |
48 | end |
49 | |
50 | def test_type_mismatch |
51 | assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = 1 } |
52 | assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = Project.find(1) } |
53 | end |
54 | |
55 | def test_natural_assignment |
56 | apple = Firm.create("name" => "Apple") |
57 | citibank = Account.create("credit_limit" => 10) |
58 | citibank.firm = apple |
59 | assert_equal apple.id, citibank.firm_id |
60 | end |
61 | |
62 | def test_natural_assignment_with_primary_key |
63 | apple = Firm.create("name" => "Apple") |
64 | citibank = Client.create("name" => "Primary key client") |
65 | citibank.firm_with_primary_key = apple |
66 | assert_equal apple.name, citibank.firm_name |
67 | end |
68 | |
69 | def test_eager_loading_with_primary_key |
70 | apple = Firm.create("name" => "Apple") |
71 | citibank = Client.create("name" => "Citibank", :firm_name => "Apple") |
72 | citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key) |
73 | assert_not_nil citibank_result.instance_variable_get("@firm_with_primary_key") |
74 | end |
75 | |
76 | def test_no_unexpected_aliasing |
77 | first_firm = companies(:first_firm) |
78 | another_firm = companies(:another_firm) |
79 | |
80 | citibank = Account.create("credit_limit" => 10) |
81 | citibank.firm = first_firm |
82 | original_proxy = citibank.firm |
83 | citibank.firm = another_firm |
84 | |
85 | assert_equal first_firm.object_id, original_proxy.target.object_id |
86 | assert_equal another_firm.object_id, citibank.firm.target.object_id |
87 | end |
88 | |
89 | def test_creating_the_belonging_object |
90 | citibank = Account.create("credit_limit" => 10) |
91 | apple = citibank.create_firm("name" => "Apple") |
92 | assert_equal apple, citibank.firm |
93 | citibank.save |
94 | citibank.reload |
95 | assert_equal apple, citibank.firm |
96 | end |
97 | |
98 | def test_creating_the_belonging_object_with_primary_key |
99 | client = Client.create(:name => "Primary key client") |
100 | apple = client.create_firm_with_primary_key("name" => "Apple") |
101 | assert_equal apple, client.firm_with_primary_key |
102 | client.save |
103 | client.reload |
104 | assert_equal apple, client.firm_with_primary_key |
105 | end |
106 | |
107 | def test_building_the_belonging_object |
108 | citibank = Account.create("credit_limit" => 10) |
109 | apple = citibank.build_firm("name" => "Apple") |
110 | citibank.save |
111 | assert_equal apple.id, citibank.firm_id |
112 | end |
113 | |
114 | def test_building_the_belonging_object_with_primary_key |
115 | client = Client.create(:name => "Primary key client") |
116 | apple = client.build_firm_with_primary_key("name" => "Apple") |
117 | client.save |
118 | assert_equal apple.name, client.firm_name |
119 | end |
120 | |
121 | def test_natural_assignment_to_nil |
122 | client = Client.find(3) |
123 | client.firm = nil |
124 | client.save |
125 | assert_nil client.firm(true) |
126 | assert_nil client.client_of |
127 | end |
128 | |
129 | def test_natural_assignment_to_nil_with_primary_key |
130 | client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name) |
131 | client.firm_with_primary_key = nil |
132 | client.save |
133 | assert_nil client.firm_with_primary_key(true) |
134 | assert_nil client.client_of |
135 | end |
136 | |
137 | def test_with_different_class_name |
138 | assert_equal Company.find(1).name, Company.find(3).firm_with_other_name.name |
139 | assert_not_nil Company.find(3).firm_with_other_name, "Microsoft should have a firm" |
140 | end |
141 | |
142 | def test_with_condition |
143 | assert_equal Company.find(1).name, Company.find(3).firm_with_condition.name |
144 | assert_not_nil Company.find(3).firm_with_condition, "Microsoft should have a firm" |
145 | end |
146 | |
147 | def test_with_select |
148 | assert_equal Company.find(2).firm_with_select.attributes.size, 1 |
149 | assert_equal Company.find(2, :include => :firm_with_select ).firm_with_select.attributes.size, 1 |
150 | end |
151 | |
152 | def test_belongs_to_counter |
153 | debate = Topic.create("title" => "debate") |
154 | assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet" |
155 | |
156 | trash = debate.replies.create("title" => "blah!", "content" => "world around!") |
157 | assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created" |
158 | |
159 | trash.destroy |
160 | assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted" |
161 | end |
162 | |
163 | def test_belongs_to_with_primary_key_counter |
164 | debate = Topic.create("title" => "debate") |
165 | assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet" |
166 | |
167 | trash = debate.replies_with_primary_key.create("title" => "blah!", "content" => "world around!") |
168 | assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created" |
169 | |
170 | trash.destroy |
171 | assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted" |
172 | end |
173 | |
174 | def test_belongs_to_counter_with_assigning_nil |
175 | p = Post.find(1) |
176 | c = Comment.find(1) |
177 | |
178 | assert_equal p.id, c.post_id |
179 | assert_equal 2, Post.find(p.id).comments.size |
180 | |
181 | c.post = nil |
182 | |
183 | assert_equal 1, Post.find(p.id).comments.size |
184 | end |
185 | |
186 | def test_belongs_to_with_primary_key_counter_with_assigning_nil |
187 | debate = Topic.create("title" => "debate") |
188 | reply = Reply.create("title" => "blah!", "content" => "world around!", "parent_title" => "debate") |
189 | |
190 | assert_equal debate.title, reply.parent_title |
191 | assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count") |
192 | |
193 | reply.topic_with_primary_key = nil |
194 | |
195 | assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count") |
196 | end |
197 | |
198 | def test_belongs_to_counter_with_reassigning |
199 | t1 = Topic.create("title" => "t1") |
200 | t2 = Topic.create("title" => "t2") |
201 | r1 = Reply.new("title" => "r1", "content" => "r1") |
202 | r1.topic = t1 |
203 | |
204 | assert r1.save |
205 | assert_equal 1, Topic.find(t1.id).replies.size |
206 | assert_equal 0, Topic.find(t2.id).replies.size |
207 | |
208 | r1.topic = Topic.find(t2.id) |
209 | |
210 | assert r1.save |
211 | assert_equal 0, Topic.find(t1.id).replies.size |
212 | assert_equal 1, Topic.find(t2.id).replies.size |
213 | |
214 | r1.topic = nil |
215 | |
216 | assert_equal 0, Topic.find(t1.id).replies.size |
217 | assert_equal 0, Topic.find(t2.id).replies.size |
218 | |
219 | r1.topic = t1 |
220 | |
221 | assert_equal 1, Topic.find(t1.id).replies.size |
222 | assert_equal 0, Topic.find(t2.id).replies.size |
223 | |
224 | r1.destroy |
225 | |
226 | assert_equal 0, Topic.find(t1.id).replies.size |
227 | assert_equal 0, Topic.find(t2.id).replies.size |
228 | end |
229 | |
230 | def test_belongs_to_reassign_with_namespaced_models_and_counters |
231 | t1 = Web::Topic.create("title" => "t1") |
232 | t2 = Web::Topic.create("title" => "t2") |
233 | r1 = Web::Reply.new("title" => "r1", "content" => "r1") |
234 | r1.topic = t1 |
235 | |
236 | assert r1.save |
237 | assert_equal 1, Web::Topic.find(t1.id).replies.size |
238 | assert_equal 0, Web::Topic.find(t2.id).replies.size |
239 | |
240 | r1.topic = Web::Topic.find(t2.id) |
241 | |
242 | assert r1.save |
243 | assert_equal 0, Web::Topic.find(t1.id).replies.size |
244 | assert_equal 1, Web::Topic.find(t2.id).replies.size |
245 | end |
246 | |
247 | def test_belongs_to_counter_after_save |
248 | topic = Topic.create!(:title => "monday night") |
249 | topic.replies.create!(:title => "re: monday night", :content => "football") |
250 | assert_equal 1, Topic.find(topic.id)[:replies_count] |
251 | |
252 | topic.save! |
253 | assert_equal 1, Topic.find(topic.id)[:replies_count] |
254 | end |
255 | |
256 | def test_belongs_to_counter_after_update_attributes |
257 | topic = Topic.create!(:title => "37s") |
258 | topic.replies.create!(:title => "re: 37s", :content => "rails") |
259 | assert_equal 1, Topic.find(topic.id)[:replies_count] |
260 | |
261 | topic.update_attributes(:title => "37signals") |
262 | assert_equal 1, Topic.find(topic.id)[:replies_count] |
263 | end |
264 | |
265 | def test_assignment_before_child_saved |
266 | final_cut = Client.new("name" => "Final Cut") |
267 | firm = Firm.find(1) |
268 | final_cut.firm = firm |
269 | assert final_cut.new_record? |
270 | assert final_cut.save |
271 | assert !final_cut.new_record? |
272 | assert !firm.new_record? |
273 | assert_equal firm, final_cut.firm |
274 | assert_equal firm, final_cut.firm(true) |
275 | end |
276 | |
277 | def test_assignment_before_child_saved_with_primary_key |
278 | final_cut = Client.new("name" => "Final Cut") |
279 | firm = Firm.find(1) |
280 | final_cut.firm_with_primary_key = firm |
281 | assert final_cut.new_record? |
282 | assert final_cut.save |
283 | assert !final_cut.new_record? |
284 | assert !firm.new_record? |
285 | assert_equal firm, final_cut.firm_with_primary_key |
286 | assert_equal firm, final_cut.firm_with_primary_key(true) |
287 | end |
288 | |
289 | def test_new_record_with_foreign_key_but_no_object |
290 | c = Client.new("firm_id" => 1) |
291 | assert_equal Firm.find(:first), c.firm_with_basic_id |
292 | end |
293 | |
294 | def test_forgetting_the_load_when_foreign_key_enters_late |
295 | c = Client.new |
296 | assert_nil c.firm_with_basic_id |
297 | |
298 | c.firm_id = 1 |
299 | assert_equal Firm.find(:first), c.firm_with_basic_id |
300 | end |
301 | |
302 | def test_field_name_same_as_foreign_key |
303 | computer = Computer.find(1) |
304 | assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # ' |
305 | end |
306 | |
307 | def test_counter_cache |
308 | topic = Topic.create :title => "Zoom-zoom-zoom" |
309 | assert_equal 0, topic[:replies_count] |
310 | |
311 | reply = Reply.create(:title => "re: zoom", :content => "speedy quick!") |
312 | reply.topic = topic |
313 | |
314 | assert_equal 1, topic.reload[:replies_count] |
315 | assert_equal 1, topic.replies.size |
316 | |
317 | topic[:replies_count] = 15 |
318 | assert_equal 15, topic.replies.size |
319 | end |
320 | |
321 | def test_custom_counter_cache |
322 | reply = Reply.create(:title => "re: zoom", :content => "speedy quick!") |
323 | assert_equal 0, reply[:replies_count] |
324 | |
325 | silly = SillyReply.create(:title => "gaga", :content => "boo-boo") |
326 | silly.reply = reply |
327 | |
328 | assert_equal 1, reply.reload[:replies_count] |
329 | assert_equal 1, reply.replies.size |
330 | |
331 | reply[:replies_count] = 17 |
332 | assert_equal 17, reply.replies.size |
333 | end |
334 | |
335 | def test_association_assignment_sticks |
336 | post = Post.find(:first) |
337 | |
338 | author1, author2 = Author.find(:all, :limit => 2) |
339 | assert_not_nil author1 |
340 | assert_not_nil author2 |
341 | |
342 | # make sure the association is loaded |
343 | post.author |
344 | |
345 | # set the association by id, directly |
346 | post.author_id = author2.id |
347 | |
348 | # save and reload |
349 | post.save! |
350 | post.reload |
351 | |
352 | # the author id of the post should be the id we set |
353 | assert_equal post.author_id, author2.id |
354 | end |
355 | |
356 | def test_cant_save_readonly_association |
357 | assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_client).readonly_firm.save! } |
358 | assert companies(:first_client).readonly_firm.readonly? |
359 | end |
360 | |
361 | def test_polymorphic_assignment_foreign_type_field_updating |
362 | # should update when assigning a saved record |
363 | sponsor = Sponsor.new |
364 | member = Member.create |
365 | sponsor.sponsorable = member |
366 | assert_equal "Member", sponsor.sponsorable_type |
367 | |
368 | # should update when assigning a new record |
369 | sponsor = Sponsor.new |
370 | member = Member.new |
371 | sponsor.sponsorable = member |
372 | assert_equal "Member", sponsor.sponsorable_type |
373 | end |
374 | |
375 | def test_polymorphic_assignment_with_primary_key_foreign_type_field_updating |
376 | # should update when assigning a saved record |
377 | essay = Essay.new |
378 | writer = Author.create(:name => "David") |
379 | essay.writer = writer |
380 | assert_equal "Author", essay.writer_type |
381 | |
382 | # should update when assigning a new record |
383 | essay = Essay.new |
384 | writer = Author.new |
385 | essay.writer = writer |
386 | assert_equal "Author", essay.writer_type |
387 | end |
388 | |
389 | def test_polymorphic_assignment_updates_foreign_id_field_for_new_and_saved_records |
390 | sponsor = Sponsor.new |
391 | saved_member = Member.create |
392 | new_member = Member.new |
393 | |
394 | sponsor.sponsorable = saved_member |
395 | assert_equal saved_member.id, sponsor.sponsorable_id |
396 | |
397 | sponsor.sponsorable = new_member |
398 | assert_equal nil, sponsor.sponsorable_id |
399 | end |
400 | |
401 | def test_polymorphic_assignment_with_primary_key_updates_foreign_id_field_for_new_and_saved_records |
402 | essay = Essay.new |
403 | saved_writer = Author.create(:name => "David") |
404 | new_writer = Author.new |
405 | |
406 | essay.writer = saved_writer |
407 | assert_equal saved_writer.name, essay.writer_id |
408 | |
409 | essay.writer = new_writer |
410 | assert_equal nil, essay.writer_id |
411 | end |
412 | |
413 | def test_belongs_to_proxy_should_not_respond_to_private_methods |
414 | assert_raise(NoMethodError) { companies(:first_firm).private_method } |
415 | assert_raise(NoMethodError) { companies(:second_client).firm.private_method } |
416 | end |
417 | |
418 | def test_belongs_to_proxy_should_respond_to_private_methods_via_send |
419 | companies(:first_firm).send(:private_method) |
420 | companies(:second_client).firm.send(:private_method) |
421 | end |
422 | |
423 | def test_save_of_record_with_loaded_belongs_to |
424 | @account = companies(:first_firm).account |
425 | |
426 | assert_nothing_raised do |
427 | Account.find(@account.id).save! |
428 | Account.find(@account.id, :include => :firm).save! |
429 | end |
430 | |
431 | @account.firm.delete |
432 | |
433 | assert_nothing_raised do |
434 | Account.find(@account.id).save! |
435 | Account.find(@account.id, :include => :firm).save! |
436 | end |
437 | end |
438 | end |