示例#1
0
    def test_blogpost_delete_errors(self):
        """Test blogposts delete for non existing apps raises errors"""
        self.register()
        user = db.session.query(User).get(1)
        app1 = App(name='app1',
                short_name='app1',
                description=u'description')
        app2 = self.create_app(info=None)
        app1.owner = user
        app2.owner = user
        blogpost = Blogpost(owner=user, app=app1, title='thisisatitle', body='body')
        db.session.add_all([app1, app2, blogpost])
        db.session.commit()

        # To a non-existing app
        url = "/app/non-existing-app/blog/%s/delete" % blogpost.id
        res = self.app.post(url, follow_redirects=True)
        assert res.status_code == 404, res.status_code

        # To a non-existing post
        url = "/app/%s/blog/999999/delete" % app1.short_name
        res = self.app.post(url, follow_redirects=True)
        assert res.status_code == 404, res.status_code

        # To an existing post but with an app in the URL it does not belong to
        url = "/app/%s/blog/%s/delete" % (app2.short_name, blogpost.id)
        res = self.app.post(url, follow_redirects=True)
        assert res.status_code == 404, res.status_code
示例#2
0
    def test_no_more_tasks(self):
        """Test that a users gets always tasks"""
        self.create()
        app = App(short_name='egil', name='egil',
                  description='egil')
        owner = db.session.query(User).get(1)
        app.owner_id = owner.id
        db.session.add(app)
        db.session.commit()

        app_id = app.id

        for i in range(20):
            task = Task(app=app, info={'i': i}, n_answers=10)
            db.session.add(task)
            db.session.commit()

        tasks = db.session.query(Task).filter_by(app_id=app.id).limit(11).all()
        for t in tasks[0:10]:
            for x in range(10):
                self._add_task_run(app, t)

        assert tasks[0].n_answers == 10

        url = 'api/app/%s/newtask' % app_id
        res = self.app.get(url)
        data = json.loads(res.data)

        err_msg = "User should get a task"
        assert 'app_id' in data.keys(), err_msg
        assert data['app_id'] == app_id, err_msg
        assert data['id'] == tasks[10].id, err_msg
示例#3
0
    def test_blogpost_delete_errors(self):
        """Test blogposts delete for non existing apps raises errors"""
        self.register()
        user = db.session.query(User).get(1)
        app1 = App(name='app1', short_name='app1', description=u'description')
        app2 = self.create_app(info=None)
        app1.owner = user
        app2.owner = user
        blogpost = Blogpost(owner=user,
                            app=app1,
                            title='thisisatitle',
                            body='body')
        db.session.add_all([app1, app2, blogpost])
        db.session.commit()

        # To a non-existing app
        url = "/app/non-existing-app/%s/delete" % blogpost.id
        res = self.app.post(url, follow_redirects=True)
        assert res.status_code == 404, res.status_code

        # To a non-existing post
        url = "/app/%s/999999/delete" % app1.short_name
        res = self.app.post(url, follow_redirects=True)
        assert res.status_code == 404, res.status_code

        # To an existing post but with a project in the URL it does not belong to
        url = "/app/%s/%s/delete" % (app2.short_name, blogpost.id)
        res = self.app.post(url, follow_redirects=True)
        assert res.status_code == 404, res.status_code
示例#4
0
    def test_no_more_tasks(self):
        """Test that a users gets always tasks"""
        self.create()
        app = App(short_name='egil', name='egil', description='egil')
        owner = db.session.query(User).get(1)
        app.owner_id = owner.id
        db.session.add(app)
        db.session.commit()

        app_id = app.id

        for i in range(20):
            task = Task(app=app, info={'i': i}, n_answers=10)
            db.session.add(task)
            db.session.commit()

        tasks = db.session.query(Task).filter_by(app_id=app.id).limit(11).all()
        for t in tasks[0:10]:
            for x in range(10):
                self._add_task_run(app, t)

        assert tasks[0].n_answers == 10

        url = 'api/app/%s/newtask' % app_id
        res = self.app.get(url)
        data = json.loads(res.data)

        err_msg = "User should get a task"
        assert 'app_id' in data.keys(), err_msg
        assert data['app_id'] == app_id, err_msg
        assert data['id'] == tasks[10].id, err_msg
示例#5
0
    def test_all(self):
        """Test MODEL works"""
        username = u'test-user-1'
        user = User(name=username, fullname=username, email_addr=username)
        info = {
            'total': 150,
            'long_description': 'hello world'}
        app = App(
            name=u'My New Project',
            short_name=u'my-new-app',
            description=u'description',
            info=info)
        category = Category(name=u'cat', short_name=u'cat', description=u'cat')
        app.category = category
        app.owner = user
        task_info = {
            'question': 'My random question',
            'url': 'my url'}
        task = Task(info=task_info)
        task_run_info = {'answer': u'annakarenina'}
        task_run = 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(App).get(app_id)
        assert app.name == u'My New Project', 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 = User.by_name(username)
        assert user.apps[0].id == app_id, user
示例#6
0
    def _test_get_breadth_first_task(self, user=None):
        self.del_task_runs()
        if user:
            short_name = 'xyzuser'
        else:
            short_name = 'xyznouser'

        category = db.session.query(Category).get(1)
        app = App(short_name=short_name, name=short_name,
              description=short_name, category=category)
        owner = db.session.query(User).get(1)

        app.owner = owner
        task = Task(app=app, state='0', info={})
        task2 = 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
        owner = db.session.query(User).get(1)
        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
示例#7
0
    def test_app_errors(self):
        """Test project model errors."""
        app = App(name='Project',
                  short_name='proj',
                  description='desc',
                  owner_id=None)

        # App.owner_id shoult not be nullable
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        # App.name shoult not be nullable
        user = User(email_addr="*****@*****.**",
                    name="johndoe",
                    fullname="John Doe",
                    locale="en")
        db.session.add(user)
        db.session.commit()
        user = db.session.query(User).first()
        app.owner_id = user.id
        app.name = None
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        app.name = ''
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        # App.short_name shoult not be nullable
        app.name = "Project"
        app.short_name = None
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        app.short_name = ''
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        # App.description shoult not be nullable
        db.session.add(app)
        app.short_name = "project"
        app.description = None
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        app.description = ''
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()
示例#8
0
    def test_all(self):
        """Test MODEL works"""
        username = u'test-user-1'
        user = User(name=username, fullname=username, email_addr=username)
        info = {'total': 150, 'long_description': 'hello world'}
        app = App(name=u'My New Project',
                  short_name=u'my-new-app',
                  description=u'description',
                  info=info)
        category = Category(name=u'cat', short_name=u'cat', description=u'cat')
        app.category = category
        app.owner = user
        task_info = {'question': 'My random question', 'url': 'my url'}
        task = Task(info=task_info)
        task_run_info = {'answer': u'annakarenina'}
        task_run = 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(App).get(app_id)
        assert app.name == u'My New Project', 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 = User.by_name(username)
        assert user.apps[0].id == app_id, user
示例#9
0
 def create_app_with_tasks(self, completed_tasks, ongoing_tasks):
     app = App(name='my_app',
               short_name='my_app_shortname',
               description=u'description')
     app.owner = self.user
     db.session.add(app)
     for i in range(completed_tasks):
         task = Task(app_id = 1, state = 'completed', n_answers=3)
         db.session.add(task)
     for i in range(ongoing_tasks):
         task = Task(app_id = 1, state = 'ongoing', n_answers=3)
         db.session.add(task)
     db.session.commit()
     return app
示例#10
0
    def test_task_run_errors(self):
        """Test TASK_RUN model errors."""
        user = User(email_addr="*****@*****.**",
                    name="johndoe",
                    fullname="John Doe",
                    locale="en")
        db.session.add(user)
        db.session.commit()

        user = db.session.query(User).first()
        category = Category(name=u'cat', short_name=u'cat', description=u'cat')
        app = App(name='Application',
                  short_name='app',
                  description='desc',
                  owner_id=user.id,
                  category=category)
        db.session.add(app)
        db.session.commit()

        task = Task(app_id=app.id)
        db.session.add(task)
        db.session.commit()

        task_run = TaskRun(app_id=None, task_id=task.id)
        db.session.add(task_run)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        task_run = TaskRun(app_id=app.id, task_id=None)
        db.session.add(task_run)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()
示例#11
0
    def test_05_resource_create(self, Mock):
        """Test CKAN resource_create works"""
        pkg_request = FakeRequest(json.dumps(self.pkg_json_found), 200,
                                  {'content-type': 'application/json'})

        rsrc_request = FakeRequest(
            json.dumps(self.pkg_json_found['result']['resources'][0]), 200,
            {'content-type': 'text/html'})
        Mock.return_value = pkg_request
        with self.flask_app.test_request_context('/'):
            # Resource that exists
            app = App(short_name='urbanpark', name='Urban Parks')
            user = User(fullname='Daniel Lombrana Gonzalez')
            self.ckan.package_create(app=app,
                                     user=user,
                                     url="http://something.com")
            Mock.return_value = rsrc_request
            out = self.ckan.resource_create(name='task')
            err_msg = "It should create the task resource"
            assert out["id"] == self.task_resource_id, err_msg
            Mock.return_value = self.server_error
            try:
                self.ckan.resource_create(name='something-goes-wrong')
            except Exception as out:
                type, msg, status_code = out.args
                assert "Server Error" in msg, msg
                assert 500 == status_code, status_code
                assert "CKAN: the remote site failed! resource_create failed" == type, type
示例#12
0
    def test_08_package_update(self, Mock):
        """Test CKAN package_update works"""
        html_request = FakeRequest(json.dumps(self.pkg_json_found), 200,
                                   {'content-type': 'application/json'})
        Mock.return_value = html_request
        with self.flask_app.test_request_context('/'):
            # Resource that exists
            app = App(short_name='urbanpark', name='Urban Parks')
            user = User(fullname='Daniel Lombrana Gonzalez')
            out = self.ckan.package_update(
                app=app,
                user=user,
                url="http://something.com",
                resources=self.pkg_json_found['result']['resources'])
            err_msg = "The package ID should be the same"
            assert out['id'] == self.package_id, err_msg

            # Check the exception
            Mock.return_value = self.server_error
            try:
                self.ckan.package_update(
                    app=app,
                    user=user,
                    url="http://something.com",
                    resources=self.pkg_json_found['result']['resources'])
            except Exception as out:
                type, msg, status_code = out.args
                assert "Server Error" in msg, msg
                assert 500 == status_code, status_code
                assert "CKAN: the remote site failed! package_update failed" == type, type
示例#13
0
def get_app(short_name):
    sql = text('''SELECT * FROM
                  app WHERE app.short_name=:short_name''')
    results = db.engine.execute(sql, short_name=short_name)
    app = App()
    for row in results:
        app = App(
            id=row.id,
            name=row.name,
            short_name=row.short_name,
            created=row.created,
            description=row.description,
            long_description=row.long_description,
            owner_id=row.owner_id,
            hidden=row.hidden,
            info=json.loads(row.info),
            allow_anonymous_contributors=row.allow_anonymous_contributors)
    return app
示例#14
0
    def test_03_app_put(self):
        """Test API.app PUT rate limit."""
        for i in range(300):
            app = App(name=str(i), short_name=str(i),
                      description=str(i), owner_id=1)
            db.session.add(app)
        db.session.commit()

        url = '?api_key=%s' % (self.api_key)
        self.check_limit(url, 'put', 'app')
示例#15
0
    def test_00_limits_query(self):
        """Test API GET limits works"""
        for i in range(30):
            app = App(name="name%s" % i,
                      short_name="short_name%s" % i,
                      description="desc",
                      owner_id=1)

            info = dict(a=0)
            task = Task(app_id=1, info=info)
            taskrun = 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')
        print res.data
        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
示例#16
0
 def create_project(cls, info):
     category = db.session.query(Category).first()
     if category is None:
         cls.create_categories()
         category = db.session.query(Category).first()
     app = App(name=cls.app_name,
               short_name=cls.app_short_name,
               description=u'description',
               hidden=0,
               category_id=category.id,
               info=info)
     return app
示例#17
0
 def create_app_with_contributors(self, anonymous, registered, two_tasks=False, name='my_app'):
     app = App(name=name,
               short_name='%s_shortname' % name,
               description=u'description')
     app.owner = self.user
     db.session.add(app)
     task = Task(app=app)
     db.session.add(task)
     if two_tasks:
         task2 = Task(app=app)
         db.session.add(task2)
     db.session.commit()
     for i in range(anonymous):
         task_run = TaskRun(app_id = app.id,
                            task_id = 1,
                            user_ip = '127.0.0.%s' % i)
         db.session.add(task_run)
         if two_tasks:
             task_run2 = TaskRun(app_id = app.id,
                            task_id = 2,
                            user_ip = '127.0.0.%s' % i)
             db.session.add(task_run2)
     for i in range(registered):
         user = User(email_addr = "*****@*****.**" % i,
                     name = "user%s" % i,
                     passwd_hash = "1234%s" % i,
                     fullname = "user_fullname%s" % i)
         db.session.add(user)
         task_run = TaskRun(app_id = app.id,
                            task_id = 1,
                            user = user)
         db.session.add(task_run)
         if two_tasks:
             task_run2 = TaskRun(app_id = app.id,
                            task_id = 2,
                            user = user)
             db.session.add(task_run2)
     db.session.commit()
     return app
示例#18
0
 def create_project(self, info):
     with self.flask_app.app_context():
         category = db.session.query(Category).first()
         if category is None:
             self._create_categories()
             category = db.session.query(Category).first()
         app = App(name=self.app_name,
                   short_name=self.app_short_name,
                   description=u'description',
                   hidden=0,
                   category_id=category.id,
                   info=info)
         return app
示例#19
0
 def setUp(self):
     super(TestBlogpostModel, self).setUp()
     with self.flask_app.app_context():
         user = User(email_addr="*****@*****.**",
                     name="johndoe",
                     fullname="John Doe",
                     locale="en")
         app = App(name='Application',
                   short_name='app',
                   description='desc',
                   owner=user)
         db.session.add(user)
         db.session.add(app)
         db.session.commit()
示例#20
0
    def test_app_errors(self):
        """Test project model errors."""
        app = App(name='Project',
                  short_name='proj',
                  description='desc',
                  owner_id=None)

        # App.owner_id shoult not be nullable
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        # App.name shoult not be nullable
        user = User(email_addr="*****@*****.**",
                    name="johndoe",
                    fullname="John Doe",
                    locale="en")
        db.session.add(user)
        db.session.commit()
        user = db.session.query(User).first()
        app.owner_id = user.id
        app.name = None
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        app.name = ''
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        # App.short_name shoult not be nullable
        app.name = "Project"
        app.short_name = None
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        app.short_name = ''
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        # App.description shoult not be nullable
        db.session.add(app)
        app.short_name = "project"
        app.description = None
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()

        app.description = ''
        db.session.add(app)
        assert_raises(IntegrityError, db.session.commit)
        db.session.rollback()