source: products/quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests.py @ 2100

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

#174: added tests for CaptchaValidator?

  • Property svn:eol-style set to native
File size: 6.4 KB
Line 
1import re
2import string
3import unittest
4
5from Products.Five import zcml
6from Products.Five import fiveconfigure
7from Testing import ZopeTestCase as ztc
8from Products.PloneTestCase.layer import onsetup
9from Products.PloneTestCase import PloneTestCase as ptc
10from Products.CMFCore.permissions import View
11from Products.Archetypes.atapi import StringField
12from Products.Archetypes.Registry import availableWidgets
13from Products.validation import validation
14
15from quintagroup.pfg.captcha import CaptchaField
16from quintagroup.pfg.captcha import CaptchaWidget
17from quintagroup.pfg.captcha import CaptchaValidator
18from quintagroup.pfg.captcha.widget import CAPTCHA_MACRO
19from quintagroup.pfg.captcha.field import CAPTCHA_ID, HIDDEN_FIELDS
20
21_marker = object()
22
23PACKAGES = [
24    'quintagroup.captcha.core',
25    'quintagroup.pfg.captcha',
26]
27PROFILES = [p+':default' for p in PACKAGES]
28
29@onsetup
30def setup_product():
31    fiveconfigure.debug_mode = True
32    import quintagroup.pfg.captcha
33    zcml.load_config('configure.zcml', quintagroup.pfg.captcha)
34    fiveconfigure.debug_mode = False
35    ztc.installProduct('PloneFormGen')
36    ztc.installPackage('quintagroup.pfg.captcha')
37    ztc.installPackage('quintagroup.captcha.core')
38
39setup_product()
40ptc.setupPloneSite(products=['PloneFormGen',], extension_profiles=PROFILES)
41
42
43class TestInstallations(ptc.PloneTestCase):
44
45    def testInstalledProducts(self):
46        qi = self.portal.portal_quickinstaller
47        installed = [p['id'] for p in qi.listInstalledProducts()]
48        for p in PRODUCTS:
49            if p.startswith('Products'):
50                p = p[9:]
51            self.assertEqual(p in installed, True,
52                '"%s" product not installed' % p)
53
54    def testType(self):
55        pt = self.portal.portal_types
56        self.assertEqual("CaptchaField" in pt.objectIds(), True)
57
58    def testPortalFactory(self):
59        pf = self.portal.portal_factory
60        self.assertEqual("CaptchaField" in pf.getFactoryTypes(), True)
61
62    def testWorkflow(self):
63        pw = self.portal.portal_workflow
64        default_chain = pw.getDefaultChain()
65        cf_chain = pw.getChainForPortalType('CaptchaField')
66        self.assertNotEqual(cf_chain == default_chain , True)
67
68    def testNotToList(self):
69        navtree = self.portal.portal_properties.navtree_properties
70        mtNotToList = navtree.getProperty("metaTypesNotToList")
71        self.assertEqual('CaptchaField' in mtNotToList, True)
72
73    def testSkins(self):
74        ps = self.portal.portal_skins
75        self.assertEqual("qplonecaptchafield" in ps.objectIds(), True)
76        for sname, spath in ps.getSkinPaths():
77            paths = filter(None, map(string.strip, spath.split(',')))
78            self.assertEqual("qplonecaptchafield" in paths, True,
79                '"qplonecaptchafield" layer not present in "%s" skin' % sname)
80
81
82class TestCaptchaField(ptc.PloneTestCase):
83
84    def afterSetUp(self):
85        self.folder.invokeFactory('FormFolder', 'ff1')
86        self.ff1 = getattr(self.folder, 'ff1')
87        self.ff1.invokeFactory('CaptchaField', 'captcha_field')
88
89    def testId(self):
90        """CaptchaField has always CAPTCHA_ID id."""
91        self.assertEqual(CAPTCHA_ID in self.ff1, True)
92        self.assertNotEqual('captcha_field' in self.ff1, True)
93
94    def testSchema(self):
95        cf = getattr(self.ff1, CAPTCHA_ID)
96        schema = cf.Schema()
97        for field in HIDDEN_FIELDS:
98            visibility = schema[field].widget.visible
99            self.assertEqual(visibility, {'view':'invisible','edit':'invisible'},
100                '"%s" field is not hidden, but %s:' % (field, visibility))
101
102    def testFGField(self):
103        cf = getattr(self.ff1, CAPTCHA_ID)
104        fgField = getattr(cf, 'fgField', _marker)
105        self.assertNotEqual(fgField, _marker)
106        # Test fgField properties
107        self.assertEqual(type(fgField), StringField)
108        self.assertEqual(bool(fgField.searchable), False )
109        self.assertEqual(fgField.write_permission, View)
110        self.assertEqual(type(fgField.widget), CaptchaWidget)
111        validators = [v.__class__ for v in fgField.validators._chain]
112        self.assertEqual(CaptchaValidator in validators, True)
113
114
115class TestCaptchaWidget(ptc.PloneTestCase):
116
117    CF = CaptchaField.__module__ + '.CaptchaField'
118    CW = CaptchaWidget.__module__ + '.CaptchaWidget'
119
120    def afterSetUp(self):
121        self.widgets = dict(availableWidgets())
122
123    def testRegistration(self):
124        self.assertEqual(self.CW in self.widgets, True)
125        cw = self.widgets[self.CW]
126        self.assertEqual(self.CF in cw.used_for, True)
127
128    def testWidgetMacro(self):
129        widget_macro = self.widgets[self.CW].klass._properties['macro']
130        self.assertEqual(widget_macro, CAPTCHA_MACRO)
131
132    def testWidgetMacroAccessable(self):
133        macro = self.portal.restrictedTraverse(CAPTCHA_MACRO)
134        self.assertNotEqual(macro, None)
135
136
137class TestCaptchaValidator(ptc.PloneTestCase):
138
139    def getValidator(self):
140        return validation.validatorFor('isCaptchaCorrect')       
141
142    def testRegistration(self):
143        self.assertEqual(self.getValidator().__class__, CaptchaValidator)
144
145    def patchCoreValidator(self, status, error=""):
146        # Patch quintagroup.catpcha.core' captcha_validator
147        class MockState:
148            def __init__(self, status, error=""):
149                self.status = status
150                self.errors = {'key':[error,]}
151
152        patch_validator = lambda : MockState(status, error)
153        self.portal.captcha_validator = patch_validator
154
155    def testValidationSuccess(self):
156        # PFG validator must call patched quintagroup.captcha.core'
157        # captcha_validator and successfully validate the data.
158        validator = self.getValidator()
159        self.patchCoreValidator("success")
160        result = validator('test', instance=self.portal)
161        self.assertEqual(result, 1)
162       
163    def testValidationFailure(self):
164        # PFG validator must call patched quintagroup.captcha.core'
165        # captcha_validator and return error.
166        validator = self.getValidator()
167        self.patchCoreValidator("failure", "Wrong value")
168        result = validator('test', instance=self.portal)
169        self.assertEqual(result, "Wrong value")
170
171
172def test_suite():
173    suite = unittest.TestSuite()
174    suite.addTest(unittest.makeSuite(TestInstallations))
175    suite.addTest(unittest.makeSuite(TestCaptchaField))
176    suite.addTest(unittest.makeSuite(TestCaptchaWidget))
177    suite.addTest(unittest.makeSuite(TestCaptchaValidator))
178    return suite
Note: See TracBrowser for help on using the repository browser.