From b4d0924ab92d52c9e8d40e13769c93d0d95bed00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Nowak?= <luke@nexedi.com> Date: Fri, 18 May 2012 16:24:01 +0200 Subject: [PATCH] Cover basic functionality in tests. --- .../TestTemplateItem/testERP5BearerToken.py | 125 ++++++++++++++++++ bt5/erp5_bearer_token/bt/revision | 2 +- .../bt/template_test_id_list | 1 + 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 bt5/erp5_bearer_token/TestTemplateItem/testERP5BearerToken.py create mode 100644 bt5/erp5_bearer_token/bt/template_test_id_list diff --git a/bt5/erp5_bearer_token/TestTemplateItem/testERP5BearerToken.py b/bt5/erp5_bearer_token/TestTemplateItem/testERP5BearerToken.py new file mode 100644 index 0000000000..a452d8ac95 --- /dev/null +++ b/bt5/erp5_bearer_token/TestTemplateItem/testERP5BearerToken.py @@ -0,0 +1,125 @@ +# Copyright (c) 2002-2012 Nexedi SA and Contributors. All Rights Reserved. + +from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase +import transaction +from DateTime import DateTime + +class TestERP5BearerToken(ERP5TypeTestCase): + """ + ERP5 Bearer Token extraction + """ + + test_token_extraction_id = 'bearer_test_extraction' + + def getBusinessTemplateList(self): + return ('erp5_base', 'erp5_bearer_token') + + def generateNewId(self): + return str(self.portal.portal_ids.generateNewId( + id_group=('bearer_token_test_id'))) + + def getTokenCredential(self, request): + plugin = getattr(self.portal.acl_users, self.test_token_extraction_id) + return plugin.extractCredentials(request).get('external_login') + + def createPerson(self, reference): + """Creates a person in person module, and returns the object, after + indexing is done. """ + person_module = self.getPersonModule() + person = person_module.newContent(portal_type='Person', + reference='P' + reference) + person.newContent(portal_type = 'Assignment').open() + transaction.commit() + self.tic() + return person + + def setUpBearerTokenKey(self): + self.preference = self.portal.portal_preferences.newContent( + portal_type='System Preference', + priority=1, + preferred_bearer_token_key=self.test_id) + self.preference.enable() + transaction.commit() + self.tic() + + def setupBearerExtraction(self): + pas = self.portal.acl_users + bearer_extraction_list = [q for q in pas.objectValues() \ + if q.meta_type == 'ERP5 Bearer Extraction Plugin'] + if len(bearer_extraction_list) == 0: + dispacher = pas.manage_addProduct['ERP5Security'] + dispacher.addERP5BearerExtractionPlugin(self.test_token_extraction_id) + getattr(pas, self.test_token_extraction_id).manage_activateInterfaces( + ('IExtractionPlugin',)) + elif len(bearer_extraction_list) > 1: + raise ValueError + transaction.commit() + + def afterSetUp(self): + """ + This is ran before anything, used to set the environment + """ + self.portal = self.getPortalObject() + self.test_id = self.generateNewId() + self.person = self.createPerson(self.test_id) + self.setUpBearerTokenKey() + self.setupBearerExtraction() + transaction.commit() + self.tic() + + def beforeTearDown(self): + self.portal.portal_preferences.deleteContent(self.preference.getId()) + transaction.commit() + self.tic() + + def test_working_token(self): + token, expiration_time = self.person.Person_getBearerToken() + self.portal.REQUEST._auth = 'Bearer %s' % token + reference = self.getTokenCredential(self.portal.REQUEST) + self.assertEqual(reference, self.person.getReference()) + + def test_different_user_agent(self): + token, expiration_time = self.person.Person_getBearerToken() + self.portal.REQUEST._auth = 'Bearer %s' % token + self.portal.REQUEST.environ['USER_AGENT'] = 'different user agent' + reference = self.getTokenCredential(self.portal.REQUEST) + self.assertEqual(reference, None) + + def test_different_remote_addr(self): + token, expiration_time = self.person.Person_getBearerToken() + self.portal.REQUEST._auth = 'Bearer %s' % token + self.portal.REQUEST.environ['REMOTE_ADDR'] = 'different remote addr' + reference = self.getTokenCredential(self.portal.REQUEST) + self.assertEqual(reference, None) + + def test_no_bearer_token_key(self): + self.preference.edit(preferred_bearer_token_key='') + transaction.commit() + self.tic() + transaction.commit() + self.assertRaises(ValueError, self.person.Person_getBearerToken) + + def test_changed_bearer_token_key(self): + token, expiration_time = self.person.Person_getBearerToken() + self.portal.REQUEST._auth = 'Bearer %s' % token + self.preference.edit(preferred_bearer_token_key='changed') + transaction.commit() + self.tic() + reference = self.getTokenCredential(self.portal.REQUEST) + self.assertEqual(reference, None) + + def test_expired_token(self): + # create expired token + # as everything in scripts is publishable and for now logic is in scripts + # they are not allowing to pass arguments, so lets hack in test + token = { + 'expiration_timestamp': DateTime()-1, + 'reference': self.person.getReference(), + 'user-agent': self.portal.REQUEST.getHeader('User-Agent'), + 'remote-addr': self.portal.REQUEST.get('REMOTE_ADDR') + } + hmac = self.portal.Base_getHMAC(self.portal.Base_getBearerTokenKey(), str( + token)) + self.portal.Base_setBearerToken(hmac, token) + reference = self.getTokenCredential(self.portal.REQUEST) + self.assertEqual(reference, None) diff --git a/bt5/erp5_bearer_token/bt/revision b/bt5/erp5_bearer_token/bt/revision index f11c82a4cb..9a037142aa 100644 --- a/bt5/erp5_bearer_token/bt/revision +++ b/bt5/erp5_bearer_token/bt/revision @@ -1 +1 @@ -9 \ No newline at end of file +10 \ No newline at end of file diff --git a/bt5/erp5_bearer_token/bt/template_test_id_list b/bt5/erp5_bearer_token/bt/template_test_id_list new file mode 100644 index 0000000000..e9ec688230 --- /dev/null +++ b/bt5/erp5_bearer_token/bt/template_test_id_list @@ -0,0 +1 @@ +testERP5BearerToken \ No newline at end of file -- GitLab