- application/repositories/model_repository.py: ModelRepository Protocol with load(path) and save(model, path) - infrastructure/repositories/json_file_repository.py: JsonFileRepository (вынесен из FinancialModel.save/load) - infrastructure/repositories/excel_repository.py: ExcelRepository (бывший ExcelSync, переименован) - FinancialModel.save/load удалены — теперь только данные - infrastructure/sync/ удалён (ExcelSync перенесён в repositories/) - infrastructure/cli/main.py и config.py используют JsonFileRepository + ExcelRepository через локальные singletons - test_excel_sync.py переименован в test для ExcelRepository - Новый test_repositories.py: 5 тестов для JsonFileRepository + протокол - test_model.py: использован JsonFileRepository Tests: 68/68 pass (было 63 + 5 новых).
50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
from pathlib import Path
|
|
|
|
from domain import FinancialModel
|
|
from infrastructure.repositories import ExcelRepository, ExcelRepositoryError
|
|
|
|
|
|
class TestExcelRepository:
|
|
def test_export_creates_file(self, sample_model, tmp_path: Path):
|
|
repo = ExcelRepository()
|
|
p = tmp_path / "test.xlsx"
|
|
repo.save(sample_model, p)
|
|
assert p.exists()
|
|
|
|
def test_export_import_roundtrip(self, sample_model, tmp_path: Path):
|
|
repo = ExcelRepository()
|
|
p = tmp_path / "roundtrip.xlsx"
|
|
repo.save(sample_model, p)
|
|
|
|
loaded = repo.load(p)
|
|
assert len(loaded.accounts) == len(sample_model.accounts)
|
|
assert len(loaded.transactions) == len(sample_model.transactions)
|
|
assert len(loaded.recurring) == len(sample_model.recurring)
|
|
assert len(loaded.assets) == len(sample_model.assets)
|
|
assert len(loaded.liabilities) == len(sample_model.liabilities)
|
|
assert len(loaded.exchange_rates) == len(sample_model.exchange_rates)
|
|
|
|
def test_roundtrip_preserves_base_currency(self, tmp_path: Path):
|
|
repo = ExcelRepository()
|
|
model = FinancialModel(base_currency="EUR")
|
|
p = tmp_path / "eur_model.xlsx"
|
|
repo.save(model, p)
|
|
|
|
loaded = repo.load(p)
|
|
assert loaded.base_currency == "EUR"
|
|
|
|
def test_import_missing_file(self):
|
|
repo = ExcelRepository()
|
|
try:
|
|
repo.load("nonexistent.xlsx")
|
|
assert False, "Expected ExcelRepositoryError"
|
|
except ExcelRepositoryError:
|
|
pass
|
|
|
|
def test_export_empty_model(self, tmp_path: Path):
|
|
repo = ExcelRepository()
|
|
model = FinancialModel()
|
|
p = tmp_path / "empty.xlsx"
|
|
repo.save(model, p)
|
|
assert p.exists()
|