93 lines
2.8 KiB
Python
93 lines
2.8 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
from unittest.mock import AsyncMock, patch
|
|
|
|
import pytest
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_citation_record():
|
|
"""Return a mock citation record."""
|
|
record = AsyncMock()
|
|
record.id = uuid.UUID("32345678-1234-1234-1234-123456789abc")
|
|
record.query_id = uuid.UUID("22345678-1234-1234-1234-123456789abc")
|
|
record.platform = "wenxin"
|
|
record.cited = True
|
|
record.citation_position = 1
|
|
record.citation_text = "Test citation text"
|
|
record.competitor_brands = []
|
|
record.queried_at = datetime.now()
|
|
return record
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_get_citations(
|
|
async_client, override_get_current_user, auth_headers, mock_citation_record
|
|
):
|
|
with patch(
|
|
"app.api.citations.get_citations",
|
|
return_value=([mock_citation_record], 1),
|
|
):
|
|
response = await async_client.get(
|
|
"/api/v1/citations/",
|
|
headers=auth_headers,
|
|
)
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["total"] == 1
|
|
assert len(data["items"]) == 1
|
|
assert data["items"][0]["platform"] == "wenxin"
|
|
assert data["items"][0]["cited"] is True
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_get_citation_stats(
|
|
async_client, override_get_current_user, auth_headers
|
|
):
|
|
stats = {
|
|
"total_queries": 10,
|
|
"total_citations": 7,
|
|
"citation_rate": 0.7,
|
|
"avg_position": 2.5,
|
|
"by_platform": {
|
|
"wenxin": {
|
|
"queries": 5,
|
|
"citations": 4,
|
|
"rate": 0.8,
|
|
"avg_position": 2.0,
|
|
}
|
|
},
|
|
"trend": [{"date": "2024-01-01", "citations": 3}],
|
|
}
|
|
with patch("app.api.citations.get_citation_stats", return_value=stats):
|
|
response = await async_client.get(
|
|
"/api/v1/citations/stats",
|
|
headers=auth_headers,
|
|
)
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["total_queries"] == 10
|
|
assert data["total_citations"] == 7
|
|
assert data["citation_rate"] == 0.7
|
|
assert "wenxin" in data["by_platform"]
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_export_csv(
|
|
async_client, override_get_current_user, auth_headers
|
|
):
|
|
csv_content = "日期,平台,是否引用,引用位置,引用文本,竞争品牌\n2024-01-01,wenxin,是,1,test,\n"
|
|
with patch(
|
|
"app.api.reports.export_citations_csv",
|
|
return_value=csv_content,
|
|
):
|
|
response = await async_client.get(
|
|
"/api/v1/reports/export/csv?query_id=22345678-1234-1234-1234-123456789abc",
|
|
headers=auth_headers,
|
|
)
|
|
assert response.status_code == 200
|
|
assert response.headers["content-type"].startswith("text/csv")
|
|
assert "attachment" in response.headers["content-disposition"]
|
|
body = response.text
|
|
assert "wenxin" in body
|