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')
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)
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()
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)
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)
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()
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)
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')
# -*- 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()