import re import unittest from zope.interface import alsoProvides from zope.schema.interfaces import IField from zope.component import queryMultiAdapter from zope.publisher.browser import TestRequest from z3c.form import form from z3c.form.interfaces import IFormLayer from z3c.form.interfaces import IValidator from z3c.form.interfaces import IFieldWidget from z3c.form.interfaces import IErrorViewSnippet from Products.Five import zcml from Products.Five import fiveconfigure from Testing import ZopeTestCase as ztc from Products.PloneTestCase.layer import onsetup from Products.PloneTestCase import PloneTestCase as ptc from quintagroup.z3cform.captcha import Captcha from quintagroup.z3cform.captcha import CaptchaWidget from quintagroup.z3cform.captcha.widget import CaptchaWidgetFactory @onsetup def setup_product(): fiveconfigure.debug_mode = True # Register z3c namespace first import z3c.form zcml.load_config('meta.zcml', z3c.form) # Now register quintagroup.z3cform.captcha package import quintagroup.captcha.core import quintagroup.z3cform.captcha zcml.load_config('configure.zcml', quintagroup.z3cform.captcha) fiveconfigure.debug_mode = False ztc.installPackage('quintagroup.captcha.core') setup_product() ptc.setupPloneSite(extension_profiles=['quintagroup.captcha.core:default',]) class TestRegistrations(ptc.PloneTestCase): def afterSetUp(self): super(TestRegistrations, self).afterSetUp() self.request = self.app.REQUEST alsoProvides(self.request, IFormLayer) def testCaptchaFieldInterface(self): self.assertEqual(IField.implementedBy(Captcha), True) def testCaptchaWidgetInterface(self): self.assertEqual(IFieldWidget.implementedBy(CaptchaWidgetFactory), True) def testWidgetRegistration(self): cfield = Captcha() cwidget = queryMultiAdapter((cfield, self.request), IFieldWidget) self.assertNotEqual(cwidget, None) def testValidatorRegistration(self): cfield = Captcha() cvalidator = queryMultiAdapter((None, self.request, None, cfield, None), IValidator) self.assertNotEqual(cvalidator, None) def testErrorViewRegistration(self): cfield = Captcha() cwidget = queryMultiAdapter((cfield, self.request), IFieldWidget) error = ValueError() eview = queryMultiAdapter( (error, self.request, cwidget, cfield, None, None), IErrorViewSnippet) self.assertNotEqual(eview, None) class TestCaptchaWidget(ptc.PloneTestCase): def afterSetUp(self): super(TestCaptchaWidget, self).afterSetUp() self.request = self.app.REQUEST alsoProvides(self.request, IFormLayer) cform = form.BaseForm(self.portal, self.request) cform.prefix = "" cwidget = CaptchaWidget(self.request) cwidget.form = cform self.html = cwidget.render() def testHidden(self): HIDDENTAG = ']*(?:' \ '(?:type="hidden"\s*)|' \ '(?:name="hashkey"\s*)|' \ '(?:value="(?P[0-9a-fA-F]+)"\s*)' \ '){3}/>' open('/tmp/z3c.form.html','w').write(self.html) hidden = re.search(HIDDENTAG, self.html) self.assertTrue(hidden and hidden.group('value')) def testImg(self): IMAGETAG = ']*src=\"' \ '(?P[^\"]*/getCaptchaImage/[0-9a-fA-F]+)' \ '\"[^>]*>' img = re.search(IMAGETAG, self.html) self.assertTrue(img and img.group('src')) def testTextField(self): FIELDTAG = ']*type=\"text\"\s*[^>]*>' self.assertEqual(re.search(FIELDTAG, self.html) is not None, True) def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestRegistrations)) suite.addTest(unittest.makeSuite(TestCaptchaWidget)) return suite