############################################################################## # # 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. # ############################################################################## """File Widget Tests $Id: test_filewidget.py 67630 2006-04-27 00:54:03Z jim $ """ import unittest import transaction from StringIO import StringIO from persistent import Persistent import zope.security.checker from zope.interface import Interface, implements from zope.schema.interfaces import IField from zope.schema import Field from zope.traversing.api import traverse from zope.app.form.browser.textwidgets import FileWidget from zope.app.form.browser.ftests.support import * from zope.app.testing.functional import BrowserTestCase from zope.app.form.interfaces import IInputWidget class IFileField(IField): """Field for representing a file that can be edited by FileWidget.""" class FileField(Field): implements(IFileField) class IFileTest(Interface): f1 = FileField(required=True) f2 = FileField(required=False) class FileTest(Persistent): implements(IFileTest) def __init__(self): self.f1 = None self.f2 = 'foo' class SampleTextFile(StringIO): def __init__(self, buf, filename=''): StringIO.__init__(self, buf) self.filename = filename class Test(BrowserTestCase): sampleText = "The quick brown fox\njumped over the lazy dog." sampleTextFile = SampleTextFile(sampleText) emptyFileName = 'empty.txt' emptyFile = SampleTextFile('', emptyFileName) def setUp(self): BrowserTestCase.setUp(self) defineWidgetView(IFileField, FileWidget, IInputWidget) registerEditForm(IFileTest) defineSecurity(FileTest, IFileTest) def test_display_editform(self): self.getRootFolder()['test'] = FileTest() transaction.commit() # display edit view response = self.publish('/test/edit.html') self.assertEqual(response.getStatus(), 200) # field should be displayed in a file input element self.assert_(patternExists( '', response.getBody())) self.assert_(patternExists( '', response.getBody())) def test_submit_text(self): self.getRootFolder()['test'] = FileTest() transaction.commit() object = traverse(self.getRootFolder(), 'test') self.assert_(object.f1 is None) self.assertEqual(object.f2, 'foo') # submit a sample text file response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.f1' : self.sampleTextFile, 'field.f2' : self.sampleTextFile, 'field.f1.used' : '', 'field.f2.used' : '' }) self.assertEqual(response.getStatus(), 200) self.assert_(updatedMsgExists(response.getBody())) # check new values in object object = traverse(self.getRootFolder(), 'test') self.assertEqual(object.f1, self.sampleText) self.assertEqual(object.f2, self.sampleText) def test_invalid_value(self): self.getRootFolder()['test'] = FileTest() transaction.commit() # submit an invalid file value response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.f1' : 'not a file - same as missing input', 'field.f1.used' : '', 'field.f2.used' : '' }) self.assertEqual(response.getStatus(), 200) self.assert_(validationErrorExists('f1', 'Form input is not a file object', response.getBody())) def test_required_validation(self): self.getRootFolder()['test'] = FileTest() transaction.commit() # submit missing value for required field f1 response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.f1.used' : '', 'field.f2.used' : ''}) self.assertEqual(response.getStatus(), 200) # confirm error msgs self.assert_(missingInputErrorExists('f1', response.getBody())) self.assert_(not missingInputErrorExists('f2', response.getBody())) def test_empty_file(self): self.getRootFolder()['test'] = FileTest() transaction.commit() # submit an empty text file response = self.publish('/test/edit.html', form={ 'UPDATE_SUBMIT' : '', 'field.f2' : self.emptyFile, # 'field.f1.used' : '', # we don't let f1 know that it was rendered # or else it will complain (see test_required_validation) and the # change will not succeed. 'field.f2.used' : ''}) self.assertEqual(response.getStatus(), 200) self.assert_(updatedMsgExists(response.getBody())) # new value for f1 should be field.missing_value (i.e, None) object = traverse(self.getRootFolder(), 'test') self.assert_(object.f1 is None) def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(Test)) return suite if __name__=='__main__': unittest.main(defaultTest='test_suite')