fulfillment_order_test.rb 19 KB

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