def test_all(self): """Test MODEL works""" username = u'test-user-1' user = model.User(name=username, fullname=username, email_addr=username) info = {'total': 150, 'long_description': 'hello world'} app = model.App(name=u'My New App', short_name=u'my-new-app', description=u'description', 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.app = app task_run.user = user db.session.add_all([user, app, task, task_run]) db.session.commit() app_id = app.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_08_user_progress_authenticated_user(self): """Test API userprogress as an authenticated user works""" self.register() self.signin() user = db.session.query(model.User)\ .filter(model.User.name == 'johndoe')\ .first() app = db.session.query(model.App)\ .get(1) tasks = db.session.query(model.Task)\ .filter(model.Task.app_id == app.id)\ .all() taskruns = db.session.query(model.TaskRun)\ .filter(model.TaskRun.app_id == app.id)\ .filter(model.TaskRun.user_id == user.id)\ .all() res = self.app.get('/api/app/1/userprogress', follow_redirects=True) data = json.loads(res.data) assert len(tasks) == data['total'],\ "The reported total number of tasks is wrong" assert len(taskruns) == data['done'],\ "The reported number of done tasks is wrong" res = self.app.get('/api/app/1/newtask') data = json.loads(res.data) print data # Add a new TaskRun and check again tr = model.TaskRun( app_id=1, task_id=data['id'], user_id=user.id, info={'answer': u'annakarenina'} ) db.session.add(tr) db.session.commit() res = self.app.get('/api/app/1/userprogress', follow_redirects=True) data = json.loads(res.data) assert len(tasks) == data['total'],\ "The reported total number of tasks is wrong" assert len(taskruns) + 1 == data['done'],\ "The reported number of done tasks is wrong: %s" %\ len(taskruns) self.signout()
def test_07_user_progress_anonymous(self): """Test API userprogress as anonymous works""" self.signout() app = db.session.query(model.App).get(1) tasks = db.session.query(model.Task)\ .filter(model.Task.app_id == app.id)\ .all() # User ID = 2 because, the 1 is the root user taskruns = db.session.query(model.TaskRun)\ .filter(model.TaskRun.app_id == app.id)\ .filter(model.TaskRun.user_id == 2)\ .all() res = self.app.get('/api/app/1/userprogress', follow_redirects=True) data = json.loads(res.data) error_msg = "The reported total number of tasks is wrong" assert len(tasks) == data['total'], error_msg error_msg = "The reported number of done tasks is wrong" print len(taskruns) assert len(taskruns) == data['done'], data res = self.app.get('/api/app/1/newtask') data = json.loads(res.data) print data # Add a new TaskRun and check again tr = model.TaskRun(app_id=1, task_id=data['id'], user_id=1, info={'answer': u'annakarenina'}) db.session.add(tr) db.session.commit() res = self.app.get('/api/app/1/userprogress', follow_redirects=True) data = json.loads(res.data) error_msg = "The reported total number of tasks is wrong" assert len(tasks) == data['total'], error_msg error_msg = "Number of done tasks is wrong: %s" % len(taskruns) assert len(taskruns) + 1 == data['done'], error_msg
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_anonymous_02_gets_different_tasks(self): """ Test SCHED newtask returns N different Tasks for the Anonymous User""" redis_flushall() # Del previous TaskRuns self.del_task_runs() assigned_tasks = [] # Get a Task until scheduler returns None res = self.app.get('api/app/1/newtask') data = json.loads(res.data) while data.get('info') is not None: # Check that we have received a Task assert data.get('info'), data # Save the assigned task assigned_tasks.append(data) # Submit an Answer for the assigned task tr = model.TaskRun(app_id=data['app_id'], task_id=data['id'], user_ip="127.0.0.1", info={'answer': 'Yes'}) db.session.add(tr) db.session.commit() res = self.app.get('api/app/1/newtask') data = json.loads(res.data) # Check if we received the same number of tasks that the available ones tasks = db.session.query(model.Task).filter_by(app_id=1).all() assert len(assigned_tasks) == len(tasks), len(assigned_tasks) # Check if all the assigned Task.id are equal to the available ones tasks = db.session.query(model.Task).filter_by(app_id=1).all() err_msg = "Assigned Task not found in DB Tasks" for at in assigned_tasks: assert self.is_task(at['id'], tasks), err_msg # Check that there are no duplicated tasks err_msg = "One Assigned Task is duplicated" for at in assigned_tasks: assert self.is_unique(at['id'], assigned_tasks), err_msg
def test_anonymous_03_respects_limit_tasks(self): """ Test SCHED newtask respects the limit of 30 TaskRuns per Task""" redis_flushall() # Del previous TaskRuns self.del_task_runs() assigned_tasks = [] # Get Task until scheduler returns None for i in range(10): res = self.app.get('api/app/1/newtask') data = json.loads(res.data) while data.get('info') is not None: # Check that we received a Task assert data.get('info'), data # Save the assigned task assigned_tasks.append(data) # Submit an Answer for the assigned task tr = model.TaskRun(app_id=data['app_id'], task_id=data['id'], user_ip="127.0.0." + str(i), info={'answer': 'Yes'}) db.session.add(tr) db.session.commit() res = self.app.get('api/app/1/newtask') data = json.loads(res.data) # Check if there are 30 TaskRuns per Task tasks = db.session.query(model.Task).filter_by(app_id=1).all() for t in tasks: assert len(t.task_runs) == 10, len(t.task_runs) # Check that all the answers are from different IPs err_msg = "There are two or more Answers from same IP" for t in tasks: for tr in t.task_runs: assert self.is_unique(tr.user_ip, t.task_runs), err_msg
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) print 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)
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()
def _add_task_run(self, task, user=None): tr = model.TaskRun(task=task, user=user) db.session.add(tr) db.session.commit()
def test_tasks_for_user_ip_id(self): """ Test SCHED newtask to see if sends the same ammount of Task to user_id and user_ip """ # Del Fixture Task self.del_task_runs() assigned_tasks = [] for i in range(10): signin = False if random.random >= 0.5: signin = True self.register(fullname=self.user.username + str(i), username=self.user.username + str(i), password=self.user.username + str(i)) if signin: print "Giving answers as User: %s" % self.user.username + str( i) else: print "Giving answers as User IP: 127.0.0.%s" % str(i) if signin: self.signin() # Get Task until scheduler returns None res = self.app.get('api/app/1/newtask') data = json.loads(res.data) while data.get('info') is not None: # Check that we received a Task assert data.get('info'), data # Save the assigned task assigned_tasks.append(data) # Submit an Answer for the assigned task if signin: tr = dict(app_id=data['app_id'], task_id=data['id'], info={'answer': 'No'}) tr = json.dumps(tr) self.app.post('/api/taskrun', data=tr) else: tr = model.TaskRun(app_id=data['app_id'], task_id=data['id'], user_ip="127.0.0." + str(i), info={'answer': 'Yes'}) db.session.add(tr) db.session.commit() res = self.app.get('api/app/1/newtask') data = json.loads(res.data) if signin: self.signout() # Check if there are 30 TaskRuns per Task tasks = db.session.query(model.Task).filter_by(app_id=1).all() for t in tasks: print len(t.task_runs) assert len(t.task_runs) == 10, t.task_runs # Check that all the answers are from different IPs and IDs err_msg1 = "There are two or more Answers from same User ID" err_msg2 = "There are two or more Answers from same User IP" for t in tasks: for tr in t.task_runs: if tr.user_id: assert self.is_unique(tr.user_id, t.task_runs), err_msg1 else: assert self.is_unique(tr.user_ip, t.task_runs), err_msg2