def _test_get_breadth_first_task(self, user=None): self.del_task_runs() if user: short_name = 'xyzuser' else: short_name = 'xyznouser' app = model.App(short_name=short_name, name=short_name, description=short_name) owner = db.session.query(model.User).get(1) app.owner = owner task = model.Task(app=app, state='0', info={}) task2 = model.Task(app=app, state='0', info={}) task.app = app task2.app = app db.session.add(app) db.session.add(task) db.session.add(task2) db.session.commit() taskid = task.id appid = app.id # give task2 a bunch of runs for idx in range(2): self._add_task_run(app, task2) # now check we get task without task runs as anonymous user out = pybossa.sched.get_breadth_first_task(appid) assert out.id == taskid, out # now check we get task without task runs as a user out = pybossa.sched.get_breadth_first_task(appid, owner.id) assert out.id == taskid, out # now check that offset works out1 = pybossa.sched.get_breadth_first_task(appid) out2 = pybossa.sched.get_breadth_first_task(appid, offset=1) assert out1.id != out2.id, out # asking for a bigger offset (max 10) out2 = pybossa.sched.get_breadth_first_task(appid, offset=11) assert out2 is None, out self._add_task_run(app, task) out = pybossa.sched.get_breadth_first_task(appid) assert out.id == taskid, out # now add 2 more taskruns. We now have 3 and 2 task runs per task self._add_task_run(app, task) self._add_task_run(app, task) out = pybossa.sched.get_breadth_first_task(appid) assert out.id == task2.id, out
def new_task(self, appid): """Helper function to create tasks for an app""" tasks = [] for i in range(0, 10): tasks.append(model.Task(app_id=appid, state='0', info={})) db.session.add_all(tasks) db.session.commit()
def test_22_get_specific_completed_task_anonymous(self): """Test WEB get specific completed task_id for an app works as anonymous""" model.rebuild_db() Fixtures.create() app = db.session.query(model.App).first() task = db.session.query(model.Task)\ .filter(model.App.id == app.id)\ .first() for i in range(10): task_run = model.TaskRun(app_id=app.id, task_id=task.id, user_ip="127.0.0.1", info={'answer': 1}) db.session.add(task_run) db.session.commit() ntask = model.Task(id=task.id, state='completed') assert ntask not in db.session db.session.merge(ntask) db.session.commit() res = self.app.get('app/%s/task/%s' % (app.short_name, task.id), follow_redirects=True) assert 'You have already participated in this task'\ in res.data, res.data assert 'Try with another one' in res.data, res.data
def test_17_export_task_runs(self): """Test WEB TaskRun export works""" self.register() self.new_application() app = db.session.query(model.App).first() task = model.Task(app_id=app.id, info={'n_answers': 10}) db.session.add(task) db.session.commit() for i in range(10): task_run = model.TaskRun(app_id=app.id, task_id=1, info={'answer': 1}) db.session.add(task_run) db.session.commit() self.signout() app = db.session.query(model.App).first() res = self.app.get('app/%s/%s/results.json' % (app.id, 1), follow_redirects=True) data = json.loads(res.data) assert len(data) == 10, data for tr in data: assert tr['info']['answer'] == 1, tr
def test_16_task_status_completed(self): """Test WEB Task Status Completed works""" self.register() self.new_application() app = db.session.query(model.App).first() # We use a string here to check that it works too task = model.Task(app_id=app.id, info={'n_answers': '10'}) db.session.add(task) db.session.commit() for i in range(10): task_run = model.TaskRun(app_id=app.id, task_id=1, info={'answer': 1}) db.session.add(task_run) db.session.commit() self.app.get('api/app/%s/newtask' % app.id) self.signout() app = db.session.query(model.App).first() res = self.app.get('app/%s/tasks' % (app.short_name), follow_redirects=True) assert "Sample App" in res.data, res.data assert 'Task <span class="label label-success">#1</span>'\ in res.data, res.data assert '10 of 10' in res.data, res.data assert 'Download results' in res.data, res.data
def test_02a_stats_hidden_apps(self): """Test WEB leaderboard does not show hidden apps""" self.register() self.new_application() app = db.session.query(model.App).first() # We use a string here to check that it works too task = model.Task(app_id=app.id, info={'n_answers': '10'}) db.session.add(task) db.session.commit() for i in range(10): task_run = model.TaskRun(app_id=app.id, task_id=1, info={'answer': 1}) db.session.add(task_run) db.session.commit() self.app.get('api/app/%s/newtask' % app.id) self.update_application(new_hidden=True) self.signout() res = self.app.get('/stats', follow_redirects=True) assert self.html_title("Leaderboard") in res.data, res assert "Most active applications" in res.data, res assert "Most active volunteers" in res.data, res assert "Sample App" not in res.data, res
def test_task_run_errors(self): """Test TASK_RUN model errors.""" user = model.User(email_addr="*****@*****.**", name="johndoe", fullname="John Doe", locale="en") db.session.add(user) db.session.commit() user = db.session.query(model.User).first() app = model.App(name='Application', short_name='app', description='desc', owner_id=user.id) db.session.add(app) db.session.commit() task = model.Task(app_id=app.id) db.session.add(task) db.session.commit() task_run = model.TaskRun(app_id=None, task_id=task.id) db.session.add(task_run) assert_raises(IntegrityError, db.session.commit) db.session.rollback() task_run = model.TaskRun(app_id=app.id, task_id=None) db.session.add(task_run) assert_raises(IntegrityError, db.session.commit) db.session.rollback()
def test_anonymous_user_create_repeated_taskrun(self): """Test anonymous user cannot create a taskrun for a task to which he has previously posted a taskrun""" taskrun_authorization.current_user = FakeCurrentUser() taskrun1 = model.TaskRun(app_id=self.app.id, task_id=self.task.id, user_ip='127.0.0.0', info="some taskrun info") db.session.add(taskrun1) db.session.commit() taskrun2 = model.TaskRun(app_id=self.app.id, task_id=self.task.id, user_ip='127.0.0.0', info="a different taskrun info") assert taskrun_authorization.current_user.is_anonymous() assert_raises(Forbidden, taskrun_authorization.create, taskrun2) # But the user can still create taskruns for different tasks task2 = model.Task(app_id=self.app.id, state='0', n_answers=10) task2.app = self.app db.session.add(task2) db.session.commit() taskrun3 = model.TaskRun(app_id=self.app.id, task_id=task2.id, user_ip='127.0.0.0', info="some taskrun info") assert taskrun_authorization.create(taskrun3)
def test_all(self): """Test MODEL works""" username = u'test-user-1' user = model.User(name=username) info = { 'total': 150, 'long_description': 'hello world' } app = model.App( name=u'My New App', short_name=u'my-new-app', info=info ) app.owner = user task_info = { 'question': 'My random question', 'url': 'my url' } task = model.Task(info=task_info) task_run_info = { 'answer': u'annakarenina' } task_run = model.TaskRun(info=task_run_info) task.app = app task_run.task = task task_run.user = user db.session.add_all([user, app, task, task_run]) db.session.commit() app_id = app.id user_id = user.id db.session.remove() app = db.session.query(model.App).get(app_id) assert app.name == u'My New App', app # year would start with 201... assert app.created.startswith('201'), app.created assert app.long_tasks==0, app.long_tasks assert app.hidden==0, app.hidden assert app.time_estimate==0, app assert app.time_limit==0, app assert app.calibration_frac==0, app assert app.bolt_course_id==0 assert len(app.tasks) == 1, app assert app.owner.name == username, app out_task = app.tasks[0] assert out_task.info['question'] == task_info['question'], out_task assert out_task.quorum==0, out_task assert out_task.state=="ongoing", out_task assert out_task.calibration==0, out_task assert out_task.priority_0==0, out_task assert len(out_task.task_runs) == 1, out_task outrun = out_task.task_runs[0] assert outrun.info['answer'] == task_run_info['answer'], outrun assert outrun.user.name == username, outrun user = model.User.by_name(username) assert user.apps[0].id == app_id, user
def test_all(self): """Test MODEL works""" username = u'test-user-1' user = model.User(name=username) info = { 'total': 150, 'long_description': 'hello world' } app = model.App( name=u'My New App', short_name=u'my-new-app', info=info ) app.owner = user task_info = { 'question': 'My random question', 'url': 'my url' } task = model.Task(info=task_info) task_run_info = { 'answer': u'annakarenina' } task_run = model.TaskRun(info=task_run_info) task.app = app task_run.task = task task_run.user = user model.Session.add_all([user, app, task, task_run]) model.Session.commit() app_id = app.id user_id = user.id model.Session.remove() app = model.Session.query(model.App).get(app_id) assert app.name == u'My New App', app # year would start with 201... assert app.created.startswith('201'), app.created assert len(app.tasks) == 1, app assert app.owner.name == username, app out_task = app.tasks[0] assert out_task.info['question'] == task_info['question'], out_task assert len(out_task.task_runs) == 1, out_task outrun = out_task.task_runs[0] assert outrun.info['answer'] == task_run_info['answer'], outrun assert outrun.user.name == username, outrun user = model.User.by_name(username) assert user.apps[0].id == app_id, user # TODO: better testing where we actually get a random task task = model.new_task(app_id, user_id) assert task is None, 'There should be no tasks for this user' task = model.new_task(app_id) assert task, task
def setUp(self): model.rebuild_db() self.root, self.user1, self.user2 = Fixtures.create_users() self.app = Fixtures.create_app('') self.app.owner = self.root db.session.add(self.app) db.session.commit() self.task = model.Task(app_id=self.app.id, state='0', n_answers=10) self.task.app = self.app db.session.add(self.task) db.session.commit()
def test_00_limits_query(self): """Test API GET limits works""" for i in range(30): app = model.App(name="name%s" % i, short_name="short_name%s" % i, description="desc", owner_id=1) info = dict(a=0) task = model.Task(app_id=1, info=info) taskrun = model.TaskRun(app_id=1, task_id=1) db.session.add(app) db.session.add(task) db.session.add(taskrun) db.session.commit() res = self.app.get('/api/app') data = json.loads(res.data) assert len(data) == 20, len(data) res = self.app.get('/api/app?limit=10') data = json.loads(res.data) assert len(data) == 10, len(data) res = self.app.get('/api/app?limit=10&offset=10') data = json.loads(res.data) assert len(data) == 10, len(data) assert data[0].get('name') == 'name9' res = self.app.get('/api/task') data = json.loads(res.data) assert len(data) == 20, len(data) res = self.app.get('/api/taskrun') data = json.loads(res.data) assert len(data) == 20, len(data) # Register 30 new users to test limit on users too for i in range(30): self.register(fullname="User%s" %i, username="******" %i) res = self.app.get('/api/user') data = json.loads(res.data) assert len(data) == 20, len(data) res = self.app.get('/api/user?limit=10') data = json.loads(res.data) print data assert len(data) == 10, len(data) res = self.app.get('/api/user?limit=10&offset=10') data = json.loads(res.data) assert len(data) == 10, len(data) assert data[0].get('name') == 'user7', data
def test_20_app_index_published(self): """Test WEB Application Index published works""" self.register() self.new_application() app = db.session.query(model.App).first() info = dict(task_presenter="some html") app.info = info db.session.commit() task = model.Task(app_id=app.id, info={'n_answers': 10}) db.session.add(task) db.session.commit() self.signout() res = self.app.get('app', follow_redirects=True) assert "Applications" in res.data, res.data assert "Featured</h2>" not in res.data, res.data assert "Published</h2>" in res.data, res.data assert "Draft</h2>" not in res.data, res.data
def test_18_task_status_wip(self): """Test WEB Task Status on going works""" self.register() self.new_application() app = db.session.query(model.App).first() task = model.Task(app_id=app.id, info={'n_answers': 10}) db.session.add(task) db.session.commit() self.signout() app = db.session.query(model.App).first() res = self.app.get('app/%s/tasks' % (app.short_name), follow_redirects=True) assert "Sample App" in res.data, res.data assert 'Task <span class="label label-info">#1</span>'\ in res.data, res.data assert '0 of 10' in res.data, res.data
def test_31_user_profile_progress(self): """Test WEB user progress profile page works""" self.register() self.new_application() app = db.session.query(model.App).first() task = model.Task(app_id=app.id, info={'n_answers': '10'}) db.session.add(task) db.session.commit() for i in range(10): task_run = model.TaskRun(app_id=app.id, task_id=1, user_id=1, info={'answer': 1}) db.session.add(task_run) db.session.commit() self.app.get('api/app/%s/newtask' % app.id) res = self.app.get('account/profile', follow_redirects=True) assert "Sample App" in res.data, res.data assert "Contributed tasks: 10" in res.data, res.data assert "Contribute!" in res.data, "There should be a Contribute button"
def test_24_get_specific_completed_task_user(self): """Test WEB get specific completed task_id for an app works as an user""" model.rebuild_db() Fixtures.create() self.register() user = db.session.query(model.User)\ .filter(model.User.name == 'johndoe')\ .first() app = db.session.query(model.App).first() task = db.session.query(model.Task)\ .filter(model.App.id == app.id)\ .first() for i in range(10): task_run = model.TaskRun(app_id=app.id, task_id=task.id, user_id=user.id, info={'answer': 1}) db.session.add(task_run) db.session.commit() #self.app.get('api/app/%s/newtask' % app.id) ntask = model.Task(id=task.id, state='completed') #self.signin() assert ntask not in db.session db.session.merge(ntask) db.session.commit() res = self.app.get('app/%s/task/%s' % (app.short_name, task.id), follow_redirects=True) assert 'You have already participated in this task'\ in res.data, res.data assert 'Try with another one' in res.data, res.data self.signout()