composite_primary_keys 12.0.2 → 12.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +880 -841
  3. data/README.rdoc +180 -179
  4. data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -0
  5. data/lib/composite_primary_keys/arel/sqlserver.rb +1 -3
  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/associations/through_association.rb +2 -1
  9. data/lib/composite_primary_keys/attribute_methods/primary_key.rb +13 -0
  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/attribute_methods.rb +9 -9
  13. data/lib/composite_primary_keys/base.rb +141 -130
  14. data/lib/composite_primary_keys/composite_arrays.rb +0 -8
  15. data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +37 -17
  16. data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +44 -23
  17. data/lib/composite_primary_keys/core.rb +48 -48
  18. data/lib/composite_primary_keys/persistence.rb +82 -81
  19. data/lib/composite_primary_keys/reflection.rb +29 -29
  20. data/lib/composite_primary_keys/relation/batches.rb +1 -1
  21. data/lib/composite_primary_keys/relation/calculations.rb +81 -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 +20 -20
  24. data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
  25. data/lib/composite_primary_keys/relation/where_clause.rb +23 -23
  26. data/lib/composite_primary_keys/relation.rb +193 -118
  27. data/lib/composite_primary_keys/version.rb +8 -8
  28. data/lib/composite_primary_keys.rb +117 -118
  29. data/test/abstract_unit.rb +114 -113
  30. data/test/connections/databases.ci.yml +22 -19
  31. data/test/fixtures/article.rb +4 -0
  32. data/test/fixtures/articles.yml +4 -3
  33. data/test/fixtures/comment.rb +1 -3
  34. data/test/fixtures/comments.yml +10 -9
  35. data/test/fixtures/db_definitions/db2-create-tables.sql +112 -126
  36. data/test/fixtures/db_definitions/db2-drop-tables.sql +17 -19
  37. data/test/fixtures/db_definitions/mysql.sql +180 -217
  38. data/test/fixtures/db_definitions/oracle.drop.sql +42 -48
  39. data/test/fixtures/db_definitions/oracle.sql +200 -236
  40. data/test/fixtures/db_definitions/postgresql.sql +183 -220
  41. data/test/fixtures/db_definitions/sqlite.sql +170 -206
  42. data/test/fixtures/db_definitions/sqlserver.sql +176 -212
  43. data/test/fixtures/department.rb +16 -11
  44. data/test/fixtures/departments.yml +15 -15
  45. data/test/fixtures/employees.yml +27 -27
  46. data/test/fixtures/readings.yml +2 -2
  47. data/test/fixtures/restaurants_suburbs.yml +11 -11
  48. data/test/fixtures/streets.yml +16 -16
  49. data/test/fixtures/suburbs.yml +14 -14
  50. data/test/fixtures/user.rb +11 -10
  51. data/test/test_associations.rb +358 -351
  52. data/test/test_attributes.rb +60 -60
  53. data/test/test_calculations.rb +42 -42
  54. data/test/test_create.rb +218 -183
  55. data/test/test_delete.rb +182 -179
  56. data/test/test_exists.rb +39 -39
  57. data/test/test_find.rb +164 -145
  58. data/test/test_habtm.rb +2 -2
  59. data/test/test_ids.rb +112 -116
  60. data/test/test_nested_attributes.rb +67 -124
  61. data/test/test_polymorphic.rb +29 -13
  62. data/test/test_preload.rb +4 -3
  63. data/test/test_serialize.rb +2 -2
  64. data/test/test_update.rb +96 -78
  65. metadata +4 -19
  66. data/test/fixtures/hack.rb +0 -5
  67. data/test/fixtures/hacks.yml +0 -3
  68. data/test/fixtures/pk_called_id.rb +0 -5
  69. data/test/fixtures/pk_called_ids.yml +0 -11
  70. data/test/fixtures/reference_code_using_composite_key_alias.rb +0 -8
  71. data/test/fixtures/reference_code_using_simple_key_alias.rb +0 -8
  72. data/test/fixtures/seat.rb +0 -5
  73. data/test/fixtures/seats.yml +0 -9
  74. data/test/fixtures/topic.rb +0 -6
  75. data/test/fixtures/topic_source.rb +0 -7
  76. data/test/test_aliases.rb +0 -18
  77. data/test/test_enum.rb +0 -21
  78. data/test/test_suite.rb +0 -35
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
- assert !tariff.persisted?
135
- end
136
-
137
- def test_delete_not_destroy_on_non_cpk
138
- article = Article.first
139
- article.delete
140
- assert !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, :departments, :capitols
5
-
6
- def test_id
7
- assert(Article.exists?(1))
8
- assert(!Article.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?(['department_id = ? and location_id = ?', 1, 1]))
33
- assert(!Department.exists?(['department_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