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.
- checksums.yaml +4 -4
- data/History.rdoc +8 -2
- data/README.rdoc +1 -0
- data/Rakefile +37 -37
- data/lib/composite_primary_keys/arel/sqlserver.rb +37 -37
- data/lib/composite_primary_keys/arel/to_sql.rb +18 -18
- data/lib/composite_primary_keys/associations/association.rb +23 -23
- data/lib/composite_primary_keys/associations/collection_association.rb +31 -31
- data/lib/composite_primary_keys/associations/foreign_association.rb +15 -15
- data/lib/composite_primary_keys/associations/has_many_association.rb +35 -35
- data/lib/composite_primary_keys/associations/preloader/association.rb +68 -53
- data/lib/composite_primary_keys/associations/through_association.rb +25 -25
- data/lib/composite_primary_keys/autosave_association.rb +60 -60
- data/lib/composite_primary_keys/composite_arrays.rb +86 -86
- data/lib/composite_primary_keys/composite_predicates.rb +71 -70
- data/lib/composite_primary_keys/composite_relation.rb +29 -29
- data/lib/composite_primary_keys/connection_adapters/abstract_adapter.rb +10 -10
- data/lib/composite_primary_keys/connection_adapters/postgresql/database_statements.rb +26 -26
- data/lib/composite_primary_keys/counter_cache.rb +15 -15
- data/lib/composite_primary_keys/fixtures.rb +21 -21
- data/lib/composite_primary_keys/persistence.rb +21 -7
- data/lib/composite_primary_keys/relation/calculations.rb +7 -1
- data/lib/composite_primary_keys/sanitization.rb +42 -42
- data/lib/composite_primary_keys/transactions.rb +34 -34
- data/lib/composite_primary_keys/validations/uniqueness.rb +31 -31
- data/lib/composite_primary_keys/version.rb +1 -1
- data/lib/composite_primary_keys.rb +1 -1
- data/scripts/console.rb +48 -48
- data/scripts/txt2html +76 -76
- data/scripts/txt2js +65 -65
- data/tasks/databases/mysql.rake +40 -40
- data/tasks/databases/oracle.rake +41 -41
- data/tasks/databases/postgresql.rake +38 -38
- data/tasks/databases/sqlite.rake +25 -25
- data/tasks/databases/sqlserver.rake +43 -43
- data/tasks/website.rake +18 -18
- data/test/README_tests.rdoc +56 -56
- data/test/abstract_unit.rb +5 -1
- data/test/connections/connection_spec.rb +27 -27
- data/test/connections/databases.example.yml +40 -40
- data/test/connections/databases.yml +40 -39
- data/test/fixtures/article.rb +10 -10
- data/test/fixtures/articles.yml +7 -7
- data/test/fixtures/capitol.rb +3 -3
- data/test/fixtures/capitols.yml +16 -16
- data/test/fixtures/comment.rb +5 -5
- data/test/fixtures/comments.yml +17 -17
- data/test/fixtures/dorm.rb +2 -2
- data/test/fixtures/dorms.yml +4 -4
- data/test/fixtures/employee.rb +5 -5
- data/test/fixtures/group.rb +2 -2
- data/test/fixtures/groups.yml +6 -6
- data/test/fixtures/membership_status.rb +2 -2
- data/test/fixtures/membership_statuses.yml +16 -16
- data/test/fixtures/memberships.yml +10 -10
- data/test/fixtures/product.rb +9 -9
- data/test/fixtures/product_tariff.rb +5 -5
- data/test/fixtures/product_tariffs.yml +14 -14
- data/test/fixtures/products.yml +11 -11
- data/test/fixtures/reading.rb +4 -4
- data/test/fixtures/readings.yml +10 -10
- data/test/fixtures/reference_code.rb +7 -7
- data/test/fixtures/reference_codes.yml +28 -28
- data/test/fixtures/reference_type.rb +12 -12
- data/test/fixtures/reference_types.yml +9 -9
- data/test/fixtures/restaurant.rb +9 -9
- data/test/fixtures/restaurants.yml +14 -14
- data/test/fixtures/restaurants_suburb.rb +2 -2
- data/test/fixtures/room.rb +11 -11
- data/test/fixtures/room_assignment.rb +13 -13
- data/test/fixtures/room_assignments.yml +24 -24
- data/test/fixtures/room_attribute.rb +2 -2
- data/test/fixtures/room_attribute_assignment.rb +4 -4
- data/test/fixtures/room_attribute_assignments.yml +4 -4
- data/test/fixtures/room_attributes.yml +2 -2
- data/test/fixtures/rooms.yml +12 -12
- data/test/fixtures/street.rb +2 -2
- data/test/fixtures/student.rb +3 -3
- data/test/fixtures/students.yml +15 -15
- data/test/fixtures/suburb.rb +5 -5
- data/test/fixtures/tariff.rb +5 -5
- data/test/fixtures/tariffs.yml +14 -14
- data/test/fixtures/topic_sources.yml +3 -3
- data/test/fixtures/topics.yml +8 -8
- data/test/fixtures/users.yml +10 -10
- data/test/plugins/pagination.rb +405 -405
- data/test/plugins/pagination_helper.rb +135 -135
- data/test/test_attribute_methods.rb +63 -63
- data/test/test_callbacks.rb +99 -99
- data/test/test_composite_arrays.rb +38 -38
- data/test/test_counter_cache.rb +30 -30
- data/test/test_dumpable.rb +15 -15
- data/test/test_dup.rb +37 -37
- data/test/test_equal.rb +26 -26
- data/test/test_habtm.rb +141 -141
- data/test/test_miscellaneous.rb +32 -32
- data/test/test_optimistic.rb +18 -18
- data/test/test_pagination.rb +35 -35
- data/test/test_polymorphic.rb +43 -43
- data/test/test_predicates.rb +59 -59
- data/test/test_preload.rb +102 -102
- data/test/test_santiago.rb +23 -23
- data/test/test_touch.rb +23 -23
- data/test/test_tutorial_example.rb +25 -25
- data/test/test_validations.rb +13 -13
- metadata +6 -6
data/test/test_optimistic.rb
CHANGED
@@ -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
|
data/test/test_pagination.rb
CHANGED
@@ -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
|
data/test/test_polymorphic.rb
CHANGED
@@ -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
|
data/test/test_predicates.rb
CHANGED
@@ -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
|
data/test/test_preload.rb
CHANGED
@@ -1,102 +1,102 @@
|
|
1
|
-
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
-
|
3
|
-
class TestPreload < ActiveSupport::TestCase
|
4
|
-
fixtures :articles, :comments, :users, :employees, :groups, :readings
|
5
|
-
|
6
|
-
class UserForPreload < User
|
7
|
-
has_many :comments_with_include_condition, -> { where('person_type = ?', 'User')},
|
8
|
-
class_name: 'Comment', foreign_key: 'person_id', as: :person
|
9
|
-
has_many :comments_with_exclude_condition, -> { where('person_type <> ?', 'SomeType')},
|
10
|
-
class_name: 'Comment', foreign_key: 'person_id', as: :person
|
11
|
-
end
|
12
|
-
|
13
|
-
class EmployeeForPreload < Employee
|
14
|
-
# this is a rather random condition, which should not interfere with the normal test queries
|
15
|
-
has_and_belongs_to_many :groups_2, class_name: 'Group', foreign_key: 'employee_id', join_table: 'employees_groups'
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_preload_of_polymorphic_association
|
19
|
-
comment = Comment.where(id: [1, 2, 3]).all
|
20
|
-
persons = comment.map(&:person)
|
21
|
-
persons.each do |person|
|
22
|
-
assert_kind_of(ActiveRecord::Base, person)
|
23
|
-
end
|
24
|
-
|
25
|
-
comment = Comment.where(id: [1, 2, 3]).preload(:person).all
|
26
|
-
persons = comment.map(&:person)
|
27
|
-
persons.each do |person|
|
28
|
-
assert_kind_of(ActiveRecord::Base, person)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_preload_for_conditioned_has_many_association
|
33
|
-
# has one comment
|
34
|
-
article = articles(:first)
|
35
|
-
user1 = users(:santiago)
|
36
|
-
user2 = UserForPreload.create(name: 'TestPreload')
|
37
|
-
Comment.create(article: article, person: user2, person_type: 'User')
|
38
|
-
Comment.create(article: article, person: user2, person_type: 'User')
|
39
|
-
|
40
|
-
users = UserForPreload.where(id: [user1.id, user2.id]).all
|
41
|
-
assert_equal(1, users.first.comments_with_include_condition.size)
|
42
|
-
assert_equal(2, users.second.comments_with_include_condition.size)
|
43
|
-
|
44
|
-
users = UserForPreload.where(id: [user1.id, user2.id]).preload(:comments_with_include_condition).all
|
45
|
-
assert_equal(1, users.first.comments_with_include_condition.size)
|
46
|
-
assert_equal(2, users.second.comments_with_include_condition.size)
|
47
|
-
|
48
|
-
users = UserForPreload.where(id: [user1.id, user2.id]).all
|
49
|
-
assert_equal(1, users.first.comments_with_exclude_condition.size)
|
50
|
-
assert_equal(2, users.second.comments_with_exclude_condition.size)
|
51
|
-
|
52
|
-
users = UserForPreload.where(id: [user1.id, user2.id]).preload(:comments_with_exclude_condition).all
|
53
|
-
assert_equal(1, users.first.comments_with_exclude_condition.size)
|
54
|
-
assert_equal(2, users.second.comments_with_exclude_condition.size)
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_preload_for_unconditioned_habtm_association
|
58
|
-
employee1 = employees(:steve)
|
59
|
-
employee2 = employees(:jill)
|
60
|
-
employee1.groups = [groups(:cpk)]
|
61
|
-
employee2.groups = [groups(:cpk), groups(:group2)]
|
62
|
-
employee1.save!; employee2.save!
|
63
|
-
|
64
|
-
employees = Employee.where(id: [1, 2]).all
|
65
|
-
assert_equal(1, employees.first.groups.size)
|
66
|
-
assert_equal(2, employees.second.groups.size)
|
67
|
-
|
68
|
-
employees = Employee.where(id: [1, 2]).preload(:groups).all
|
69
|
-
assert_equal(1, employees.first.groups.size)
|
70
|
-
assert_equal(2, employees.second.groups.size)
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_preload_for_conditioned_habtm_association
|
74
|
-
employee1 = employees(:steve)
|
75
|
-
employee2 = employees(:jill)
|
76
|
-
employee1.groups = [groups(:cpk)]
|
77
|
-
employee2.groups = [groups(:cpk), groups(:group2)]
|
78
|
-
employee1.save!; employee2.save!
|
79
|
-
|
80
|
-
employees = EmployeeForPreload.where(id: [1, 2]).all.order(:id)
|
81
|
-
|
82
|
-
# Even without preload two errors: First Employee has Group 1 loaded twice,
|
83
|
-
# Second Employee has only Group 2 instead of Group 1&2
|
84
|
-
assert_equal(1, employees.first.groups.size)
|
85
|
-
assert_equal(1, employees.first.groups_2.size)
|
86
|
-
assert_equal(2, employees.second.groups.size)
|
87
|
-
assert_equal(2, employees.second.groups_2.size)
|
88
|
-
|
89
|
-
employees = EmployeeForPreload.where(id: [1, 2]).preload(:groups_2).all.order(:id)
|
90
|
-
|
91
|
-
# with preloading, the first assertion is valid, but the second only gets Group 2 instead of 1&2
|
92
|
-
assert_equal(1, employees.first.groups_2.size)
|
93
|
-
assert_equal(2, employees.second.groups_2.size)
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_preload_settings_inversion
|
97
|
-
user = User.preload(:readings).find_by!(:name => 'Santiago')
|
98
|
-
assert_equal(2, user.readings.count)
|
99
|
-
reading = user.readings.first
|
100
|
-
assert_equal(true, reading.association(:user).loaded?)
|
101
|
-
end
|
102
|
-
end
|
1
|
+
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
+
|
3
|
+
class TestPreload < ActiveSupport::TestCase
|
4
|
+
fixtures :articles, :comments, :users, :employees, :groups, :readings
|
5
|
+
|
6
|
+
class UserForPreload < User
|
7
|
+
has_many :comments_with_include_condition, -> { where('person_type = ?', 'User')},
|
8
|
+
class_name: 'Comment', foreign_key: 'person_id', as: :person
|
9
|
+
has_many :comments_with_exclude_condition, -> { where('person_type <> ?', 'SomeType')},
|
10
|
+
class_name: 'Comment', foreign_key: 'person_id', as: :person
|
11
|
+
end
|
12
|
+
|
13
|
+
class EmployeeForPreload < Employee
|
14
|
+
# this is a rather random condition, which should not interfere with the normal test queries
|
15
|
+
has_and_belongs_to_many :groups_2, class_name: 'Group', foreign_key: 'employee_id', join_table: 'employees_groups'
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_preload_of_polymorphic_association
|
19
|
+
comment = Comment.where(id: [1, 2, 3]).all
|
20
|
+
persons = comment.map(&:person)
|
21
|
+
persons.each do |person|
|
22
|
+
assert_kind_of(ActiveRecord::Base, person)
|
23
|
+
end
|
24
|
+
|
25
|
+
comment = Comment.where(id: [1, 2, 3]).preload(:person).all
|
26
|
+
persons = comment.map(&:person)
|
27
|
+
persons.each do |person|
|
28
|
+
assert_kind_of(ActiveRecord::Base, person)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_preload_for_conditioned_has_many_association
|
33
|
+
# has one comment
|
34
|
+
article = articles(:first)
|
35
|
+
user1 = users(:santiago)
|
36
|
+
user2 = UserForPreload.create(name: 'TestPreload')
|
37
|
+
Comment.create(article: article, person: user2, person_type: 'User')
|
38
|
+
Comment.create(article: article, person: user2, person_type: 'User')
|
39
|
+
|
40
|
+
users = UserForPreload.where(id: [user1.id, user2.id]).all
|
41
|
+
assert_equal(1, users.first.comments_with_include_condition.size)
|
42
|
+
assert_equal(2, users.second.comments_with_include_condition.size)
|
43
|
+
|
44
|
+
users = UserForPreload.where(id: [user1.id, user2.id]).preload(:comments_with_include_condition).all
|
45
|
+
assert_equal(1, users.first.comments_with_include_condition.size)
|
46
|
+
assert_equal(2, users.second.comments_with_include_condition.size)
|
47
|
+
|
48
|
+
users = UserForPreload.where(id: [user1.id, user2.id]).all
|
49
|
+
assert_equal(1, users.first.comments_with_exclude_condition.size)
|
50
|
+
assert_equal(2, users.second.comments_with_exclude_condition.size)
|
51
|
+
|
52
|
+
users = UserForPreload.where(id: [user1.id, user2.id]).preload(:comments_with_exclude_condition).all
|
53
|
+
assert_equal(1, users.first.comments_with_exclude_condition.size)
|
54
|
+
assert_equal(2, users.second.comments_with_exclude_condition.size)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_preload_for_unconditioned_habtm_association
|
58
|
+
employee1 = employees(:steve)
|
59
|
+
employee2 = employees(:jill)
|
60
|
+
employee1.groups = [groups(:cpk)]
|
61
|
+
employee2.groups = [groups(:cpk), groups(:group2)]
|
62
|
+
employee1.save!; employee2.save!
|
63
|
+
|
64
|
+
employees = Employee.where(id: [1, 2]).all
|
65
|
+
assert_equal(1, employees.first.groups.size)
|
66
|
+
assert_equal(2, employees.second.groups.size)
|
67
|
+
|
68
|
+
employees = Employee.where(id: [1, 2]).preload(:groups).all
|
69
|
+
assert_equal(1, employees.first.groups.size)
|
70
|
+
assert_equal(2, employees.second.groups.size)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_preload_for_conditioned_habtm_association
|
74
|
+
employee1 = employees(:steve)
|
75
|
+
employee2 = employees(:jill)
|
76
|
+
employee1.groups = [groups(:cpk)]
|
77
|
+
employee2.groups = [groups(:cpk), groups(:group2)]
|
78
|
+
employee1.save!; employee2.save!
|
79
|
+
|
80
|
+
employees = EmployeeForPreload.where(id: [1, 2]).all.order(:id)
|
81
|
+
|
82
|
+
# Even without preload two errors: First Employee has Group 1 loaded twice,
|
83
|
+
# Second Employee has only Group 2 instead of Group 1&2
|
84
|
+
assert_equal(1, employees.first.groups.size)
|
85
|
+
assert_equal(1, employees.first.groups_2.size)
|
86
|
+
assert_equal(2, employees.second.groups.size)
|
87
|
+
assert_equal(2, employees.second.groups_2.size)
|
88
|
+
|
89
|
+
employees = EmployeeForPreload.where(id: [1, 2]).preload(:groups_2).all.order(:id)
|
90
|
+
|
91
|
+
# with preloading, the first assertion is valid, but the second only gets Group 2 instead of 1&2
|
92
|
+
assert_equal(1, employees.first.groups_2.size)
|
93
|
+
assert_equal(2, employees.second.groups_2.size)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_preload_settings_inversion
|
97
|
+
user = User.preload(:readings).find_by!(:name => 'Santiago')
|
98
|
+
assert_equal(2, user.readings.count)
|
99
|
+
reading = user.readings.first
|
100
|
+
assert_equal(true, reading.association(:user).loaded?)
|
101
|
+
end
|
102
|
+
end
|
data/test/test_santiago.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
|
-
# Test cases devised by Santiago that broke the Composite Primary Keys
|
2
|
-
# code at one point in time. But no more!!!
|
3
|
-
require File.expand_path('../abstract_unit', __FILE__)
|
4
|
-
|
5
|
-
class TestSantiago < ActiveSupport::TestCase
|
6
|
-
fixtures :suburbs, :streets, :users, :articles, :readings
|
7
|
-
|
8
|
-
def test_normal_and_composite_associations
|
9
|
-
assert_not_nil @suburb = Suburb.find([1, 1])
|
10
|
-
assert_equal 1, @suburb.streets.length
|
11
|
-
|
12
|
-
assert_not_nil @street = Street.find(1)
|
13
|
-
assert_not_nil @street.suburb
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_single_keys
|
17
|
-
@santiago = User.find(1)
|
18
|
-
assert_not_nil @santiago.articles
|
19
|
-
assert_equal 2, @santiago.articles.length
|
20
|
-
assert_not_nil @santiago.readings
|
21
|
-
assert_equal 2, @santiago.readings.length
|
22
|
-
end
|
23
|
-
end
|
1
|
+
# Test cases devised by Santiago that broke the Composite Primary Keys
|
2
|
+
# code at one point in time. But no more!!!
|
3
|
+
require File.expand_path('../abstract_unit', __FILE__)
|
4
|
+
|
5
|
+
class TestSantiago < ActiveSupport::TestCase
|
6
|
+
fixtures :suburbs, :streets, :users, :articles, :readings
|
7
|
+
|
8
|
+
def test_normal_and_composite_associations
|
9
|
+
assert_not_nil @suburb = Suburb.find([1, 1])
|
10
|
+
assert_equal 1, @suburb.streets.length
|
11
|
+
|
12
|
+
assert_not_nil @street = Street.find(1)
|
13
|
+
assert_not_nil @street.suburb
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_single_keys
|
17
|
+
@santiago = User.find(1)
|
18
|
+
assert_not_nil @santiago.articles
|
19
|
+
assert_equal 2, @santiago.articles.length
|
20
|
+
assert_not_nil @santiago.readings
|
21
|
+
assert_equal 2, @santiago.readings.length
|
22
|
+
end
|
23
|
+
end
|
data/test/test_touch.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
|
-
# Test cases devised by Santiago that broke the Composite Primary Keys
|
2
|
-
# code at one point in time. But no more!!!
|
3
|
-
require File.expand_path('../abstract_unit', __FILE__)
|
4
|
-
|
5
|
-
class TestTouch < ActiveSupport::TestCase
|
6
|
-
fixtures :products, :tariffs
|
7
|
-
|
8
|
-
def test_touching_a_record_updates_its_timestamp
|
9
|
-
tariff = tariffs(:flat)
|
10
|
-
previous_amount = tariff.amount
|
11
|
-
previously_updated_at = tariff.updated_at
|
12
|
-
|
13
|
-
tariff.amount = previous_amount + 1
|
14
|
-
sleep 1.0 # we need to sleep for 1 second because the times updated (on mysql, at least) are only precise to 1 second.
|
15
|
-
tariff.touch
|
16
|
-
assert_not_equal previously_updated_at, tariff.updated_at
|
17
|
-
assert_equal previous_amount + 1, tariff.amount
|
18
|
-
assert tariff.amount_changed?, 'tarif amount should have changed'
|
19
|
-
assert tariff.changed?, 'tarif should be marked as changed'
|
20
|
-
tariff.reload
|
21
|
-
assert_not_equal previously_updated_at, tariff.updated_at
|
22
|
-
end
|
23
|
-
end
|
1
|
+
# Test cases devised by Santiago that broke the Composite Primary Keys
|
2
|
+
# code at one point in time. But no more!!!
|
3
|
+
require File.expand_path('../abstract_unit', __FILE__)
|
4
|
+
|
5
|
+
class TestTouch < ActiveSupport::TestCase
|
6
|
+
fixtures :products, :tariffs
|
7
|
+
|
8
|
+
def test_touching_a_record_updates_its_timestamp
|
9
|
+
tariff = tariffs(:flat)
|
10
|
+
previous_amount = tariff.amount
|
11
|
+
previously_updated_at = tariff.updated_at
|
12
|
+
|
13
|
+
tariff.amount = previous_amount + 1
|
14
|
+
sleep 1.0 # we need to sleep for 1 second because the times updated (on mysql, at least) are only precise to 1 second.
|
15
|
+
tariff.touch
|
16
|
+
assert_not_equal previously_updated_at, tariff.updated_at
|
17
|
+
assert_equal previous_amount + 1, tariff.amount
|
18
|
+
assert tariff.amount_changed?, 'tarif amount should have changed'
|
19
|
+
assert tariff.changed?, 'tarif should be marked as changed'
|
20
|
+
tariff.reload
|
21
|
+
assert_not_equal previously_updated_at, tariff.updated_at
|
22
|
+
end
|
23
|
+
end
|
@@ -1,26 +1,26 @@
|
|
1
|
-
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
-
|
3
|
-
class TestTutorialExample < ActiveSupport::TestCase
|
4
|
-
fixtures :users, :groups, :memberships, :membership_statuses
|
5
|
-
|
6
|
-
def test_membership
|
7
|
-
membership = Membership.find([1, 1])
|
8
|
-
assert(membership, "Cannot find a membership")
|
9
|
-
assert(membership.user)
|
10
|
-
assert(membership.group)
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_status
|
14
|
-
membership = Membership.find([1, 1])
|
15
|
-
statuses = membership.statuses
|
16
|
-
assert(membership, "Cannot find a membership")
|
17
|
-
assert(statuses, "No has_many association to status")
|
18
|
-
assert_equal(membership, statuses.first.membership)
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_count
|
22
|
-
membership = Membership.find([1, 1])
|
23
|
-
assert(membership, "Cannot find a membership")
|
24
|
-
assert_equal(1, membership.statuses.count)
|
25
|
-
end
|
1
|
+
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
+
|
3
|
+
class TestTutorialExample < ActiveSupport::TestCase
|
4
|
+
fixtures :users, :groups, :memberships, :membership_statuses
|
5
|
+
|
6
|
+
def test_membership
|
7
|
+
membership = Membership.find([1, 1])
|
8
|
+
assert(membership, "Cannot find a membership")
|
9
|
+
assert(membership.user)
|
10
|
+
assert(membership.group)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_status
|
14
|
+
membership = Membership.find([1, 1])
|
15
|
+
statuses = membership.statuses
|
16
|
+
assert(membership, "Cannot find a membership")
|
17
|
+
assert(statuses, "No has_many association to status")
|
18
|
+
assert_equal(membership, statuses.first.membership)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_count
|
22
|
+
membership = Membership.find([1, 1])
|
23
|
+
assert(membership, "Cannot find a membership")
|
24
|
+
assert_equal(1, membership.statuses.count)
|
25
|
+
end
|
26
26
|
end
|