|
|
#shw 导入Django的测试客户端、请求工厂和测试用例基类
|
|
|
from django.test import Client, RequestFactory, TestCase
|
|
|
#shw 导入Django的URL反向解析函数
|
|
|
from django.urls import reverse
|
|
|
#shw 导入Django的时区工具
|
|
|
from django.utils import timezone
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
#shw 导入本地的BlogUser模型
|
|
|
from accounts.models import BlogUser
|
|
|
#shw 导入博客应用的Article和Category模型
|
|
|
from blog.models import Article, Category
|
|
|
#shw 从项目工具模块导入所有函数
|
|
|
from djangoblog.utils import *
|
|
|
#shw 导入本地的工具模块
|
|
|
from . import utils
|
|
|
|
|
|
|
|
|
#shw 在这里创建你的测试。
|
|
|
|
|
|
class AccountTest(TestCase):
|
|
|
#shw 账户应用的测试用例集,继承自Django的TestCase。
|
|
|
#shw TestCase提供了数据库事务回滚和客户端模拟等功能。
|
|
|
|
|
|
def setUp(self):
|
|
|
#shw 每个测试方法执行前都会运行的初始化方法。
|
|
|
#shw 用于创建测试所需的公共数据和环境。
|
|
|
self.client = Client() #shw 创建一个模拟的HTTP客户端,用于发送请求
|
|
|
self.factory = RequestFactory() #shw 创建一个请求工厂,用于生成请求对象
|
|
|
#shw 创建一个普通用户用于测试
|
|
|
self.blog_user = BlogUser.objects.create_user(
|
|
|
username="test",
|
|
|
email="admin@admin.com",
|
|
|
password="12345678"
|
|
|
)
|
|
|
self.new_test = "xxx123--=" #shw 定义一个测试用的新密码
|
|
|
|
|
|
def test_validate_account(self):
|
|
|
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') #shw 从数据库中获取刚创建的超级用户
|
|
|
|
|
|
#shw 使用client模拟登录
|
|
|
loginresult = self.client.login(
|
|
|
username='liangliangyy1',
|
|
|
password='qwer!@#$ggg')
|
|
|
self.assertEqual(loginresult, True) #shw 断言登录成功
|
|
|
response = self.client.get('/admin/') #shw 模拟访问后台管理页面
|
|
|
self.assertEqual(response.status_code, 200) #shw 断言访问成功,状态码为200
|
|
|
|
|
|
#shw 创建一个文章分类用于测试
|
|
|
category = Category()
|
|
|
category.name = "categoryaaa"
|
|
|
category.creation_time = timezone.now()
|
|
|
category.last_modify_time = timezone.now()
|
|
|
category.save()
|
|
|
|
|
|
#shw 创建一篇文章用于测试
|
|
|
article = Article()
|
|
|
article.title = "nicetitleaaa"
|
|
|
article.body = "nicecontentaaa"
|
|
|
article.author = user
|
|
|
article.category = category
|
|
|
article.type = 'a'
|
|
|
article.status = 'p'
|
|
|
article.save()
|
|
|
|
|
|
#shw 模拟访问文章的后台编辑页面
|
|
|
response = self.client.get(article.get_admin_url())
|
|
|
self.assertEqual(response.status_code, 200) #shw 断言访问成功
|
|
|
|
|
|
def test_validate_register(self):
|
|
|
#shw 测试用户注册、邮箱验证、登录、登出等一系列流程。
|
|
|
#shw 断言注册前,数据库中不存在该邮箱的用户
|
|
|
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',
|
|
|
})
|
|
|
#shw 断言注册后,数据库中存在该邮箱的用户
|
|
|
self.assertEquals(
|
|
|
1, len(
|
|
|
BlogUser.objects.filter(
|
|
|
email='user123@user.com')))
|
|
|
user = BlogUser.objects.filter(email='user123@user.com')[0] #shw 获取新注册的用户
|
|
|
#shw 生成用于邮箱验证的签名
|
|
|
sign = get_sha256(get_sha256(settings.SECRET_KEY + str(user.id)))
|
|
|
path = reverse('accounts:result') #shw 获取验证结果页面的URL路径
|
|
|
#shw 构造完整的验证URL
|
|
|
url = '{path}?type=validation&id={id}&sign={sign}'.format(
|
|
|
path=path, id=user.id, sign=sign)
|
|
|
response = self.client.get(url) #shw 模拟用户点击邮箱中的验证链接
|
|
|
self.assertEqual(response.status_code, 200) #shw 断言访问成功
|
|
|
|
|
|
#shw 模拟用户登录
|
|
|
self.client.login(username='user1233', password='password123!q@wE#R$T')
|
|
|
user = BlogUser.objects.filter(email='user123@user.com')[0] #shw 重新获取用户对象
|
|
|
user.is_superuser = True #shw 将用户提升为超级用户,以便访问后台
|
|
|
user.is_staff = True
|
|
|
user.save()
|
|
|
delete_sidebar_cache() #shw 删除侧边栏缓存
|
|
|
|
|
|
#shw 创建测试用的分类和文章
|
|
|
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"
|
|
|
article.body = "nicecontentttt"
|
|
|
article.author = user
|
|
|
article.type = 'a'
|
|
|
article.status = 'p'
|
|
|
article.save()
|
|
|
|
|
|
#shw 登录状态下访问文章后台页面
|
|
|
response = self.client.get(article.get_admin_url())
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
#shw 模拟用户登出
|
|
|
response = self.client.get(reverse('account:logout'))
|
|
|
self.assertIn(response.status_code, [301, 302, 200]) #shw 断言登出成功(重定向或OK)
|
|
|
|
|
|
#shw 登出后再次访问文章后台页面
|
|
|
response = self.client.get(article.get_admin_url())
|
|
|
self.assertIn(response.status_code, [301, 302, 200]) #shw 断言被重定向到登录页
|
|
|
|
|
|
#shw 模拟使用错误的密码登录
|
|
|
response = self.client.post(reverse('account:login'), {
|
|
|
'username': 'user1233',
|
|
|
'password': 'password123' #shw 错误的密码
|
|
|
})
|
|
|
self.assertIn(response.status_code, [301, 302, 200]) #shw 断言登录失败,页面重定向
|
|
|
|
|
|
#shw 登录失败后访问文章后台页面
|
|
|
response = self.client.get(article.get_admin_url())
|
|
|
self.assertIn(response.status_code, [301, 302, 200]) #shw 断言依然无法访问
|
|
|
|
|
|
def test_verify_email_code(self):
|
|
|
#shw 测试邮箱验证码的生成、发送和验证功能。
|
|
|
to_email = "admin@admin.com"
|
|
|
code = generate_code() #shw 生成一个验证码
|
|
|
utils.set_code(to_email, code) #shw 将验证码与邮箱关联(通常是存入缓存或数据库)
|
|
|
utils.send_verify_email(to_email, code) #shw 发送验证码邮件(测试环境中可能不会真的发送)
|
|
|
|
|
|
#shw 使用正确的邮箱和验证码进行验证
|
|
|
err = utils.verify("admin@admin.com", code)
|
|
|
self.assertEqual(err, None) #shw 断言验证成功,无错误信息返回
|
|
|
|
|
|
#shw 使用错误的邮箱进行验证
|
|
|
err = utils.verify("admin@123.com", code)
|
|
|
self.assertEqual(type(err), str) #shw 断言验证失败,返回一个字符串类型的错误信息
|
|
|
|
|
|
def test_forget_password_email_code_success(self):
|
|
|
#shw 测试成功发送忘记密码验证码的场景。
|
|
|
resp = self.client.post(
|
|
|
path=reverse("account:forget_password_code"),
|
|
|
data=dict(email="admin@admin.com") #shw 使用一个已存在的邮箱
|
|
|
)
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200) #shw 断言请求成功
|
|
|
self.assertEqual(resp.content.decode("utf-8"), "ok") #shw 断言返回内容为"ok"
|
|
|
|
|
|
def test_forget_password_email_code_fail(self):
|
|
|
#shw 测试发送忘记密码验证码失败的场景(如邮箱格式错误)。
|
|
|
#shw 测试不提供邮箱的情况
|
|
|
resp = self.client.post(
|
|
|
path=reverse("account:forget_password_code"),
|
|
|
data=dict()
|
|
|
)
|
|
|
self.assertEqual(resp.content.decode("utf-8"), "错误的邮箱") #shw 断言返回错误提示
|
|
|
|
|
|
#shw 测试提供格式错误的邮箱的情况
|
|
|
resp = self.client.post(
|
|
|
path=reverse("account:forget_password_code"),
|
|
|
data=dict(email="admin@com")
|
|
|
)
|
|
|
self.assertEqual(resp.content.decode("utf-8"), "错误的邮箱") #shw 断言返回错误提示
|
|
|
|
|
|
def test_forget_password_email_success(self):
|
|
|
#shw 测试成功重置密码的场景。
|
|
|
code = generate_code() #shw 生成一个验证码
|
|
|
utils.set_code(self.blog_user.email, code) #shw 为测试用户设置验证码
|
|
|
#shw 构造重置密码的请求数据
|
|
|
data = dict(
|
|
|
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) #shw 断言请求成功并重定向
|
|
|
|
|
|
#shw 验证用户密码是否真的被修改了
|
|
|
blog_user = BlogUser.objects.filter(
|
|
|
email=self.blog_user.email,
|
|
|
).first() # type: BlogUser
|
|
|
self.assertNotEqual(blog_user, None) #shw 断言用户依然存在
|
|
|
self.assertEqual(blog_user.check_password(data["new_password1"]), True) #shw 断言新密码是正确的
|
|
|
|
|
|
def test_forget_password_email_not_user(self):
|
|
|
#shw 测试重置一个不存在用户的密码的场景。
|
|
|
data = dict(
|
|
|
new_password1=self.new_test,
|
|
|
new_password2=self.new_test,
|
|
|
email="123@123.com", #shw 使用一个不存在的邮箱
|
|
|
code="123456",
|
|
|
)
|
|
|
resp = self.client.post(
|
|
|
path=reverse("account:forget_password"),
|
|
|
data=data
|
|
|
)
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200) #shw 断言请求未重定向,停留在原页面并显示错误
|
|
|
|
|
|
|
|
|
def test_forget_password_email_code_error(self):
|
|
|
#shw 测试使用错误验证码重置密码的场景。
|
|
|
code = generate_code() #shw 生成一个验证码
|
|
|
utils.set_code(self.blog_user.email, code) #shw 为测试用户设置验证码
|
|
|
#shw 构造重置密码的请求数据,但验证码是错误的
|
|
|
data = dict(
|
|
|
new_password1=self.new_test,
|
|
|
new_password2=self.new_test,
|
|
|
email=self.blog_user.email,
|
|
|
code="111111", #shw 错误的验证码
|
|
|
)
|
|
|
resp = self.client.post(
|
|
|
path=reverse("account:forget_password"),
|
|
|
data=data
|
|
|
)
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200) #shw 断言请求未重定向,停留在原页面并显示错误
|