diff --git a/lib/shopify_api/resources/product.rb b/lib/shopify_api/resources/product.rb index cf67fa6e4..ca75640ea 100644 --- a/lib/shopify_api/resources/product.rb +++ b/lib/shopify_api/resources/product.rb @@ -15,6 +15,15 @@ def price_range format % prices.min end end + + def total_inventory=(new_value) + raise_deprecated_inventory_call('total_inventory') unless allow_inventory_params? + super + end + + def serializable_hash(options = {}) + allow_inventory_params? ? super(options) : super(options).except('total_inventory') + end def collections CustomCollection.find(:all, :params => {:product_id => self.id}) @@ -31,5 +40,17 @@ def add_to_collection(collection) def remove_from_collection(collection) collection.remove_product(self) end + + private + + def raise_deprecated_inventory_call(parameter) + raise(ShopifyAPI::ValidationException, + "'#{parameter}' is deprecated - see https://help.shopify.com/en/api/guides/inventory-migration-guide", + ) + end + + def allow_inventory_params? + Base.api_version < ApiVersion.find_version('2019-10') + end end end diff --git a/lib/shopify_api/resources/variant.rb b/lib/shopify_api/resources/variant.rb index 76ab4da49..b1931ff0e 100644 --- a/lib/shopify_api/resources/variant.rb +++ b/lib/shopify_api/resources/variant.rb @@ -4,5 +4,42 @@ class Variant < Base include DisablePrefixCheck conditional_prefix :product + + def inventory_quantity_adjustment=(new_value) + raise_deprecated_inventory_call('inventory_quantity_adjustment') unless allow_inventory_params? + super + end + + def inventory_quantity=(new_value) + raise_deprecated_inventory_call('inventory_quantity') unless allow_inventory_params? + super + end + + def old_inventory_quantity=(new_value) + raise_deprecated_inventory_call('old_inventory_quantity') unless allow_inventory_params? + super + end + + def serializable_hash(options = {}) + if allow_inventory_params? + super(options) + else + super(options).tap do |resource| + (resource['variant'] || resource).except!('inventory_quantity', 'old_inventory_quantity') + end + end + end + + private + + def raise_deprecated_inventory_call(parameter) + raise(ShopifyAPI::ValidationException, + "'#{parameter}' is deprecated - see https://help.shopify.com/en/api/guides/inventory-migration-guide", + ) + end + + def allow_inventory_params? + Base.api_version < ApiVersion.find_version('2019-10') + end end end diff --git a/test/product_test.rb b/test/product_test.rb index fe5bd6621..cca18b54a 100644 --- a/test/product_test.rb +++ b/test/product_test.rb @@ -57,4 +57,43 @@ def test_price_range_when_has_different_price assert_equal('100.00 - 199.00', @product.price_range) end + + def test_deprecated_variant_inventory_fields_are_included_in_2019_07 + ShopifyAPI::Base.api_version = '2019-07' + variant = @product.variants.first + assert variant.as_json.include?('inventory_quantity') + end + + def test_deprecated_variant_inventory_fields_are_removed_in_2020_01 + ShopifyAPI::Base.api_version = '2020-01' + variant = @product.variants.first + refute variant.as_json.include?('inventory_quantity') + end + + def test_deprecated_inventory_fields_are_removed_in_2020_01 + ShopifyAPI::Base.api_version = '2020-01' + refute @product.as_json.include?('total_inventory') + end + + def test_setting_product_total_inventory_passes_in_api_before_2019_10 + ShopifyAPI::Base.api_version = '2019-07' + fake("products/632910392", {:body => load_fixture('product')}) + @product.total_inventory = 8 + end + + def test_setting_product_total_inventory_fails_in_2019_10_api + ShopifyAPI::Base.api_version = '2019-10' + fake("products/632910392", {:body => load_fixture('product')}) + assert_raises(ShopifyAPI::ValidationException) do + @product.total_inventory = 8 + end + end + + def test_setting_product_total_inventory_fails_in_the_unstable_api + ShopifyAPI::Base.api_version = :unstable + fake("products/632910392", {:body => load_fixture('product')}) + assert_raises(ShopifyAPI::ValidationException) do + @product.total_inventory = 8 + end + end end diff --git a/test/variant_test.rb b/test/variant_test.rb index 9bac02386..5a0dcc580 100644 --- a/test/variant_test.rb +++ b/test/variant_test.rb @@ -1,6 +1,11 @@ require 'test_helper' class VariantTest < Test::Unit::TestCase + def setup + super + fake "products/632910392/variants/808950810", method: :get, body: load_fixture('variant') + @variant = ShopifyAPI::Variant.find(808950810, :params => {:product_id => 632910392}) + end def test_get_variants fake "products/632910392/variants", :method => :get, :body => load_fixture('variants') @@ -10,37 +15,90 @@ def test_get_variants end def test_get_variant_namespaced - fake "products/632910392/variants/808950810", :method => :get, :body => load_fixture('variant') - - v = ShopifyAPI::Variant.find(808950810, :params => {:product_id => 632910392}) - assert_equal 632910392, v.product_id + assert_equal 632910392, @variant.product_id end def test_get_variant - fake "variants/808950810", :method => :get, :body => load_fixture('variant') - - v = ShopifyAPI::Variant.find(808950810) - assert_equal 632910392, v.product_id + assert_equal 632910392, @variant.product_id end def test_product_id_should_be_accessible_if_via_product_endpoint - fake "products/632910392/variants/808950810", :method => :get, :body => load_fixture('variant') - - v = ShopifyAPI::Variant.find(808950810, :params => {:product_id => 632910392}) - assert_equal 632910392, v.product_id + assert_equal 632910392, @variant.product_id end def test_product_id_should_be_accessible_if_via_variant_endpoint - fake "variants/808950810", :method => :get, :body => load_fixture('variant') - - v = ShopifyAPI::Variant.find(808950810) - assert_equal 632910392, v.product_id + assert_equal 632910392, @variant.product_id end def test_delete_variant - fake "products/632910392/variants/808950810", :method => :get, :body => load_fixture('variant') fake "products/632910392/variants/808950810", :method => :delete, :body => 'destroyed' - v = ShopifyAPI::Variant.find(808950810, :params => {:product_id => 632910392}) - assert v.destroy + assert @variant.destroy + end + + def test_deprecated_inventory_fields_are_included_in_2019_07 + ShopifyAPI::Base.api_version = '2019-07' + assert @variant.as_json.include?('inventory_quantity') + end + + def test_deprecated_inventory_fields_are_removed_in_2020_01 + ShopifyAPI::Base.api_version = '2020-01' + refute @variant.as_json.include?('inventory_quantity') + end + + def test_setting_variant_inventory_quantity_adjustment_passes_in_api_before_2019_10 + ShopifyAPI::Base.api_version = '2019-07' + @variant.inventory_quantity_adjustment = 8 + end + + def test_setting_variant_inventory_quantity_adjustment_fails_in_2019_10_api + ShopifyAPI::Base.api_version = '2019-10' + assert_raises(ShopifyAPI::ValidationException) do + @variant.inventory_quantity_adjustment = 8 + end + end + + def test_setting_variant_inventory_quantity_adjustment_fails_in_the_unstable_api + ShopifyAPI::Base.api_version = :unstable + assert_raises(ShopifyAPI::ValidationException) do + @variant.inventory_quantity_adjustment = 8 + end + end + + def test_setting_variant_inventory_quantity_passes_in_api_before_2019_10 + ShopifyAPI::Base.api_version = '2019-07' + @variant.inventory_quantity = 8 + end + + def test_setting_variant_inventory_quantity_fails_in_2019_10_api + ShopifyAPI::Base.api_version = '2019-10' + assert_raises(ShopifyAPI::ValidationException) do + @variant.inventory_quantity = 8 + end + end + + def test_setting_variant_inventory_quantity_fails_in_the_unstable_api + ShopifyAPI::Base.api_version = :unstable + assert_raises(ShopifyAPI::ValidationException) do + @variant.inventory_quantity = 8 + end + end + + def test_setting_variant_old_inventory_quantity_passes_in_api_before_2019_10 + ShopifyAPI::Base.api_version = '2019-07' + @variant.old_inventory_quantity = 8 + end + + def test_setting_variant_old_inventory_quantity_fails_in_2019_10_api + ShopifyAPI::Base.api_version = '2019-10' + assert_raises(ShopifyAPI::ValidationException) do + @variant.old_inventory_quantity = 8 + end + end + + def test_setting_variant_old_inventory_quantity_fails_in_the_unstable_api + ShopifyAPI::Base.api_version = :unstable + assert_raises(ShopifyAPI::ValidationException) do + @variant.old_inventory_quantity = 8 + end end end