composite_primary_keys 12.0.9 → 14.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 (153) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +894 -877
  3. data/README.rdoc +182 -180
  4. data/Rakefile +37 -37
  5. data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -19
  6. data/lib/composite_primary_keys/arel/sqlserver.rb +37 -37
  7. data/lib/composite_primary_keys/arel/to_sql.rb +18 -18
  8. data/lib/composite_primary_keys/associations/association.rb +23 -23
  9. data/lib/composite_primary_keys/associations/association_scope.rb +66 -68
  10. data/lib/composite_primary_keys/associations/collection_association.rb +31 -31
  11. data/lib/composite_primary_keys/associations/foreign_association.rb +15 -15
  12. data/lib/composite_primary_keys/associations/has_many_association.rb +35 -35
  13. data/lib/composite_primary_keys/associations/join_dependency.rb +137 -103
  14. data/lib/composite_primary_keys/associations/preloader/association.rb +68 -53
  15. data/lib/composite_primary_keys/associations/through_association.rb +25 -25
  16. data/lib/composite_primary_keys/attribute_methods/primary_key.rb +0 -2
  17. data/lib/composite_primary_keys/attribute_methods/read.rb +30 -30
  18. data/lib/composite_primary_keys/attribute_methods/write.rb +35 -35
  19. data/lib/composite_primary_keys/attribute_methods.rb +21 -9
  20. data/lib/composite_primary_keys/autosave_association.rb +60 -60
  21. data/lib/composite_primary_keys/base.rb +141 -141
  22. data/lib/composite_primary_keys/composite_arrays.rb +86 -86
  23. data/lib/composite_primary_keys/composite_predicates.rb +71 -69
  24. data/lib/composite_primary_keys/composite_relation.rb +29 -29
  25. data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +37 -37
  26. data/lib/composite_primary_keys/connection_adapters/abstract_adapter.rb +10 -10
  27. data/lib/composite_primary_keys/connection_adapters/postgresql/database_statements.rb +26 -26
  28. data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +44 -44
  29. data/lib/composite_primary_keys/core.rb +48 -48
  30. data/lib/composite_primary_keys/counter_cache.rb +15 -15
  31. data/lib/composite_primary_keys/fixtures.rb +21 -21
  32. data/lib/composite_primary_keys/nested_attributes.rb +1 -1
  33. data/lib/composite_primary_keys/persistence.rb +96 -81
  34. data/lib/composite_primary_keys/reflection.rb +91 -29
  35. data/lib/composite_primary_keys/relation/batches.rb +15 -7
  36. data/lib/composite_primary_keys/relation/calculations.rb +110 -81
  37. data/lib/composite_primary_keys/relation/finder_methods.rb +235 -235
  38. data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +39 -20
  39. data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
  40. data/lib/composite_primary_keys/relation/where_clause.rb +18 -23
  41. data/lib/composite_primary_keys/relation.rb +197 -193
  42. data/lib/composite_primary_keys/sanitization.rb +42 -42
  43. data/lib/composite_primary_keys/table_metadata.rb +11 -0
  44. data/lib/composite_primary_keys/transactions.rb +34 -34
  45. data/lib/composite_primary_keys/validations/uniqueness.rb +31 -31
  46. data/lib/composite_primary_keys/version.rb +8 -8
  47. data/lib/composite_primary_keys.rb +119 -117
  48. data/scripts/console.rb +48 -48
  49. data/scripts/txt2html +76 -76
  50. data/scripts/txt2js +65 -65
  51. data/tasks/databases/mysql.rake +40 -40
  52. data/tasks/databases/oracle.rake +41 -41
  53. data/tasks/databases/postgresql.rake +38 -38
  54. data/tasks/databases/sqlite.rake +25 -25
  55. data/tasks/databases/sqlserver.rake +43 -43
  56. data/tasks/website.rake +18 -18
  57. data/test/README_tests.rdoc +56 -56
  58. data/test/abstract_unit.rb +118 -114
  59. data/test/connections/connection_spec.rb +27 -27
  60. data/test/connections/databases.ci.yml +22 -22
  61. data/test/connections/databases.example.yml +40 -40
  62. data/test/connections/databases.yml +40 -39
  63. data/test/fixtures/article.rb +10 -10
  64. data/test/fixtures/articles.yml +7 -7
  65. data/test/fixtures/capitol.rb +3 -3
  66. data/test/fixtures/capitols.yml +16 -16
  67. data/test/fixtures/comment.rb +5 -5
  68. data/test/fixtures/comments.yml +17 -17
  69. data/test/fixtures/db_definitions/db2-create-tables.sql +112 -112
  70. data/test/fixtures/db_definitions/db2-drop-tables.sql +16 -16
  71. data/test/fixtures/db_definitions/mysql.sql +180 -180
  72. data/test/fixtures/db_definitions/oracle.drop.sql +41 -41
  73. data/test/fixtures/db_definitions/oracle.sql +199 -199
  74. data/test/fixtures/db_definitions/postgresql.sql +182 -182
  75. data/test/fixtures/db_definitions/sqlite.sql +169 -169
  76. data/test/fixtures/db_definitions/sqlserver.sql +176 -176
  77. data/test/fixtures/department.rb +16 -16
  78. data/test/fixtures/departments.yml +19 -15
  79. data/test/fixtures/dorm.rb +2 -2
  80. data/test/fixtures/dorms.yml +4 -4
  81. data/test/fixtures/employee.rb +5 -5
  82. data/test/fixtures/employees.yml +33 -28
  83. data/test/fixtures/group.rb +2 -2
  84. data/test/fixtures/groups.yml +6 -6
  85. data/test/fixtures/membership.rb +8 -6
  86. data/test/fixtures/membership_status.rb +2 -2
  87. data/test/fixtures/membership_statuses.yml +16 -16
  88. data/test/fixtures/memberships.yml +10 -10
  89. data/test/fixtures/product.rb +9 -9
  90. data/test/fixtures/product_tariff.rb +5 -5
  91. data/test/fixtures/product_tariffs.yml +14 -14
  92. data/test/fixtures/products.yml +11 -11
  93. data/test/fixtures/reading.rb +4 -4
  94. data/test/fixtures/readings.yml +10 -10
  95. data/test/fixtures/reference_code.rb +7 -7
  96. data/test/fixtures/reference_codes.yml +28 -28
  97. data/test/fixtures/reference_type.rb +12 -12
  98. data/test/fixtures/reference_types.yml +9 -9
  99. data/test/fixtures/restaurant.rb +9 -9
  100. data/test/fixtures/restaurants.yml +14 -14
  101. data/test/fixtures/restaurants_suburb.rb +2 -2
  102. data/test/fixtures/restaurants_suburbs.yml +10 -10
  103. data/test/fixtures/room.rb +11 -11
  104. data/test/fixtures/room_assignment.rb +13 -13
  105. data/test/fixtures/room_assignments.yml +24 -24
  106. data/test/fixtures/room_attribute.rb +2 -2
  107. data/test/fixtures/room_attribute_assignment.rb +4 -4
  108. data/test/fixtures/room_attribute_assignments.yml +4 -4
  109. data/test/fixtures/room_attributes.yml +2 -2
  110. data/test/fixtures/rooms.yml +12 -12
  111. data/test/fixtures/street.rb +2 -2
  112. data/test/fixtures/streets.yml +16 -16
  113. data/test/fixtures/student.rb +3 -3
  114. data/test/fixtures/students.yml +15 -15
  115. data/test/fixtures/suburb.rb +5 -5
  116. data/test/fixtures/suburbs.yml +14 -14
  117. data/test/fixtures/tariff.rb +5 -5
  118. data/test/fixtures/tariffs.yml +14 -14
  119. data/test/fixtures/topic_sources.yml +3 -3
  120. data/test/fixtures/topics.yml +8 -8
  121. data/test/fixtures/user.rb +11 -11
  122. data/test/fixtures/users.yml +10 -10
  123. data/test/plugins/pagination.rb +405 -405
  124. data/test/plugins/pagination_helper.rb +135 -135
  125. data/test/test_associations.rb +372 -358
  126. data/test/test_attribute_methods.rb +63 -63
  127. data/test/test_attributes.rb +75 -60
  128. data/test/test_calculations.rb +49 -42
  129. data/test/test_callbacks.rb +99 -99
  130. data/test/test_composite_arrays.rb +38 -38
  131. data/test/test_counter_cache.rb +30 -30
  132. data/test/test_create.rb +218 -206
  133. data/test/test_delete.rb +188 -179
  134. data/test/test_dumpable.rb +15 -15
  135. data/test/test_dup.rb +37 -37
  136. data/test/test_equal.rb +26 -26
  137. data/test/test_exists.rb +39 -39
  138. data/test/test_find.rb +170 -164
  139. data/test/test_habtm.rb +141 -141
  140. data/test/test_ids.rb +112 -112
  141. data/test/test_miscellaneous.rb +32 -32
  142. data/test/test_nested_attributes.rb +67 -67
  143. data/test/test_optimistic.rb +18 -18
  144. data/test/test_pagination.rb +35 -35
  145. data/test/test_polymorphic.rb +43 -43
  146. data/test/test_predicates.rb +59 -59
  147. data/test/test_preload.rb +102 -102
  148. data/test/test_santiago.rb +23 -23
  149. data/test/test_touch.rb +23 -23
  150. data/test/test_tutorial_example.rb +25 -25
  151. data/test/test_update.rb +102 -96
  152. data/test/test_validations.rb +13 -13
  153. metadata +7 -6
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(5, employees.to_a.count)
133
- end
134
-
135
- def test_expand_all
136
- departments = Department.all
137
- employees = Employee.where(:department => departments)
138
- assert_equal(5, employees.count)
139
- end
140
-
141
- def test_find_one_with_params_id
142
- params_id = ReferenceCode.find([1,3]).to_param
143
- assert_equal params_id, "1,3"
144
-
145
- ref_code = ReferenceCode.find(params_id)
146
- assert_not_nil(ref_code)
147
- assert_equal([1,3], ref_code.id)
148
- end
149
-
150
- def test_find_some_with_array_of_params_id
151
- params_ids = ReferenceCode.find([1,3], [2,1]).map(&:to_param)
152
- assert_equal ["1,3", "2,1"], params_ids
153
-
154
- ref_codes = ReferenceCode.find(params_ids)
155
- assert_kind_of(Array, ref_codes)
156
- assert_equal(2, ref_codes.length)
157
-
158
- ref_code = ref_codes[0]
159
- assert_equal([1,3], ref_code.id)
160
-
161
- ref_code = ref_codes[1]
162
- assert_equal([2,1], ref_code.id)
163
- end
164
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ # Testing the find action on composite ActiveRecords with two primary keys
4
+ class TestFind < ActiveSupport::TestCase
5
+ fixtures :capitols, :departments, :reference_types, :reference_codes,
6
+ :suburbs, :employees
7
+
8
+ def test_find_first
9
+ ref_code = ReferenceCode.order('reference_type_id, reference_code').first
10
+ assert_kind_of(ReferenceCode, ref_code)
11
+ assert_equal([1,1], ref_code.id)
12
+ end
13
+
14
+ def test_find_last
15
+ ref_code = ReferenceCode.order('reference_type_id, reference_code').last
16
+ assert_kind_of(ReferenceCode, ref_code)
17
+ assert_equal([2,2], ref_code.id)
18
+ end
19
+
20
+ def test_find_one
21
+ ref_code = ReferenceCode.find([1,3])
22
+ assert_not_nil(ref_code)
23
+ assert_equal([1,3], ref_code.id)
24
+ end
25
+
26
+ def test_find_some
27
+ ref_codes = ReferenceCode.find([1,3], [2,1])
28
+ assert_kind_of(Array, ref_codes)
29
+ assert_equal(2, ref_codes.length)
30
+
31
+ ref_code = ref_codes[0]
32
+ assert_equal([1,3], ref_code.id)
33
+
34
+ ref_code = ref_codes[1]
35
+ assert_equal([2,1], ref_code.id)
36
+ end
37
+
38
+ def test_find_with_strings_as_composite_keys
39
+ capitol = Capitol.find(['The Netherlands', 'Amsterdam'])
40
+ assert_kind_of(Capitol, capitol)
41
+ assert_equal(['The Netherlands', 'Amsterdam'], capitol.id)
42
+ end
43
+
44
+ def test_find_with_strings_with_comma_as_composite_keys
45
+ capitol = Capitol.create!(country: 'The USA', city: 'Washington, D.C.')
46
+ assert_equal ['The USA', 'Washington, D.C.'], capitol.id
47
+
48
+ assert_equal capitol, Capitol.find(['The USA', 'Washington, D.C.'])
49
+ assert_equal capitol, Capitol.find(capitol.to_param)
50
+ end
51
+
52
+ def test_find_each
53
+ room_assignments = []
54
+ RoomAssignment.find_each(:batch_size => 2) do |assignment|
55
+ room_assignments << assignment
56
+ end
57
+
58
+ assert_equal(RoomAssignment.count, room_assignments.uniq.length)
59
+ end
60
+
61
+ def test_find_each_with_scope
62
+ scoped_departments = Department.where("id <> 3")
63
+ scoped_departments.find_each(:batch_size => 2) do |department|
64
+ assert department.id != 3
65
+ end
66
+ end
67
+
68
+ def test_not_found
69
+ error = assert_raise(::ActiveRecord::RecordNotFound) do
70
+ ReferenceCode.find(['999', '999'])
71
+ end
72
+
73
+ expected = "Couldn't find all ReferenceCodes with 'reference_type_id,reference_code': (999, 999) (found 0 results, but was looking for 1)."
74
+ assert_equal(with_quoted_identifiers(expected), error.message)
75
+ end
76
+
77
+ def test_find_with_invalid_ids
78
+ assert_raise(::ActiveRecord::RecordNotFound) do
79
+ Suburb.find([-1, -1])
80
+ end
81
+ end
82
+
83
+ def test_find_with_no_ids
84
+ assert_raise(::ActiveRecord::RecordNotFound) do
85
+ Suburb.find
86
+ end
87
+ end
88
+
89
+ def test_find_last_suburb
90
+ suburb = Suburb.last
91
+ assert_equal([2,2], suburb.id)
92
+ end
93
+
94
+ def test_find_last_suburb_with_order
95
+ # Rails actually changes city_id DESC to city_id ASC
96
+ suburb = Suburb.order('suburbs.city_id DESC').last
97
+ assert_equal([1,1], suburb.id)
98
+ end
99
+
100
+ def test_find_in_batches
101
+ Department.find_in_batches do |batch|
102
+ assert_equal(Department.count, batch.size)
103
+ end
104
+ end
105
+
106
+ def test_in_batches_enumerator
107
+ enumerator = Department.in_batches
108
+ enumerator.each do |batch|
109
+ assert_equal(Department.count, batch.size)
110
+ end
111
+ end
112
+
113
+ def test_in_batches_of_1
114
+ num_found = 0
115
+ Department.in_batches(of: 1) do |batch|
116
+ batch.each do |dept|
117
+ num_found += 1
118
+ end
119
+ end
120
+ assert_equal(Department.count, num_found)
121
+ end
122
+
123
+ def test_find_by_one_association
124
+ department = departments(:engineering)
125
+ employees = Employee.where(:department => department)
126
+ assert_equal(2, employees.to_a.count)
127
+ end
128
+
129
+ def test_find_by_all_associations
130
+ departments = Department.all
131
+ employees = Employee.where(:department => departments)
132
+ assert_equal(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
data/test/test_habtm.rb CHANGED
@@ -1,141 +1,141 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestHabtm < ActiveSupport::TestCase
4
- fixtures :suburbs, :restaurants, :restaurants_suburbs, :products, :groups, :employees
5
-
6
- def test_no_cpk
7
- # This test makes sure we don't break anything in standard rails by using CPK
8
- groups = Group.all
9
-
10
- # First test records
11
- employee = Employee.first
12
- assert_equal(0, employee.groups.length)
13
- employee.groups = groups
14
- employee.reload
15
- assert_equal(groups, employee.groups)
16
- end
17
-
18
- def test_no_cpk_ids
19
- # This test makes sure we don't break anything in standard rails by using CPK
20
- groups = Group.all
21
-
22
- employee = Employee.last
23
- assert_equal(0, employee.groups.length)
24
- employee.group_ids = groups.map {|group| group.id}
25
- employee.group_ids = [groups.first.id]
26
- employee.reload
27
- assert_equal([groups.first], employee.groups)
28
- end
29
-
30
- def test_has_and_belongs_to_many
31
- @restaurant = Restaurant.find([1,1])
32
- assert_equal 2, @restaurant.suburbs.size
33
-
34
- @restaurant = Restaurant.includes(:suburbs).find([1,1])
35
- assert_equal 2, @restaurant.suburbs.size
36
- end
37
-
38
- def test_include_cpk_both_sides
39
- # assuming the association was set up in the fixtures
40
- # file restaurants_suburbs.yml
41
- mcdonalds = restaurants(:mcdonalds)
42
- # check positive
43
- suburb = mcdonalds.suburbs[0]
44
- assert mcdonalds.suburbs.include?(suburb)
45
- # check negative
46
- suburb_with_no_mcdonalds = suburbs(:no_mcdonalds)
47
- assert !mcdonalds.suburbs.include?(suburb_with_no_mcdonalds)
48
- end
49
-
50
- def test_include_cpk_owner_side_only
51
- subway = restaurants(:subway_one)
52
- product = products(:first_product)
53
- subway.products << product
54
-
55
- # reload
56
- # test positive
57
- subway = restaurants(:subway_one)
58
- assert subway.products.include?(product)
59
-
60
- # test negative
61
- product_two = products(:second_product)
62
- assert !subway.products.include?(product_two)
63
- end
64
-
65
- def test_include_cpk_association_side_only
66
- product = products(:first_product)
67
- subway = restaurants(:subway_one)
68
- product.restaurants << subway
69
-
70
- # reload
71
- # test positive
72
- product = products(:first_product)
73
- assert product.restaurants.include?(subway)
74
-
75
- # test negative
76
- mcdonalds = restaurants(:mcdonalds)
77
- assert !product.restaurants.include?(mcdonalds)
78
- end
79
-
80
- def test_habtm_clear_cpk_both_sides
81
- @restaurant = restaurants(:mcdonalds)
82
- assert_equal 2, @restaurant.suburbs.size
83
- @restaurant.suburbs.clear
84
- assert_equal 0, @restaurant.suburbs.size
85
- end
86
-
87
- def test_habtm_clear_cpk_owner_side_only
88
- subway = restaurants(:subway_one)
89
- assert_equal 0, subway.products.size, 'Baseline'
90
-
91
- first_product = products(:first_product)
92
- second_product = products(:second_product)
93
- subway.products << first_product << second_product
94
- assert_equal 2, subway.products.size
95
- subway.products.clear
96
- # reload to force reload of associations
97
- subway = restaurants(:subway_one)
98
- assert_equal 0, subway.products.size
99
- end
100
-
101
- def test_habtm_clear_cpk_association_side_only
102
- product = products(:first_product)
103
- assert_equal 0, product.restaurants.size, 'Baseline'
104
-
105
- subway_one = restaurants(:subway_one)
106
- subway_two = restaurants(:subway_two)
107
- product.restaurants << subway_one << subway_two
108
- assert_equal 2, product.restaurants.size
109
- product.restaurants.clear
110
- # reload to force reload of associations
111
- product = products(:first_product)
112
- assert_equal 0, product.restaurants.size
113
- end
114
-
115
- # tests case reported in issue #39 where a bug resulted in
116
- # deletion of incorrect join table records because the owner's id
117
- # was assumed to be an array and is not in this case
118
- # and evaluates to a useable but incorrect value
119
- def test_habtm_clear_cpk_association_side_only_deletes_only_correct_records
120
- product_one = Product.find(1)
121
- product_three = Product.find(3)
122
- subway_one = restaurants(:subway_one)
123
- subway_two = restaurants(:subway_two)
124
- product_one.restaurants << subway_one << subway_two
125
- product_three.restaurants << subway_one << subway_two
126
- assert_equal 2, product_one.restaurants.size
127
- assert_equal 2, product_three.restaurants.size
128
-
129
- # if product_three's id is incorrectly assumed to be
130
- # an array it will be evaluated as 3[0], which is 1, which would
131
- # delete product_one's associations rather than product_three's
132
- product_three.restaurants.clear
133
-
134
- # reload to force reload of associations
135
- product_one = Product.find(1)
136
- assert_equal(2, product_one.restaurants.size)
137
-
138
- product_three = Product.find(3)
139
- assert_equal(0, product_three.restaurants.size)
140
- end
141
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestHabtm < ActiveSupport::TestCase
4
+ fixtures :suburbs, :restaurants, :restaurants_suburbs, :products, :groups, :employees
5
+
6
+ def test_no_cpk
7
+ # This test makes sure we don't break anything in standard rails by using CPK
8
+ groups = Group.all
9
+
10
+ # First test records
11
+ employee = Employee.first
12
+ assert_equal(0, employee.groups.length)
13
+ employee.groups = groups
14
+ employee.reload
15
+ assert_equal(groups, employee.groups)
16
+ end
17
+
18
+ def test_no_cpk_ids
19
+ # This test makes sure we don't break anything in standard rails by using CPK
20
+ groups = Group.all
21
+
22
+ employee = Employee.last
23
+ assert_equal(0, employee.groups.length)
24
+ employee.group_ids = groups.map {|group| group.id}
25
+ employee.group_ids = [groups.first.id]
26
+ employee.reload
27
+ assert_equal([groups.first], employee.groups)
28
+ end
29
+
30
+ def test_has_and_belongs_to_many
31
+ @restaurant = Restaurant.find([1,1])
32
+ assert_equal 2, @restaurant.suburbs.size
33
+
34
+ @restaurant = Restaurant.includes(:suburbs).find([1,1])
35
+ assert_equal 2, @restaurant.suburbs.size
36
+ end
37
+
38
+ def test_include_cpk_both_sides
39
+ # assuming the association was set up in the fixtures
40
+ # file restaurants_suburbs.yml
41
+ mcdonalds = restaurants(:mcdonalds)
42
+ # check positive
43
+ suburb = mcdonalds.suburbs[0]
44
+ assert mcdonalds.suburbs.include?(suburb)
45
+ # check negative
46
+ suburb_with_no_mcdonalds = suburbs(:no_mcdonalds)
47
+ assert !mcdonalds.suburbs.include?(suburb_with_no_mcdonalds)
48
+ end
49
+
50
+ def test_include_cpk_owner_side_only
51
+ subway = restaurants(:subway_one)
52
+ product = products(:first_product)
53
+ subway.products << product
54
+
55
+ # reload
56
+ # test positive
57
+ subway = restaurants(:subway_one)
58
+ assert subway.products.include?(product)
59
+
60
+ # test negative
61
+ product_two = products(:second_product)
62
+ assert !subway.products.include?(product_two)
63
+ end
64
+
65
+ def test_include_cpk_association_side_only
66
+ product = products(:first_product)
67
+ subway = restaurants(:subway_one)
68
+ product.restaurants << subway
69
+
70
+ # reload
71
+ # test positive
72
+ product = products(:first_product)
73
+ assert product.restaurants.include?(subway)
74
+
75
+ # test negative
76
+ mcdonalds = restaurants(:mcdonalds)
77
+ assert !product.restaurants.include?(mcdonalds)
78
+ end
79
+
80
+ def test_habtm_clear_cpk_both_sides
81
+ @restaurant = restaurants(:mcdonalds)
82
+ assert_equal 2, @restaurant.suburbs.size
83
+ @restaurant.suburbs.clear
84
+ assert_equal 0, @restaurant.suburbs.size
85
+ end
86
+
87
+ def test_habtm_clear_cpk_owner_side_only
88
+ subway = restaurants(:subway_one)
89
+ assert_equal 0, subway.products.size, 'Baseline'
90
+
91
+ first_product = products(:first_product)
92
+ second_product = products(:second_product)
93
+ subway.products << first_product << second_product
94
+ assert_equal 2, subway.products.size
95
+ subway.products.clear
96
+ # reload to force reload of associations
97
+ subway = restaurants(:subway_one)
98
+ assert_equal 0, subway.products.size
99
+ end
100
+
101
+ def test_habtm_clear_cpk_association_side_only
102
+ product = products(:first_product)
103
+ assert_equal 0, product.restaurants.size, 'Baseline'
104
+
105
+ subway_one = restaurants(:subway_one)
106
+ subway_two = restaurants(:subway_two)
107
+ product.restaurants << subway_one << subway_two
108
+ assert_equal 2, product.restaurants.size
109
+ product.restaurants.clear
110
+ # reload to force reload of associations
111
+ product = products(:first_product)
112
+ assert_equal 0, product.restaurants.size
113
+ end
114
+
115
+ # tests case reported in issue #39 where a bug resulted in
116
+ # deletion of incorrect join table records because the owner's id
117
+ # was assumed to be an array and is not in this case
118
+ # and evaluates to a useable but incorrect value
119
+ def test_habtm_clear_cpk_association_side_only_deletes_only_correct_records
120
+ product_one = Product.find(1)
121
+ product_three = Product.find(3)
122
+ subway_one = restaurants(:subway_one)
123
+ subway_two = restaurants(:subway_two)
124
+ product_one.restaurants << subway_one << subway_two
125
+ product_three.restaurants << subway_one << subway_two
126
+ assert_equal 2, product_one.restaurants.size
127
+ assert_equal 2, product_three.restaurants.size
128
+
129
+ # if product_three's id is incorrectly assumed to be
130
+ # an array it will be evaluated as 3[0], which is 1, which would
131
+ # delete product_one's associations rather than product_three's
132
+ product_three.restaurants.clear
133
+
134
+ # reload to force reload of associations
135
+ product_one = Product.find(1)
136
+ assert_equal(2, product_one.restaurants.size)
137
+
138
+ product_three = Product.find(3)
139
+ assert_equal(0, product_three.restaurants.size)
140
+ end
141
+ end