fulfillment_order_test.rb 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. require 'test_helper'
  2. class FulFillmentOrderTest < Test::Unit::TestCase
  3. def setup
  4. super
  5. fake "fulfillment_orders/519788021", method: :get,
  6. body: load_fixture('fulfillment_order')
  7. fake "orders/450789469/fulfillment_orders", method: :get,
  8. body: load_fixture('fulfillment_orders')
  9. end
  10. context "FulfillmentOrder" do
  11. context "#find" do
  12. should "be able to find fulfillment order" do
  13. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  14. assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder)
  15. assert_equal 519788021, fulfillment_order.id
  16. assert_equal 450789469, fulfillment_order.order_id
  17. end
  18. end
  19. context "#all" do
  20. should "be able to list fulfillment orders for an order" do
  21. fake 'orders/450789469/fulfillment_orders', method: :get, body: load_fixture('fulfillment_orders')
  22. fulfillment_orders = ShopifyAPI::FulfillmentOrder.all(
  23. params: { order_id: 450789469 }
  24. )
  25. assert_equal [519788021, 519788022], fulfillment_orders.map(&:id).sort
  26. fulfillment_orders.each do |fulfillment_order|
  27. assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder)
  28. assert_equal 450789469, fulfillment_order.order_id
  29. end
  30. end
  31. should "require order_id" do
  32. assert_raises ShopifyAPI::ValidationException do
  33. ShopifyAPI::FulfillmentOrder.all
  34. end
  35. end
  36. end
  37. context "#fulfillments" do
  38. should "be able to list fulfillments for a fulfillment order" do
  39. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  40. fake "fulfillment_orders/#{fulfillment_order.id}/fulfillments", method: :get,
  41. body: load_fixture('fulfillments')
  42. fulfillments = fulfillment_order.fulfillments
  43. assert_equal 1, fulfillments.count
  44. fulfillment = fulfillments.first
  45. assert fulfillment.is_a?(ShopifyAPI::Fulfillment)
  46. assert_equal 450789469, fulfillment.order_id
  47. end
  48. end
  49. context "#move" do
  50. should "move a fulfillment order to a new_location_id" do
  51. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  52. new_location_id = 5
  53. fake_original_fulfillment_order = fulfillment_order.clone
  54. fake_original_fulfillment_order.status = 'closed'
  55. fake_moved_fulfillment_order = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
  56. fake_moved_fulfillment_order['assigned_location_id'] = new_location_id
  57. request_body = { fulfillment_order: { new_location_id: 5 } }
  58. body = {
  59. original_fulfillment_order: fake_original_fulfillment_order,
  60. moved_fulfillment_order: fake_moved_fulfillment_order,
  61. remaining_fulfillment_order: nil,
  62. }
  63. fake "fulfillment_orders/519788021/move", :method => :post,
  64. :request_body => ActiveSupport::JSON.encode(request_body),
  65. :body => ActiveSupport::JSON.encode(body)
  66. response_fulfillment_orders = fulfillment_order.move(new_location_id: new_location_id)
  67. assert_equal 'closed', fulfillment_order.status
  68. assert_equal 3, response_fulfillment_orders.count
  69. original_fulfillment_order = response_fulfillment_orders['original_fulfillment_order']
  70. refute_nil original_fulfillment_order
  71. assert original_fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder)
  72. assert_equal 'closed', original_fulfillment_order.status
  73. moved_fulfillment_order = response_fulfillment_orders['moved_fulfillment_order']
  74. refute_nil moved_fulfillment_order
  75. assert moved_fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder)
  76. assert_equal 'open', moved_fulfillment_order.status
  77. assert_equal new_location_id, moved_fulfillment_order.assigned_location_id
  78. remaining_fulfillment_order = response_fulfillment_orders['remaining_fulfillment_order']
  79. assert_nil remaining_fulfillment_order
  80. end
  81. end
  82. context "#cancel" do
  83. should "cancel a fulfillment order" do
  84. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  85. assert_equal 'open', fulfillment_order.status
  86. cancelled = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
  87. cancelled['status'] = 'cancelled'
  88. body = {
  89. fulfillment_order: cancelled,
  90. replacement_fulfillment_order: fulfillment_order,
  91. }
  92. fake "fulfillment_orders/519788021/cancel", :method => :post, :body => ActiveSupport::JSON.encode(body)
  93. response_fulfillment_orders = fulfillment_order.cancel
  94. assert_equal 'cancelled', fulfillment_order.status
  95. assert_equal 2, response_fulfillment_orders.count
  96. fulfillment_order = response_fulfillment_orders['fulfillment_order']
  97. assert_equal 'cancelled', fulfillment_order.status
  98. replacement_fulfillment_order = response_fulfillment_orders['replacement_fulfillment_order']
  99. assert_equal 'open', replacement_fulfillment_order.status
  100. end
  101. end
  102. context "#close" do
  103. should "be able to close fulfillment order" do
  104. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  105. fulfillment_order.status = 'in_progress'
  106. closed = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
  107. closed['status'] = 'incomplete'
  108. request_body = {
  109. fulfillment_order: {
  110. message: "Test close message."
  111. }
  112. }
  113. fake "fulfillment_orders/519788021/close", :method => :post,
  114. :request_body => ActiveSupport::JSON.encode(request_body),
  115. :body => ActiveSupport::JSON.encode(closed)
  116. assert fulfillment_order.close(message: "Test close message.")
  117. assert_equal 'incomplete', fulfillment_order.status
  118. end
  119. end
  120. context "#request_fulfillment" do
  121. should "make a fulfillment request for a fulfillment order including unsubmitted" do
  122. fake_original_fulfillment_order = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
  123. fake_original_fulfillment_order['status'] = 'closed'
  124. fake_submitted_fulfillment_order = fake_original_fulfillment_order.clone
  125. fake_submitted_fulfillment_order['id'] = 2
  126. fake_submitted_fulfillment_order['status'] = 'open'
  127. fake_submitted_fulfillment_order['request_status'] = 'submitted'
  128. fake_unsubmitted_fulfillment_order = fake_original_fulfillment_order.clone
  129. fake_unsubmitted_fulfillment_order['id'] = 3
  130. fake_unsubmitted_fulfillment_order['status'] = 'open'
  131. fake_unsubmitted_fulfillment_order['request_status'] = 'unsubmitted'
  132. body = {
  133. original_fulfillment_order: fake_original_fulfillment_order,
  134. submitted_fulfillment_order: fake_submitted_fulfillment_order,
  135. unsubmitted_fulfillment_order: fake_unsubmitted_fulfillment_order
  136. }
  137. request_body = {
  138. fulfillment_request: {
  139. fulfillment_order_line_items: [
  140. { id: 1, quantity: 1 }
  141. ],
  142. message: 'Fulfill this FO, please.'
  143. }
  144. }
  145. fake "fulfillment_orders/519788021/fulfillment_request", :method => :post,
  146. :request_body => ActiveSupport::JSON.encode(request_body),
  147. :body => ActiveSupport::JSON.encode(body)
  148. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  149. params = {
  150. fulfillment_order_line_items: [{ id: 1, quantity: 1 }],
  151. message: "Fulfill this FO, please."
  152. }
  153. response_fulfillment_orders = fulfillment_order.request_fulfillment(params)
  154. assert_equal 'closed', fulfillment_order.status
  155. assert_equal 3, response_fulfillment_orders.size
  156. original_fulfillment_order = response_fulfillment_orders['original_fulfillment_order']
  157. assert_equal 519788021, original_fulfillment_order.id
  158. assert_equal 'closed', original_fulfillment_order.status
  159. submitted_fulfillment_order = response_fulfillment_orders['submitted_fulfillment_order']
  160. assert_equal 2, submitted_fulfillment_order.id
  161. assert_equal 'open', submitted_fulfillment_order.status
  162. assert_equal 'submitted', submitted_fulfillment_order.request_status
  163. unsubmitted_fulfillment_order = response_fulfillment_orders['unsubmitted_fulfillment_order']
  164. assert_equal 3, unsubmitted_fulfillment_order.id
  165. assert_equal 'open', unsubmitted_fulfillment_order.status
  166. assert_equal 'unsubmitted', unsubmitted_fulfillment_order.request_status
  167. end
  168. should "make a fulfillment request for a fulfillment order excluding unsubmitted" do
  169. fake_original_fulfillment_order = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
  170. fake_original_fulfillment_order['status'] = 'closed'
  171. fake_submitted_fulfillment_order = fake_original_fulfillment_order.clone
  172. fake_submitted_fulfillment_order['id'] = 2
  173. fake_submitted_fulfillment_order['status'] = 'open'
  174. fake_submitted_fulfillment_order['request_status'] = 'submitted'
  175. body = {
  176. original_fulfillment_order: fake_original_fulfillment_order,
  177. submitted_fulfillment_order: fake_submitted_fulfillment_order,
  178. unsubmitted_fulfillment_order: nil,
  179. }
  180. request_body = {
  181. fulfillment_request: {
  182. fulfillment_order_line_items: [
  183. { id: 1, quantity: 1 }
  184. ],
  185. message: 'Fulfill this FO, please.'
  186. }
  187. }
  188. fake "fulfillment_orders/519788021/fulfillment_request", :method => :post,
  189. :request_body => ActiveSupport::JSON.encode(request_body),
  190. :body => ActiveSupport::JSON.encode(body)
  191. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  192. params = {
  193. fulfillment_order_line_items: [{ id: 1, quantity: 1 }],
  194. message: "Fulfill this FO, please."
  195. }
  196. response_fulfillment_orders = fulfillment_order.request_fulfillment(params)
  197. assert_equal 'closed', fulfillment_order.status
  198. assert_equal 3, response_fulfillment_orders.size
  199. original_fulfillment_order = response_fulfillment_orders['original_fulfillment_order']
  200. assert_equal 519788021, original_fulfillment_order.id
  201. assert_equal 'closed', original_fulfillment_order.status
  202. submitted_fulfillment_order = response_fulfillment_orders['submitted_fulfillment_order']
  203. assert_equal 2, submitted_fulfillment_order.id
  204. assert_equal 'open', submitted_fulfillment_order.status
  205. assert_equal 'submitted', submitted_fulfillment_order.request_status
  206. assert_nil response_fulfillment_orders['unsubmitted_fulfillment_order']
  207. end
  208. end
  209. context "#accept_fulfillment_request" do
  210. should "accept a fulfillment request for a fulfillment order" do
  211. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  212. message = "LGTM. Accept this FO fulfillment request"
  213. request_body = {
  214. 'fulfillment_request' => {
  215. 'message' => message
  216. }
  217. }
  218. fake_response = {
  219. fulfillment_order: fulfillment_order.attributes.merge(status: 'in_progress', request_status: 'accepted')
  220. }
  221. fake "fulfillment_orders/519788021/fulfillment_request/accept", :method => :post,
  222. :request_body => ActiveSupport::JSON.encode(request_body),
  223. :body => ActiveSupport::JSON.encode(fake_response)
  224. accepted = fulfillment_order.accept_fulfillment_request(message: message)
  225. assert_equal true, accepted
  226. assert_equal 'in_progress', fulfillment_order.status
  227. assert_equal 'accepted', fulfillment_order.request_status
  228. end
  229. end
  230. context "#reject_fulfillment_request" do
  231. should "reject a fulfillment request for a fulfillment order" do
  232. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  233. message = "LBTM. Reject this FO fulfillment request"
  234. request_body = {
  235. 'fulfillment_request' => {
  236. 'message' => message
  237. }
  238. }
  239. fake_response = {
  240. fulfillment_order: fulfillment_order.attributes.merge(status: 'open', request_status: 'rejected')
  241. }
  242. fake "fulfillment_orders/519788021/fulfillment_request/reject", :method => :post,
  243. :request_body => ActiveSupport::JSON.encode(request_body),
  244. :body => ActiveSupport::JSON.encode(fake_response)
  245. rejected = fulfillment_order.reject_fulfillment_request(message: message)
  246. assert_equal true, rejected
  247. assert_equal 'open', fulfillment_order.status
  248. assert_equal 'rejected', fulfillment_order.request_status
  249. end
  250. end
  251. context "#request_cancellation" do
  252. should "make a cancellation request for a fulfillment order" do
  253. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  254. message = "Cancelling this please."
  255. request_body = {
  256. 'cancellation_request' => {
  257. 'message' => message
  258. }
  259. }
  260. cancelling = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
  261. cancelling['status'] = 'in_progress'
  262. cancelling['request_status'] = 'cancellation_requested'
  263. fake "fulfillment_orders/519788021/cancellation_request", :method => :post,
  264. :request_body => ActiveSupport::JSON.encode(request_body),
  265. :body => ActiveSupport::JSON.encode({ fulfillment_order: cancelling })
  266. cancelled = fulfillment_order.request_cancellation(message: "Cancelling this please.")
  267. assert_equal true, cancelled
  268. assert_equal 'in_progress', fulfillment_order.status
  269. assert_equal 'cancellation_requested', fulfillment_order.request_status
  270. end
  271. end
  272. context "#accept_cancellation_request" do
  273. should "accept a cancellation request for a fulfillment order" do
  274. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  275. message = 'Already in-progress. Reject this FO cancellation request'
  276. request_body = {
  277. 'cancellation_request' => {
  278. 'message' => message
  279. }
  280. }
  281. fake_response = {
  282. fulfillment_order: fulfillment_order.attributes.merge(status: 'cancelled',
  283. request_status: 'cancellation_accepted')
  284. }
  285. fake "fulfillment_orders/519788021/cancellation_request/accept", :method => :post,
  286. :request_body => ActiveSupport::JSON.encode(request_body),
  287. :body => ActiveSupport::JSON.encode(fake_response)
  288. accepted = fulfillment_order.accept_cancellation_request(message: message)
  289. assert_equal true, accepted
  290. assert_equal 'cancelled', fulfillment_order.status
  291. assert_equal 'cancellation_accepted', fulfillment_order.request_status
  292. end
  293. end
  294. context "#reject_cancellation_request" do
  295. should "reject a cancellation request for a fulfillment order" do
  296. fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
  297. message = "Already in-progress. Reject this FO cancellation request"
  298. request_body = {
  299. 'cancellation_request' => {
  300. 'message' => message
  301. }
  302. }
  303. fake_response = {
  304. fulfillment_order: fulfillment_order.attributes.merge(status: 'in_progress',
  305. request_status: 'cancellation_rejected')
  306. }
  307. fake "fulfillment_orders/519788021/cancellation_request/reject", :method => :post,
  308. :request_body => request_body,
  309. :body => ActiveSupport::JSON.encode(fake_response)
  310. rejected = fulfillment_order.reject_cancellation_request(message: message)
  311. assert_equal true, rejected
  312. assert_equal 'in_progress', fulfillment_order.status
  313. assert_equal 'cancellation_rejected', fulfillment_order.request_status
  314. end
  315. end
  316. end
  317. end