paula.pasplugins: implementation of many interface - unclean working code
[paula.testing.git] / paula.pasplugins / src / paula / pasplugins / integration.txt
blob9125561ec005ffbb7993892bb56a34f4ccbda9a8
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
11 plugin:
13     >>> from zope.app.security.interfaces import \
14     ...         IAuthentication
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
21     True
23     >>> credplug = getUtility(ICredentialsPlugin, name=CREDPLUG_NAME)
24     >>> credplugs = list( pau.getCredentialsPlugins() )
25     >>> len(credplugs)
26     1
27     >>> credplugs[0][0] == CREDPLUG_NAME
28     True
29     >>> credplugs[0][1] is credplug
30     True
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)
41     0
43     >>> authplug = getUtility(IAuthenticatorPlugin, name=AUTHPLUG_NAME)
44     >>> pau.authenticatorPlugins = (AUTHPLUG_NAME,)
45     >>> authplugs = list( pau.getAuthenticatorPlugins() )
46     >>> len(authplugs)
47     1
48     >>> authplugs[0][0] == AUTHPLUG_NAME
49     True
50     >>> authplugs[0][1] is authplug
51     True
54 Ok, it should be possible to authenticate with PAU, using the credentials
55 for the fake user:
57     >>> pau.authenticate(None)
58     Traceback (most recent call last):
59     ...
60     AttributeError: ...
62     >>> pau.authenticate(UserDict(login='foo',password='foo')) is None
63     True
65     >>> from paula.pasplugins.tests.fake_pau_ap import FAKE_REQUEST
66     >>> principal = pau.authenticate(FAKE_REQUEST)
67     >>> principal.id is 'fakelogin'
68     True
70 The user carries groups and properties provided by our fake testing
71 subscribers:
73     >>> principal.email
74     u'foo@bar.com'
75     >>> principal.realname
76     u'fake user'
77     >>> principal.foo
78     u'foo value'
79     >>> principal.groups
80     ['fakegroup1', 'fakegroup2']
83 The user should also be returned for a getPrincipal call:
85     >>> principal2 = pau.getPrincipal('fakelogin')
86     >>> principal2.id
87     'fakelogin'
88     >>> principal2.email
89     u'foo@bar.com'
90     >>> principal2.realname
91     u'fake user'
92     >>> principal2.foo
93     u'foo value'
94     >>> principal2.groups
95     ['fakegroup1', 'fakegroup2']
98 PAU is working as expected.
101 The PAS plugins
102 ---------------
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]
119     [True]
120     >>> [pas.plugins.listPlugins(x)[0][0] == 'paula_properties' for x in pifs]
121     [True]
123 Paula PAS auth plugin
125     >>> p = pas.paula_auth.authenticateCredentials(FAKE_CREDS)
126     >>> p
127     ('fakelogin', 'fakelogin')
129 make a plone user
131     >>> from Products.PlonePAS.plugins.ufactory import PloneUser
132     >>> pu = PloneUser(p[1])
133     >>> pu
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')
149     
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']
168     'fakelogin'
169     >>> pas.searchUsers(name=FAKE_LOGIN,exact_match=True)[0]['login']
170     'fakelogin'
172     >>> pas.searchPrincipals(id=FAKE_LOGIN,exact_match=True)[0]['login']
173     'fakelogin'
174     >>> pas.searchPrincipals(name=FAKE_LOGIN,exact_match=True)[0]['login']
175     'fakelogin'
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())
182     ['test_user_1_']
184     >>> pas.userSetPassword('fakelogin', 'foo')
185     >>> pas.userSetPassword('somebody', 'foo')
186     Traceback (most recent call last):
187     ...
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())
199     ['test_user_1_']
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,
210 #    ...                )
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,
247     ...         )
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,
255     ...         )
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
268     False
269     >>> 'myregular' in browser.contents
270     True
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
278     True
279     >>> 'myregular' in browser.contents
280     False
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
290     True
291     >>> FAKE_LOGIN in browser.contents
292     False
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
299     False
300     >>> FAKE_LOGIN in browser.contents
301     True
302     >>> browser.getLink('Log out').click()