source: products/quintagroup.z3cform.captcha/trunk/quintagroup/z3cform/captcha/tests.py @ 3257

Last change on this file since 3257 was 2215, checked in by mylan, 14 years ago

Merged all changes from branches/captchas-refactoring into trunk.

Merged revisions 3005,3095,3110-3117 via svnmerge from
http://svn.quintagroup.com/products/quintagroup.z3cform.captcha/branches/captchas-refactoring

........

r3005 | liebster | 2010-03-22 16:19:33 +0200 (Mon, 22 Mar 2010) | 1 line


Add depending quintagroup.captcha.core

........

r3095 | mylan | 2010-04-01 17:31:59 +0300 (Thu, 01 Apr 2010) | 1 line


#173: Fix wrong import, update package description, update dependencies list in quintagroup.z3cform.captcha package

........

r3110 | mylan | 2010-04-07 16:56:33 +0300 (Wed, 07 Apr 2010) | 1 line


#185: Add default captcha widget factory adapter registration

........

r3111 | mylan | 2010-04-07 16:59:19 +0300 (Wed, 07 Apr 2010) | 1 line


#185: force package autoregistration with z3c.autoinclude

........

r3112 | mylan | 2010-04-07 17:00:00 +0300 (Wed, 07 Apr 2010) | 1 line


#185: Add default imports into package init module

........

r3113 | mylan | 2010-04-07 17:03:13 +0300 (Wed, 07 Apr 2010) | 1 line


#185: Add tests infrastructure

........

r3114 | mylan | 2010-04-07 17:04:51 +0300 (Wed, 07 Apr 2010) | 1 line


#185: Add registration tests

........

r3115 | mylan | 2010-04-07 18:07:15 +0300 (Wed, 07 Apr 2010) | 1 line


#185: Add tests for captcha widget

........

r3116 | mylan | 2010-04-07 18:38:19 +0300 (Wed, 07 Apr 2010) | 1 line


#185: Add tests for captcha validator

........

r3117 | mylan | 2010-04-08 16:23:01 +0300 (Thu, 08 Apr 2010) | 1 line


#185: Fixed tests for plone>=3.3

........

  • Property svn:eol-style set to native
File size: 5.8 KB
Line 
1import re
2import unittest
3
4from zope.interface import alsoProvides
5from zope.schema.interfaces import IField
6from zope.component import queryMultiAdapter
7from zope.publisher.browser import TestRequest
8
9from z3c.form import form
10from z3c.form.interfaces import IFormLayer
11from z3c.form.interfaces import IValidator
12from z3c.form.interfaces import IFieldWidget
13from z3c.form.interfaces import IErrorViewSnippet
14
15from Products.Five import zcml
16from Products.Five import fiveconfigure
17from Testing import ZopeTestCase as ztc
18from Products.PloneTestCase.layer import onsetup
19from Products.PloneTestCase import PloneTestCase as ptc
20
21from quintagroup.captcha.core.utils import *
22from quintagroup.captcha.core.tests.base import testPatch
23from quintagroup.captcha.core.tests.testWidget import addTestLayer
24
25from quintagroup.z3cform.captcha import Captcha
26from quintagroup.z3cform.captcha import CaptchaWidget
27from quintagroup.z3cform.captcha import CaptchaWidgetFactory
28from quintagroup.z3cform.captcha.validator import CaptchaValidator
29
30@onsetup
31def setup_product():
32    fiveconfigure.debug_mode = True
33    # Register z3c namespace first (work before plone-3.3)
34    import z3c.form
35    zcml.load_config('meta.zcml', z3c.form)
36    # Now register quintagroup.z3cform.captcha package
37    import quintagroup.captcha.core
38    import quintagroup.z3cform.captcha
39    zcml.load_config('configure.zcml', quintagroup.z3cform.captcha)
40    fiveconfigure.debug_mode = False
41    ztc.installPackage('quintagroup.captcha.core')
42
43setup_product()
44ptc.setupPloneSite(extension_profiles=['quintagroup.captcha.core:default',])
45
46
47class TestRegistrations(ptc.PloneTestCase):
48
49    def afterSetUp(self):
50        self.request = self.app.REQUEST
51        alsoProvides(self.request, IFormLayer)
52
53    def testCaptchaFieldInterface(self):
54        self.assertEqual(IField.implementedBy(Captcha), True)
55
56    def testCaptchaWidgetInterface(self):
57        self.assertEqual(IFieldWidget.implementedBy(CaptchaWidgetFactory), True)
58
59    def testWidgetRegistration(self):
60        cfield = Captcha()
61        cwidget = queryMultiAdapter((cfield, self.request), IFieldWidget)
62        self.assertNotEqual(cwidget, None)
63
64    def testValidatorRegistration(self):
65        cfield = Captcha()
66        cvalidator = queryMultiAdapter((None, self.request, None, cfield, None),
67                IValidator)
68        self.assertNotEqual(cvalidator, None)
69
70    def testErrorViewRegistration(self):
71        cfield = Captcha()
72        cwidget = queryMultiAdapter((cfield, self.request), IFieldWidget)
73        error = ValueError()
74        eview = queryMultiAdapter(
75            (error, self.request, cwidget, cfield, None, None),
76            IErrorViewSnippet)
77        self.assertNotEqual(eview, None)
78
79
80class TestCaptchaWidget(ptc.PloneTestCase):
81
82    def afterSetUp(self):
83        self.request = self.app.REQUEST
84        alsoProvides(self.request, IFormLayer)
85
86        cform = form.BaseForm(self.portal, self.request)
87        cform.prefix = ""
88        cwidget = CaptchaWidget(self.request)
89        cwidget.form = cform
90        self.html = cwidget.render()
91
92    def testHidden(self):
93        HIDDENTAG = '<input\s+[^>]*(?:' \
94            '(?:type="hidden"\s*)|' \
95            '(?:name="hashkey"\s*)|' \
96            '(?:value="(?P<value>[0-9a-fA-F]+)"\s*)' \
97            '){3}/>'
98        open('/tmp/z3c.form.html','w').write(self.html)
99        hidden = re.search(HIDDENTAG, self.html)
100        self.assertTrue(hidden and hidden.group('value'))
101
102    def testImg(self):
103        IMAGETAG = '<img\s+[^>]*src=\"' \
104            '(?P<src>[^\"]*/getCaptchaImage/[0-9a-fA-F]+)' \
105            '\"[^>]*>'
106        img = re.search(IMAGETAG, self.html)
107        self.assertTrue(img and img.group('src'))
108
109    def testTextField(self):
110        FIELDTAG = '<input\s+[^>]*type=\"text\"\s*[^>]*>'
111        self.assertEqual(re.search(FIELDTAG, self.html) is not None, True)
112       
113
114class TestCaptchaValidator(ptc.PloneTestCase):
115
116    def afterSetUp(self):
117        self.request = self.app.REQUEST
118        alsoProvides(self.request, IFormLayer)
119        # prepare context
120        self.loginAsPortalOwner()
121        testPatch()
122        addTestLayer(self)
123        self.captcha_key = self.portal.captcha_key
124        # prepare captcha data
125        self.hashkey = self.portal.getCaptcha()
126        self.request.form['hashkey'] = self.hashkey
127        # prepare validator
128        cform = form.BaseForm(self.portal, self.request)
129        cform.prefix = ""
130        cwidget = CaptchaWidget(self.request)
131        cwidget.form = cform
132        self.validator = CaptchaValidator(self.portal, self.request, None, None, cwidget)
133
134    def testSubmitRightCaptcha(self):
135        decrypted = decrypt(self.captcha_key, self.hashkey)
136        key = getWord(int(parseKey(decrypted)['key'])-1 )
137        try:
138            res = self.validator.validate(key)
139        except ConversionError, e:
140            self.fail("Rised unexpected %s error on right captcha submit" % e)
141
142    def testSubmitWrongCaptcha(self):
143        try:
144            res = self.validator.validate("wrong key")
145        except ValueError, e:
146            self.assertEqual(str(e), u'Please re-enter validation code.')
147        else:
148            self.fail("No ValueError rised on wrong captcha key submit")
149
150    def testSubmitRightCaptchaTwice(self):
151        decrypted = decrypt(self.captcha_key, self.hashkey)
152        key = getWord(int(parseKey(decrypted)['key'])-1 )
153        self.validator.validate(key)
154        try:
155            res = self.validator.validate(key)
156        except ValueError, e:
157            self.assertEqual(str(e), u'Please re-enter validation code.')
158        else:
159            self.fail("No ValueError rised on right captcha key " \
160                      "submitting twice")
161
162
163def test_suite():
164    suite = unittest.TestSuite()
165    suite.addTest(unittest.makeSuite(TestRegistrations))
166    suite.addTest(unittest.makeSuite(TestCaptchaWidget))
167    suite.addTest(unittest.makeSuite(TestCaptchaValidator))
168    return suite
Note: See TracBrowser for help on using the repository browser.