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")
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")
def setUpClass(cls): setup_e_commerce_settings({ "company": "_Test Company", "enabled": 1, "default_customer_group": "_Test Customer Group", "price_list": "_Test Price List India", })
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")
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")
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
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()
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()
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()
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
def tearDown(self): frappe.get_cached_doc("Website Item", { "item_code": "Test Mobile Phone" }).delete() setup_e_commerce_settings({"enable_reviews": 0})