""" Тестирование загрузки файлов с сохранением в локальный storage """ import pytest import sys from pathlib import Path # Добавляем путь к проекту project_root = Path(__file__).parent.parent sys.path.insert(0, str(project_root / "python_parser")) from core.services import ReportService, PARSERS from core.models import UploadRequest from adapters.local_storage import LocalStorageAdapter from adapters.parsers import SvodkaPMParser, SvodkaCAParser, MonitoringFuelParser # Регистрируем парсеры PARSERS.update({ 'svodka_pm': SvodkaPMParser, 'svodka_ca': SvodkaCAParser, 'monitoring_fuel': MonitoringFuelParser, }) class TestUploadWithLocalStorage: """Тестирование загрузки файлов с локальным storage""" @pytest.fixture(autouse=True) def setup_storage(self, clean_storage): """Настройка локального storage для каждого теста""" self.storage = clean_storage self.report_service = ReportService(self.storage) def test_upload_svodka_ca_to_local_storage(self, upload_file): """Тест загрузки svodka_ca.xlsx в локальный storage""" file_path = upload_file("svodka_ca.xlsx") # Читаем файл и создаем UploadRequest with open(file_path, 'rb') as f: file_content = f.read() request = UploadRequest( report_type='svodka_ca', file_name=file_path.name, file_content=file_content, parse_params={} ) # Загружаем файл через ReportService result = self.report_service.upload_report(request) assert result.success is True, f"Загрузка не удалась: {result.message}" # Проверяем, что данные сохранились в локальном storage objects = self.storage.list_objects() assert len(objects) > 0, "Данные не сохранились в storage" # Проверяем метаданные for obj_id in objects: metadata = self.storage.get_object_metadata(obj_id) assert metadata is not None, f"Метаданные для {obj_id} не найдены" assert "shape" in metadata, f"Отсутствует shape в метаданных {obj_id}" assert "columns" in metadata, f"Отсутствуют columns в метаданных {obj_id}" print(f"✅ svodka_ca.xlsx загружен в локальный storage: {len(objects)} объектов") print(f" Объекты: {objects}") def test_upload_pm_plan_to_local_storage(self, upload_file): """Тест загрузки pm_plan.zip в локальный storage""" file_path = upload_file("pm_plan.zip") # Читаем файл и создаем UploadRequest with open(file_path, 'rb') as f: file_content = f.read() request = UploadRequest( report_type='svodka_pm', file_name=file_path.name, file_content=file_content, parse_params={} ) # Загружаем архив через ReportService result = self.report_service.upload_report(request) assert result.success is True, f"Загрузка не удалась: {result.message}" # Проверяем, что данные сохранились в локальном storage objects = self.storage.list_objects() assert len(objects) > 0, "Данные не сохранились в storage" # Проверяем метаданные for obj_id in objects: metadata = self.storage.get_object_metadata(obj_id) assert metadata is not None, f"Метаданные для {obj_id} не найдены" assert "shape" in metadata, f"Отсутствует shape в метаданных {obj_id}" assert "columns" in metadata, f"Отсутствуют columns в метаданных {obj_id}" print(f"✅ pm_plan.zip загружен в локальный storage: {len(objects)} объектов") print(f" Объекты: {objects}") def test_upload_monitoring_to_local_storage(self, upload_file): """Тест загрузки monitoring.zip в локальный storage""" file_path = upload_file("monitoring.zip") # Читаем файл и создаем UploadRequest with open(file_path, 'rb') as f: file_content = f.read() request = UploadRequest( report_type='monitoring_fuel', file_name=file_path.name, file_content=file_content, parse_params={} ) # Загружаем архив через ReportService result = self.report_service.upload_report(request) assert result.success is True, f"Загрузка не удалась: {result.message}" # Проверяем, что данные сохранились в локальном storage objects = self.storage.list_objects() assert len(objects) > 0, "Данные не сохранились в storage" # Проверяем метаданные for obj_id in objects: metadata = self.storage.get_object_metadata(obj_id) assert metadata is not None, f"Метаданные для {obj_id} не найдены" assert "shape" in metadata, f"Отсутствует shape в метаданных {obj_id}" assert "columns" in metadata, f"Отсутствуют columns в метаданных {obj_id}" print(f"✅ monitoring.zip загружен в локальный storage: {len(objects)} объектов") print(f" Объекты: {objects}") def test_upload_all_files_sequence(self, upload_file): """Тест последовательной загрузки всех файлов""" # Загружаем все файлы по очереди files_to_upload = [ ("svodka_ca.xlsx", "svodka_ca", "file"), ("pm_plan.zip", "svodka_pm", "zip"), ("monitoring.zip", "monitoring_fuel", "zip") ] total_objects = 0 for filename, report_type, upload_type in files_to_upload: file_path = upload_file(filename) # Читаем файл и создаем UploadRequest with open(file_path, 'rb') as f: file_content = f.read() request = UploadRequest( report_type=report_type, file_name=file_path.name, file_content=file_content, parse_params={} ) result = self.report_service.upload_report(request) assert result.success is True, f"Загрузка {filename} не удалась: {result.message}" # Подсчитываем объекты objects = self.storage.list_objects() current_count = len(objects) print(f"✅ {filename} загружен: {current_count - total_objects} новых объектов") total_objects = current_count # Проверяем итоговое количество объектов final_objects = self.storage.list_objects() assert len(final_objects) > 0, "Ни один файл не был загружен" print(f"✅ Все файлы загружены. Итого объектов в storage: {len(final_objects)}") print(f" Все объекты: {final_objects}") # Выводим детальную информацию о каждом объекте for obj_id in final_objects: metadata = self.storage.get_object_metadata(obj_id) if metadata: print(f" 📊 {obj_id}: {metadata['shape']} колонки: {metadata['columns'][:5]}...")