90 lines
2.8 KiB
Python
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]
|