composite_primary_keys 12.0.2 → 12.0.10

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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +880 -841
  3. data/README.rdoc +180 -179
  4. data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -0
  5. data/lib/composite_primary_keys/arel/sqlserver.rb +1 -3
  6. data/lib/composite_primary_keys/associations/association_scope.rb +68 -68
  7. data/lib/composite_primary_keys/associations/join_dependency.rb +103 -103
  8. data/lib/composite_primary_keys/associations/through_association.rb +2 -1
  9. data/lib/composite_primary_keys/attribute_methods/primary_key.rb +13 -0
  10. data/lib/composite_primary_keys/attribute_methods/read.rb +30 -30
  11. data/lib/composite_primary_keys/attribute_methods/write.rb +35 -35
  12. data/lib/composite_primary_keys/attribute_methods.rb +9 -9
  13. data/lib/composite_primary_keys/base.rb +141 -130
  14. data/lib/composite_primary_keys/composite_arrays.rb +0 -8
  15. data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +37 -17
  16. data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +44 -23
  17. data/lib/composite_primary_keys/core.rb +48 -48
  18. data/lib/composite_primary_keys/persistence.rb +82 -81
  19. data/lib/composite_primary_keys/reflection.rb +29 -29
  20. data/lib/composite_primary_keys/relation/batches.rb +1 -1
  21. data/lib/composite_primary_keys/relation/calculations.rb +81 -81
  22. data/lib/composite_primary_keys/relation/finder_methods.rb +235 -235
  23. data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +20 -20
  24. data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
  25. data/lib/composite_primary_keys/relation/where_clause.rb +23 -23
  26. data/lib/composite_primary_keys/relation.rb +193 -118
  27. data/lib/composite_primary_keys/version.rb +8 -8
  28. data/lib/composite_primary_keys.rb +117 -118
  29. data/test/abstract_unit.rb +114 -113
  30. data/test/connections/databases.ci.yml +22 -19
  31. data/test/fixtures/article.rb +4 -0
  32. data/test/fixtures/articles.yml +4 -3
  33. data/test/fixtures/comment.rb +1 -3
  34. data/test/fixtures/comments.yml +10 -9
  35. data/test/fixtures/db_definitions/db2-create-tables.sql +112 -126
  36. data/test/fixtures/db_definitions/db2-drop-tables.sql +17 -19
  37. data/test/fixtures/db_definitions/mysql.sql +180 -217
  38. data/test/fixtures/db_definitions/oracle.drop.sql +42 -48
  39. data/test/fixtures/db_definitions/oracle.sql +200 -236
  40. data/test/fixtures/db_definitions/postgresql.sql +183 -220
  41. data/test/fixtures/db_definitions/sqlite.sql +170 -206
  42. data/test/fixtures/db_definitions/sqlserver.sql +176 -212
  43. data/test/fixtures/department.rb +16 -11
  44. data/test/fixtures/departments.yml +15 -15
  45. data/test/fixtures/employees.yml +27 -27
  46. data/test/fixtures/readings.yml +2 -2
  47. data/test/fixtures/restaurants_suburbs.yml +11 -11
  48. data/test/fixtures/streets.yml +16 -16
  49. data/test/fixtures/suburbs.yml +14 -14
  50. data/test/fixtures/user.rb +11 -10
  51. data/test/test_associations.rb +358 -351
  52. data/test/test_attributes.rb +60 -60
  53. data/test/test_calculations.rb +42 -42
  54. data/test/test_create.rb +218 -183
  55. data/test/test_delete.rb +182 -179
  56. data/test/test_exists.rb +39 -39
  57. data/test/test_find.rb +164 -145
  58. data/test/test_habtm.rb +2 -2
  59. data/test/test_ids.rb +112 -116
  60. data/test/test_nested_attributes.rb +67 -124
  61. data/test/test_polymorphic.rb +29 -13
  62. data/test/test_preload.rb +4 -3
  63. data/test/test_serialize.rb +2 -2
  64. data/test/test_update.rb +96 -78
  65. metadata +4 -19
  66. data/test/fixtures/hack.rb +0 -5
  67. data/test/fixtures/hacks.yml +0 -3
  68. data/test/fixtures/pk_called_id.rb +0 -5
  69. data/test/fixtures/pk_called_ids.yml +0 -11
  70. data/test/fixtures/reference_code_using_composite_key_alias.rb +0 -8
  71. data/test/fixtures/reference_code_using_simple_key_alias.rb +0 -8
  72. data/test/fixtures/seat.rb +0 -5
  73. data/test/fixtures/seats.yml +0 -9
  74. data/test/fixtures/topic.rb +0 -6
  75. data/test/fixtures/topic_source.rb +0 -7
  76. data/test/test_aliases.rb +0 -18
  77. data/test/test_enum.rb +0 -21
  78. data/test/test_suite.rb +0 -35
@@ -1,61 +1,61 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestAttributes < ActiveSupport::TestCase
4
- fixtures :reference_types, :reference_codes, :products, :tariffs, :product_tariffs
5
-
6
- CLASSES = {
7
- :single => {
8
- :class => ReferenceType,
9
- :primary_keys => :reference_type_id,
10
- },
11
- :dual => {
12
- :class => ReferenceCode,
13
- :primary_keys => [:reference_type_id, :reference_code],
14
- },
15
- }
16
-
17
- def setup
18
- self.class.classes = CLASSES
19
- end
20
-
21
- def test_brackets
22
- testing_with do
23
- @first.attributes.each_pair do |attr_name, value|
24
- assert_equal value, @first[attr_name]
25
- end
26
- end
27
- end
28
-
29
- def test_brackets_primary_key
30
- testing_with do
31
- assert_equal(@first.id, @first[@primary_keys])
32
- assert_equal(@first.id, @first[@first.class.primary_key])
33
- end
34
- end
35
-
36
- def test_brackets_assignment
37
- testing_with do
38
- @first.attributes.each_pair do |attr_name, value|
39
- next if attr_name == @first.class.primary_key
40
- @first[attr_name]= !value.nil? ? value * 2 : '1'
41
- assert_equal !value.nil? ? value * 2 : '1', @first[attr_name]
42
- end
43
- end
44
- end
45
-
46
- def test_brackets_foreign_key_assignment
47
- tarrif = tariffs(:flat)
48
- product_tariff = product_tariffs(:first_flat)
49
- compare_indexes(tarrif, tarrif.class.primary_key, product_tariff, [:tariff_id, :tariff_start_date])
50
- end
51
-
52
- private
53
-
54
- def compare_indexes(obj1, indexes1, obj2, indexes2)
55
- indexes1.length.times do |key_index|
56
- key1 = indexes1[key_index]
57
- key2 = indexes2[key_index]
58
- assert_equal(obj1[key1], obj2[key2])
59
- end
60
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestAttributes < ActiveSupport::TestCase
4
+ fixtures :reference_types, :reference_codes, :products, :tariffs, :product_tariffs
5
+
6
+ CLASSES = {
7
+ :single => {
8
+ :class => ReferenceType,
9
+ :primary_keys => :reference_type_id,
10
+ },
11
+ :dual => {
12
+ :class => ReferenceCode,
13
+ :primary_keys => [:reference_type_id, :reference_code],
14
+ },
15
+ }
16
+
17
+ def setup
18
+ self.class.classes = CLASSES
19
+ end
20
+
21
+ def test_brackets
22
+ testing_with do
23
+ @first.attributes.each_pair do |attr_name, value|
24
+ assert_equal value, @first[attr_name]
25
+ end
26
+ end
27
+ end
28
+
29
+ def test_brackets_primary_key
30
+ testing_with do
31
+ assert_equal(@first.id, @first[@primary_keys])
32
+ assert_equal(@first.id, @first[@first.class.primary_key])
33
+ end
34
+ end
35
+
36
+ def test_brackets_assignment
37
+ testing_with do
38
+ @first.attributes.each_pair do |attr_name, value|
39
+ next if attr_name == @first.class.primary_key
40
+ @first[attr_name]= !value.nil? ? value * 2 : '1'
41
+ assert_equal !value.nil? ? value * 2 : '1', @first[attr_name]
42
+ end
43
+ end
44
+ end
45
+
46
+ def test_brackets_foreign_key_assignment
47
+ tarrif = tariffs(:flat)
48
+ product_tariff = product_tariffs(:first_flat)
49
+ compare_indexes(tarrif, tarrif.class.primary_key, product_tariff, [:tariff_id, :tariff_start_date])
50
+ end
51
+
52
+ private
53
+
54
+ def compare_indexes(obj1, indexes1, obj2, indexes2)
55
+ indexes1.length.times do |key_index|
56
+ key1 = indexes1[key_index]
57
+ key2 = indexes2[key_index]
58
+ assert_equal(obj1[key1], obj2[key2])
59
+ end
60
+ end
61
61
  end
@@ -1,42 +1,42 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestCalculations < ActiveSupport::TestCase
4
- fixtures :articles, :products, :tariffs, :product_tariffs, :suburbs, :streets, :restaurants,
5
- :dorms, :rooms, :room_attributes, :room_attribute_assignments, :students, :room_assignments, :users, :readings,
6
- :departments, :employees, :memberships, :membership_statuses
7
-
8
- def test_count
9
- assert_equal(3, Product.includes(:product_tariffs).count)
10
- assert_equal(3, Tariff.includes(:product_tariffs).count)
11
-
12
- expected = {Date.today => 2,
13
- Date.today.next => 1}
14
-
15
- assert_equal(expected, Tariff.group(:start_date).count)
16
- end
17
-
18
- def test_count_distinct
19
- product = products(:first_product)
20
- assert_equal(1, product.product_tariffs.select('tariff_start_date').distinct.count)
21
- end
22
-
23
- def test_count_not_distinct
24
- product = products(:first_product)
25
- assert_equal(2, product.product_tariffs.select('tariff_start_date').count)
26
- end
27
-
28
- def test_count_includes
29
- count = Dorm.where("rooms.room_id = ?", 2).includes(:rooms).references(:rooms).count
30
- assert_equal(1, count)
31
- end
32
-
33
- def test_count_includes_dup_columns
34
- count = Tariff.includes(:product_tariffs).references(:product_tariffs).where("product_tariffs.tariff_id = ?", 2).count
35
- assert_equal(1, count)
36
- end
37
-
38
- def test_average
39
- average = Tariff.average(:amount)
40
- assert_equal(50, average)
41
- end
42
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestCalculations < ActiveSupport::TestCase
4
+ fixtures :articles, :products, :tariffs, :product_tariffs, :suburbs, :streets, :restaurants,
5
+ :dorms, :rooms, :room_attributes, :room_attribute_assignments, :students, :room_assignments, :users, :readings,
6
+ :departments, :employees, :memberships, :membership_statuses
7
+
8
+ def test_count
9
+ assert_equal(3, Product.includes(:product_tariffs).count)
10
+ assert_equal(3, Tariff.includes(:product_tariffs).count)
11
+
12
+ expected = {Date.today => 2,
13
+ Date.today.next => 1}
14
+
15
+ assert_equal(expected, Tariff.group(:start_date).count)
16
+ end
17
+
18
+ def test_count_distinct
19
+ product = products(:first_product)
20
+ assert_equal(1, product.product_tariffs.select('tariff_start_date').distinct.count)
21
+ end
22
+
23
+ def test_count_not_distinct
24
+ product = products(:first_product)
25
+ assert_equal(2, product.product_tariffs.select('tariff_start_date').count)
26
+ end
27
+
28
+ def test_count_includes
29
+ count = Dorm.where("rooms.room_id = ?", 2).includes(:rooms).references(:rooms).count
30
+ assert_equal(1, count)
31
+ end
32
+
33
+ def test_count_includes_dup_columns
34
+ count = Tariff.includes(:product_tariffs).references(:product_tariffs).where("product_tariffs.tariff_id = ?", 2).count
35
+ assert_equal(1, count)
36
+ end
37
+
38
+ def test_average
39
+ average = Tariff.average(:amount)
40
+ assert_equal(50, average)
41
+ end
42
+ end
data/test/test_create.rb CHANGED
@@ -1,183 +1,218 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestCreate < ActiveSupport::TestCase
4
- fixtures :articles, :students, :dorms, :rooms, :room_assignments, :reference_types, :reference_codes, :streets, :suburbs
5
-
6
- CLASSES = {
7
- :single => {
8
- :class => ReferenceType,
9
- :primary_keys => :reference_type_id,
10
- :create => {:reference_type_id => 10, :type_label => 'NEW_TYPE', :abbreviation => 'New Type'}
11
- },
12
- :dual => {
13
- :class => ReferenceCode,
14
- :primary_keys => [:reference_type_id, :reference_code],
15
- :create => {:reference_type_id => 1, :reference_code => 20, :code_label => 'NEW_CODE', :abbreviation => 'New Code'}
16
- }
17
- }
18
-
19
- def setup
20
- self.class.classes = CLASSES
21
- end
22
-
23
- def test_setup
24
- testing_with do
25
- assert_not_nil @klass_info[:create]
26
- end
27
- end
28
-
29
- def test_create
30
- testing_with do
31
- assert new_obj = @klass.create(@klass_info[:create])
32
- assert !new_obj.new_record?
33
- assert new_obj.id
34
- end
35
- end
36
-
37
- def test_create_no_id
38
- testing_with do
39
- begin
40
- @obj = @klass.create(@klass_info[:create].except(@klass.primary_key))
41
- @successful = !composite?
42
- rescue ActiveRecord::CompositeKeyError
43
- @successful = false
44
- rescue
45
- flunk "Incorrect exception raised: #{$!}, #{$!.class}"
46
- end
47
- assert_equal composite?, !@successful, "Create should have failed for composites; #{@obj.inspect}"
48
- end
49
- end
50
-
51
- # def test_create_generated_keys
52
- # # Not all databases support columns with multiple identity fields
53
- # if defined?(ActiveRecord::ConnectionAdapters::PostgreSQL) ||
54
- # defined?(ActiveRecord::ConnectionAdapters::SQLite3)
55
- #
56
- # suburb = Suburb.create!(:name => 'Capitol Hill')
57
- # refute_nil(suburb.city_id)
58
- # refute_nil(suburb.suburb_id)
59
- # end
60
- # end
61
-
62
- def test_create_on_association
63
- suburb = Suburb.first
64
- suburb.streets.create(:name => "my street")
65
- street = Street.find_by_name('my street')
66
- assert_equal(suburb.city_id, street.city_id)
67
- assert_equal(suburb.suburb_id, street.suburb_id)
68
- end
69
-
70
- def test_create_on_association_when_belongs_to_is_single_key
71
- rt = ReferenceType.first
72
- rt.reference_codes.create(:reference_code => 4321, :code_label => 'foo', :abbreviation => 'bar')
73
- rc = ReferenceCode.find_by_reference_code(4321)
74
- assert_equal(rc.reference_type_id, rt.reference_type_id)
75
- end
76
-
77
- def test_new_habtm
78
- restaurant = Restaurant.new(:franchise_id => 101,
79
- :store_id => 201,
80
- :name => "My Store")
81
-
82
- restaurant.suburbs << Suburb.new(:city_id => 24,
83
- :suburb_id => 25,
84
- :name => "My Suburb")
85
-
86
- restaurant.save!
87
-
88
- # Test restaurant
89
- assert_equal(101, restaurant.franchise_id)
90
- assert_equal(201, restaurant.store_id)
91
- assert_equal("My Store", restaurant.name)
92
- assert_equal(1, restaurant.suburbs.length)
93
-
94
- # Test suburbs
95
- suburb = restaurant.suburbs[0]
96
- assert_equal(24, suburb.city_id)
97
- assert_equal(25, suburb.suburb_id)
98
- assert_equal("My Suburb", suburb.name)
99
- end
100
-
101
- def test_create_habtm
102
- restaurant = Restaurant.create(:franchise_id => 100,
103
- :store_id => 200,
104
- :name => "My Store")
105
-
106
- restaurant.suburbs.create(:city_id => 24,
107
- :suburb_id => 25,
108
- :name => "My Suburb")
109
-
110
- # Test restaurant
111
- assert_equal(100, restaurant.franchise_id)
112
- assert_equal(200, restaurant.store_id)
113
- assert_equal("My Store", restaurant.name)
114
-
115
- assert_equal(1, restaurant.suburbs.reload.length)
116
-
117
- # Test suburbs
118
- suburb = restaurant.suburbs[0]
119
- assert_equal(24, suburb.city_id)
120
- assert_equal(25, suburb.suburb_id)
121
- assert_equal("My Suburb", suburb.name)
122
- end
123
-
124
- def test_has_many_ids_1
125
- dorm = dorms(:toyon)
126
- room = Room.new(:dorm_id => dorm.id, :room_id => 5)
127
- room.save!
128
-
129
- student1 = students(:kelly)
130
-
131
- RoomAssignment.delete_all
132
-
133
- assignment1 = RoomAssignment.new(:student_id => student1.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
134
- assignment1.save!
135
-
136
- room.room_assignment_ids = [[assignment1.student_id, assignment1.dorm_id, assignment1.room_id]]
137
- room.save!
138
-
139
- assert_equal(1, room.room_assignments.length)
140
- assert_equal(assignment1, room.room_assignments.first)
141
- end
142
-
143
- def test_has_many_ids_2
144
- dorm = dorms(:toyon)
145
- room = Room.new(:dorm_id => dorm.id, :room_id => 5)
146
- room.save!
147
-
148
- student1 = students(:kelly)
149
- student2 = students(:jordan)
150
-
151
- RoomAssignment.delete_all
152
-
153
- assignment1 = RoomAssignment.new(:student_id => student1.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
154
- assignment1.save!
155
-
156
- assignment2 = RoomAssignment.new(:student_id => student2.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
157
- assignment2.save!
158
-
159
- room.room_assignment_ids = [[assignment1.student_id, assignment1.dorm_id, assignment1.room_id],
160
- [assignment2.student_id, assignment2.dorm_id, assignment2.room_id]]
161
- room.save!
162
-
163
- assert_equal(2, room.room_assignments.length)
164
- assert_equal(assignment1, room.room_assignments[0])
165
- assert_equal(assignment2, room.room_assignments[1])
166
- end
167
-
168
- def test_create_article_invalid_id
169
- error = assert_raises(ActiveRecord::RecordInvalid) do
170
- Article.create!(:id => 1)
171
- end
172
-
173
- assert_equal('Validation failed: Id has already been taken', error.to_s)
174
- end
175
-
176
- def test_find_or_create_by
177
- suburb = Suburb.find_by(:city_id => 3, :suburb_id => 1)
178
- assert_nil(suburb)
179
-
180
- suburb = Suburb.find_or_create_by!(:name => 'New Suburb', :city_id => 3, :suburb_id => 1)
181
- refute_nil(suburb)
182
- end
183
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestCreate < ActiveSupport::TestCase
4
+ fixtures :articles, :students, :dorms, :rooms, :room_assignments, :reference_types, :reference_codes, :streets, :suburbs
5
+
6
+ CLASSES = {
7
+ :single => {
8
+ :class => ReferenceType,
9
+ :primary_keys => :reference_type_id,
10
+ :create => {:reference_type_id => 10, :type_label => 'NEW_TYPE', :abbreviation => 'New Type'}
11
+ },
12
+ :dual => {
13
+ :class => ReferenceCode,
14
+ :primary_keys => [:reference_type_id, :reference_code],
15
+ :create => {:reference_type_id => 1, :reference_code => 20, :code_label => 'NEW_CODE', :abbreviation => 'New Code'}
16
+ }
17
+ }
18
+
19
+ def setup
20
+ self.class.classes = CLASSES
21
+ end
22
+
23
+ def test_setup
24
+ testing_with do
25
+ assert_not_nil @klass_info[:create]
26
+ end
27
+ end
28
+
29
+ def test_create
30
+ testing_with do
31
+ assert new_obj = @klass.create(@klass_info[:create])
32
+ assert !new_obj.new_record?
33
+ assert new_obj.id
34
+ end
35
+ end
36
+
37
+ def test_create_no_id
38
+ testing_with do
39
+ begin
40
+ @obj = @klass.create(@klass_info[:create].except(@klass.primary_key))
41
+ @successful = !composite?
42
+ rescue ActiveRecord::CompositeKeyError
43
+ @successful = false
44
+ rescue
45
+ flunk "Incorrect exception raised: #{$!}, #{$!.class}"
46
+ end
47
+ assert_equal composite?, !@successful, "Create should have failed for composites; #{@obj.inspect}"
48
+ end
49
+ end
50
+
51
+ def test_create_with_array
52
+ date = Date.new(2027, 01, 27)
53
+ tariff = Tariff.create!(id: [10, date], amount: 27)
54
+ refute_nil(tariff)
55
+ assert_equal([10, date], tariff.id)
56
+ assert_equal(date, tariff.start_date)
57
+ assert_equal(27, tariff.amount)
58
+ end
59
+
60
+ def test_create_with_partial_serial
61
+ attributes = {:location_id => 100}
62
+
63
+ # SQLite does not support an autoincrementing field in a composite key
64
+ if Department.connection.class.name == "ActiveRecord::ConnectionAdapters::SQLite3Adapter"
65
+ attributes[:id] = 200
66
+ end
67
+
68
+ department = Department.new(attributes)
69
+ assert_nil(department.attributes[:id])
70
+
71
+ department.save!
72
+ refute_nil(department.attributes["id"])
73
+ assert_equal(100, department.location_id)
74
+ end
75
+
76
+ def test_create_with_id
77
+ department = Department.create!(id: [2, 3])
78
+ assert_equal([2, 3], department.id)
79
+ assert_equal(2, department.attributes["id"])
80
+ assert_equal(3, department.attributes["location_id"])
81
+
82
+ department.reload
83
+ assert_equal([2, 3], department.id)
84
+ assert_equal(2, department.attributes["id"])
85
+ assert_equal(3, department.attributes["location_id"])
86
+ end
87
+
88
+ def test_create_on_association
89
+ suburb = Suburb.first
90
+ suburb.streets.create(:name => "my street")
91
+ street = Street.find_by_name('my street')
92
+ assert_equal(suburb.city_id, street.city_id)
93
+ assert_equal(suburb.suburb_id, street.suburb_id)
94
+ end
95
+
96
+ def test_create_on_association_when_belongs_to_is_single_key
97
+ rt = ReferenceType.first
98
+ rt.reference_codes.create(:reference_code => 4321, :code_label => 'foo', :abbreviation => 'bar')
99
+ rc = ReferenceCode.find_by_reference_code(4321)
100
+ assert_equal(rc.reference_type_id, rt.reference_type_id)
101
+ end
102
+
103
+ def test_new_habtm
104
+ restaurant = Restaurant.new(:franchise_id => 101,
105
+ :store_id => 201,
106
+ :name => "My Store")
107
+
108
+ restaurant.suburbs << Suburb.new(:city_id => 24,
109
+ :suburb_id => 25,
110
+ :name => "My Suburb")
111
+
112
+ restaurant.save!
113
+
114
+ # Test restaurant
115
+ assert_equal(101, restaurant.franchise_id)
116
+ assert_equal(201, restaurant.store_id)
117
+ assert_equal("My Store", restaurant.name)
118
+ assert_equal(1, restaurant.suburbs.length)
119
+
120
+ # Test suburbs
121
+ suburb = restaurant.suburbs[0]
122
+ assert_equal(24, suburb.city_id)
123
+ assert_equal(25, suburb.suburb_id)
124
+ assert_equal("My Suburb", suburb.name)
125
+ end
126
+
127
+ def test_create_habtm
128
+ restaurant = Restaurant.create(:franchise_id => 100,
129
+ :store_id => 200,
130
+ :name => "My Store")
131
+
132
+ restaurant.suburbs.create(:city_id => 24,
133
+ :suburb_id => 25,
134
+ :name => "My Suburb")
135
+
136
+ # Test restaurant
137
+ assert_equal(100, restaurant.franchise_id)
138
+ assert_equal(200, restaurant.store_id)
139
+ assert_equal("My Store", restaurant.name)
140
+
141
+ assert_equal(1, restaurant.suburbs.reload.length)
142
+
143
+ # Test suburbs
144
+ suburb = restaurant.suburbs[0]
145
+ assert_equal(24, suburb.city_id)
146
+ assert_equal(25, suburb.suburb_id)
147
+ assert_equal("My Suburb", suburb.name)
148
+ end
149
+
150
+ def test_has_many_ids_1
151
+ dorm = dorms(:toyon)
152
+ room = Room.new(:dorm_id => dorm.id, :room_id => 5)
153
+ room.save!
154
+
155
+ student1 = students(:kelly)
156
+
157
+ RoomAssignment.delete_all
158
+
159
+ assignment1 = RoomAssignment.new(:student_id => student1.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
160
+ assignment1.save!
161
+
162
+ room.room_assignment_ids = [[assignment1.student_id, assignment1.dorm_id, assignment1.room_id]]
163
+ room.save!
164
+
165
+ assert_equal(1, room.room_assignments.length)
166
+ assert_equal(assignment1, room.room_assignments.first)
167
+ end
168
+
169
+ def test_has_many_ids_2
170
+ dorm = dorms(:toyon)
171
+ room = Room.new(:dorm_id => dorm.id, :room_id => 5)
172
+ room.save!
173
+
174
+ student1 = students(:kelly)
175
+ student2 = students(:jordan)
176
+
177
+ RoomAssignment.delete_all
178
+
179
+ assignment1 = RoomAssignment.new(:student_id => student1.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
180
+ assignment1.save!
181
+
182
+ assignment2 = RoomAssignment.new(:student_id => student2.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
183
+ assignment2.save!
184
+
185
+ room.room_assignment_ids = [[assignment1.student_id, assignment1.dorm_id, assignment1.room_id],
186
+ [assignment2.student_id, assignment2.dorm_id, assignment2.room_id]]
187
+ room.save!
188
+
189
+ assert_equal(2, room.room_assignments.length)
190
+ assert_equal(assignment1, room.room_assignments[0])
191
+ assert_equal(assignment2, room.room_assignments[1])
192
+ end
193
+
194
+ def test_find_or_create_by
195
+ suburb = Suburb.find_by(:city_id => 3, :suburb_id => 1)
196
+ assert_nil(suburb)
197
+
198
+ suburb = Suburb.find_or_create_by!(:name => 'New Suburb', :city_id => 3, :suburb_id => 1)
199
+ refute_nil(suburb)
200
+ end
201
+
202
+ def test_cache
203
+ Suburb.cache do
204
+ # Suburb does not exist
205
+ suburb = Suburb.find_by(:city_id => 10, :suburb_id => 10)
206
+ assert_nil(suburb)
207
+
208
+ # Create it
209
+ suburb = Suburb.create!(:name => 'New Suburb', :city_id => 10, :suburb_id => 10)
210
+
211
+ # Should be able to find it
212
+ suburb = Suburb.find_by(:city_id => 10)
213
+ refute_nil(suburb)
214
+ refute_nil(suburb.city_id)
215
+ refute_nil(suburb.suburb_id)
216
+ end
217
+ end
218
+ end