Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions lib/shopify_api/resources/product.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand All @@ -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
37 changes: 37 additions & 0 deletions lib/shopify_api/resources/variant.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
39 changes: 39 additions & 0 deletions test/product_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
96 changes: 77 additions & 19 deletions test/variant_test.rb
Original file line number Diff line number Diff line change
@@ -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')
Expand All @@ -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