Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

180 rindas
6.6 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import unittest
  5. import frappe
  6. from frappe.utils import evaluate_filters, money_in_words, scrub_urls, get_url
  7. from frappe.utils import validate_url, validate_email_address
  8. from frappe.utils import ceil, floor
  9. from PIL import Image
  10. from frappe.utils.image import strip_exif_data
  11. import io
  12. class TestFilters(unittest.TestCase):
  13. def test_simple_dict(self):
  14. self.assertTrue(evaluate_filters({'doctype': 'User', 'status': 'Open'}, {'status': 'Open'}))
  15. self.assertFalse(evaluate_filters({'doctype': 'User', 'status': 'Open'}, {'status': 'Closed'}))
  16. def test_multiple_dict(self):
  17. self.assertTrue(evaluate_filters({'doctype': 'User', 'status': 'Open', 'name': 'Test 1'},
  18. {'status': 'Open', 'name':'Test 1'}))
  19. self.assertFalse(evaluate_filters({'doctype': 'User', 'status': 'Open', 'name': 'Test 1'},
  20. {'status': 'Closed', 'name': 'Test 1'}))
  21. def test_list_filters(self):
  22. self.assertTrue(evaluate_filters({'doctype': 'User', 'status': 'Open', 'name': 'Test 1'},
  23. [{'status': 'Open'}, {'name':'Test 1'}]))
  24. self.assertFalse(evaluate_filters({'doctype': 'User', 'status': 'Open', 'name': 'Test 1'},
  25. [{'status': 'Open'}, {'name':'Test 2'}]))
  26. def test_list_filters_as_list(self):
  27. self.assertTrue(evaluate_filters({'doctype': 'User', 'status': 'Open', 'name': 'Test 1'},
  28. [['status', '=', 'Open'], ['name', '=', 'Test 1']]))
  29. self.assertFalse(evaluate_filters({'doctype': 'User', 'status': 'Open', 'name': 'Test 1'},
  30. [['status', '=', 'Open'], ['name', '=', 'Test 2']]))
  31. def test_lt_gt(self):
  32. self.assertTrue(evaluate_filters({'doctype': 'User', 'status': 'Open', 'age': 20},
  33. {'status': 'Open', 'age': ('>', 10)}))
  34. self.assertFalse(evaluate_filters({'doctype': 'User', 'status': 'Open', 'age': 20},
  35. {'status': 'Open', 'age': ('>', 30)}))
  36. class TestMoney(unittest.TestCase):
  37. def test_money_in_words(self):
  38. nums_bhd = [
  39. (5000, "BHD Five Thousand only."), (5000.0, "BHD Five Thousand only."),
  40. (0.1, "One Hundred Fils only."), (0, "BHD Zero only."), ("Fail", "")
  41. ]
  42. nums_ngn = [
  43. (5000, "NGN Five Thousand only."), (5000.0, "NGN Five Thousand only."),
  44. (0.1, "Ten Kobo only."), (0, "NGN Zero only."), ("Fail", "")
  45. ]
  46. for num in nums_bhd:
  47. self.assertEqual(
  48. money_in_words(num[0], "BHD"),
  49. num[1],
  50. "{0} is not the same as {1}".format(money_in_words(num[0], "BHD"), num[1])
  51. )
  52. for num in nums_ngn:
  53. self.assertEqual(
  54. money_in_words(num[0], "NGN"), num[1],
  55. "{0} is not the same as {1}".format(money_in_words(num[0], "NGN"), num[1])
  56. )
  57. class TestDataManipulation(unittest.TestCase):
  58. def test_scrub_urls(self):
  59. html = '''
  60. <p>You have a new message from: <b>John</b></p>
  61. <p>Hey, wassup!</p>
  62. <div class="more-info">
  63. <a href="http://test.com">Test link 1</a>
  64. <a href="/about">Test link 2</a>
  65. <a href="login">Test link 3</a>
  66. <img src="/assets/frappe/test.jpg">
  67. </div>
  68. <div style="background-image: url('/assets/frappe/bg.jpg')">
  69. Please mail us at <a href="mailto:test@example.com">email</a>
  70. </div>
  71. '''
  72. html = scrub_urls(html)
  73. url = get_url()
  74. self.assertTrue('<a href="http://test.com">Test link 1</a>' in html)
  75. self.assertTrue('<a href="{0}/about">Test link 2</a>'.format(url) in html)
  76. self.assertTrue('<a href="{0}/login">Test link 3</a>'.format(url) in html)
  77. self.assertTrue('<img src="{0}/assets/frappe/test.jpg">'.format(url) in html)
  78. self.assertTrue('style="background-image: url(\'{0}/assets/frappe/bg.jpg\') !important"'.format(url) in html)
  79. self.assertTrue('<a href="mailto:test@example.com">email</a>' in html)
  80. class TestMathUtils(unittest.TestCase):
  81. def test_floor(self):
  82. from decimal import Decimal
  83. self.assertEqual(floor(2), 2)
  84. self.assertEqual(floor(12.32904), 12)
  85. self.assertEqual(floor(22.7330), 22)
  86. self.assertEqual(floor('24.7'), 24)
  87. self.assertEqual(floor('26.7'), 26)
  88. self.assertEqual(floor(Decimal(29.45)), 29)
  89. def test_ceil(self):
  90. from decimal import Decimal
  91. self.assertEqual(ceil(2), 2)
  92. self.assertEqual(ceil(12.32904), 13)
  93. self.assertEqual(ceil(22.7330), 23)
  94. self.assertEqual(ceil('24.7'), 25)
  95. self.assertEqual(ceil('26.7'), 27)
  96. self.assertEqual(ceil(Decimal(29.45)), 30)
  97. class TestHTMLUtils(unittest.TestCase):
  98. def test_clean_email_html(self):
  99. from frappe.utils.html_utils import clean_email_html
  100. sample = '''<script>a=b</script><h1>Hello</h1><p>Para</p>'''
  101. clean = clean_email_html(sample)
  102. self.assertFalse('<script>' in clean)
  103. self.assertTrue('<h1>Hello</h1>' in clean)
  104. sample = '''<style>body { font-family: Arial }</style><h1>Hello</h1><p>Para</p>'''
  105. clean = clean_email_html(sample)
  106. self.assertFalse('<style>' in clean)
  107. self.assertTrue('<h1>Hello</h1>' in clean)
  108. sample = '''<h1>Hello</h1><p>Para</p><a href="http://test.com">text</a>'''
  109. clean = clean_email_html(sample)
  110. self.assertTrue('<h1>Hello</h1>' in clean)
  111. self.assertTrue('<a href="http://test.com">text</a>' in clean)
  112. class TestValidationUtils(unittest.TestCase):
  113. def test_valid_url(self):
  114. # Edge cases
  115. self.assertFalse(validate_url(''))
  116. self.assertFalse(validate_url(None))
  117. # Valid URLs
  118. self.assertTrue(validate_url('https://google.com'))
  119. self.assertTrue(validate_url('https://frappe.io', throw=True))
  120. # Invalid URLs without throw
  121. self.assertFalse(validate_url('google.io'))
  122. self.assertFalse(validate_url('google.io'))
  123. # Invalid URL with throw
  124. self.assertRaises(frappe.ValidationError, validate_url, 'frappe', throw=True)
  125. def test_valid_email(self):
  126. # Edge cases
  127. self.assertFalse(validate_email_address(''))
  128. self.assertFalse(validate_email_address(None))
  129. # Valid addresses
  130. self.assertTrue(validate_email_address('someone@frappe.com'))
  131. self.assertTrue(validate_email_address('someone@frappe.com, anyone@frappe.io'))
  132. # Invalid address
  133. self.assertFalse(validate_email_address('someone'))
  134. self.assertFalse(validate_email_address('someone@----.com'))
  135. # Invalid with throw
  136. self.assertRaises(
  137. frappe.InvalidEmailAddressError,
  138. validate_email_address,
  139. 'someone.com',
  140. throw=True
  141. )
  142. class TestImage(unittest.TestCase):
  143. def test_strip_exif_data(self):
  144. original_image = Image.open("../apps/frappe/frappe/tests/data/exif_sample_image.jpg")
  145. original_image_content = io.open("../apps/frappe/frappe/tests/data/exif_sample_image.jpg", mode='rb').read()
  146. new_image_content = strip_exif_data(original_image_content, "image/jpeg")
  147. new_image = Image.open(io.BytesIO(new_image_content))
  148. self.assertEqual(new_image._getexif(), None)
  149. self.assertNotEqual(original_image._getexif(), new_image._getexif())