161 lines
5.8 KiB
Python
161 lines
5.8 KiB
Python
# test_parser.py
|
||
"""
|
||
Тестирование функциональности парсера
|
||
"""
|
||
|
||
import unittest
|
||
import tempfile
|
||
import os
|
||
import json
|
||
from pathlib import Path
|
||
import sys
|
||
|
||
# Добавляем путь к модулям
|
||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||
|
||
from config import Config
|
||
from modules.storage import StorageManager
|
||
from modules.translator import TranslationService
|
||
from modules.feed_generator import FeedGenerator
|
||
|
||
|
||
class TestConfig(unittest.TestCase):
|
||
"""Тестирование конфигурации"""
|
||
|
||
def setUp(self):
|
||
self.temp_dir = tempfile.mkdtemp()
|
||
self.config_path = os.path.join(self.temp_dir, 'test_config.yaml')
|
||
|
||
def test_config_creation(self):
|
||
"""Тест создания конфигурации"""
|
||
config = Config(self.config_path)
|
||
|
||
# Проверяем, что файл создался
|
||
self.assertTrue(os.path.exists(self.config_path))
|
||
|
||
# Проверяем базовые настройки
|
||
self.assertIsNotNone(config.get('database.type'))
|
||
self.assertIsNotNone(config.get('parsing.user_agent'))
|
||
|
||
def test_config_get_set(self):
|
||
"""Тест получения и установки значений"""
|
||
config = Config(self.config_path)
|
||
|
||
# Установка значения
|
||
config.set('test.value', 'test_data')
|
||
self.assertEqual(config.get('test.value'), 'test_data')
|
||
|
||
# Получение несуществующего значения
|
||
self.assertIsNone(config.get('nonexistent.key'))
|
||
self.assertEqual(config.get('nonexistent.key', 'default'), 'default')
|
||
|
||
|
||
class TestStorage(unittest.TestCase):
|
||
"""Тестирование хранилища"""
|
||
|
||
def setUp(self):
|
||
self.temp_dir = tempfile.mkdtemp()
|
||
self.config = Config()
|
||
self.config.config['database']['sqlite_path'] = os.path.join(self.temp_dir, 'test.db')
|
||
self.storage = StorageManager(self.config)
|
||
|
||
def test_product_operations(self):
|
||
"""Тест операций с товарами"""
|
||
# Тестовый товар
|
||
product = {
|
||
'id': 'test_123',
|
||
'url': 'https://test.com/product/123',
|
||
'title': 'Test Product',
|
||
'price': 99.99,
|
||
'availability': 'в наличии',
|
||
'description': 'Test description',
|
||
'category': 'Test Category',
|
||
'images': ['https://test.com/img1.jpg'],
|
||
'content_hash': 'test_hash'
|
||
}
|
||
|
||
# Сохранение товара
|
||
self.storage.save_product(product)
|
||
|
||
# Получение товара
|
||
saved_product = self.storage.get_product_by_url(product['url'])
|
||
self.assertIsNotNone(saved_product)
|
||
self.assertEqual(saved_product['title'], product['title'])
|
||
self.assertEqual(saved_product['price'], product['price'])
|
||
|
||
def test_category_operations(self):
|
||
"""Тест операций с категориями"""
|
||
# Добавление категории
|
||
self.storage.add_category('Test Category', 'https://test.com/category')
|
||
|
||
# Получение активных категорий
|
||
categories = self.storage.get_active_categories()
|
||
self.assertEqual(len(categories), 1)
|
||
self.assertEqual(categories[0]['name'], 'Test Category')
|
||
|
||
def test_translation_cache(self):
|
||
"""Тест кеша переводов"""
|
||
original = "Test text"
|
||
translated = "Тестовый текст"
|
||
|
||
# Сохранение в кеш
|
||
self.storage.save_translation_to_cache(original, translated)
|
||
|
||
# Получение из кеша
|
||
cached = self.storage.get_translation_from_cache(original)
|
||
self.assertEqual(cached, translated)
|
||
|
||
# Несуществующий перевод
|
||
not_found = self.storage.get_translation_from_cache("Not found")
|
||
self.assertIsNone(not_found)
|
||
|
||
|
||
class TestFeedGenerator(unittest.TestCase):
|
||
"""Тестирование генератора фида"""
|
||
|
||
def setUp(self):
|
||
self.temp_dir = tempfile.mkdtemp()
|
||
self.config = Config()
|
||
self.config.config['database']['sqlite_path'] = os.path.join(self.temp_dir, 'test.db')
|
||
self.config.config['feed']['output_path'] = os.path.join(self.temp_dir, 'test_feed.yml')
|
||
|
||
self.storage = StorageManager(self.config)
|
||
self.feed_generator = FeedGenerator(self.config, self.storage)
|
||
|
||
# Добавляем тестовый товар
|
||
product = {
|
||
'external_id': 'test_123',
|
||
'url': 'https://test.com/product/123',
|
||
'title': 'Test Product',
|
||
'title_ua': 'Тестовий товар',
|
||
'price': 100.0,
|
||
'availability': 'в наличии',
|
||
'description': 'Test description',
|
||
'description_ua': 'Тестовий опис',
|
||
'category': 'Test Category',
|
||
'brand': 'Test Brand',
|
||
'images': ['https://test.com/img1.jpg'],
|
||
'local_images': ['images/test_123/img1.jpg'],
|
||
'is_translated': True,
|
||
'is_active': True
|
||
}
|
||
|
||
self.storage.save_product(product)
|
||
|
||
def test_feed_generation(self):
|
||
"""Тест генерации фида"""
|
||
self.feed_generator.generate_yml_feed()
|
||
|
||
# Проверяем, что файл создался
|
||
feed_path = self.config.get('feed.output_path')
|
||
self.assertTrue(os.path.exists(feed_path))
|
||
|
||
# Проверяем содержимое
|
||
with open(feed_path, 'r', encoding='utf-8') as f:
|
||
content = f.read()
|
||
|
||
self.assertIn('yml_catalog', content)
|
||
self.assertIn('shop', content)
|
||
self.assertIn('offers', content)
|
||
self.assertIn('Тестовий товар', content)
|