feat(08-02): implement crawl_comments method with hot sorting
- Add COMMENT_API_TEMPLATE for comment API URL - Implement crawl_comments() returning CommentsResult - Use order=hot for popular comments sorting - Only fetch first-level comments (no nested replies) - Add include_comments parameter to crawl_answer() - Export CommentAuthor, CommentData, CommentsResult in __init__.py Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -140,25 +140,17 @@ class TestCommentCrawler:
|
||||
mock_browser = MockBrowser.return_value
|
||||
# Setup for answer crawl
|
||||
mock_browser.page.route = MagicMock()
|
||||
mock_browser.page.request.get.return_value.status = 200
|
||||
mock_browser.page.request.get.return_value.json.return_value = mock_comment_response
|
||||
mock_browser.goto = MagicMock()
|
||||
mock_browser.close = MagicMock()
|
||||
|
||||
# We need to simulate the interceptor capturing answer data
|
||||
# For simplicity, patch the internal method
|
||||
with patch.object(crawler, '_crawl_answer_internal') as mock_internal:
|
||||
from kb_workflow.crawler.models import CrawlResult, AnswerData, ContentMetadata, AuthorInfo
|
||||
mock_internal.return_value = CrawlResult(
|
||||
success=True,
|
||||
content_type="answer",
|
||||
data=AnswerData(
|
||||
id=456,
|
||||
question_id=123,
|
||||
question_title="Test Question",
|
||||
content="<p>Content</p>",
|
||||
excerpt="Excerpt",
|
||||
metadata=ContentMetadata(author=AuthorInfo(name="Author"))
|
||||
)
|
||||
)
|
||||
# Create interceptor that will capture answer data
|
||||
with patch('kb_workflow.crawler.zhihu_crawler.ZhihuApiInterceptor') as MockInterceptor:
|
||||
mock_interceptor = MockInterceptor.return_value
|
||||
mock_interceptor.captured_data = {"answer": mock_answer_data}
|
||||
|
||||
# Mock crawl_comments to return test data
|
||||
with patch.object(crawler, 'crawl_comments') as mock_comments:
|
||||
mock_comments.return_value = CommentsResult(
|
||||
content_type="answers",
|
||||
@@ -167,6 +159,20 @@ class TestCommentCrawler:
|
||||
total_count=1
|
||||
)
|
||||
|
||||
# This test verifies the integration point exists
|
||||
# The actual implementation will call crawl_comments when include_comments=True
|
||||
pass
|
||||
result = crawler.crawl_answer(
|
||||
"https://www.zhihu.com/question/123/answer/456",
|
||||
include_comments=True
|
||||
)
|
||||
|
||||
# Verify crawl_comments was called with correct params
|
||||
mock_comments.assert_called_once_with(
|
||||
content_type="answers",
|
||||
content_id=456,
|
||||
include_comments=True
|
||||
)
|
||||
|
||||
# Verify result includes comments
|
||||
assert result.success
|
||||
assert result.comments is not None
|
||||
assert len(result.comments) == 1
|
||||
assert result.comments[0].content == "Test comment"
|
||||
|
||||
Reference in New Issue
Block a user