fulfillment_order_test.rb 19 KB

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