composite_primary_keys 12.0.8 → 13.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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +888 -874
  3. data/README.rdoc +181 -180
  4. data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -19
  5. data/lib/composite_primary_keys/associations/association_scope.rb +66 -68
  6. data/lib/composite_primary_keys/associations/join_dependency.rb +137 -103
  7. data/lib/composite_primary_keys/attribute_methods/primary_key.rb +0 -2
  8. data/lib/composite_primary_keys/attribute_methods/read.rb +30 -30
  9. data/lib/composite_primary_keys/attribute_methods/write.rb +35 -35
  10. data/lib/composite_primary_keys/attribute_methods.rb +21 -9
  11. data/lib/composite_primary_keys/base.rb +141 -141
  12. data/lib/composite_primary_keys/composite_predicates.rb +2 -1
  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/batches.rb +15 -7
  20. data/lib/composite_primary_keys/relation/calculations.rb +104 -81
  21. data/lib/composite_primary_keys/relation/finder_methods.rb +235 -235
  22. data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +39 -20
  23. data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
  24. data/lib/composite_primary_keys/relation/where_clause.rb +18 -23
  25. data/lib/composite_primary_keys/relation.rb +197 -193
  26. data/lib/composite_primary_keys/table_metadata.rb +11 -0
  27. data/lib/composite_primary_keys/version.rb +8 -8
  28. data/lib/composite_primary_keys.rb +119 -119
  29. data/test/abstract_unit.rb +114 -114
  30. data/test/connections/databases.ci.yml +22 -22
  31. data/test/fixtures/db_definitions/db2-create-tables.sql +112 -112
  32. data/test/fixtures/db_definitions/db2-drop-tables.sql +16 -16
  33. data/test/fixtures/db_definitions/mysql.sql +180 -180
  34. data/test/fixtures/db_definitions/oracle.drop.sql +41 -41
  35. data/test/fixtures/db_definitions/oracle.sql +199 -199
  36. data/test/fixtures/db_definitions/postgresql.sql +182 -182
  37. data/test/fixtures/db_definitions/sqlite.sql +169 -169
  38. data/test/fixtures/db_definitions/sqlserver.sql +176 -176
  39. data/test/fixtures/department.rb +16 -16
  40. data/test/fixtures/departments.yml +19 -15
  41. data/test/fixtures/employees.yml +33 -28
  42. data/test/fixtures/membership.rb +8 -6
  43. data/test/fixtures/restaurants_suburbs.yml +10 -10
  44. data/test/fixtures/streets.yml +16 -16
  45. data/test/fixtures/suburbs.yml +14 -14
  46. data/test/fixtures/user.rb +11 -11
  47. data/test/test_associations.rb +372 -358
  48. data/test/test_attributes.rb +75 -60
  49. data/test/test_calculations.rb +49 -42
  50. data/test/test_create.rb +218 -206
  51. data/test/test_delete.rb +188 -179
  52. data/test/test_exists.rb +39 -39
  53. data/test/test_find.rb +170 -164
  54. data/test/test_ids.rb +112 -112
  55. data/test/test_nested_attributes.rb +67 -67
  56. data/test/test_update.rb +102 -96
  57. metadata +6 -6
  58. data/lib/composite_primary_keys/connection_adapters/mysql/database_statements.rb +0 -24
data/test/test_delete.rb CHANGED
@@ -1,179 +1,188 @@
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
+ tested_delete_all = false
35
+ Arel::Table.engine = nil # should not rely on the global Arel::Table.engine
36
+ employee = employees(:mindy)
37
+
38
+ assert_equal(5, Department.count)
39
+
40
+ deleted = Department.joins(:employees).
41
+ where('employees.name = ?', employee.name).
42
+ delete_all
43
+
44
+ assert_equal(4, Department.count)
45
+ assert_equal(1, deleted)
46
+ tested_delete_all = true
47
+ ensure
48
+ Arel::Table.engine = ActiveRecord::Base
49
+ assert tested_delete_all
50
+ end
51
+
52
+ def test_clear_association
53
+ department = Department.find([1,1])
54
+ assert_equal(2, department.employees.size, "Before clear employee count should be 2.")
55
+
56
+ department.employees.clear
57
+ assert_equal(0, department.employees.size, "After clear employee count should be 0.")
58
+
59
+ department.reload
60
+ assert_equal(0, department.employees.size, "After clear and a reload from DB employee count should be 0.")
61
+ end
62
+
63
+ def test_delete_association
64
+ department = Department.find([1,1])
65
+ assert_equal 2, department.employees.size , "Before delete employee count should be 2."
66
+ first_employee = department.employees[0]
67
+ department.employees.delete(first_employee)
68
+ assert_equal 1, department.employees.size, "After delete employee count should be 1."
69
+ department.reload
70
+ assert_equal 1, department.employees.size, "After delete and a reload from DB employee count should be 1."
71
+ end
72
+
73
+ def test_has_many_replace
74
+ tariff = tariffs(:flat)
75
+ assert_equal(1, tariff.product_tariffs.length)
76
+
77
+ tariff.product_tariffs = [product_tariffs(:first_free), product_tariffs(:second_free)]
78
+ tariff.reload
79
+
80
+ assert_equal(2, tariff.product_tariffs.length)
81
+ refute(tariff.product_tariffs.include?(tariff))
82
+ end
83
+
84
+ def test_destroy_has_one
85
+ # In this case the association is a has_one with
86
+ # dependent set to :destroy
87
+ department = departments(:engineering)
88
+ assert_not_nil(department.head)
89
+
90
+ # Get head employee id
91
+ head_id = department.head.id
92
+
93
+ # Delete department - should delete the head
94
+ department.destroy
95
+
96
+ # Verify the head is also
97
+ assert_raise(ActiveRecord::RecordNotFound) do
98
+ Employee.find(head_id)
99
+ end
100
+ end
101
+
102
+ def test_destroy_has_and_belongs_to_many_on_non_cpk
103
+ steve = employees(:steve)
104
+ records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
105
+ steve.destroy
106
+ records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
107
+ if records_before.respond_to?(:count)
108
+ assert_equal records_after.count, records_before.count - steve.groups.count
109
+ elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
110
+ assert_equal records_after.row_count, records_before.row_count - steve.groups.count
111
+ end
112
+ end
113
+
114
+ def test_create_destroy_has_and_belongs_to_many_on_non_cpk
115
+ records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
116
+ employee = Employee.create!(department_id: 3, location_id: 2, name: 'Jon')
117
+ employee.groups << Group.create(name: 'test')
118
+ employee.destroy!
119
+ records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
120
+ if records_before.respond_to?(:count)
121
+ assert_equal records_before.count, records_after.count
122
+ elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
123
+ assert_equal records_before.row_count, records_after.row_count
124
+ end
125
+ end
126
+
127
+ def test_create_destroy_all_has_and_belongs_to_many_on_non_cpk
128
+ records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
129
+ employee = Employee.create!(department_id: 3, location_id: 2, name: 'Jon')
130
+ employee.groups << Group.create(name: 'test')
131
+ employee.groups.destroy_all
132
+ records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
133
+ if records_before.respond_to?(:count)
134
+ assert_equal records_before.count, records_after.count
135
+ elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
136
+ assert_equal records_before.row_count, records_after.row_count
137
+ end
138
+ end
139
+
140
+ def test_delete_not_destroy_on_cpk
141
+ tariff = Tariff.where(tariff_id: 2).first
142
+ tariff.delete
143
+ refute(tariff.persisted?)
144
+ end
145
+
146
+ def test_delete_not_destroy_on_non_cpk
147
+ article = articles(:third)
148
+ article.delete
149
+ refute(article.persisted?)
150
+ end
151
+
152
+ def test_destroy_has_many_delete_all
153
+ # In this case the association is a has_many composite key with
154
+ # dependent set to :delete_all
155
+ product = Product.find(1)
156
+ assert_equal(2, product.product_tariffs.length)
157
+
158
+ # Get product_tariff length
159
+ product_tariff_size = ProductTariff.count
160
+
161
+ # Delete product - should delete 2 product tariffs
162
+ product.destroy
163
+
164
+ # Verify product_tariff are deleted
165
+ assert_equal(product_tariff_size - 2, ProductTariff.count)
166
+ end
167
+
168
+ def test_delete_cpk_association
169
+ product = Product.find(1)
170
+ assert_equal(2, product.product_tariffs.length)
171
+
172
+ product_tariff = product.product_tariffs.first
173
+ product.product_tariffs.delete(product_tariff)
174
+
175
+ product.reload
176
+ assert_equal(1, product.product_tariffs.length)
177
+ end
178
+
179
+ def test_delete_records_for_has_many_association_with_composite_primary_key
180
+ reference_type = ReferenceType.find(1)
181
+ codes_to_delete = reference_type.reference_codes[0..1]
182
+ assert_equal(3, reference_type.reference_codes.size, "Before deleting records reference_code count should be 3.")
183
+
184
+ reference_type.reference_codes.delete(codes_to_delete)
185
+ reference_type.reload
186
+ assert_equal(1, reference_type.reference_codes.size, "After deleting 2 records and a reload from DB reference_code count should be 1.")
187
+ end
188
+ 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