############################################################################## # # Copyright (c) 2001, 2002 Zope Corporation and Contributors. # All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## """TextArea Functional Tests $Id: test_textareawidget.py 67630 2006-04-27 00:54:03Z jim $ """ import unittest import transaction from persistent import Persistent import zope.security.checker from zope.interface import Interface, implements from zope.schema import Text from zope.traversing.api import traverse from zope.app.form.browser.ftests.support import * from zope.app.testing.functional import BrowserTestCase class ITextTest(Interface): s2 = Text( required=False, missing_value=u'') s3 = Text( required=False) s1 = Text( required=True, min_length=2, max_length=10) class TextTest(Persistent): implements(ITextTest) def __init__(self): self.s1 = '' self.s2 = u'foo' self.s3 = None class Test(BrowserTestCase): def setUp(self): BrowserTestCase.setUp(self) registerEditForm(ITextTest) defineSecurity(TextTest, ITextTest) def test_display_editform(self): self.getRootFolder()['test'] = TextTest() transaction.commit() # display edit view response = self.publish('/test/edit.html') self.assertEqual(response.getStatus(), 200) # all fields should be displayed in text fields self.assert_(patternExists( '', response.getBody())) self.assert_(patternExists( '', response.getBody())) self.assert_(patternExists( '', response.getBody())) def test_submit_editform(self): self.getRootFolder()['test'] = TextTest() transaction.commit() # submit edit view response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.s1' : u'foo', 'field.s2' : u'bar', 'field.s3' : u'baz' }) self.assertEqual(response.getStatus(), 200) self.assert_(updatedMsgExists(response.getBody())) # check new values in object object = traverse(self.getRootFolder(), 'test') self.assertEqual(object.s1, u'foo') self.assertEqual(object.s2, u'bar') self.assertEqual(object.s3, u'baz') def test_invalid_type(self): """Tests textarea widget's handling of invalid unicode input. The text widget will succeed in converting any form input into unicode. """ self.getRootFolder()['test'] = TextTest() transaction.commit() # submit invalid type for text response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.s1' : 123 }) # not unicode self.assertEqual(response.getStatus(), 200) # Note: We don't have a invalid field value # since we convert the value to unicode self.assert_(not validationErrorExists( 's1', 'Object is of wrong type.', response.getBody())) def test_missing_value(self): self.getRootFolder()['test'] = TextTest() transaction.commit() # submit missing values for s2 and s3 response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.s1' : u'foo', 'field.s2' : '', 'field.s3' : '' }) self.assertEqual(response.getStatus(), 200) self.assert_(updatedMsgExists(response.getBody())) # check new value in object object = traverse(self.getRootFolder(), 'test') self.assertEqual(object.s1, u'foo') self.assertEqual(object.s2, u'') # default missing_value self.assertEqual(object.s3, None) # None is s3's missing_value def test_required_validation(self): self.getRootFolder()['test'] = TextTest() transaction.commit() # submit missing values for required field s1 response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.s1' : '', 'field.s2' : '', 'field.s3' : '' }) self.assertEqual(response.getStatus(), 200) # confirm error msgs self.assert_(missingInputErrorExists('s1', response.getBody())) self.assert_(not missingInputErrorExists('s2', response.getBody())) self.assert_(not missingInputErrorExists('s3', response.getBody())) def test_length_validation(self): self.getRootFolder()['test'] = TextTest() transaction.commit() # submit value for s1 that is too short response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.s1' : u'a' }) self.assertEqual(response.getStatus(), 200) self.assert_(validationErrorExists( 's1', 'Value is too short', response.getBody())) # submit value for s1 that is too long response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.s1' : u'12345678901' }) self.assertEqual(response.getStatus(), 200) self.assert_(validationErrorExists('s1', 'Value is too long', response.getBody())) def test_omitted_value(self): self.getRootFolder()['test'] = TextTest() transaction.commit() # confirm default values object = traverse(self.getRootFolder(), 'test') self.assertEqual(object.s1, '') self.assertEqual(object.s2, u'foo') self.assert_(object.s3 is None) # submit change with only s2 present -- note that required # field s1 is omitted, which should not cause a validation error response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.s2' : u'bar' }) self.assertEqual(response.getStatus(), 200) self.assert_(updatedMsgExists(response.getBody())) # check new values in object object = traverse(self.getRootFolder(), 'test') self.assertEqual(object.s1, '') self.assertEqual(object.s2, u'bar') self.assert_(object.s3 is None) def test_conversion(self): self.getRootFolder()['test'] = TextTest() transaction.commit() # confirm that line terminators are converted correctly on post response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.s2' : u'line1\r\nline2' }) # CRLF per RFC 822 self.assertEqual(response.getStatus(), 200) self.assert_(updatedMsgExists(response.getBody())) object = traverse(self.getRootFolder(), 'test') self.assertEqual(object.s2, u'line1\nline2') # confirm conversion to HTML response = self.publish('/test/edit.html') self.assertEqual(response.getStatus(), 200) self.assert_(patternExists('line1\r\nline2', response.getBody())) def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(Test)) return suite if __name__=='__main__': unittest.main(defaultTest='test_suite')