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 #lht: Create your tests here. class AccountTest(TestCase): #lht: """ #lht: 账户功能测试类 #lht: 继承Django的TestCase,用于测试账户相关的各种功能 #lht: """ def setUp(self): #lht: """ #lht: 测试前的准备工作 #lht: 每个测试方法执行前都会调用此方法 #lht: """ self.client = Client() #lht: 创建测试客户端,用于模拟HTTP请求 self.factory = RequestFactory() #lht: 创建请求工厂,用于创建请求对象 #lht: 创建一个测试用户,用于后续的测试 self.blog_user = BlogUser.objects.create_user( username="test", email="admin@admin.com", password="12345678" ) self.new_test = "xxx123--=" #lht: 设置测试用的新密码 def test_validate_account(self): #lht: """ #lht: 测试账户验证功能 #lht: 包括超级用户创建、登录验证、管理员权限等 #lht: """ site = get_current_site().domain #lht: 创建超级用户用于测试 user = BlogUser.objects.create_superuser( email="liangliangyy1@gmail.com", username="liangliangyy1", password="qwer!@#$ggg") testuser = BlogUser.objects.get(username='liangliangyy1') #lht: 测试用户登录功能 loginresult = self.client.login( username='liangliangyy1', password='qwer!@#$ggg') self.assertEqual(loginresult, True) #lht: 验证登录成功 response = self.client.get('/admin/') #lht: 访问管理后台 self.assertEqual(response.status_code, 200) #lht: 验证访问成功 #lht: 创建分类和文章用于测试 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() #lht: 测试能否正常访问文章管理页面 response = self.client.get(article.get_admin_url()) self.assertEqual(response.status_code, 200) def test_validate_register(self): #lht: """ #lht: 测试用户注册流程 #lht: 包括注册、邮箱验证、登录、权限设置等完整流程 #lht: """ #lht: 验证目标邮箱尚未注册 self.assertEquals( 0, len( BlogUser.objects.filter( email='user123@user.com'))) #lht: 模拟用户注册请求 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', }) #lht: 验证用户已成功创建 self.assertEquals( 1, len( BlogUser.objects.filter( email='user123@user.com'))) #lht: 获取新创建的用户并验证邮箱链接 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) #lht: 使用新用户登录 self.client.login(username='user1233', password='password123!q@wE#R$T') user = BlogUser.objects.filter(email='user123@user.com')[0] #lht: 设置用户为超级用户和员工,以便访问管理功能 user.is_superuser = True user.is_staff = True user.save() delete_sidebar_cache() #lht: 创建分类和文章 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() #lht: 验证能够访问文章管理页面 response = self.client.get(article.get_admin_url()) self.assertEqual(response.status_code, 200) #lht: 测试用户登出功能 response = self.client.get(reverse('account:logout')) self.assertIn(response.status_code, [301, 302, 200]) #lht: 登出后应无法访问管理页面 response = self.client.get(article.get_admin_url()) self.assertIn(response.status_code, [301, 302, 200]) #lht: 测试使用错误密码登录 response = self.client.post(reverse('account:login'), { 'username': 'user1233', 'password': 'password123' }) self.assertIn(response.status_code, [301, 302, 200]) #lht: 登录失败后仍无法访问管理页面 response = self.client.get(article.get_admin_url()) self.assertIn(response.status_code, [301, 302, 200]) def test_verify_email_code(self): #lht: """ #lht: 测试邮箱验证码验证功能 #lht: """ to_email = "admin@admin.com" code = generate_code() #lht: 生成验证码 utils.set_code(to_email, code) #lht: 设置验证码 utils.send_verify_email(to_email, code) #lht: 发送验证码(模拟) #lht: 验证正确的验证码能通过验证 err = utils.verify("admin@admin.com", code) self.assertEqual(err, None) #lht: 验证错误的验证码不能通过验证 err = utils.verify("admin@123.com", code) self.assertEqual(type(err), str) def test_forget_password_email_code_success(self): #lht: """ #lht: 测试忘记密码时成功获取验证码 #lht: """ resp = self.client.post( path=reverse("account:forget_password_code"), data=dict(email="admin@admin.com") ) #lht: 验证请求成功且返回"ok" self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content.decode("utf-8"), "ok") def test_forget_password_email_code_fail(self): #lht: """ #lht: 测试忘记密码时获取验证码失败的情况 #lht: """ #lht: 测试没有提供邮箱的情况 resp = self.client.post( path=reverse("account:forget_password_code"), data=dict() ) self.assertEqual(resp.content.decode("utf-8"), "错误的邮箱") #lht: 测试提供无效邮箱的情况 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): #lht: """ #lht: 测试成功重置密码的完整流程 #lht: """ code = generate_code() utils.set_code(self.blog_user.email, code) #lht: 设置验证码 #lht: 准备重置密码的数据 data = dict( new_password1=self.new_test, new_password2=self.new_test, email=self.blog_user.email, code=code, ) #lht: 发送重置密码请求 resp = self.client.post( path=reverse("account:forget_password"), data=data ) self.assertEqual(resp.status_code, 302) #lht: 重定向表示成功 #lht: 验证用户密码是否修改成功 blog_user = BlogUser.objects.filter( email=self.blog_user.email, ).first() #lht: type: BlogUser self.assertNotEqual(blog_user, None) self.assertEqual(blog_user.check_password(data["new_password1"]), True) def test_forget_password_email_not_user(self): #lht: """ #lht: 测试为不存在的用户重置密码的情况 #lht: """ data = dict( new_password1=self.new_test, new_password2=self.new_test, email="123@123.com", #lht: 不存在的邮箱 code="123456", ) resp = self.client.post( path=reverse("account:forget_password"), data=data ) #lht: 应该返回200状态码而不是重定向,因为验证失败 self.assertEqual(resp.status_code, 200) def test_forget_password_email_code_error(self): #lht: """ #lht: 测试使用错误验证码重置密码的情况 #lht: """ code = generate_code() utils.set_code(self.blog_user.email, code) #lht: 使用错误的验证码 data = dict( new_password1=self.new_test, new_password2=self.new_test, email=self.blog_user.email, code="111111", #lht: 错误的验证码 ) resp = self.client.post( path=reverse("account:forget_password"), data=data ) #lht: 应该返回200状态码而不是重定向,因为验证失败 self.assertEqual(resp.status_code, 200)