# 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