183 lines
8.2 KiB
Python
183 lines
8.2 KiB
Python
"""
|
||
Тестирование загрузки файлов с сохранением в локальный 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]}...") |