91 lines
3.2 KiB
Python
91 lines
3.2 KiB
Python
# tests/test_csv_processor.py
|
|
import pytest
|
|
from unittest.mock import Mock, patch, AsyncMock
|
|
from io import StringIO
|
|
import pandas as pd
|
|
from utils.csv_processor import CSVProcessor
|
|
|
|
|
|
class TestCSVProcessor:
|
|
def setup_method(self):
|
|
self.processor = CSVProcessor()
|
|
|
|
@patch('requests.get')
|
|
def test_download_csv_success(self, mock_get):
|
|
"""Test successful CSV download"""
|
|
# Mock successful HTTP response
|
|
mock_response = Mock()
|
|
mock_response.status_code = 200
|
|
mock_response.text = "product_id,title,price\nTEST001,Test Product,10.99"
|
|
mock_get.return_value = mock_response
|
|
|
|
csv_content = self.processor._download_csv("http://example.com/test.csv")
|
|
|
|
assert "product_id,title,price" in csv_content
|
|
assert "TEST001,Test Product,10.99" in csv_content
|
|
|
|
@patch('requests.get')
|
|
def test_download_csv_failure(self, mock_get):
|
|
"""Test CSV download failure"""
|
|
# Mock failed HTTP response
|
|
mock_response = Mock()
|
|
mock_response.status_code = 404
|
|
mock_get.return_value = mock_response
|
|
|
|
with pytest.raises(Exception):
|
|
self.processor._download_csv("http://example.com/nonexistent.csv")
|
|
|
|
def test_parse_csv_content(self):
|
|
"""Test CSV content parsing"""
|
|
csv_content = """product_id,title,price,marketplace
|
|
TEST001,Test Product 1,10.99,TestMarket
|
|
TEST002,Test Product 2,15.99,TestMarket"""
|
|
|
|
df = self.processor._parse_csv_content(csv_content)
|
|
|
|
assert len(df) == 2
|
|
assert "product_id" in df.columns
|
|
assert df.iloc[0]["product_id"] == "TEST001"
|
|
assert df.iloc[1]["price"] == "15.99"
|
|
|
|
def test_validate_csv_headers(self):
|
|
"""Test CSV header validation"""
|
|
# Valid headers
|
|
valid_df = pd.DataFrame({
|
|
"product_id": ["TEST001"],
|
|
"title": ["Test"],
|
|
"price": ["10.99"]
|
|
})
|
|
|
|
assert self.processor._validate_csv_headers(invalid_df) == False
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_process_marketplace_csv_from_url(self, db):
|
|
"""Test complete marketplace CSV processing"""
|
|
with patch.object(self.processor, '_download_csv') as mock_download, \
|
|
patch.object(self.processor, '_parse_csv_content') as mock_parse, \
|
|
patch.object(self.processor, '_validate_csv_headers') as mock_validate:
|
|
# Mock successful download and parsing
|
|
mock_download.return_value = "csv_content"
|
|
mock_df = pd.DataFrame({
|
|
"product_id": ["TEST001", "TEST002"],
|
|
"title": ["Product 1", "Product 2"],
|
|
"price": ["10.99", "15.99"],
|
|
"marketplace": ["TestMarket", "TestMarket"],
|
|
"shop_name": ["TestShop", "TestShop"]
|
|
})
|
|
mock_parse.return_value = mock_df
|
|
mock_validate.return_value = True
|
|
|
|
result = await self.processor.process_marketplace_csv_from_url(
|
|
"http://example.com/test.csv",
|
|
"TestMarket",
|
|
"TestShop",
|
|
1000,
|
|
db
|
|
)
|
|
|
|
assert "imported" in result
|
|
assert "updated" in result
|
|
assert "total_processed" in result
|