composite_primary_keys 12.0.4 → 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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +880 -859
  3. data/README.rdoc +180 -180
  4. data/lib/composite_primary_keys.rb +117 -118
  5. data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -19
  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/attribute_methods.rb +9 -9
  9. data/lib/composite_primary_keys/attribute_methods/read.rb +30 -30
  10. data/lib/composite_primary_keys/attribute_methods/write.rb +35 -35
  11. data/lib/composite_primary_keys/base.rb +141 -141
  12. data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +37 -22
  13. data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +44 -41
  14. data/lib/composite_primary_keys/core.rb +48 -48
  15. data/lib/composite_primary_keys/persistence.rb +82 -81
  16. data/lib/composite_primary_keys/reflection.rb +29 -29
  17. data/lib/composite_primary_keys/relation.rb +193 -193
  18. data/lib/composite_primary_keys/relation/batches.rb +1 -1
  19. data/lib/composite_primary_keys/relation/calculations.rb +81 -81
  20. data/lib/composite_primary_keys/relation/finder_methods.rb +235 -235
  21. data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +20 -20
  22. data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
  23. data/lib/composite_primary_keys/relation/where_clause.rb +23 -23
  24. data/lib/composite_primary_keys/version.rb +8 -8
  25. data/test/abstract_unit.rb +114 -114
  26. data/test/connections/databases.ci.yml +22 -19
  27. data/test/fixtures/db_definitions/db2-create-tables.sql +112 -112
  28. data/test/fixtures/db_definitions/db2-drop-tables.sql +16 -16
  29. data/test/fixtures/db_definitions/mysql.sql +180 -180
  30. data/test/fixtures/db_definitions/oracle.drop.sql +41 -41
  31. data/test/fixtures/db_definitions/oracle.sql +199 -199
  32. data/test/fixtures/db_definitions/postgresql.sql +182 -182
  33. data/test/fixtures/db_definitions/sqlite.sql +169 -169
  34. data/test/fixtures/db_definitions/sqlserver.sql +176 -176
  35. data/test/fixtures/department.rb +16 -16
  36. data/test/fixtures/departments.yml +15 -15
  37. data/test/fixtures/employees.yml +27 -27
  38. data/test/fixtures/restaurants_suburbs.yml +10 -10
  39. data/test/fixtures/streets.yml +16 -16
  40. data/test/fixtures/suburbs.yml +14 -14
  41. data/test/fixtures/user.rb +11 -11
  42. data/test/test_associations.rb +358 -358
  43. data/test/test_attributes.rb +60 -60
  44. data/test/test_calculations.rb +42 -42
  45. data/test/test_create.rb +218 -180
  46. data/test/test_delete.rb +182 -179
  47. data/test/test_exists.rb +39 -39
  48. data/test/test_find.rb +164 -157
  49. data/test/test_ids.rb +112 -112
  50. data/test/test_nested_attributes.rb +67 -67
  51. data/test/test_update.rb +96 -96
  52. metadata +2 -3
  53. data/lib/composite_primary_keys/connection_adapters/mysql/database_statements.rb +0 -24
@@ -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,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