Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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()
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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"
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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()
Ejemplo n.º 9
0
 def _add_task_run(self, task, user=None):
     tr = model.TaskRun(task=task, user=user)
     db.session.add(tr)
     db.session.commit()
Ejemplo n.º 10
0
    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