# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE import io import json import os import unittest from datetime import date, datetime, time, timedelta from decimal import Decimal from enum import Enum from mimetypes import guess_type from unittest.mock import patch import pytz from PIL import Image import frappe from frappe.installer import parse_app_name from frappe.utils import ( ceil, evaluate_filters, floor, format_timedelta, get_bench_path, get_url, money_in_words, parse_timedelta, scrub_urls, validate_email_address, validate_url, ) from frappe.utils.data import ( cast, get_time, get_timedelta, now_datetime, nowtime, validate_python_code, ) from frappe.utils.diff import _get_value_from_version, get_version_diff, version_query from frappe.utils.image import optimize_image, strip_exif_data from frappe.utils.response import json_handler class TestFilters(unittest.TestCase): def test_simple_dict(self): self.assertTrue(evaluate_filters({"doctype": "User", "status": "Open"}, {"status": "Open"})) self.assertFalse(evaluate_filters({"doctype": "User", "status": "Open"}, {"status": "Closed"})) def test_multiple_dict(self): self.assertTrue( evaluate_filters( {"doctype": "User", "status": "Open", "name": "Test 1"}, {"status": "Open", "name": "Test 1"} ) ) self.assertFalse( evaluate_filters( {"doctype": "User", "status": "Open", "name": "Test 1"}, {"status": "Closed", "name": "Test 1"} ) ) def test_list_filters(self): self.assertTrue( evaluate_filters( {"doctype": "User", "status": "Open", "name": "Test 1"}, [{"status": "Open"}, {"name": "Test 1"}], ) ) self.assertFalse( evaluate_filters( {"doctype": "User", "status": "Open", "name": "Test 1"}, [{"status": "Open"}, {"name": "Test 2"}], ) ) def test_list_filters_as_list(self): self.assertTrue( evaluate_filters( {"doctype": "User", "status": "Open", "name": "Test 1"}, [["status", "=", "Open"], ["name", "=", "Test 1"]], ) ) self.assertFalse( evaluate_filters( {"doctype": "User", "status": "Open", "name": "Test 1"}, [["status", "=", "Open"], ["name", "=", "Test 2"]], ) ) def test_lt_gt(self): self.assertTrue( evaluate_filters( {"doctype": "User", "status": "Open", "age": 20}, {"status": "Open", "age": (">", 10)} ) ) self.assertFalse( evaluate_filters( {"doctype": "User", "status": "Open", "age": 20}, {"status": "Open", "age": (">", 30)} ) ) class TestMoney(unittest.TestCase): def test_money_in_words(self): nums_bhd = [ (5000, "BHD Five Thousand only."), (5000.0, "BHD Five Thousand only."), (0.1, "One Hundred Fils only."), (0, "BHD Zero only."), ("Fail", ""), ] nums_ngn = [ (5000, "NGN Five Thousand only."), (5000.0, "NGN Five Thousand only."), (0.1, "Ten Kobo only."), (0, "NGN Zero only."), ("Fail", ""), ] for num in nums_bhd: self.assertEqual( money_in_words(num[0], "BHD"), num[1], "{0} is not the same as {1}".format(money_in_words(num[0], "BHD"), num[1]), ) for num in nums_ngn: self.assertEqual( money_in_words(num[0], "NGN"), num[1], "{0} is not the same as {1}".format(money_in_words(num[0], "NGN"), num[1]), ) class TestDataManipulation(unittest.TestCase): def test_scrub_urls(self): html = """

You have a new message from: John

Hey, wassup!

Test link 1 Test link 2 Test link 3
Please mail us at email
""" html = scrub_urls(html) url = get_url() self.assertTrue('Test link 1' in html) self.assertTrue('Test link 2'.format(url) in html) self.assertTrue('Test link 3'.format(url) in html) self.assertTrue(''.format(url) in html) self.assertTrue( "style=\"background-image: url('{0}/assets/frappe/bg.jpg') !important\"".format(url) in html ) self.assertTrue('email' in html) class TestFieldCasting(unittest.TestCase): def test_str_types(self): STR_TYPES = ( "Data", "Text", "Small Text", "Long Text", "Text Editor", "Select", "Link", "Dynamic Link", ) for fieldtype in STR_TYPES: self.assertIsInstance(cast(fieldtype, value=None), str) self.assertIsInstance(cast(fieldtype, value="12-12-2021"), str) self.assertIsInstance(cast(fieldtype, value=""), str) self.assertIsInstance(cast(fieldtype, value=[]), str) self.assertIsInstance(cast(fieldtype, value=set()), str) def test_float_types(self): FLOAT_TYPES = ("Currency", "Float", "Percent") for fieldtype in FLOAT_TYPES: self.assertIsInstance(cast(fieldtype, value=None), float) self.assertIsInstance(cast(fieldtype, value=1.12), float) self.assertIsInstance(cast(fieldtype, value=112), float) def test_int_types(self): INT_TYPES = ("Int", "Check") for fieldtype in INT_TYPES: self.assertIsInstance(cast(fieldtype, value=None), int) self.assertIsInstance(cast(fieldtype, value=1.12), int) self.assertIsInstance(cast(fieldtype, value=112), int) def test_datetime_types(self): self.assertIsInstance(cast("Datetime", value=None), datetime) self.assertIsInstance(cast("Datetime", value="12-2-22"), datetime) def test_date_types(self): self.assertIsInstance(cast("Date", value=None), date) self.assertIsInstance(cast("Date", value="12-12-2021"), date) def test_time_types(self): self.assertIsInstance(cast("Time", value=None), timedelta) self.assertIsInstance(cast("Time", value="12:03:34"), timedelta) class TestMathUtils(unittest.TestCase): def test_floor(self): from decimal import Decimal self.assertEqual(floor(2), 2) self.assertEqual(floor(12.32904), 12) self.assertEqual(floor(22.7330), 22) self.assertEqual(floor("24.7"), 24) self.assertEqual(floor("26.7"), 26) self.assertEqual(floor(Decimal(29.45)), 29) def test_ceil(self): from decimal import Decimal self.assertEqual(ceil(2), 2) self.assertEqual(ceil(12.32904), 13) self.assertEqual(ceil(22.7330), 23) self.assertEqual(ceil("24.7"), 25) self.assertEqual(ceil("26.7"), 27) self.assertEqual(ceil(Decimal(29.45)), 30) class TestHTMLUtils(unittest.TestCase): def test_clean_email_html(self): from frappe.utils.html_utils import clean_email_html sample = """

Hello

Para

""" clean = clean_email_html(sample) self.assertFalse("