Skip to content

Commit 744ef60

Browse files
committed
Add save, update_tracking, and cancel actions to FulfillmentOrderFulfillment resource
1 parent 46935ea commit 744ef60

File tree

4 files changed

+172
-0
lines changed

4 files changed

+172
-0
lines changed

lib/shopify_api/resources/fulfillment.rb

+21
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,26 @@ def order_id
99
def cancel; load_attributes_from_response(post(:cancel, {}, only_id)); end
1010
def complete; load_attributes_from_response(post(:complete, {}, only_id)); end
1111
def open; load_attributes_from_response(post(:open, {}, only_id)); end
12+
13+
def self.create(attributes = {})
14+
fulfillmentV2 = FulfillmentV2.create(attributes)
15+
fulfillment = Fulfillment.new
16+
fulfillment.load(fulfillmentV2.attributes, false, true)
17+
fulfillment
18+
end
19+
20+
def save
21+
fulfillmentV2 = FulfillmentV2.new(attributes)
22+
result = fulfillmentV2.save
23+
load(fulfillmentV2.attributes, false, true)
24+
result
25+
end
26+
27+
def update_tracking(tracking_info:, notify_customer:)
28+
fulfillmentV2 = FulfillmentV2.new(attributes)
29+
result = fulfillmentV2.update_tracking(tracking_info: tracking_info, notify_customer: notify_customer)
30+
load(fulfillmentV2.attributes, false, true)
31+
result
32+
end
1233
end
1334
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module ShopifyAPI
2+
class FulfillmentV2 < Base
3+
self.element_name = 'fulfillment'
4+
5+
def update_tracking(tracking_info:, notify_customer:)
6+
body = {
7+
fulfillment: {
8+
tracking_info: tracking_info,
9+
notify_customer: notify_customer
10+
}
11+
}
12+
load_attributes_from_response(post(:update_tracking, {}, body.to_json))
13+
end
14+
end
15+
end

test/fulfillment_test.rb

+96
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,102 @@ def setup
5656
assert_equal 450789469, fulfillment.order_id
5757
end
5858
end
59+
60+
context "#create" do
61+
should "create a new fulfillment" do
62+
create_fulfillment_attributes = {
63+
message: "The message for this FO fulfillment",
64+
notify_customer: true,
65+
tracking_info: {
66+
number: "XSDFHYR23475",
67+
url: "https://tracking.example.com/XSDFHYR23475",
68+
company: "TFTC - the fulfillment/tracking company"
69+
},
70+
line_items_by_fulfillment_order: [
71+
{
72+
fulfillment_order_id: 3,
73+
fulfillment_order_line_items: [{ id: 2, quantity: 1 }]
74+
}
75+
]
76+
}
77+
request_body = { fulfillment: create_fulfillment_attributes }
78+
response_body = { fulfillment: create_fulfillment_attributes.merge(id: 346743624) }
79+
fake "fulfillments", :method => :post,
80+
request_body: ActiveSupport::JSON.encode(request_body),
81+
body: ActiveSupport::JSON.encode(response_body)
82+
83+
fulfillment = ShopifyAPI::Fulfillment.create(create_fulfillment_attributes)
84+
assert fulfillment.is_a?(ShopifyAPI::Fulfillment)
85+
assert fulfillment.persisted?
86+
assert_equal 346743624, fulfillment.id
87+
end
88+
end
89+
90+
context "#save" do
91+
should "save a new fulfillment" do
92+
create_fulfillment_attributes = {
93+
message: "The message for this FO fulfillment",
94+
notify_customer: true,
95+
tracking_info: {
96+
number: "XSDFHYR23475",
97+
url: "https://tracking.example.com/XSDFHYR23475",
98+
company: "TFTC - the fulfillment/tracking company"
99+
},
100+
line_items_by_fulfillment_order: [
101+
{
102+
fulfillment_order_id: 3,
103+
fulfillment_order_line_items: [{ id: 2, quantity: 1 }]
104+
}
105+
]
106+
}
107+
request_body = { fulfillment: create_fulfillment_attributes }
108+
response_body = { fulfillment: create_fulfillment_attributes.merge(id: 346743624) }
109+
fake "fulfillments", :method => :post,
110+
request_body: ActiveSupport::JSON.encode(request_body),
111+
body: ActiveSupport::JSON.encode(response_body)
112+
113+
fulfillment = ShopifyAPI::Fulfillment.new(create_fulfillment_attributes)
114+
assert fulfillment.save
115+
assert fulfillment.is_a?(ShopifyAPI::Fulfillment)
116+
assert fulfillment.persisted?
117+
assert_equal 346743624, fulfillment.id
118+
end
119+
end
120+
121+
context "#update_tracking" do
122+
should "be able to update tracking info for a fulfillment" do
123+
tracking_info = {
124+
number: 'JSDHFHAG',
125+
url: 'https://example.com/fulfillment_tracking/JSDHFHAG',
126+
company: 'ACME co',
127+
}
128+
fake_fulfillment = ActiveSupport::JSON.decode(load_fixture('fulfillment'))['fulfillment']
129+
fake_fulfillment['tracking_number'] = tracking_info[:number]
130+
fake_fulfillment['tracking_numbers'] = [tracking_info[:number]]
131+
fake_fulfillment['tracking_url'] = tracking_info[:url]
132+
fake_fulfillment['tracking_urls'] = [tracking_info[:url]]
133+
fake_fulfillment['tracking_company'] = tracking_info[:company]
134+
135+
request_body = {
136+
fulfillment: {
137+
tracking_info: tracking_info,
138+
notify_customer: true
139+
}
140+
}
141+
fake "fulfillments/#{fake_fulfillment['id']}/update_tracking", method: :post,
142+
request_body: ActiveSupport::JSON.encode(request_body),
143+
body: ActiveSupport::JSON.encode(fulfillment: fake_fulfillment)
144+
145+
fulfillment = ShopifyAPI::Fulfillment.new(id: fake_fulfillment['id'])
146+
assert fulfillment.update_tracking(tracking_info: tracking_info, notify_customer: true)
147+
148+
assert_equal tracking_info[:number], fulfillment.tracking_number
149+
assert_equal [tracking_info[:number]], fulfillment.tracking_numbers
150+
assert_equal tracking_info[:url], fulfillment.tracking_url
151+
assert_equal [tracking_info[:url]], fulfillment.tracking_urls
152+
assert_equal tracking_info[:company], fulfillment.tracking_company
153+
end
154+
end
59155
end
60156

61157
end

test/fulfillment_v2_test.rb

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
require 'test_helper'
2+
3+
class FulfillmentV2Test < Test::Unit::TestCase
4+
context "FulfillmentV2" do
5+
context "#update_tracking" do
6+
should "be able to update tracking info for a fulfillment" do
7+
tracking_info = {
8+
number: 'JSDHFHAG',
9+
url: 'https://example.com/fulfillment_tracking/JSDHFHAG',
10+
company: 'ACME co',
11+
}
12+
fake_fulfillment = ActiveSupport::JSON.decode(load_fixture('fulfillment'))['fulfillment']
13+
fake_fulfillment['tracking_number'] = tracking_info[:number]
14+
fake_fulfillment['tracking_numbers'] = [tracking_info[:number]]
15+
fake_fulfillment['tracking_url'] = tracking_info[:url]
16+
fake_fulfillment['tracking_urls'] = [tracking_info[:url]]
17+
fake_fulfillment['tracking_company'] = tracking_info[:company]
18+
19+
request_body = {
20+
fulfillment: {
21+
tracking_info: tracking_info,
22+
notify_customer: true
23+
}
24+
}
25+
fake "fulfillments/#{fake_fulfillment['id']}/update_tracking", method: :post,
26+
request_body: ActiveSupport::JSON.encode(request_body),
27+
body: ActiveSupport::JSON.encode(fulfillment: fake_fulfillment)
28+
29+
fulfillment = ShopifyAPI::FulfillmentV2.new(id: fake_fulfillment['id'])
30+
assert fulfillment.update_tracking(tracking_info: tracking_info, notify_customer: true)
31+
32+
assert_equal tracking_info[:number], fulfillment.tracking_number
33+
assert_equal [tracking_info[:number]], fulfillment.tracking_numbers
34+
assert_equal tracking_info[:url], fulfillment.tracking_url
35+
assert_equal [tracking_info[:url]], fulfillment.tracking_urls
36+
assert_equal tracking_info[:company], fulfillment.tracking_company
37+
end
38+
end
39+
end
40+
end

0 commit comments

Comments
 (0)