composite_primary_keys 9.0.5 → 9.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2a7db1ee79736fa3b98274e9577f650d27c239cd
4
- data.tar.gz: 4e121d1420ba01fc56073d176888687ca78d2177
3
+ metadata.gz: f68e1e5f247cfca5284cf7c4beee35386fefd396
4
+ data.tar.gz: 0532ee35ef717e91580af50068588e4d4b623809
5
5
  SHA512:
6
- metadata.gz: 94556da0f6cfb30ed3285635ebcdbff725d5c7ad9098c3de8b63c3920c93ae1739ab27608f2c32113c8514a688ab1fadd5effddfe05b8c67ccaaed39c7f56b69
7
- data.tar.gz: df406dbc3ec9c24df294088f033ec760af5602a3ce09891ad23f5f0200bdfbba4658cf4765fc65c5f4df86ca9f749ee9f7740fb3f7c430751d201e649dd7a7c1
6
+ metadata.gz: 5577302f2ee234fcc8511bf83606bfed415973b3c84fcb8d9d5fc1d26b5545c634c1d671f7dbc5aaf82e636a531d17831bf46f4126198c575f8ef436cbc54d99
7
+ data.tar.gz: 452fa7ead38c8a096ac1c4ed106dd4280e77be768d379860c8b790b9ee26d97c79e87de384d86229c689c88e9209037b6d3d59ec173c555d9620ff4c4def5ba9
@@ -1,3 +1,8 @@
1
+ == 9.0.6 (2017-01-08)
2
+
3
+ * Uncomment tests (Sammy Larbi)
4
+ * Update readme (Charlie Savage)
5
+
1
6
  == 9.0.5 (2017-01-02)
2
7
 
3
8
  * Don't nest PK twice when looking up id, fixes #319 (Kerey Roper)
@@ -98,9 +98,69 @@ CPK supports the following databases:
98
98
 
99
99
  == Tests
100
100
 
101
+ To run tests you first need to install the appropriate gems for the database you want to test. Database gems are
102
+ divided into the following bundler groups:
103
+
104
+ * mysql
105
+ * oracle
106
+ * postgresql
107
+ * sqlite
108
+ * sqlserver
109
+
110
+ Since it is likely you do not have all the above databases installed on your computer, you want to install just the
111
+ gems for your database. For example, to test postgresql you would install the appropriate gems like this:
112
+
113
+ bundler install --without "mysql oracle sqlite sqlserver"
114
+
115
+ Once you have installed the appropriate gems, the next step is to create the test database. There is a rake
116
+ command for each database. Using our example:
117
+
118
+ rake postgresql:build_database
119
+
120
+ You can also rebuild the database if it already exists using this command:
121
+
122
+ rake postgresql:rebuild_database
123
+
124
+ To get a list of commands for your database use:
125
+
126
+ Rake -T
127
+
128
+ Finally, to run tests:
129
+
130
+ rake postgresql:test
131
+
101
132
  Travis build status: {<img src="https://travis-ci.org/composite-primary-keys/composite_primary_keys.svg" alt="Build Status" />}[https://travis-ci.org/composite-primary-keys/composite_primary_keys]
102
133
 
103
- See test/README_tests.rdoc for more information about running tests.
134
+ === DB2
135
+
136
+ DB2 is no longer supported due to difficulties in getting the ibm_db2 gem to build. Thus tests
137
+ have not been run against db2.
138
+
139
+ === MariaDb (mysql)
140
+
141
+ MariaDb is fully supported with all tests passing.
142
+
143
+ === Oracle
144
+
145
+ Oracle is fully supported with all tests passing.
146
+
147
+ === Postgresql
148
+
149
+ Postgresql is fully supported with all tests passing.
150
+
151
+ === Sqlite 3
152
+
153
+ The sqlite database is created at the path composite_primary_keys/db. Note you must *first* create the database using the
154
+ built-in rake task before running tests:
155
+
156
+ rake sqlite:build_database
157
+
158
+ Note not all tests currently pass on sqlite3. These failures happen when trying to DELETE records where the query
159
+ includes a JOIN.
160
+
161
+ === SqlServer
162
+
163
+ SqlServer is partially supported. There are a number of failing tests - patches welcomed.
104
164
 
105
165
  == Questions, Discussion and Contributions
106
166
 
@@ -2,7 +2,7 @@ module CompositePrimaryKeys
2
2
  module VERSION
3
3
  MAJOR = 9
4
4
  MINOR = 0
5
- TINY = 5
5
+ TINY = 6
6
6
  STRING = [MAJOR, MINOR, TINY].join('.')
7
7
  end
8
8
  end
@@ -12,338 +12,338 @@ class TestAssociations < ActiveSupport::TestCase
12
12
  assert_equal 2, products(:first_product).tariffs.length
13
13
  end
14
14
 
15
- # def test_product_tariffs
16
- # assert_not_nil product_tariffs(:first_flat).product
17
- # assert_not_nil product_tariffs(:first_flat).tariff
18
- # assert_equal Product, product_tariffs(:first_flat).product.class
19
- # assert_equal Tariff, product_tariffs(:first_flat).tariff.class
20
- # end
21
- #
22
- # def test_tariffs
23
- # assert_not_nil tariffs(:flat).product_tariffs
24
- # assert_equal 1, tariffs(:flat).product_tariffs.length
25
- # assert_not_nil tariffs(:flat).products
26
- # assert_equal 1, tariffs(:flat).products.length
27
- # end
28
- #
29
- # # Its not generating the instances of associated classes from the rows
30
- # def test_find_includes
31
- # # Old style
32
- # products = Product.includes(:product_tariffs).all
33
- # assert_equal(3, products.length)
34
- # assert_equal(3, products.inject(0) {|sum, product| sum + product.product_tariffs.length})
35
- #
36
- # # New style
37
- # products = Product.includes(:product_tariffs)
38
- # assert_equal(3, products.length)
39
- # assert_equal(3, products.inject(0) {|sum, product| sum + product.product_tariffs.length})
40
- # end
41
- #
42
- # def test_find_includes_eager_loading
43
- # product = products(:second_product)
44
- # product_tarrif = product_tariffs(:second_free)
45
- #
46
- # # First get a legitimate product tarrif
47
- # products = Product.includes(:product_tariffs).where('product_tariffs.product_id = ?', product.id).references(:product_tariffs)
48
- # assert_equal(1, products.length)
49
- # assert_equal(product, products.first)
50
- # assert_equal([product_tarrif], products.first.product_tariffs)
51
- # end
52
- #
53
- # def test_find_eager_loading_none
54
- # product = products(:third_product)
55
- #
56
- # products = Product.includes(:product_tariffs).where(:id => product.id).references(:product_tariffs)
57
- # assert_equal(1, products.length)
58
- # assert_equal(product, products.first)
59
- # assert_empty(products.first.product_tariffs)
60
- # end
61
- #
62
- # def test_find_includes_tariffs
63
- # # Old style
64
- # tariffs = Tariff.includes(:product_tariffs)
65
- # assert_equal(3, tariffs.length)
66
- # assert_equal(3, tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length})
67
- #
68
- # # New style
69
- # tariffs = Tariff.includes(:product_tariffs)
70
- # assert_equal(3, tariffs.length)
71
- # assert_equal(3, tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length})
72
- # end
73
- #
74
- # def test_has_one_association_is_not_cached_to_where_it_returns_the_wrong_one
75
- # engineering = departments(:engineering)
76
- # engineering_head = engineering.head
77
- # assert_equal(employees(:sarah), engineering_head)
78
- #
79
- # accounting = departments(:accounting)
80
- # accounting_head = accounting.head
81
- # assert_equal(employees(:steve), accounting_head)
82
- #
83
- # refute_equal accounting_head, engineering_head
84
- # end
85
- #
86
- # def test_has_one_association_primary_key_and_foreign_key_are_present
87
- # steve = employees(:steve)
88
- # steve_salary = steve.create_one_salary(year: "2015", month: "1")
89
- #
90
- # jill = employees(:jill)
91
- # jill_salary = jill.create_one_salary(year: "2015", month: "1")
92
- #
93
- # steve_salary.reload
94
- # jill_salary.reload
95
- # assert_equal(steve.id, steve_salary.employee_id)
96
- # assert_equal(1, steve_salary.location_id)
97
- # assert_equal(jill.id, jill_salary.employee_id)
98
- # assert_equal(1, jill_salary.location_id)
99
- # end
100
- #
101
- # def test_has_many_association_is_not_cached_to_where_it_returns_the_wrong_ones
102
- # engineering = departments(:engineering)
103
- # engineering_employees = engineering.employees
104
- #
105
- # accounting = departments(:accounting)
106
- # accounting_employees = accounting.employees
107
- #
108
- # refute_equal accounting_employees, engineering_employees
109
- # end
110
- #
111
- # def test_has_many_association_primary_key_and_foreign_key_are_present
112
- # steve = employees(:steve)
113
- # steve_salary = steve.salaries.create(year: 2015, month: 1)
114
- #
115
- # jill = employees(:jill)
116
- # jill_salary = jill.salaries.create(year: 2015, month: 1)
117
- #
118
- # steve_salary.reload
119
- # jill_salary.reload
120
- # assert_equal(steve.id, steve_salary.employee_id)
121
- # assert_equal(1, steve_salary.location_id)
122
- # assert_equal(jill.id, jill_salary.employee_id)
123
- # assert_equal(1, jill_salary.location_id)
124
- # end
125
- #
126
- # def test_belongs_to_association_primary_key_and_foreign_key_are_present
127
- # bogus_foreign_key = 2_500_000
128
- # salary_01 = Salary.new(
129
- # year: 2015,
130
- # month: 1,
131
- # employee_id: bogus_foreign_key,
132
- # location_id: 1
133
- # )
134
- # employee_01 = salary_01.create_employee
135
- # employee_01.reload
136
- #
137
- # assert_equal(salary_01.employee_id, employee_01.id, "Generated id used")
138
- # assert_not_equal(bogus_foreign_key, employee_01.id, "Bogus value ignored")
139
- # assert_equal(1, employee_01.location_id)
140
- # end
141
- #
142
- # def test_find_includes_product_tariffs_product
143
- # # Old style
144
- # product_tariffs = ProductTariff.includes(:product)
145
- # assert_not_nil(product_tariffs)
146
- # assert_equal(3, product_tariffs.length)
147
- #
148
- # # New style
149
- # product_tariffs = ProductTariff.includes(:product)
150
- # assert_not_nil(product_tariffs)
151
- # assert_equal(3, product_tariffs.length)
152
- # end
153
- #
154
- # def test_find_includes_product_tariffs_tariff
155
- # # Old style
156
- # product_tariffs = ProductTariff.includes(:tariff)
157
- # assert_equal(3, product_tariffs.length)
158
- #
159
- # # New style
160
- # product_tariffs = ProductTariff.includes(:tariff)
161
- # assert_equal(3, product_tariffs.length)
162
- # end
163
- #
164
- # def test_has_many_through
165
- # products = Product.includes(:tariffs)
166
- # assert_equal(3, products.length)
167
- #
168
- # tarrifs_length = products.inject(0) {|sum, product| sum + product.tariffs.length}
169
- # assert_equal(3, tarrifs_length)
170
- # end
171
- #
172
- # def test_new_style_includes_with_conditions
173
- # product_tariff = ProductTariff.includes(:tariff).where('tariffs.amount < 5').references(:tariffs).first
174
- # assert_equal(0, product_tariff.tariff.amount)
175
- # end
176
- #
177
- # def test_find_product_includes
178
- # products = Product.includes(:product_tariffs => :tariff)
179
- # assert_equal(3, products.length)
180
- #
181
- # product_tariffs_length = products.inject(0) {|sum, product| sum + product.product_tariffs.length}
182
- # assert_equal(3, product_tariffs_length)
183
- # end
184
- #
185
- # def test_find_tariffs_includes
186
- # tariffs = Tariff.includes(:product_tariffs => :product)
187
- # assert_equal(3, tariffs.length)
188
- #
189
- # product_tariffs_length = tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length}
190
- # assert_equal(3, product_tariffs_length)
191
- # end
192
- #
193
- # def test_has_many_through_when_not_pre_loaded
194
- # student = Student.first
195
- # rooms = student.rooms
196
- # assert_equal(1, rooms.size)
197
- # assert_equal(1, rooms.first.dorm_id)
198
- # assert_equal(1, rooms.first.room_id)
199
- # end
200
- #
201
- # def test_has_many_through_when_through_association_is_composite
202
- # dorm = Dorm.first
203
- # assert_equal(3, dorm.rooms.length)
204
- # assert_equal(1, dorm.rooms.first.room_attributes.length)
205
- # assert_equal('type', dorm.rooms.first.room_attributes.first.name)
206
- # end
207
- #
208
- # def test_associations_with_conditions
209
- # suburb = Suburb.find([2, 1])
210
- # assert_equal 2, suburb.streets.size
211
- #
212
- # suburb = Suburb.find([2, 1])
213
- # assert_equal 1, suburb.first_streets.size
214
- #
215
- # suburb = Suburb.includes(:streets).find([2, 1])
216
- # assert_equal 2, suburb.streets.size
217
- #
218
- # suburb = Suburb.includes(:first_streets).find([2, 1])
219
- # assert_equal 1, suburb.first_streets.size
220
- # end
221
- #
222
- # def test_composite_has_many_composites
223
- # room = rooms(:branner_room_1)
224
- # assert_equal(2, room.room_assignments.length)
225
- # assert_equal(room_assignments(:jacksons_room), room.room_assignments[0])
226
- # assert_equal(room_assignments(:bobs_room), room.room_assignments[1])
227
- # end
228
- #
229
- # def test_composite_belongs_to_composite
230
- # room_assignment = room_assignments(:jacksons_room)
231
- # assert_equal(rooms(:branner_room_1), room_assignment.room)
232
- # end
233
- #
234
- # def test_composite_belongs_to_changes
235
- # room_assignment = room_assignments(:jacksons_room)
236
- # room_assignment.room = rooms(:branner_room_2)
237
- # # This was raising an error before:
238
- # # TypeError: [:dorm_id, :room_id] is not a symbol
239
- # # changes returns HashWithIndifferentAccess
240
- # assert_equal({"room_id"=>[1, 2]}, room_assignment.changes)
241
- #
242
- # steve = employees(:steve)
243
- # steve.department = departments(:engineering)
244
- # # It was returning this before:
245
- # # {"[:department_id, :location_id]"=>[nil, [2, 1]]}
246
- # assert_equal({"department_id"=>[1, 2]}, steve.changes)
247
- # end
248
- #
249
- # def test_composite_belongs_to__setting_to_nil
250
- # room_assignment = room_assignments(:jacksons_room)
251
- # # This was raising an error before:
252
- # # NoMethodError: undefined method `length' for nil:NilClass
253
- # assert_nothing_raised { room_assignment.room = nil }
254
- # end
255
- #
256
- # def test_has_one_with_composite
257
- # # In this case a regular model has_one composite model
258
- # department = departments(:engineering)
259
- # assert_not_nil(department.head)
260
- # end
261
- #
262
- # def test_has_many_build_simple_key
263
- # user = users(:santiago)
264
- # reading = user.readings.build
265
- # assert_equal user.id, reading.user_id
266
- # assert_equal user, reading.user
267
- # end
268
- #
269
- # def test_has_many_build__composite_key
270
- # department = departments(:engineering)
271
- # employee = department.employees.build
272
- # assert_equal department.department_id, employee.department_id
273
- # assert_equal department.location_id, employee.location_id
274
- # assert_equal department, employee.department
275
- # end
276
- #
277
- # def test_has_many_with_primary_key
278
- # @membership = Membership.find([1, 1])
279
- # assert_equal 2, @membership.readings.size
280
- # end
281
- #
282
- # def test_has_many_with_composite_key
283
- # # In this case a regular model (Dorm) has_many composite models (Rooms)
284
- # dorm = dorms(:branner)
285
- # assert_equal(3, dorm.rooms.length)
286
- # assert_equal(1, dorm.rooms[0].room_id)
287
- # assert_equal(2, dorm.rooms[1].room_id)
288
- # assert_equal(3, dorm.rooms[2].room_id)
289
- # end
290
- #
291
- # def test_joins_has_many_with_primary_key
292
- # #@membership = Membership.find(:first, :joins => :readings, :conditions => { :readings => { :id => 1 } })
293
- # @membership = Membership.joins(:readings).where(readings: { id: 1 }).first
294
- #
295
- # assert_equal [1, 1], @membership.id
296
- # end
297
- #
298
- # def test_joins_has_one_with_primary_key
299
- # @membership = Membership.joins(:readings).where(readings: { id: 2 }).first
300
- #
301
- # assert_equal [1, 1], @membership.id
302
- # end
303
- #
304
- # def test_has_many_through_with_conditions_when_through_association_is_not_composite
305
- # user = User.first
306
- # assert_equal 1, user.articles.where("articles.name = ?", "Article One").size
307
- # end
308
- #
309
- # def test_has_many_through_with_conditions_when_through_association_is_composite
310
- # room = Room.first
311
- # assert_equal 0, room.room_attributes.where("room_attributes.name != ?", "type").size
312
- # end
313
- #
314
- # def test_has_many_through_on_custom_finder_when_through_association_is_composite_finder_when_through_association_is_not_composite
315
- # user = User.first
316
- # assert_equal(1, user.find_custom_articles.size)
317
- # end
318
- #
319
- # def test_has_many_through_on_custom_finder_when_through_association_is_composite
320
- # room = Room.first
321
- # assert_equal(0, room.find_custom_room_attributes.size)
322
- # end
323
- #
324
- # def test_has_many_with_primary_key_with_associations
325
- # memberships = Membership.includes(:statuses).where("membership_statuses.status = ?", 'Active').references(:membership_statuses)
326
- # assert_equal(2, memberships.length)
327
- # assert_equal([1,1], memberships[0].id)
328
- # assert_equal([3,2], memberships[1].id)
329
- # end
330
- #
331
- # def test_limitable_reflections
332
- # memberships = Membership.includes(:statuses).where("membership_statuses.status = ?", 'Active').references(:membership_statuses).limit(1)
333
- # assert_equal(1, memberships.length)
334
- # assert_equal([1,1], memberships[0].id)
335
- # end
336
- #
337
- # def test_foreign_key_present_with_null_association_ids
338
- # group = Group.new
339
- # group.memberships.build
340
- # associations = group.association(:memberships)
341
- # assert_equal(false, associations.send('foreign_key_present?'))
342
- # end
343
- #
344
- # def test_ids_equals_for_non_CPK_case
345
- # article = Article.new
346
- # article.reading_ids = Reading.pluck(:id)
347
- # assert_equal article.reading_ids, Reading.pluck(:id)
348
- # end
15
+ def test_product_tariffs
16
+ assert_not_nil product_tariffs(:first_flat).product
17
+ assert_not_nil product_tariffs(:first_flat).tariff
18
+ assert_equal Product, product_tariffs(:first_flat).product.class
19
+ assert_equal Tariff, product_tariffs(:first_flat).tariff.class
20
+ end
21
+
22
+ def test_tariffs
23
+ assert_not_nil tariffs(:flat).product_tariffs
24
+ assert_equal 1, tariffs(:flat).product_tariffs.length
25
+ assert_not_nil tariffs(:flat).products
26
+ assert_equal 1, tariffs(:flat).products.length
27
+ end
28
+
29
+ # Its not generating the instances of associated classes from the rows
30
+ def test_find_includes
31
+ # Old style
32
+ products = Product.includes(:product_tariffs).all
33
+ assert_equal(3, products.length)
34
+ assert_equal(3, products.inject(0) {|sum, product| sum + product.product_tariffs.length})
35
+
36
+ # New style
37
+ products = Product.includes(:product_tariffs)
38
+ assert_equal(3, products.length)
39
+ assert_equal(3, products.inject(0) {|sum, product| sum + product.product_tariffs.length})
40
+ end
41
+
42
+ def test_find_includes_eager_loading
43
+ product = products(:second_product)
44
+ product_tarrif = product_tariffs(:second_free)
45
+
46
+ # First get a legitimate product tarrif
47
+ products = Product.includes(:product_tariffs).where('product_tariffs.product_id = ?', product.id).references(:product_tariffs)
48
+ assert_equal(1, products.length)
49
+ assert_equal(product, products.first)
50
+ assert_equal([product_tarrif], products.first.product_tariffs)
51
+ end
52
+
53
+ def test_find_eager_loading_none
54
+ product = products(:third_product)
55
+
56
+ products = Product.includes(:product_tariffs).where(:id => product.id).references(:product_tariffs)
57
+ assert_equal(1, products.length)
58
+ assert_equal(product, products.first)
59
+ assert_empty(products.first.product_tariffs)
60
+ end
61
+
62
+ def test_find_includes_tariffs
63
+ # Old style
64
+ tariffs = Tariff.includes(:product_tariffs)
65
+ assert_equal(3, tariffs.length)
66
+ assert_equal(3, tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length})
67
+
68
+ # New style
69
+ tariffs = Tariff.includes(:product_tariffs)
70
+ assert_equal(3, tariffs.length)
71
+ assert_equal(3, tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length})
72
+ end
73
+
74
+ def test_has_one_association_is_not_cached_to_where_it_returns_the_wrong_one
75
+ engineering = departments(:engineering)
76
+ engineering_head = engineering.head
77
+ assert_equal(employees(:sarah), engineering_head)
78
+
79
+ accounting = departments(:accounting)
80
+ accounting_head = accounting.head
81
+ assert_equal(employees(:steve), accounting_head)
82
+
83
+ refute_equal accounting_head, engineering_head
84
+ end
85
+
86
+ def test_has_one_association_primary_key_and_foreign_key_are_present
87
+ steve = employees(:steve)
88
+ steve_salary = steve.create_one_salary(year: "2015", month: "1")
89
+
90
+ jill = employees(:jill)
91
+ jill_salary = jill.create_one_salary(year: "2015", month: "1")
92
+
93
+ steve_salary.reload
94
+ jill_salary.reload
95
+ assert_equal(steve.id, steve_salary.employee_id)
96
+ assert_equal(1, steve_salary.location_id)
97
+ assert_equal(jill.id, jill_salary.employee_id)
98
+ assert_equal(1, jill_salary.location_id)
99
+ end
100
+
101
+ def test_has_many_association_is_not_cached_to_where_it_returns_the_wrong_ones
102
+ engineering = departments(:engineering)
103
+ engineering_employees = engineering.employees
104
+
105
+ accounting = departments(:accounting)
106
+ accounting_employees = accounting.employees
107
+
108
+ refute_equal accounting_employees, engineering_employees
109
+ end
110
+
111
+ def test_has_many_association_primary_key_and_foreign_key_are_present
112
+ steve = employees(:steve)
113
+ steve_salary = steve.salaries.create(year: 2015, month: 1)
114
+
115
+ jill = employees(:jill)
116
+ jill_salary = jill.salaries.create(year: 2015, month: 1)
117
+
118
+ steve_salary.reload
119
+ jill_salary.reload
120
+ assert_equal(steve.id, steve_salary.employee_id)
121
+ assert_equal(1, steve_salary.location_id)
122
+ assert_equal(jill.id, jill_salary.employee_id)
123
+ assert_equal(1, jill_salary.location_id)
124
+ end
125
+
126
+ def test_belongs_to_association_primary_key_and_foreign_key_are_present
127
+ bogus_foreign_key = 2_500_000
128
+ salary_01 = Salary.new(
129
+ year: 2015,
130
+ month: 1,
131
+ employee_id: bogus_foreign_key,
132
+ location_id: 1
133
+ )
134
+ employee_01 = salary_01.create_employee
135
+ employee_01.reload
136
+
137
+ assert_equal(salary_01.employee_id, employee_01.id, "Generated id used")
138
+ assert_not_equal(bogus_foreign_key, employee_01.id, "Bogus value ignored")
139
+ assert_equal(1, employee_01.location_id)
140
+ end
141
+
142
+ def test_find_includes_product_tariffs_product
143
+ # Old style
144
+ product_tariffs = ProductTariff.includes(:product)
145
+ assert_not_nil(product_tariffs)
146
+ assert_equal(3, product_tariffs.length)
147
+
148
+ # New style
149
+ product_tariffs = ProductTariff.includes(:product)
150
+ assert_not_nil(product_tariffs)
151
+ assert_equal(3, product_tariffs.length)
152
+ end
153
+
154
+ def test_find_includes_product_tariffs_tariff
155
+ # Old style
156
+ product_tariffs = ProductTariff.includes(:tariff)
157
+ assert_equal(3, product_tariffs.length)
158
+
159
+ # New style
160
+ product_tariffs = ProductTariff.includes(:tariff)
161
+ assert_equal(3, product_tariffs.length)
162
+ end
163
+
164
+ def test_has_many_through
165
+ products = Product.includes(:tariffs)
166
+ assert_equal(3, products.length)
167
+
168
+ tarrifs_length = products.inject(0) {|sum, product| sum + product.tariffs.length}
169
+ assert_equal(3, tarrifs_length)
170
+ end
171
+
172
+ def test_new_style_includes_with_conditions
173
+ product_tariff = ProductTariff.includes(:tariff).where('tariffs.amount < 5').references(:tariffs).first
174
+ assert_equal(0, product_tariff.tariff.amount)
175
+ end
176
+
177
+ def test_find_product_includes
178
+ products = Product.includes(:product_tariffs => :tariff)
179
+ assert_equal(3, products.length)
180
+
181
+ product_tariffs_length = products.inject(0) {|sum, product| sum + product.product_tariffs.length}
182
+ assert_equal(3, product_tariffs_length)
183
+ end
184
+
185
+ def test_find_tariffs_includes
186
+ tariffs = Tariff.includes(:product_tariffs => :product)
187
+ assert_equal(3, tariffs.length)
188
+
189
+ product_tariffs_length = tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length}
190
+ assert_equal(3, product_tariffs_length)
191
+ end
192
+
193
+ def test_has_many_through_when_not_pre_loaded
194
+ student = Student.first
195
+ rooms = student.rooms
196
+ assert_equal(1, rooms.size)
197
+ assert_equal(1, rooms.first.dorm_id)
198
+ assert_equal(1, rooms.first.room_id)
199
+ end
200
+
201
+ def test_has_many_through_when_through_association_is_composite
202
+ dorm = Dorm.first
203
+ assert_equal(3, dorm.rooms.length)
204
+ assert_equal(1, dorm.rooms.first.room_attributes.length)
205
+ assert_equal('type', dorm.rooms.first.room_attributes.first.name)
206
+ end
207
+
208
+ def test_associations_with_conditions
209
+ suburb = Suburb.find([2, 1])
210
+ assert_equal 2, suburb.streets.size
211
+
212
+ suburb = Suburb.find([2, 1])
213
+ assert_equal 1, suburb.first_streets.size
214
+
215
+ suburb = Suburb.includes(:streets).find([2, 1])
216
+ assert_equal 2, suburb.streets.size
217
+
218
+ suburb = Suburb.includes(:first_streets).find([2, 1])
219
+ assert_equal 1, suburb.first_streets.size
220
+ end
221
+
222
+ def test_composite_has_many_composites
223
+ room = rooms(:branner_room_1)
224
+ assert_equal(2, room.room_assignments.length)
225
+ assert_equal(room_assignments(:jacksons_room), room.room_assignments[0])
226
+ assert_equal(room_assignments(:bobs_room), room.room_assignments[1])
227
+ end
228
+
229
+ def test_composite_belongs_to_composite
230
+ room_assignment = room_assignments(:jacksons_room)
231
+ assert_equal(rooms(:branner_room_1), room_assignment.room)
232
+ end
233
+
234
+ def test_composite_belongs_to_changes
235
+ room_assignment = room_assignments(:jacksons_room)
236
+ room_assignment.room = rooms(:branner_room_2)
237
+ # This was raising an error before:
238
+ # TypeError: [:dorm_id, :room_id] is not a symbol
239
+ # changes returns HashWithIndifferentAccess
240
+ assert_equal({"room_id"=>[1, 2]}, room_assignment.changes)
241
+
242
+ steve = employees(:steve)
243
+ steve.department = departments(:engineering)
244
+ # It was returning this before:
245
+ # {"[:department_id, :location_id]"=>[nil, [2, 1]]}
246
+ assert_equal({"department_id"=>[1, 2]}, steve.changes)
247
+ end
248
+
249
+ def test_composite_belongs_to__setting_to_nil
250
+ room_assignment = room_assignments(:jacksons_room)
251
+ # This was raising an error before:
252
+ # NoMethodError: undefined method `length' for nil:NilClass
253
+ assert_nothing_raised { room_assignment.room = nil }
254
+ end
255
+
256
+ def test_has_one_with_composite
257
+ # In this case a regular model has_one composite model
258
+ department = departments(:engineering)
259
+ assert_not_nil(department.head)
260
+ end
261
+
262
+ def test_has_many_build_simple_key
263
+ user = users(:santiago)
264
+ reading = user.readings.build
265
+ assert_equal user.id, reading.user_id
266
+ assert_equal user, reading.user
267
+ end
268
+
269
+ def test_has_many_build__composite_key
270
+ department = departments(:engineering)
271
+ employee = department.employees.build
272
+ assert_equal department.department_id, employee.department_id
273
+ assert_equal department.location_id, employee.location_id
274
+ assert_equal department, employee.department
275
+ end
276
+
277
+ def test_has_many_with_primary_key
278
+ @membership = Membership.find([1, 1])
279
+ assert_equal 2, @membership.readings.size
280
+ end
281
+
282
+ def test_has_many_with_composite_key
283
+ # In this case a regular model (Dorm) has_many composite models (Rooms)
284
+ dorm = dorms(:branner)
285
+ assert_equal(3, dorm.rooms.length)
286
+ assert_equal(1, dorm.rooms[0].room_id)
287
+ assert_equal(2, dorm.rooms[1].room_id)
288
+ assert_equal(3, dorm.rooms[2].room_id)
289
+ end
290
+
291
+ def test_joins_has_many_with_primary_key
292
+ #@membership = Membership.find(:first, :joins => :readings, :conditions => { :readings => { :id => 1 } })
293
+ @membership = Membership.joins(:readings).where(readings: { id: 1 }).first
294
+
295
+ assert_equal [1, 1], @membership.id
296
+ end
297
+
298
+ def test_joins_has_one_with_primary_key
299
+ @membership = Membership.joins(:readings).where(readings: { id: 2 }).first
300
+
301
+ assert_equal [1, 1], @membership.id
302
+ end
303
+
304
+ def test_has_many_through_with_conditions_when_through_association_is_not_composite
305
+ user = User.first
306
+ assert_equal 1, user.articles.where("articles.name = ?", "Article One").size
307
+ end
308
+
309
+ def test_has_many_through_with_conditions_when_through_association_is_composite
310
+ room = Room.first
311
+ assert_equal 0, room.room_attributes.where("room_attributes.name != ?", "type").size
312
+ end
313
+
314
+ def test_has_many_through_on_custom_finder_when_through_association_is_composite_finder_when_through_association_is_not_composite
315
+ user = User.first
316
+ assert_equal(1, user.find_custom_articles.size)
317
+ end
318
+
319
+ def test_has_many_through_on_custom_finder_when_through_association_is_composite
320
+ room = Room.first
321
+ assert_equal(0, room.find_custom_room_attributes.size)
322
+ end
323
+
324
+ def test_has_many_with_primary_key_with_associations
325
+ memberships = Membership.includes(:statuses).where("membership_statuses.status = ?", 'Active').references(:membership_statuses)
326
+ assert_equal(2, memberships.length)
327
+ assert_equal([1,1], memberships[0].id)
328
+ assert_equal([3,2], memberships[1].id)
329
+ end
330
+
331
+ def test_limitable_reflections
332
+ memberships = Membership.includes(:statuses).where("membership_statuses.status = ?", 'Active').references(:membership_statuses).limit(1)
333
+ assert_equal(1, memberships.length)
334
+ assert_equal([1,1], memberships[0].id)
335
+ end
336
+
337
+ def test_foreign_key_present_with_null_association_ids
338
+ group = Group.new
339
+ group.memberships.build
340
+ associations = group.association(:memberships)
341
+ assert_equal(false, associations.send('foreign_key_present?'))
342
+ end
343
+
344
+ def test_ids_equals_for_non_CPK_case
345
+ article = Article.new
346
+ article.reading_ids = Reading.pluck(:id)
347
+ assert_equal article.reading_ids, Reading.pluck(:id)
348
+ end
349
349
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: composite_primary_keys
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.0.5
4
+ version: 9.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charlie Savage
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-02 00:00:00.000000000 Z
11
+ date: 2017-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -88,7 +88,6 @@ extra_rdoc_files: []
88
88
  files:
89
89
  - History.rdoc
90
90
  - README.rdoc
91
- - README_DB2.rdoc
92
91
  - Rakefile
93
92
  - lib/composite_primary_keys.rb
94
93
  - lib/composite_primary_keys/arel/in.rb
@@ -1,33 +0,0 @@
1
- Composite Primary key support for db2
2
-
3
- == Driver Support
4
-
5
- DB2 support requires the IBM_DB driver provided by http://rubyforge.org/projects/rubyibm/
6
- project. Install using gem install ibm_db. Tested against version 0.60 of the driver.
7
- This rubyforge project appears to be permenant location for the IBM adapter.
8
- Older versions of the driver available from IBM Alphaworks will not work.
9
-
10
- == Driver Bug and workaround provided as part of this plugin
11
-
12
- Unlike the basic quote routine available for Rails AR, the DB2 adapter's quote
13
- method doesn't return " column_name = 1 " when string values (integers in string type variable)
14
- are passed for quoting numeric column. Rather it returns "column_name = '1'.
15
- DB2 doesn't accept single quoting numeric columns in SQL. Currently, as part of
16
- this plugin a fix is provided for the DB2 adapter since this plugin does
17
- pass string values like this. Perhaps a patch should be sent to the DB2 adapter
18
- project for a permanant fix.
19
-
20
- == Database Setup
21
-
22
- Database must be manually created using a separate command. Read the rake task
23
- for creating tables and change the db name, user and passwords accordingly.
24
-
25
- == Tested Database Server version
26
-
27
- This is tested against DB2 v9.1 in Ubuntu Feisty Fawn (7.04)
28
-
29
- == Tested Database Client version
30
-
31
- This is tested against DB2 v9.1 in Ubuntu Feisty Fawn (7.04)
32
-
33
-