From 8981405a6213a6a8a9574f181064f8eac8ec9550 Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 20 Apr 2022 18:50:47 +0530 Subject: [PATCH] test: Field filter validation and Custom field as field filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- .../test_e_commerce_settings.py | 46 +++++++----------- .../test_product_data_engine.py | 48 +++++++++++++++++++ 2 files changed, 65 insertions(+), 29 deletions(-) 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 c4c958bd44..1f461c8c16 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 @@ from erpnext.e_commerce.doctype.e_commerce_settings.e_commerce_settings import ( 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 ab958d1486..c3b6ed5da2 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 @@ class TestProductDataEngine(unittest.TestCase): # 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."