Added Doc class and pk to Validation messages (#69)

This commit is contained in:
Ross Lawley 2013-01-28 12:05:09 +00:00
parent 0ea363c7fc
commit 9d9a4afee9
4 changed files with 161 additions and 144 deletions

View File

@ -42,6 +42,7 @@ Changes in 0.8.X
- Added no_dereference method for querysets (#82) (#61) - Added no_dereference method for querysets (#82) (#61)
- Undefined data should not override instance methods (#49) - Undefined data should not override instance methods (#49)
- Added Django Group and Permission (#142) - Added Django Group and Permission (#142)
- Added Doc class and pk to Validation messages (#69)
Changes in 0.7.9 Changes in 0.7.9
================ ================

View File

@ -274,7 +274,13 @@ class BaseDocument(object):
field_name=field.name) field_name=field.name)
if errors: if errors:
raise ValidationError('ValidationError', errors=errors) pk = "None"
if hasattr(self, 'pk'):
pk = self.pk
elif self._instance:
pk = self._instance.pk
message = "ValidationError (%s:%s) " % (self._class_name, pk)
raise ValidationError(message, errors=errors)
def to_json(self): def to_json(self):
"""Converts a document to JSON""" """Converts a document to JSON"""

View File

@ -466,45 +466,6 @@ class InstanceTest(unittest.TestCase):
doc = Doc.objects.get() doc = Doc.objects.get()
self.assertEqual(doc, doc.embedded_field[0]._instance) self.assertEqual(doc, doc.embedded_field[0]._instance)
def test_embedded_document_validation(self):
"""Ensure that embedded documents may be validated.
"""
class Comment(EmbeddedDocument):
date = DateTimeField()
content = StringField(required=True)
comment = Comment()
self.assertRaises(ValidationError, comment.validate)
comment.content = 'test'
comment.validate()
comment.date = 4
self.assertRaises(ValidationError, comment.validate)
comment.date = datetime.now()
comment.validate()
self.assertEqual(comment._instance, None)
def test_embedded_db_field_validate(self):
class SubDoc(EmbeddedDocument):
val = IntField()
class Doc(Document):
e = EmbeddedDocumentField(SubDoc, db_field='eb')
Doc.drop_collection()
Doc(e=SubDoc(val=15)).save()
doc = Doc.objects.first()
doc.validate()
keys = doc._data.keys()
self.assertEqual(2, len(keys))
self.assertTrue('id' in keys)
self.assertTrue('e' in keys)
def test_document_clean(self): def test_document_clean(self):
class TestDocument(Document): class TestDocument(Document):
status = StringField() status = StringField()
@ -2001,5 +1962,103 @@ class InstanceTest(unittest.TestCase):
self.assertEqual("Bar", user._data["foo"]) self.assertEqual("Bar", user._data["foo"])
self.assertEqual([1, 2, 3], user._data["data"]) self.assertEqual([1, 2, 3], user._data["data"])
def test_spaces_in_keys(self):
class Embedded(DynamicEmbeddedDocument):
pass
class Doc(DynamicDocument):
pass
Doc.drop_collection()
doc = Doc()
setattr(doc, 'hello world', 1)
doc.save()
one = Doc.objects.filter(**{'hello world': 1}).count()
self.assertEqual(1, one)
def test_shard_key(self):
class LogEntry(Document):
machine = StringField()
log = StringField()
meta = {
'shard_key': ('machine',)
}
LogEntry.drop_collection()
log = LogEntry()
log.machine = "Localhost"
log.save()
log.log = "Saving"
log.save()
def change_shard_key():
log.machine = "127.0.0.1"
self.assertRaises(OperationError, change_shard_key)
def test_shard_key_primary(self):
class LogEntry(Document):
machine = StringField(primary_key=True)
log = StringField()
meta = {
'shard_key': ('machine',)
}
LogEntry.drop_collection()
log = LogEntry()
log.machine = "Localhost"
log.save()
log.log = "Saving"
log.save()
def change_shard_key():
log.machine = "127.0.0.1"
self.assertRaises(OperationError, change_shard_key)
def test_kwargs_simple(self):
class Embedded(EmbeddedDocument):
name = StringField()
class Doc(Document):
doc_name = StringField()
doc = EmbeddedDocumentField(Embedded)
classic_doc = Doc(doc_name="my doc", doc=Embedded(name="embedded doc"))
dict_doc = Doc(**{"doc_name": "my doc",
"doc": {"name": "embedded doc"}})
self.assertEqual(classic_doc, dict_doc)
self.assertEqual(classic_doc._data, dict_doc._data)
def test_kwargs_complex(self):
class Embedded(EmbeddedDocument):
name = StringField()
class Doc(Document):
doc_name = StringField()
docs = ListField(EmbeddedDocumentField(Embedded))
classic_doc = Doc(doc_name="my doc", docs=[
Embedded(name="embedded doc1"),
Embedded(name="embedded doc2")])
dict_doc = Doc(**{"doc_name": "my doc",
"docs": [{"name": "embedded doc1"},
{"name": "embedded doc2"}]})
self.assertEqual(classic_doc, dict_doc)
self.assertEqual(classic_doc._data, dict_doc._data)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -3,6 +3,7 @@ import sys
sys.path[0:0] = [""] sys.path[0:0] = [""]
import unittest import unittest
from datetime import datetime
from mongoengine import * from mongoengine import *
@ -11,6 +12,9 @@ __all__ = ("ValidatorErrorTest",)
class ValidatorErrorTest(unittest.TestCase): class ValidatorErrorTest(unittest.TestCase):
def setUp(self):
connect(db='mongoenginetest')
def test_to_dict(self): def test_to_dict(self):
"""Ensure a ValidationError handles error to_dict correctly. """Ensure a ValidationError handles error to_dict correctly.
""" """
@ -57,25 +61,19 @@ class ValidatorErrorTest(unittest.TestCase):
try: try:
User().validate() User().validate()
except ValidationError, e: except ValidationError, e:
self.assertTrue("User:None" in e.message)
self.assertEqual(e.to_dict(), { self.assertEqual(e.to_dict(), {
'username': 'Field is required', 'username': 'Field is required',
'name': 'Field is required'}) 'name': 'Field is required'})
def test_spaces_in_keys(self): user = User(username="RossC0", name="Ross").save()
user.name = None
class Embedded(DynamicEmbeddedDocument): try:
pass user.save()
except ValidationError, e:
class Doc(DynamicDocument): self.assertTrue("User:RossC0" in e.message)
pass self.assertEqual(e.to_dict(), {
'name': 'Field is required'})
Doc.drop_collection()
doc = Doc()
setattr(doc, 'hello world', 1)
doc.save()
one = Doc.objects.filter(**{'hello world': 1}).count()
self.assertEqual(1, one)
def test_fields_rewrite(self): def test_fields_rewrite(self):
class BasePerson(Document): class BasePerson(Document):
@ -89,107 +87,60 @@ class ValidatorErrorTest(unittest.TestCase):
p = Person(age=15) p = Person(age=15)
self.assertRaises(ValidationError, p.validate) self.assertRaises(ValidationError, p.validate)
def test_cascaded_save_wrong_reference(self): def test_embedded_document_validation(self):
"""Ensure that embedded documents may be validated.
"""
class Comment(EmbeddedDocument):
date = DateTimeField()
content = StringField(required=True)
class ADocument(Document): comment = Comment()
val = IntField() self.assertRaises(ValidationError, comment.validate)
class BDocument(Document): comment.content = 'test'
a = ReferenceField(ADocument) comment.validate()
ADocument.drop_collection() comment.date = 4
BDocument.drop_collection() self.assertRaises(ValidationError, comment.validate)
a = ADocument() comment.date = datetime.now()
a.val = 15 comment.validate()
a.save() self.assertEqual(comment._instance, None)
b = BDocument() def test_embedded_db_field_validate(self):
b.a = a
b.save()
a.delete() class SubDoc(EmbeddedDocument):
val = IntField(required=True)
b = BDocument.objects.first()
b.save(cascade=True)
def test_shard_key(self):
class LogEntry(Document):
machine = StringField()
log = StringField()
meta = {
'shard_key': ('machine',)
}
LogEntry.drop_collection()
log = LogEntry()
log.machine = "Localhost"
log.save()
log.log = "Saving"
log.save()
def change_shard_key():
log.machine = "127.0.0.1"
self.assertRaises(OperationError, change_shard_key)
def test_shard_key_primary(self):
class LogEntry(Document):
machine = StringField(primary_key=True)
log = StringField()
meta = {
'shard_key': ('machine',)
}
LogEntry.drop_collection()
log = LogEntry()
log.machine = "Localhost"
log.save()
log.log = "Saving"
log.save()
def change_shard_key():
log.machine = "127.0.0.1"
self.assertRaises(OperationError, change_shard_key)
def test_kwargs_simple(self):
class Embedded(EmbeddedDocument):
name = StringField()
class Doc(Document): class Doc(Document):
doc_name = StringField() id = StringField(primary_key=True)
doc = EmbeddedDocumentField(Embedded) e = EmbeddedDocumentField(SubDoc, db_field='eb')
classic_doc = Doc(doc_name="my doc", doc=Embedded(name="embedded doc")) try:
dict_doc = Doc(**{"doc_name": "my doc", Doc(id="bad").validate()
"doc": {"name": "embedded doc"}}) except ValidationError, e:
self.assertTrue("SubDoc:None" in e.message)
self.assertEqual(e.to_dict(), {
'e.val': 'Field is required'})
self.assertEqual(classic_doc, dict_doc) Doc.drop_collection()
self.assertEqual(classic_doc._data, dict_doc._data)
def test_kwargs_complex(self): Doc(id="test", e=SubDoc(val=15)).save()
class Embedded(EmbeddedDocument): doc = Doc.objects.first()
name = StringField() keys = doc._data.keys()
self.assertEqual(2, len(keys))
self.assertTrue('id' in keys)
self.assertTrue('e' in keys)
class Doc(Document): doc.e.val = "OK"
doc_name = StringField() try:
docs = ListField(EmbeddedDocumentField(Embedded)) doc.save()
except ValidationError, e:
self.assertTrue("SubDoc:test" in e.message)
self.assertEqual(e.to_dict(), {
'e.val': 'Field is required'})
classic_doc = Doc(doc_name="my doc", docs=[
Embedded(name="embedded doc1"),
Embedded(name="embedded doc2")])
dict_doc = Doc(**{"doc_name": "my doc",
"docs": [{"name": "embedded doc1"},
{"name": "embedded doc2"}]})
self.assertEqual(classic_doc, dict_doc) if __name__ == '__main__':
self.assertEqual(classic_doc._data, dict_doc._data) unittest.main()