test(04-02): add failing tests for DownloadInput/DownloadOutput schemas
TDD RED phase: - Test DownloadInput validates required fields (content_dir, content_type) - Test DownloadOutput validates required fields (metadata_file, content_file, title, author) - Test DownloadOutput handles both video and article content types Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,127 @@
|
|||||||
|
"""Tests for DownloadProcessor and DownloadInput/DownloadOutput schemas.
|
||||||
|
|
||||||
|
Test coverage:
|
||||||
|
- DownloadInput schema validation
|
||||||
|
- DownloadOutput schema validation
|
||||||
|
- DownloadProcessor metadata fetching
|
||||||
|
- DownloadProcessor content downloading
|
||||||
|
- DownloadProcessor state recording
|
||||||
|
"""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from datetime import datetime
|
||||||
|
from unittest.mock import AsyncMock, MagicMock, patch
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from kb_pipeline.schemas import DownloadInput, DownloadOutput
|
||||||
|
|
||||||
|
|
||||||
|
class TestDownloadInputSchema:
|
||||||
|
"""Tests for DownloadInput schema validation."""
|
||||||
|
|
||||||
|
def test_schema_download_input_validates_required_fields(self):
|
||||||
|
"""Test 1: DownloadInput validates required fields"""
|
||||||
|
# Test with all required fields
|
||||||
|
input_data = DownloadInput(
|
||||||
|
content_id="BV1xx",
|
||||||
|
platform="bilibili",
|
||||||
|
content_dir="/tmp/content",
|
||||||
|
content_type="video"
|
||||||
|
)
|
||||||
|
assert input_data.content_id == "BV1xx"
|
||||||
|
assert input_data.platform == "bilibili"
|
||||||
|
assert input_data.content_dir == "/tmp/content"
|
||||||
|
assert input_data.content_type == "video"
|
||||||
|
|
||||||
|
def test_schema_download_input_requires_content_dir(self):
|
||||||
|
"""DownloadInput should require content_dir"""
|
||||||
|
with pytest.raises(Exception): # ValidationError from pydantic
|
||||||
|
DownloadInput(
|
||||||
|
content_id="BV1xx",
|
||||||
|
platform="bilibili",
|
||||||
|
content_type="video"
|
||||||
|
# Missing content_dir
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_schema_download_input_requires_content_type(self):
|
||||||
|
"""DownloadInput should require content_type"""
|
||||||
|
with pytest.raises(Exception): # ValidationError from pydantic
|
||||||
|
DownloadInput(
|
||||||
|
content_id="BV1xx",
|
||||||
|
platform="bilibili",
|
||||||
|
content_dir="/tmp/content"
|
||||||
|
# Missing content_type
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestDownloadOutputSchema:
|
||||||
|
"""Tests for DownloadOutput schema validation."""
|
||||||
|
|
||||||
|
def test_schema_download_output_validates_required_fields(self):
|
||||||
|
"""Test 2: DownloadOutput validates required fields"""
|
||||||
|
output = DownloadOutput(
|
||||||
|
success=True,
|
||||||
|
metadata_file="/tmp/content/bilibili_BV1xx_metadata.json",
|
||||||
|
content_file="/tmp/content/bilibili_BV1xx_content.md",
|
||||||
|
title="Test Video",
|
||||||
|
author="Test Author"
|
||||||
|
)
|
||||||
|
assert output.success is True
|
||||||
|
assert output.metadata_file == "/tmp/content/bilibili_BV1xx_metadata.json"
|
||||||
|
assert output.content_file == "/tmp/content/bilibili_BV1xx_content.md"
|
||||||
|
assert output.title == "Test Video"
|
||||||
|
assert output.author == "Test Author"
|
||||||
|
assert output.duration is None # Optional field
|
||||||
|
|
||||||
|
def test_schema_download_output_handles_video_content_type(self):
|
||||||
|
"""Test 3: DownloadOutput handles video content type with duration"""
|
||||||
|
output = DownloadOutput(
|
||||||
|
success=True,
|
||||||
|
metadata_file="/tmp/content/bilibili_BV1xx_metadata.json",
|
||||||
|
content_file="", # Video content handled by ASR
|
||||||
|
title="Test Video",
|
||||||
|
author="Test Author",
|
||||||
|
duration=300 # 5 minutes
|
||||||
|
)
|
||||||
|
assert output.success is True
|
||||||
|
assert output.duration == 300
|
||||||
|
assert output.content_file == ""
|
||||||
|
|
||||||
|
def test_schema_download_output_handles_article_content_type(self):
|
||||||
|
"""Test 3: DownloadOutput handles article content type without duration"""
|
||||||
|
output = DownloadOutput(
|
||||||
|
success=True,
|
||||||
|
metadata_file="/tmp/content/bilibili_CV123_metadata.json",
|
||||||
|
content_file="/tmp/content/bilibili_CV123_content.md",
|
||||||
|
title="Test Article",
|
||||||
|
author="Test Author",
|
||||||
|
duration=None # Articles don't have duration
|
||||||
|
)
|
||||||
|
assert output.success is True
|
||||||
|
assert output.duration is None
|
||||||
|
assert output.content_file == "/tmp/content/bilibili_CV123_content.md"
|
||||||
|
|
||||||
|
def test_schema_download_output_handles_zhihu_answer(self):
|
||||||
|
"""Test 3: DownloadOutput handles Zhihu answer content type"""
|
||||||
|
output = DownloadOutput(
|
||||||
|
success=True,
|
||||||
|
metadata_file="/tmp/content/zhihu_123456_metadata.json",
|
||||||
|
content_file="/tmp/content/zhihu_123456_content.md",
|
||||||
|
title="Test Answer",
|
||||||
|
author="Test Author"
|
||||||
|
)
|
||||||
|
assert output.success is True
|
||||||
|
assert "zhihu" in output.metadata_file
|
||||||
|
|
||||||
|
def test_schema_download_output_handles_failure(self):
|
||||||
|
"""DownloadOutput should handle failure case"""
|
||||||
|
output = DownloadOutput(
|
||||||
|
success=False,
|
||||||
|
error_message="Network error",
|
||||||
|
metadata_file="",
|
||||||
|
content_file="",
|
||||||
|
title="",
|
||||||
|
author=""
|
||||||
|
)
|
||||||
|
assert output.success is False
|
||||||
|
assert output.error_message == "Network error"
|
||||||
Reference in New Issue
Block a user