#! /usr/bin/env python
# -*- coding: iso-8859-1 -*-
#-----------------------------------------------------------------------------
# Modeling Framework: an Object-Relational Bridge for python
#
# Copyright (c) 2001-2004 Sbastien Bigaret <sbigaret@users.sourceforge.net>
# All rights reserved.
#
# This file is part of the Modeling Framework.
#
# This code is distributed under a "3-clause BSD"-style license;
# see the LICENSE file for details.
#-----------------------------------------------------------------------------
"""
Tests for the Validation
CVS information
$Id: test_Validation.py 932 2004-07-20 06:21:57Z sbigaret $
"""
__version__='$Revision: 932 $'[11:-2]
import unittest
if __name__ == "__main__":
import utils, sys
utils.fixpath()
from Modeling.Validation import ValidationException,\
REQUIRED, TYPE_MISMATCH, CUSTOM_KEY_VALIDATION, LOWER_BOUND, UPPER_BOUND
from Modeling import ModelSet
from testPackages.AuthorBooks.Writer import Writer
from testPackages.AuthorBooks.Book import Book
class Writer(Writer):
triggerValidate=0
def validateLastName(self, value):
"Edit this to enforce custom business logic"
if self.triggerValidate and not value: # your custom bizlogic
raise ValidationException
def validateBooks(self, value):
"---"
# this could be used, for example, to enforce 'one-to-one'
# on a relationship that is modeled as a one-to-many relationship.
if self.triggerValidate and len(value)>1: # your custom bizlogic
raise ValidationException
class TestValidation(unittest.TestCase):
"Global tests for EditingContext"
def test_01_validateForSave_attributeIsRequired(self):
"[Validation] validateForSave (std+custom) on attributes"
w=Writer()
# None is invalid
w.setLastName(None)
self.assertRaises(ValidationException, w.validateForSave)
try:
w.validateForSave()
except ValidationException, exc:
errorsDict=exc.errorsDict()
self.failUnless('lastName' in errorsDict.keys())
self.failUnless(REQUIRED in errorsDict['lastName'])
else:
self.fail('validateForSave() should raise')
# Wrong type
w.setLastName(1)
self.assertRaises(ValidationException, w.validateForSave)
try:
w.validateForSave()
except ValidationException, exc:
errorsDict=exc.errorsDict()
self.failUnless('lastName' in errorsDict.keys())
self.failUnless(TYPE_MISMATCH in errorsDict['lastName'])
else:
self.fail('validateForSave() should raise')
# empty string is ok...
w.setLastName('')
self.failUnless(w.validateForSave() or 1, "should not raise")
# ...unless we say it is not ok!
w.triggerValidate=1
self.assertRaises(ValidationException, w.validateForSave)
try:
w.validateForSave()
except ValidationException, exc:
errorsDict=exc.errorsDict()
self.failUnless('lastName' in errorsDict.keys())
self.failUnless(CUSTOM_KEY_VALIDATION in errorsDict['lastName'])
else:
self.fail('validateForSave() should raise')
def test_01_validateForSave_relationship(self):
"[Validation] validateForSave on relationships"
w=Writer()
w.setLastName('-') # avoid validation on attribute to jam the tests
b1=Book()
b2=Book()
b3=Book()
w.addToBooks(b1)
self.failUnless(w.validateForSave() or 1, "should not raise")
# Custom bizLogic
w.triggerValidate=1
self.failUnless(w.validateForSave() or 1, "should not raise")
w.addToBooks(b2)
self.assertRaises(ValidationException, w.validateForSave)
try:
w.validateForSave()
except ValidationException, exc:
errorsDict=exc.errorsDict()
self.failUnless('books' in errorsDict.keys())
self.failUnless(CUSTOM_KEY_VALIDATION in errorsDict['books'])
else:
self.fail('validateForSave() should raise')
w.removeFromBooks(b2)
# let's play with the model
writer=ModelSet.defaultModelSet().entityNamed('Writer')
w_books=writer.relationshipNamed('books')
w_books.setMultiplicity(2, -1)
self.assertRaises(ValidationException, w.validateForSave)
try:
w.validateForSave()
except ValidationException, exc:
errorsDict=exc.errorsDict()
self.failUnless('books' in errorsDict.keys())
self.failUnless(LOWER_BOUND in errorsDict['books'])
else:
self.fail('validateForSave() should raise')
w_books.setMultiplicity(1, 2)
w.addToBooks(b2)
w.addToBooks(b3)
self.assertRaises(ValidationException, w.validateForSave)
try:
w.validateForSave()
except ValidationException, exc:
errorsDict=exc.errorsDict()
self.failUnless('books' in errorsDict.keys())
self.failUnless(UPPER_BOUND in errorsDict['books'])
else:
self.fail('validateForSave() should raise')
w.addToBooks(w)
self.assertRaises(ValidationException, w.validateForSave)
try:
w.validateForSave()
except ValidationException, exc:
errorsDict=exc.errorsDict()
self.failUnless('books' in errorsDict.keys())
self.failUnless(UPPER_BOUND in errorsDict['books'])
self.failUnless(TYPE_MISMATCH in errorsDict['books'])
else:
self.fail('validateForSave() should raise')
# Build the test suite
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestValidation, "test_"))
return suite
if __name__ == "__main__":
errs = utils.run_suite(test_suite())
sys.exit(errs and 1 or 0)
|