1 paula.pasplugins integration test
2 =================================
4 Supposed to test integration with Plone and PAU.
7 PAU is up and running with our real and fake plugins
8 ----------------------------------------------------
10 First of all, there should be a PAU and it should know about the credentials
13 >>> from zope.app.security.interfaces import \
15 >>> from zope.app.authentication.interfaces import \
16 ... ICredentialsPlugin
17 >>> from paula.pasplugins.plugins.paucred import CREDPLUG_NAME
19 >>> pau = getUtility(IAuthentication)
20 >>> CREDPLUG_NAME in pau.credentialsPlugins
23 >>> credplug = getUtility(ICredentialsPlugin, name=CREDPLUG_NAME)
24 >>> credplugs = list( pau.getCredentialsPlugins() )
27 >>> credplugs[0][0] == CREDPLUG_NAME
29 >>> credplugs[0][1] is credplug
33 For further testing we use a fake authenticator plugin:
35 >>> from zope.app.authentication.interfaces import \
36 ... IAuthenticatorPlugin
37 >>> from paula.pasplugins.tests.fake_pau_ap import AUTHPLUG_NAME
38 >>> from paula.pasplugins.tests.fake_pau_ap import AuthenticatorPlugin
40 >>> len(pau.authenticatorPlugins)
43 >>> authplug = getUtility(IAuthenticatorPlugin, name=AUTHPLUG_NAME)
44 >>> pau.authenticatorPlugins = (AUTHPLUG_NAME,)
45 >>> authplugs = list( pau.getAuthenticatorPlugins() )
48 >>> authplugs[0][0] == AUTHPLUG_NAME
50 >>> authplugs[0][1] is authplug
54 Ok, it should be possible to authenticate with PAU, using the credentials
57 >>> pau.authenticate(None)
58 Traceback (most recent call last):
62 >>> pau.authenticate(UserDict(login='foo',password='foo')) is None
65 >>> from paula.pasplugins.tests.fake_pau_ap import FAKE_REQUEST
66 >>> principal = pau.authenticate(FAKE_REQUEST)
67 >>> principal.id is 'fakelogin'
70 The user carries groups and properties provided by our fake testing
75 >>> principal.realname
80 ['fakegroup1', 'fakegroup2']
83 The user should also be returned for a getPrincipal call:
85 >>> principal2 = pau.getPrincipal('fakelogin')
90 >>> principal2.realname
95 ['fakegroup1', 'fakegroup2']
98 PAU is working as expected.
104 >>> pas = portal.acl_users
106 >>> from paula.pasplugins.tests.fake_pau_ap import FAKE_CREDS
107 >>> from paula.pasplugins.tests.fake_pau_ap import FAKE_LOGIN
108 >>> from paula.pasplugins.tests.fake_pau_ap import FAKE_PASSWORD
110 Make sure our PAS plugins are always first
112 >>> from paula.pasplugins.plugins.auth import paula_auth_ifs as aifs
113 >>> from paula.pasplugins.plugins.groups import paula_groups_ifs as gifs
114 >>> from paula.pasplugins.plugins.properties \
115 ... import paula_properties_ifs as pifs
116 >>> [pas.plugins.listPlugins(x)[0][0] == 'paula_auth' for x in aifs]
117 [True, True, True, True, True]
118 >>> [pas.plugins.listPlugins(x)[0][0] == 'paula_groups' for x in gifs]
120 >>> [pas.plugins.listPlugins(x)[0][0] == 'paula_properties' for x in pifs]
123 Paula PAS auth plugin
125 >>> p = pas.paula_auth.authenticateCredentials(FAKE_CREDS)
127 ('fakelogin', 'fakelogin')
131 >>> from Products.PlonePAS.plugins.ufactory import PloneUser
132 >>> pu = PloneUser(p[1])
134 <PloneUser 'fakelogin'>
136 Paula PAS properties plugin - the order might be unstable
138 >>> psheet = portal.acl_users.paula_properties.getPropertiesForUser(pu)
139 >>> psheet.propertyItems()[0]
140 ('foo', u'foo value')
141 >>> psheet.propertyItems()[1]
142 ('email', u'foo@bar.com')
143 >>> psheet.propertyItems()[2]
144 ('realname', u'fake user')
146 Let's try to write properties
148 >>> psheet.setProperty('fakelogin', 'foo', 'new value')
150 Paula PAS group plugin
152 >>> portal.acl_users.paula_groups.getGroupsForPrincipal(pu)
153 ('fakegroup1', 'fakegroup2')
156 Walk through the PAS API
157 ------------------------
159 >>> from paula.pasplugins.tests.fake_pau_ap import FAKE_LOGIN
160 >>> pas = portal.acl_users
162 >>> pas.getUser(FAKE_LOGIN)
163 <PloneUser 'fakelogin'>
164 >>> pas.getUserById(FAKE_LOGIN)
165 <PloneUser 'fakelogin'>
167 >>> pas.searchUsers(id=FAKE_LOGIN,exact_match=True)[0]['login']
169 >>> pas.searchUsers(name=FAKE_LOGIN,exact_match=True)[0]['login']
172 >>> pas.searchPrincipals(id=FAKE_LOGIN,exact_match=True)[0]['login']
174 >>> pas.searchPrincipals(name=FAKE_LOGIN,exact_match=True)[0]['login']
177 Adding a user and changing the password: fakelogin should be "handled" by fake
178 authenticator, everything else should make it into source_users
180 >>> pas._doAddUser('fakelogin', 'foo', [], [])
181 >>> list(pas.source_users.listUserIds())
184 >>> pas.userSetPassword('fakelogin', 'foo')
185 >>> pas.userSetPassword('somebody', 'foo')
186 Traceback (most recent call last):
188 RuntimeError: No user management plugins were able to successfully ...
190 >>> pas._doAddUser('somebody', 'foo', [], [])
191 >>> list(pas.source_users.listUserIds())
192 ['somebody', 'test_user_1_']
194 >>> pas.userSetPassword('fakelogin', 'foo')
195 >>> pas.userSetPassword('somebody', 'foo')
197 >>> pas._doDelUser('somebody')
198 >>> list(pas.source_users.listUserIds())
201 >>> pas._doDelUser('fakelogin')
203 #XXX: This might be useful for a test of pas.validate()
204 # >>> from Products.PluggableAuthService.tests.test_PluggableAuthService \
205 # ... import RequestCleaner, FauxResponse
206 # >>> rc = RequestCleaner()
207 # >>> request = rc._makeRequest(
208 # ... RESPONSE=FauxResponse(),
209 # ... form=FAKE_CREDS,
212 # >>> from zope.publisher.browser import TestRequest
213 # >>> request = TestRequest(form=FAKE_CREDS)
214 # >>> pas.validate(request)
216 # >>> from Testing.makeRequest import makeRequest
217 # >>> interact( locals() )
219 # >>> pas.searchGroups()
222 Set things up for TTW login tests (thx optilude)
223 ------------------------------------------------
225 >>> from Products.Five.testbrowser import Browser
226 >>> browser = Browser()
227 >>> portal_url = self.portal.absolute_url()
229 The following is useful when writing and debugging testbrowser tests. It lets
230 us see error messages properly.
232 >>> browser.handleErrors = False
233 >>> self.portal.error_log._ignored_exceptions = ()
235 We then turn off the various portlets, because they sometimes duplicate links
236 and text (e.g. the navtree, the recent recent items listing) that we wish to
237 test for in our own views. Having no portlets makes things easier.
239 >>> from zope.component import getMultiAdapter, getUtility
240 >>> from plone.portlets.interfaces import IPortletManager
241 >>> from plone.portlets.interfaces import IPortletAssignmentMapping
243 >>> left_column = getUtility(IPortletManager, name=u"plone.leftcolumn")
244 >>> left_assignable = getMultiAdapter(
245 ... (self.portal, left_column),
246 ... IPortletAssignmentMapping,
248 >>> for name in left_assignable.keys():
249 ... del left_assignable[name]
251 >>> right_column = getUtility(IPortletManager, name=u"plone.rightcolumn")
252 >>> right_assignable = getMultiAdapter(
253 ... (self.portal, right_column),
254 ... IPortletAssignmentMapping,
256 >>> for name in right_assignable.keys():
257 ... del right_assignable[name]
260 add a "regular" user and check whether authentication works
262 >>> portal.acl_users.source_users.addUser('myregular', 'myregular', 'myregular')
263 >>> browser.open(portal_url + '/login_form?came_from=' + portal_url)
264 >>> browser.getControl(name='__ac_name').value = 'myregular'
265 >>> browser.getControl(name='__ac_password').value = 'myregular'
266 >>> browser.getControl(name='submit').click()
267 >>> 'Login failed' in browser.contents
269 >>> 'myregular' in browser.contents
271 >>> browser.getLink('Log out').click()
273 >>> browser.open(portal_url + '/login_form?came_from=' + portal_url)
274 >>> browser.getControl(name='__ac_name').value = 'myregular'
275 >>> browser.getControl(name='__ac_password').value = 'myregular-wrong'
276 >>> browser.getControl(name='submit').click()
277 >>> 'Login failed' in browser.contents
279 >>> 'myregular' in browser.contents
283 try to authenticate with the fake PAU plugin, wrapped by paula.pasplugins
285 >>> browser.open(portal_url + '/login_form?came_from=' + portal_url)
286 >>> browser.getControl(name='__ac_name').value = FAKE_LOGIN
287 >>> browser.getControl(name='__ac_password').value = FAKE_PASSWORD+'foo'
288 >>> browser.getControl(name='submit').click()
289 >>> 'Login failed' in browser.contents
291 >>> FAKE_LOGIN in browser.contents
294 >>> browser.open(portal_url + '/login_form?came_from=' + portal_url)
295 >>> browser.getControl(name='__ac_name').value = FAKE_LOGIN
296 >>> browser.getControl(name='__ac_password').value = FAKE_PASSWORD
297 >>> browser.getControl(name='submit').click()
298 >>> 'Login failed' in browser.contents
300 >>> FAKE_LOGIN in browser.contents
302 >>> browser.getLink('Log out').click()