Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: added is_mailto validator #18

Merged
merged 3 commits into from
Sep 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ build
py.validator.egg-info
*.pyc
*.tmp
pyvalidatorenv
1 change: 1 addition & 0 deletions pyvalidator/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,6 @@
from pyvalidator.is_aws_arn import is_aws_arn
from pyvalidator.is_license_plate import is_license_plate
from pyvalidator.is_magnet_uri import is_magnet_uri
from pyvalidator.is_mailto import is_mailto
from pyvalidator.is_mime_type import is_mime_type
from pyvalidator.is_iso6391 import is_iso6391
20 changes: 20 additions & 0 deletions pyvalidator/is_mailto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from .utils.assert_string import assert_string
import re

def is_mailto(input):
input = assert_string(input)
"""
The function checks if a given string is a valid mailto link with one or more email addresses
separated by commas.

:param input: The input string that needs to be checked if it is a valid mailto link or not. A mailto
link is a hyperlink that opens the user's email client and pre-fills the "To" field with an email
address. The link starts with "mailto:" followed by one or more email addresses separated by commas.
:return: a boolean value (True or False) depending on whether the input string matches the
specified pattern and contains at least one comma-separated email address.
"""
pattern = r'^mailto:([\w.-]+@[\w.-]+\.\w+)(?:,([\w.-]+@[\w.-]+\.\w+))*\??(subject=([\w%]+))?(?:(&)?cc=([\w.-]+@[\w.-]+\.\w+))?(?:(&)?bcc=([\w.-]+@[\w.-]+\.\w+))?(?:(&)?body=([\w,\.\-\_%]+))?$'
if re.match(pattern, input):
return True
return False

2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
readme = f.read()

MAJOR = 0
MINOR = 18
MINOR = 19
PATCH = 0

VERSION = '{}.{}.{}'.format(MAJOR, MINOR, PATCH)
Expand Down
110 changes: 110 additions & 0 deletions test/test_is_mailto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import unittest
from pyvalidator.is_mailto import is_mailto
from . import print_test_ok

class TestIsValidMailtoLink(unittest.TestCase):

def test_valid_mailto_link_with_single_email(self):
link = "mailto:john@example.com"
result = is_mailto(link)
self.assertTrue(result)

def test_valid_mailto_link_with_multiple_emails(self):
link = "mailto:john@example.com,jane@example.com,jake@example.com"
result = is_mailto(link)
self.assertTrue(result)

def test_invalid_mailto_link_missing_mailto_prefix(self):
link = "john@example.com"
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_missing_email(self):
link = "mailto:"
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_no_comma_separator(self):
link = "mailto:john@example.com jane@example.com"
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_invalid_email_format(self):
link = "mailto:john@example.com, jane@example,com"
result = is_mailto(link)
self.assertFalse(result)

def test_valid_mailto_link_for_multiple_emails(self):
link = "mailto:asd@asd.asd,asd@asd.de"
result = is_mailto(link)
self.assertTrue(result)

def test_invalid_mailto_link_for_multiple_emails_with_no_space_between(self):
link = "mailto:asd@asd.asd, asd@asd.de"
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_contains_special_characters(self):
link = "mailto:alice@example.com?subject=Meeting^Agenda"
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_contains_incomplete_subject(self):
link = "mailto:jane.smith@example.com?subject="
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_missing_monkey_char(self):
link = "mailto:john.doeexample.com"
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_missing_mailto(self):
link = "john.doe@example.com"
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_invalid_email(self):
link = "mailto:invalid-email"
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_incorect_parameter_name(self):
link = "mailto:jane.smith@example.com?subj=Meeting%20Agenda"
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_missing_email_address(self):
link = "mailto:?subject=Feedback"
result = is_mailto(link)
self.assertFalse(result)

def test_invalid_mailto_link_unencoded_chars(self):
link = "mailto:alice@example.com?subject=Meeting Agenda&body=Please%20bring*%20the%20documents"
result = is_mailto(link)
self.assertFalse(result)

def test_valid_mailto_link_for_multiple_emails_with_params(self):
link = "mailto:alice@example.com,bob@example.com,carol@example.com?subject=Project%20Team"
result = is_mailto(link)
self.assertTrue(result)

def test_valid_mailto_link_with_cc_and_bcc(self):
link = "mailto:support@example.com?cc=admin@example.com&bcc=manager@example.com"
result = is_mailto(link)
self.assertTrue(result)

def test_valid_mailto_link_with_cc(self):
link = "mailto:support@example.com?cc=admin@example.com"
result = is_mailto(link)
self.assertTrue(result)

def test_valid_mailto_link_with_bcc(self):
link = "mailto:support@example.com?bcc=admin@example.com"
result = is_mailto(link)
self.assertTrue(result)

def test_valid_mailto_link_with_bcc(self):
link = "mailto:feedback@example.com?body=Dear%20Support,%0AI%20have%20a%20question%20about%20your%20product."
result = is_mailto(link)
self.assertTrue(result)
4 changes: 2 additions & 2 deletions test/test_is_mobile_number.py
Original file line number Diff line number Diff line change
Expand Up @@ -2555,7 +2555,7 @@ def test_invalid_mobile_numbers(self):
invalid_numbers = fixture['invalid']
for number in invalid_numbers:
self.assertFalse(is_mobile_number(number, locale))
print_test_ok(r'for locale {locale}')
print_test_ok(f'for locale {locale}')

def test_valid_mobile_numbers_locale_any_explicite(self):
valid_numbers = [
Expand Down Expand Up @@ -2607,7 +2607,7 @@ def test_invalid_mobile_numbers_strict_mode(self):
]
for number in valid_numbers:
self.assertFalse(is_mobile_number(number, 'any', { "strict_mode": True }))
print_test_ok(r', number: {number}')
print_test_ok(f', number: {number}')

def test_throw_moboile_number_validation_for_bad_locale(self):
self.assertRaises(Exception, is_mobile_number, ['+381638730746', 'BAD'])
Expand Down
Loading