composite_primary_keys 12.0.9 → 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.
- checksums.yaml +4 -4
- data/History.rdoc +883 -877
- data/README.rdoc +181 -180
- data/lib/composite_primary_keys.rb +119 -117
- data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -19
- data/lib/composite_primary_keys/associations/association_scope.rb +66 -68
- data/lib/composite_primary_keys/associations/join_dependency.rb +118 -103
- data/lib/composite_primary_keys/attribute_methods.rb +21 -9
- data/lib/composite_primary_keys/attribute_methods/primary_key.rb +0 -2
- data/lib/composite_primary_keys/attribute_methods/read.rb +30 -30
- data/lib/composite_primary_keys/attribute_methods/write.rb +35 -35
- data/lib/composite_primary_keys/base.rb +141 -141
- data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +37 -37
- data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +44 -44
- data/lib/composite_primary_keys/core.rb +48 -48
- data/lib/composite_primary_keys/nested_attributes.rb +1 -1
- data/lib/composite_primary_keys/persistence.rb +82 -81
- data/lib/composite_primary_keys/reflection.rb +91 -29
- data/lib/composite_primary_keys/relation.rb +197 -193
- data/lib/composite_primary_keys/relation/batches.rb +15 -7
- data/lib/composite_primary_keys/relation/calculations.rb +104 -81
- data/lib/composite_primary_keys/relation/finder_methods.rb +235 -235
- data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +39 -20
- data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
- data/lib/composite_primary_keys/relation/where_clause.rb +18 -23
- data/lib/composite_primary_keys/table_metadata.rb +11 -0
- data/lib/composite_primary_keys/version.rb +8 -8
- data/test/abstract_unit.rb +114 -114
- data/test/connections/databases.ci.yml +22 -22
- data/test/fixtures/db_definitions/db2-create-tables.sql +112 -112
- data/test/fixtures/db_definitions/db2-drop-tables.sql +16 -16
- data/test/fixtures/db_definitions/mysql.sql +180 -180
- data/test/fixtures/db_definitions/oracle.drop.sql +41 -41
- data/test/fixtures/db_definitions/oracle.sql +199 -199
- data/test/fixtures/db_definitions/postgresql.sql +182 -182
- data/test/fixtures/db_definitions/sqlite.sql +169 -169
- data/test/fixtures/db_definitions/sqlserver.sql +176 -176
- data/test/fixtures/department.rb +16 -16
- data/test/fixtures/departments.yml +19 -15
- data/test/fixtures/employees.yml +33 -28
- data/test/fixtures/restaurants_suburbs.yml +10 -10
- data/test/fixtures/streets.yml +16 -16
- data/test/fixtures/suburbs.yml +14 -14
- data/test/fixtures/user.rb +11 -11
- data/test/test_associations.rb +364 -358
- data/test/test_attributes.rb +75 -60
- data/test/test_calculations.rb +49 -42
- data/test/test_create.rb +218 -206
- data/test/test_delete.rb +182 -179
- data/test/test_exists.rb +39 -39
- data/test/test_find.rb +170 -164
- data/test/test_ids.rb +112 -112
- data/test/test_nested_attributes.rb +67 -67
- data/test/test_update.rb +96 -96
- metadata +12 -11
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
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
ReferenceCode.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
ReferenceCode.
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
Department.
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
department.
|
48
|
-
assert_equal(
|
49
|
-
|
50
|
-
department.
|
51
|
-
assert_equal(0, department.employees.size, "After clear
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
department.
|
59
|
-
assert_equal
|
60
|
-
department.
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
tariff
|
69
|
-
tariff.
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
#
|
85
|
-
department.
|
86
|
-
|
87
|
-
#
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
#
|
153
|
-
|
154
|
-
|
155
|
-
#
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
product.product_tariffs.
|
165
|
-
|
166
|
-
product.
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
reference_type.reference_codes
|
176
|
-
reference_type.
|
177
|
-
|
178
|
-
|
179
|
-
|
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,164 +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_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(
|
133
|
-
end
|
134
|
-
|
135
|
-
def
|
136
|
-
departments = Department.
|
137
|
-
employees = Employee.where(:department => departments)
|
138
|
-
assert_equal(
|
139
|
-
end
|
140
|
-
|
141
|
-
def
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
assert_equal(
|
163
|
-
|
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(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
|