# -*- coding: utf8 -*- # This file is part of PyBossa. # # Copyright (C) 2015 SciFabric LTD. # # PyBossa is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # PyBossa is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with PyBossa. If not, see . from mock import patch from default import Test, db, Fixtures, with_context from pybossa.model.category import Category from pybossa.model.task import Task from pybossa.model.task_run import TaskRun class Helper(Test): """Class to help testing the web interface""" def html_title(self, title=None): """Helper function to create an HTML title""" if title is None: return "PyBossa" else: return "PyBossa · %s" % title @patch('pybossa.view.account.signer') def register(self, mock, fullname="John Doe", name="johndoe", password="p4ssw0rd", email=None): """Helper function to register and sign in a user""" if email is None: email = name + '@example.com' userdict = {'fullname': fullname, 'name': name, 'email_addr': email, 'password': password} mock.loads.return_value = userdict return self.app.get('/account/register/confirmation?key=fake-key', follow_redirects=True) def signin(self, method="POST", email="johndoe@example.com", password="p4ssw0rd", next=None): """Helper function to sign in current user""" url = '/account/signin' if next is not None: url = url + '?next=' + next if method == "POST": return self.app.post(url, data={'email': email, 'password': password}, follow_redirects=True) else: return self.app.get(url, follow_redirects=True) def profile(self, name="johndoe"): """Helper function to check profile of signed in user""" url = "/account/%s" % name return self.app.get(url, follow_redirects=True) def update_profile(self, method="POST", id=1, fullname="John Doe", name="johndoe", locale="es", email_addr="johndoe@example.com", subscribed=False, new_name=None, btn='Profile'): """Helper function to update the profile of users""" url = "/account/%s/update" % name if new_name: name = new_name if (method == "POST"): return self.app.post(url, data={'id': id, 'fullname': fullname, 'name': name, 'locale': locale, 'email_addr': email_addr, 'btn': btn}, follow_redirects=True) else: return self.app.get(url, follow_redirects=True) def signout(self): """Helper function to sign out current user""" return self.app.get('/account/signout', follow_redirects=True) def create_categories(self): with self.flask_app.app_context(): categories = db.session.query(Category).all() if len(categories) == 0: print "Categories 0" print "Creating default ones" self._create_categories() def new_project(self, method="POST", name="Sample Project", short_name="sampleapp", description="Description", long_description=u'Long Description\n================'): """Helper function to create a project""" if method == "POST": self.create_categories() return self.app.post("/project/new", data={ 'name': name, 'short_name': short_name, 'description': description, 'long_description': long_description, }, follow_redirects=True) else: return self.app.get("/project/new", follow_redirects=True) def new_task(self, project_id): """Helper function to create tasks for a project""" tasks = [] for i in range(0, 10): tasks.append(Task(project_id=project_id, state='0', info={})) db.session.add_all(tasks) db.session.commit() def delete_task_runs(self, project_id=1): """Deletes all TaskRuns for a given project_id""" db.session.query(TaskRun).filter_by(project_id=project_id).delete() db.session.commit() def task_settings_scheduler(self, method="POST", short_name='sampleapp', sched="default"): """Helper function to modify task scheduler""" url = "/project/%s/tasks/scheduler" % short_name if method == "POST": return self.app.post(url, data={ 'sched': sched, }, follow_redirects=True) else: return self.app.get(url, follow_redirects=True) def task_settings_redundancy(self, method="POST", short_name='sampleapp', n_answers=30): """Helper function to modify task redundancy""" url = "/project/%s/tasks/redundancy" % short_name if method == "POST": return self.app.post(url, data={ 'n_answers': n_answers, }, follow_redirects=True) else: return self.app.get(url, follow_redirects=True) def task_settings_priority(self, method="POST", short_name='sampleapp', task_ids="1", priority_0=0.0): """Helper function to modify task redundancy""" url = "/project/%s/tasks/priority" % short_name if method == "POST": return self.app.post(url, data={ 'task_ids': task_ids, 'priority_0': priority_0 }, follow_redirects=True) else: return self.app.get(url, follow_redirects=True) def delete_project(self, method="POST", short_name="sampleapp"): """Helper function to delete a project""" if method == "POST": return self.app.post("/project/%s/delete" % short_name, follow_redirects=True) else: return self.app.get("/project/%s/delete" % short_name, follow_redirects=True) def update_project(self, method="POST", short_name="sampleapp", id=1, new_name="Sample Project", new_short_name="sampleapp", new_description="Description", new_allow_anonymous_contributors='false', new_category_id="1", new_long_description="Long desc", new_sched="random", new_webhook='http://server.com', new_protect='false', new_password=''): """Helper function to update a project""" if method == "POST": return self.app.post("/project/%s/update" % short_name, data={ 'id': id, 'name': new_name, 'short_name': new_short_name, 'description': new_description, 'allow_anonymous_contributors': new_allow_anonymous_contributors, 'category_id': new_category_id, 'long_description': new_long_description, 'sched': new_sched, 'webhook': new_webhook, 'protect': new_protect, 'password': new_password, 'btn': 'Save'}, follow_redirects=True) else: return self.app.get("/project/%s/update" % short_name, follow_redirects=True)