def test_product_list_with_variants(self):
        "Test if variants are hideen on hiding variants in settings."
        create_variant_web_item()

        setup_e_commerce_settings({
            "enable_attribute_filters": 0,
            "hide_variants": 1
        })
        frappe.local.shopping_cart_settings = None

        attribute_filters = {"Test Size": ["Large"]}
        engine = ProductQuery()
        result = engine.query(attributes=attribute_filters,
                              fields={},
                              search_term=None,
                              start=0,
                              item_group=None)
        items = result.get("items")

        # check if any variants are fetched even though published variant exists
        self.assertEqual(len(items), 0)

        # tear down
        setup_e_commerce_settings({
            "enable_attribute_filters": 1,
            "hide_variants": 0
        })
    def test_product_list_discount_filter_builder(self):
        "Test if discount filters are fetched correctly."
        from erpnext.e_commerce.doctype.website_item.test_website_item import (
            make_web_item_price,
            make_web_pricing_rule,
        )

        item_code = "Test 12I Laptop"
        make_web_item_price(item_code=item_code)
        make_web_pricing_rule(title=f"Test Pricing Rule for {item_code}",
                              item_code=item_code,
                              selling=1)

        setup_e_commerce_settings({"show_price": 1})
        frappe.local.shopping_cart_settings = None

        engine = ProductQuery()
        result = engine.query(attributes={},
                              fields={},
                              search_term=None,
                              start=4,
                              item_group=None)
        self.assertTrue(bool(result.get("discounts")))

        filter_engine = ProductFiltersBuilder()
        discount_filters = filter_engine.get_discount_filters(
            result["discounts"])

        self.assertEqual(len(discount_filters[0]), 2)
        self.assertEqual(discount_filters[0][0], 10)
        self.assertEqual(discount_filters[0][1], "10% and below")
    def test_product_list_with_discount_filters(self):
        "Test if discount filters are applied correctly."
        from erpnext.e_commerce.doctype.website_item.test_website_item import (
            make_web_item_price,
            make_web_pricing_rule,
        )

        field_filters = {"discount": [10]}

        make_web_item_price(item_code="Test 12I Laptop")
        make_web_pricing_rule(
            title="Test Pricing Rule for Test 12I Laptop",  # 10% discount
            item_code="Test 12I Laptop",
            selling=1)
        make_web_item_price(item_code="Test 13I Laptop")
        make_web_pricing_rule(
            title="Test Pricing Rule for Test 13I Laptop",  # 15% discount
            item_code="Test 13I Laptop",
            discount_percentage=15,
            selling=1)

        setup_e_commerce_settings({"show_price": 1})
        frappe.local.shopping_cart_settings = None

        engine = ProductQuery()
        result = engine.query(attributes={},
                              fields=field_filters,
                              search_term=None,
                              start=0,
                              item_group=None)
        items = result.get("items")

        # check if only product with 10% and below discount are fetched
        self.assertEqual(len(items), 1)
        self.assertEqual(items[0].get("item_code"), "Test 12I Laptop")
示例#4
0
	def test_website_item_price_for_guest_user(self):
		"Check if price details are fetched correctly for guest user."
		item_code = "Test Mobile Phone"

		# show price for guest user in e commerce settings
		setup_e_commerce_settings({"show_price": 1, "hide_price_for_guest": 0})

		# price and pricing rule added via setUp

		# switch to guest user
		frappe.set_user("Guest")

		# price should be fetched
		frappe.local.shopping_cart_settings = None
		data = get_product_info_for_website(item_code, skip_quotation_creation=True)
		self.assertTrue(bool(data.product_info["price"]))

		price_object = data.product_info["price"]
		self.assertEqual(price_object.get("discount_percent"), 10)
		self.assertEqual(price_object.get("price_list_rate"), 900)

		# hide price for guest user
		frappe.set_user("Administrator")
		setup_e_commerce_settings({"hide_price_for_guest": 1})
		frappe.set_user("Guest")

		# price should not be fetched
		frappe.local.shopping_cart_settings = None
		data = get_product_info_for_website(item_code, skip_quotation_creation=True)
		self.assertFalse(bool(data.product_info["price"]))

		# tear down
		frappe.set_user("Administrator")
示例#5
0
 def setUpClass(cls):
     setup_e_commerce_settings({
         "company": "_Test Company",
         "enabled": 1,
         "default_customer_group": "_Test Customer Group",
         "price_list": "_Test Price List India",
     })
示例#6
0
    def test_exact_match_with_price(self):
        """
		Test price fetching and matching of variant without Website Item
		"""
        from erpnext.e_commerce.doctype.website_item.test_website_item import make_web_item_price

        frappe.set_user("Administrator")
        setup_e_commerce_settings({
            "company": "_Test Company",
            "enabled": 1,
            "default_customer_group": "_Test Customer Group",
            "price_list": "_Test Price List India",
            "show_price": 1,
        })

        make_web_item_price(item_code="Test-Tshirt-Temp-S-R",
                            price_list_rate=100)

        frappe.local.shopping_cart_settings = None  # clear cached settings values
        next_values = get_next_attribute_and_values("Test-Tshirt-Temp",
                                                    selected_attributes={
                                                        "Test Size": "Small",
                                                        "Test Colour": "Red"
                                                    })
        print(">>>>", next_values)
        price_info = next_values["product_info"]["price"]

        self.assertEqual(next_values["exact_match"][0], "Test-Tshirt-Temp-S-R")
        self.assertEqual(next_values["exact_match"][0], "Test-Tshirt-Temp-S-R")
        self.assertEqual(price_info["price_list_rate"], 100.0)
        self.assertEqual(price_info["formatted_price_sales_uom"], "₹ 100.00")
示例#7
0
    def test_website_item_price_for_logged_in_user(self):
        "Check if price details are fetched correctly while logged in."
        item_code = "Test Mobile Phone"

        # show price in e commerce settings
        setup_e_commerce_settings({"show_price": 1})

        # price and pricing rule added via setUp

        # check if price and slashed price is fetched correctly
        frappe.local.shopping_cart_settings = None
        data = get_product_info_for_website(item_code,
                                            skip_quotation_creation=True)
        self.assertTrue(bool(data.product_info["price"]))

        price_object = data.product_info["price"]
        self.assertEqual(price_object.get("discount_percent"), 10)
        self.assertEqual(price_object.get("price_list_rate"), 900)
        self.assertEqual(price_object.get("formatted_mrp"), "₹ 1,000.00")
        self.assertEqual(price_object.get("formatted_price"), "₹ 900.00")
        self.assertEqual(price_object.get("formatted_discount_percent"), "10%")

        # disable show price
        setup_e_commerce_settings({"show_price": 0})

        # price should not be fetched
        frappe.local.shopping_cart_settings = None
        data = get_product_info_for_website(item_code,
                                            skip_quotation_creation=True)
        self.assertFalse(bool(data.product_info["price"]))

        # tear down
        frappe.set_user("Administrator")
示例#8
0
    def setUp(self):
        item = make_item("Test Mobile Phone")
        if not frappe.db.exists("Website Item",
                                {"item_code": "Test Mobile Phone"}):
            make_website_item(item, save=True)

        setup_e_commerce_settings({"enable_reviews": 1})
        frappe.local.shopping_cart_settings = None
示例#9
0
    def test_website_item_stock_when_in_stock(self):
        """
		Check if stock details are fetched correctly for available inventory when:
		1) Showing stock availability enabled:
		        - Warehouse set
		        - Warehouse unset
		2) Showing stock availability disabled
		"""
        from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry

        item_code = "Test Mobile Phone"
        create_regular_web_item()
        setup_e_commerce_settings({"show_stock_availability": 1})
        frappe.local.shopping_cart_settings = None

        # set warehouse
        frappe.db.set_value("Website Item", {"item_code": item_code},
                            "website_warehouse", "_Test Warehouse - _TC")

        # stock up item
        stock_entry = make_stock_entry(item_code=item_code,
                                       target="_Test Warehouse - _TC",
                                       qty=2,
                                       rate=100)

        # check if stock details are fetched and item is in stock with warehouse set
        data = get_product_info_for_website(item_code,
                                            skip_quotation_creation=True)
        self.assertTrue(bool(data.product_info["in_stock"]))
        self.assertEqual(data.product_info["stock_qty"][0][0], 2)

        # unset warehouse
        frappe.db.set_value("Website Item", {"item_code": item_code},
                            "website_warehouse", "")

        # check if stock details are fetched and item not in stock without warehouse set
        # (even though it has stock in some warehouse)
        data = get_product_info_for_website(item_code,
                                            skip_quotation_creation=True)
        self.assertFalse(bool(data.product_info["in_stock"]))
        self.assertFalse(bool(data.product_info["stock_qty"]))

        # disable show stock availability
        setup_e_commerce_settings({"show_stock_availability": 0})
        frappe.local.shopping_cart_settings = None
        data = get_product_info_for_website(item_code,
                                            skip_quotation_creation=True)

        # check if stock detail attributes are not fetched if stock availability is hidden
        self.assertIsNone(data.product_info.get("in_stock"))
        self.assertIsNone(data.product_info.get("stock_qty"))
        self.assertIsNone(data.product_info.get("show_stock_qty"))

        # tear down
        stock_entry.cancel()
        frappe.get_cached_doc("Website Item", {
            "item_code": "Test Mobile Phone"
        }).delete()
示例#10
0
    def test_recommended_item_for_guest_user(self):
        "Check if added recommended items are fetched correctly for guest user."
        item_code = "Test Mobile Phone"
        web_item = create_regular_web_item(item_code)

        # price visible to guests
        setup_e_commerce_settings({
            "enable_recommendations": 1,
            "show_price": 1,
            "hide_price_for_guest": 0
        })

        # create recommended web item and price for it
        recommended_web_item = create_regular_web_item("Test Mobile Phone 1")
        make_web_item_price(item_code="Test Mobile Phone 1")

        # add recommended item to first web item
        web_item.append("recommended_items",
                        {"website_item": recommended_web_item.name})
        web_item.save()

        frappe.set_user("Guest")

        frappe.local.shopping_cart_settings = None
        e_commerce_settings = get_shopping_cart_settings()
        recommended_items = web_item.get_recommended_items(e_commerce_settings)

        # test results if show price is enabled
        self.assertEqual(len(recommended_items), 1)
        self.assertTrue(bool(
            recommended_items[0].get("price_info")))  # price fetched

        # price hidden from guests
        frappe.set_user("Administrator")
        setup_e_commerce_settings({"hide_price_for_guest": 1})
        frappe.set_user("Guest")

        frappe.local.shopping_cart_settings = None
        e_commerce_settings = get_shopping_cart_settings()
        recommended_items = web_item.get_recommended_items(e_commerce_settings)

        # test results if show price is enabled
        self.assertEqual(len(recommended_items), 1)
        self.assertFalse(bool(
            recommended_items[0].get("price_info")))  # price fetched

        # tear down
        frappe.set_user("Administrator")
        web_item.delete()
        recommended_web_item.delete()
        frappe.get_cached_doc("Item", "Test Mobile Phone 1").delete()
示例#11
0
    def test_recommended_item(self):
        "Check if added recommended items are fetched correctly."
        item_code = "Test Mobile Phone"
        web_item = create_regular_web_item(item_code)

        setup_e_commerce_settings({
            "enable_recommendations": 1,
            "show_price": 1
        })

        # create recommended web item and price for it
        recommended_web_item = create_regular_web_item("Test Mobile Phone 1")
        make_web_item_price(item_code="Test Mobile Phone 1")

        # add recommended item to first web item
        web_item.append("recommended_items",
                        {"website_item": recommended_web_item.name})
        web_item.save()

        frappe.local.shopping_cart_settings = None
        e_commerce_settings = get_shopping_cart_settings()
        recommended_items = web_item.get_recommended_items(e_commerce_settings)

        # test results if show price is enabled
        self.assertEqual(len(recommended_items), 1)
        recomm_item = recommended_items[0]
        self.assertEqual(recomm_item.get("website_item_name"),
                         "Test Mobile Phone 1")
        self.assertTrue(bool(recomm_item.get("price_info")))  # price fetched

        price_info = recomm_item.get("price_info")
        self.assertEqual(price_info.get("price_list_rate"), 1000)
        self.assertEqual(price_info.get("formatted_price"), "₹ 1,000.00")

        # test results if show price is disabled
        setup_e_commerce_settings({"show_price": 0})

        frappe.local.shopping_cart_settings = None
        e_commerce_settings = get_shopping_cart_settings()
        recommended_items = web_item.get_recommended_items(e_commerce_settings)

        self.assertEqual(len(recommended_items), 1)
        self.assertFalse(bool(
            recommended_items[0].get("price_info")))  # price not fetched

        # tear down
        web_item.delete()
        recommended_web_item.delete()
        frappe.get_cached_doc("Item", "Test Mobile Phone 1").delete()
示例#12
0
    def test_website_item_stock_when_out_of_stock(self):
        """
		Check if stock details are fetched correctly for empty inventory when:
		1) Showing stock availability enabled:
		        - Warehouse unset
		        - Warehouse set
		2) Showing stock availability disabled
		"""
        item_code = "Test Mobile Phone"
        create_regular_web_item()
        setup_e_commerce_settings({"show_stock_availability": 1})

        frappe.local.shopping_cart_settings = None
        data = get_product_info_for_website(item_code,
                                            skip_quotation_creation=True)

        # check if stock details are fetched and item not in stock without warehouse set
        self.assertFalse(bool(data.product_info["in_stock"]))
        self.assertFalse(bool(data.product_info["stock_qty"]))

        # set warehouse
        frappe.db.set_value("Website Item", {"item_code": item_code},
                            "website_warehouse", "_Test Warehouse - _TC")

        # check if stock details are fetched and item not in stock with warehouse set
        data = get_product_info_for_website(item_code,
                                            skip_quotation_creation=True)
        self.assertFalse(bool(data.product_info["in_stock"]))
        self.assertEqual(data.product_info["stock_qty"][0][0], 0)

        # disable show stock availability
        setup_e_commerce_settings({"show_stock_availability": 0})
        frappe.local.shopping_cart_settings = None
        data = get_product_info_for_website(item_code,
                                            skip_quotation_creation=True)

        # check if stock detail attributes are not fetched if stock availability is hidden
        self.assertIsNone(data.product_info.get("in_stock"))
        self.assertIsNone(data.product_info.get("stock_qty"))
        self.assertIsNone(data.product_info.get("show_stock_qty"))

        # tear down
        frappe.get_cached_doc("Website Item", {
            "item_code": "Test Mobile Phone"
        }).delete()
    def setUpClass(cls):
        item_codes = [
            ("Test 11I Laptop", "Products"),  # rank 1
            ("Test 12I Laptop", "Products"),  # rank 2
            ("Test 13I Laptop", "Products"),  # rank 3
            ("Test 14I Laptop", "Raw Material"),  # rank 4
            ("Test 15I Laptop", "Raw Material"),  # rank 5
            ("Test 16I Laptop", "Raw Material"),  # rank 6
            ("Test 17I Laptop", "Products")  # rank 7
        ]
        for index, item in enumerate(item_codes, start=1):
            item_code = item[0]
            item_args = {"item_group": item[1]}
            web_args = {"ranking": index}
            if not frappe.db.exists("Website Item", {"item_code": item_code}):
                create_regular_web_item(item_code,
                                        item_args=item_args,
                                        web_args=web_args)

        setup_e_commerce_settings({
            "products_per_page":
            4,
            "enable_field_filters":
            1,
            "filter_fields": [{
                "fieldname": "item_group"
            }],
            "enable_attribute_filters":
            1,
            "filter_attributes": [{
                "attribute": "Test Size"
            }],
            "company":
            "_Test Company",
            "enabled":
            1,
            "default_customer_group":
            "_Test Customer Group",
            "price_list":
            "_Test Price List India"
        })
        frappe.local.shopping_cart_settings = None
示例#14
0
 def tearDown(self):
     frappe.get_cached_doc("Website Item", {
         "item_code": "Test Mobile Phone"
     }).delete()
     setup_e_commerce_settings({"enable_reviews": 0})