composite_primary_keys 12.0.5 → 13.0.0

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +883 -862
  3. data/README.rdoc +181 -180
  4. data/lib/composite_primary_keys.rb +119 -118
  5. data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -19
  6. data/lib/composite_primary_keys/associations/association_scope.rb +66 -68
  7. data/lib/composite_primary_keys/associations/join_dependency.rb +118 -103
  8. data/lib/composite_primary_keys/attribute_methods.rb +21 -9
  9. data/lib/composite_primary_keys/attribute_methods/primary_key.rb +0 -2
  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/base.rb +141 -141
  13. data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +37 -22
  14. data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +44 -44
  15. data/lib/composite_primary_keys/core.rb +48 -48
  16. data/lib/composite_primary_keys/nested_attributes.rb +1 -1
  17. data/lib/composite_primary_keys/persistence.rb +82 -81
  18. data/lib/composite_primary_keys/reflection.rb +91 -29
  19. data/lib/composite_primary_keys/relation.rb +197 -193
  20. data/lib/composite_primary_keys/relation/batches.rb +16 -8
  21. data/lib/composite_primary_keys/relation/calculations.rb +104 -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 +39 -20
  24. data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
  25. data/lib/composite_primary_keys/relation/where_clause.rb +18 -23
  26. data/lib/composite_primary_keys/table_metadata.rb +11 -0
  27. data/lib/composite_primary_keys/version.rb +8 -8
  28. data/test/abstract_unit.rb +114 -114
  29. data/test/connections/databases.ci.yml +22 -19
  30. data/test/fixtures/db_definitions/db2-create-tables.sql +112 -112
  31. data/test/fixtures/db_definitions/db2-drop-tables.sql +16 -16
  32. data/test/fixtures/db_definitions/mysql.sql +180 -180
  33. data/test/fixtures/db_definitions/oracle.drop.sql +41 -41
  34. data/test/fixtures/db_definitions/oracle.sql +199 -199
  35. data/test/fixtures/db_definitions/postgresql.sql +182 -182
  36. data/test/fixtures/db_definitions/sqlite.sql +169 -169
  37. data/test/fixtures/db_definitions/sqlserver.sql +176 -176
  38. data/test/fixtures/department.rb +16 -16
  39. data/test/fixtures/departments.yml +19 -15
  40. data/test/fixtures/employees.yml +33 -28
  41. data/test/fixtures/restaurants_suburbs.yml +10 -10
  42. data/test/fixtures/streets.yml +16 -16
  43. data/test/fixtures/suburbs.yml +14 -14
  44. data/test/fixtures/user.rb +11 -11
  45. data/test/test_associations.rb +364 -358
  46. data/test/test_attributes.rb +75 -60
  47. data/test/test_calculations.rb +49 -42
  48. data/test/test_create.rb +218 -180
  49. data/test/test_delete.rb +182 -179
  50. data/test/test_exists.rb +39 -39
  51. data/test/test_find.rb +170 -157
  52. data/test/test_ids.rb +112 -112
  53. data/test/test_nested_attributes.rb +67 -67
  54. data/test/test_update.rb +96 -96
  55. metadata +5 -5
  56. data/lib/composite_primary_keys/connection_adapters/mysql/database_statements.rb +0 -24
@@ -1,61 +1,76 @@
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
+ tested_at_least_on_attribute = false
23
+ testing_with do
24
+ @first.attributes.each_pair do |attr_name, value|
25
+ next if value.nil?
26
+ assert_equal value, @first[attr_name]
27
+ tested_at_least_on_attribute = true
28
+ end
29
+ end
30
+ assert tested_at_least_on_attribute
31
+ end
32
+
33
+ def test_brackets_primary_key
34
+ testing_with do
35
+ assert_equal(@first.id, @first[@primary_keys])
36
+ assert_equal(@first.id, @first[@first.class.primary_key])
37
+ end
38
+ end
39
+
40
+ def test_brackets_assignment
41
+ testing_with do
42
+ @first.attributes.each_pair do |attr_name, value|
43
+ next if attr_name == @first.class.primary_key
44
+ @first[attr_name]= !value.nil? ? value * 2 : '1'
45
+ assert_equal !value.nil? ? value * 2 : '1', @first[attr_name]
46
+ end
47
+ end
48
+ end
49
+
50
+ def test_brackets_foreign_key_assignment
51
+ tarrif = tariffs(:flat)
52
+ product_tariff = product_tariffs(:first_flat)
53
+ compare_indexes(tarrif, tarrif.class.primary_key, product_tariff, [:tariff_id, :tariff_start_date])
54
+ end
55
+
56
+ def test_has_attribute
57
+ tariff = tariffs(:flat)
58
+ assert(tariff.has_attribute?([:tariff_id, :start_date]))
59
+ assert(tariff.has_attribute?(['tariff_id', 'start_date']))
60
+ end
61
+
62
+ def test_has__attribute
63
+ tariff = tariffs(:flat)
64
+ assert(tariff._has_attribute?(['tariff_id', 'start_date']))
65
+ end
66
+
67
+ private
68
+
69
+ def compare_indexes(obj1, indexes1, obj2, indexes2)
70
+ indexes1.length.times do |key_index|
71
+ key1 = indexes1[key_index]
72
+ key2 = indexes2[key_index]
73
+ assert_equal(obj1[key1], obj2[key2])
74
+ end
75
+ end
61
76
  end
@@ -1,42 +1,49 @@
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, :reference_codes, :reference_types
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_on_joined_relations_that_have_column_names_in_common
24
+ count_without_includes = ReferenceCode.count
25
+ count_with_includes = ReferenceCode.includes(:reference_type).references(:reference_type).count
26
+ assert_equal(count_without_includes, count_with_includes)
27
+ assert_equal(5, count_with_includes)
28
+ end
29
+
30
+ def test_count_not_distinct
31
+ product = products(:first_product)
32
+ assert_equal(2, product.product_tariffs.select('tariff_start_date').count)
33
+ end
34
+
35
+ def test_count_includes
36
+ count = Dorm.where("rooms.room_id = ?", 2).includes(:rooms).references(:rooms).count
37
+ assert_equal(1, count)
38
+ end
39
+
40
+ def test_count_includes_dup_columns
41
+ count = Tariff.includes(:product_tariffs).references(:product_tariffs).where("product_tariffs.tariff_id = ?", 2).count
42
+ assert_equal(1, count)
43
+ end
44
+
45
+ def test_average
46
+ average = Tariff.average(:amount)
47
+ assert_equal(50, average)
48
+ end
49
+ end
data/test/test_create.rb CHANGED
@@ -1,180 +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_with_partial_serial
52
- attributes = {:location_id => 100}
53
-
54
- # SQLite does not support an autoincrementing field in a composite key
55
- if Department.connection.class.name == "ActiveRecord::ConnectionAdapters::SQLite3Adapter"
56
- attributes[:id] = 100
57
- end
58
-
59
- department = Department.new(attributes)
60
- assert_nil(department.attributes[:id])
61
-
62
- department.save!
63
- refute_nil(department.attributes["id"])
64
- assert_equal(100, department.location_id)
65
- end
66
-
67
- def test_create_on_association
68
- suburb = Suburb.first
69
- suburb.streets.create(:name => "my street")
70
- street = Street.find_by_name('my street')
71
- assert_equal(suburb.city_id, street.city_id)
72
- assert_equal(suburb.suburb_id, street.suburb_id)
73
- end
74
-
75
- def test_create_on_association_when_belongs_to_is_single_key
76
- rt = ReferenceType.first
77
- rt.reference_codes.create(:reference_code => 4321, :code_label => 'foo', :abbreviation => 'bar')
78
- rc = ReferenceCode.find_by_reference_code(4321)
79
- assert_equal(rc.reference_type_id, rt.reference_type_id)
80
- end
81
-
82
- def test_new_habtm
83
- restaurant = Restaurant.new(:franchise_id => 101,
84
- :store_id => 201,
85
- :name => "My Store")
86
-
87
- restaurant.suburbs << Suburb.new(:city_id => 24,
88
- :suburb_id => 25,
89
- :name => "My Suburb")
90
-
91
- restaurant.save!
92
-
93
- # Test restaurant
94
- assert_equal(101, restaurant.franchise_id)
95
- assert_equal(201, restaurant.store_id)
96
- assert_equal("My Store", restaurant.name)
97
- assert_equal(1, restaurant.suburbs.length)
98
-
99
- # Test suburbs
100
- suburb = restaurant.suburbs[0]
101
- assert_equal(24, suburb.city_id)
102
- assert_equal(25, suburb.suburb_id)
103
- assert_equal("My Suburb", suburb.name)
104
- end
105
-
106
- def test_create_habtm
107
- restaurant = Restaurant.create(:franchise_id => 100,
108
- :store_id => 200,
109
- :name => "My Store")
110
-
111
- restaurant.suburbs.create(:city_id => 24,
112
- :suburb_id => 25,
113
- :name => "My Suburb")
114
-
115
- # Test restaurant
116
- assert_equal(100, restaurant.franchise_id)
117
- assert_equal(200, restaurant.store_id)
118
- assert_equal("My Store", restaurant.name)
119
-
120
- assert_equal(1, restaurant.suburbs.reload.length)
121
-
122
- # Test suburbs
123
- suburb = restaurant.suburbs[0]
124
- assert_equal(24, suburb.city_id)
125
- assert_equal(25, suburb.suburb_id)
126
- assert_equal("My Suburb", suburb.name)
127
- end
128
-
129
- def test_has_many_ids_1
130
- dorm = dorms(:toyon)
131
- room = Room.new(:dorm_id => dorm.id, :room_id => 5)
132
- room.save!
133
-
134
- student1 = students(:kelly)
135
-
136
- RoomAssignment.delete_all
137
-
138
- assignment1 = RoomAssignment.new(:student_id => student1.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
139
- assignment1.save!
140
-
141
- room.room_assignment_ids = [[assignment1.student_id, assignment1.dorm_id, assignment1.room_id]]
142
- room.save!
143
-
144
- assert_equal(1, room.room_assignments.length)
145
- assert_equal(assignment1, room.room_assignments.first)
146
- end
147
-
148
- def test_has_many_ids_2
149
- dorm = dorms(:toyon)
150
- room = Room.new(:dorm_id => dorm.id, :room_id => 5)
151
- room.save!
152
-
153
- student1 = students(:kelly)
154
- student2 = students(:jordan)
155
-
156
- RoomAssignment.delete_all
157
-
158
- assignment1 = RoomAssignment.new(:student_id => student1.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
159
- assignment1.save!
160
-
161
- assignment2 = RoomAssignment.new(:student_id => student2.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
162
- assignment2.save!
163
-
164
- room.room_assignment_ids = [[assignment1.student_id, assignment1.dorm_id, assignment1.room_id],
165
- [assignment2.student_id, assignment2.dorm_id, assignment2.room_id]]
166
- room.save!
167
-
168
- assert_equal(2, room.room_assignments.length)
169
- assert_equal(assignment1, room.room_assignments[0])
170
- assert_equal(assignment2, room.room_assignments[1])
171
- end
172
-
173
- def test_find_or_create_by
174
- suburb = Suburb.find_by(:city_id => 3, :suburb_id => 1)
175
- assert_nil(suburb)
176
-
177
- suburb = Suburb.find_or_create_by!(:name => 'New Suburb', :city_id => 3, :suburb_id => 1)
178
- refute_nil(suburb)
179
- end
180
- 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