composite_primary_keys 11.0.0.rc1 → 11.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +763 -754
  3. data/Rakefile +37 -37
  4. data/lib/composite_primary_keys.rb +122 -121
  5. data/lib/composite_primary_keys/arel/sqlserver.rb +37 -37
  6. data/lib/composite_primary_keys/arel/to_sql.rb +32 -32
  7. data/lib/composite_primary_keys/associations/association.rb +23 -23
  8. data/lib/composite_primary_keys/associations/association_scope.rb +68 -68
  9. data/lib/composite_primary_keys/associations/collection_association.rb +31 -31
  10. data/lib/composite_primary_keys/associations/has_many_association.rb +34 -34
  11. data/lib/composite_primary_keys/associations/join_dependency.rb +102 -102
  12. data/lib/composite_primary_keys/associations/preloader/association.rb +117 -117
  13. data/lib/composite_primary_keys/attribute_methods.rb +9 -9
  14. data/lib/composite_primary_keys/attribute_methods/read.rb +27 -27
  15. data/lib/composite_primary_keys/attribute_methods/write.rb +44 -44
  16. data/lib/composite_primary_keys/autosave_association.rb +32 -32
  17. data/lib/composite_primary_keys/base.rb +130 -130
  18. data/lib/composite_primary_keys/composite_arrays.rb +51 -51
  19. data/lib/composite_primary_keys/composite_predicates.rb +69 -69
  20. data/lib/composite_primary_keys/composite_relation.rb +29 -48
  21. data/lib/composite_primary_keys/connection_adapters/abstract_mysql_adapter.rb +29 -22
  22. data/lib/composite_primary_keys/connection_adapters/postgresql/database_statements.rb +26 -26
  23. data/lib/composite_primary_keys/connection_adapters/sqlite3_adapter.rb +22 -22
  24. data/lib/composite_primary_keys/core.rb +54 -54
  25. data/lib/composite_primary_keys/counter_cache.rb +28 -0
  26. data/lib/composite_primary_keys/fixtures.rb +26 -26
  27. data/lib/composite_primary_keys/locking/optimistic.rb +56 -56
  28. data/lib/composite_primary_keys/persistence.rb +112 -93
  29. data/lib/composite_primary_keys/reflection.rb +20 -20
  30. data/lib/composite_primary_keys/relation.rb +88 -88
  31. data/lib/composite_primary_keys/relation/calculations.rb +79 -79
  32. data/lib/composite_primary_keys/relation/finder_methods.rb +229 -229
  33. data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +20 -20
  34. data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
  35. data/lib/composite_primary_keys/relation/where_clause.rb +24 -24
  36. data/lib/composite_primary_keys/sanitization.rb +42 -42
  37. data/lib/composite_primary_keys/validations/uniqueness.rb +32 -32
  38. data/lib/composite_primary_keys/version.rb +8 -8
  39. data/scripts/console.rb +0 -0
  40. data/tasks/databases/mysql.rake +40 -40
  41. data/tasks/databases/oracle.rake +41 -41
  42. data/tasks/databases/postgresql.rake +38 -38
  43. data/tasks/databases/sqlite.rake +25 -25
  44. data/tasks/databases/sqlserver.rake +43 -43
  45. data/test/abstract_unit.rb +120 -120
  46. data/test/connections/connection_spec.rb +27 -27
  47. data/test/connections/databases.ci.yml +16 -16
  48. data/test/connections/databases.example.yml +40 -40
  49. data/test/connections/databases.yml +10 -0
  50. data/test/fixtures/article.rb +6 -6
  51. data/test/fixtures/comment.rb +7 -7
  52. data/test/fixtures/db_definitions/db2-create-tables.sql +126 -126
  53. data/test/fixtures/db_definitions/db2-drop-tables.sql +18 -18
  54. data/test/fixtures/db_definitions/mysql.sql +226 -226
  55. data/test/fixtures/db_definitions/oracle.drop.sql +49 -49
  56. data/test/fixtures/db_definitions/oracle.sql +246 -246
  57. data/test/fixtures/db_definitions/postgresql.sql +229 -229
  58. data/test/fixtures/db_definitions/sqlite.sql +214 -214
  59. data/test/fixtures/db_definitions/sqlserver.sql +211 -211
  60. data/test/fixtures/dorm.rb +2 -2
  61. data/test/fixtures/employee.rb +10 -10
  62. data/test/fixtures/employees.yml +18 -18
  63. data/test/fixtures/membership.rb +6 -6
  64. data/test/fixtures/membership_statuses.yml +16 -16
  65. data/test/fixtures/memberships.yml +10 -10
  66. data/test/fixtures/pk_called_id.rb +5 -5
  67. data/test/fixtures/pk_called_ids.yml +11 -11
  68. data/test/fixtures/product_tariffs.yml +14 -14
  69. data/test/fixtures/reference_code.rb +7 -7
  70. data/test/fixtures/reference_type.rb +12 -12
  71. data/test/fixtures/restaurants_suburb.rb +2 -2
  72. data/test/fixtures/salary.rb +5 -5
  73. data/test/fixtures/suburb.rb +5 -5
  74. data/test/fixtures/tariff.rb +5 -5
  75. data/test/fixtures/tariffs.yml +14 -14
  76. data/test/fixtures/topic.rb +5 -5
  77. data/test/fixtures/topic_source.rb +6 -6
  78. data/test/fixtures/topic_sources.yml +3 -3
  79. data/test/fixtures/topics.yml +8 -8
  80. data/test/fixtures/user.rb +10 -10
  81. data/test/fixtures/users.yml +10 -10
  82. data/test/test_associations.rb +345 -345
  83. data/test/test_attribute_methods.rb +63 -63
  84. data/test/test_attributes.rb +60 -60
  85. data/test/test_calculations.rb +42 -42
  86. data/test/test_callbacks.rb +99 -99
  87. data/test/test_counter_cache.rb +1 -1
  88. data/test/test_create.rb +164 -164
  89. data/test/test_delete.rb +167 -167
  90. data/test/test_dumpable.rb +15 -15
  91. data/test/test_enum.rb +21 -21
  92. data/test/test_equal.rb +26 -26
  93. data/test/test_find.rb +137 -137
  94. data/test/test_habtm.rb +141 -141
  95. data/test/test_ids.rb +113 -113
  96. data/test/test_nested_attributes.rb +124 -124
  97. data/test/test_optimistic.rb +18 -18
  98. data/test/test_polymorphic.rb +27 -27
  99. data/test/test_predicates.rb +59 -59
  100. data/test/test_preload.rb +94 -94
  101. data/test/test_santiago.rb +23 -23
  102. data/test/test_suite.rb +34 -34
  103. data/test/test_touch.rb +23 -23
  104. data/test/test_tutorial_example.rb +25 -25
  105. data/test/test_update.rb +76 -76
  106. metadata +29 -28
@@ -1,15 +1,15 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestDumpable < ActiveSupport::TestCase
4
- fixtures :articles, :readings, :users
5
-
6
- def test_marshal_with_simple_preload
7
- articles = Article.preload(:readings).where(id: 1).to_a
8
- assert_equal(Marshal.load(Marshal.dump(articles)), articles)
9
- end
10
-
11
- def test_marshal_with_comples_preload
12
- articles = Article.preload({ readings: :user }).where(id: 1).to_a
13
- assert_equal(Marshal.load(Marshal.dump(articles)), articles)
14
- end
15
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestDumpable < ActiveSupport::TestCase
4
+ fixtures :articles, :readings, :users
5
+
6
+ def test_marshal_with_simple_preload
7
+ articles = Article.preload(:readings).where(id: 1).to_a
8
+ assert_equal(Marshal.load(Marshal.dump(articles)), articles)
9
+ end
10
+
11
+ def test_marshal_with_comples_preload
12
+ articles = Article.preload({ readings: :user }).where(id: 1).to_a
13
+ assert_equal(Marshal.load(Marshal.dump(articles)), articles)
14
+ end
15
+ end
@@ -1,21 +1,21 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestEnum < ActiveSupport::TestCase
4
- fixtures :comments
5
-
6
- def test_enum_was
7
- comment = Comment.first
8
- assert_nil comment.shown
9
- assert_equal({}, comment.changed_attributes)
10
- comment.shown = :true
11
- assert_equal({ "shown" => nil }, comment.changed_attributes)
12
- assert_equal 'true', comment.shown
13
- assert_nil comment.shown_was
14
-
15
- comment.save
16
-
17
- comment.shown = :false
18
- assert_equal 'false', comment.shown
19
- assert_equal 'true', comment.shown_was
20
- end
21
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestEnum < ActiveSupport::TestCase
4
+ fixtures :comments
5
+
6
+ def test_enum_was
7
+ comment = Comment.first
8
+ assert_nil comment.shown
9
+ assert_equal({}, comment.changed_attributes)
10
+ comment.shown = :true
11
+ assert_equal({ "shown" => nil }, comment.changed_attributes)
12
+ assert_equal 'true', comment.shown
13
+ assert_nil comment.shown_was
14
+
15
+ comment.save
16
+
17
+ comment.shown = :false
18
+ assert_equal 'false', comment.shown
19
+ assert_equal 'true', comment.shown_was
20
+ end
21
+ end
@@ -1,26 +1,26 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestEqual < ActiveSupport::TestCase
4
- fixtures :capitols
5
-
6
- def test_new
7
- assert_equal(Capitol.new, Capitol.new)
8
- end
9
-
10
- def test_same_new
11
- it = Capitol.new
12
- assert_equal(it, it)
13
- end
14
-
15
- def test_same
16
- first = Capitol.find(['Canada', 'Ottawa'])
17
- second = Capitol.find(['Canada', 'Ottawa'])
18
- assert_equal(first, second)
19
- end
20
-
21
- def test_different
22
- first = Capitol.find(['Mexico', 'Mexico City'])
23
- second = Capitol.find(['Canada', 'Ottawa'])
24
- assert_not_equal(first, second)
25
- end
26
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestEqual < ActiveSupport::TestCase
4
+ fixtures :capitols
5
+
6
+ def test_new
7
+ assert_equal(Capitol.new, Capitol.new)
8
+ end
9
+
10
+ def test_same_new
11
+ it = Capitol.new
12
+ assert_equal(it, it)
13
+ end
14
+
15
+ def test_same
16
+ first = Capitol.find(['Canada', 'Ottawa'])
17
+ second = Capitol.find(['Canada', 'Ottawa'])
18
+ assert_equal(first, second)
19
+ end
20
+
21
+ def test_different
22
+ first = Capitol.find(['Mexico', 'Mexico City'])
23
+ second = Capitol.find(['Canada', 'Ottawa'])
24
+ assert_not_equal(first, second)
25
+ end
26
+ end
@@ -1,137 +1,137 @@
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_each
45
- room_assignments = []
46
- RoomAssignment.find_each(:batch_size => 2) do |assignment|
47
- room_assignments << assignment
48
- end
49
-
50
- assert_equal(RoomAssignment.count, room_assignments.uniq.length)
51
- end
52
-
53
- def test_find_each_with_scope
54
- scoped_departments = Department.where("department_id <> 3")
55
- scoped_departments.find_each(:batch_size => 2) do |department|
56
- assert department.id != 3
57
- end
58
- end
59
-
60
- def test_not_found
61
- error = assert_raise(::ActiveRecord::RecordNotFound) do
62
- ReferenceCode.find(['999', '999'])
63
- end
64
-
65
- expected = "Couldn't find all ReferenceCodes with 'reference_type_id,reference_code': (999, 999) (found 0 results, but was looking for 1)."
66
- assert_equal(with_quoted_identifiers(expected), error.message)
67
- end
68
-
69
- def test_find_last_suburb
70
- suburb = Suburb.last
71
- assert_equal([2,1], suburb.id)
72
- end
73
-
74
- def test_find_last_suburb_with_order
75
- # Rails actually changes city_id DESC to city_id ASC
76
- suburb = Suburb.order('suburbs.city_id DESC').last
77
- assert_equal([1,1], suburb.id)
78
- end
79
-
80
- def test_find_in_batches
81
- Department.find_in_batches do |batch|
82
- assert_equal(Department.count, batch.size)
83
- end
84
- end
85
-
86
- def test_in_batches_of_1
87
- num_found = 0
88
- Department.in_batches(of: 1) do |batch|
89
- batch.each do |dept|
90
- num_found += 1
91
- end
92
- end
93
- assert_equal(Department.count, num_found)
94
- end
95
-
96
- def test_find_by_one_association
97
- department = departments(:engineering)
98
- employees = Employee.where(:department => department)
99
- assert_equal(2, employees.to_a.count)
100
- end
101
-
102
- def test_find_by_all_associations
103
- departments = Department.all
104
- employees = Employee.where(:department => departments)
105
- assert_equal(4, employees.to_a.count)
106
- end
107
-
108
- def test_expand_all
109
- departments = Department.all
110
- employees = Employee.where(:department => departments)
111
- assert_equal(4, employees.count)
112
- end
113
-
114
- def test_find_one_with_params_id
115
- params_id = ReferenceCode.find([1,3]).to_param
116
- assert_equal params_id, "1,3"
117
-
118
- ref_code = ReferenceCode.find(params_id)
119
- assert_not_nil(ref_code)
120
- assert_equal([1,3], ref_code.id)
121
- end
122
-
123
- def test_find_some_with_array_of_params_id
124
- params_ids = ReferenceCode.find([1,3], [2,1]).map(&:to_param)
125
- assert_equal ["1,3", "2,1"], params_ids
126
-
127
- ref_codes = ReferenceCode.find(params_ids)
128
- assert_kind_of(Array, ref_codes)
129
- assert_equal(2, ref_codes.length)
130
-
131
- ref_code = ref_codes[0]
132
- assert_equal([1,3], ref_code.id)
133
-
134
- ref_code = ref_codes[1]
135
- assert_equal([2,1], ref_code.id)
136
- end
137
- 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_each
45
+ room_assignments = []
46
+ RoomAssignment.find_each(:batch_size => 2) do |assignment|
47
+ room_assignments << assignment
48
+ end
49
+
50
+ assert_equal(RoomAssignment.count, room_assignments.uniq.length)
51
+ end
52
+
53
+ def test_find_each_with_scope
54
+ scoped_departments = Department.where("department_id <> 3")
55
+ scoped_departments.find_each(:batch_size => 2) do |department|
56
+ assert department.id != 3
57
+ end
58
+ end
59
+
60
+ def test_not_found
61
+ error = assert_raise(::ActiveRecord::RecordNotFound) do
62
+ ReferenceCode.find(['999', '999'])
63
+ end
64
+
65
+ expected = "Couldn't find all ReferenceCodes with 'reference_type_id,reference_code': (999, 999) (found 0 results, but was looking for 1)."
66
+ assert_equal(with_quoted_identifiers(expected), error.message)
67
+ end
68
+
69
+ def test_find_last_suburb
70
+ suburb = Suburb.last
71
+ assert_equal([2,1], suburb.id)
72
+ end
73
+
74
+ def test_find_last_suburb_with_order
75
+ # Rails actually changes city_id DESC to city_id ASC
76
+ suburb = Suburb.order('suburbs.city_id DESC').last
77
+ assert_equal([1,1], suburb.id)
78
+ end
79
+
80
+ def test_find_in_batches
81
+ Department.find_in_batches do |batch|
82
+ assert_equal(Department.count, batch.size)
83
+ end
84
+ end
85
+
86
+ def test_in_batches_of_1
87
+ num_found = 0
88
+ Department.in_batches(of: 1) do |batch|
89
+ batch.each do |dept|
90
+ num_found += 1
91
+ end
92
+ end
93
+ assert_equal(Department.count, num_found)
94
+ end
95
+
96
+ def test_find_by_one_association
97
+ department = departments(:engineering)
98
+ employees = Employee.where(:department => department)
99
+ assert_equal(2, employees.to_a.count)
100
+ end
101
+
102
+ def test_find_by_all_associations
103
+ departments = Department.all
104
+ employees = Employee.where(:department => departments)
105
+ assert_equal(4, employees.to_a.count)
106
+ end
107
+
108
+ def test_expand_all
109
+ departments = Department.all
110
+ employees = Employee.where(:department => departments)
111
+ assert_equal(4, employees.count)
112
+ end
113
+
114
+ def test_find_one_with_params_id
115
+ params_id = ReferenceCode.find([1,3]).to_param
116
+ assert_equal params_id, "1,3"
117
+
118
+ ref_code = ReferenceCode.find(params_id)
119
+ assert_not_nil(ref_code)
120
+ assert_equal([1,3], ref_code.id)
121
+ end
122
+
123
+ def test_find_some_with_array_of_params_id
124
+ params_ids = ReferenceCode.find([1,3], [2,1]).map(&:to_param)
125
+ assert_equal ["1,3", "2,1"], params_ids
126
+
127
+ ref_codes = ReferenceCode.find(params_ids)
128
+ assert_kind_of(Array, ref_codes)
129
+ assert_equal(2, ref_codes.length)
130
+
131
+ ref_code = ref_codes[0]
132
+ assert_equal([1,3], ref_code.id)
133
+
134
+ ref_code = ref_codes[1]
135
+ assert_equal([2,1], ref_code.id)
136
+ end
137
+ end
@@ -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