From b0350cb1511bbfd809a1be938bf1cc963d19ccf1 Mon Sep 17 00:00:00 2001 From: Keith Kim Date: Wed, 6 Nov 2019 16:49:40 -0500 Subject: [PATCH] Add fulfillment order related GET requests: - orders/:order_id/fulfillment_orders - assigned_fulfillment_orders - fulfillment_orders/:fulfillment_order_id - fulfillment_orders/:fulfillment_order_id/fulfillments Read FulfillmentOrder for an Order or with just an order_id --- .../resources/assigned_fulfillment_order.rb | 8 ++ .../resources/fulfillment_order.rb | 16 ++++ lib/shopify_api/resources/order.rb | 5 ++ test/assigned_fulfillment_order_test.rb | 41 ++++++++++ .../fixtures/assigned_fulfillment_orders.json | 78 +++++++++++++++++++ test/fixtures/fulfillment_order.json | 38 +++++++++ test/fixtures/fulfillment_orders.json | 78 +++++++++++++++++++ test/fixtures/fulfillments.json | 53 +++++++++++++ test/fulfillment_order_test.rb | 58 ++++++++++++++ test/order_test.rb | 14 ++++ 10 files changed, 389 insertions(+) create mode 100644 lib/shopify_api/resources/assigned_fulfillment_order.rb create mode 100644 lib/shopify_api/resources/fulfillment_order.rb create mode 100644 test/assigned_fulfillment_order_test.rb create mode 100644 test/fixtures/assigned_fulfillment_orders.json create mode 100644 test/fixtures/fulfillment_order.json create mode 100644 test/fixtures/fulfillment_orders.json create mode 100644 test/fixtures/fulfillments.json create mode 100644 test/fulfillment_order_test.rb diff --git a/lib/shopify_api/resources/assigned_fulfillment_order.rb b/lib/shopify_api/resources/assigned_fulfillment_order.rb new file mode 100644 index 000000000..803ab653d --- /dev/null +++ b/lib/shopify_api/resources/assigned_fulfillment_order.rb @@ -0,0 +1,8 @@ +module ShopifyAPI + class AssignedFulfillmentOrder < Base + def self.all(options = {}) + assigned_fulfillment_orders = super(options) + assigned_fulfillment_orders.map { |afo| FulfillmentOrder.new(afo.attributes) } + end + end +end diff --git a/lib/shopify_api/resources/fulfillment_order.rb b/lib/shopify_api/resources/fulfillment_order.rb new file mode 100644 index 000000000..2a20c6dc4 --- /dev/null +++ b/lib/shopify_api/resources/fulfillment_order.rb @@ -0,0 +1,16 @@ +module ShopifyAPI + class FulfillmentOrder < Base + def self.all(options = {}) + order_id = options.dig(:params, :order_id) + raise ShopifyAPI::ValidationException, "'order_id' is required" if order_id.nil? || order_id == '' + + order = ::ShopifyAPI::Order.new(id: order_id) + order.fulfillment_orders + end + + def fulfillments(options = {}) + fulfillment_hashes = get(:fulfillments, options) + fulfillment_hashes.map { |fulfillment_hash| Fulfillment.new(fulfillment_hash) } + end + end +end diff --git a/lib/shopify_api/resources/order.rb b/lib/shopify_api/resources/order.rb index 2d980e06b..56a38395a 100644 --- a/lib/shopify_api/resources/order.rb +++ b/lib/shopify_api/resources/order.rb @@ -30,6 +30,11 @@ def capture(amount = "", currency: nil) Transaction.create(capture_transaction) end + def fulfillment_orders(options = {}) + fulfillment_order_hashes = get(:fulfillment_orders, options) + fulfillment_order_hashes.map { |fulfillment_order_hash| FulfillmentOrder.new(fulfillment_order_hash) } + end + class ClientDetails < Base end end diff --git a/test/assigned_fulfillment_order_test.rb b/test/assigned_fulfillment_order_test.rb new file mode 100644 index 000000000..c28b96147 --- /dev/null +++ b/test/assigned_fulfillment_order_test.rb @@ -0,0 +1,41 @@ +require 'test_helper' + +class AssignedFulFillmentOrderTest < Test::Unit::TestCase + context "AssignedFulfillmentOrder" do + context "#all" do + should "list assigned fulfillment orders by assigned_status" do + fulfillment_order_fixture = load_fixture('assigned_fulfillment_orders') + fake 'assigned_fulfillment_orders.json?assigned_status=cancellation_requested', method: :get, + body: fulfillment_order_fixture, extension: false + + assigned_fulfillment_orders = ShopifyAPI::AssignedFulfillmentOrder.all( + params: { assigned_status: 'cancellation_requested' } + ) + + assert_equal 2, assigned_fulfillment_orders.count + assigned_fulfillment_orders.each do |fulfillment_order| + assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder) + assert_equal 'in_progress', fulfillment_order.status + assert_equal 'cancellation_accepted', fulfillment_order.request_status + end + end + + should "be able to list assigned fulfillment orders by location_ids" do + fulfillment_order_fixture = load_fixture('assigned_fulfillment_orders') + assigned_location_id = 905684977 + fake "assigned_fulfillment_orders.json?location_ids%5B%5D=#{assigned_location_id}", method: :get, + body: fulfillment_order_fixture, extension: false + + assigned_fulfillment_orders = ShopifyAPI::AssignedFulfillmentOrder.all( + params: { location_ids: [assigned_location_id] } + ) + + assert_equal 2, assigned_fulfillment_orders.count + assigned_fulfillment_orders.each do |fulfillment_order| + assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder) + assert_equal assigned_location_id, fulfillment_order.assigned_location_id + end + end + end + end +end diff --git a/test/fixtures/assigned_fulfillment_orders.json b/test/fixtures/assigned_fulfillment_orders.json new file mode 100644 index 000000000..0d405e2dc --- /dev/null +++ b/test/fixtures/assigned_fulfillment_orders.json @@ -0,0 +1,78 @@ +[ + { + "id": 519788021, + "order_id": 450789469, + "fulfillment_service_handle": "shipwire", + "status": "in_progress", + "requires_shipping": true, + "is_not_deleted": true, + "deleted_at": null, + "created_at": "2016-07-12T11:23:42-04:00", + "updated_at": "2016-07-12T11:23:42-04:00", + "happened_at": "2016-07-12T11:23:42-04:00", + "assigned_location_id": 905684977, + "request_status": "cancellation_accepted", + "delivery_category": null, + "fulfillment_order_line_items": [ + { + "id": 519788021, + "shop_id": 690933842, + "fulfillment_order_id": 519788021, + "line_item_id": 466157049, + "variant_id": 43729076, + "inventory_item_id": 808950810, + "inventory_commitment_id": 273471403, + "quantity": 1, + "sku": "IPOD2008GREEN", + "vendor": null, + "variant_title": "green", + "product_title": "IPod Nano - 8gb", + "pre_tax_price": 398.00, + "currency": "USD", + "properties": null, + "is_not_deleted": true, + "deleted_at": null, + "created_at": "2016-07-12T11:23:54-04:00", + "updated_at": "2016-07-12T11:23:54-04:00" + } + ] + }, + { + "id": 519788022, + "order_id": 450789469, + "fulfillment_service_handle": "manual", + "status": "in_progress", + "requires_shipping": true, + "is_not_deleted": true, + "deleted_at": null, + "created_at": "2016-07-12T11:23:42-04:00", + "updated_at": "2016-07-12T11:23:42-04:00", + "happened_at": "2016-07-12T11:23:42-04:00", + "assigned_location_id": 905684977, + "request_status": "cancellation_accepted", + "delivery_category": null, + "fulfillment_order_line_items": [ + { + "id": 519788021, + "shop_id": 690933842, + "fulfillment_order_id": 519788021, + "line_item_id": 466157049, + "variant_id": 43729076, + "inventory_item_id": 808950810, + "inventory_commitment_id": 273471403, + "quantity": 1, + "sku": "IPOD2008RED", + "vendor": null, + "variant_title": "red", + "product_title": "IPod Nano - 8gb", + "pre_tax_price": 398.00, + "currency": "USD", + "properties": null, + "is_not_deleted": true, + "deleted_at": null, + "created_at": "2016-07-12T11:23:54-04:00", + "updated_at": "2016-07-12T11:23:54-04:00" + } + ] + } +] diff --git a/test/fixtures/fulfillment_order.json b/test/fixtures/fulfillment_order.json new file mode 100644 index 000000000..54ef71589 --- /dev/null +++ b/test/fixtures/fulfillment_order.json @@ -0,0 +1,38 @@ +{ + "id": 519788021, + "order_id": 450789469, + "fulfillment_service_handle": "shipwire", + "status": "open", + "requires_shipping": true, + "is_not_deleted": true, + "deleted_at": null, + "created_at": "2016-07-12T11:23:42-04:00", + "updated_at": "2016-07-12T11:23:42-04:00", + "happened_at": "2016-07-12T11:23:42-04:00", + "assigned_location_id": 905684977, + "request_status": "unsubmitted", + "delivery_category": null, + "fulfillment_order_line_items": [ + { + "id": 519788021, + "shop_id": 690933842, + "fulfillment_order_id": 519788021, + "line_item_id": 466157049, + "variant_id": 43729076, + "inventory_item_id": 808950810, + "inventory_commitment_id": 273471403, + "quantity": 1, + "sku": "IPOD2008GREEN", + "vendor": null, + "variant_title": "green", + "product_title": "IPod Nano - 8gb", + "pre_tax_price": 398.00, + "currency": "USD", + "properties": null, + "is_not_deleted": true, + "deleted_at": null, + "created_at": "2016-07-12T11:23:54-04:00", + "updated_at": "2016-07-12T11:23:54-04:00" + } + ] +} diff --git a/test/fixtures/fulfillment_orders.json b/test/fixtures/fulfillment_orders.json new file mode 100644 index 000000000..ef44616b3 --- /dev/null +++ b/test/fixtures/fulfillment_orders.json @@ -0,0 +1,78 @@ +[ + { + "id": 519788021, + "order_id": 450789469, + "fulfillment_service_handle": "shipwire", + "status": "open", + "requires_shipping": true, + "is_not_deleted": true, + "deleted_at": null, + "created_at": "2016-07-12T11:23:42-04:00", + "updated_at": "2016-07-12T11:23:42-04:00", + "happened_at": "2016-07-12T11:23:42-04:00", + "assigned_location_id": 905684977, + "request_status": "unsubmitted", + "delivery_category": null, + "fulfillment_order_line_items": [ + { + "id": 519788021, + "shop_id": 690933842, + "fulfillment_order_id": 519788021, + "line_item_id": 466157049, + "variant_id": 43729076, + "inventory_item_id": 808950810, + "inventory_commitment_id": 273471403, + "quantity": 1, + "sku": "IPOD2008GREEN", + "vendor": null, + "variant_title": "green", + "product_title": "IPod Nano - 8gb", + "pre_tax_price": 398.00, + "currency": "USD", + "properties": null, + "is_not_deleted": true, + "deleted_at": null, + "created_at": "2016-07-12T11:23:54-04:00", + "updated_at": "2016-07-12T11:23:54-04:00" + } + ] + }, + { + "id": 519788022, + "order_id": 450789469, + "fulfillment_service_handle": "manual", + "status": "open", + "requires_shipping": true, + "is_not_deleted": true, + "deleted_at": null, + "created_at": "2016-07-12T11:23:42-04:00", + "updated_at": "2016-07-12T11:23:42-04:00", + "happened_at": "2016-07-12T11:23:42-04:00", + "assigned_location_id": 905684977, + "request_status": "unsubmitted", + "delivery_category": null, + "fulfillment_order_line_items": [ + { + "id": 519788021, + "shop_id": 690933842, + "fulfillment_order_id": 519788021, + "line_item_id": 466157049, + "variant_id": 43729076, + "inventory_item_id": 808950810, + "inventory_commitment_id": 273471403, + "quantity": 1, + "sku": "IPOD2008RED", + "vendor": null, + "variant_title": "red", + "product_title": "IPod Nano - 8gb", + "pre_tax_price": 398.00, + "currency": "USD", + "properties": null, + "is_not_deleted": true, + "deleted_at": null, + "created_at": "2016-07-12T11:23:54-04:00", + "updated_at": "2016-07-12T11:23:54-04:00" + } + ] + } +] diff --git a/test/fixtures/fulfillments.json b/test/fixtures/fulfillments.json new file mode 100644 index 000000000..d9c66c6e6 --- /dev/null +++ b/test/fixtures/fulfillments.json @@ -0,0 +1,53 @@ +[ + { + "created_at": "2014-03-07T16:14:08-05:00", + "id": 255858046, + "order_id": 450789469, + "service": "manual", + "status": "failure", + "tracking_company": null, + "updated_at": "2014-03-07T16:14:08-05:00", + "tracking_number": "1Z2345", + "tracking_numbers": [ + "1Z2345" + ], + "tracking_url": "http://wwwapps.ups.com/etracking/tracking.cgi?InquiryNumber1=1Z2345&TypeOfInquiryNumber=T&AcceptUPSLicenseAgreement=yes&submit=Track", + "tracking_urls": [ + "http://wwwapps.ups.com/etracking/tracking.cgi?InquiryNumber1=1Z2345&TypeOfInquiryNumber=T&AcceptUPSLicenseAgreement=yes&submit=Track" + ], + "receipt": { + "testcase": true, + "authorization": "123456" + }, + "line_items": [ + { + "fulfillment_service": "manual", + "fulfillment_status": null, + "grams": 200, + "id": 466157049, + "price": "199.00", + "product_id": 632910392, + "quantity": 1, + "requires_shipping": true, + "sku": "IPOD2008GREEN", + "taxable": true, + "title": "IPod Nano - 8gb", + "variant_id": 39072856, + "variant_title": "green", + "vendor": null, + "name": "IPod Nano - 8gb - green", + "variant_inventory_management": "shopify", + "properties": [ + { + "name": "Custom Engraving", + "value": "Happy Birthday" + } + ], + "product_exists": true, + "tax_lines": [ + + ] + } + ] + } +] diff --git a/test/fulfillment_order_test.rb b/test/fulfillment_order_test.rb new file mode 100644 index 000000000..353e859a1 --- /dev/null +++ b/test/fulfillment_order_test.rb @@ -0,0 +1,58 @@ +require 'test_helper' + +class FulFillmentOrderTest < Test::Unit::TestCase + def setup + super + fake "fulfillment_orders/519788021", method: :get, + body: load_fixture('fulfillment_order') + end + + context "FulfillmentOrder" do + context "#find" do + should "be able to find fulfillment order" do + fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021) + assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder) + assert_equal 519788021, fulfillment_order.id + assert_equal 450789469, fulfillment_order.order_id + end + end + + context "#all" do + should "be able to list fulfillment orders for an order" do + fake 'orders/450789469/fulfillment_orders', method: :get, body: load_fixture('fulfillment_orders') + + fulfillment_orders = ShopifyAPI::FulfillmentOrder.all( + params: { order_id: 450789469 } + ) + + assert_equal [519788021, 519788022], fulfillment_orders.map(&:id).sort + fulfillment_orders.each do |fulfillment_order| + assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder) + assert_equal 450789469, fulfillment_order.order_id + end + end + + should "require order_id" do + assert_raises ShopifyAPI::ValidationException do + ShopifyAPI::FulfillmentOrder.all + end + end + end + + context "#fulfillments" do + should "be able to list fulfillments for a fulfillment order" do + fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021) + + fake "fulfillment_orders/#{fulfillment_order.id}/fulfillments", method: :get, + body: load_fixture('fulfillments') + + fulfillments = fulfillment_order.fulfillments + + assert_equal 1, fulfillments.count + fulfillment = fulfillments.first + assert fulfillment.is_a?(ShopifyAPI::Fulfillment) + assert_equal 450789469, fulfillment.order_id + end + end + end +end diff --git a/test/order_test.rb b/test/order_test.rb index 8c70bb162..f877cee45 100644 --- a/test/order_test.rb +++ b/test/order_test.rb @@ -72,4 +72,18 @@ class OrderTest < Test::Unit::TestCase }, }.to_json) end + + test "fulfillment_orders should get fulfillment orders for an order" do + fake 'orders/450789469', body: load_fixture('order') + order = ShopifyAPI::Order.find(450789469) + + fake 'orders/450789469/fulfillment_orders', method: :get, body: load_fixture('fulfillment_orders') + fulfillment_orders = order.fulfillment_orders + + assert_equal [519788021, 519788022], fulfillment_orders.map(&:id).sort + fulfillment_orders.each do |fulfillment_order| + assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder) + assert_equal 450789469, fulfillment_order.order_id + end + end end