Files
mousehold/tests/test_observation_review.py
2026-06-28 13:48:15 +02:00

90 lines
2.8 KiB
Python

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]