Ver Fonte

Merge pull request #335 from Shopify/price-rules

Adds support for price rules
Jordan Liddle há 7 anos atrás
pai
commit
7d6c323ba0

+ 9 - 0
lib/shopify_api/resources/discount_code.rb

@@ -0,0 +1,9 @@
+module ShopifyAPI
+  class DiscountCode < Base
+    init_prefix :price_rule
+
+    def price_rule_id
+      @prefix_options[:price_rule_id]
+    end
+  end
+end

+ 8 - 0
lib/shopify_api/resources/price_rule.rb

@@ -0,0 +1,8 @@
+module ShopifyAPI
+  class PriceRule < Base
+
+    def discount_codes
+      DiscountCode.find(:all, params: { price_rule_id: id })
+    end
+  end
+end

+ 53 - 0
test/discount_code_test.rb

@@ -0,0 +1,53 @@
+require 'test_helper'
+
+class DiscountCodeTest < Test::Unit::TestCase
+  def setup
+    super
+    fake 'price_rules/102586120/discount_codes/1002091923', body: load_fixture('discount_code')
+
+    @discount_code = ShopifyAPI::DiscountCode.find(1002091923, params: {price_rule_id: 102586120})
+  end
+
+  def test_get_discount_code
+    fake 'price_rules/102586120/discount_codes', method: :get, status: 200, body: load_fixture('discount_code')
+    discount_code = ShopifyAPI::DiscountCode.find 1002091923, params: { price_rule_id: 102586120 }
+
+    assert_equal 1002091923, discount_code.id
+  end
+
+  def test_get_all_discount_codes
+    fake 'price_rules/102586120/discount_codes', method: :get, status: 200, body: load_fixture('discount_codes')
+    discount_codes = ShopifyAPI::DiscountCode.all params: { price_rule_id: 102586120 }
+
+    assert_equal 1, discount_codes.length
+    assert_equal 1002091923, discount_codes.first.id
+  end
+
+  def test_create_discount_code
+    fake 'price_rules/102586120/discount_codes', method: :post, status: 201, body: load_fixture('discount_code')
+    discount_code = ShopifyAPI::DiscountCode.new
+    discount_code.prefix_options[:price_rule_id] = 102586120
+    discount_code.code = "SUMMERSALE10"
+    discount_code.save
+
+    assert_equal '{"discount_code":{"code":"SUMMERSALE10"}}', FakeWeb.last_request.body
+  end
+
+  def test_update_discount_code
+    discount_code_response = ActiveSupport::JSON.decode(load_fixture('discount_code'))
+    discount_code_response['discount_code']['code'] = "WINTERSALE50"
+    @discount_code.code = "WINTERSALE50"
+
+    fake 'price_rules/102586120/discount_codes/1002091923', method: :put, status: 200, body: ActiveSupport::JSON.encode(discount_code_response)
+
+    @discount_code.save
+    
+    assert_equal discount_code_response['discount_code']['code'], @discount_code.code
+  end
+
+  def test_delete_discount_code
+    fake 'price_rules/102586120/discount_codes/1002091923', method: :delete, body: 'destroyed'
+
+    assert @discount_code.destroy
+  end
+end

+ 10 - 0
test/fixtures/discount_code.json

@@ -0,0 +1,10 @@
+{
+  "discount_code": {
+    "id": 1002091923,
+    "price_rule_id": 102586120,
+    "code": "SUMMERSALE10",
+    "usage_count": 5,
+    "created_at": "2017-03-09T19:22:49Z",
+    "updated_at": "2017-03-09T19:22:49Z"
+  }
+}

+ 12 - 0
test/fixtures/discount_codes.json

@@ -0,0 +1,12 @@
+{
+  "discount_codes": [
+    {
+      "id": 1002091923,
+      "price_rule_id": 102586120,
+      "code": "SUMMERSALE10",
+      "usage_count": 5,
+      "created_at": "2017-03-09T19:22:49Z",
+      "updated_at": "2017-03-09T19:22:49Z"
+    }
+  ]
+}

+ 27 - 0
test/fixtures/price_rule.json

@@ -0,0 +1,27 @@
+{
+  "price_rule": {
+    "id": 102586120,
+    "target_type": "line_item",
+    "target_selection": "entitled",
+    "allocation_method": "across",
+    "value_type": "fixed_amount",
+    "value": -10.0,
+    "customer_selection": "all",
+    "once_per_customer": false,
+    "usage_limit": 10,
+    "created_at": "2016-09-11T09:00:00-04:00",
+    "updated_at": "2016-09-11T09:30:00-04:00",
+    "starts_at": "2016-09-12T0:00:00-04:00",
+    "ends_at": "2016-09-12T00:00:00-04:00",
+    "entitled_product_ids": [22,278,293],
+    "entitled_variant_ids": [],
+    "entitled_collection_ids": [],
+    "entitled_country_ids": [],
+    "prerequisite_subtotal_range": {
+      "greater_than_or_equal_to": 10
+    },
+    "prerequisite_shipping_price_range": {},
+    "prerequisite_saved_search_ids": [34,88],
+    "title": "Summer Sale Event 2017"
+  }
+}

+ 28 - 0
test/fixtures/price_rules.json

@@ -0,0 +1,28 @@
+{
+  "price_rules": [
+    {
+      "id": 102586120,
+      "target_type": "line_items",
+      "target_selection": "entitled",
+      "allocation_method": "each",
+      "value_type": "fixed_amount",
+      "value": -10,
+      "once_per_customer": false,
+      "usage_limit": 10,
+      "created_at": "2016-09-11T09:00:00-04:00",
+      "updated_at": "2016-09-11T09:30:00-04:00",
+      "starts_at": "2016-09-12T0:00:00-04:00",
+      "ends_at": "2016-09-12T00:00:00-04:00",
+      "entitled_product_ids": [22,278,293],
+      "entitled_variant_ids": [],
+      "entitled_collection_ids": [],
+      "entitled_country_ids": [],
+      "prerequisite_subtotal_range": {
+        "greater_than_or_equal_to": 10
+      },
+      "prerequisite_shipping_price_range": {},
+      "prerequisite_saved_search_ids": [34,88],
+      "title": "Summer Sale Event 2017"
+    }
+  ]
+}

+ 65 - 0
test/price_rule_test.rb

@@ -0,0 +1,65 @@
+require 'test_helper'
+
+class PriceRuleTest < Test::Unit::TestCase
+  def setup
+    super
+    fake 'price_rules/102586120', body: load_fixture('price_rule')
+
+    @price_rule = ShopifyAPI::PriceRule.find(102586120)
+  end
+
+  def test_get_price_rule
+    fake 'price_rules/102586120', method: :get, status: 200, body: load_fixture('price_rule')
+    price_rule = ShopifyAPI::PriceRule.find(102586120)
+
+    assert_equal 102586120, price_rule.id
+  end
+
+  def test_get_all_price_rules
+    fake 'price_rules', method: :get, status: 200, body: load_fixture('price_rules')
+    price_rules = ShopifyAPI::PriceRule.all
+
+    assert_equal 1, price_rules.length
+    assert_equal 102586120, price_rules.first.id
+  end
+
+  def test_get_all_discount_codes_for_a_price_rule
+    fake 'price_rules/102586120/discount_codes', method: :get, status: 200, body: load_fixture('discount_codes')
+    price_rule = ShopifyAPI::PriceRule.find(102586120)
+
+    assert_equal "SUMMERSALE10", price_rule.discount_codes.first.code
+  end
+
+  def test_create_price_rule
+    fake 'price_rules', method: :post, status: 201, body: load_fixture('price_rule')
+
+    price_rule = ShopifyAPI::PriceRule.create(
+      target_type: "line_item",
+      allocation_method: "across",
+      value_type: "fixed_amount",
+      value: -10.0,
+      customer_selection: "all",
+      starts_at: "2017-01-19T00:00:00Z"
+    )
+
+    assert_equal '{"price_rule":{"target_type":"line_item","allocation_method":"across","value_type":"fixed_amount","value":-10.0,"customer_selection":"all","starts_at":"2017-01-19T00:00:00Z"}}', FakeWeb.last_request.body
+    assert_equal -10, price_rule.value
+  end
+
+  def test_update_price_rule
+    price_rule_response = ActiveSupport::JSON.decode(load_fixture('price_rule'))
+    price_rule_response['price_rule']['value'] = -50.0
+    @price_rule.value = -50.0
+    fake 'price_rules/102586120', method: :put, status: 200, body: ActiveSupport::JSON.encode(price_rule_response)
+
+    @price_rule.save
+
+    assert_equal price_rule_response['price_rule']['value'], @price_rule.value
+  end
+
+  def test_delete_price_rule
+    fake 'price_rules/102586120', method: :delete, body: 'destroyed'
+
+    assert @price_rule.destroy
+  end
+end