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

Last change on this file since 3571 was 3571, checked in by vmaksymiv, 11 years ago

PPP fixes

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