class CPSTestCase(ZopeTestCase): """Common CPS tasks. setUp must set a server_url attribute.""" cps_test_case_version = (3, 4, 0) server_url = None _lipsum = Lipsum() _all_langs = [ 'en', 'fr', 'de', 'it', 'es', 'pt_BR', 'nl', 'mg', 'ro', 'eu' ] _default_langs = _all_langs[:4] _default_extensions = [ 'CPSForum:default', 'CPSSkins:cps3', 'CPSSubscriptions:default' ] _cps_login = None # ------------------------------------------------------------ # cps actions # def cpsLogin(self, login, password, comment=None): """Log in a user. Raise on invalid credential.""" self._cps_login = None params = [ ['__ac_name', login], ['__ac_password', password], ['__ac_persistent', 'on'], ['submit', 'Login'], ] self.post("%s/logged_in" % self.server_url, params, description="Log in user [%s] %s" % (login, comment or '')) # assume we are logged in if we have a logout link... self.assert_( [link for link in self.listHref() if link.endswith('logout')], 'invalid credential: [%s:%s].' % (login, password)) self._cps_login = login def cpsLogout(self): """Log out the current user.""" if self._cps_login is not None: self.get('%s/logout' % self.server_url, description="Log out [%s]" % self._cps_login) def cpsCreateSite(self, admin_id, admin_pwd, manager_id, manager_password, manager_mail, langs=None, title=None, description=None, interface="portlets", zope_url=None, site_id=None, extensions=None): """Create a CPS Site. if zope_url or site_id is not provided guess them from the server_url. """ if zope_url is None or site_id is None: zope_url, site_id = self.cpsGuessZopeUrl() self.setBasicAuth(admin_id, admin_pwd) params = { 'site_id': site_id, 'title': title or "FunkLoad CPS Portal", 'manager_id': manager_id, 'password': manager_password, 'password_confirm': manager_password, 'manager_email': manager_mail, 'manager_firstname': 'Manager', 'manager_lastname': 'CPS Manager', 'extension_ids:list': extensions or self._default_extensions, 'description': description or "A funkload cps test site", 'languages:list': langs or self._default_langs, 'submit': 'Add', 'profile_id': 'CPSDefault:default' } self.post("%s/manage_addProduct/CPSDefault/addConfiguredCPSSite" % zope_url, params, description="Create a CPS Site") self.clearBasicAuth() def cpsCreateGroup(self, group_name): """Create a cps group.""" server_url = self.server_url params = [["dirname", "groups"], ["id", ""], ["widget__group", group_name], ["widget__members:tokens:default", ""], ["cpsdirectory_entry_create_form:method", "Create"]] self.post("%s/" % server_url, params) self.assert_(self.getLastUrl().find('psm_entry_created') != -1, 'Failed to create group %s' % group_name) def cpsVerifyGroup(self, group_name): """Check existance or create a cps group.""" server_url = self.server_url params = [ ["dirname", "groups"], ["id", group_name], ] if self.exists("%s/cpsdirectory_entry_view" % server_url, params, description="Check that group [%s] exists." % group_name): self.logd('Group %s exists.') else: self.cpsCreateGroup(group_name) def cpsCreateUser(self, user_id=None, user_pwd=None, user_givenName=None, user_sn=None, user_email=None, groups=None): """Create a cps user with the Member role. return login, pwd""" lipsum = self._lipsum sign = lipsum.getUniqWord() user_id = user_id or 'fl_' + sign.lower() user_givenName = user_givenName or lipsum.getWord().capitalize() user_sn = user_sn or user_id.upper() user_email = user_email or "[email protected]" user_pwd = user_pwd or lipsum.getUniqWord(length_min=6) params = [["dirname", "members"], ["id", ""], ["widget__id", user_id], ["widget__password", user_pwd], ["widget__confirm", user_pwd], ["widget__givenName", user_givenName], ["widget__sn", user_sn], ["widget__email", user_email], ["widget__roles:tokens:default", ""], ["widget__roles:list", "Member"], ["widget__groups:tokens:default", ""], ["widget__homeless:boolean", "False"], ["cpsdirectory_entry_create_form:method", "Create"]] for group in groups: params.append(["widget__groups:list", group]) self.post("%s/" % self.server_url, params, description="Create user [%s]" % user_id) self.assert_(self.getLastUrl().find('psm_entry_created') != -1, 'Failed to create user %s' % user_id) return user_id, user_pwd def cpsVerifyUser(self, user_id=None, user_pwd=None, user_givenName=None, user_sn=None, user_email=None, groups=None): """Verify if user exists or create him. return login, pwd if user exists pwd is None. """ if user_id: params = [ ["dirname", "members"], ["id", user_id], ] if self.exists("%s/cpsdirectory_entry_view" % self.server_url, params): self.logd('User %s exists.') return user_id, None return self.cpsCreateUser(user_id, user_pwd, user_givenName, user_sn, user_email, groups) def cpsSetLocalRole(self, url, name, role): """Setup local role role to url.""" params = [["member_ids:list", name], ["member_role", role]] self.post("%s/folder_localrole_add" % url, params, description="Grant local role %s to %s" % (role, name)) def cpsCreateSection(self, parent_url, title, description="ftest section for funkload testing.", lang=None): """Create a section.""" return self.cpsCreateFolder('Section', parent_url, title, description, lang or self.cpsGetRandomLanguage()) def cpsCreateWorkspace(self, parent_url, title, description="ftest workspace for funkload testing.", lang=None): """Create a workspace.""" return self.cpsCreateFolder('Workspace', parent_url, title, description, lang or self.cpsGetRandomLanguage()) def cpsCreateFolder(self, type, parent_url, title, description, lang): """Create a section or a workspace. Return the section full url.""" params = [["type_name", type], ["widget__Title", title], ["widget__Description", description], ["widget__LanguageSelectorCreation", lang], ["widget__hidden_folder:boolean", False], ["cpsdocument_create_button", "Create"]] self.post("%s/cpsdocument_create" % parent_url, params, "Create a %s" % type) return self.cpsCleanUrl(self.getLastBaseUrl()) def cpsCreateDocument(self, parent_url): """Create a simple random document. return a tuple: (doc_url, doc_id) """ language = self.cpsGetRandomLanguage() title = self._lipsum.getSubject(uniq=True, prefix='test %s' % language) params = [["type_name", "Document"], ["widget__Title", title], ["widget__Description", self._lipsum.getSubject(10)], ["widget__LanguageSelectorCreation", language], ["widget__content", self._lipsum.getMessage()], ["widget__content_rformat", "text"], ["cpsdocument_create_button", "Create"]] self.post("%s/cpsdocument_create" % parent_url, params, description="Creating a document") self.assert_(self.getLastUrl().find('psm_content_created') != -1, 'Failed to create [%s] in %s/.' % (title, parent_url)) doc_url = self.cpsCleanUrl(self.getLastBaseUrl()) doc_id = doc_url.split('/')[-1] return doc_url, doc_id def cpsCreateNewsItem(self, parent_url, photo_path=None): """Create a random news. return a tuple: (doc_url, doc_id).""" language = self.cpsGetRandomLanguage() title = self._lipsum.getSubject(uniq=True, prefix='test %s' % language) params = [ ["cpsformuid", self._lipsum.getUniqWord()], ["type_name", "News Item"], ["widget__Title", title], ["widget__Description", self._lipsum.getSubject(10)], ['widget__photo_filename', ''], ['widget__photo_choice', photo_path and 'change' or 'keep'], ['widget__photo', Upload(photo_path or '')], ['widget__photo_resize', 'img_auto_size'], ['widget__photo_rposition', 'left'], ['widget__photo_subtitle', ''], ["widget__content", self._lipsum.getMessage()], ["widget__content_rformat", "text"], ['widget__content_fileupload', Upload('')], ["widget__Subject:tokens:default", ""], ["widget__Subject:list", "Business"], # prevent invalid date depending on ui locale ["widget__publication_date_date", time.strftime('01/01/%Y')], ["widget__publication_date_hour", time.strftime('%H')], ["widget__publication_date_minute", time.strftime('%M')], ["cpsdocument_create_button", "Create"] ] self.post("%s/cpsdocument_create" % parent_url, params, description="Creating a news item") last_url = self.getLastUrl() self.assert_('psm_content_created' in last_url, 'Failed to create [%s] in %s/.' % (title, parent_url)) doc_url = self.cpsCleanUrl(self.getLastBaseUrl()) doc_id = doc_url.split('/')[-1] return doc_url, doc_id def cpsChangeUiLanguage(self, lang): """Change the ui language and return the referer page.""" self.get("%s/cpsportlet_change_language" % self.server_url, params=[['lang', lang]], description="Change UI language to %s" % lang) # ------------------------------------------------------------ # helpers # def cpsGetRandomLanguage(self): """Return a random language.""" return random.choice(self._all_langs) def cpsGuessZopeUrl(self, cps_url=None): """Guess a zope url and site_id from a CPS Site url. return a tuple (zope_url, site_id) """ if cps_url is None: cps_url = self.server_url site_id = cps_url.split('/')[-1] zope_url = cps_url[:-(len(site_id) + 1)] return zope_url, site_id def cpsSearchDocId(self, doc_id): """Return the list of url that ends with doc_id. Using catalog search.""" params = [["SearchableText", doc_id]] self.post("%s/search_form" % self.server_url, params, description="Searching doc_id %s" % doc_id) ret = self.cpsListDocumentHref(pattern='%s$' % doc_id) self.logd('found %i link ends with %s' % (len(ret), doc_id)) return ret def cpsCleanUrl(self, url_in): """Try to remove server_url and clean ending.""" url = url_in server_url = self.server_url for ending in ('/', '/view', '/folder_contents', '/folder_view', '/cpsdocument_metadata', '/cpsdocument_edit_form'): if url.endswith(ending): url = url[:-len(ending)] if url.startswith(server_url): url = url[len(server_url):] return url def cpsListDocumentHref(self, pattern=None): """Return a clean list of document href that matches pattern. Try to remove server_url and other cps trailings, return a list of uniq url.""" ret = [] for href in [self.cpsCleanUrl(x) for x in self.listHref(pattern)]: if href not in ret: ret.append(href) return ret
def __init__(self, argv=None): XmlRpcBaseServer.__init__(self, argv) self.lipsum = Lipsum()