composite_primary_keys 13.0.1 → 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 (106) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +8 -2
  3. data/README.rdoc +1 -0
  4. data/Rakefile +37 -37
  5. data/lib/composite_primary_keys/arel/sqlserver.rb +37 -37
  6. data/lib/composite_primary_keys/arel/to_sql.rb +18 -18
  7. data/lib/composite_primary_keys/associations/association.rb +23 -23
  8. data/lib/composite_primary_keys/associations/collection_association.rb +31 -31
  9. data/lib/composite_primary_keys/associations/foreign_association.rb +15 -15
  10. data/lib/composite_primary_keys/associations/has_many_association.rb +35 -35
  11. data/lib/composite_primary_keys/associations/preloader/association.rb +68 -53
  12. data/lib/composite_primary_keys/associations/through_association.rb +25 -25
  13. data/lib/composite_primary_keys/autosave_association.rb +60 -60
  14. data/lib/composite_primary_keys/composite_arrays.rb +86 -86
  15. data/lib/composite_primary_keys/composite_predicates.rb +71 -70
  16. data/lib/composite_primary_keys/composite_relation.rb +29 -29
  17. data/lib/composite_primary_keys/connection_adapters/abstract_adapter.rb +10 -10
  18. data/lib/composite_primary_keys/connection_adapters/postgresql/database_statements.rb +26 -26
  19. data/lib/composite_primary_keys/counter_cache.rb +15 -15
  20. data/lib/composite_primary_keys/fixtures.rb +21 -21
  21. data/lib/composite_primary_keys/persistence.rb +21 -7
  22. data/lib/composite_primary_keys/relation/calculations.rb +7 -1
  23. data/lib/composite_primary_keys/sanitization.rb +42 -42
  24. data/lib/composite_primary_keys/transactions.rb +34 -34
  25. data/lib/composite_primary_keys/validations/uniqueness.rb +31 -31
  26. data/lib/composite_primary_keys/version.rb +1 -1
  27. data/lib/composite_primary_keys.rb +1 -1
  28. data/scripts/console.rb +48 -48
  29. data/scripts/txt2html +76 -76
  30. data/scripts/txt2js +65 -65
  31. data/tasks/databases/mysql.rake +40 -40
  32. data/tasks/databases/oracle.rake +41 -41
  33. data/tasks/databases/postgresql.rake +38 -38
  34. data/tasks/databases/sqlite.rake +25 -25
  35. data/tasks/databases/sqlserver.rake +43 -43
  36. data/tasks/website.rake +18 -18
  37. data/test/README_tests.rdoc +56 -56
  38. data/test/abstract_unit.rb +5 -1
  39. data/test/connections/connection_spec.rb +27 -27
  40. data/test/connections/databases.example.yml +40 -40
  41. data/test/connections/databases.yml +40 -39
  42. data/test/fixtures/article.rb +10 -10
  43. data/test/fixtures/articles.yml +7 -7
  44. data/test/fixtures/capitol.rb +3 -3
  45. data/test/fixtures/capitols.yml +16 -16
  46. data/test/fixtures/comment.rb +5 -5
  47. data/test/fixtures/comments.yml +17 -17
  48. data/test/fixtures/dorm.rb +2 -2
  49. data/test/fixtures/dorms.yml +4 -4
  50. data/test/fixtures/employee.rb +5 -5
  51. data/test/fixtures/group.rb +2 -2
  52. data/test/fixtures/groups.yml +6 -6
  53. data/test/fixtures/membership_status.rb +2 -2
  54. data/test/fixtures/membership_statuses.yml +16 -16
  55. data/test/fixtures/memberships.yml +10 -10
  56. data/test/fixtures/product.rb +9 -9
  57. data/test/fixtures/product_tariff.rb +5 -5
  58. data/test/fixtures/product_tariffs.yml +14 -14
  59. data/test/fixtures/products.yml +11 -11
  60. data/test/fixtures/reading.rb +4 -4
  61. data/test/fixtures/readings.yml +10 -10
  62. data/test/fixtures/reference_code.rb +7 -7
  63. data/test/fixtures/reference_codes.yml +28 -28
  64. data/test/fixtures/reference_type.rb +12 -12
  65. data/test/fixtures/reference_types.yml +9 -9
  66. data/test/fixtures/restaurant.rb +9 -9
  67. data/test/fixtures/restaurants.yml +14 -14
  68. data/test/fixtures/restaurants_suburb.rb +2 -2
  69. data/test/fixtures/room.rb +11 -11
  70. data/test/fixtures/room_assignment.rb +13 -13
  71. data/test/fixtures/room_assignments.yml +24 -24
  72. data/test/fixtures/room_attribute.rb +2 -2
  73. data/test/fixtures/room_attribute_assignment.rb +4 -4
  74. data/test/fixtures/room_attribute_assignments.yml +4 -4
  75. data/test/fixtures/room_attributes.yml +2 -2
  76. data/test/fixtures/rooms.yml +12 -12
  77. data/test/fixtures/street.rb +2 -2
  78. data/test/fixtures/student.rb +3 -3
  79. data/test/fixtures/students.yml +15 -15
  80. data/test/fixtures/suburb.rb +5 -5
  81. data/test/fixtures/tariff.rb +5 -5
  82. data/test/fixtures/tariffs.yml +14 -14
  83. data/test/fixtures/topic_sources.yml +3 -3
  84. data/test/fixtures/topics.yml +8 -8
  85. data/test/fixtures/users.yml +10 -10
  86. data/test/plugins/pagination.rb +405 -405
  87. data/test/plugins/pagination_helper.rb +135 -135
  88. data/test/test_attribute_methods.rb +63 -63
  89. data/test/test_callbacks.rb +99 -99
  90. data/test/test_composite_arrays.rb +38 -38
  91. data/test/test_counter_cache.rb +30 -30
  92. data/test/test_dumpable.rb +15 -15
  93. data/test/test_dup.rb +37 -37
  94. data/test/test_equal.rb +26 -26
  95. data/test/test_habtm.rb +141 -141
  96. data/test/test_miscellaneous.rb +32 -32
  97. data/test/test_optimistic.rb +18 -18
  98. data/test/test_pagination.rb +35 -35
  99. data/test/test_polymorphic.rb +43 -43
  100. data/test/test_predicates.rb +59 -59
  101. data/test/test_preload.rb +102 -102
  102. data/test/test_santiago.rb +23 -23
  103. data/test/test_touch.rb +23 -23
  104. data/test/test_tutorial_example.rb +25 -25
  105. data/test/test_validations.rb +13 -13
  106. metadata +6 -6
@@ -1,38 +1,38 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class CompositeArraysTest < ActiveSupport::TestCase
4
-
5
- def test_new_primary_keys
6
- keys = CompositePrimaryKeys::CompositeKeys.new
7
- assert_not_nil keys
8
- assert_equal '', keys.to_s
9
- assert_equal '', "#{keys}"
10
- end
11
-
12
- def test_initialize_primary_keys
13
- keys = CompositePrimaryKeys::CompositeKeys.new([1,2,3])
14
- assert_not_nil keys
15
- assert_equal '1,2,3', keys.to_s
16
- assert_equal '1,2,3', "#{keys}"
17
- end
18
-
19
- def test_to_composite_keys
20
- keys = [1,2,3].to_composite_keys
21
- assert_equal CompositePrimaryKeys::CompositeKeys, keys.class
22
- assert_equal '1,2,3', keys.to_s
23
- end
24
-
25
- def test_parse
26
- assert_equal ['1', '2'], CompositePrimaryKeys::CompositeKeys.parse('1,2')
27
- assert_equal ['The USA', '^Washington, D.C.'],
28
- CompositePrimaryKeys::CompositeKeys.parse('The USA,^5EWashington^2C D.C.')
29
- assert_equal ['The USA', '^Washington, D.C.'],
30
- CompositePrimaryKeys::CompositeKeys.parse(['The USA', '^Washington, D.C.'])
31
- end
32
-
33
- def test_to_s
34
- assert_equal '1,2', CompositePrimaryKeys::CompositeKeys.new([1, 2]).to_s
35
- assert_equal 'The USA,^5EWashington^2C D.C.',
36
- CompositePrimaryKeys::CompositeKeys.new(['The USA', '^Washington, D.C.']).to_s
37
- end
38
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class CompositeArraysTest < ActiveSupport::TestCase
4
+
5
+ def test_new_primary_keys
6
+ keys = CompositePrimaryKeys::CompositeKeys.new
7
+ assert_not_nil keys
8
+ assert_equal '', keys.to_s
9
+ assert_equal '', "#{keys}"
10
+ end
11
+
12
+ def test_initialize_primary_keys
13
+ keys = CompositePrimaryKeys::CompositeKeys.new([1,2,3])
14
+ assert_not_nil keys
15
+ assert_equal '1,2,3', keys.to_s
16
+ assert_equal '1,2,3', "#{keys}"
17
+ end
18
+
19
+ def test_to_composite_keys
20
+ keys = [1,2,3].to_composite_keys
21
+ assert_equal CompositePrimaryKeys::CompositeKeys, keys.class
22
+ assert_equal '1,2,3', keys.to_s
23
+ end
24
+
25
+ def test_parse
26
+ assert_equal ['1', '2'], CompositePrimaryKeys::CompositeKeys.parse('1,2')
27
+ assert_equal ['The USA', '^Washington, D.C.'],
28
+ CompositePrimaryKeys::CompositeKeys.parse('The USA,^5EWashington^2C D.C.')
29
+ assert_equal ['The USA', '^Washington, D.C.'],
30
+ CompositePrimaryKeys::CompositeKeys.parse(['The USA', '^Washington, D.C.'])
31
+ end
32
+
33
+ def test_to_s
34
+ assert_equal '1,2', CompositePrimaryKeys::CompositeKeys.new([1, 2]).to_s
35
+ assert_equal 'The USA,^5EWashington^2C D.C.',
36
+ CompositePrimaryKeys::CompositeKeys.new(['The USA', '^Washington, D.C.']).to_s
37
+ end
38
+ end
@@ -1,31 +1,31 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestCounterCache < ActiveSupport::TestCase
4
- fixtures :dorms, :rooms, :tariffs
5
-
6
- def test_update_counter
7
- tariff = tariffs(:flat)
8
- assert_equal(50, tariff.amount)
9
- Tariff.update_counters(tariff.id, :amount => 1)
10
- tariff.reload
11
- assert_equal(51, tariff.amount)
12
- end
13
-
14
- def test_increment_counter
15
- tariff = tariffs(:flat)
16
- assert_equal(50, tariff.amount)
17
- Tariff.increment_counter(:amount, tariff.id)
18
-
19
- tariff.reload
20
- assert_equal(51, tariff.amount)
21
- end
22
-
23
- def test_decrement_counter
24
- tariff = tariffs(:flat)
25
- assert_equal(50, tariff.amount)
26
- Tariff.decrement_counter(:amount, tariff.id)
27
-
28
- tariff.reload
29
- assert_equal(49, tariff.amount)
30
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestCounterCache < ActiveSupport::TestCase
4
+ fixtures :dorms, :rooms, :tariffs
5
+
6
+ def test_update_counter
7
+ tariff = tariffs(:flat)
8
+ assert_equal(50, tariff.amount)
9
+ Tariff.update_counters(tariff.id, :amount => 1)
10
+ tariff.reload
11
+ assert_equal(51, tariff.amount)
12
+ end
13
+
14
+ def test_increment_counter
15
+ tariff = tariffs(:flat)
16
+ assert_equal(50, tariff.amount)
17
+ Tariff.increment_counter(:amount, tariff.id)
18
+
19
+ tariff.reload
20
+ assert_equal(51, tariff.amount)
21
+ end
22
+
23
+ def test_decrement_counter
24
+ tariff = tariffs(:flat)
25
+ assert_equal(50, tariff.amount)
26
+ Tariff.decrement_counter(:amount, tariff.id)
27
+
28
+ tariff.reload
29
+ assert_equal(49, tariff.amount)
30
+ end
31
31
  end
@@ -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
data/test/test_dup.rb CHANGED
@@ -1,38 +1,38 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestClone < ActiveSupport::TestCase
4
- fixtures :reference_types, :reference_codes
5
-
6
- CLASSES = {
7
- :single => {
8
- :class => ReferenceType,
9
- :primary_keys => :reference_type_id,
10
- },
11
- :dual => {
12
- :class => ReferenceCode,
13
- :primary_keys => [:reference_type_id, :reference_code],
14
- },
15
- }
16
-
17
- def setup
18
- self.class.classes = CLASSES
19
- end
20
-
21
- def test_dup
22
- testing_with do
23
- clone = @first.dup
24
-
25
- remove_keys = Array(@klass.primary_key).map(&:to_s)
26
- remove_keys << Array(@klass.primary_key) # Rails 4 adds the PK to the attributes, so we want to remove it as well
27
- assert_equal(@first.attributes.except(*remove_keys), clone.attributes.except(*remove_keys))
28
-
29
- if composite?
30
- @klass.primary_key.each do |key|
31
- assert_nil(clone[key], "Primary key '#{key}' should be nil")
32
- end
33
- else
34
- assert_nil(clone[@klass.primary_key], "Sole primary key should be nil")
35
- end
36
- end
37
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestClone < ActiveSupport::TestCase
4
+ fixtures :reference_types, :reference_codes
5
+
6
+ CLASSES = {
7
+ :single => {
8
+ :class => ReferenceType,
9
+ :primary_keys => :reference_type_id,
10
+ },
11
+ :dual => {
12
+ :class => ReferenceCode,
13
+ :primary_keys => [:reference_type_id, :reference_code],
14
+ },
15
+ }
16
+
17
+ def setup
18
+ self.class.classes = CLASSES
19
+ end
20
+
21
+ def test_dup
22
+ testing_with do
23
+ clone = @first.dup
24
+
25
+ remove_keys = Array(@klass.primary_key).map(&:to_s)
26
+ remove_keys << Array(@klass.primary_key) # Rails 4 adds the PK to the attributes, so we want to remove it as well
27
+ assert_equal(@first.attributes.except(*remove_keys), clone.attributes.except(*remove_keys))
28
+
29
+ if composite?
30
+ @klass.primary_key.each do |key|
31
+ assert_nil(clone[key], "Primary key '#{key}' should be nil")
32
+ end
33
+ else
34
+ assert_nil(clone[@klass.primary_key], "Sole primary key should be nil")
35
+ end
36
+ end
37
+ end
38
38
  end
data/test/test_equal.rb CHANGED
@@ -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
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
@@ -1,32 +1,32 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestMiscellaneous < ActiveSupport::TestCase
4
- fixtures :reference_types, :reference_codes, :products
5
-
6
- CLASSES = {
7
- :single => {
8
- :class => ReferenceType,
9
- :primary_keys => :reference_type_id,
10
- },
11
- :dual => {
12
- :class => ReferenceCode,
13
- :primary_keys => [:reference_type_id, :reference_code],
14
- },
15
- }
16
-
17
- def setup
18
- self.class.classes = CLASSES
19
- end
20
-
21
- def test_composite_class
22
- testing_with do
23
- assert_equal composite?, @klass.composite?
24
- end
25
- end
26
-
27
- def test_composite_instance
28
- testing_with do
29
- assert_equal composite?, @first.composite?
30
- end
31
- end
32
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestMiscellaneous < ActiveSupport::TestCase
4
+ fixtures :reference_types, :reference_codes, :products
5
+
6
+ CLASSES = {
7
+ :single => {
8
+ :class => ReferenceType,
9
+ :primary_keys => :reference_type_id,
10
+ },
11
+ :dual => {
12
+ :class => ReferenceCode,
13
+ :primary_keys => [:reference_type_id, :reference_code],
14
+ },
15
+ }
16
+
17
+ def setup
18
+ self.class.classes = CLASSES
19
+ end
20
+
21
+ def test_composite_class
22
+ testing_with do
23
+ assert_equal composite?, @klass.composite?
24
+ end
25
+ end
26
+
27
+ def test_composite_instance
28
+ testing_with do
29
+ assert_equal composite?, @first.composite?
30
+ end
31
+ end
32
+ end