|
|
|
|
@ -1,5 +1,5 @@
|
|
|
|
|
#zh:
|
|
|
|
|
#coding:utf-8
|
|
|
|
|
#hyt:
|
|
|
|
|
|
|
|
|
|
from django.test import Client, RequestFactory, TestCase
|
|
|
|
|
from django.urls import reverse
|
|
|
|
|
from django.utils import timezone
|
|
|
|
|
@ -11,41 +11,56 @@ from djangoblog.utils import *
|
|
|
|
|
from . import utils
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 在此处创建测试
|
|
|
|
|
# Create your tests here.
|
|
|
|
|
|
|
|
|
|
class AccountTest(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")
|
|
|
|
|
testuser = BlogUser.objects.get(username='liangliangyy1')
|
|
|
|
|
|
|
|
|
|
# 测试登录功能
|
|
|
|
|
# 测试用户登录功能
|
|
|
|
|
loginresult = self.client.login(
|
|
|
|
|
username='liangliangyy1',
|
|
|
|
|
password='qwer!@#$ggg')
|
|
|
|
|
self.assertEqual(loginresult, True) # 断言登录成功
|
|
|
|
|
# 测试访问管理员页面
|
|
|
|
|
self.assertEqual(loginresult, True)
|
|
|
|
|
|
|
|
|
|
# 测试管理员后台访问权限
|
|
|
|
|
response = self.client.get('/admin/')
|
|
|
|
|
self.assertEqual(response.status_code, 200) # 断言可以访问管理员页面
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
|
|
# 创建测试分类
|
|
|
|
|
category = Category()
|
|
|
|
|
@ -64,58 +79,63 @@ class AccountTest(TestCase):
|
|
|
|
|
article.status = 'p' # 发布状态
|
|
|
|
|
article.save()
|
|
|
|
|
|
|
|
|
|
# 测试访问文章管理页面
|
|
|
|
|
# 测试文章管理页面访问
|
|
|
|
|
response = self.client.get(article.get_admin_url())
|
|
|
|
|
self.assertEqual(response.status_code, 200) # 断言可以访问文章管理页面
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
|
|
def test_validate_register(self):
|
|
|
|
|
"""测试用户注册功能"""
|
|
|
|
|
# 验证注册前用户不存在
|
|
|
|
|
"""
|
|
|
|
|
测试用户注册流程
|
|
|
|
|
|
|
|
|
|
验证用户注册、邮箱验证、权限升级等完整注册流程
|
|
|
|
|
包括注册后的登录状态和功能权限测试
|
|
|
|
|
"""
|
|
|
|
|
# 验证注册前邮箱不存在
|
|
|
|
|
self.assertEquals(
|
|
|
|
|
0, len(
|
|
|
|
|
BlogUser.objects.filter(
|
|
|
|
|
email='user123@user.com')))
|
|
|
|
|
# 发送注册请求
|
|
|
|
|
|
|
|
|
|
# 提交注册表单
|
|
|
|
|
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')))
|
|
|
|
|
|
|
|
|
|
# 获取新注册的用户
|
|
|
|
|
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)
|
|
|
|
|
# 测试验证页面访问
|
|
|
|
|
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()
|
|
|
|
|
category.last_modify_time = timezone.now()
|
|
|
|
|
category.save()
|
|
|
|
|
|
|
|
|
|
# 创建测试文章
|
|
|
|
|
article = Article()
|
|
|
|
|
article.category = category
|
|
|
|
|
article.title = "nicetitle333"
|
|
|
|
|
@ -125,64 +145,79 @@ class AccountTest(TestCase):
|
|
|
|
|
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]) # 登出后重定向
|
|
|
|
|
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' # 错误密码
|
|
|
|
|
'password': 'password123' # 错误的密码
|
|
|
|
|
})
|
|
|
|
|
self.assertIn(response.status_code, [301, 302, 200])
|
|
|
|
|
|
|
|
|
|
# 测试错误登录后访问文章管理页面
|
|
|
|
|
# 验证登录失败后权限仍受限
|
|
|
|
|
response = self.client.get(article.get_admin_url())
|
|
|
|
|
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) # 发送验证邮件
|
|
|
|
|
|
|
|
|
|
# 设置并发送验证码
|
|
|
|
|
utils.set_code(to_email, code)
|
|
|
|
|
utils.send_verify_email(to_email, code)
|
|
|
|
|
|
|
|
|
|
# 测试正确验证码验证
|
|
|
|
|
err = utils.verify("admin@admin.com", code)
|
|
|
|
|
self.assertEqual(err, None) # 断言验证成功,无错误
|
|
|
|
|
self.assertEqual(err, None)
|
|
|
|
|
|
|
|
|
|
# 测试错误邮箱验证
|
|
|
|
|
err = utils.verify("admin@123.com", code)
|
|
|
|
|
self.assertEqual(type(err), str) # 断言返回错误信息
|
|
|
|
|
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") # 断言返回成功信息
|
|
|
|
|
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()
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(resp.content.decode("utf-8"), "错误的邮箱")
|
|
|
|
|
|
|
|
|
|
# 测试无效邮箱格式
|
|
|
|
|
# 测试错误邮箱格式
|
|
|
|
|
resp = self.client.post(
|
|
|
|
|
path=reverse("account:forget_password_code"),
|
|
|
|
|
data=dict(email="admin@com")
|
|
|
|
|
@ -190,30 +225,40 @@ 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) # 设置验证码
|
|
|
|
|
"""
|
|
|
|
|
测试密码重置成功场景
|
|
|
|
|
|
|
|
|
|
验证完整的密码重置流程,包括验证码校验和新密码设置
|
|
|
|
|
"""
|
|
|
|
|
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=code, # 验证码
|
|
|
|
|
new_password1=self.new_test,
|
|
|
|
|
new_password2=self.new_test,
|
|
|
|
|
email=self.blog_user.email,
|
|
|
|
|
code=code,
|
|
|
|
|
)
|
|
|
|
|
resp = self.client.post(
|
|
|
|
|
path=reverse("account:forget_password"),
|
|
|
|
|
data=data
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(resp.status_code, 302) # 断言重定向(成功)
|
|
|
|
|
self.assertEqual(resp.status_code, 302) # 重定向表示成功
|
|
|
|
|
|
|
|
|
|
# 验证用户密码是否修改成功
|
|
|
|
|
blog_user = BlogUser.objects.filter(
|
|
|
|
|
email=self.blog_user.email,
|
|
|
|
|
).first() # type: BlogUser
|
|
|
|
|
self.assertNotEqual(blog_user, None) # 断言用户存在
|
|
|
|
|
self.assertEqual(blog_user.check_password(data["new_password1"]), True) # 断言密码修改成功
|
|
|
|
|
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,
|
|
|
|
|
@ -225,12 +270,18 @@ class AccountTest(TestCase):
|
|
|
|
|
data=data
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200) # 断言停留在当前页面(失败)
|
|
|
|
|
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,
|
|
|
|
|
@ -242,4 +293,4 @@ class AccountTest(TestCase):
|
|
|
|
|
data=data
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200) # 断言停留在当前页面(失败)
|
|
|
|
|
self.assertEqual(resp.status_code, 200) # 应返回错误页面
|