Exemplo n.º 1
0
    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
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
    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
Exemplo n.º 7
0
    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()
Exemplo n.º 8
0
    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)
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
 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()
Exemplo n.º 12
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)
        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
Exemplo n.º 13
0
    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
Exemplo n.º 14
0
    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
Exemplo n.º 15
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"
Exemplo n.º 16
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()