ibm_db 2.5.26-universal-darwin-14 → 2.6.1-universal-darwin-14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +11 -0
  3. data/MANIFEST +14 -14
  4. data/README +225 -225
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/extconf.rb +264 -261
  8. data/ext/extconf_MacOS.rb +269 -0
  9. data/ext/ibm_db.c +11879 -11793
  10. data/ext/ruby_ibm_db.h +241 -240
  11. data/ext/ruby_ibm_db_cli.c +851 -845
  12. data/ext/ruby_ibm_db_cli.h +500 -489
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -19
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3339 -3289
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/test/cases/adapter_test.rb +207 -207
  19. data/test/cases/associations/belongs_to_associations_test.rb +711 -711
  20. data/test/cases/associations/cascaded_eager_loading_test.rb +181 -181
  21. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +851 -851
  22. data/test/cases/associations/join_model_test.rb +743 -743
  23. data/test/cases/attribute_methods_test.rb +822 -822
  24. data/test/cases/base_test.rb +2133 -2133
  25. data/test/cases/calculations_test.rb +482 -482
  26. data/test/cases/migration_test.rb +2408 -2408
  27. data/test/cases/persistence_test.rb +642 -642
  28. data/test/cases/query_cache_test.rb +257 -257
  29. data/test/cases/relations_test.rb +1182 -1182
  30. data/test/cases/schema_dumper_test.rb +256 -256
  31. data/test/cases/transaction_callbacks_test.rb +300 -300
  32. data/test/cases/validations/uniqueness_validation_test.rb +299 -299
  33. data/test/cases/xml_serialization_test.rb +408 -408
  34. data/test/config.yml +154 -154
  35. data/test/connections/native_ibm_db/connection.rb +43 -43
  36. data/test/ibm_db_test.rb +24 -24
  37. data/test/models/warehouse_thing.rb +4 -4
  38. data/test/schema/schema.rb +751 -751
  39. metadata +6 -8
  40. data/lib/linux/rb18x/ibm_db.bundle +0 -0
  41. data/lib/linux/rb19x/ibm_db.bundle +0 -0
  42. data/lib/linux/rb20x/ibm_db.bundle +0 -0
  43. data/lib/linux/rb21x/ibm_db.bundle +0 -0
@@ -1,207 +1,207 @@
1
- require "cases/helper"
2
-
3
- module ActiveRecord
4
- class AdapterTest < ActiveRecord::TestCase
5
- def setup
6
- @connection = ActiveRecord::Base.connection
7
- end
8
-
9
- if current_adapter?(:IBM_DBAdapter)
10
- def test_a_connection_attributes
11
- if @connection.servertype.class.name.include?('::IBM_IDS')
12
- return
13
- end
14
- if @connection.respond_to?(:schema)
15
- previous_schema = ActiveRecord::Base.connection.schema
16
- ActiveRecord::Base.connection.schema = 'SYSCAT'
17
- assert_equal 'SYSCAT', ActiveRecord::Base.connection.schema
18
- ActiveRecord::Base.connection.schema = previous_schema
19
- else
20
- warn "#{@connection.class} does not support client connection attribute schema_name"
21
- end
22
-
23
- if @connection.respond_to?(:app_user)
24
- ActiveRecord::Base.connection.app_user = 'new_user'
25
- assert_equal 'new_user', ActiveRecord::Base.connection.app_user
26
- else
27
- warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_USER"
28
- end
29
-
30
- if @connection.respond_to?(:account)
31
- ActiveRecord::Base.connection.account = 'new_acct'
32
- assert_equal 'new_acct', ActiveRecord::Base.connection.account
33
- else
34
- warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_ACCTSTR"
35
- end
36
-
37
- if @connection.respond_to?(:application)
38
- ActiveRecord::Base.connection.application = 'new_app'
39
- assert_equal 'new_app', ActiveRecord::Base.connection.application
40
- else
41
- warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_APPLNAME"
42
- end
43
-
44
- if @connection.respond_to?(:workstation)
45
- ActiveRecord::Base.connection.workstation = 'new_wrkst'
46
- assert_equal 'new_wrkst', ActiveRecord::Base.connection.workstation
47
- else
48
- warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_WRKSTNNAME"
49
- end
50
- end
51
- end
52
-
53
- def test_tables
54
- tables = @connection.tables
55
- assert tables.include?("accounts")
56
- assert tables.include?("authors")
57
- assert tables.include?("tasks")
58
- assert tables.include?("topics")
59
- end
60
-
61
- def test_table_exists?
62
- assert @connection.table_exists?("accounts")
63
- assert !@connection.table_exists?("nonexistingtable")
64
- assert !@connection.table_exists?(nil)
65
- end
66
-
67
- def test_indexes
68
- idx_name = "accounts_idx"
69
-
70
- if @connection.respond_to?(:indexes)
71
- indexes = @connection.indexes("accounts")
72
- assert indexes.empty?
73
-
74
- @connection.add_index :accounts, :firm_id, :name => idx_name
75
- indexes = @connection.indexes("accounts")
76
- assert_equal "accounts", indexes.first.table
77
- # OpenBase does not have the concept of a named index
78
- # Indexes are merely properties of columns.
79
- assert_equal idx_name, indexes.first.name unless current_adapter?(:OpenBaseAdapter)
80
- assert !indexes.first.unique
81
- assert_equal ["firm_id"], indexes.first.columns
82
- else
83
- warn "#{@connection.class} does not respond to #indexes"
84
- end
85
-
86
- ensure
87
- @connection.remove_index(:accounts, :name => idx_name) rescue nil
88
- end
89
-
90
- def test_current_database
91
- if @connection.respond_to?(:current_database)
92
- assert_equal ARTest.connection_config['arunit']['database'], @connection.current_database
93
- end
94
- end
95
-
96
- if current_adapter?(:MysqlAdapter)
97
- def test_charset
98
- assert_not_nil @connection.charset
99
- assert_not_equal 'character_set_database', @connection.charset
100
- assert_equal @connection.show_variable('character_set_database'), @connection.charset
101
- end
102
-
103
- def test_collation
104
- assert_not_nil @connection.collation
105
- assert_not_equal 'collation_database', @connection.collation
106
- assert_equal @connection.show_variable('collation_database'), @connection.collation
107
- end
108
-
109
- def test_show_nonexistent_variable_returns_nil
110
- assert_nil @connection.show_variable('foo_bar_baz')
111
- end
112
-
113
- def test_not_specifying_database_name_for_cross_database_selects
114
- begin
115
- assert_nothing_raised do
116
- ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['arunit'].except(:database))
117
-
118
- config = ARTest.connection_config
119
- ActiveRecord::Base.connection.execute(
120
- "SELECT #{config['arunit']['database']}.pirates.*, #{config['arunit2']['database']}.courses.* " \
121
- "FROM #{config['arunit']['database']}.pirates, #{config['arunit2']['database']}.courses"
122
- )
123
- end
124
- ensure
125
- ActiveRecord::Base.establish_connection 'arunit'
126
- end
127
- end
128
- end
129
-
130
- def test_table_alias
131
- def @connection.test_table_alias_length() 10; end
132
- class << @connection
133
- alias_method :old_table_alias_length, :table_alias_length
134
- alias_method :table_alias_length, :test_table_alias_length
135
- end
136
-
137
- assert_equal 'posts', @connection.table_alias_for('posts')
138
- assert_equal 'posts_comm', @connection.table_alias_for('posts_comments')
139
- assert_equal 'dbo_posts', @connection.table_alias_for('dbo.posts')
140
-
141
- class << @connection
142
- remove_method :table_alias_length
143
- alias_method :table_alias_length, :old_table_alias_length
144
- end
145
- end
146
-
147
- # test resetting sequences in odd tables in postgreSQL
148
- if ActiveRecord::Base.connection.respond_to?(:reset_pk_sequence!)
149
- require 'models/movie'
150
- require 'models/subscriber'
151
-
152
- def test_reset_empty_table_with_custom_pk
153
- Movie.delete_all
154
- Movie.connection.reset_pk_sequence! 'movies'
155
- assert_equal 1, Movie.create(:name => 'fight club').id
156
- end
157
-
158
- if ActiveRecord::Base.connection.adapter_name != "FrontBase"
159
- def test_reset_table_with_non_integer_pk
160
- Subscriber.delete_all
161
- Subscriber.connection.reset_pk_sequence! 'subscribers'
162
- sub = Subscriber.new(:name => 'robert drake')
163
- sub.id = 'bob drake'
164
- assert_nothing_raised { sub.save! }
165
- end
166
- end
167
- end
168
-
169
- def test_uniqueness_violations_are_translated_to_specific_exception
170
- @connection.execute "INSERT INTO subscribers(nick) VALUES('me')"
171
- assert_raises(ActiveRecord::RecordNotUnique) do
172
- @connection.execute "INSERT INTO subscribers(nick) VALUES('me')"
173
- end
174
- end
175
-
176
- def test_foreign_key_violations_are_translated_to_specific_exception
177
- unless @connection.adapter_name == 'SQLite'
178
- assert_raises(ActiveRecord::InvalidForeignKey) do
179
- # Oracle adapter uses prefetched primary key values from sequence and passes them to connection adapter insert method
180
- if @connection.prefetch_primary_key?
181
- id_value = @connection.next_sequence_value(@connection.default_sequence_name("fk_test_has_fk", "id"))
182
- @connection.execute "INSERT INTO fk_test_has_fk (id, fk_id) VALUES (#{id_value},0)"
183
- else
184
- @connection.execute "INSERT INTO fk_test_has_fk (fk_id) VALUES (0)"
185
- end
186
- end
187
- end
188
- end
189
-
190
- def test_disable_referential_integrity
191
- assert_nothing_raised do
192
- @connection.disable_referential_integrity do
193
- # Oracle adapter uses prefetched primary key values from sequence and passes them to connection adapter insert method
194
- if @connection.prefetch_primary_key?
195
- id_value = @connection.next_sequence_value(@connection.default_sequence_name("fk_test_has_fk", "id"))
196
- @connection.execute "INSERT INTO fk_test_has_fk (id, fk_id) VALUES (#{id_value},0)"
197
- else
198
- @connection.execute "INSERT INTO fk_test_has_fk (fk_id) VALUES (0)"
199
- end
200
- # should deleted created record as otherwise disable_referential_integrity will try to enable contraints after executed block
201
- # and will fail (at least on Oracle)
202
- @connection.execute "DELETE FROM fk_test_has_fk"
203
- end
204
- end
205
- end
206
- end
207
- end
1
+ require "cases/helper"
2
+
3
+ module ActiveRecord
4
+ class AdapterTest < ActiveRecord::TestCase
5
+ def setup
6
+ @connection = ActiveRecord::Base.connection
7
+ end
8
+
9
+ if current_adapter?(:IBM_DBAdapter)
10
+ def test_a_connection_attributes
11
+ if @connection.servertype.class.name.include?('::IBM_IDS')
12
+ return
13
+ end
14
+ if @connection.respond_to?(:schema)
15
+ previous_schema = ActiveRecord::Base.connection.schema
16
+ ActiveRecord::Base.connection.schema = 'SYSCAT'
17
+ assert_equal 'SYSCAT', ActiveRecord::Base.connection.schema
18
+ ActiveRecord::Base.connection.schema = previous_schema
19
+ else
20
+ warn "#{@connection.class} does not support client connection attribute schema_name"
21
+ end
22
+
23
+ if @connection.respond_to?(:app_user)
24
+ ActiveRecord::Base.connection.app_user = 'new_user'
25
+ assert_equal 'new_user', ActiveRecord::Base.connection.app_user
26
+ else
27
+ warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_USER"
28
+ end
29
+
30
+ if @connection.respond_to?(:account)
31
+ ActiveRecord::Base.connection.account = 'new_acct'
32
+ assert_equal 'new_acct', ActiveRecord::Base.connection.account
33
+ else
34
+ warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_ACCTSTR"
35
+ end
36
+
37
+ if @connection.respond_to?(:application)
38
+ ActiveRecord::Base.connection.application = 'new_app'
39
+ assert_equal 'new_app', ActiveRecord::Base.connection.application
40
+ else
41
+ warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_APPLNAME"
42
+ end
43
+
44
+ if @connection.respond_to?(:workstation)
45
+ ActiveRecord::Base.connection.workstation = 'new_wrkst'
46
+ assert_equal 'new_wrkst', ActiveRecord::Base.connection.workstation
47
+ else
48
+ warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_WRKSTNNAME"
49
+ end
50
+ end
51
+ end
52
+
53
+ def test_tables
54
+ tables = @connection.tables
55
+ assert tables.include?("accounts")
56
+ assert tables.include?("authors")
57
+ assert tables.include?("tasks")
58
+ assert tables.include?("topics")
59
+ end
60
+
61
+ def test_table_exists?
62
+ assert @connection.table_exists?("accounts")
63
+ assert !@connection.table_exists?("nonexistingtable")
64
+ assert !@connection.table_exists?(nil)
65
+ end
66
+
67
+ def test_indexes
68
+ idx_name = "accounts_idx"
69
+
70
+ if @connection.respond_to?(:indexes)
71
+ indexes = @connection.indexes("accounts")
72
+ assert indexes.empty?
73
+
74
+ @connection.add_index :accounts, :firm_id, :name => idx_name
75
+ indexes = @connection.indexes("accounts")
76
+ assert_equal "accounts", indexes.first.table
77
+ # OpenBase does not have the concept of a named index
78
+ # Indexes are merely properties of columns.
79
+ assert_equal idx_name, indexes.first.name unless current_adapter?(:OpenBaseAdapter)
80
+ assert !indexes.first.unique
81
+ assert_equal ["firm_id"], indexes.first.columns
82
+ else
83
+ warn "#{@connection.class} does not respond to #indexes"
84
+ end
85
+
86
+ ensure
87
+ @connection.remove_index(:accounts, :name => idx_name) rescue nil
88
+ end
89
+
90
+ def test_current_database
91
+ if @connection.respond_to?(:current_database)
92
+ assert_equal ARTest.connection_config['arunit']['database'], @connection.current_database
93
+ end
94
+ end
95
+
96
+ if current_adapter?(:MysqlAdapter)
97
+ def test_charset
98
+ assert_not_nil @connection.charset
99
+ assert_not_equal 'character_set_database', @connection.charset
100
+ assert_equal @connection.show_variable('character_set_database'), @connection.charset
101
+ end
102
+
103
+ def test_collation
104
+ assert_not_nil @connection.collation
105
+ assert_not_equal 'collation_database', @connection.collation
106
+ assert_equal @connection.show_variable('collation_database'), @connection.collation
107
+ end
108
+
109
+ def test_show_nonexistent_variable_returns_nil
110
+ assert_nil @connection.show_variable('foo_bar_baz')
111
+ end
112
+
113
+ def test_not_specifying_database_name_for_cross_database_selects
114
+ begin
115
+ assert_nothing_raised do
116
+ ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['arunit'].except(:database))
117
+
118
+ config = ARTest.connection_config
119
+ ActiveRecord::Base.connection.execute(
120
+ "SELECT #{config['arunit']['database']}.pirates.*, #{config['arunit2']['database']}.courses.* " \
121
+ "FROM #{config['arunit']['database']}.pirates, #{config['arunit2']['database']}.courses"
122
+ )
123
+ end
124
+ ensure
125
+ ActiveRecord::Base.establish_connection 'arunit'
126
+ end
127
+ end
128
+ end
129
+
130
+ def test_table_alias
131
+ def @connection.test_table_alias_length() 10; end
132
+ class << @connection
133
+ alias_method :old_table_alias_length, :table_alias_length
134
+ alias_method :table_alias_length, :test_table_alias_length
135
+ end
136
+
137
+ assert_equal 'posts', @connection.table_alias_for('posts')
138
+ assert_equal 'posts_comm', @connection.table_alias_for('posts_comments')
139
+ assert_equal 'dbo_posts', @connection.table_alias_for('dbo.posts')
140
+
141
+ class << @connection
142
+ remove_method :table_alias_length
143
+ alias_method :table_alias_length, :old_table_alias_length
144
+ end
145
+ end
146
+
147
+ # test resetting sequences in odd tables in postgreSQL
148
+ if ActiveRecord::Base.connection.respond_to?(:reset_pk_sequence!)
149
+ require 'models/movie'
150
+ require 'models/subscriber'
151
+
152
+ def test_reset_empty_table_with_custom_pk
153
+ Movie.delete_all
154
+ Movie.connection.reset_pk_sequence! 'movies'
155
+ assert_equal 1, Movie.create(:name => 'fight club').id
156
+ end
157
+
158
+ if ActiveRecord::Base.connection.adapter_name != "FrontBase"
159
+ def test_reset_table_with_non_integer_pk
160
+ Subscriber.delete_all
161
+ Subscriber.connection.reset_pk_sequence! 'subscribers'
162
+ sub = Subscriber.new(:name => 'robert drake')
163
+ sub.id = 'bob drake'
164
+ assert_nothing_raised { sub.save! }
165
+ end
166
+ end
167
+ end
168
+
169
+ def test_uniqueness_violations_are_translated_to_specific_exception
170
+ @connection.execute "INSERT INTO subscribers(nick) VALUES('me')"
171
+ assert_raises(ActiveRecord::RecordNotUnique) do
172
+ @connection.execute "INSERT INTO subscribers(nick) VALUES('me')"
173
+ end
174
+ end
175
+
176
+ def test_foreign_key_violations_are_translated_to_specific_exception
177
+ unless @connection.adapter_name == 'SQLite'
178
+ assert_raises(ActiveRecord::InvalidForeignKey) do
179
+ # Oracle adapter uses prefetched primary key values from sequence and passes them to connection adapter insert method
180
+ if @connection.prefetch_primary_key?
181
+ id_value = @connection.next_sequence_value(@connection.default_sequence_name("fk_test_has_fk", "id"))
182
+ @connection.execute "INSERT INTO fk_test_has_fk (id, fk_id) VALUES (#{id_value},0)"
183
+ else
184
+ @connection.execute "INSERT INTO fk_test_has_fk (fk_id) VALUES (0)"
185
+ end
186
+ end
187
+ end
188
+ end
189
+
190
+ def test_disable_referential_integrity
191
+ assert_nothing_raised do
192
+ @connection.disable_referential_integrity do
193
+ # Oracle adapter uses prefetched primary key values from sequence and passes them to connection adapter insert method
194
+ if @connection.prefetch_primary_key?
195
+ id_value = @connection.next_sequence_value(@connection.default_sequence_name("fk_test_has_fk", "id"))
196
+ @connection.execute "INSERT INTO fk_test_has_fk (id, fk_id) VALUES (#{id_value},0)"
197
+ else
198
+ @connection.execute "INSERT INTO fk_test_has_fk (fk_id) VALUES (0)"
199
+ end
200
+ # should deleted created record as otherwise disable_referential_integrity will try to enable contraints after executed block
201
+ # and will fail (at least on Oracle)
202
+ @connection.execute "DELETE FROM fk_test_has_fk"
203
+ end
204
+ end
205
+ end
206
+ end
207
+ end
@@ -1,711 +1,711 @@
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/post'
9
- require 'models/author'
10
- require 'models/tag'
11
- require 'models/tagging'
12
- require 'models/comment'
13
- require 'models/sponsor'
14
- require 'models/member'
15
- require 'models/essay'
16
- require 'models/toy'
17
-
18
- class BelongsToAssociationsTest < ActiveRecord::TestCase
19
- fixtures :accounts, :companies, :developers, :projects, :topics,
20
- :developers_projects, :computers, :authors, :author_addresses,
21
- :posts, :tags, :taggings, :comments, :sponsors, :members
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_not_nil Client.find(3).firm, "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.joins(:firm_with_primary_key).to_sql
36
- if current_adapter?(:MysqlAdapter) or current_adapter?(:Mysql2Adapter)
37
- assert_no_match(/`firm_with_primary_keys_companies`\.`id`/, sql)
38
- assert_match(/`firm_with_primary_keys_companies`\.`name`/, sql)
39
- elsif current_adapter?(:OracleAdapter)
40
- # on Oracle aliases are truncated to 30 characters and are quoted in uppercase
41
- assert_no_match(/"firm_with_primary_keys_compani"\."id"/i, sql)
42
- assert_match(/"firm_with_primary_keys_compani"\."name"/i, sql)
43
- elsif current_adapter?(:IBM_DBAdapter)
44
- # Quoting of column names is not necessary for IBM_DB
45
- assert_no_match(/firm_with_primary_keys_companies\.id/i, sql)
46
- assert_match(/firm_with_primary_keys_companies\.name/i, sql)
47
- else
48
- assert_no_match(/"firm_with_primary_keys_companies"\."id"/, sql)
49
- assert_match(/"firm_with_primary_keys_companies"\."name"/, sql)
50
- end
51
- end
52
-
53
- def test_proxy_assignment
54
- account = Account.find(1)
55
- assert_nothing_raised { account.firm = account.firm }
56
- end
57
-
58
- def test_type_mismatch
59
- assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = 1 }
60
- assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = Project.find(1) }
61
- end
62
-
63
- def test_natural_assignment
64
- apple = Firm.create("name" => "Apple")
65
- citibank = Account.create("credit_limit" => 10)
66
- citibank.firm = apple
67
- assert_equal apple.id, citibank.firm_id
68
- end
69
-
70
- def test_natural_assignment_with_primary_key
71
- apple = Firm.create("name" => "Apple")
72
- citibank = Client.create("name" => "Primary key client")
73
- citibank.firm_with_primary_key = apple
74
- assert_equal apple.name, citibank.firm_name
75
- end
76
-
77
- def test_eager_loading_with_primary_key
78
- Firm.create("name" => "Apple")
79
- Client.create("name" => "Citibank", :firm_name => "Apple")
80
- citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key)
81
- assert citibank_result.association_cache.key?(:firm_with_primary_key)
82
- end
83
-
84
- def test_eager_loading_with_primary_key_as_symbol
85
- Firm.create("name" => "Apple")
86
- Client.create("name" => "Citibank", :firm_name => "Apple")
87
- citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key_symbols)
88
- assert citibank_result.association_cache.key?(:firm_with_primary_key_symbols)
89
- end
90
-
91
- def test_creating_the_belonging_object
92
- citibank = Account.create("credit_limit" => 10)
93
- apple = citibank.create_firm("name" => "Apple")
94
- assert_equal apple, citibank.firm
95
- citibank.save
96
- citibank.reload
97
- assert_equal apple, citibank.firm
98
- end
99
-
100
- def test_creating_the_belonging_object_with_primary_key
101
- client = Client.create(:name => "Primary key client")
102
- apple = client.create_firm_with_primary_key("name" => "Apple")
103
- assert_equal apple, client.firm_with_primary_key
104
- client.save
105
- client.reload
106
- assert_equal apple, client.firm_with_primary_key
107
- end
108
-
109
- def test_building_the_belonging_object
110
- citibank = Account.create("credit_limit" => 10)
111
- apple = citibank.build_firm("name" => "Apple")
112
- citibank.save
113
- assert_equal apple.id, citibank.firm_id
114
- end
115
-
116
- def test_building_the_belonging_object_with_primary_key
117
- client = Client.create(:name => "Primary key client")
118
- apple = client.build_firm_with_primary_key("name" => "Apple")
119
- client.save
120
- assert_equal apple.name, client.firm_name
121
- end
122
-
123
- def test_create!
124
- client = Client.create!(:name => "Jimmy")
125
- account = client.create_account!(:credit_limit => 10)
126
- assert_equal account, client.account
127
- assert account.persisted?
128
- client.save
129
- client.reload
130
- assert_equal account, client.account
131
- end
132
-
133
- def test_failing_create!
134
- client = Client.create!(:name => "Jimmy")
135
- assert_raise(ActiveRecord::RecordInvalid) { client.create_account! }
136
- assert_not_nil client.account
137
- assert client.account.new_record?
138
- end
139
-
140
- def test_natural_assignment_to_nil
141
- client = Client.find(3)
142
- client.firm = nil
143
- client.save
144
- assert_nil client.firm(true)
145
- assert_nil client.client_of
146
- end
147
-
148
- def test_natural_assignment_to_nil_with_primary_key
149
- client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name)
150
- client.firm_with_primary_key = nil
151
- client.save
152
- assert_nil client.firm_with_primary_key(true)
153
- assert_nil client.client_of
154
- end
155
-
156
- def test_with_different_class_name
157
- assert_equal Company.find(1).name, Company.find(3).firm_with_other_name.name
158
- assert_not_nil Company.find(3).firm_with_other_name, "Microsoft should have a firm"
159
- end
160
-
161
- def test_with_condition
162
- assert_equal Company.find(1).name, Company.find(3).firm_with_condition.name
163
- assert_not_nil Company.find(3).firm_with_condition, "Microsoft should have a firm"
164
- end
165
-
166
- def test_polymorphic_association_class
167
- sponsor = Sponsor.new
168
- assert_nil sponsor.association(:sponsorable).send(:klass)
169
-
170
- sponsor.sponsorable_type = '' # the column doesn't have to be declared NOT NULL
171
- assert_nil sponsor.association(:sponsorable).send(:klass)
172
-
173
- sponsor.sponsorable = Member.new :name => "Bert"
174
- assert_equal Member, sponsor.association(:sponsorable).send(:klass)
175
- end
176
-
177
- def test_with_polymorphic_and_condition
178
- sponsor = Sponsor.create
179
- member = Member.create :name => "Bert"
180
- sponsor.sponsorable = member
181
-
182
- assert_equal member, sponsor.sponsorable
183
- assert_nil sponsor.sponsorable_with_conditions
184
- end
185
-
186
- def test_with_select
187
- assert_equal Company.find(2).firm_with_select.attributes.size, 1
188
- assert_equal Company.find(2, :include => :firm_with_select ).firm_with_select.attributes.size, 1
189
- end
190
-
191
- def test_belongs_to_counter
192
- debate = Topic.create("title" => "debate")
193
- assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
194
-
195
- trash = debate.replies.create("title" => "blah!", "content" => "world around!")
196
- assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created"
197
-
198
- trash.destroy
199
- assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted"
200
- end
201
-
202
- def test_belongs_to_counter_with_assigning_nil
203
- p = Post.find(1)
204
- c = Comment.find(1)
205
-
206
- assert_equal p.id, c.post_id
207
- assert_equal 2, Post.find(p.id).comments.size
208
-
209
- c.post = nil
210
-
211
- assert_equal 1, Post.find(p.id).comments.size
212
- end
213
-
214
- def test_belongs_to_with_primary_key_counter
215
- debate = Topic.create("title" => "debate")
216
- debate2 = Topic.create("title" => "debate2")
217
- reply = Reply.create("title" => "blah!", "content" => "world around!", "parent_title" => "debate")
218
-
219
- assert_equal 1, debate.reload.replies_count
220
- assert_equal 0, debate2.reload.replies_count
221
-
222
- reply.topic_with_primary_key = debate2
223
-
224
- assert_equal 0, debate.reload.replies_count
225
- assert_equal 1, debate2.reload.replies_count
226
-
227
- reply.topic_with_primary_key = nil
228
-
229
- assert_equal 0, debate.reload.replies_count
230
- assert_equal 0, debate2.reload.replies_count
231
- end
232
-
233
- def test_belongs_to_counter_with_reassigning
234
- t1 = Topic.create("title" => "t1")
235
- t2 = Topic.create("title" => "t2")
236
- r1 = Reply.new("title" => "r1", "content" => "r1")
237
- r1.topic = t1
238
-
239
- assert r1.save
240
- assert_equal 1, Topic.find(t1.id).replies.size
241
- assert_equal 0, Topic.find(t2.id).replies.size
242
-
243
- r1.topic = Topic.find(t2.id)
244
-
245
- assert_no_queries do
246
- r1.topic = t2
247
- end
248
-
249
- assert r1.save
250
- assert_equal 0, Topic.find(t1.id).replies.size
251
- assert_equal 1, Topic.find(t2.id).replies.size
252
-
253
- r1.topic = nil
254
-
255
- assert_equal 0, Topic.find(t1.id).replies.size
256
- assert_equal 0, Topic.find(t2.id).replies.size
257
-
258
- r1.topic = t1
259
-
260
- assert_equal 1, Topic.find(t1.id).replies.size
261
- assert_equal 0, Topic.find(t2.id).replies.size
262
-
263
- r1.destroy
264
-
265
- assert_equal 0, Topic.find(t1.id).replies.size
266
- assert_equal 0, Topic.find(t2.id).replies.size
267
- end
268
-
269
- def test_belongs_to_reassign_with_namespaced_models_and_counters
270
- t1 = Web::Topic.create("title" => "t1")
271
- t2 = Web::Topic.create("title" => "t2")
272
- r1 = Web::Reply.new("title" => "r1", "content" => "r1")
273
- r1.topic = t1
274
-
275
- assert r1.save
276
- assert_equal 1, Web::Topic.find(t1.id).replies.size
277
- assert_equal 0, Web::Topic.find(t2.id).replies.size
278
-
279
- r1.topic = Web::Topic.find(t2.id)
280
-
281
- assert r1.save
282
- assert_equal 0, Web::Topic.find(t1.id).replies.size
283
- assert_equal 1, Web::Topic.find(t2.id).replies.size
284
- end
285
-
286
- def test_belongs_to_counter_after_save
287
- topic = Topic.create!(:title => "monday night")
288
- topic.replies.create!(:title => "re: monday night", :content => "football")
289
- assert_equal 1, Topic.find(topic.id)[:replies_count]
290
-
291
- topic.save!
292
- assert_equal 1, Topic.find(topic.id)[:replies_count]
293
- end
294
-
295
- def test_belongs_to_counter_after_update_attributes
296
- topic = Topic.create!(:title => "37s")
297
- topic.replies.create!(:title => "re: 37s", :content => "rails")
298
- assert_equal 1, Topic.find(topic.id)[:replies_count]
299
-
300
- topic.update_attributes(:title => "37signals")
301
- assert_equal 1, Topic.find(topic.id)[:replies_count]
302
- end
303
-
304
- def test_belongs_to_counter_when_update_column
305
- topic = Topic.create!(:title => "37s")
306
- topic.replies.create!(:title => "re: 37s", :content => "rails")
307
- assert_equal 1, Topic.find(topic.id)[:replies_count]
308
-
309
- topic.update_column(:content, "rails is wonderfull")
310
- assert_equal 1, Topic.find(topic.id)[:replies_count]
311
- end
312
-
313
- def test_assignment_before_child_saved
314
- final_cut = Client.new("name" => "Final Cut")
315
- firm = Firm.find(1)
316
- final_cut.firm = firm
317
- assert !final_cut.persisted?
318
- assert final_cut.save
319
- assert final_cut.persisted?
320
- assert firm.persisted?
321
- assert_equal firm, final_cut.firm
322
- assert_equal firm, final_cut.firm(true)
323
- end
324
-
325
- def test_assignment_before_child_saved_with_primary_key
326
- final_cut = Client.new("name" => "Final Cut")
327
- firm = Firm.find(1)
328
- final_cut.firm_with_primary_key = firm
329
- assert !final_cut.persisted?
330
- assert final_cut.save
331
- assert final_cut.persisted?
332
- assert firm.persisted?
333
- assert_equal firm, final_cut.firm_with_primary_key
334
- assert_equal firm, final_cut.firm_with_primary_key(true)
335
- end
336
-
337
- def test_new_record_with_foreign_key_but_no_object
338
- c = Client.new("firm_id" => 1)
339
- # sometimes tests on Oracle fail if ORDER BY is not provided therefore add always :order with :first
340
- assert_equal Firm.find(:first, :order => "id"), c.firm_with_basic_id
341
- end
342
-
343
- def test_setting_foreign_key_after_nil_target_loaded
344
- client = Client.new
345
- client.firm_with_basic_id
346
- client.firm_id = 1
347
-
348
- assert_equal companies(:first_firm), client.firm_with_basic_id
349
- end
350
-
351
- def test_polymorphic_setting_foreign_key_after_nil_target_loaded
352
- sponsor = Sponsor.new
353
- sponsor.sponsorable
354
- sponsor.sponsorable_id = 1
355
- sponsor.sponsorable_type = "Member"
356
-
357
- assert_equal members(:groucho), sponsor.sponsorable
358
- end
359
-
360
- def test_dont_find_target_when_foreign_key_is_null
361
- tagging = taggings(:thinking_general)
362
- queries = assert_sql { tagging.super_tag }
363
- assert_equal 0, queries.length
364
- end
365
-
366
- def test_field_name_same_as_foreign_key
367
- computer = Computer.find(1)
368
- assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # '
369
- end
370
-
371
- def test_counter_cache
372
- topic = Topic.create :title => "Zoom-zoom-zoom"
373
- assert_equal 0, topic[:replies_count]
374
-
375
- reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
376
- reply.topic = topic
377
-
378
- assert_equal 1, topic.reload[:replies_count]
379
- assert_equal 1, topic.replies.size
380
-
381
- topic[:replies_count] = 15
382
- assert_equal 15, topic.replies.size
383
- end
384
-
385
- def test_custom_counter_cache
386
- reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
387
- assert_equal 0, reply[:replies_count]
388
-
389
- silly = SillyReply.create(:title => "gaga", :content => "boo-boo")
390
- silly.reply = reply
391
-
392
- assert_equal 1, reply.reload[:replies_count]
393
- assert_equal 1, reply.replies.size
394
-
395
- reply[:replies_count] = 17
396
- assert_equal 17, reply.replies.size
397
- end
398
-
399
- def test_association_assignment_sticks
400
- post = Post.find(:first)
401
-
402
- author1, author2 = Author.find(:all, :limit => 2)
403
- assert_not_nil author1
404
- assert_not_nil author2
405
-
406
- # make sure the association is loaded
407
- post.author
408
-
409
- # set the association by id, directly
410
- post.author_id = author2.id
411
-
412
- # save and reload
413
- post.save!
414
- post.reload
415
-
416
- # the author id of the post should be the id we set
417
- assert_equal post.author_id, author2.id
418
- end
419
-
420
- def test_cant_save_readonly_association
421
- assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_client).readonly_firm.save! }
422
- assert companies(:first_client).readonly_firm.readonly?
423
- end
424
-
425
- def test_polymorphic_assignment_foreign_type_field_updating
426
- # should update when assigning a saved record
427
- sponsor = Sponsor.new
428
- member = Member.create
429
- sponsor.sponsorable = member
430
- assert_equal "Member", sponsor.sponsorable_type
431
-
432
- # should update when assigning a new record
433
- sponsor = Sponsor.new
434
- member = Member.new
435
- sponsor.sponsorable = member
436
- assert_equal "Member", sponsor.sponsorable_type
437
- end
438
-
439
- def test_polymorphic_assignment_with_primary_key_foreign_type_field_updating
440
- # should update when assigning a saved record
441
- essay = Essay.new
442
- writer = Author.create(:name => "David")
443
- essay.writer = writer
444
- assert_equal "Author", essay.writer_type
445
-
446
- # should update when assigning a new record
447
- essay = Essay.new
448
- writer = Author.new
449
- essay.writer = writer
450
- assert_equal "Author", essay.writer_type
451
- end
452
-
453
- def test_polymorphic_assignment_updates_foreign_id_field_for_new_and_saved_records
454
- sponsor = Sponsor.new
455
- saved_member = Member.create
456
- new_member = Member.new
457
-
458
- sponsor.sponsorable = saved_member
459
- assert_equal saved_member.id, sponsor.sponsorable_id
460
-
461
- sponsor.sponsorable = new_member
462
- assert_nil sponsor.sponsorable_id
463
- end
464
-
465
- def test_assignment_updates_foreign_id_field_for_new_and_saved_records
466
- client = Client.new
467
- saved_firm = Firm.create :name => "Saved"
468
- new_firm = Firm.new
469
-
470
- client.firm = saved_firm
471
- assert_equal saved_firm.id, client.client_of
472
-
473
- client.firm = new_firm
474
- assert_nil client.client_of
475
- end
476
-
477
- def test_polymorphic_assignment_with_primary_key_updates_foreign_id_field_for_new_and_saved_records
478
- essay = Essay.new
479
- saved_writer = Author.create(:name => "David")
480
- new_writer = Author.new
481
-
482
- essay.writer = saved_writer
483
- assert_equal saved_writer.name, essay.writer_id
484
-
485
- essay.writer = new_writer
486
- assert_nil essay.writer_id
487
- end
488
-
489
- def test_belongs_to_proxy_should_not_respond_to_private_methods
490
- assert_raise(NoMethodError) { companies(:first_firm).private_method }
491
- assert_raise(NoMethodError) { companies(:second_client).firm.private_method }
492
- end
493
-
494
- def test_belongs_to_proxy_should_respond_to_private_methods_via_send
495
- companies(:first_firm).send(:private_method)
496
- companies(:second_client).firm.send(:private_method)
497
- end
498
-
499
- def test_save_of_record_with_loaded_belongs_to
500
- @account = companies(:first_firm).account
501
-
502
- assert_nothing_raised do
503
- Account.find(@account.id).save!
504
- Account.find(@account.id, :include => :firm).save!
505
- end
506
-
507
- @account.firm.delete
508
-
509
- assert_nothing_raised do
510
- Account.find(@account.id).save!
511
- Account.find(@account.id, :include => :firm).save!
512
- end
513
- end
514
-
515
- def test_dependent_delete_and_destroy_with_belongs_to
516
- author_address = author_addresses(:david_address)
517
- author_address_extra = author_addresses(:david_address_extra)
518
- assert_equal [], AuthorAddress.destroyed_author_address_ids
519
-
520
- assert_difference "AuthorAddress.count", -2 do
521
- authors(:david).destroy
522
- end
523
-
524
- assert_equal [], AuthorAddress.find_all_by_id([author_address.id, author_address_extra.id])
525
- assert_equal [author_address.id], AuthorAddress.destroyed_author_address_ids
526
- end
527
-
528
- def test_invalid_belongs_to_dependent_option_nullify_raises_exception
529
- assert_raise ArgumentError do
530
- Author.belongs_to :special_author_address, :dependent => :nullify
531
- end
532
- end
533
-
534
- def test_invalid_belongs_to_dependent_option_restrict_raises_exception
535
- assert_raise ArgumentError do
536
- Author.belongs_to :special_author_address, :dependent => :restrict
537
- end
538
- end
539
-
540
- def test_attributes_are_being_set_when_initialized_from_belongs_to_association_with_where_clause
541
- new_firm = accounts(:signals37).build_firm(:name => 'Apple')
542
- assert_equal new_firm.name, "Apple"
543
- end
544
-
545
- def test_reassigning_the_parent_id_updates_the_object
546
- client = companies(:second_client)
547
-
548
- client.firm
549
- client.firm_with_condition
550
- firm_proxy = client.send(:association_instance_get, :firm)
551
- firm_with_condition_proxy = client.send(:association_instance_get, :firm_with_condition)
552
-
553
- assert !firm_proxy.stale_target?
554
- assert !firm_with_condition_proxy.stale_target?
555
- assert_equal companies(:first_firm), client.firm
556
- assert_equal companies(:first_firm), client.firm_with_condition
557
-
558
- client.client_of = companies(:another_firm).id
559
-
560
- assert firm_proxy.stale_target?
561
- assert firm_with_condition_proxy.stale_target?
562
- assert_equal companies(:another_firm), client.firm
563
- assert_equal companies(:another_firm), client.firm_with_condition
564
- end
565
-
566
- def test_polymorphic_reassignment_of_associated_id_updates_the_object
567
- sponsor = sponsors(:moustache_club_sponsor_for_groucho)
568
-
569
- sponsor.sponsorable
570
- proxy = sponsor.send(:association_instance_get, :sponsorable)
571
-
572
- assert !proxy.stale_target?
573
- assert_equal members(:groucho), sponsor.sponsorable
574
-
575
- sponsor.sponsorable_id = members(:some_other_guy).id
576
-
577
- assert proxy.stale_target?
578
- assert_equal members(:some_other_guy), sponsor.sponsorable
579
- end
580
-
581
- def test_polymorphic_reassignment_of_associated_type_updates_the_object
582
- sponsor = sponsors(:moustache_club_sponsor_for_groucho)
583
-
584
- sponsor.sponsorable
585
- proxy = sponsor.send(:association_instance_get, :sponsorable)
586
-
587
- assert !proxy.stale_target?
588
- assert_equal members(:groucho), sponsor.sponsorable
589
-
590
- sponsor.sponsorable_type = 'Firm'
591
-
592
- assert proxy.stale_target?
593
- assert_equal companies(:first_firm), sponsor.sponsorable
594
- end
595
-
596
- def test_reloading_association_with_key_change
597
- client = companies(:second_client)
598
- firm = client.association(:firm)
599
-
600
- client.firm = companies(:another_firm)
601
- firm.reload
602
- assert_equal companies(:another_firm), firm.target
603
-
604
- client.client_of = companies(:first_firm).id
605
- firm.reload
606
- assert_equal companies(:first_firm), firm.target
607
- end
608
-
609
- def test_polymorphic_counter_cache
610
- tagging = taggings(:welcome_general)
611
- post = posts(:welcome)
612
- comment = comments(:greetings)
613
-
614
- assert_difference lambda { post.reload.taggings_count }, -1 do
615
- assert_difference 'comment.reload.taggings_count', +1 do
616
- tagging.taggable = comment
617
- end
618
- end
619
- end
620
-
621
- def test_polymorphic_with_custom_foreign_type
622
- sponsor = sponsors(:moustache_club_sponsor_for_groucho)
623
- groucho = members(:groucho)
624
- other = members(:some_other_guy)
625
-
626
- assert_equal groucho, sponsor.sponsorable
627
- assert_equal groucho, sponsor.thing
628
-
629
- sponsor.thing = other
630
-
631
- assert_equal other, sponsor.sponsorable
632
- assert_equal other, sponsor.thing
633
-
634
- sponsor.sponsorable = groucho
635
-
636
- assert_equal groucho, sponsor.sponsorable
637
- assert_equal groucho, sponsor.thing
638
- end
639
-
640
- def test_build_with_conditions
641
- client = companies(:second_client)
642
- firm = client.build_bob_firm
643
-
644
- assert_equal "Bob", firm.name
645
- end
646
-
647
- def test_create_with_conditions
648
- client = companies(:second_client)
649
- firm = client.create_bob_firm
650
-
651
- assert_equal "Bob", firm.name
652
- end
653
-
654
- def test_create_bang_with_conditions
655
- client = companies(:second_client)
656
- firm = client.create_bob_firm!
657
-
658
- assert_equal "Bob", firm.name
659
- end
660
-
661
- def test_build_with_block
662
- client = Client.create(:name => 'Client Company')
663
-
664
- firm = client.build_firm{ |f| f.name = 'Agency Company' }
665
- assert_equal 'Agency Company', firm.name
666
- end
667
-
668
- def test_create_with_block
669
- client = Client.create(:name => 'Client Company')
670
-
671
- firm = client.create_firm{ |f| f.name = 'Agency Company' }
672
- assert_equal 'Agency Company', firm.name
673
- end
674
-
675
- def test_create_bang_with_block
676
- client = Client.create(:name => 'Client Company')
677
-
678
- firm = client.create_firm!{ |f| f.name = 'Agency Company' }
679
- assert_equal 'Agency Company', firm.name
680
- end
681
-
682
- def test_should_set_foreign_key_on_create_association
683
- client = Client.create! :name => "fuu"
684
-
685
- firm = client.create_firm :name => "baa"
686
- assert_equal firm.id, client.client_of
687
- end
688
-
689
- def test_should_set_foreign_key_on_create_association!
690
- client = Client.create! :name => "fuu"
691
-
692
- firm = client.create_firm! :name => "baa"
693
- assert_equal firm.id, client.client_of
694
- end
695
-
696
- def test_self_referential_belongs_to_with_counter_cache_assigning_nil
697
- comment = Comment.create! :post => posts(:thinking), :body => "fuu"
698
- comment.parent = nil
699
- comment.save!
700
-
701
- assert_equal nil, comment.reload.parent
702
- assert_equal 0, comments(:greetings).reload.children_count
703
- end
704
-
705
- def test_polymorphic_with_custom_primary_key
706
- toy = Toy.create!
707
- sponsor = Sponsor.create!(:sponsorable => toy)
708
-
709
- assert_equal toy, sponsor.reload.sponsorable
710
- end
711
- end
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/post'
9
+ require 'models/author'
10
+ require 'models/tag'
11
+ require 'models/tagging'
12
+ require 'models/comment'
13
+ require 'models/sponsor'
14
+ require 'models/member'
15
+ require 'models/essay'
16
+ require 'models/toy'
17
+
18
+ class BelongsToAssociationsTest < ActiveRecord::TestCase
19
+ fixtures :accounts, :companies, :developers, :projects, :topics,
20
+ :developers_projects, :computers, :authors, :author_addresses,
21
+ :posts, :tags, :taggings, :comments, :sponsors, :members
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_not_nil Client.find(3).firm, "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.joins(:firm_with_primary_key).to_sql
36
+ if current_adapter?(:MysqlAdapter) or current_adapter?(:Mysql2Adapter)
37
+ assert_no_match(/`firm_with_primary_keys_companies`\.`id`/, sql)
38
+ assert_match(/`firm_with_primary_keys_companies`\.`name`/, sql)
39
+ elsif current_adapter?(:OracleAdapter)
40
+ # on Oracle aliases are truncated to 30 characters and are quoted in uppercase
41
+ assert_no_match(/"firm_with_primary_keys_compani"\."id"/i, sql)
42
+ assert_match(/"firm_with_primary_keys_compani"\."name"/i, sql)
43
+ elsif current_adapter?(:IBM_DBAdapter)
44
+ # Quoting of column names is not necessary for IBM_DB
45
+ assert_no_match(/firm_with_primary_keys_companies\.id/i, sql)
46
+ assert_match(/firm_with_primary_keys_companies\.name/i, sql)
47
+ else
48
+ assert_no_match(/"firm_with_primary_keys_companies"\."id"/, sql)
49
+ assert_match(/"firm_with_primary_keys_companies"\."name"/, sql)
50
+ end
51
+ end
52
+
53
+ def test_proxy_assignment
54
+ account = Account.find(1)
55
+ assert_nothing_raised { account.firm = account.firm }
56
+ end
57
+
58
+ def test_type_mismatch
59
+ assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = 1 }
60
+ assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = Project.find(1) }
61
+ end
62
+
63
+ def test_natural_assignment
64
+ apple = Firm.create("name" => "Apple")
65
+ citibank = Account.create("credit_limit" => 10)
66
+ citibank.firm = apple
67
+ assert_equal apple.id, citibank.firm_id
68
+ end
69
+
70
+ def test_natural_assignment_with_primary_key
71
+ apple = Firm.create("name" => "Apple")
72
+ citibank = Client.create("name" => "Primary key client")
73
+ citibank.firm_with_primary_key = apple
74
+ assert_equal apple.name, citibank.firm_name
75
+ end
76
+
77
+ def test_eager_loading_with_primary_key
78
+ Firm.create("name" => "Apple")
79
+ Client.create("name" => "Citibank", :firm_name => "Apple")
80
+ citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key)
81
+ assert citibank_result.association_cache.key?(:firm_with_primary_key)
82
+ end
83
+
84
+ def test_eager_loading_with_primary_key_as_symbol
85
+ Firm.create("name" => "Apple")
86
+ Client.create("name" => "Citibank", :firm_name => "Apple")
87
+ citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key_symbols)
88
+ assert citibank_result.association_cache.key?(:firm_with_primary_key_symbols)
89
+ end
90
+
91
+ def test_creating_the_belonging_object
92
+ citibank = Account.create("credit_limit" => 10)
93
+ apple = citibank.create_firm("name" => "Apple")
94
+ assert_equal apple, citibank.firm
95
+ citibank.save
96
+ citibank.reload
97
+ assert_equal apple, citibank.firm
98
+ end
99
+
100
+ def test_creating_the_belonging_object_with_primary_key
101
+ client = Client.create(:name => "Primary key client")
102
+ apple = client.create_firm_with_primary_key("name" => "Apple")
103
+ assert_equal apple, client.firm_with_primary_key
104
+ client.save
105
+ client.reload
106
+ assert_equal apple, client.firm_with_primary_key
107
+ end
108
+
109
+ def test_building_the_belonging_object
110
+ citibank = Account.create("credit_limit" => 10)
111
+ apple = citibank.build_firm("name" => "Apple")
112
+ citibank.save
113
+ assert_equal apple.id, citibank.firm_id
114
+ end
115
+
116
+ def test_building_the_belonging_object_with_primary_key
117
+ client = Client.create(:name => "Primary key client")
118
+ apple = client.build_firm_with_primary_key("name" => "Apple")
119
+ client.save
120
+ assert_equal apple.name, client.firm_name
121
+ end
122
+
123
+ def test_create!
124
+ client = Client.create!(:name => "Jimmy")
125
+ account = client.create_account!(:credit_limit => 10)
126
+ assert_equal account, client.account
127
+ assert account.persisted?
128
+ client.save
129
+ client.reload
130
+ assert_equal account, client.account
131
+ end
132
+
133
+ def test_failing_create!
134
+ client = Client.create!(:name => "Jimmy")
135
+ assert_raise(ActiveRecord::RecordInvalid) { client.create_account! }
136
+ assert_not_nil client.account
137
+ assert client.account.new_record?
138
+ end
139
+
140
+ def test_natural_assignment_to_nil
141
+ client = Client.find(3)
142
+ client.firm = nil
143
+ client.save
144
+ assert_nil client.firm(true)
145
+ assert_nil client.client_of
146
+ end
147
+
148
+ def test_natural_assignment_to_nil_with_primary_key
149
+ client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name)
150
+ client.firm_with_primary_key = nil
151
+ client.save
152
+ assert_nil client.firm_with_primary_key(true)
153
+ assert_nil client.client_of
154
+ end
155
+
156
+ def test_with_different_class_name
157
+ assert_equal Company.find(1).name, Company.find(3).firm_with_other_name.name
158
+ assert_not_nil Company.find(3).firm_with_other_name, "Microsoft should have a firm"
159
+ end
160
+
161
+ def test_with_condition
162
+ assert_equal Company.find(1).name, Company.find(3).firm_with_condition.name
163
+ assert_not_nil Company.find(3).firm_with_condition, "Microsoft should have a firm"
164
+ end
165
+
166
+ def test_polymorphic_association_class
167
+ sponsor = Sponsor.new
168
+ assert_nil sponsor.association(:sponsorable).send(:klass)
169
+
170
+ sponsor.sponsorable_type = '' # the column doesn't have to be declared NOT NULL
171
+ assert_nil sponsor.association(:sponsorable).send(:klass)
172
+
173
+ sponsor.sponsorable = Member.new :name => "Bert"
174
+ assert_equal Member, sponsor.association(:sponsorable).send(:klass)
175
+ end
176
+
177
+ def test_with_polymorphic_and_condition
178
+ sponsor = Sponsor.create
179
+ member = Member.create :name => "Bert"
180
+ sponsor.sponsorable = member
181
+
182
+ assert_equal member, sponsor.sponsorable
183
+ assert_nil sponsor.sponsorable_with_conditions
184
+ end
185
+
186
+ def test_with_select
187
+ assert_equal Company.find(2).firm_with_select.attributes.size, 1
188
+ assert_equal Company.find(2, :include => :firm_with_select ).firm_with_select.attributes.size, 1
189
+ end
190
+
191
+ def test_belongs_to_counter
192
+ debate = Topic.create("title" => "debate")
193
+ assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
194
+
195
+ trash = debate.replies.create("title" => "blah!", "content" => "world around!")
196
+ assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created"
197
+
198
+ trash.destroy
199
+ assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted"
200
+ end
201
+
202
+ def test_belongs_to_counter_with_assigning_nil
203
+ p = Post.find(1)
204
+ c = Comment.find(1)
205
+
206
+ assert_equal p.id, c.post_id
207
+ assert_equal 2, Post.find(p.id).comments.size
208
+
209
+ c.post = nil
210
+
211
+ assert_equal 1, Post.find(p.id).comments.size
212
+ end
213
+
214
+ def test_belongs_to_with_primary_key_counter
215
+ debate = Topic.create("title" => "debate")
216
+ debate2 = Topic.create("title" => "debate2")
217
+ reply = Reply.create("title" => "blah!", "content" => "world around!", "parent_title" => "debate")
218
+
219
+ assert_equal 1, debate.reload.replies_count
220
+ assert_equal 0, debate2.reload.replies_count
221
+
222
+ reply.topic_with_primary_key = debate2
223
+
224
+ assert_equal 0, debate.reload.replies_count
225
+ assert_equal 1, debate2.reload.replies_count
226
+
227
+ reply.topic_with_primary_key = nil
228
+
229
+ assert_equal 0, debate.reload.replies_count
230
+ assert_equal 0, debate2.reload.replies_count
231
+ end
232
+
233
+ def test_belongs_to_counter_with_reassigning
234
+ t1 = Topic.create("title" => "t1")
235
+ t2 = Topic.create("title" => "t2")
236
+ r1 = Reply.new("title" => "r1", "content" => "r1")
237
+ r1.topic = t1
238
+
239
+ assert r1.save
240
+ assert_equal 1, Topic.find(t1.id).replies.size
241
+ assert_equal 0, Topic.find(t2.id).replies.size
242
+
243
+ r1.topic = Topic.find(t2.id)
244
+
245
+ assert_no_queries do
246
+ r1.topic = t2
247
+ end
248
+
249
+ assert r1.save
250
+ assert_equal 0, Topic.find(t1.id).replies.size
251
+ assert_equal 1, Topic.find(t2.id).replies.size
252
+
253
+ r1.topic = nil
254
+
255
+ assert_equal 0, Topic.find(t1.id).replies.size
256
+ assert_equal 0, Topic.find(t2.id).replies.size
257
+
258
+ r1.topic = t1
259
+
260
+ assert_equal 1, Topic.find(t1.id).replies.size
261
+ assert_equal 0, Topic.find(t2.id).replies.size
262
+
263
+ r1.destroy
264
+
265
+ assert_equal 0, Topic.find(t1.id).replies.size
266
+ assert_equal 0, Topic.find(t2.id).replies.size
267
+ end
268
+
269
+ def test_belongs_to_reassign_with_namespaced_models_and_counters
270
+ t1 = Web::Topic.create("title" => "t1")
271
+ t2 = Web::Topic.create("title" => "t2")
272
+ r1 = Web::Reply.new("title" => "r1", "content" => "r1")
273
+ r1.topic = t1
274
+
275
+ assert r1.save
276
+ assert_equal 1, Web::Topic.find(t1.id).replies.size
277
+ assert_equal 0, Web::Topic.find(t2.id).replies.size
278
+
279
+ r1.topic = Web::Topic.find(t2.id)
280
+
281
+ assert r1.save
282
+ assert_equal 0, Web::Topic.find(t1.id).replies.size
283
+ assert_equal 1, Web::Topic.find(t2.id).replies.size
284
+ end
285
+
286
+ def test_belongs_to_counter_after_save
287
+ topic = Topic.create!(:title => "monday night")
288
+ topic.replies.create!(:title => "re: monday night", :content => "football")
289
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
290
+
291
+ topic.save!
292
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
293
+ end
294
+
295
+ def test_belongs_to_counter_after_update_attributes
296
+ topic = Topic.create!(:title => "37s")
297
+ topic.replies.create!(:title => "re: 37s", :content => "rails")
298
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
299
+
300
+ topic.update_attributes(:title => "37signals")
301
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
302
+ end
303
+
304
+ def test_belongs_to_counter_when_update_column
305
+ topic = Topic.create!(:title => "37s")
306
+ topic.replies.create!(:title => "re: 37s", :content => "rails")
307
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
308
+
309
+ topic.update_column(:content, "rails is wonderfull")
310
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
311
+ end
312
+
313
+ def test_assignment_before_child_saved
314
+ final_cut = Client.new("name" => "Final Cut")
315
+ firm = Firm.find(1)
316
+ final_cut.firm = firm
317
+ assert !final_cut.persisted?
318
+ assert final_cut.save
319
+ assert final_cut.persisted?
320
+ assert firm.persisted?
321
+ assert_equal firm, final_cut.firm
322
+ assert_equal firm, final_cut.firm(true)
323
+ end
324
+
325
+ def test_assignment_before_child_saved_with_primary_key
326
+ final_cut = Client.new("name" => "Final Cut")
327
+ firm = Firm.find(1)
328
+ final_cut.firm_with_primary_key = firm
329
+ assert !final_cut.persisted?
330
+ assert final_cut.save
331
+ assert final_cut.persisted?
332
+ assert firm.persisted?
333
+ assert_equal firm, final_cut.firm_with_primary_key
334
+ assert_equal firm, final_cut.firm_with_primary_key(true)
335
+ end
336
+
337
+ def test_new_record_with_foreign_key_but_no_object
338
+ c = Client.new("firm_id" => 1)
339
+ # sometimes tests on Oracle fail if ORDER BY is not provided therefore add always :order with :first
340
+ assert_equal Firm.find(:first, :order => "id"), c.firm_with_basic_id
341
+ end
342
+
343
+ def test_setting_foreign_key_after_nil_target_loaded
344
+ client = Client.new
345
+ client.firm_with_basic_id
346
+ client.firm_id = 1
347
+
348
+ assert_equal companies(:first_firm), client.firm_with_basic_id
349
+ end
350
+
351
+ def test_polymorphic_setting_foreign_key_after_nil_target_loaded
352
+ sponsor = Sponsor.new
353
+ sponsor.sponsorable
354
+ sponsor.sponsorable_id = 1
355
+ sponsor.sponsorable_type = "Member"
356
+
357
+ assert_equal members(:groucho), sponsor.sponsorable
358
+ end
359
+
360
+ def test_dont_find_target_when_foreign_key_is_null
361
+ tagging = taggings(:thinking_general)
362
+ queries = assert_sql { tagging.super_tag }
363
+ assert_equal 0, queries.length
364
+ end
365
+
366
+ def test_field_name_same_as_foreign_key
367
+ computer = Computer.find(1)
368
+ assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # '
369
+ end
370
+
371
+ def test_counter_cache
372
+ topic = Topic.create :title => "Zoom-zoom-zoom"
373
+ assert_equal 0, topic[:replies_count]
374
+
375
+ reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
376
+ reply.topic = topic
377
+
378
+ assert_equal 1, topic.reload[:replies_count]
379
+ assert_equal 1, topic.replies.size
380
+
381
+ topic[:replies_count] = 15
382
+ assert_equal 15, topic.replies.size
383
+ end
384
+
385
+ def test_custom_counter_cache
386
+ reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
387
+ assert_equal 0, reply[:replies_count]
388
+
389
+ silly = SillyReply.create(:title => "gaga", :content => "boo-boo")
390
+ silly.reply = reply
391
+
392
+ assert_equal 1, reply.reload[:replies_count]
393
+ assert_equal 1, reply.replies.size
394
+
395
+ reply[:replies_count] = 17
396
+ assert_equal 17, reply.replies.size
397
+ end
398
+
399
+ def test_association_assignment_sticks
400
+ post = Post.find(:first)
401
+
402
+ author1, author2 = Author.find(:all, :limit => 2)
403
+ assert_not_nil author1
404
+ assert_not_nil author2
405
+
406
+ # make sure the association is loaded
407
+ post.author
408
+
409
+ # set the association by id, directly
410
+ post.author_id = author2.id
411
+
412
+ # save and reload
413
+ post.save!
414
+ post.reload
415
+
416
+ # the author id of the post should be the id we set
417
+ assert_equal post.author_id, author2.id
418
+ end
419
+
420
+ def test_cant_save_readonly_association
421
+ assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_client).readonly_firm.save! }
422
+ assert companies(:first_client).readonly_firm.readonly?
423
+ end
424
+
425
+ def test_polymorphic_assignment_foreign_type_field_updating
426
+ # should update when assigning a saved record
427
+ sponsor = Sponsor.new
428
+ member = Member.create
429
+ sponsor.sponsorable = member
430
+ assert_equal "Member", sponsor.sponsorable_type
431
+
432
+ # should update when assigning a new record
433
+ sponsor = Sponsor.new
434
+ member = Member.new
435
+ sponsor.sponsorable = member
436
+ assert_equal "Member", sponsor.sponsorable_type
437
+ end
438
+
439
+ def test_polymorphic_assignment_with_primary_key_foreign_type_field_updating
440
+ # should update when assigning a saved record
441
+ essay = Essay.new
442
+ writer = Author.create(:name => "David")
443
+ essay.writer = writer
444
+ assert_equal "Author", essay.writer_type
445
+
446
+ # should update when assigning a new record
447
+ essay = Essay.new
448
+ writer = Author.new
449
+ essay.writer = writer
450
+ assert_equal "Author", essay.writer_type
451
+ end
452
+
453
+ def test_polymorphic_assignment_updates_foreign_id_field_for_new_and_saved_records
454
+ sponsor = Sponsor.new
455
+ saved_member = Member.create
456
+ new_member = Member.new
457
+
458
+ sponsor.sponsorable = saved_member
459
+ assert_equal saved_member.id, sponsor.sponsorable_id
460
+
461
+ sponsor.sponsorable = new_member
462
+ assert_nil sponsor.sponsorable_id
463
+ end
464
+
465
+ def test_assignment_updates_foreign_id_field_for_new_and_saved_records
466
+ client = Client.new
467
+ saved_firm = Firm.create :name => "Saved"
468
+ new_firm = Firm.new
469
+
470
+ client.firm = saved_firm
471
+ assert_equal saved_firm.id, client.client_of
472
+
473
+ client.firm = new_firm
474
+ assert_nil client.client_of
475
+ end
476
+
477
+ def test_polymorphic_assignment_with_primary_key_updates_foreign_id_field_for_new_and_saved_records
478
+ essay = Essay.new
479
+ saved_writer = Author.create(:name => "David")
480
+ new_writer = Author.new
481
+
482
+ essay.writer = saved_writer
483
+ assert_equal saved_writer.name, essay.writer_id
484
+
485
+ essay.writer = new_writer
486
+ assert_nil essay.writer_id
487
+ end
488
+
489
+ def test_belongs_to_proxy_should_not_respond_to_private_methods
490
+ assert_raise(NoMethodError) { companies(:first_firm).private_method }
491
+ assert_raise(NoMethodError) { companies(:second_client).firm.private_method }
492
+ end
493
+
494
+ def test_belongs_to_proxy_should_respond_to_private_methods_via_send
495
+ companies(:first_firm).send(:private_method)
496
+ companies(:second_client).firm.send(:private_method)
497
+ end
498
+
499
+ def test_save_of_record_with_loaded_belongs_to
500
+ @account = companies(:first_firm).account
501
+
502
+ assert_nothing_raised do
503
+ Account.find(@account.id).save!
504
+ Account.find(@account.id, :include => :firm).save!
505
+ end
506
+
507
+ @account.firm.delete
508
+
509
+ assert_nothing_raised do
510
+ Account.find(@account.id).save!
511
+ Account.find(@account.id, :include => :firm).save!
512
+ end
513
+ end
514
+
515
+ def test_dependent_delete_and_destroy_with_belongs_to
516
+ author_address = author_addresses(:david_address)
517
+ author_address_extra = author_addresses(:david_address_extra)
518
+ assert_equal [], AuthorAddress.destroyed_author_address_ids
519
+
520
+ assert_difference "AuthorAddress.count", -2 do
521
+ authors(:david).destroy
522
+ end
523
+
524
+ assert_equal [], AuthorAddress.find_all_by_id([author_address.id, author_address_extra.id])
525
+ assert_equal [author_address.id], AuthorAddress.destroyed_author_address_ids
526
+ end
527
+
528
+ def test_invalid_belongs_to_dependent_option_nullify_raises_exception
529
+ assert_raise ArgumentError do
530
+ Author.belongs_to :special_author_address, :dependent => :nullify
531
+ end
532
+ end
533
+
534
+ def test_invalid_belongs_to_dependent_option_restrict_raises_exception
535
+ assert_raise ArgumentError do
536
+ Author.belongs_to :special_author_address, :dependent => :restrict
537
+ end
538
+ end
539
+
540
+ def test_attributes_are_being_set_when_initialized_from_belongs_to_association_with_where_clause
541
+ new_firm = accounts(:signals37).build_firm(:name => 'Apple')
542
+ assert_equal new_firm.name, "Apple"
543
+ end
544
+
545
+ def test_reassigning_the_parent_id_updates_the_object
546
+ client = companies(:second_client)
547
+
548
+ client.firm
549
+ client.firm_with_condition
550
+ firm_proxy = client.send(:association_instance_get, :firm)
551
+ firm_with_condition_proxy = client.send(:association_instance_get, :firm_with_condition)
552
+
553
+ assert !firm_proxy.stale_target?
554
+ assert !firm_with_condition_proxy.stale_target?
555
+ assert_equal companies(:first_firm), client.firm
556
+ assert_equal companies(:first_firm), client.firm_with_condition
557
+
558
+ client.client_of = companies(:another_firm).id
559
+
560
+ assert firm_proxy.stale_target?
561
+ assert firm_with_condition_proxy.stale_target?
562
+ assert_equal companies(:another_firm), client.firm
563
+ assert_equal companies(:another_firm), client.firm_with_condition
564
+ end
565
+
566
+ def test_polymorphic_reassignment_of_associated_id_updates_the_object
567
+ sponsor = sponsors(:moustache_club_sponsor_for_groucho)
568
+
569
+ sponsor.sponsorable
570
+ proxy = sponsor.send(:association_instance_get, :sponsorable)
571
+
572
+ assert !proxy.stale_target?
573
+ assert_equal members(:groucho), sponsor.sponsorable
574
+
575
+ sponsor.sponsorable_id = members(:some_other_guy).id
576
+
577
+ assert proxy.stale_target?
578
+ assert_equal members(:some_other_guy), sponsor.sponsorable
579
+ end
580
+
581
+ def test_polymorphic_reassignment_of_associated_type_updates_the_object
582
+ sponsor = sponsors(:moustache_club_sponsor_for_groucho)
583
+
584
+ sponsor.sponsorable
585
+ proxy = sponsor.send(:association_instance_get, :sponsorable)
586
+
587
+ assert !proxy.stale_target?
588
+ assert_equal members(:groucho), sponsor.sponsorable
589
+
590
+ sponsor.sponsorable_type = 'Firm'
591
+
592
+ assert proxy.stale_target?
593
+ assert_equal companies(:first_firm), sponsor.sponsorable
594
+ end
595
+
596
+ def test_reloading_association_with_key_change
597
+ client = companies(:second_client)
598
+ firm = client.association(:firm)
599
+
600
+ client.firm = companies(:another_firm)
601
+ firm.reload
602
+ assert_equal companies(:another_firm), firm.target
603
+
604
+ client.client_of = companies(:first_firm).id
605
+ firm.reload
606
+ assert_equal companies(:first_firm), firm.target
607
+ end
608
+
609
+ def test_polymorphic_counter_cache
610
+ tagging = taggings(:welcome_general)
611
+ post = posts(:welcome)
612
+ comment = comments(:greetings)
613
+
614
+ assert_difference lambda { post.reload.taggings_count }, -1 do
615
+ assert_difference 'comment.reload.taggings_count', +1 do
616
+ tagging.taggable = comment
617
+ end
618
+ end
619
+ end
620
+
621
+ def test_polymorphic_with_custom_foreign_type
622
+ sponsor = sponsors(:moustache_club_sponsor_for_groucho)
623
+ groucho = members(:groucho)
624
+ other = members(:some_other_guy)
625
+
626
+ assert_equal groucho, sponsor.sponsorable
627
+ assert_equal groucho, sponsor.thing
628
+
629
+ sponsor.thing = other
630
+
631
+ assert_equal other, sponsor.sponsorable
632
+ assert_equal other, sponsor.thing
633
+
634
+ sponsor.sponsorable = groucho
635
+
636
+ assert_equal groucho, sponsor.sponsorable
637
+ assert_equal groucho, sponsor.thing
638
+ end
639
+
640
+ def test_build_with_conditions
641
+ client = companies(:second_client)
642
+ firm = client.build_bob_firm
643
+
644
+ assert_equal "Bob", firm.name
645
+ end
646
+
647
+ def test_create_with_conditions
648
+ client = companies(:second_client)
649
+ firm = client.create_bob_firm
650
+
651
+ assert_equal "Bob", firm.name
652
+ end
653
+
654
+ def test_create_bang_with_conditions
655
+ client = companies(:second_client)
656
+ firm = client.create_bob_firm!
657
+
658
+ assert_equal "Bob", firm.name
659
+ end
660
+
661
+ def test_build_with_block
662
+ client = Client.create(:name => 'Client Company')
663
+
664
+ firm = client.build_firm{ |f| f.name = 'Agency Company' }
665
+ assert_equal 'Agency Company', firm.name
666
+ end
667
+
668
+ def test_create_with_block
669
+ client = Client.create(:name => 'Client Company')
670
+
671
+ firm = client.create_firm{ |f| f.name = 'Agency Company' }
672
+ assert_equal 'Agency Company', firm.name
673
+ end
674
+
675
+ def test_create_bang_with_block
676
+ client = Client.create(:name => 'Client Company')
677
+
678
+ firm = client.create_firm!{ |f| f.name = 'Agency Company' }
679
+ assert_equal 'Agency Company', firm.name
680
+ end
681
+
682
+ def test_should_set_foreign_key_on_create_association
683
+ client = Client.create! :name => "fuu"
684
+
685
+ firm = client.create_firm :name => "baa"
686
+ assert_equal firm.id, client.client_of
687
+ end
688
+
689
+ def test_should_set_foreign_key_on_create_association!
690
+ client = Client.create! :name => "fuu"
691
+
692
+ firm = client.create_firm! :name => "baa"
693
+ assert_equal firm.id, client.client_of
694
+ end
695
+
696
+ def test_self_referential_belongs_to_with_counter_cache_assigning_nil
697
+ comment = Comment.create! :post => posts(:thinking), :body => "fuu"
698
+ comment.parent = nil
699
+ comment.save!
700
+
701
+ assert_equal nil, comment.reload.parent
702
+ assert_equal 0, comments(:greetings).reload.children_count
703
+ end
704
+
705
+ def test_polymorphic_with_custom_primary_key
706
+ toy = Toy.create!
707
+ sponsor = Sponsor.create!(:sponsorable => toy)
708
+
709
+ assert_equal toy, sponsor.reload.sponsorable
710
+ end
711
+ end