composite_primary_keys 12.0.9 → 12.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +880 -877
  3. data/README.rdoc +180 -180
  4. data/lib/composite_primary_keys.rb +117 -117
  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 -37
  13. data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +44 -44
  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/calculations.rb +81 -81
  19. data/lib/composite_primary_keys/relation/finder_methods.rb +235 -235
  20. data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +20 -20
  21. data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
  22. data/lib/composite_primary_keys/relation/where_clause.rb +23 -23
  23. data/lib/composite_primary_keys/version.rb +8 -8
  24. data/test/abstract_unit.rb +114 -114
  25. data/test/connections/databases.ci.yml +22 -22
  26. data/test/fixtures/db_definitions/db2-create-tables.sql +112 -112
  27. data/test/fixtures/db_definitions/db2-drop-tables.sql +16 -16
  28. data/test/fixtures/db_definitions/mysql.sql +180 -180
  29. data/test/fixtures/db_definitions/oracle.drop.sql +41 -41
  30. data/test/fixtures/db_definitions/oracle.sql +199 -199
  31. data/test/fixtures/db_definitions/postgresql.sql +182 -182
  32. data/test/fixtures/db_definitions/sqlite.sql +169 -169
  33. data/test/fixtures/db_definitions/sqlserver.sql +176 -176
  34. data/test/fixtures/department.rb +16 -16
  35. data/test/fixtures/departments.yml +15 -15
  36. data/test/fixtures/employees.yml +27 -27
  37. data/test/fixtures/restaurants_suburbs.yml +10 -10
  38. data/test/fixtures/streets.yml +16 -16
  39. data/test/fixtures/suburbs.yml +14 -14
  40. data/test/fixtures/user.rb +11 -11
  41. data/test/test_associations.rb +358 -358
  42. data/test/test_attributes.rb +60 -60
  43. data/test/test_calculations.rb +42 -42
  44. data/test/test_create.rb +218 -206
  45. data/test/test_delete.rb +182 -179
  46. data/test/test_exists.rb +39 -39
  47. data/test/test_find.rb +164 -164
  48. data/test/test_ids.rb +112 -112
  49. data/test/test_nested_attributes.rb +67 -67
  50. data/test/test_update.rb +96 -96
  51. metadata +9 -9
data/test/test_delete.rb CHANGED
@@ -1,179 +1,182 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestDelete < ActiveSupport::TestCase
4
- fixtures :articles, :departments, :employees, :products, :tariffs, :product_tariffs,
5
- :reference_types, :reference_codes
6
-
7
- def test_delete_one
8
- assert_equal(5, ReferenceCode.count)
9
- ReferenceCode.first.delete
10
- assert_equal(4, ReferenceCode.count)
11
- end
12
-
13
- def test_delete_one_with_id
14
- assert_equal(5, ReferenceCode.count)
15
- ReferenceCode.delete(ReferenceCode.first.id)
16
- assert_equal(4, ReferenceCode.count)
17
- end
18
-
19
- def test_destroy_one
20
- assert_equal(5, ReferenceCode.count)
21
- ReferenceCode.first.destroy
22
- assert_equal(4, ReferenceCode.count)
23
- end
24
-
25
- def test_delete_all
26
- refute_empty(ReferenceCode.all)
27
- ReferenceCode.delete_all
28
- assert_empty(ReferenceCode.all)
29
- end
30
-
31
- def test_delete_all_with_join
32
- employee = employees(:mindy)
33
-
34
- assert_equal(4, Department.count)
35
-
36
- Department.joins(:employees).
37
- where('employees.name = ?', employee.name).
38
- delete_all
39
-
40
- assert_equal(3, Department.count)
41
- end
42
-
43
- def test_clear_association
44
- department = Department.find([1,1])
45
- assert_equal(2, department.employees.size, "Before clear employee count should be 2.")
46
-
47
- department.employees.clear
48
- assert_equal(0, department.employees.size, "After clear employee count should be 0.")
49
-
50
- department.reload
51
- assert_equal(0, department.employees.size, "After clear and a reload from DB employee count should be 0.")
52
- end
53
-
54
- def test_delete_association
55
- department = Department.find([1,1])
56
- assert_equal 2, department.employees.size , "Before delete employee count should be 2."
57
- first_employee = department.employees[0]
58
- department.employees.delete(first_employee)
59
- assert_equal 1, department.employees.size, "After delete employee count should be 1."
60
- department.reload
61
- assert_equal 1, department.employees.size, "After delete and a reload from DB employee count should be 1."
62
- end
63
-
64
- def test_has_many_replace
65
- tariff = tariffs(:flat)
66
- assert_equal(1, tariff.product_tariffs.length)
67
-
68
- tariff.product_tariffs = [product_tariffs(:first_free), product_tariffs(:second_free)]
69
- tariff.reload
70
-
71
- assert_equal(2, tariff.product_tariffs.length)
72
- refute(tariff.product_tariffs.include?(tariff))
73
- end
74
-
75
- def test_destroy_has_one
76
- # In this case the association is a has_one with
77
- # dependent set to :destroy
78
- department = departments(:engineering)
79
- assert_not_nil(department.head)
80
-
81
- # Get head employee id
82
- head_id = department.head.id
83
-
84
- # Delete department - should delete the head
85
- department.destroy
86
-
87
- # Verify the head is also
88
- assert_raise(ActiveRecord::RecordNotFound) do
89
- Employee.find(head_id)
90
- end
91
- end
92
-
93
- def test_destroy_has_and_belongs_to_many_on_non_cpk
94
- steve = employees(:steve)
95
- records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
96
- steve.destroy
97
- records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
98
- if records_before.respond_to?(:count)
99
- assert_equal records_after.count, records_before.count - steve.groups.count
100
- elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
101
- assert_equal records_after.row_count, records_before.row_count - steve.groups.count
102
- end
103
- end
104
-
105
- def test_create_destroy_has_and_belongs_to_many_on_non_cpk
106
- records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
107
- employee = Employee.create!(department_id: 3, location_id: 2, name: 'Jon')
108
- employee.groups << Group.create(name: 'test')
109
- employee.destroy!
110
- records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
111
- if records_before.respond_to?(:count)
112
- assert_equal records_before.count, records_after.count
113
- elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
114
- assert_equal records_before.row_count, records_after.row_count
115
- end
116
- end
117
-
118
- def test_create_destroy_all_has_and_belongs_to_many_on_non_cpk
119
- records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
120
- employee = Employee.create!(department_id: 3, location_id: 2, name: 'Jon')
121
- employee.groups << Group.create(name: 'test')
122
- employee.groups.destroy_all
123
- records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
124
- if records_before.respond_to?(:count)
125
- assert_equal records_before.count, records_after.count
126
- elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
127
- assert_equal records_before.row_count, records_after.row_count
128
- end
129
- end
130
-
131
- def test_delete_not_destroy_on_cpk
132
- tariff = Tariff.where(tariff_id: 2).first
133
- tariff.delete
134
- refute(tariff.persisted?)
135
- end
136
-
137
- def test_delete_not_destroy_on_non_cpk
138
- article = articles(:third)
139
- article.delete
140
- refute(article.persisted?)
141
- end
142
-
143
- def test_destroy_has_many_delete_all
144
- # In this case the association is a has_many composite key with
145
- # dependent set to :delete_all
146
- product = Product.find(1)
147
- assert_equal(2, product.product_tariffs.length)
148
-
149
- # Get product_tariff length
150
- product_tariff_size = ProductTariff.count
151
-
152
- # Delete product - should delete 2 product tariffs
153
- product.destroy
154
-
155
- # Verify product_tariff are deleted
156
- assert_equal(product_tariff_size - 2, ProductTariff.count)
157
- end
158
-
159
- def test_delete_cpk_association
160
- product = Product.find(1)
161
- assert_equal(2, product.product_tariffs.length)
162
-
163
- product_tariff = product.product_tariffs.first
164
- product.product_tariffs.delete(product_tariff)
165
-
166
- product.reload
167
- assert_equal(1, product.product_tariffs.length)
168
- end
169
-
170
- def test_delete_records_for_has_many_association_with_composite_primary_key
171
- reference_type = ReferenceType.find(1)
172
- codes_to_delete = reference_type.reference_codes[0..1]
173
- assert_equal(3, reference_type.reference_codes.size, "Before deleting records reference_code count should be 3.")
174
-
175
- reference_type.reference_codes.delete(codes_to_delete)
176
- reference_type.reload
177
- assert_equal(1, reference_type.reference_codes.size, "After deleting 2 records and a reload from DB reference_code count should be 1.")
178
- end
179
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestDelete < ActiveSupport::TestCase
4
+ fixtures :articles, :departments, :employees, :products, :tariffs, :product_tariffs,
5
+ :reference_types, :reference_codes
6
+
7
+ def test_delete_one
8
+ assert_equal(5, ReferenceCode.count)
9
+ ReferenceCode.first.delete
10
+ assert_equal(4, ReferenceCode.count)
11
+ end
12
+
13
+ def test_delete_one_with_id
14
+ assert_equal(5, ReferenceCode.count)
15
+ deleted = ReferenceCode.delete(ReferenceCode.first.id)
16
+ assert_equal(4, ReferenceCode.count)
17
+ assert_equal(1, deleted)
18
+ end
19
+
20
+ def test_destroy_one
21
+ assert_equal(5, ReferenceCode.count)
22
+ ReferenceCode.first.destroy
23
+ assert_equal(4, ReferenceCode.count)
24
+ end
25
+
26
+ def test_delete_all
27
+ refute_empty(ReferenceCode.all)
28
+ deleted = ReferenceCode.delete_all
29
+ assert_empty(ReferenceCode.all)
30
+ assert_equal(5, deleted)
31
+ end
32
+
33
+ def test_delete_all_with_join
34
+ employee = employees(:mindy)
35
+
36
+ assert_equal(4, Department.count)
37
+
38
+ deleted = Department.joins(:employees).
39
+ where('employees.name = ?', employee.name).
40
+ delete_all
41
+
42
+ assert_equal(3, Department.count)
43
+ assert_equal(1, deleted)
44
+ end
45
+
46
+ def test_clear_association
47
+ department = Department.find([1,1])
48
+ assert_equal(2, department.employees.size, "Before clear employee count should be 2.")
49
+
50
+ department.employees.clear
51
+ assert_equal(0, department.employees.size, "After clear employee count should be 0.")
52
+
53
+ department.reload
54
+ assert_equal(0, department.employees.size, "After clear and a reload from DB employee count should be 0.")
55
+ end
56
+
57
+ def test_delete_association
58
+ department = Department.find([1,1])
59
+ assert_equal 2, department.employees.size , "Before delete employee count should be 2."
60
+ first_employee = department.employees[0]
61
+ department.employees.delete(first_employee)
62
+ assert_equal 1, department.employees.size, "After delete employee count should be 1."
63
+ department.reload
64
+ assert_equal 1, department.employees.size, "After delete and a reload from DB employee count should be 1."
65
+ end
66
+
67
+ def test_has_many_replace
68
+ tariff = tariffs(:flat)
69
+ assert_equal(1, tariff.product_tariffs.length)
70
+
71
+ tariff.product_tariffs = [product_tariffs(:first_free), product_tariffs(:second_free)]
72
+ tariff.reload
73
+
74
+ assert_equal(2, tariff.product_tariffs.length)
75
+ refute(tariff.product_tariffs.include?(tariff))
76
+ end
77
+
78
+ def test_destroy_has_one
79
+ # In this case the association is a has_one with
80
+ # dependent set to :destroy
81
+ department = departments(:engineering)
82
+ assert_not_nil(department.head)
83
+
84
+ # Get head employee id
85
+ head_id = department.head.id
86
+
87
+ # Delete department - should delete the head
88
+ department.destroy
89
+
90
+ # Verify the head is also
91
+ assert_raise(ActiveRecord::RecordNotFound) do
92
+ Employee.find(head_id)
93
+ end
94
+ end
95
+
96
+ def test_destroy_has_and_belongs_to_many_on_non_cpk
97
+ steve = employees(:steve)
98
+ records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
99
+ steve.destroy
100
+ records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
101
+ if records_before.respond_to?(:count)
102
+ assert_equal records_after.count, records_before.count - steve.groups.count
103
+ elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
104
+ assert_equal records_after.row_count, records_before.row_count - steve.groups.count
105
+ end
106
+ end
107
+
108
+ def test_create_destroy_has_and_belongs_to_many_on_non_cpk
109
+ records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
110
+ employee = Employee.create!(department_id: 3, location_id: 2, name: 'Jon')
111
+ employee.groups << Group.create(name: 'test')
112
+ employee.destroy!
113
+ records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
114
+ if records_before.respond_to?(:count)
115
+ assert_equal records_before.count, records_after.count
116
+ elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
117
+ assert_equal records_before.row_count, records_after.row_count
118
+ end
119
+ end
120
+
121
+ def test_create_destroy_all_has_and_belongs_to_many_on_non_cpk
122
+ records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
123
+ employee = Employee.create!(department_id: 3, location_id: 2, name: 'Jon')
124
+ employee.groups << Group.create(name: 'test')
125
+ employee.groups.destroy_all
126
+ records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
127
+ if records_before.respond_to?(:count)
128
+ assert_equal records_before.count, records_after.count
129
+ elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
130
+ assert_equal records_before.row_count, records_after.row_count
131
+ end
132
+ end
133
+
134
+ def test_delete_not_destroy_on_cpk
135
+ tariff = Tariff.where(tariff_id: 2).first
136
+ tariff.delete
137
+ refute(tariff.persisted?)
138
+ end
139
+
140
+ def test_delete_not_destroy_on_non_cpk
141
+ article = articles(:third)
142
+ article.delete
143
+ refute(article.persisted?)
144
+ end
145
+
146
+ def test_destroy_has_many_delete_all
147
+ # In this case the association is a has_many composite key with
148
+ # dependent set to :delete_all
149
+ product = Product.find(1)
150
+ assert_equal(2, product.product_tariffs.length)
151
+
152
+ # Get product_tariff length
153
+ product_tariff_size = ProductTariff.count
154
+
155
+ # Delete product - should delete 2 product tariffs
156
+ product.destroy
157
+
158
+ # Verify product_tariff are deleted
159
+ assert_equal(product_tariff_size - 2, ProductTariff.count)
160
+ end
161
+
162
+ def test_delete_cpk_association
163
+ product = Product.find(1)
164
+ assert_equal(2, product.product_tariffs.length)
165
+
166
+ product_tariff = product.product_tariffs.first
167
+ product.product_tariffs.delete(product_tariff)
168
+
169
+ product.reload
170
+ assert_equal(1, product.product_tariffs.length)
171
+ end
172
+
173
+ def test_delete_records_for_has_many_association_with_composite_primary_key
174
+ reference_type = ReferenceType.find(1)
175
+ codes_to_delete = reference_type.reference_codes[0..1]
176
+ assert_equal(3, reference_type.reference_codes.size, "Before deleting records reference_code count should be 3.")
177
+
178
+ reference_type.reference_codes.delete(codes_to_delete)
179
+ reference_type.reload
180
+ assert_equal(1, reference_type.reference_codes.size, "After deleting 2 records and a reload from DB reference_code count should be 1.")
181
+ end
182
+ end
data/test/test_exists.rb CHANGED
@@ -1,40 +1,40 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestExists < ActiveSupport::TestCase
4
- fixtures :articles, :capitols, :departments, :dorms
5
-
6
- def test_id
7
- assert(Dorm.exists?(1))
8
- refute(Dorm.exists?(-1))
9
- end
10
-
11
- def test_array
12
- assert(Article.exists?(['name = ?', 'Article One']))
13
- assert(!Article.exists?(['name = ?', 'Article -1']))
14
- end
15
-
16
- def test_hash
17
- assert(Article.exists?('name' => 'Article One'))
18
- assert(!Article.exists?('name' => 'Article -1'))
19
- end
20
-
21
- def test_cpk_id
22
- assert(Department.exists?(CompositePrimaryKeys::CompositeKeys.new([1,1])))
23
- assert(!Department.exists?(CompositePrimaryKeys::CompositeKeys.new([1,-1])))
24
- end
25
-
26
- def test_cpk_array_id
27
- assert(Department.exists?([1,1]))
28
- assert(!Department.exists?([1,-1]))
29
- end
30
-
31
- def test_cpk_array_condition
32
- assert(Department.exists?(['id = ? and location_id = ?', 1, 1]))
33
- assert(!Department.exists?(['id = ? and location_id = ?', 1, -1]))
34
- end
35
-
36
- def test_cpk_array_string_id
37
- assert(Capitol.exists?(['The Netherlands', 'Amsterdam']))
38
- assert(!Capitol.exists?(['The Netherlands', 'Paris']))
39
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestExists < ActiveSupport::TestCase
4
+ fixtures :articles, :capitols, :departments, :dorms
5
+
6
+ def test_id
7
+ assert(Dorm.exists?(1))
8
+ refute(Dorm.exists?(-1))
9
+ end
10
+
11
+ def test_array
12
+ assert(Article.exists?(['name = ?', 'Article One']))
13
+ assert(!Article.exists?(['name = ?', 'Article -1']))
14
+ end
15
+
16
+ def test_hash
17
+ assert(Article.exists?('name' => 'Article One'))
18
+ assert(!Article.exists?('name' => 'Article -1'))
19
+ end
20
+
21
+ def test_cpk_id
22
+ assert(Department.exists?(CompositePrimaryKeys::CompositeKeys.new([1,1])))
23
+ assert(!Department.exists?(CompositePrimaryKeys::CompositeKeys.new([1,-1])))
24
+ end
25
+
26
+ def test_cpk_array_id
27
+ assert(Department.exists?([1,1]))
28
+ assert(!Department.exists?([1,-1]))
29
+ end
30
+
31
+ def test_cpk_array_condition
32
+ assert(Department.exists?(['id = ? and location_id = ?', 1, 1]))
33
+ assert(!Department.exists?(['id = ? and location_id = ?', 1, -1]))
34
+ end
35
+
36
+ def test_cpk_array_string_id
37
+ assert(Capitol.exists?(['The Netherlands', 'Amsterdam']))
38
+ assert(!Capitol.exists?(['The Netherlands', 'Paris']))
39
+ end
40
40
  end
data/test/test_find.rb CHANGED
@@ -1,164 +1,164 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- # Testing the find action on composite ActiveRecords with two primary keys
4
- class TestFind < ActiveSupport::TestCase
5
- fixtures :capitols, :departments, :reference_types, :reference_codes,
6
- :suburbs, :employees
7
-
8
- def test_find_first
9
- ref_code = ReferenceCode.order('reference_type_id, reference_code').first
10
- assert_kind_of(ReferenceCode, ref_code)
11
- assert_equal([1,1], ref_code.id)
12
- end
13
-
14
- def test_find_last
15
- ref_code = ReferenceCode.order('reference_type_id, reference_code').last
16
- assert_kind_of(ReferenceCode, ref_code)
17
- assert_equal([2,2], ref_code.id)
18
- end
19
-
20
- def test_find_one
21
- ref_code = ReferenceCode.find([1,3])
22
- assert_not_nil(ref_code)
23
- assert_equal([1,3], ref_code.id)
24
- end
25
-
26
- def test_find_some
27
- ref_codes = ReferenceCode.find([1,3], [2,1])
28
- assert_kind_of(Array, ref_codes)
29
- assert_equal(2, ref_codes.length)
30
-
31
- ref_code = ref_codes[0]
32
- assert_equal([1,3], ref_code.id)
33
-
34
- ref_code = ref_codes[1]
35
- assert_equal([2,1], ref_code.id)
36
- end
37
-
38
- def test_find_with_strings_as_composite_keys
39
- capitol = Capitol.find(['The Netherlands', 'Amsterdam'])
40
- assert_kind_of(Capitol, capitol)
41
- assert_equal(['The Netherlands', 'Amsterdam'], capitol.id)
42
- end
43
-
44
- def test_find_with_strings_with_comma_as_composite_keys
45
- capitol = Capitol.create!(country: 'The USA', city: 'Washington, D.C.')
46
- assert_equal ['The USA', 'Washington, D.C.'], capitol.id
47
-
48
- assert_equal capitol, Capitol.find(['The USA', 'Washington, D.C.'])
49
- assert_equal capitol, Capitol.find(capitol.to_param)
50
- end
51
-
52
- def test_find_each
53
- room_assignments = []
54
- RoomAssignment.find_each(:batch_size => 2) do |assignment|
55
- room_assignments << assignment
56
- end
57
-
58
- assert_equal(RoomAssignment.count, room_assignments.uniq.length)
59
- end
60
-
61
- def test_find_each_with_scope
62
- scoped_departments = Department.where("id <> 3")
63
- scoped_departments.find_each(:batch_size => 2) do |department|
64
- assert department.id != 3
65
- end
66
- end
67
-
68
- def test_not_found
69
- error = assert_raise(::ActiveRecord::RecordNotFound) do
70
- ReferenceCode.find(['999', '999'])
71
- end
72
-
73
- expected = "Couldn't find all ReferenceCodes with 'reference_type_id,reference_code': (999, 999) (found 0 results, but was looking for 1)."
74
- assert_equal(with_quoted_identifiers(expected), error.message)
75
- end
76
-
77
- def test_find_with_invalid_ids
78
- assert_raise(::ActiveRecord::RecordNotFound) do
79
- Suburb.find([-1, -1])
80
- end
81
- end
82
-
83
- def test_find_with_no_ids
84
- assert_raise(::ActiveRecord::RecordNotFound) do
85
- Suburb.find
86
- end
87
- end
88
-
89
- def test_find_last_suburb
90
- suburb = Suburb.last
91
- assert_equal([2,2], suburb.id)
92
- end
93
-
94
- def test_find_last_suburb_with_order
95
- # Rails actually changes city_id DESC to city_id ASC
96
- suburb = Suburb.order('suburbs.city_id DESC').last
97
- assert_equal([1,1], suburb.id)
98
- end
99
-
100
- def test_find_in_batches
101
- Department.find_in_batches do |batch|
102
- assert_equal(Department.count, batch.size)
103
- end
104
- end
105
-
106
- def test_in_batches_enumerator
107
- enumerator = Department.in_batches
108
- enumerator.each do |batch|
109
- assert_equal(Department.count, batch.size)
110
- end
111
- end
112
-
113
- def test_in_batches_of_1
114
- num_found = 0
115
- Department.in_batches(of: 1) do |batch|
116
- batch.each do |dept|
117
- num_found += 1
118
- end
119
- end
120
- assert_equal(Department.count, num_found)
121
- end
122
-
123
- def test_find_by_one_association
124
- department = departments(:engineering)
125
- employees = Employee.where(:department => department)
126
- assert_equal(2, employees.to_a.count)
127
- end
128
-
129
- def test_find_by_all_associations
130
- departments = Department.all
131
- employees = Employee.where(:department => departments)
132
- assert_equal(5, employees.to_a.count)
133
- end
134
-
135
- def test_expand_all
136
- departments = Department.all
137
- employees = Employee.where(:department => departments)
138
- assert_equal(5, employees.count)
139
- end
140
-
141
- def test_find_one_with_params_id
142
- params_id = ReferenceCode.find([1,3]).to_param
143
- assert_equal params_id, "1,3"
144
-
145
- ref_code = ReferenceCode.find(params_id)
146
- assert_not_nil(ref_code)
147
- assert_equal([1,3], ref_code.id)
148
- end
149
-
150
- def test_find_some_with_array_of_params_id
151
- params_ids = ReferenceCode.find([1,3], [2,1]).map(&:to_param)
152
- assert_equal ["1,3", "2,1"], params_ids
153
-
154
- ref_codes = ReferenceCode.find(params_ids)
155
- assert_kind_of(Array, ref_codes)
156
- assert_equal(2, ref_codes.length)
157
-
158
- ref_code = ref_codes[0]
159
- assert_equal([1,3], ref_code.id)
160
-
161
- ref_code = ref_codes[1]
162
- assert_equal([2,1], ref_code.id)
163
- end
164
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ # Testing the find action on composite ActiveRecords with two primary keys
4
+ class TestFind < ActiveSupport::TestCase
5
+ fixtures :capitols, :departments, :reference_types, :reference_codes,
6
+ :suburbs, :employees
7
+
8
+ def test_find_first
9
+ ref_code = ReferenceCode.order('reference_type_id, reference_code').first
10
+ assert_kind_of(ReferenceCode, ref_code)
11
+ assert_equal([1,1], ref_code.id)
12
+ end
13
+
14
+ def test_find_last
15
+ ref_code = ReferenceCode.order('reference_type_id, reference_code').last
16
+ assert_kind_of(ReferenceCode, ref_code)
17
+ assert_equal([2,2], ref_code.id)
18
+ end
19
+
20
+ def test_find_one
21
+ ref_code = ReferenceCode.find([1,3])
22
+ assert_not_nil(ref_code)
23
+ assert_equal([1,3], ref_code.id)
24
+ end
25
+
26
+ def test_find_some
27
+ ref_codes = ReferenceCode.find([1,3], [2,1])
28
+ assert_kind_of(Array, ref_codes)
29
+ assert_equal(2, ref_codes.length)
30
+
31
+ ref_code = ref_codes[0]
32
+ assert_equal([1,3], ref_code.id)
33
+
34
+ ref_code = ref_codes[1]
35
+ assert_equal([2,1], ref_code.id)
36
+ end
37
+
38
+ def test_find_with_strings_as_composite_keys
39
+ capitol = Capitol.find(['The Netherlands', 'Amsterdam'])
40
+ assert_kind_of(Capitol, capitol)
41
+ assert_equal(['The Netherlands', 'Amsterdam'], capitol.id)
42
+ end
43
+
44
+ def test_find_with_strings_with_comma_as_composite_keys
45
+ capitol = Capitol.create!(country: 'The USA', city: 'Washington, D.C.')
46
+ assert_equal ['The USA', 'Washington, D.C.'], capitol.id
47
+
48
+ assert_equal capitol, Capitol.find(['The USA', 'Washington, D.C.'])
49
+ assert_equal capitol, Capitol.find(capitol.to_param)
50
+ end
51
+
52
+ def test_find_each
53
+ room_assignments = []
54
+ RoomAssignment.find_each(:batch_size => 2) do |assignment|
55
+ room_assignments << assignment
56
+ end
57
+
58
+ assert_equal(RoomAssignment.count, room_assignments.uniq.length)
59
+ end
60
+
61
+ def test_find_each_with_scope
62
+ scoped_departments = Department.where("id <> 3")
63
+ scoped_departments.find_each(:batch_size => 2) do |department|
64
+ assert department.id != 3
65
+ end
66
+ end
67
+
68
+ def test_not_found
69
+ error = assert_raise(::ActiveRecord::RecordNotFound) do
70
+ ReferenceCode.find(['999', '999'])
71
+ end
72
+
73
+ expected = "Couldn't find all ReferenceCodes with 'reference_type_id,reference_code': (999, 999) (found 0 results, but was looking for 1)."
74
+ assert_equal(with_quoted_identifiers(expected), error.message)
75
+ end
76
+
77
+ def test_find_with_invalid_ids
78
+ assert_raise(::ActiveRecord::RecordNotFound) do
79
+ Suburb.find([-1, -1])
80
+ end
81
+ end
82
+
83
+ def test_find_with_no_ids
84
+ assert_raise(::ActiveRecord::RecordNotFound) do
85
+ Suburb.find
86
+ end
87
+ end
88
+
89
+ def test_find_last_suburb
90
+ suburb = Suburb.last
91
+ assert_equal([2,2], suburb.id)
92
+ end
93
+
94
+ def test_find_last_suburb_with_order
95
+ # Rails actually changes city_id DESC to city_id ASC
96
+ suburb = Suburb.order('suburbs.city_id DESC').last
97
+ assert_equal([1,1], suburb.id)
98
+ end
99
+
100
+ def test_find_in_batches
101
+ Department.find_in_batches do |batch|
102
+ assert_equal(Department.count, batch.size)
103
+ end
104
+ end
105
+
106
+ def test_in_batches_enumerator
107
+ enumerator = Department.in_batches
108
+ enumerator.each do |batch|
109
+ assert_equal(Department.count, batch.size)
110
+ end
111
+ end
112
+
113
+ def test_in_batches_of_1
114
+ num_found = 0
115
+ Department.in_batches(of: 1) do |batch|
116
+ batch.each do |dept|
117
+ num_found += 1
118
+ end
119
+ end
120
+ assert_equal(Department.count, num_found)
121
+ end
122
+
123
+ def test_find_by_one_association
124
+ department = departments(:engineering)
125
+ employees = Employee.where(:department => department)
126
+ assert_equal(2, employees.to_a.count)
127
+ end
128
+
129
+ def test_find_by_all_associations
130
+ departments = Department.all
131
+ employees = Employee.where(:department => departments)
132
+ assert_equal(5, employees.to_a.count)
133
+ end
134
+
135
+ def test_expand_all
136
+ departments = Department.all
137
+ employees = Employee.where(:department => departments)
138
+ assert_equal(5, employees.count)
139
+ end
140
+
141
+ def test_find_one_with_params_id
142
+ params_id = ReferenceCode.find([1,3]).to_param
143
+ assert_equal params_id, "1,3"
144
+
145
+ ref_code = ReferenceCode.find(params_id)
146
+ assert_not_nil(ref_code)
147
+ assert_equal([1,3], ref_code.id)
148
+ end
149
+
150
+ def test_find_some_with_array_of_params_id
151
+ params_ids = ReferenceCode.find([1,3], [2,1]).map(&:to_param)
152
+ assert_equal ["1,3", "2,1"], params_ids
153
+
154
+ ref_codes = ReferenceCode.find(params_ids)
155
+ assert_kind_of(Array, ref_codes)
156
+ assert_equal(2, ref_codes.length)
157
+
158
+ ref_code = ref_codes[0]
159
+ assert_equal([1,3], ref_code.id)
160
+
161
+ ref_code = ref_codes[1]
162
+ assert_equal([2,1], ref_code.id)
163
+ end
164
+ end