Ejemplo n.º 1
0
    def test_users(self):
        # add two users
        r = Role.query.filter_by(name='poster').first()
        self.assertIsNotNone(r)
        u1 = User('john')
        u1.email = '*****@*****.**'
        u1.password = '******'
        u1.confirmed = True
        u1.roles.append(r)
        u2 = User('susan')
        u2.email = '*****@*****.**'
        u2.password = '******'
        u2.confirmed = True
        u2.roles.append(r)
        db.session.add_all([u1, u2])
        db.session.commit()

        # get users
        # 以u2通过验证,得到u1的用户信息
        response = self.client.get(url_for('api.get_user', id=u1.id),
                                   headers=self.get_api_headers(
                                       'susan', 'dog'))
        self.assertTrue(response.status_code == 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertTrue(json_response['username'] == 'john')
        # 以u2通过验证,得到u2的用户信息
        response = self.client.get(url_for('api.get_user', id=u2.id),
                                   headers=self.get_api_headers(
                                       'susan', 'dog'))
        self.assertTrue(response.status_code == 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertTrue(json_response['username'] == 'susan')
Ejemplo n.º 2
0
    def test_token_auth(self):
        # add a user
        r = Role.query.filter_by(name='poster').first()
        self.assertIsNotNone(r)
        u = User('john')
        u.email = '*****@*****.**'
        u.password = '******'
        u.confirmed = True
        u.roles.append(r)
        db.session.add(u)
        db.session.commit()

        # issue a request with a bad token
        response = self.client.get(url_for('api.get_posts'),
                                   headers=self.get_api_headers(
                                       'bad-token', ''))
        self.assertTrue(response.status_code == 401)

        # get a token
        response = self.client.get(url_for('api.get_token'),
                                   headers=self.get_api_headers('john', 'cat'))
        self.assertTrue(response.status_code == 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertIsNotNone(json_response.get('token'))
        token = json_response['token']

        # issue a request with the token
        response = self.client.get(url_for('api.get_posts'),
                                   headers=self.get_api_headers(token, ''))
        self.assertTrue(response.status_code == 200)
Ejemplo n.º 3
0
    def setUp(self):
        # Bug workarounds: Flask Admin和Flask Restful扩展中,
        # 它们会为应用生成蓝图对象并在内部保存起来,但在应用销毁时不会主动将其移除。
        admin._views = []
        rest_api.resources = []

        self.app = create_app('test')
        # 必须push context,否则会报错误
        self.app_context = self.app.app_context()
        self.app_context.push()
        self.client = self.app.test_client(use_cookies=True)

        # Bug workaround: 如果不在webapp目录中运行,
        # 则Flask SQLAlchemy的初始化代码就不能正确地在应用对象中进行初始化
        db.app = self.app
        db.create_all()

        # create role and user
        # 由于下面有个test_register_and_login测试,要注册新用户,
        # 在register路由中会默认添加上'poster'和'default'角色,因此这里要先创建两种角色
        poster = Role('poster')
        poster.description = 'poster role'
        default = Role('default')
        default.description = 'default role'
        db.session.add(poster)
        db.session.add(default)

        test_user = User('test')
        test_user.email = '*****@*****.**'
        test_user.password = '******'
        test_user.confirmed = True
        test_user.roles.append(poster)
        db.session.add(test_user)
        db.session.commit()
Ejemplo n.º 4
0
    def test_bad_auth(self):
        # add a user
        r = Role.query.filter_by(name='poster').first()
        self.assertIsNotNone(r)
        u = User('john')
        u.email = '*****@*****.**'
        u.password = '******'
        u.confirmed = True
        u.roles.append(r)
        db.session.add(u)
        db.session.commit()

        # authenticate with bad password
        response = self.client.get(url_for('api.get_posts'),
                                   headers=self.get_api_headers('john', 'dog'))
        self.assertTrue(response.status_code == 401)
Ejemplo n.º 5
0
    def test_unconfirmed_account(self):
        # add an unconfirmed user
        r = Role.query.filter_by(name='poster').first()
        self.assertIsNotNone(r)
        u = User('john')
        u.email = '*****@*****.**'
        u.password = '******'
        u.confirmed = False
        u.roles.append(r)
        db.session.add(u)
        db.session.commit()

        # get list of posts with the unconfirmed account
        response = self.client.get(url_for('api.get_posts'),
                                   headers=self.get_api_headers('john', 'cat'))
        self.assertTrue(response.status_code == 403)
Ejemplo n.º 6
0
def insert_data():
    with app.app_context():
        # 不需要在这里创建库,应该使用数据库升级命令`db upgrade`来创建库
        # db.create_all()

        # 这里设定了3种角色
        role_admin = Role(name='admin')
        role_admin.description = "administrator role"
        role_poster = Role(name='poster')
        role_poster.description = "the registered user role"
        role_default = Role(name='default')
        role_default.description = 'the unregistered user role'
        db.session.add(role_admin)
        db.session.add(role_poster)
        db.session.add(role_default)

        # add User
        admin = User(username='******')
        admin.email = '*****@*****.**'
        admin.password = '******'
        admin.confirmed = True
        admin.roles.append(role_admin)
        admin.roles.append(role_poster)
        admin.roles.append(role_default)
        db.session.add(admin)

        user01 = User(username='******')
        user01.email = '*****@*****.**'
        user01.password = '******'
        user01.confirmed = True
        user01.roles.append(role_poster)
        user01.roles.append(role_default)
        db.session.add(user01)

        user02 = User(username='******')
        user02.email = '*****@*****.**'
        user02.password = '******'
        user02.confirmed = True
        user02.roles.append(role_poster)
        user02.roles.append(role_default)
        db.session.add(user02)

        # add Tag and Post
        tag_one = Tag('Python')
        tag_two = Tag('Flask')
        tag_three = Tag('SQLAlechemy')
        tag_four = Tag('Jinja')
        tag_list = [tag_one, tag_two, tag_three, tag_four]

        s = "Example Text"

        for i in xrange(1, 101):
            new_post = Post("Post {}".format(i))
            if i % 2:
                new_post.user = user01
            else:
                new_post.user = user02
            new_post.publish_date = datetime.datetime.utcnow()
            new_post.text = s
            new_post.tags = random.sample(tag_list, random.randint(1, 3))
            db.session.add(new_post)

        # add comment
        comment01 = Comment()
        comment01.name = 'comment01'
        comment01.text = 'comment text'
        comment01.post_id = 99
        comment01.date = datetime.datetime.utcnow()
        db.session.add(comment01)

        comment02 = Comment()
        comment02.name = 'comment02'
        comment02.text = 'comment text'
        comment02.post_id = 100
        comment02.date = datetime.datetime.utcnow()
        db.session.add(comment02)

        db.session.commit()
Ejemplo n.º 7
0
    def test_comments(self):
        # add two users
        r = Role.query.filter_by(name='poster').first()
        self.assertIsNotNone(r)
        u1 = User('john')
        u1.email = '*****@*****.**'
        u1.password = '******'
        u1.confirmed = True
        u1.roles.append(r)
        u2 = User('susan')
        u2.email = '*****@*****.**'
        u2.password = '******'
        u2.confirmed = True
        u2.roles.append(r)
        db.session.add_all([u1, u2])
        db.session.commit()

        # add a post
        post = Post(title='title of the post')
        post.text = 'body of the post'
        post.user = u1
        db.session.add(post)
        db.session.commit()

        # write a comment
        response = self.client.post(url_for('api.new_post_comment',
                                            id=post.id),
                                    headers=self.get_api_headers(
                                        'susan', 'dog'),
                                    data=json.dumps({
                                        'name':
                                        'comment name',
                                        'text':
                                        'Good [post](http://example.com)!'
                                    }))
        self.assertTrue(response.status_code == 201)
        json_response = json.loads(response.data.decode('utf-8'))
        url = response.headers.get('Location')
        self.assertIsNotNone(url)
        self.assertTrue(json_response['name'] == 'comment name')
        self.assertTrue(
            json_response['text'] == 'Good [post](http://example.com)!')

        # get the new comment
        response = self.client.get(url,
                                   headers=self.get_api_headers('john', 'cat'))
        self.assertTrue(response.status_code == 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertTrue(json_response['url'] == url)
        self.assertTrue(json_response['name'] == 'comment name')
        self.assertTrue(
            json_response['text'] == 'Good [post](http://example.com)!')

        # add another comment
        comment = Comment(name='another comment name')
        comment.text = 'Thank you!'
        comment.user = u1
        comment.post = post
        db.session.add(comment)
        db.session.commit()

        # get the two comments from the post
        response = self.client.get(url_for('api.get_post_comments',
                                           id=post.id),
                                   headers=self.get_api_headers(
                                       'susan', 'dog'))
        self.assertTrue(response.status_code == 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertIsNotNone(json_response.get('comments'))
        self.assertTrue(json_response.get('count', 0) == 2)

        # get all the comments
        response = self.client.get(url_for('api.get_comments', id=post.id),
                                   headers=self.get_api_headers(
                                       'susan', 'dog'))
        self.assertTrue(response.status_code == 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertIsNotNone(json_response.get('comments'))
        self.assertTrue(json_response.get('count', 0) == 2)
Ejemplo n.º 8
0
    def test_posts(self):
        # add a user
        r = Role.query.filter_by(name='poster').first()
        self.assertIsNotNone(r)
        u = User('john')
        u.email = '*****@*****.**'
        u.password = '******'
        u.confirmed = True
        u.roles.append(r)
        db.session.add(u)
        db.session.commit()

        # write an empty post, will raise ValidationError
        response = self.client.post(url_for('api.new_post'),
                                    headers=self.get_api_headers(
                                        'john', 'cat'),
                                    data=json.dumps({'text': ''}))
        self.assertTrue(response.status_code == 400)

        # write a post
        response = self.client.post(url_for('api.new_post'),
                                    headers=self.get_api_headers(
                                        'john', 'cat'),
                                    data=json.dumps({
                                        'title':
                                        'title of the post',
                                        'text':
                                        'body of the *blog* post'
                                    }))
        self.assertTrue(response.status_code == 201)
        url = response.headers.get('Location')
        self.assertIsNotNone(url)

        # get the new post
        response = self.client.get(url,
                                   headers=self.get_api_headers('john', 'cat'))
        self.assertTrue(response.status_code == 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertTrue(json_response['url'] == url)
        self.assertTrue(json_response['title'] == 'title of the post')
        self.assertTrue(json_response['text'] == 'body of the *blog* post')
        json_post = json_response

        # get the post from the user
        response = self.client.get(url_for('api.get_user_posts', id=u.id),
                                   headers=self.get_api_headers('john', 'cat'))
        self.assertTrue(response.status_code == 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertIsNotNone(json_response.get('posts'))
        self.assertTrue(json_response.get('count', 0) == 1)
        self.assertTrue(json_response['posts'][0] == json_post)

        # get the post from the user as a follower
        # 没有实现自关注,因此这里得不到
        response = self.client.get(url_for('api.get_user_following_posts',
                                           id=u.id),
                                   headers=self.get_api_headers('john', 'cat'))
        self.assertTrue(response.status_code == 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertListEqual(json_response.get('posts'), [])
        self.assertTrue(json_response.get('count', -1) == 0)

        # edit post
        response = self.client.put(url,
                                   headers=self.get_api_headers('john', 'cat'),
                                   data=json.dumps({
                                       'title': 'updated title',
                                       'text': 'updated body'
                                   }))
        # self.assertTrue(response.status_code == 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertTrue(json_response['url'] == url)
        self.assertTrue(json_response['text'] == 'updated body')
        self.assertTrue(json_response['title'] == 'updated title')
Ejemplo n.º 9
0
# -*- coding: utf-8 -*-
"""
结合tests/test_ui.py使用
"""
from webapp import create_app
from webapp.models import db, User, Role

app = create_app('test')

# Bug workaround
db.app = app
db.create_all()


default = Role("default")
poster = Role("poster")
db.session.add(default)
db.session.add(poster)

test_user = User("test")
test_user.password = '******'
test_user.confirmed = True
test_user.email = '*****@*****.**'
test_user.roles.append(poster)
db.session.add(test_user)
db.session.commit()

app.run()