测试文章内容
import os import tempfile import shutil from django.test import TestCase, override_settings from django.core.management import call_command from django.core.management.base import CommandError from django.utils import timezone from django.core.files.uploadedfile import SimpleUploadedFile from unittest.mock import patch, MagicMock from .models import Website, Article from .utils import process_article, download_media, is_valid_url, full_site_crawler from .tasks import crawl_website, crawl_all_websites, health_check class WebsiteModelTest(TestCase): """网站模型测试""" def setUp(self): self.website = Website.objects.create( name='测试网站', base_url='https://test.com', description='测试描述' ) def test_website_creation(self): """测试网站创建""" self.assertEqual(self.website.name, '测试网站') self.assertEqual(self.website.base_url, 'https://test.com') self.assertTrue(self.website.enabled) def test_website_str(self): """测试网站字符串表示""" self.assertEqual(str(self.website), '测试网站') class ArticleModelTest(TestCase): """文章模型测试""" def setUp(self): self.website = Website.objects.create( name='测试网站', base_url='https://test.com' ) self.article = Article.objects.create( website=self.website, title='测试文章', url='https://test.com/article/1', content='
测试内容
', media_files=['image1.jpg', 'image2.jpg'] ) def test_article_creation(self): """测试文章创建""" self.assertEqual(self.article.title, '测试文章') self.assertEqual(self.article.url, 'https://test.com/article/1') self.assertEqual(len(self.article.media_files), 2) def test_article_str(self): """测试文章字符串表示""" self.assertEqual(str(self.article), '测试文章') class UtilsTest(TestCase): """工具函数测试""" def setUp(self): self.website = Website.objects.create( name='测试网站', base_url='https://test.com' ) self.temp_dir = tempfile.mkdtemp() def tearDown(self): shutil.rmtree(self.temp_dir) def test_is_valid_url(self): """测试URL验证""" from .utils import is_valid_url # 有效URL self.assertTrue(is_valid_url('https://test.com/article', 'test.com')) self.assertTrue(is_valid_url('http://test.com/article', 'test.com')) # 无效URL self.assertFalse(is_valid_url('https://other.com/article', 'test.com')) self.assertFalse(is_valid_url('ftp://test.com/article', 'test.com')) self.assertFalse(is_valid_url('invalid-url', 'test.com')) @patch('core.utils.requests.get') def test_download_media(self, mock_get): """测试媒体下载""" # 模拟响应 mock_response = MagicMock() mock_response.content = b'fake image content' mock_response.headers = {'content-type': 'image/jpeg'} mock_get.return_value = mock_response # 测试下载 result = download_media('https://test.com/image.jpg', self.temp_dir) self.assertIsNotNone(result) self.assertTrue(os.path.exists(result)) @patch('core.utils.requests.get') @patch('core.utils.download_media') def test_process_article_success(self, mock_download_media, mock_get): """测试文章处理成功""" # 模拟HTML响应 html_content = '''测试文章内容
集成测试内容
' ) # 3. 验证关联关系 self.assertEqual(article.website, self.website) self.assertEqual(self.website.article_set.count(), 1) # 4. 验证数据完整性 self.assertIsNotNone(article.created_at) self.assertIsInstance(article.media_files, list) @override_settings(MEDIA_ROOT=tempfile.mkdtemp()) class MediaHandlingTest(TestCase): """媒体文件处理测试""" def setUp(self): self.website = Website.objects.create( name='媒体测试网站', base_url='https://media-test.com' ) def test_media_files_field(self): """测试媒体文件字段""" article = Article.objects.create( website=self.website, title='媒体测试文章', url='https://media-test.com/article/1', content='测试内容
', media_files=['image1.jpg', 'video1.mp4'] ) # 验证媒体文件列表 self.assertEqual(len(article.media_files), 2) self.assertIn('image1.jpg', article.media_files) self.assertIn('video1.mp4', article.media_files) class ErrorHandlingTest(TestCase): """错误处理测试""" def test_duplicate_url_handling(self): """测试重复URL处理""" website = Website.objects.create( name='错误测试网站', base_url='https://error-test.com' ) # 创建第一篇文章 article1 = Article.objects.create( website=website, title='第一篇文章', url='https://error-test.com/article/1', content='内容1
' ) # 尝试创建相同URL的文章 with self.assertRaises(Exception): Article.objects.create( website=website, title='第二篇文章', url='https://error-test.com/article/1', # 相同URL content='内容2
' ) def test_invalid_website_data(self): """测试无效网站数据""" # 测试重复名称(unique约束) Website.objects.create( name='测试网站1', base_url='https://test1.com' ) with self.assertRaises(Exception): Website.objects.create( name='测试网站1', # 重复名称 base_url='https://test2.com' )