Skip to content

Commit 4b2a723

Browse files
committed
Merge pull request #176 from cerebris/pr/175
Check for key on association.type should reference unformatted key. Plus Tests
2 parents cda530a + 3f1abc0 commit 4b2a723

File tree

5 files changed

+103
-2
lines changed

5 files changed

+103
-2
lines changed

lib/jsonapi/request.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ def parse_params(params, allowed_fields)
309309
if links_object.length == 0
310310
checked_has_many_associations[param] = []
311311
else
312-
if links_object.length > 1 || !links_object.has_key?(format_key(association.type))
312+
if links_object.length > 1 || !links_object.has_key?(unformat_key(association.type).to_s)
313313
raise JSONAPI::Exceptions::TypeMismatch.new(links_object[:type])
314314
end
315315

test/fixtures/active_record.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,15 @@
136136
t.timestamps null: false
137137
end
138138

139+
create_table :order_flags, force: true do |t|
140+
t.string :name
141+
end
142+
143+
create_table :purchase_orders_order_flags, force: true do |t|
144+
t.references :purchase_order, :order_flag, index: true
145+
end
146+
add_index :purchase_orders_order_flags, [:purchase_order_id, :order_flag_id], unique: true, name: "po_flags_idx"
147+
139148
create_table :line_items, force: true do |t|
140149
t.integer :purchase_order_id
141150
t.string :part_number
@@ -277,12 +286,22 @@ def remove(id)
277286
end
278287

279288
class CustomerOrder < ActiveRecord::Base
289+
has_many :purchase_orders
280290
end
281291

282292
class PurchaseOrder < ActiveRecord::Base
293+
belongs_to :customer
294+
has_many :line_items
295+
296+
has_and_belongs_to_many :order_flags, join_table: :purchase_orders_order_flags
297+
end
298+
299+
class OrderFlag < ActiveRecord::Base
300+
has_and_belongs_to_many :purchase_orders, join_table: :purchase_orders_order_flags
283301
end
284302

285303
class LineItem < ActiveRecord::Base
304+
belongs_to :purchase_order
286305
end
287306

288307
### PORO Data - don't do this in a production app
@@ -422,6 +441,9 @@ class PurchaseOrdersController < JSONAPI::ResourceController
422441

423442
class LineItemsController < JSONAPI::ResourceController
424443
end
444+
445+
class OrderFlagsController < JSONAPI::ResourceController
446+
end
425447
end
426448

427449
module V7
@@ -433,6 +455,9 @@ class PurchaseOrdersController < JSONAPI::ResourceController
433455

434456
class LineItemsController < JSONAPI::ResourceController
435457
end
458+
459+
class OrderFlagsController < JSONAPI::ResourceController
460+
end
436461
end
437462
end
438463

@@ -817,6 +842,13 @@ class PurchaseOrderResource < JSONAPI::Resource
817842

818843
has_one :customer
819844
has_many :line_items
845+
has_many :order_flags, acts_as_set: true
846+
end
847+
848+
class OrderFlagResource < JSONAPI::Resource
849+
attributes :name
850+
851+
has_many :purchase_orders
820852
end
821853

822854
class LineItemResource < JSONAPI::Resource
@@ -831,6 +863,7 @@ class LineItemResource < JSONAPI::Resource
831863
module V7
832864
CustomerResource = V6::CustomerResource.dup
833865
PurchaseOrderResource = V6::PurchaseOrderResource.dup
866+
OrderFlagResource = V6::OrderFlagResource.dup
834867
LineItemResource = V6::LineItemResource.dup
835868
end
836869
end

test/fixtures/line_items.yml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
11
po_1_li_1:
2+
id: 1
23
purchase_order_id: 1
34
part_number: 556324
45
quantity: 1
56
item_cost: 45.67
67

78
po_1_li_2:
9+
id: 2
810
purchase_order_id: 1
911
part_number: 79324231A
1012
quantity: 3
11-
item_cost: 19.99
13+
item_cost: 19.99
14+
15+
li_3:
16+
id: 3
17+
part_number: 79324231A
18+
quantity: 67
19+
item_cost: 19.99
20+
21+
li_4:
22+
id: 4
23+
part_number: 5678
24+
quantity: 2
25+
item_cost: 199.99

test/fixtures/order_flags.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
rush_order_flag:
2+
id: 1
3+
name: Rush
4+
5+
ship_together_order_flag:
6+
id: 2
7+
name: Ship Together

test/integration/requests/request_test.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,4 +564,51 @@ def test_patch_formatted_dasherized
564564
assert_equal 200, status
565565
end
566566

567+
def test_patch_formatted_dasherized_links
568+
JSONAPI.configuration.route_format = :dasherized_route
569+
JSONAPI.configuration.json_key_format = :dasherized_key
570+
patch '/api/v6/line-items/1',
571+
{
572+
'data' => {
573+
'id' => '1',
574+
'type' => 'line-items',
575+
'item-cost' => '23.57',
576+
'links' => {
577+
'purchase-order' => {
578+
'linkage' => {'type' => 'purchase-orders', 'id' => '2'}
579+
}
580+
}
581+
}
582+
}.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
583+
584+
assert_equal 200, status
585+
end
586+
587+
def test_patch_formatted_dasherized_replace_has_many
588+
JSONAPI.configuration.route_format = :dasherized_route
589+
JSONAPI.configuration.json_key_format = :dasherized_key
590+
patch '/api/v6/purchase-orders/2?include=line-items,order-flags',
591+
{
592+
'data' => {
593+
'id' => '2',
594+
'type' => 'purchase-orders',
595+
'links' => {
596+
'line-items' => {
597+
'linkage' => [
598+
{'type' => 'line-items', 'id' => '3'},
599+
{'type' => 'line-items', 'id' => '4'}
600+
]
601+
},
602+
'order-flags' => {
603+
'linkage' => [
604+
{'type' => 'order-flags', 'id' => '1'},
605+
{'type' => 'order-flags', 'id' => '2'}
606+
]
607+
}
608+
}
609+
}
610+
}.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
611+
612+
assert_equal 200, status
613+
end
567614
end

0 commit comments

Comments
 (0)