import os from django.conf import settings from django.core.files.uploadedfile import SimpleUploadedFile from django.core.management import call_command from django.core.paginator import Paginator from django.templatetags.static import static from django.test import Client, RequestFactory, TestCase from django.urls import reverse from django.utils import timezone from accounts.models import BlogUser from blog.forms import BlogSearchForm from blog.models import Article, Category, Tag, SideBar, Links from blog.templatetags.blog_tags import load_pagination_info, load_articletags from djangoblog.utils import get_current_site, get_sha256 from oauth.models import OAuthUser, OAuthConfig # Create your tests here. class ArticleTest(TestCase): """ mk: 文章相关功能测试类 包含文章创建、验证、分页、搜索、图片上传等功能的集成测试 """ def setUp(self): """ mk: 测试初始化方法 创建测试客户端和请求工厂实例,用于后续测试 """ self.client = Client() self.factory = RequestFactory() def test_validate_article(self): """ mk: 验证文章功能测试方法 测试文章的创建、展示、分类、标签、搜索等核心功能, 包括侧边栏、分类、标签、文章的增删改查操作 """ site = get_current_site().domain user = BlogUser.objects.get_or_create( email="liangliangyy@gmail.com", username="liangliangyy")[0] user.set_password("liangliangyy") user.is_staff = True user.is_superuser = True user.save() response = self.client.get(user.get_absolute_url()) self.assertEqual(response.status_code, 200) response = self.client.get('/admin/servermanager/emailsendlog/') response = self.client.get('admin/admin/logentry/') # mk:创建侧边栏 s = SideBar() s.sequence = 1 s.name = 'test' s.content = 'test content' s.is_enable = True s.save() # mk:创建分类 category = Category() category.name = "category" category.creation_time = timezone.now() category.last_mod_time = timezone.now() category.save() # mk:创建标签 tag = Tag() tag.name = "nicetag" tag.save() # mk:创建文章 article = Article() article.title = "nicetitle" article.body = "nicecontent" article.author = user article.category = category article.type = 'a' article.status = 'p' article.save() self.assertEqual(0, article.tags.count()) article.tags.add(tag) article.save() self.assertEqual(1, article.tags.count()) # mk:批量创建文章用于测试 for i in range(20): article = Article() article.title = "nicetitle" + str(i) article.body = "nicetitle" + str(i) article.author = user article.category = category article.type = 'a' article.status = 'p' article.save() article.tags.add(tag) article.save() from blog.documents import ELASTICSEARCH_ENABLED if ELASTICSEARCH_ENABLED: call_command("build_index") response = self.client.get('/search', {'q': 'nicetitle'}) self.assertEqual(response.status_code, 200) response = self.client.get(article.get_absolute_url()) self.assertEqual(response.status_code, 200) from djangoblog.spider_notify import SpiderNotify SpiderNotify.notify(article.get_absolute_url()) response = self.client.get(tag.get_absolute_url()) self.assertEqual(response.status_code, 200) response = self.client.get(category.get_absolute_url()) self.assertEqual(response.status_code, 200) response = self.client.get('/search', {'q': 'django'}) self.assertEqual(response.status_code, 200) s = load_articletags(article) self.assertIsNotNone(s) self.client.login(username='liangliangyy', password='liangliangyy') response = self.client.get(reverse('blog:archives')) self.assertEqual(response.status_code, 200) # mk:测试各种分页情况 p = Paginator(Article.objects.all(), settings.PAGINATE_BY) self.check_pagination(p, '', '') p = Paginator(Article.objects.filter(tags=tag), settings.PAGINATE_BY) self.check_pagination(p, '分类标签归档', tag.slug) p = Paginator( Article.objects.filter( author__username='liangliangyy'), settings.PAGINATE_BY) self.check_pagination(p, '作者文章归档', 'liangliangyy') p = Paginator(Article.objects.filter(category=category), settings.PAGINATE_BY) self.check_pagination(p, '分类目录归档', category.slug) f = BlogSearchForm() f.search() # self.client.login(username='liangliangyy', password='liangliangyy') from djangoblog.spider_notify import SpiderNotify SpiderNotify.baidu_notify([article.get_full_url()]) from blog.templatetags.blog_tags import gravatar_url, gravatar u = gravatar_url('liangliangyy@gmail.com') u = gravatar('liangliangyy@gmail.com') # mk:测试链接功能 link = Links( sequence=1, name="lylinux", link='https://wwww.lylinux.net') link.save() response = self.client.get('/links.html') self.assertEqual(response.status_code, 200) response = self.client.get('/feed/') self.assertEqual(response.status_code, 200) response = self.client.get('/sitemap.xml') self.assertEqual(response.status_code, 200) self.client.get("/admin/blog/article/1/delete/") self.client.get('/admin/servermanager/emailsendlog/') self.client.get('/admin/admin/logentry/') self.client.get('/admin/admin/logentry/1/change/') def check_pagination(self, p, type, value): """ mk: 检查分页功能 遍历所有分页页面,验证分页信息加载和前后页链接的有效性 Args: p (Paginator): Django分页器对象 type (str): 分页类型标识 value (str): 分页值(如标签slug、用户名等) """ for page in range(1, p.num_pages + 1): s = load_pagination_info(p.page(page), type, value) self.assertIsNotNone(s) if s['previous_url']: response = self.client.get(s['previous_url']) self.assertEqual(response.status_code, 200) if s['next_url']: response = self.client.get(s['next_url']) self.assertEqual(response.status_code, 200) def test_image(self): """ mk: 图片上传功能测试方法 测试图片下载、上传权限验证、文件上传等流程 """ import requests rsp = requests.get( 'https://www.python.org/static/img/python-logo.png') imagepath = os.path.join(settings.BASE_DIR, 'python.png') with open(imagepath, 'wb') as file: file.write(rsp.content) rsp = self.client.post('/upload') self.assertEqual(rsp.status_code, 403) sign = get_sha256(get_sha256(settings.SECRET_KEY)) with open(imagepath, 'rb') as file: imgfile = SimpleUploadedFile( 'python.png', file.read(), content_type='image/jpg') form_data = {'python.png': imgfile} rsp = self.client.post( '/upload?sign=' + sign, form_data, follow=True) self.assertEqual(rsp.status_code, 200) os.remove(imagepath) from djangoblog.utils import save_user_avatar, send_email send_email(['qq@qq.com'], 'testTitle', 'testContent') save_user_avatar( 'https://www.python.org/static/img/python-logo.png') def test_errorpage(self): """ mk: 错误页面测试方法 测试访问不存在页面时返回404状态码 """ rsp = self.client.get('/eee') self.assertEqual(rsp.status_code, 404) def test_commands(self): """ mk: Django管理命令测试方法 测试各种自定义管理命令的执行,包括索引构建、百度推送、测试数据创建等 """ user = BlogUser.objects.get_or_create( email="liangliangyy@gmail.com", username="liangliangyy")[0] user.set_password("liangliangyy") user.is_staff = True user.is_superuser = True user.save() #mk: 创建OAuth配置和用户 c = OAuthConfig() c.type = 'qq' c.appkey = 'appkey' c.appsecret = 'appsecret' c.save() u = OAuthUser() u.type = 'qq' u.openid = 'openid' u.user = user u.picture = static("/blog/img/avatar.png") u.metadata = ''' { "figureurl": "https://qzapp.qlogo.cn/qzapp/101513904/C740E30B4113EAA80E0D9918ABC78E82/30" }''' u.save() u = OAuthUser() u.type = 'qq' u.openid = 'openid1' u.picture = 'https://qzapp.qlogo.cn/qzapp/101513904/C740E30B4113EAA80E0D9918ABC78E82/30' u.metadata = ''' { "figureurl": "https://qzapp.qlogo.cn/qzapp/101513904/C740E30B4113EAA80E0D9918ABC78E82/30" }''' u.save() from blog.documents import ELASTICSEARCH_ENABLED if ELASTICSEARCH_ENABLED: call_command("build_index") call_command("ping_baidu", "all") call_command("create_testdata") call_command("clear_cache") call_command("sync_user_avatar") call_command("build_search_words")