composite_primary_keys 12.0.5 → 13.0.0
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 +883 -862
- data/README.rdoc +181 -180
- data/lib/composite_primary_keys.rb +119 -118
- data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -19
- data/lib/composite_primary_keys/associations/association_scope.rb +66 -68
- data/lib/composite_primary_keys/associations/join_dependency.rb +118 -103
- data/lib/composite_primary_keys/attribute_methods.rb +21 -9
- data/lib/composite_primary_keys/attribute_methods/primary_key.rb +0 -2
- data/lib/composite_primary_keys/attribute_methods/read.rb +30 -30
- data/lib/composite_primary_keys/attribute_methods/write.rb +35 -35
- data/lib/composite_primary_keys/base.rb +141 -141
- data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +37 -22
- data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +44 -44
- data/lib/composite_primary_keys/core.rb +48 -48
- data/lib/composite_primary_keys/nested_attributes.rb +1 -1
- data/lib/composite_primary_keys/persistence.rb +82 -81
- data/lib/composite_primary_keys/reflection.rb +91 -29
- data/lib/composite_primary_keys/relation.rb +197 -193
- data/lib/composite_primary_keys/relation/batches.rb +16 -8
- data/lib/composite_primary_keys/relation/calculations.rb +104 -81
- data/lib/composite_primary_keys/relation/finder_methods.rb +235 -235
- data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +39 -20
- data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
- data/lib/composite_primary_keys/relation/where_clause.rb +18 -23
- data/lib/composite_primary_keys/table_metadata.rb +11 -0
- data/lib/composite_primary_keys/version.rb +8 -8
- data/test/abstract_unit.rb +114 -114
- data/test/connections/databases.ci.yml +22 -19
- data/test/fixtures/db_definitions/db2-create-tables.sql +112 -112
- data/test/fixtures/db_definitions/db2-drop-tables.sql +16 -16
- data/test/fixtures/db_definitions/mysql.sql +180 -180
- data/test/fixtures/db_definitions/oracle.drop.sql +41 -41
- data/test/fixtures/db_definitions/oracle.sql +199 -199
- data/test/fixtures/db_definitions/postgresql.sql +182 -182
- data/test/fixtures/db_definitions/sqlite.sql +169 -169
- data/test/fixtures/db_definitions/sqlserver.sql +176 -176
- data/test/fixtures/department.rb +16 -16
- data/test/fixtures/departments.yml +19 -15
- data/test/fixtures/employees.yml +33 -28
- data/test/fixtures/restaurants_suburbs.yml +10 -10
- data/test/fixtures/streets.yml +16 -16
- data/test/fixtures/suburbs.yml +14 -14
- data/test/fixtures/user.rb +11 -11
- data/test/test_associations.rb +364 -358
- data/test/test_attributes.rb +75 -60
- data/test/test_calculations.rb +49 -42
- data/test/test_create.rb +218 -180
- data/test/test_delete.rb +182 -179
- data/test/test_exists.rb +39 -39
- data/test/test_find.rb +170 -157
- data/test/test_ids.rb +112 -112
- data/test/test_nested_attributes.rb +67 -67
- data/test/test_update.rb +96 -96
- metadata +5 -5
- data/lib/composite_primary_keys/connection_adapters/mysql/database_statements.rb +0 -24
data/test/test_attributes.rb
CHANGED
@@ -1,61 +1,76 @@
|
|
1
|
-
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
-
|
3
|
-
class TestAttributes < ActiveSupport::TestCase
|
4
|
-
fixtures :reference_types, :reference_codes, :products, :tariffs, :product_tariffs
|
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_brackets
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
1
|
+
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
+
|
3
|
+
class TestAttributes < ActiveSupport::TestCase
|
4
|
+
fixtures :reference_types, :reference_codes, :products, :tariffs, :product_tariffs
|
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_brackets
|
22
|
+
tested_at_least_on_attribute = false
|
23
|
+
testing_with do
|
24
|
+
@first.attributes.each_pair do |attr_name, value|
|
25
|
+
next if value.nil?
|
26
|
+
assert_equal value, @first[attr_name]
|
27
|
+
tested_at_least_on_attribute = true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
assert tested_at_least_on_attribute
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_brackets_primary_key
|
34
|
+
testing_with do
|
35
|
+
assert_equal(@first.id, @first[@primary_keys])
|
36
|
+
assert_equal(@first.id, @first[@first.class.primary_key])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_brackets_assignment
|
41
|
+
testing_with do
|
42
|
+
@first.attributes.each_pair do |attr_name, value|
|
43
|
+
next if attr_name == @first.class.primary_key
|
44
|
+
@first[attr_name]= !value.nil? ? value * 2 : '1'
|
45
|
+
assert_equal !value.nil? ? value * 2 : '1', @first[attr_name]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_brackets_foreign_key_assignment
|
51
|
+
tarrif = tariffs(:flat)
|
52
|
+
product_tariff = product_tariffs(:first_flat)
|
53
|
+
compare_indexes(tarrif, tarrif.class.primary_key, product_tariff, [:tariff_id, :tariff_start_date])
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_has_attribute
|
57
|
+
tariff = tariffs(:flat)
|
58
|
+
assert(tariff.has_attribute?([:tariff_id, :start_date]))
|
59
|
+
assert(tariff.has_attribute?(['tariff_id', 'start_date']))
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_has__attribute
|
63
|
+
tariff = tariffs(:flat)
|
64
|
+
assert(tariff._has_attribute?(['tariff_id', 'start_date']))
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def compare_indexes(obj1, indexes1, obj2, indexes2)
|
70
|
+
indexes1.length.times do |key_index|
|
71
|
+
key1 = indexes1[key_index]
|
72
|
+
key2 = indexes2[key_index]
|
73
|
+
assert_equal(obj1[key1], obj2[key2])
|
74
|
+
end
|
75
|
+
end
|
61
76
|
end
|
data/test/test_calculations.rb
CHANGED
@@ -1,42 +1,49 @@
|
|
1
|
-
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
-
|
3
|
-
class TestCalculations < ActiveSupport::TestCase
|
4
|
-
fixtures :articles, :products, :tariffs, :product_tariffs, :suburbs, :streets, :restaurants,
|
5
|
-
:dorms, :rooms, :room_attributes, :room_attribute_assignments, :students, :room_assignments, :users, :readings,
|
6
|
-
:departments, :employees, :memberships, :membership_statuses
|
7
|
-
|
8
|
-
def test_count
|
9
|
-
assert_equal(3, Product.includes(:product_tariffs).count)
|
10
|
-
assert_equal(3, Tariff.includes(:product_tariffs).count)
|
11
|
-
|
12
|
-
expected = {Date.today => 2,
|
13
|
-
Date.today.next => 1}
|
14
|
-
|
15
|
-
assert_equal(expected, Tariff.group(:start_date).count)
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_count_distinct
|
19
|
-
product = products(:first_product)
|
20
|
-
assert_equal(1, product.product_tariffs.select('tariff_start_date').distinct.count)
|
21
|
-
end
|
22
|
-
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
1
|
+
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
+
|
3
|
+
class TestCalculations < ActiveSupport::TestCase
|
4
|
+
fixtures :articles, :products, :tariffs, :product_tariffs, :suburbs, :streets, :restaurants,
|
5
|
+
:dorms, :rooms, :room_attributes, :room_attribute_assignments, :students, :room_assignments, :users, :readings,
|
6
|
+
:departments, :employees, :memberships, :membership_statuses, :reference_codes, :reference_types
|
7
|
+
|
8
|
+
def test_count
|
9
|
+
assert_equal(3, Product.includes(:product_tariffs).count)
|
10
|
+
assert_equal(3, Tariff.includes(:product_tariffs).count)
|
11
|
+
|
12
|
+
expected = {Date.today => 2,
|
13
|
+
Date.today.next => 1}
|
14
|
+
|
15
|
+
assert_equal(expected, Tariff.group(:start_date).count)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_count_distinct
|
19
|
+
product = products(:first_product)
|
20
|
+
assert_equal(1, product.product_tariffs.select('tariff_start_date').distinct.count)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_count_on_joined_relations_that_have_column_names_in_common
|
24
|
+
count_without_includes = ReferenceCode.count
|
25
|
+
count_with_includes = ReferenceCode.includes(:reference_type).references(:reference_type).count
|
26
|
+
assert_equal(count_without_includes, count_with_includes)
|
27
|
+
assert_equal(5, count_with_includes)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_count_not_distinct
|
31
|
+
product = products(:first_product)
|
32
|
+
assert_equal(2, product.product_tariffs.select('tariff_start_date').count)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_count_includes
|
36
|
+
count = Dorm.where("rooms.room_id = ?", 2).includes(:rooms).references(:rooms).count
|
37
|
+
assert_equal(1, count)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_count_includes_dup_columns
|
41
|
+
count = Tariff.includes(:product_tariffs).references(:product_tariffs).where("product_tariffs.tariff_id = ?", 2).count
|
42
|
+
assert_equal(1, count)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_average
|
46
|
+
average = Tariff.average(:amount)
|
47
|
+
assert_equal(50, average)
|
48
|
+
end
|
49
|
+
end
|
data/test/test_create.rb
CHANGED
@@ -1,180 +1,218 @@
|
|
1
|
-
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
-
|
3
|
-
class TestCreate < ActiveSupport::TestCase
|
4
|
-
fixtures :articles, :students, :dorms, :rooms, :room_assignments, :reference_types, :reference_codes, :streets, :suburbs
|
5
|
-
|
6
|
-
CLASSES = {
|
7
|
-
:single => {
|
8
|
-
:class => ReferenceType,
|
9
|
-
:primary_keys => :reference_type_id,
|
10
|
-
:create => {:reference_type_id => 10, :type_label => 'NEW_TYPE', :abbreviation => 'New Type'}
|
11
|
-
},
|
12
|
-
:dual => {
|
13
|
-
:class => ReferenceCode,
|
14
|
-
:primary_keys => [:reference_type_id, :reference_code],
|
15
|
-
:create => {:reference_type_id => 1, :reference_code => 20, :code_label => 'NEW_CODE', :abbreviation => 'New Code'}
|
16
|
-
}
|
17
|
-
}
|
18
|
-
|
19
|
-
def setup
|
20
|
-
self.class.classes = CLASSES
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_setup
|
24
|
-
testing_with do
|
25
|
-
assert_not_nil @klass_info[:create]
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_create
|
30
|
-
testing_with do
|
31
|
-
assert new_obj = @klass.create(@klass_info[:create])
|
32
|
-
assert !new_obj.new_record?
|
33
|
-
assert new_obj.id
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_create_no_id
|
38
|
-
testing_with do
|
39
|
-
begin
|
40
|
-
@obj = @klass.create(@klass_info[:create].except(@klass.primary_key))
|
41
|
-
@successful = !composite?
|
42
|
-
rescue ActiveRecord::CompositeKeyError
|
43
|
-
@successful = false
|
44
|
-
rescue
|
45
|
-
flunk "Incorrect exception raised: #{$!}, #{$!.class}"
|
46
|
-
end
|
47
|
-
assert_equal composite?, !@successful, "Create should have failed for composites; #{@obj.inspect}"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
assert_equal(
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
assert_equal(
|
117
|
-
assert_equal(
|
118
|
-
assert_equal(
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
suburb
|
124
|
-
assert_equal(
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
assert_equal(
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
assignment1.
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
room.
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
1
|
+
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
+
|
3
|
+
class TestCreate < ActiveSupport::TestCase
|
4
|
+
fixtures :articles, :students, :dorms, :rooms, :room_assignments, :reference_types, :reference_codes, :streets, :suburbs
|
5
|
+
|
6
|
+
CLASSES = {
|
7
|
+
:single => {
|
8
|
+
:class => ReferenceType,
|
9
|
+
:primary_keys => :reference_type_id,
|
10
|
+
:create => {:reference_type_id => 10, :type_label => 'NEW_TYPE', :abbreviation => 'New Type'}
|
11
|
+
},
|
12
|
+
:dual => {
|
13
|
+
:class => ReferenceCode,
|
14
|
+
:primary_keys => [:reference_type_id, :reference_code],
|
15
|
+
:create => {:reference_type_id => 1, :reference_code => 20, :code_label => 'NEW_CODE', :abbreviation => 'New Code'}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
def setup
|
20
|
+
self.class.classes = CLASSES
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_setup
|
24
|
+
testing_with do
|
25
|
+
assert_not_nil @klass_info[:create]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_create
|
30
|
+
testing_with do
|
31
|
+
assert new_obj = @klass.create(@klass_info[:create])
|
32
|
+
assert !new_obj.new_record?
|
33
|
+
assert new_obj.id
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_create_no_id
|
38
|
+
testing_with do
|
39
|
+
begin
|
40
|
+
@obj = @klass.create(@klass_info[:create].except(@klass.primary_key))
|
41
|
+
@successful = !composite?
|
42
|
+
rescue ActiveRecord::CompositeKeyError
|
43
|
+
@successful = false
|
44
|
+
rescue
|
45
|
+
flunk "Incorrect exception raised: #{$!}, #{$!.class}"
|
46
|
+
end
|
47
|
+
assert_equal composite?, !@successful, "Create should have failed for composites; #{@obj.inspect}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_create_with_array
|
52
|
+
date = Date.new(2027, 01, 27)
|
53
|
+
tariff = Tariff.create!(id: [10, date], amount: 27)
|
54
|
+
refute_nil(tariff)
|
55
|
+
assert_equal([10, date], tariff.id)
|
56
|
+
assert_equal(date, tariff.start_date)
|
57
|
+
assert_equal(27, tariff.amount)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_create_with_partial_serial
|
61
|
+
attributes = {:location_id => 100}
|
62
|
+
|
63
|
+
# SQLite does not support an autoincrementing field in a composite key
|
64
|
+
if Department.connection.class.name == "ActiveRecord::ConnectionAdapters::SQLite3Adapter"
|
65
|
+
attributes[:id] = 200
|
66
|
+
end
|
67
|
+
|
68
|
+
department = Department.new(attributes)
|
69
|
+
assert_nil(department.attributes[:id])
|
70
|
+
|
71
|
+
department.save!
|
72
|
+
refute_nil(department.attributes["id"])
|
73
|
+
assert_equal(100, department.location_id)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_create_with_id
|
77
|
+
department = Department.create!(id: [2, 3])
|
78
|
+
assert_equal([2, 3], department.id)
|
79
|
+
assert_equal(2, department.attributes["id"])
|
80
|
+
assert_equal(3, department.attributes["location_id"])
|
81
|
+
|
82
|
+
department.reload
|
83
|
+
assert_equal([2, 3], department.id)
|
84
|
+
assert_equal(2, department.attributes["id"])
|
85
|
+
assert_equal(3, department.attributes["location_id"])
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_create_on_association
|
89
|
+
suburb = Suburb.first
|
90
|
+
suburb.streets.create(:name => "my street")
|
91
|
+
street = Street.find_by_name('my street')
|
92
|
+
assert_equal(suburb.city_id, street.city_id)
|
93
|
+
assert_equal(suburb.suburb_id, street.suburb_id)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_create_on_association_when_belongs_to_is_single_key
|
97
|
+
rt = ReferenceType.first
|
98
|
+
rt.reference_codes.create(:reference_code => 4321, :code_label => 'foo', :abbreviation => 'bar')
|
99
|
+
rc = ReferenceCode.find_by_reference_code(4321)
|
100
|
+
assert_equal(rc.reference_type_id, rt.reference_type_id)
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_new_habtm
|
104
|
+
restaurant = Restaurant.new(:franchise_id => 101,
|
105
|
+
:store_id => 201,
|
106
|
+
:name => "My Store")
|
107
|
+
|
108
|
+
restaurant.suburbs << Suburb.new(:city_id => 24,
|
109
|
+
:suburb_id => 25,
|
110
|
+
:name => "My Suburb")
|
111
|
+
|
112
|
+
restaurant.save!
|
113
|
+
|
114
|
+
# Test restaurant
|
115
|
+
assert_equal(101, restaurant.franchise_id)
|
116
|
+
assert_equal(201, restaurant.store_id)
|
117
|
+
assert_equal("My Store", restaurant.name)
|
118
|
+
assert_equal(1, restaurant.suburbs.length)
|
119
|
+
|
120
|
+
# Test suburbs
|
121
|
+
suburb = restaurant.suburbs[0]
|
122
|
+
assert_equal(24, suburb.city_id)
|
123
|
+
assert_equal(25, suburb.suburb_id)
|
124
|
+
assert_equal("My Suburb", suburb.name)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_create_habtm
|
128
|
+
restaurant = Restaurant.create(:franchise_id => 100,
|
129
|
+
:store_id => 200,
|
130
|
+
:name => "My Store")
|
131
|
+
|
132
|
+
restaurant.suburbs.create(:city_id => 24,
|
133
|
+
:suburb_id => 25,
|
134
|
+
:name => "My Suburb")
|
135
|
+
|
136
|
+
# Test restaurant
|
137
|
+
assert_equal(100, restaurant.franchise_id)
|
138
|
+
assert_equal(200, restaurant.store_id)
|
139
|
+
assert_equal("My Store", restaurant.name)
|
140
|
+
|
141
|
+
assert_equal(1, restaurant.suburbs.reload.length)
|
142
|
+
|
143
|
+
# Test suburbs
|
144
|
+
suburb = restaurant.suburbs[0]
|
145
|
+
assert_equal(24, suburb.city_id)
|
146
|
+
assert_equal(25, suburb.suburb_id)
|
147
|
+
assert_equal("My Suburb", suburb.name)
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_has_many_ids_1
|
151
|
+
dorm = dorms(:toyon)
|
152
|
+
room = Room.new(:dorm_id => dorm.id, :room_id => 5)
|
153
|
+
room.save!
|
154
|
+
|
155
|
+
student1 = students(:kelly)
|
156
|
+
|
157
|
+
RoomAssignment.delete_all
|
158
|
+
|
159
|
+
assignment1 = RoomAssignment.new(:student_id => student1.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
|
160
|
+
assignment1.save!
|
161
|
+
|
162
|
+
room.room_assignment_ids = [[assignment1.student_id, assignment1.dorm_id, assignment1.room_id]]
|
163
|
+
room.save!
|
164
|
+
|
165
|
+
assert_equal(1, room.room_assignments.length)
|
166
|
+
assert_equal(assignment1, room.room_assignments.first)
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_has_many_ids_2
|
170
|
+
dorm = dorms(:toyon)
|
171
|
+
room = Room.new(:dorm_id => dorm.id, :room_id => 5)
|
172
|
+
room.save!
|
173
|
+
|
174
|
+
student1 = students(:kelly)
|
175
|
+
student2 = students(:jordan)
|
176
|
+
|
177
|
+
RoomAssignment.delete_all
|
178
|
+
|
179
|
+
assignment1 = RoomAssignment.new(:student_id => student1.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
|
180
|
+
assignment1.save!
|
181
|
+
|
182
|
+
assignment2 = RoomAssignment.new(:student_id => student2.id, :dorm_id => room.dorm_id, :room_id => room.room_id)
|
183
|
+
assignment2.save!
|
184
|
+
|
185
|
+
room.room_assignment_ids = [[assignment1.student_id, assignment1.dorm_id, assignment1.room_id],
|
186
|
+
[assignment2.student_id, assignment2.dorm_id, assignment2.room_id]]
|
187
|
+
room.save!
|
188
|
+
|
189
|
+
assert_equal(2, room.room_assignments.length)
|
190
|
+
assert_equal(assignment1, room.room_assignments[0])
|
191
|
+
assert_equal(assignment2, room.room_assignments[1])
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_find_or_create_by
|
195
|
+
suburb = Suburb.find_by(:city_id => 3, :suburb_id => 1)
|
196
|
+
assert_nil(suburb)
|
197
|
+
|
198
|
+
suburb = Suburb.find_or_create_by!(:name => 'New Suburb', :city_id => 3, :suburb_id => 1)
|
199
|
+
refute_nil(suburb)
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_cache
|
203
|
+
Suburb.cache do
|
204
|
+
# Suburb does not exist
|
205
|
+
suburb = Suburb.find_by(:city_id => 10, :suburb_id => 10)
|
206
|
+
assert_nil(suburb)
|
207
|
+
|
208
|
+
# Create it
|
209
|
+
suburb = Suburb.create!(:name => 'New Suburb', :city_id => 10, :suburb_id => 10)
|
210
|
+
|
211
|
+
# Should be able to find it
|
212
|
+
suburb = Suburb.find_by(:city_id => 10)
|
213
|
+
refute_nil(suburb)
|
214
|
+
refute_nil(suburb.city_id)
|
215
|
+
refute_nil(suburb.suburb_id)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|