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

Last change on this file since 3573 was 3573, checked in by vmaksymiv, 12 years ago

fixed imports

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