test: Field filter validation and Custom field as field filter
- Test to block Item fields (which aren’t in Website Item) in E Commerce Settings as filters
- Removed unnecessary function and setup in E Commerce Settings test
- Removed commented useless test
- Test to check custom field as filter
diff --git a/erpnext/e_commerce/doctype/e_commerce_settings/test_e_commerce_settings.py b/erpnext/e_commerce/doctype/e_commerce_settings/test_e_commerce_settings.py
index c4c958b..1f461c8 100644
--- a/erpnext/e_commerce/doctype/e_commerce_settings/test_e_commerce_settings.py
+++ b/erpnext/e_commerce/doctype/e_commerce_settings/test_e_commerce_settings.py
@@ -1,5 +1,4 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors
+# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
import unittest
@@ -11,44 +10,33 @@
class TestECommerceSettings(unittest.TestCase):
- def setUp(self):
- frappe.db.sql("""delete from `tabSingles` where doctype="Shipping Cart Settings" """)
-
- def get_cart_settings(self):
- return frappe.get_doc({"doctype": "E Commerce Settings", "company": "_Test Company"})
-
- # NOTE: Exchangrate API has all enabled currencies that ERPNext supports.
- # We aren't checking just currency exchange record anymore
- # while validating price list currency exchange rate to that of company.
- # The API is being used to fetch the rate which again almost always
- # gives back a valid value (for valid currencies).
- # This makes the test obsolete.
- # Commenting because im not sure if there's a better test we can write
-
- # def test_exchange_rate_exists(self):
- # frappe.db.sql("""delete from `tabCurrency Exchange`""")
-
- # cart_settings = self.get_cart_settings()
- # cart_settings.price_list = "_Test Price List Rest of the World"
- # self.assertRaises(ShoppingCartSetupError, cart_settings.validate_exchange_rates_exist)
-
- # from erpnext.setup.doctype.currency_exchange.test_currency_exchange import (
- # test_records as currency_exchange_records,
- # )
- # frappe.get_doc(currency_exchange_records[0]).insert()
- # cart_settings.validate_exchange_rates_exist()
+ def tearDown(self):
+ frappe.db.rollback()
def test_tax_rule_validation(self):
frappe.db.sql("update `tabTax Rule` set use_for_shopping_cart = 0")
frappe.db.commit() # nosemgrep
- cart_settings = self.get_cart_settings()
+ cart_settings = frappe.get_doc("E Commerce Settings")
cart_settings.enabled = 1
if not frappe.db.get_value("Tax Rule", {"use_for_shopping_cart": 1}, "name"):
self.assertRaises(ShoppingCartSetupError, cart_settings.validate_tax_rule)
frappe.db.sql("update `tabTax Rule` set use_for_shopping_cart = 1")
+ def test_invalid_filter_fields(self):
+ "Check if Item fields are blocked in E Commerce Settings filter fields."
+ from frappe.custom.doctype.custom_field.custom_field import create_custom_field
+
+ create_custom_field(
+ "Item",
+ dict(owner="Administrator", fieldname="test_data", label="Test", fieldtype="Data"),
+ )
+ settings = frappe.get_doc("E Commerce Settings")
+ settings.append("filter_fields", {"fieldname": "test_data"})
+
+ self.assertRaises(frappe.ValidationError, settings.save)
+
def setup_e_commerce_settings(values_dict):
"Accepts a dict of values that updates E Commerce Settings."
diff --git a/erpnext/e_commerce/product_data_engine/test_product_data_engine.py b/erpnext/e_commerce/product_data_engine/test_product_data_engine.py
index ab958d1..c3b6ed5 100644
--- a/erpnext/e_commerce/product_data_engine/test_product_data_engine.py
+++ b/erpnext/e_commerce/product_data_engine/test_product_data_engine.py
@@ -277,6 +277,54 @@
# tear down
setup_e_commerce_settings({"enable_attribute_filters": 1, "hide_variants": 0})
+ def test_custom_field_as_filter(self):
+ "Test if custom field functions as filter correctly."
+ from frappe.custom.doctype.custom_field.custom_field import create_custom_field
+
+ create_custom_field(
+ "Website Item",
+ dict(
+ owner="Administrator",
+ fieldname="supplier",
+ label="Supplier",
+ fieldtype="Link",
+ options="Supplier",
+ insert_after="on_backorder",
+ ),
+ )
+
+ frappe.db.set_value(
+ "Website Item", {"item_code": "Test 11I Laptop"}, "supplier", "_Test Supplier"
+ )
+ frappe.db.set_value(
+ "Website Item", {"item_code": "Test 12I Laptop"}, "supplier", "_Test Supplier 1"
+ )
+
+ settings = frappe.get_doc("E Commerce Settings")
+ settings.append("filter_fields", {"fieldname": "supplier"})
+ settings.save()
+
+ filter_engine = ProductFiltersBuilder()
+ field_filters = filter_engine.get_field_filters()
+ custom_filter = field_filters[1]
+ filter_values = custom_filter[1]
+
+ self.assertEqual(custom_filter[0].options, "Supplier")
+ self.assertEqual(len(filter_values), 2)
+ self.assertIn("_Test Supplier", filter_values)
+
+ # test if custom filter works in query
+ field_filters = {"supplier": "_Test Supplier 1"}
+ engine = ProductQuery()
+ result = engine.query(
+ attributes={}, fields=field_filters, search_term=None, start=0, item_group=None
+ )
+ items = result.get("items")
+
+ # check if only 'Raw Material' are fetched in the right order
+ self.assertEqual(len(items), 1)
+ self.assertEqual(items[0].get("item_code"), "Test 12I Laptop")
+
def create_variant_web_item():
"Create Variant and Template Website Items."