Browse Source

Merge pull request #731 from marschattha/inventory-patch

Inventory param patch fix
Tim Anema 4 years ago
parent
commit
2565e7dbc8
4 changed files with 174 additions and 19 deletions
  1. 21 0
      lib/shopify_api/resources/product.rb
  2. 37 0
      lib/shopify_api/resources/variant.rb
  3. 39 0
      test/product_test.rb
  4. 77 19
      test/variant_test.rb

+ 21 - 0
lib/shopify_api/resources/product.rb

@@ -15,6 +15,15 @@ module ShopifyAPI
         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 @@ module ShopifyAPI
     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

+ 37 - 0
lib/shopify_api/resources/variant.rb

@@ -4,5 +4,42 @@ module ShopifyAPI
     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

+ 39 - 0
test/product_test.rb

@@ -57,4 +57,43 @@ class ProductTest < Test::Unit::TestCase
 
     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

+ 77 - 19
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 @@ class VariantTest < Test::Unit::TestCase
   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