|
|
|
|
@ -12,37 +12,59 @@ from . import utils
|
|
|
|
|
# Create your tests here.
|
|
|
|
|
|
|
|
|
|
class AccountTest(TestCase):
|
|
|
|
|
"""
|
|
|
|
|
针对账户注册、登录、密码找回、邮箱验证等功能的测试类。
|
|
|
|
|
使用 Django 的 TestCase 提供的测试客户端和工厂方法进行测试。
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.client = Client()
|
|
|
|
|
self.factory = RequestFactory()
|
|
|
|
|
"""
|
|
|
|
|
初始化测试所需的对象。
|
|
|
|
|
每个测试方法运行前都会执行。
|
|
|
|
|
"""
|
|
|
|
|
self.client = Client() # Django 测试客户端,用于模拟请求
|
|
|
|
|
self.factory = RequestFactory() # 用于构造请求对象
|
|
|
|
|
# 创建一个普通测试用户
|
|
|
|
|
self.blog_user = BlogUser.objects.create_user(
|
|
|
|
|
username="test",
|
|
|
|
|
email="admin@admin.com",
|
|
|
|
|
password="12345678"
|
|
|
|
|
)
|
|
|
|
|
self.new_test = "xxx123--="
|
|
|
|
|
self.new_test = "xxx123--=" # 用于密码重置测试的新密码
|
|
|
|
|
|
|
|
|
|
def test_validate_account(self):
|
|
|
|
|
site = get_current_site().domain
|
|
|
|
|
"""
|
|
|
|
|
测试账户验证、登录以及文章管理功能
|
|
|
|
|
"""
|
|
|
|
|
site = get_current_site().domain # 获取当前站点域名
|
|
|
|
|
|
|
|
|
|
# 创建超级管理员账户
|
|
|
|
|
user = BlogUser.objects.create_superuser(
|
|
|
|
|
email="liangliangyy1@gmail.com",
|
|
|
|
|
username="liangliangyy1",
|
|
|
|
|
password="qwer!@#$ggg")
|
|
|
|
|
password="qwer!@#$ggg"
|
|
|
|
|
)
|
|
|
|
|
testuser = BlogUser.objects.get(username='liangliangyy1')
|
|
|
|
|
|
|
|
|
|
# 测试登录功能
|
|
|
|
|
loginresult = self.client.login(
|
|
|
|
|
username='liangliangyy1',
|
|
|
|
|
password='qwer!@#$ggg')
|
|
|
|
|
self.assertEqual(loginresult, True)
|
|
|
|
|
password='qwer!@#$ggg'
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(loginresult, True) # 登录应成功
|
|
|
|
|
|
|
|
|
|
# 测试访问 Django admin
|
|
|
|
|
response = self.client.get('/admin/')
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
|
|
# 创建一个文章分类
|
|
|
|
|
category = Category()
|
|
|
|
|
category.name = "categoryaaa"
|
|
|
|
|
category.creation_time = timezone.now()
|
|
|
|
|
category.last_modify_time = timezone.now()
|
|
|
|
|
category.save()
|
|
|
|
|
|
|
|
|
|
# 创建一篇文章
|
|
|
|
|
article = Article()
|
|
|
|
|
article.title = "nicetitleaaa"
|
|
|
|
|
article.body = "nicecontentaaa"
|
|
|
|
|
@ -52,38 +74,52 @@ class AccountTest(TestCase):
|
|
|
|
|
article.status = 'p'
|
|
|
|
|
article.save()
|
|
|
|
|
|
|
|
|
|
# 测试访问文章的后台管理页面
|
|
|
|
|
response = self.client.get(article.get_admin_url())
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
|
|
def test_validate_register(self):
|
|
|
|
|
"""
|
|
|
|
|
测试用户注册、激活、登录及文章管理流程
|
|
|
|
|
"""
|
|
|
|
|
# 验证注册前用户不存在
|
|
|
|
|
self.assertEquals(
|
|
|
|
|
0, len(
|
|
|
|
|
BlogUser.objects.filter(
|
|
|
|
|
email='user123@user.com')))
|
|
|
|
|
0, len(BlogUser.objects.filter(email='user123@user.com'))
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 通过客户端 POST 请求模拟用户注册
|
|
|
|
|
response = self.client.post(reverse('account:register'), {
|
|
|
|
|
'username': 'user1233',
|
|
|
|
|
'email': 'user123@user.com',
|
|
|
|
|
'password1': 'password123!q@wE#R$T',
|
|
|
|
|
'password2': 'password123!q@wE#R$T',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
# 验证注册后用户已创建
|
|
|
|
|
self.assertEquals(
|
|
|
|
|
1, len(
|
|
|
|
|
BlogUser.objects.filter(
|
|
|
|
|
email='user123@user.com')))
|
|
|
|
|
1, len(BlogUser.objects.filter(email='user123@user.com'))
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
user = BlogUser.objects.filter(email='user123@user.com')[0]
|
|
|
|
|
# 生成邮箱验证签名
|
|
|
|
|
sign = get_sha256(get_sha256(settings.SECRET_KEY + str(user.id)))
|
|
|
|
|
path = reverse('accounts:result')
|
|
|
|
|
url = '{path}?type=validation&id={id}&sign={sign}'.format(
|
|
|
|
|
path=path, id=user.id, sign=sign)
|
|
|
|
|
path=path, id=user.id, sign=sign
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 测试访问邮箱验证链接
|
|
|
|
|
response = self.client.get(url)
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
|
|
# 登录用户
|
|
|
|
|
self.client.login(username='user1233', password='password123!q@wE#R$T')
|
|
|
|
|
user = BlogUser.objects.filter(email='user123@user.com')[0]
|
|
|
|
|
user.is_superuser = True
|
|
|
|
|
user.is_staff = True
|
|
|
|
|
user.save()
|
|
|
|
|
delete_sidebar_cache()
|
|
|
|
|
delete_sidebar_cache() # 清理缓存,避免后台界面异常
|
|
|
|
|
|
|
|
|
|
# 创建分类与文章
|
|
|
|
|
category = Category()
|
|
|
|
|
category.name = "categoryaaa"
|
|
|
|
|
category.creation_time = timezone.now()
|
|
|
|
|
@ -95,20 +131,23 @@ class AccountTest(TestCase):
|
|
|
|
|
article.title = "nicetitle333"
|
|
|
|
|
article.body = "nicecontentttt"
|
|
|
|
|
article.author = user
|
|
|
|
|
|
|
|
|
|
article.type = 'a'
|
|
|
|
|
article.status = 'p'
|
|
|
|
|
article.save()
|
|
|
|
|
|
|
|
|
|
# 测试访问文章后台管理页面
|
|
|
|
|
response = self.client.get(article.get_admin_url())
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
|
|
# 测试注销
|
|
|
|
|
response = self.client.get(reverse('account:logout'))
|
|
|
|
|
self.assertIn(response.status_code, [301, 302, 200])
|
|
|
|
|
|
|
|
|
|
# 注销后访问后台页面可能重定向
|
|
|
|
|
response = self.client.get(article.get_admin_url())
|
|
|
|
|
self.assertIn(response.status_code, [301, 302, 200])
|
|
|
|
|
|
|
|
|
|
# 测试错误密码登录
|
|
|
|
|
response = self.client.post(reverse('account:login'), {
|
|
|
|
|
'username': 'user1233',
|
|
|
|
|
'password': 'password123'
|
|
|
|
|
@ -119,27 +158,37 @@ class AccountTest(TestCase):
|
|
|
|
|
self.assertIn(response.status_code, [301, 302, 200])
|
|
|
|
|
|
|
|
|
|
def test_verify_email_code(self):
|
|
|
|
|
"""
|
|
|
|
|
测试邮箱验证码生成、发送与验证
|
|
|
|
|
"""
|
|
|
|
|
to_email = "admin@admin.com"
|
|
|
|
|
code = generate_code()
|
|
|
|
|
utils.set_code(to_email, code)
|
|
|
|
|
utils.send_verify_email(to_email, code)
|
|
|
|
|
code = generate_code() # 生成验证码
|
|
|
|
|
utils.set_code(to_email, code) # 设置验证码缓存
|
|
|
|
|
utils.send_verify_email(to_email, code) # 发送验证码邮件
|
|
|
|
|
|
|
|
|
|
# 验证正确邮箱与验证码
|
|
|
|
|
err = utils.verify("admin@admin.com", code)
|
|
|
|
|
self.assertEqual(err, None)
|
|
|
|
|
|
|
|
|
|
# 验证错误邮箱
|
|
|
|
|
err = utils.verify("admin@123.com", code)
|
|
|
|
|
self.assertEqual(type(err), str)
|
|
|
|
|
|
|
|
|
|
def test_forget_password_email_code_success(self):
|
|
|
|
|
"""
|
|
|
|
|
测试发送忘记密码验证码成功
|
|
|
|
|
"""
|
|
|
|
|
resp = self.client.post(
|
|
|
|
|
path=reverse("account:forget_password_code"),
|
|
|
|
|
data=dict(email="admin@admin.com")
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
|
self.assertEqual(resp.content.decode("utf-8"), "ok")
|
|
|
|
|
|
|
|
|
|
def test_forget_password_email_code_fail(self):
|
|
|
|
|
"""
|
|
|
|
|
测试发送忘记密码验证码失败
|
|
|
|
|
"""
|
|
|
|
|
resp = self.client.post(
|
|
|
|
|
path=reverse("account:forget_password_code"),
|
|
|
|
|
data=dict()
|
|
|
|
|
@ -153,6 +202,9 @@ class AccountTest(TestCase):
|
|
|
|
|
self.assertEqual(resp.content.decode("utf-8"), "错误的邮箱")
|
|
|
|
|
|
|
|
|
|
def test_forget_password_email_success(self):
|
|
|
|
|
"""
|
|
|
|
|
测试通过邮箱验证码重置密码成功
|
|
|
|
|
"""
|
|
|
|
|
code = generate_code()
|
|
|
|
|
utils.set_code(self.blog_user.email, code)
|
|
|
|
|
data = dict(
|
|
|
|
|
@ -168,13 +220,14 @@ class AccountTest(TestCase):
|
|
|
|
|
self.assertEqual(resp.status_code, 302)
|
|
|
|
|
|
|
|
|
|
# 验证用户密码是否修改成功
|
|
|
|
|
blog_user = BlogUser.objects.filter(
|
|
|
|
|
email=self.blog_user.email,
|
|
|
|
|
).first() # type: BlogUser
|
|
|
|
|
blog_user = BlogUser.objects.filter(email=self.blog_user.email).first()
|
|
|
|
|
self.assertNotEqual(blog_user, None)
|
|
|
|
|
self.assertEqual(blog_user.check_password(data["new_password1"]), True)
|
|
|
|
|
|
|
|
|
|
def test_forget_password_email_not_user(self):
|
|
|
|
|
"""
|
|
|
|
|
测试不存在的用户尝试重置密码
|
|
|
|
|
"""
|
|
|
|
|
data = dict(
|
|
|
|
|
new_password1=self.new_test,
|
|
|
|
|
new_password2=self.new_test,
|
|
|
|
|
@ -185,23 +238,22 @@ class AccountTest(TestCase):
|
|
|
|
|
path=reverse("account:forget_password"),
|
|
|
|
|
data=data
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_forget_password_email_code_error(self):
|
|
|
|
|
"""
|
|
|
|
|
测试密码重置时使用错误验证码
|
|
|
|
|
"""
|
|
|
|
|
code = generate_code()
|
|
|
|
|
utils.set_code(self.blog_user.email, code)
|
|
|
|
|
data = dict(
|
|
|
|
|
new_password1=self.new_test,
|
|
|
|
|
new_password2=self.new_test,
|
|
|
|
|
email=self.blog_user.email,
|
|
|
|
|
code="111111",
|
|
|
|
|
code="111111", # 错误验证码
|
|
|
|
|
)
|
|
|
|
|
resp = self.client.post(
|
|
|
|
|
path=reverse("account:forget_password"),
|
|
|
|
|
data=data
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
|
|
|
|
|
|
|