From 5b2dbfe007726facc68ec4bd21d5effa8925efdf Mon Sep 17 00:00:00 2001 From: Harry Marr Date: Sun, 28 Feb 2010 18:25:40 +0000 Subject: [PATCH] Added tests for URLField and DecimalField --- mongoengine/fields.py | 21 +++++++++++++++++---- tests/fields.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 6bca1b2a..585a8cad 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -57,23 +57,36 @@ class StringField(BaseField): value = re.compile(regex % value, flags) return value + class URLField(StringField): """A field that validates input as a URL. """ - def __init__(self, verify_exists=True, **kwargs): + URL_REGEX = re.compile( + r'^https?://' + r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' + r'localhost|' + r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' + r'(?::\d+)?' + r'(?:/?|[/?]\S+)$', re.IGNORECASE + ) + + def __init__(self, verify_exists=False, **kwargs): self.verify_exists = verify_exists super(URLField, self).__init__(**kwargs) def validate(self, value): - import urllib2 + if not URLField.URL_REGEX.match(value): + raise ValidationError('Invalid URL: %s' % value) if self.verify_exists: + import urllib2 try: request = urllib2.Request(value) response = urllib2.urlopen(request) except Exception, e: - raise ValidationError('This URL appears to be invalid: %s' % e) + message = 'This URL appears to be a broken link: %s' % e + raise ValidationError(message) class IntField(BaseField): @@ -148,7 +161,7 @@ class DecimalField(BaseField): if self.min_value is not None and value < self.min_value: raise ValidationError('Decimal value is too small') - if self.max_value is not None and vale > self.max_value: + if self.max_value is not None and value > self.max_value: raise ValidationError('Decimal value is too large') diff --git a/tests/fields.py b/tests/fields.py index 97e5b4e8..388bc102 100644 --- a/tests/fields.py +++ b/tests/fields.py @@ -79,6 +79,19 @@ class FieldTest(unittest.TestCase): person.name = 'Shorter name' person.validate() + + def test_url_validation(self): + """Ensure that URLFields validate urls properly. + """ + class Link(Document): + url = URLField() + + link = Link() + link.url = 'google' + self.assertRaises(ValidationError, link.validate) + + link.url = 'http://www.google.com:8080' + link.validate() def test_int_validation(self): """Ensure that invalid values cannot be assigned to int fields. @@ -114,6 +127,26 @@ class FieldTest(unittest.TestCase): person.height = 4.0 self.assertRaises(ValidationError, person.validate) + def test_decimal_validation(self): + """Ensure that invalid values cannot be assigned to decimal fields. + """ + class Person(Document): + height = DecimalField(min_value=Decimal('0.1'), + max_value=Decimal('3.5')) + + person = Person() + person.height = Decimal('1.89') + person.validate() + + person.height = '2.0' + person.validate() + person.height = 0.01 + self.assertRaises(ValidationError, person.validate) + person.height = Decimal('0.01') + self.assertRaises(ValidationError, person.validate) + person.height = Decimal('4.0') + self.assertRaises(ValidationError, person.validate) + def test_boolean_validation(self): """Ensure that invalid values cannot be assigned to boolean fields. """