fulfillment_order_test.rb 16 KB

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