from django.test import Client, RequestFactory, TestCase from django.urls import reverse from django.utils import timezone from django.utils.translation import gettext_lazy as _ from accounts.models import BlogUser from blog.models import Article, Category from djangoblog.utils import * from . import utils # Create your tests here. class AccountTest(TestCase): """ 针对账户注册、登录、密码找回、邮箱验证等功能的测试类。 使用 Django 的 TestCase 提供的测试客户端和工厂方法进行测试。 """ def setUp(self): """ 初始化测试所需的对象。 每个测试方法运行前都会执行。 """ 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--=" # 用于密码重置测试的新密码 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') # 测试登录功能 loginresult = self.client.login( username='liangliangyy1', password='qwer!@#$ggg' ) self.assertEqual(loginresult, True) # 登录应成功 # 测试访问 Django admin response = self.client.get('/admin/') self.assertEqual(response.status_code, 200) # 创建一个文章分类 category = Category() category.name = "categoryaaa" category.creation_time = timezone.now() category.last_modify_time = timezone.now() category.save() # 创建一篇文章 article = Article() article.title = "nicetitleaaa" article.body = "nicecontentaaa" article.author = user article.category = category article.type = 'a' article.status = 'p' article.save() # 测试访问文章的后台管理页面 response = self.client.get(article.get_admin_url()) self.assertEqual(response.status_code, 200) def test_validate_register(self): """ 测试用户注册、激活、登录及文章管理流程 """ # 验证注册前用户不存在 self.assertEquals( 0, len(BlogUser.objects.filter(email='user123@user.com')) ) # 通过客户端 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', }) # 验证注册后用户已创建 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.is_superuser = True user.is_staff = True user.save() 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" article.body = "nicecontentttt" article.author = user article.type = 'a' 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]) # 注销后访问后台页面可能重定向 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' }) 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) # 发送验证码邮件 # 验证正确邮箱与验证码 err = utils.verify("admin@admin.com", code) self.assertEqual(err, None) # 验证错误邮箱 err = utils.verify("admin@123.com", code) 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") 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") ) 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) 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) # 验证用户密码是否修改成功 blog_user = BlogUser.objects.filter(email=self.blog_user.email).first() 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, email="123@123.com", code="123456", ) resp = self.client.post( path=reverse("account:forget_password"), data=data ) 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, email=self.blog_user.email, code="111111", # 错误验证码 ) resp = self.client.post( path=reverse("account:forget_password"), data=data ) self.assertEqual(resp.status_code, 200)