composite_primary_keys 13.0.1 → 13.0.2

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 (108) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +891 -888
  3. data/README.rdoc +181 -181
  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/{join_dependency.rb → join_association.rb} +1 -1
  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_relation.rb +29 -29
  16. data/lib/composite_primary_keys/connection_adapters/abstract_adapter.rb +10 -10
  17. data/lib/composite_primary_keys/connection_adapters/postgresql/database_statements.rb +26 -26
  18. data/lib/composite_primary_keys/counter_cache.rb +15 -15
  19. data/lib/composite_primary_keys/fixtures.rb +21 -21
  20. data/lib/composite_primary_keys/persistence.rb +82 -82
  21. data/lib/composite_primary_keys/relation/calculations.rb +104 -104
  22. data/lib/composite_primary_keys/sanitization.rb +42 -42
  23. data/lib/composite_primary_keys/transactions.rb +34 -34
  24. data/lib/composite_primary_keys/validations/uniqueness.rb +31 -31
  25. data/lib/composite_primary_keys/version.rb +8 -8
  26. data/lib/composite_primary_keys.rb +118 -118
  27. data/scripts/console.rb +48 -48
  28. data/scripts/txt2html +76 -76
  29. data/scripts/txt2js +65 -65
  30. data/tasks/databases/mysql.rake +40 -40
  31. data/tasks/databases/oracle.rake +41 -41
  32. data/tasks/databases/postgresql.rake +38 -38
  33. data/tasks/databases/sqlite.rake +25 -25
  34. data/tasks/databases/sqlserver.rake +43 -43
  35. data/tasks/website.rake +18 -18
  36. data/test/README_tests.rdoc +56 -56
  37. data/test/abstract_unit.rb +114 -114
  38. data/test/connections/connection_spec.rb +27 -27
  39. data/test/connections/databases.example.yml +40 -40
  40. data/test/connections/databases.yml +40 -39
  41. data/test/fixtures/article.rb +10 -10
  42. data/test/fixtures/articles.yml +7 -7
  43. data/test/fixtures/capitol.rb +3 -3
  44. data/test/fixtures/capitols.yml +16 -16
  45. data/test/fixtures/comment.rb +5 -5
  46. data/test/fixtures/comments.yml +17 -17
  47. data/test/fixtures/department.rb +16 -16
  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.rb +8 -8
  54. data/test/fixtures/membership_status.rb +2 -2
  55. data/test/fixtures/membership_statuses.yml +16 -16
  56. data/test/fixtures/memberships.yml +10 -10
  57. data/test/fixtures/product.rb +9 -9
  58. data/test/fixtures/product_tariff.rb +5 -5
  59. data/test/fixtures/product_tariffs.yml +14 -14
  60. data/test/fixtures/products.yml +11 -11
  61. data/test/fixtures/reading.rb +4 -4
  62. data/test/fixtures/readings.yml +10 -10
  63. data/test/fixtures/reference_code.rb +7 -7
  64. data/test/fixtures/reference_codes.yml +28 -28
  65. data/test/fixtures/reference_type.rb +12 -12
  66. data/test/fixtures/reference_types.yml +9 -9
  67. data/test/fixtures/restaurant.rb +9 -9
  68. data/test/fixtures/restaurants.yml +14 -14
  69. data/test/fixtures/restaurants_suburb.rb +2 -2
  70. data/test/fixtures/room.rb +11 -11
  71. data/test/fixtures/room_assignment.rb +13 -13
  72. data/test/fixtures/room_assignments.yml +24 -24
  73. data/test/fixtures/room_attribute.rb +2 -2
  74. data/test/fixtures/room_attribute_assignment.rb +4 -4
  75. data/test/fixtures/room_attribute_assignments.yml +4 -4
  76. data/test/fixtures/room_attributes.yml +2 -2
  77. data/test/fixtures/rooms.yml +12 -12
  78. data/test/fixtures/street.rb +2 -2
  79. data/test/fixtures/student.rb +3 -3
  80. data/test/fixtures/students.yml +15 -15
  81. data/test/fixtures/suburb.rb +5 -5
  82. data/test/fixtures/tariff.rb +5 -5
  83. data/test/fixtures/tariffs.yml +14 -14
  84. data/test/fixtures/topic_sources.yml +3 -3
  85. data/test/fixtures/topics.yml +8 -8
  86. data/test/fixtures/users.yml +10 -10
  87. data/test/plugins/pagination.rb +405 -405
  88. data/test/plugins/pagination_helper.rb +135 -135
  89. data/test/test_associations.rb +372 -372
  90. data/test/test_attribute_methods.rb +63 -63
  91. data/test/test_callbacks.rb +99 -99
  92. data/test/test_composite_arrays.rb +38 -38
  93. data/test/test_counter_cache.rb +30 -30
  94. data/test/test_dumpable.rb +15 -15
  95. data/test/test_dup.rb +37 -37
  96. data/test/test_equal.rb +26 -26
  97. data/test/test_habtm.rb +141 -141
  98. data/test/test_miscellaneous.rb +32 -32
  99. data/test/test_optimistic.rb +18 -18
  100. data/test/test_pagination.rb +35 -35
  101. data/test/test_polymorphic.rb +43 -43
  102. data/test/test_predicates.rb +59 -59
  103. data/test/test_preload.rb +102 -102
  104. data/test/test_santiago.rb +23 -23
  105. data/test/test_touch.rb +23 -23
  106. data/test/test_tutorial_example.rb +25 -25
  107. data/test/test_validations.rb +13 -13
  108. metadata +4 -4
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
@@ -1,18 +1,18 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestOptimisitic < ActiveSupport::TestCase
4
- fixtures :restaurants
5
-
6
- def test_update_with_stale_error
7
- restaurant_1 = Restaurant.find([1, 1])
8
- restaurant_1['name'] = "McDonalds renamed"
9
-
10
- restaurant_2 = Restaurant.find([1, 1])
11
- restaurant_2['name'] = "McDonalds renamed 2"
12
-
13
- assert(restaurant_1.save)
14
- assert_raise ActiveRecord::StaleObjectError do
15
- restaurant_2.save
16
- end
17
- end
18
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestOptimisitic < ActiveSupport::TestCase
4
+ fixtures :restaurants
5
+
6
+ def test_update_with_stale_error
7
+ restaurant_1 = Restaurant.find([1, 1])
8
+ restaurant_1['name'] = "McDonalds renamed"
9
+
10
+ restaurant_2 = Restaurant.find([1, 1])
11
+ restaurant_2['name'] = "McDonalds renamed 2"
12
+
13
+ assert(restaurant_1.save)
14
+ assert_raise ActiveRecord::StaleObjectError do
15
+ restaurant_2.save
16
+ end
17
+ end
18
+ end
@@ -1,36 +1,36 @@
1
- #require File.expand_path('../abstract_unit', __FILE__)
2
- #require 'plugins/pagination'
3
- #
4
- #class TestPagination < ActiveSupport::TestCase
5
- # fixtures :reference_types, :reference_codes
6
- #
7
- # include ActionController::Pagination
8
- # DEFAULT_PAGE_SIZE = 2
9
- #
10
- # attr_accessor :params
11
- #
12
- # CLASSES = {
13
- # :single => {
14
- # :class => ReferenceType,
15
- # :primary_keys => :reference_type_id,
16
- # :table => :reference_types,
17
- # },
18
- # :dual => {
19
- # :class => ReferenceCode,
20
- # :primary_keys => [:reference_type_id, :reference_code],
21
- # :table => :reference_codes,
22
- # },
23
- # }
24
- #
25
- # def setup
26
- # self.class.classes = CLASSES
27
- # @params = {}
28
- # end
29
- #
30
- # def test_paginate_all
31
- # testing_with do
32
- # @object_pages, @objects = paginate @klass_info[:table], :per_page => DEFAULT_PAGE_SIZE
33
- # assert_equal 2, @objects.length, "Each page should have #{DEFAULT_PAGE_SIZE} items"
34
- # end
35
- # end
1
+ #require File.expand_path('../abstract_unit', __FILE__)
2
+ #require 'plugins/pagination'
3
+ #
4
+ #class TestPagination < ActiveSupport::TestCase
5
+ # fixtures :reference_types, :reference_codes
6
+ #
7
+ # include ActionController::Pagination
8
+ # DEFAULT_PAGE_SIZE = 2
9
+ #
10
+ # attr_accessor :params
11
+ #
12
+ # CLASSES = {
13
+ # :single => {
14
+ # :class => ReferenceType,
15
+ # :primary_keys => :reference_type_id,
16
+ # :table => :reference_types,
17
+ # },
18
+ # :dual => {
19
+ # :class => ReferenceCode,
20
+ # :primary_keys => [:reference_type_id, :reference_code],
21
+ # :table => :reference_codes,
22
+ # },
23
+ # }
24
+ #
25
+ # def setup
26
+ # self.class.classes = CLASSES
27
+ # @params = {}
28
+ # end
29
+ #
30
+ # def test_paginate_all
31
+ # testing_with do
32
+ # @object_pages, @objects = paginate @klass_info[:table], :per_page => DEFAULT_PAGE_SIZE
33
+ # assert_equal 2, @objects.length, "Each page should have #{DEFAULT_PAGE_SIZE} items"
34
+ # end
35
+ # end
36
36
  #end
@@ -1,43 +1,43 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestPolymorphic < ActiveSupport::TestCase
4
- fixtures :articles, :departments, :employees, :users, :comments
5
-
6
- def test_has_many
7
- user = users(:santiago)
8
- comments = user.comments
9
- assert_equal(user.id, comments[0].person_id)
10
- end
11
-
12
- def test_has_one
13
- user = users(:santiago)
14
- first_comment = user.first_comment
15
- assert_equal(user.id, first_comment.person_id)
16
- end
17
-
18
- def test_has_many_through
19
- department = departments(:accounting)
20
- comment = comments(:employee_comment)
21
-
22
- assert_equal(1, department.comments.size)
23
- assert_equal(comment, department.comments[0])
24
- end
25
-
26
- def test_has_many_through_2
27
- article = articles(:second)
28
-
29
- user = users(:santiago)
30
- assert_equal(user, article.user_commentators[0])
31
-
32
- user = users(:drnic)
33
- assert_equal(user, article.user_commentators[1])
34
- end
35
-
36
- def test_clear_has_many_through
37
- article = articles(:second)
38
-
39
- assert_equal(2, article.comments.size)
40
- article.user_commentators = []
41
- assert_equal(0, article.comments.size)
42
- end
43
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestPolymorphic < ActiveSupport::TestCase
4
+ fixtures :articles, :departments, :employees, :users, :comments
5
+
6
+ def test_has_many
7
+ user = users(:santiago)
8
+ comments = user.comments
9
+ assert_equal(user.id, comments[0].person_id)
10
+ end
11
+
12
+ def test_has_one
13
+ user = users(:santiago)
14
+ first_comment = user.first_comment
15
+ assert_equal(user.id, first_comment.person_id)
16
+ end
17
+
18
+ def test_has_many_through
19
+ department = departments(:accounting)
20
+ comment = comments(:employee_comment)
21
+
22
+ assert_equal(1, department.comments.size)
23
+ assert_equal(comment, department.comments[0])
24
+ end
25
+
26
+ def test_has_many_through_2
27
+ article = articles(:second)
28
+
29
+ user = users(:santiago)
30
+ assert_equal(user, article.user_commentators[0])
31
+
32
+ user = users(:drnic)
33
+ assert_equal(user, article.user_commentators[1])
34
+ end
35
+
36
+ def test_clear_has_many_through
37
+ article = articles(:second)
38
+
39
+ assert_equal(2, article.comments.size)
40
+ article.user_commentators = []
41
+ assert_equal(0, article.comments.size)
42
+ end
43
+ end
@@ -1,60 +1,60 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestPredicates < ActiveSupport::TestCase
4
- fixtures :departments
5
-
6
- include CompositePrimaryKeys::Predicates
7
-
8
- def test_or
9
- dep = Department.arel_table
10
-
11
- predicates = Array.new
12
-
13
- 3.times do |i|
14
- predicates << dep[:id].eq(i)
15
- end
16
-
17
- connection = ActiveRecord::Base.connection
18
- quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
19
- expected = "(#{quoted} = 0 OR #{quoted} = 1 OR #{quoted} = 2)"
20
-
21
- pred = cpk_or_predicate(predicates)
22
- assert_equal(with_quoted_identifiers(expected), pred.to_sql)
23
- end
24
-
25
- def test_or_with_many_values
26
- dep = Arel::Table.new(:departments)
27
-
28
- predicates = Array.new
29
-
30
- number_of_predicates = 3000 # This should really be big
31
- number_of_predicates.times do |i|
32
- predicates << dep[:id].eq(i)
33
- end
34
-
35
- connection = ActiveRecord::Base.connection
36
- quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
37
- expected_ungrouped = ((0...number_of_predicates).map { |i| "#{quoted} = #{i}" }).join(' OR ')
38
- expected = "(#{expected_ungrouped})"
39
-
40
- pred = cpk_or_predicate(predicates)
41
- assert_equal(with_quoted_identifiers(expected), pred.to_sql)
42
- end
43
-
44
- def test_and
45
- dep = Department.arel_table
46
-
47
- predicates = Array.new
48
-
49
- 3.times do |i|
50
- predicates << dep[:id].eq(i)
51
- end
52
-
53
- connection = ActiveRecord::Base.connection
54
- quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
55
- expected = "#{quoted} = 0 AND #{quoted} = 1 AND #{quoted} = 2"
56
-
57
- pred = cpk_and_predicate(predicates)
58
- assert_equal(with_quoted_identifiers(expected), pred.to_sql)
59
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestPredicates < ActiveSupport::TestCase
4
+ fixtures :departments
5
+
6
+ include CompositePrimaryKeys::Predicates
7
+
8
+ def test_or
9
+ dep = Department.arel_table
10
+
11
+ predicates = Array.new
12
+
13
+ 3.times do |i|
14
+ predicates << dep[:id].eq(i)
15
+ end
16
+
17
+ connection = ActiveRecord::Base.connection
18
+ quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
19
+ expected = "(#{quoted} = 0 OR #{quoted} = 1 OR #{quoted} = 2)"
20
+
21
+ pred = cpk_or_predicate(predicates)
22
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
23
+ end
24
+
25
+ def test_or_with_many_values
26
+ dep = Arel::Table.new(:departments)
27
+
28
+ predicates = Array.new
29
+
30
+ number_of_predicates = 3000 # This should really be big
31
+ number_of_predicates.times do |i|
32
+ predicates << dep[:id].eq(i)
33
+ end
34
+
35
+ connection = ActiveRecord::Base.connection
36
+ quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
37
+ expected_ungrouped = ((0...number_of_predicates).map { |i| "#{quoted} = #{i}" }).join(' OR ')
38
+ expected = "(#{expected_ungrouped})"
39
+
40
+ pred = cpk_or_predicate(predicates)
41
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
42
+ end
43
+
44
+ def test_and
45
+ dep = Department.arel_table
46
+
47
+ predicates = Array.new
48
+
49
+ 3.times do |i|
50
+ predicates << dep[:id].eq(i)
51
+ end
52
+
53
+ connection = ActiveRecord::Base.connection
54
+ quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
55
+ expected = "#{quoted} = 0 AND #{quoted} = 1 AND #{quoted} = 2"
56
+
57
+ pred = cpk_and_predicate(predicates)
58
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
59
+ end
60
60
  end