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
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(5, Department.count)
37
+
38
+ deleted = Department.joins(:employees).
39
+ where('employees.name = ?', employee.name).
40
+ delete_all
41
+
42
+ assert_equal(4, 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,157 +1,170 @@
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_of_1
107
- num_found = 0
108
- Department.in_batches(of: 1) do |batch|
109
- batch.each do |dept|
110
- num_found += 1
111
- end
112
- end
113
- assert_equal(Department.count, num_found)
114
- end
115
-
116
- def test_find_by_one_association
117
- department = departments(:engineering)
118
- employees = Employee.where(:department => department)
119
- assert_equal(2, employees.to_a.count)
120
- end
121
-
122
- def test_find_by_all_associations
123
- departments = Department.all
124
- employees = Employee.where(:department => departments)
125
- assert_equal(5, employees.to_a.count)
126
- end
127
-
128
- def test_expand_all
129
- departments = Department.all
130
- employees = Employee.where(:department => departments)
131
- assert_equal(5, employees.count)
132
- end
133
-
134
- def test_find_one_with_params_id
135
- params_id = ReferenceCode.find([1,3]).to_param
136
- assert_equal params_id, "1,3"
137
-
138
- ref_code = ReferenceCode.find(params_id)
139
- assert_not_nil(ref_code)
140
- assert_equal([1,3], ref_code.id)
141
- end
142
-
143
- def test_find_some_with_array_of_params_id
144
- params_ids = ReferenceCode.find([1,3], [2,1]).map(&:to_param)
145
- assert_equal ["1,3", "2,1"], params_ids
146
-
147
- ref_codes = ReferenceCode.find(params_ids)
148
- assert_kind_of(Array, ref_codes)
149
- assert_equal(2, ref_codes.length)
150
-
151
- ref_code = ref_codes[0]
152
- assert_equal([1,3], ref_code.id)
153
-
154
- ref_code = ref_codes[1]
155
- assert_equal([2,1], ref_code.id)
156
- end
157
- 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(6, employees.to_a.count)
133
+ end
134
+
135
+ def test_find_by_some_associations
136
+ departments = Department.where(location_id: 1)
137
+ employees = Employee.where(:department => departments)
138
+ assert_equal(4, employees.to_a.count)
139
+ end
140
+
141
+ def test_expand_all
142
+ departments = Department.all
143
+ employees = Employee.where(:department => departments)
144
+ assert_equal(6, employees.count)
145
+ end
146
+
147
+ def test_find_one_with_params_id
148
+ params_id = ReferenceCode.find([1,3]).to_param
149
+ assert_equal params_id, "1,3"
150
+
151
+ ref_code = ReferenceCode.find(params_id)
152
+ assert_not_nil(ref_code)
153
+ assert_equal([1,3], ref_code.id)
154
+ end
155
+
156
+ def test_find_some_with_array_of_params_id
157
+ params_ids = ReferenceCode.find([1,3], [2,1]).map(&:to_param)
158
+ assert_equal ["1,3", "2,1"], params_ids
159
+
160
+ ref_codes = ReferenceCode.find(params_ids)
161
+ assert_kind_of(Array, ref_codes)
162
+ assert_equal(2, ref_codes.length)
163
+
164
+ ref_code = ref_codes[0]
165
+ assert_equal([1,3], ref_code.id)
166
+
167
+ ref_code = ref_codes[1]
168
+ assert_equal([2,1], ref_code.id)
169
+ end
170
+ end