composite_primary_keys 12.0.9 → 14.0.1

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 (153) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +894 -877
  3. data/README.rdoc +182 -180
  4. data/Rakefile +37 -37
  5. data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -19
  6. data/lib/composite_primary_keys/arel/sqlserver.rb +37 -37
  7. data/lib/composite_primary_keys/arel/to_sql.rb +18 -18
  8. data/lib/composite_primary_keys/associations/association.rb +23 -23
  9. data/lib/composite_primary_keys/associations/association_scope.rb +66 -68
  10. data/lib/composite_primary_keys/associations/collection_association.rb +31 -31
  11. data/lib/composite_primary_keys/associations/foreign_association.rb +15 -15
  12. data/lib/composite_primary_keys/associations/has_many_association.rb +35 -35
  13. data/lib/composite_primary_keys/associations/join_dependency.rb +137 -103
  14. data/lib/composite_primary_keys/associations/preloader/association.rb +68 -53
  15. data/lib/composite_primary_keys/associations/through_association.rb +25 -25
  16. data/lib/composite_primary_keys/attribute_methods/primary_key.rb +0 -2
  17. data/lib/composite_primary_keys/attribute_methods/read.rb +30 -30
  18. data/lib/composite_primary_keys/attribute_methods/write.rb +35 -35
  19. data/lib/composite_primary_keys/attribute_methods.rb +21 -9
  20. data/lib/composite_primary_keys/autosave_association.rb +60 -60
  21. data/lib/composite_primary_keys/base.rb +141 -141
  22. data/lib/composite_primary_keys/composite_arrays.rb +86 -86
  23. data/lib/composite_primary_keys/composite_predicates.rb +71 -69
  24. data/lib/composite_primary_keys/composite_relation.rb +29 -29
  25. data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +37 -37
  26. data/lib/composite_primary_keys/connection_adapters/abstract_adapter.rb +10 -10
  27. data/lib/composite_primary_keys/connection_adapters/postgresql/database_statements.rb +26 -26
  28. data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +44 -44
  29. data/lib/composite_primary_keys/core.rb +48 -48
  30. data/lib/composite_primary_keys/counter_cache.rb +15 -15
  31. data/lib/composite_primary_keys/fixtures.rb +21 -21
  32. data/lib/composite_primary_keys/nested_attributes.rb +1 -1
  33. data/lib/composite_primary_keys/persistence.rb +96 -81
  34. data/lib/composite_primary_keys/reflection.rb +91 -29
  35. data/lib/composite_primary_keys/relation/batches.rb +15 -7
  36. data/lib/composite_primary_keys/relation/calculations.rb +110 -81
  37. data/lib/composite_primary_keys/relation/finder_methods.rb +235 -235
  38. data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +39 -20
  39. data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
  40. data/lib/composite_primary_keys/relation/where_clause.rb +18 -23
  41. data/lib/composite_primary_keys/relation.rb +197 -193
  42. data/lib/composite_primary_keys/sanitization.rb +42 -42
  43. data/lib/composite_primary_keys/table_metadata.rb +11 -0
  44. data/lib/composite_primary_keys/transactions.rb +34 -34
  45. data/lib/composite_primary_keys/validations/uniqueness.rb +31 -31
  46. data/lib/composite_primary_keys/version.rb +8 -8
  47. data/lib/composite_primary_keys.rb +119 -117
  48. data/scripts/console.rb +48 -48
  49. data/scripts/txt2html +76 -76
  50. data/scripts/txt2js +65 -65
  51. data/tasks/databases/mysql.rake +40 -40
  52. data/tasks/databases/oracle.rake +41 -41
  53. data/tasks/databases/postgresql.rake +38 -38
  54. data/tasks/databases/sqlite.rake +25 -25
  55. data/tasks/databases/sqlserver.rake +43 -43
  56. data/tasks/website.rake +18 -18
  57. data/test/README_tests.rdoc +56 -56
  58. data/test/abstract_unit.rb +118 -114
  59. data/test/connections/connection_spec.rb +27 -27
  60. data/test/connections/databases.ci.yml +22 -22
  61. data/test/connections/databases.example.yml +40 -40
  62. data/test/connections/databases.yml +40 -39
  63. data/test/fixtures/article.rb +10 -10
  64. data/test/fixtures/articles.yml +7 -7
  65. data/test/fixtures/capitol.rb +3 -3
  66. data/test/fixtures/capitols.yml +16 -16
  67. data/test/fixtures/comment.rb +5 -5
  68. data/test/fixtures/comments.yml +17 -17
  69. data/test/fixtures/db_definitions/db2-create-tables.sql +112 -112
  70. data/test/fixtures/db_definitions/db2-drop-tables.sql +16 -16
  71. data/test/fixtures/db_definitions/mysql.sql +180 -180
  72. data/test/fixtures/db_definitions/oracle.drop.sql +41 -41
  73. data/test/fixtures/db_definitions/oracle.sql +199 -199
  74. data/test/fixtures/db_definitions/postgresql.sql +182 -182
  75. data/test/fixtures/db_definitions/sqlite.sql +169 -169
  76. data/test/fixtures/db_definitions/sqlserver.sql +176 -176
  77. data/test/fixtures/department.rb +16 -16
  78. data/test/fixtures/departments.yml +19 -15
  79. data/test/fixtures/dorm.rb +2 -2
  80. data/test/fixtures/dorms.yml +4 -4
  81. data/test/fixtures/employee.rb +5 -5
  82. data/test/fixtures/employees.yml +33 -28
  83. data/test/fixtures/group.rb +2 -2
  84. data/test/fixtures/groups.yml +6 -6
  85. data/test/fixtures/membership.rb +8 -6
  86. data/test/fixtures/membership_status.rb +2 -2
  87. data/test/fixtures/membership_statuses.yml +16 -16
  88. data/test/fixtures/memberships.yml +10 -10
  89. data/test/fixtures/product.rb +9 -9
  90. data/test/fixtures/product_tariff.rb +5 -5
  91. data/test/fixtures/product_tariffs.yml +14 -14
  92. data/test/fixtures/products.yml +11 -11
  93. data/test/fixtures/reading.rb +4 -4
  94. data/test/fixtures/readings.yml +10 -10
  95. data/test/fixtures/reference_code.rb +7 -7
  96. data/test/fixtures/reference_codes.yml +28 -28
  97. data/test/fixtures/reference_type.rb +12 -12
  98. data/test/fixtures/reference_types.yml +9 -9
  99. data/test/fixtures/restaurant.rb +9 -9
  100. data/test/fixtures/restaurants.yml +14 -14
  101. data/test/fixtures/restaurants_suburb.rb +2 -2
  102. data/test/fixtures/restaurants_suburbs.yml +10 -10
  103. data/test/fixtures/room.rb +11 -11
  104. data/test/fixtures/room_assignment.rb +13 -13
  105. data/test/fixtures/room_assignments.yml +24 -24
  106. data/test/fixtures/room_attribute.rb +2 -2
  107. data/test/fixtures/room_attribute_assignment.rb +4 -4
  108. data/test/fixtures/room_attribute_assignments.yml +4 -4
  109. data/test/fixtures/room_attributes.yml +2 -2
  110. data/test/fixtures/rooms.yml +12 -12
  111. data/test/fixtures/street.rb +2 -2
  112. data/test/fixtures/streets.yml +16 -16
  113. data/test/fixtures/student.rb +3 -3
  114. data/test/fixtures/students.yml +15 -15
  115. data/test/fixtures/suburb.rb +5 -5
  116. data/test/fixtures/suburbs.yml +14 -14
  117. data/test/fixtures/tariff.rb +5 -5
  118. data/test/fixtures/tariffs.yml +14 -14
  119. data/test/fixtures/topic_sources.yml +3 -3
  120. data/test/fixtures/topics.yml +8 -8
  121. data/test/fixtures/user.rb +11 -11
  122. data/test/fixtures/users.yml +10 -10
  123. data/test/plugins/pagination.rb +405 -405
  124. data/test/plugins/pagination_helper.rb +135 -135
  125. data/test/test_associations.rb +372 -358
  126. data/test/test_attribute_methods.rb +63 -63
  127. data/test/test_attributes.rb +75 -60
  128. data/test/test_calculations.rb +49 -42
  129. data/test/test_callbacks.rb +99 -99
  130. data/test/test_composite_arrays.rb +38 -38
  131. data/test/test_counter_cache.rb +30 -30
  132. data/test/test_create.rb +218 -206
  133. data/test/test_delete.rb +188 -179
  134. data/test/test_dumpable.rb +15 -15
  135. data/test/test_dup.rb +37 -37
  136. data/test/test_equal.rb +26 -26
  137. data/test/test_exists.rb +39 -39
  138. data/test/test_find.rb +170 -164
  139. data/test/test_habtm.rb +141 -141
  140. data/test/test_ids.rb +112 -112
  141. data/test/test_miscellaneous.rb +32 -32
  142. data/test/test_nested_attributes.rb +67 -67
  143. data/test/test_optimistic.rb +18 -18
  144. data/test/test_pagination.rb +35 -35
  145. data/test/test_polymorphic.rb +43 -43
  146. data/test/test_predicates.rb +59 -59
  147. data/test/test_preload.rb +102 -102
  148. data/test/test_santiago.rb +23 -23
  149. data/test/test_touch.rb +23 -23
  150. data/test/test_tutorial_example.rb +25 -25
  151. data/test/test_update.rb +102 -96
  152. data/test/test_validations.rb +13 -13
  153. metadata +7 -6
@@ -1,31 +1,31 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestCounterCache < ActiveSupport::TestCase
4
- fixtures :dorms, :rooms, :tariffs
5
-
6
- def test_update_counter
7
- tariff = tariffs(:flat)
8
- assert_equal(50, tariff.amount)
9
- Tariff.update_counters(tariff.id, :amount => 1)
10
- tariff.reload
11
- assert_equal(51, tariff.amount)
12
- end
13
-
14
- def test_increment_counter
15
- tariff = tariffs(:flat)
16
- assert_equal(50, tariff.amount)
17
- Tariff.increment_counter(:amount, tariff.id)
18
-
19
- tariff.reload
20
- assert_equal(51, tariff.amount)
21
- end
22
-
23
- def test_decrement_counter
24
- tariff = tariffs(:flat)
25
- assert_equal(50, tariff.amount)
26
- Tariff.decrement_counter(:amount, tariff.id)
27
-
28
- tariff.reload
29
- assert_equal(49, tariff.amount)
30
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestCounterCache < ActiveSupport::TestCase
4
+ fixtures :dorms, :rooms, :tariffs
5
+
6
+ def test_update_counter
7
+ tariff = tariffs(:flat)
8
+ assert_equal(50, tariff.amount)
9
+ Tariff.update_counters(tariff.id, :amount => 1)
10
+ tariff.reload
11
+ assert_equal(51, tariff.amount)
12
+ end
13
+
14
+ def test_increment_counter
15
+ tariff = tariffs(:flat)
16
+ assert_equal(50, tariff.amount)
17
+ Tariff.increment_counter(:amount, tariff.id)
18
+
19
+ tariff.reload
20
+ assert_equal(51, tariff.amount)
21
+ end
22
+
23
+ def test_decrement_counter
24
+ tariff = tariffs(:flat)
25
+ assert_equal(50, tariff.amount)
26
+ Tariff.decrement_counter(:amount, tariff.id)
27
+
28
+ tariff.reload
29
+ assert_equal(49, tariff.amount)
30
+ end
31
31
  end
data/test/test_create.rb CHANGED
@@ -1,206 +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_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_on_association
77
- suburb = Suburb.first
78
- suburb.streets.create(:name => "my street")
79
- street = Street.find_by_name('my street')
80
- assert_equal(suburb.city_id, street.city_id)
81
- assert_equal(suburb.suburb_id, street.suburb_id)
82
- end
83
-
84
- def test_create_on_association_when_belongs_to_is_single_key
85
- rt = ReferenceType.first
86
- rt.reference_codes.create(:reference_code => 4321, :code_label => 'foo', :abbreviation => 'bar')
87
- rc = ReferenceCode.find_by_reference_code(4321)
88
- assert_equal(rc.reference_type_id, rt.reference_type_id)
89
- end
90
-
91
- def test_new_habtm
92
- restaurant = Restaurant.new(:franchise_id => 101,
93
- :store_id => 201,
94
- :name => "My Store")
95
-
96
- restaurant.suburbs << Suburb.new(:city_id => 24,
97
- :suburb_id => 25,
98
- :name => "My Suburb")
99
-
100
- restaurant.save!
101
-
102
- # Test restaurant
103
- assert_equal(101, restaurant.franchise_id)
104
- assert_equal(201, restaurant.store_id)
105
- assert_equal("My Store", restaurant.name)
106
- assert_equal(1, restaurant.suburbs.length)
107
-
108
- # Test suburbs
109
- suburb = restaurant.suburbs[0]
110
- assert_equal(24, suburb.city_id)
111
- assert_equal(25, suburb.suburb_id)
112
- assert_equal("My Suburb", suburb.name)
113
- end
114
-
115
- def test_create_habtm
116
- restaurant = Restaurant.create(:franchise_id => 100,
117
- :store_id => 200,
118
- :name => "My Store")
119
-
120
- restaurant.suburbs.create(:city_id => 24,
121
- :suburb_id => 25,
122
- :name => "My Suburb")
123
-
124
- # Test restaurant
125
- assert_equal(100, restaurant.franchise_id)
126
- assert_equal(200, restaurant.store_id)
127
- assert_equal("My Store", restaurant.name)
128
-
129
- assert_equal(1, restaurant.suburbs.reload.length)
130
-
131
- # Test suburbs
132
- suburb = restaurant.suburbs[0]
133
- assert_equal(24, suburb.city_id)
134
- assert_equal(25, suburb.suburb_id)
135
- assert_equal("My Suburb", suburb.name)
136
- end
137
-
138
- def test_has_many_ids_1
139
- dorm = dorms(:toyon)
140
- room = Room.new(:dorm_id => dorm.id, :room_id => 5)
141
- room.save!
142
-
143
- student1 = students(:kelly)
144
-
145
- RoomAssignment.delete_all
146
-
147
- assignment1 = RoomAssignment.new(:student_id => student1.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
148
- assignment1.save!
149
-
150
- room.room_assignment_ids = [[assignment1.student_id, assignment1.dorm_id, assignment1.room_id]]
151
- room.save!
152
-
153
- assert_equal(1, room.room_assignments.length)
154
- assert_equal(assignment1, room.room_assignments.first)
155
- end
156
-
157
- def test_has_many_ids_2
158
- dorm = dorms(:toyon)
159
- room = Room.new(:dorm_id => dorm.id, :room_id => 5)
160
- room.save!
161
-
162
- student1 = students(:kelly)
163
- student2 = students(:jordan)
164
-
165
- RoomAssignment.delete_all
166
-
167
- assignment1 = RoomAssignment.new(:student_id => student1.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
168
- assignment1.save!
169
-
170
- assignment2 = RoomAssignment.new(:student_id => student2.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
171
- assignment2.save!
172
-
173
- room.room_assignment_ids = [[assignment1.student_id, assignment1.dorm_id, assignment1.room_id],
174
- [assignment2.student_id, assignment2.dorm_id, assignment2.room_id]]
175
- room.save!
176
-
177
- assert_equal(2, room.room_assignments.length)
178
- assert_equal(assignment1, room.room_assignments[0])
179
- assert_equal(assignment2, room.room_assignments[1])
180
- end
181
-
182
- def test_find_or_create_by
183
- suburb = Suburb.find_by(:city_id => 3, :suburb_id => 1)
184
- assert_nil(suburb)
185
-
186
- suburb = Suburb.find_or_create_by!(:name => 'New Suburb', :city_id => 3, :suburb_id => 1)
187
- refute_nil(suburb)
188
- end
189
-
190
- def test_cache
191
- Suburb.cache do
192
- # Suburb does not exist
193
- suburb = Suburb.find_by(:city_id => 10, :suburb_id => 10)
194
- assert_nil(suburb)
195
-
196
- # Create it
197
- suburb = Suburb.create!(:name => 'New Suburb', :city_id => 10, :suburb_id => 10)
198
-
199
- # Should be able to find it
200
- suburb = Suburb.find_by(:city_id => 10)
201
- refute_nil(suburb)
202
- refute_nil(suburb.city_id)
203
- refute_nil(suburb.suburb_id)
204
- end
205
- end
206
- 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