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
@@ -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
|
data/test/test_counter_cache.rb
CHANGED
@@ -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
|
data/test/test_dumpable.rb
CHANGED
@@ -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
|
data/test/test_miscellaneous.rb
CHANGED
@@ -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
|