|
|
#zf:导入操作系统相关模块
|
|
|
import os
|
|
|
|
|
|
#zf:从django.conf导入settings配置
|
|
|
from django.conf import settings
|
|
|
#zf:从django.core.files.uploadedfile导入SimpleUploadedFile用于文件上传测试
|
|
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
|
#zf:从django.core.management导入call_command用于调用管理命令
|
|
|
from django.core.management import call_command
|
|
|
#zf:从django.core.paginator导入Paginator用于分页测试
|
|
|
from django.core.paginator import Paginator
|
|
|
#zf:从django.templatetags.static导入static用于静态文件处理
|
|
|
from django.templatetags.static import static
|
|
|
#zf:从django.test导入Client, RequestFactory, TestCase用于测试
|
|
|
from django.test import Client, RequestFactory, TestCase
|
|
|
#zf:从django.urls导入reverse用于URL反向解析
|
|
|
from django.urls import reverse
|
|
|
#zf:从django.utils导入timezone用于时间处理
|
|
|
from django.utils import timezone
|
|
|
|
|
|
#zf:从accounts.models导入BlogUser用户模型
|
|
|
from accounts.models import BlogUser
|
|
|
#zf:从blog.forms导入BlogSearchForm搜索表单
|
|
|
from blog.forms import BlogSearchForm
|
|
|
#zf:从blog.models导入Article, Category, Tag, SideBar, Links模型
|
|
|
from blog.models import Article, Category, Tag, SideBar, Links
|
|
|
#zf:从blog.templatetags.blog_tags导入load_pagination_info, load_articletags模板标签
|
|
|
from blog.templatetags.blog_tags import load_pagination_info, load_articletags
|
|
|
#zf:从djangoblog.utils导入get_current_site, get_sha256工具函数
|
|
|
from djangoblog.utils import get_current_site, get_sha256
|
|
|
#zf:从oauth.models导入OAuthUser, OAuthConfig OAuth相关模型
|
|
|
from oauth.models import OAuthUser, OAuthConfig
|
|
|
|
|
|
|
|
|
#zf:创建你的测试用例
|
|
|
|
|
|
#zf:定义文章测试类,继承自TestCase
|
|
|
class ArticleTest(TestCase):
|
|
|
#zf:测试初始化方法
|
|
|
def setUp(self):
|
|
|
#zf:创建测试客户端
|
|
|
self.client = Client()
|
|
|
#zf:创建请求工厂
|
|
|
self.factory = RequestFactory()
|
|
|
|
|
|
#zf:测试验证文章功能
|
|
|
def test_validate_article(self):
|
|
|
#zf:获取当前站点域名
|
|
|
site = get_current_site().domain
|
|
|
#zf:创建或获取测试用户
|
|
|
user = BlogUser.objects.get_or_create(
|
|
|
email="liangliangyy@gmail.com",
|
|
|
username="liangliangyy")[0]
|
|
|
#zf:设置用户密码
|
|
|
user.set_password("liangliangyy")
|
|
|
#zf:设置用户为职员
|
|
|
user.is_staff = True
|
|
|
#zf:设置用户为超级用户
|
|
|
user.is_superuser = True
|
|
|
#zf:保存用户
|
|
|
user.save()
|
|
|
#zf:测试获取用户绝对URL
|
|
|
response = self.client.get(user.get_absolute_url())
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
#zf:测试访问管理后台日志页面
|
|
|
response = self.client.get('/admin/servermanager/emailsendlog/')
|
|
|
#zf:测试访问管理后台日志条目页面
|
|
|
response = self.client.get('admin/admin/logentry/')
|
|
|
#zf:创建侧边栏对象
|
|
|
s = SideBar()
|
|
|
#zf:设置侧边栏排序
|
|
|
s.sequence = 1
|
|
|
#zf:设置侧边栏名称
|
|
|
s.name = 'test'
|
|
|
#zf:设置侧边栏内容
|
|
|
s.content = 'test content'
|
|
|
#zf:设置侧边栏启用状态
|
|
|
s.is_enable = True
|
|
|
#zf:保存侧边栏
|
|
|
s.save()
|
|
|
|
|
|
#zf:创建分类对象
|
|
|
category = Category()
|
|
|
#zf:设置分类名称
|
|
|
category.name = "category"
|
|
|
#zf:设置分类创建时间
|
|
|
category.creation_time = timezone.now()
|
|
|
#zf:设置分类最后修改时间
|
|
|
category.last_mod_time = timezone.now()
|
|
|
#zf:保存分类
|
|
|
category.save()
|
|
|
|
|
|
#zf:创建标签对象
|
|
|
tag = Tag()
|
|
|
#zf:设置标签名称
|
|
|
tag.name = "nicetag"
|
|
|
#zf:保存标签
|
|
|
tag.save()
|
|
|
|
|
|
#zf:创建文章对象
|
|
|
article = Article()
|
|
|
#zf:设置文章标题
|
|
|
article.title = "nicetitle"
|
|
|
#zf:设置文章正文
|
|
|
article.body = "nicecontent"
|
|
|
#zf:设置文章作者
|
|
|
article.author = user
|
|
|
#zf:设置文章分类
|
|
|
article.category = category
|
|
|
#zf:设置文章类型
|
|
|
article.type = 'a'
|
|
|
#zf:设置文章状态
|
|
|
article.status = 'p'
|
|
|
|
|
|
#zf:保存文章
|
|
|
article.save()
|
|
|
#zf:断言文章标签数量为0
|
|
|
self.assertEqual(0, article.tags.count())
|
|
|
#zf:给文章添加标签
|
|
|
article.tags.add(tag)
|
|
|
#zf:保存文章
|
|
|
article.save()
|
|
|
#zf:断言文章标签数量为1
|
|
|
self.assertEqual(1, article.tags.count())
|
|
|
|
|
|
#zf:循环创建20篇文章用于测试
|
|
|
for i in range(20):
|
|
|
article = Article()
|
|
|
#zf:设置文章标题
|
|
|
article.title = "nicetitle" + str(i)
|
|
|
#zf:设置文章正文
|
|
|
article.body = "nicetitle" + str(i)
|
|
|
#zf:设置文章作者
|
|
|
article.author = user
|
|
|
#zf:设置文章分类
|
|
|
article.category = category
|
|
|
#zf:设置文章类型
|
|
|
article.type = 'a'
|
|
|
#zf:设置文章状态
|
|
|
article.status = 'p'
|
|
|
#zf:保存文章
|
|
|
article.save()
|
|
|
#zf:给文章添加标签
|
|
|
article.tags.add(tag)
|
|
|
#zf:保存文章
|
|
|
article.save()
|
|
|
#zf:从blog.documents导入ELASTICSEARCH_ENABLED常量
|
|
|
from blog.documents import ELASTICSEARCH_ENABLED
|
|
|
#zf:如果启用了Elasticsearch
|
|
|
if ELASTICSEARCH_ENABLED:
|
|
|
#zf:调用构建索引命令
|
|
|
call_command("build_index")
|
|
|
#zf:测试搜索功能
|
|
|
response = self.client.get('/search', {'q': 'nicetitle'})
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
#zf:测试获取文章绝对URL
|
|
|
response = self.client.get(article.get_absolute_url())
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
#zf:从djangoblog.spider_notify导入SpiderNotify
|
|
|
from djangoblog.spider_notify import SpiderNotify
|
|
|
#zf:通知搜索引擎爬虫
|
|
|
SpiderNotify.notify(article.get_absolute_url())
|
|
|
#zf:测试获取标签绝对URL
|
|
|
response = self.client.get(tag.get_absolute_url())
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
#zf:测试获取分类绝对URL
|
|
|
response = self.client.get(category.get_absolute_url())
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
#zf:测试搜索功能
|
|
|
response = self.client.get('/search', {'q': 'django'})
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
#zf:加载文章标签
|
|
|
s = load_articletags(article)
|
|
|
#zf:断言结果不为None
|
|
|
self.assertIsNotNone(s)
|
|
|
|
|
|
#zf:用户登录
|
|
|
self.client.login(username='liangliangyy', password='liangliangyy')
|
|
|
|
|
|
#zf:测试获取归档页面
|
|
|
response = self.client.get(reverse('blog:archives'))
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
#zf:创建所有文章的分页器
|
|
|
p = Paginator(Article.objects.all(), settings.PAGINATE_BY)
|
|
|
#zf:检查分页功能
|
|
|
self.check_pagination(p, '', '')
|
|
|
|
|
|
#zf:创建按标签筛选文章的分页器
|
|
|
p = Paginator(Article.objects.filter(tags=tag), settings.PAGINATE_BY)
|
|
|
#zf:检查分页功能,类型为分类标签归档
|
|
|
self.check_pagination(p, '分类标签归档', tag.slug)
|
|
|
|
|
|
#zf:创建按作者筛选文章的分页器
|
|
|
p = Paginator(
|
|
|
Article.objects.filter(
|
|
|
author__username='liangliangyy'), settings.PAGINATE_BY)
|
|
|
#zf:检查分页功能,类型为作者文章归档
|
|
|
self.check_pagination(p, '作者文章归档', 'liangliangyy')
|
|
|
|
|
|
#zf:创建按分类筛选文章的分页器
|
|
|
p = Paginator(Article.objects.filter(category=category), settings.PAGINATE_BY)
|
|
|
#zf:检查分页功能,类型为分类目录归档
|
|
|
self.check_pagination(p, '分类目录归档', category.slug)
|
|
|
|
|
|
#zf:创建博客搜索表单实例
|
|
|
f = BlogSearchForm()
|
|
|
#zf:执行搜索
|
|
|
f.search()
|
|
|
#zf:从djangoblog.spider_notify导入SpiderNotify
|
|
|
from djangoblog.spider_notify import SpiderNotify
|
|
|
#zf:通知百度搜索引擎
|
|
|
SpiderNotify.baidu_notify([article.get_full_url()])
|
|
|
|
|
|
#zf:从blog.templatetags.blog_tags导入gravatar_url, gravatar
|
|
|
from blog.templatetags.blog_tags import gravatar_url, gravatar
|
|
|
#zf:获取gravatar头像URL
|
|
|
u = gravatar_url('liangliangyy@gmail.com')
|
|
|
#zf:获取gravatar头像
|
|
|
u = gravatar('liangliangyy@gmail.com')
|
|
|
|
|
|
#zf:创建链接对象
|
|
|
link = Links(
|
|
|
sequence=1,
|
|
|
name="lylinux",
|
|
|
link='https://wwww.lylinux.net')
|
|
|
#zf:保存链接
|
|
|
link.save()
|
|
|
#zf:测试获取链接页面
|
|
|
response = self.client.get('/links.html')
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
#zf:测试获取RSS订阅页面
|
|
|
response = self.client.get('/feed/')
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
#zf:测试获取站点地图
|
|
|
response = self.client.get('/sitemap.xml')
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
#zf:测试删除文章
|
|
|
self.client.get("/admin/blog/article/1/delete/")
|
|
|
#zf:测试访问管理后台日志页面
|
|
|
self.client.get('/admin/servermanager/emailsendlog/')
|
|
|
#zf:测试访问管理后台日志条目页面
|
|
|
self.client.get('/admin/admin/logentry/')
|
|
|
#zf:测试访问管理后台日志条目修改页面
|
|
|
self.client.get('/admin/admin/logentry/1/change/')
|
|
|
|
|
|
#zf:检查分页功能的方法
|
|
|
def check_pagination(self, p, type, value):
|
|
|
#zf:遍历所有页面
|
|
|
for page in range(1, p.num_pages + 1):
|
|
|
#zf:加载分页信息
|
|
|
s = load_pagination_info(p.page(page), type, value)
|
|
|
#zf:断言结果不为None
|
|
|
self.assertIsNotNone(s)
|
|
|
#zf:如果有上一页URL
|
|
|
if s['previous_url']:
|
|
|
#zf:测试访问上一页
|
|
|
response = self.client.get(s['previous_url'])
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
#zf:如果有下一页URL
|
|
|
if s['next_url']:
|
|
|
#zf:测试访问下一页
|
|
|
response = self.client.get(s['next_url'])
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
#zf:测试图片上传功能
|
|
|
def test_image(self):
|
|
|
#zf:导入requests模块
|
|
|
import requests
|
|
|
#zf:获取Python官网Logo图片
|
|
|
rsp = requests.get(
|
|
|
'https://www.python.org/static/img/python-logo.png')
|
|
|
#zf:设置图片保存路径
|
|
|
imagepath = os.path.join(settings.BASE_DIR, 'python.png')
|
|
|
#zf:将图片保存到本地
|
|
|
with open(imagepath, 'wb') as file:
|
|
|
file.write(rsp.content)
|
|
|
#zf:测试未登录上传图片
|
|
|
rsp = self.client.post('/upload')
|
|
|
#zf:断言响应状态码为403(禁止访问)
|
|
|
self.assertEqual(rsp.status_code, 403)
|
|
|
#zf:生成上传签名
|
|
|
sign = get_sha256(get_sha256(settings.SECRET_KEY))
|
|
|
#zf:打开图片文件
|
|
|
with open(imagepath, 'rb') as file:
|
|
|
#zf:创建上传文件对象
|
|
|
imgfile = SimpleUploadedFile(
|
|
|
'python.png', file.read(), content_type='image/jpg')
|
|
|
#zf:构造表单数据
|
|
|
form_data = {'python.png': imgfile}
|
|
|
#zf:测试带签名上传图片
|
|
|
rsp = self.client.post(
|
|
|
'/upload?sign=' + sign, form_data, follow=True)
|
|
|
#zf:断言响应状态码为200
|
|
|
self.assertEqual(rsp.status_code, 200)
|
|
|
#zf:删除临时图片文件
|
|
|
os.remove(imagepath)
|
|
|
#zf:从djangoblog.utils导入save_user_avatar, send_email工具函数
|
|
|
from djangoblog.utils import save_user_avatar, send_email
|
|
|
#zf:测试发送邮件
|
|
|
send_email(['qq@qq.com'], 'testTitle', 'testContent')
|
|
|
#zf:测试保存用户头像
|
|
|
save_user_avatar(
|
|
|
'https://www.python.org/static/img/python-logo.png')
|
|
|
|
|
|
#zf:测试错误页面
|
|
|
def test_errorpage(self):
|
|
|
#zf:测试访问不存在的页面
|
|
|
rsp = self.client.get('/eee')
|
|
|
#zf:断言响应状态码为404
|
|
|
self.assertEqual(rsp.status_code, 404)
|
|
|
|
|
|
#zf:测试管理命令
|
|
|
def test_commands(self):
|
|
|
#zf:创建或获取测试用户
|
|
|
user = BlogUser.objects.get_or_create(
|
|
|
email="liangliangyy@gmail.com",
|
|
|
username="liangliangyy")[0]
|
|
|
#zf:设置用户密码
|
|
|
user.set_password("liangliangyy")
|
|
|
#zf:设置用户为职员
|
|
|
user.is_staff = True
|
|
|
#zf:设置用户为超级用户
|
|
|
user.is_superuser = True
|
|
|
#zf:保存用户
|
|
|
user.save()
|
|
|
|
|
|
#zf:创建OAuth配置对象
|
|
|
c = OAuthConfig()
|
|
|
#zf:设置OAuth类型
|
|
|
c.type = 'qq'
|
|
|
#zf:设置应用密钥
|
|
|
c.appkey = 'appkey'
|
|
|
#zf:设置应用密钥
|
|
|
c.appsecret = 'appsecret'
|
|
|
#zf:保存配置
|
|
|
c.save()
|
|
|
|
|
|
#zf:创建OAuth用户对象
|
|
|
u = OAuthUser()
|
|
|
#zf:设置OAuth类型
|
|
|
u.type = 'qq'
|
|
|
#zf:设置openid
|
|
|
u.openid = 'openid'
|
|
|
#zf:关联用户
|
|
|
u.user = user
|
|
|
#zf:设置头像
|
|
|
u.picture = static("/blog/img/avatar.png")
|
|
|
#zf:设置元数据
|
|
|
u.metadata = '''
|
|
|
{
|
|
|
"figureurl": "https://qzapp.qlogo.cn/qzapp/101513904/C740E30B4113EAA80E0D9918ABC78E82/30"
|
|
|
}'''
|
|
|
#zf:保存OAuth用户
|
|
|
u.save()
|
|
|
|
|
|
#zf:创建另一个OAuth用户对象
|
|
|
u = OAuthUser()
|
|
|
#zf:设置OAuth类型
|
|
|
u.type = 'qq'
|
|
|
#zf:设置openid
|
|
|
u.openid = 'openid1'
|
|
|
#zf:设置头像URL
|
|
|
u.picture = 'https://qzapp.qlogo.cn/qzapp/101513904/C740E30B4113EAA80E0D9918ABC78E82/30'
|
|
|
#zf:设置元数据
|
|
|
u.metadata = '''
|
|
|
{
|
|
|
"figureurl": "https://qzapp.qlogo.cn/qzapp/101513904/C740E30B4113EAA80E0D9918ABC78E82/30"
|
|
|
}'''
|
|
|
#zf:保存OAuth用户
|
|
|
u.save()
|
|
|
|
|
|
#zf:从blog.documents导入ELASTICSEARCH_ENABLED常量
|
|
|
from blog.documents import ELASTICSEARCH_ENABLED
|
|
|
#zf:如果启用了Elasticsearch
|
|
|
if ELASTICSEARCH_ENABLED:
|
|
|
#zf:调用构建索引命令
|
|
|
call_command("build_index")
|
|
|
#zf:调用通知百度搜索引擎命令
|
|
|
call_command("ping_baidu", "all")
|
|
|
#zf:调用创建测试数据命令
|
|
|
call_command("create_testdata")
|
|
|
#zf:调用清除缓存命令
|
|
|
call_command("clear_cache")
|
|
|
#zf:调用同步用户头像命令
|
|
|
call_command("sync_user_avatar")
|
|
|
#zf:调用构建搜索词命令
|
|
|
call_command("build_search_words") |