@ -1,48 +1,67 @@
#shw 导入Django的测试客户端、请求工厂和测试用例基类
from django . test import Client , RequestFactory , TestCase
#shw 导入Django的URL反向解析函数
from django . urls import reverse
#shw 导入Django的时区工具
from django . utils import timezone
#shw 导入Django的国际化和翻译工具
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
# Create your tests here.
# shw 在这里创建你的测试。
class AccountTest ( TestCase ) :
#shw 账户应用的测试用例集, 继承自Django的TestCase。
#shw TestCase提供了数据库事务回滚和客户端模拟等功能。
def setUp ( self ) :
self . client = Client ( )
self . factory = RequestFactory ( )
#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--= "
self . new_test = " xxx123--= " #shw 定义一个测试用的新密码
def test_validate_account ( self ) :
site = get_current_site ( ) . domain
#shw 测试超级用户的创建、登录和后台访问权限。
site = get_current_site ( ) . domain #shw 获取当前站点域名
#shw 创建一个超级用户
user = BlogUser . objects . create_superuser (
email = " liangliangyy1@gmail.com " ,
username = " liangliangyy1 " ,
password = " qwer!@#$ggg " )
testuser = BlogUser . objects . get ( username = ' liangliangyy1 ' )
testuser = BlogUser . objects . get ( username = ' liangliangyy1 ' ) #shw 从数据库中获取刚创建的超级用户
#shw 使用client模拟登录
loginresult = self . client . login (
username = ' liangliangyy1 ' ,
password = ' qwer!@#$ggg ' )
self . assertEqual ( loginresult , True )
response = self . client . get ( ' /admin/ ' )
self . assertEqual ( response . status_code , 200 )
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 "
@ -52,38 +71,48 @@ class AccountTest(TestCase):
article . status = ' p '
article . save ( )
#shw 模拟访问文章的后台编辑页面
response = self . client . get ( article . get_admin_url ( ) )
self . assertEqual ( response . status_code , 200 )
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 ' ) ) )
#shw 模拟发送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 ' ,
} )
#shw 断言注册后,数据库中存在该邮箱的用户
self . assertEquals (
1 , len (
BlogUser . objects . filter (
email = ' user123@user.com ' ) ) )
user = BlogUser . objects . filter ( email = ' user123@user.com ' ) [ 0 ]
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 ' )
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 )
self . assertEqual ( response . status_code , 200 )
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 ]
user . is_superuser = True
user = BlogUser . objects . filter ( email = ' user123@user.com ' ) [ 0 ] #shw 重新获取用户对象
user . is_superuser = True #shw 将用户提升为超级用户,以便访问后台
user . is_staff = True
user . save ( )
delete_sidebar_cache ( )
delete_sidebar_cache ( ) #shw 删除侧边栏缓存
#shw 创建测试用的分类和文章
category = Category ( )
category . name = " categoryaaa "
category . creation_time = timezone . now ( )
@ -95,66 +124,79 @@ class AccountTest(TestCase):
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 ] )
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 ] )
self . assertIn ( response . status_code , [ 301 , 302 , 200 ] ) #shw 断言被重定向到登录页
#shw 模拟使用错误的密码登录
response = self . client . post ( reverse ( ' account:login ' ) , {
' username ' : ' user1233 ' ,
' password ' : ' password123 '
' password ' : ' password123 ' #shw 错误的密码
} )
self . assertIn ( response . status_code , [ 301 , 302 , 200 ] )
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 ] )
self . assertIn ( response . status_code , [ 301 , 302 , 200 ] ) #shw 断言依然无法访问
def test_verify_email_code ( self ) :
#shw 测试邮箱验证码的生成、发送和验证功能。
to_email = " admin@admin.com "
code = generate_code ( )
utils . set_code ( to_email , code )
utils . send_verify_email ( to_email , code )
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 )
self . assertEqual ( err , None ) #shw 断言验证成功,无错误信息返回
#shw 使用错误的邮箱进行验证
err = utils . verify ( " admin@123.com " , code )
self . assertEqual ( type ( err ) , str )
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 " )
data = dict ( email = " admin@admin.com " ) #shw 使用一个已存在的邮箱
)
self . assertEqual ( resp . status_code , 200 )
self . assertEqual ( resp . content . decode ( " utf-8 " ) , " ok " )
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 " ) , " 错误的邮箱 " )
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 " ) , " 错误的邮箱 " )
self . assertEqual ( resp . content . decode ( " utf-8 " ) , " 错误的邮箱 " ) #shw 断言返回错误提示
def test_forget_password_email_success ( self ) :
code = generate_code ( )
utils . set_code ( self . blog_user . email , code )
#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 ,
@ -165,20 +207,21 @@ class AccountTest(TestCase):
path = reverse ( " account:forget_password " ) ,
data = data
)
self . assertEqual ( resp . status_code , 302 )
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 )
self . assertEqual ( blog_user . check_password ( data [ " new_password1 " ] ) , True )
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 " ,
email = " 123@123.com " , #shw 使用一个不存在的邮箱
code = " 123456 " ,
)
resp = self . client . post (
@ -186,22 +229,23 @@ class AccountTest(TestCase):
data = data
)
self . assertEqual ( resp . status_code , 200 )
self . assertEqual ( resp . status_code , 200 ) #shw 断言请求未重定向,停留在原页面并显示错误
def test_forget_password_email_code_error ( self ) :
code = generate_code ( )
utils . set_code ( self . blog_user . email , code )
#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 " ,
code = " 111111 " , #shw 错误的验证码
)
resp = self . client . post (
path = reverse ( " account:forget_password " ) ,
data = data
)
self . assertEqual ( resp . status_code , 200 )
self . assertEqual ( resp . status_code , 200 ) #shw 断言请求未重定向,停留在原页面并显示错误