from __future__ import annotations from datetime import date from decimal import Decimal from mousehold_api import models from mousehold_api.routers.observations import ( get_import_run_detail, update_observation, ) from mousehold_api.schemas import ( ManualObservationCreate, ObservationUpdateRequest, ) from mousehold_api.services.ingestion import create_observation_with_candidate from mousehold_domain import SourceType from sqlalchemy.orm import Session def test_observation_update_syncs_linked_event( session: Session, household_setup: dict[str, str], ) -> None: payload = ManualObservationCreate( household_id=household_setup["household_id"], owner_user_id=household_setup["user_a_id"], source_account_id=household_setup["account_a_id"], amount=Decimal("42.50"), currency="EUR", event_date=date(2026, 1, 2), merchant="Old merchant", description="Old description", ) observation, event = create_observation_with_candidate(session, payload) session.commit() item = update_observation( observation.id, ObservationUpdateRequest( amount=Decimal("43.25"), event_date=date(2026, 1, 3), merchant="Updated merchant", description="Updated description", ), session, None, ) assert item.observation.parsed_json["amount"] == "43.25" assert item.events[0].merchant == "Updated merchant" assert item.events[0].description == "Updated description" assert item.events[0].amount == Decimal("43.25") assert item.events[0].event_date == date(2026, 1, 3) assert event.id == item.events[0].id def test_import_run_detail_returns_observations_and_events( session: Session, household_setup: dict[str, str], ) -> None: payload = ManualObservationCreate( household_id=household_setup["household_id"], owner_user_id=household_setup["user_a_id"], source_account_id=household_setup["account_a_id"], source_type=SourceType.BANK_CSV, amount=Decimal("20.00"), currency="EUR", event_date=date(2026, 1, 5), merchant="CSV merchant", ) observation, event = create_observation_with_candidate(session, payload) run = models.ImportRun( household_id=household_setup["household_id"], imported_count=1, created_event_count=1, summary_json={ "imported_observation_ids": [observation.id], "created_event_ids": [event.id], "duplicate_observation_ids": [], }, ) session.add(run) session.commit() detail = get_import_run_detail(run.id, session, None) assert detail.run.id == run.id assert [item.id for item in detail.observations] == [observation.id] assert [item.id for item in detail.events] == [event.id]