Skip to content

Commit c5e8b3b

Browse files
committed
Add actions fulfillment_request, accept_fulfillment_request, reject_fulfillment_request, cancellation_request, accept_cancellation, reject_cancellation to FulfillmentOrder resource
1 parent 563d01d commit c5e8b3b

File tree

2 files changed

+286
-0
lines changed

2 files changed

+286
-0
lines changed

lib/shopify_api/resources/fulfillment_order.rb

+57
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,63 @@ def close(message: nil)
4343
load_attributes_from_response(post(:close, {}, body.to_json))
4444
end
4545

46+
def request_fulfillment(fulfillment_order_line_items: nil, message: nil)
47+
body = {
48+
fulfillment_request: {
49+
fulfillment_order_line_items: fulfillment_order_line_items,
50+
message: message
51+
}
52+
}
53+
keyed_fulfillment_orders = keyed_fulfillment_orders_from_response(post(:fulfillment_request, {}, body.to_json))
54+
load_keyed_fulfillment_order(keyed_fulfillment_orders, 'original_fulfillment_order')
55+
keyed_fulfillment_orders
56+
end
57+
58+
def accept_fulfillment_request(message: nil)
59+
body = {
60+
fulfillment_request: {
61+
message: message
62+
}
63+
}
64+
load_attributes_from_response(post('fulfillment_request/accept', {}, body.to_json))
65+
end
66+
67+
def reject_fulfillment_request(message: nil)
68+
body = {
69+
fulfillment_request: {
70+
message: message
71+
}
72+
}
73+
load_attributes_from_response(post('fulfillment_request/reject', {}, body.to_json))
74+
end
75+
76+
def request_cancellation(message: nil)
77+
body = {
78+
cancellation_request: {
79+
message: message
80+
}
81+
}
82+
load_attributes_from_response(post(:cancellation_request, {}, body.to_json))
83+
end
84+
85+
def accept_cancellation_request(message: nil)
86+
body = {
87+
cancellation_request: {
88+
message: message
89+
}
90+
}
91+
load_attributes_from_response(post('cancellation_request/accept', {}, body.to_json))
92+
end
93+
94+
def reject_cancellation_request(message: nil)
95+
body = {
96+
cancellation_request: {
97+
message: message
98+
}
99+
}
100+
load_attributes_from_response(post('cancellation_request/reject', {}, body.to_json))
101+
end
102+
46103
private
47104

48105
def load_keyed_fulfillment_order(keyed_fulfillment_orders, key)

test/fulfillment_order_test.rb

+229
Original file line numberDiff line numberDiff line change
@@ -142,5 +142,234 @@ def setup
142142
assert_equal 'closed', fulfillment_order.status
143143
end
144144
end
145+
146+
context "#request_fulfillment" do
147+
should "make a fulfillment request for a fulfillment order including unsubmitted" do
148+
fake_original_fulfillment_order = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
149+
fake_original_fulfillment_order['status'] = 'closed'
150+
fake_submitted_fulfillment_order = fake_original_fulfillment_order.clone
151+
fake_submitted_fulfillment_order['id'] = 2
152+
fake_submitted_fulfillment_order['status'] = 'open'
153+
fake_submitted_fulfillment_order['request_status'] = 'submitted'
154+
fake_unsubmitted_fulfillment_order = fake_original_fulfillment_order.clone
155+
fake_unsubmitted_fulfillment_order['id'] = 3
156+
fake_unsubmitted_fulfillment_order['status'] = 'open'
157+
fake_unsubmitted_fulfillment_order['request_status'] = 'unsubmitted'
158+
body = {
159+
original_fulfillment_order: fake_original_fulfillment_order,
160+
submitted_fulfillment_order: fake_submitted_fulfillment_order,
161+
unsubmitted_fulfillment_order: fake_unsubmitted_fulfillment_order
162+
}
163+
request_body = {
164+
fulfillment_request: {
165+
fulfillment_order_line_items: [
166+
{ id: 1, quantity: 1 }
167+
],
168+
message: 'Fulfill this FO, please.'
169+
}
170+
}
171+
fake "fulfillment_orders/519788021/fulfillment_request", :method => :post,
172+
:request_body => ActiveSupport::JSON.encode(request_body),
173+
:body => ActiveSupport::JSON.encode(body)
174+
175+
fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
176+
params = {
177+
fulfillment_order_line_items: [{ id: 1, quantity: 1 }],
178+
message: "Fulfill this FO, please."
179+
}
180+
response_fulfillment_orders = fulfillment_order.request_fulfillment(params)
181+
182+
assert_equal 'closed', fulfillment_order.status
183+
assert_equal 3, response_fulfillment_orders.size
184+
185+
original_fulfillment_order = response_fulfillment_orders['original_fulfillment_order']
186+
assert_equal 519788021, original_fulfillment_order.id
187+
assert_equal 'closed', original_fulfillment_order.status
188+
189+
submitted_fulfillment_order = response_fulfillment_orders['submitted_fulfillment_order']
190+
assert_equal 2, submitted_fulfillment_order.id
191+
assert_equal 'open', submitted_fulfillment_order.status
192+
assert_equal 'submitted', submitted_fulfillment_order.request_status
193+
194+
unsubmitted_fulfillment_order = response_fulfillment_orders['unsubmitted_fulfillment_order']
195+
assert_equal 3, unsubmitted_fulfillment_order.id
196+
assert_equal 'open', unsubmitted_fulfillment_order.status
197+
assert_equal 'unsubmitted', unsubmitted_fulfillment_order.request_status
198+
end
199+
200+
should "make a fulfillment request for a fulfillment order excluding unsubmitted" do
201+
fake_original_fulfillment_order = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
202+
fake_original_fulfillment_order['status'] = 'closed'
203+
fake_submitted_fulfillment_order = fake_original_fulfillment_order.clone
204+
fake_submitted_fulfillment_order['id'] = 2
205+
fake_submitted_fulfillment_order['status'] = 'open'
206+
fake_submitted_fulfillment_order['request_status'] = 'submitted'
207+
body = {
208+
original_fulfillment_order: fake_original_fulfillment_order,
209+
submitted_fulfillment_order: fake_submitted_fulfillment_order,
210+
unsubmitted_fulfillment_order: nil,
211+
}
212+
request_body = {
213+
fulfillment_request: {
214+
fulfillment_order_line_items: [
215+
{ id: 1, quantity: 1 }
216+
],
217+
message: 'Fulfill this FO, please.'
218+
}
219+
}
220+
fake "fulfillment_orders/519788021/fulfillment_request", :method => :post,
221+
:request_body => ActiveSupport::JSON.encode(request_body),
222+
:body => ActiveSupport::JSON.encode(body)
223+
224+
fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
225+
params = {
226+
fulfillment_order_line_items: [{ id: 1, quantity: 1 }],
227+
message: "Fulfill this FO, please."
228+
}
229+
response_fulfillment_orders = fulfillment_order.request_fulfillment(params)
230+
231+
assert_equal 'closed', fulfillment_order.status
232+
assert_equal 3, response_fulfillment_orders.size
233+
234+
original_fulfillment_order = response_fulfillment_orders['original_fulfillment_order']
235+
assert_equal 519788021, original_fulfillment_order.id
236+
assert_equal 'closed', original_fulfillment_order.status
237+
238+
submitted_fulfillment_order = response_fulfillment_orders['submitted_fulfillment_order']
239+
assert_equal 2, submitted_fulfillment_order.id
240+
assert_equal 'open', submitted_fulfillment_order.status
241+
assert_equal 'submitted', submitted_fulfillment_order.request_status
242+
243+
assert_nil response_fulfillment_orders['unsubmitted_fulfillment_order']
244+
end
245+
end
246+
247+
context "#accept_fulfillment_request" do
248+
should "accept a fulfillment request for a fulfillment order" do
249+
fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
250+
251+
message = "LGTM. Accept this FO fulfillment request"
252+
request_body = {
253+
'fulfillment_request' => {
254+
'message' => message
255+
}
256+
}
257+
fake_response = {
258+
fulfillment_order: fulfillment_order.attributes.merge(status: 'in_progress', request_status: 'accepted')
259+
}
260+
fake "fulfillment_orders/519788021/fulfillment_request/accept", :method => :post,
261+
:request_body => ActiveSupport::JSON.encode(request_body),
262+
:body => ActiveSupport::JSON.encode(fake_response)
263+
264+
accepted = fulfillment_order.accept_fulfillment_request(message: message)
265+
266+
assert_equal true, accepted
267+
assert_equal 'in_progress', fulfillment_order.status
268+
assert_equal 'accepted', fulfillment_order.request_status
269+
end
270+
end
271+
272+
context "#reject_fulfillment_request" do
273+
should "reject a fulfillment request for a fulfillment order" do
274+
fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
275+
276+
message = "LBTM. Reject this FO fulfillment request"
277+
request_body = {
278+
'fulfillment_request' => {
279+
'message' => message
280+
}
281+
}
282+
fake_response = {
283+
fulfillment_order: fulfillment_order.attributes.merge(status: 'open', request_status: 'rejected')
284+
}
285+
fake "fulfillment_orders/519788021/fulfillment_request/reject", :method => :post,
286+
:request_body => ActiveSupport::JSON.encode(request_body),
287+
:body => ActiveSupport::JSON.encode(fake_response)
288+
289+
rejected = fulfillment_order.reject_fulfillment_request(message: message)
290+
291+
assert_equal true, rejected
292+
assert_equal 'open', fulfillment_order.status
293+
assert_equal 'rejected', fulfillment_order.request_status
294+
end
295+
end
296+
297+
context "#request_cancellation" do
298+
should "make a cancellation request for a fulfillment order" do
299+
fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
300+
301+
message = "Cancelling this please."
302+
request_body = {
303+
'cancellation_request' => {
304+
'message' => message
305+
}
306+
}
307+
cancelling = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
308+
cancelling['status'] = 'in_progress'
309+
cancelling['request_status'] = 'cancellation_requested'
310+
fake "fulfillment_orders/519788021/cancellation_request", :method => :post,
311+
:request_body => ActiveSupport::JSON.encode(request_body),
312+
:body => ActiveSupport::JSON.encode({ fulfillment_order: cancelling })
313+
314+
cancelled = fulfillment_order.request_cancellation(message: "Cancelling this please.")
315+
316+
assert_equal true, cancelled
317+
assert_equal 'in_progress', fulfillment_order.status
318+
assert_equal 'cancellation_requested', fulfillment_order.request_status
319+
end
320+
end
321+
322+
context "#accept_cancellation_request" do
323+
should "accept a cancellation request for a fulfillment order" do
324+
fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
325+
326+
message = 'Already in-progress. Reject this FO cancellation request'
327+
request_body = {
328+
'cancellation_request' => {
329+
'message' => message
330+
}
331+
}
332+
fake_response = {
333+
fulfillment_order: fulfillment_order.attributes.merge(status: 'cancelled',
334+
request_status: 'cancellation_accepted')
335+
}
336+
fake "fulfillment_orders/519788021/cancellation_request/accept", :method => :post,
337+
:request_body => ActiveSupport::JSON.encode(request_body),
338+
:body => ActiveSupport::JSON.encode(fake_response)
339+
340+
accepted = fulfillment_order.accept_cancellation_request(message: message)
341+
342+
assert_equal true, accepted
343+
assert_equal 'cancelled', fulfillment_order.status
344+
assert_equal 'cancellation_accepted', fulfillment_order.request_status
345+
end
346+
end
347+
348+
context "#reject_cancellation_request" do
349+
should "reject a cancellation request for a fulfillment order" do
350+
fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
351+
352+
message = "Already in-progress. Reject this FO cancellation request"
353+
request_body = {
354+
'cancellation_request' => {
355+
'message' => message
356+
}
357+
}
358+
fake_response = {
359+
fulfillment_order: fulfillment_order.attributes.merge(status: 'in_progress',
360+
request_status: 'cancellation_rejected')
361+
}
362+
fake "fulfillment_orders/519788021/cancellation_request/reject", :method => :post,
363+
:request_body => request_body,
364+
:body => ActiveSupport::JSON.encode(fake_response)
365+
366+
rejected = fulfillment_order.reject_cancellation_request(message: message)
367+
368+
assert_equal true, rejected
369+
assert_equal 'in_progress', fulfillment_order.status
370+
assert_equal 'cancellation_rejected', fulfillment_order.request_status
371+
end
372+
end
373+
145374
end
146375
end

0 commit comments

Comments
 (0)