108 lines
3.6 KiB
Python
108 lines
3.6 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import date
|
|
from decimal import Decimal
|
|
|
|
from mousehold_api import models
|
|
from mousehold_api.routers import events as events_router
|
|
from mousehold_api.routers import taxonomy
|
|
from mousehold_api.schemas import (
|
|
CategoryCreate,
|
|
EventTagsUpdate,
|
|
EventUpdate,
|
|
ManualObservationCreate,
|
|
TagCreate,
|
|
)
|
|
from mousehold_api.services.ingestion import create_observation_with_candidate
|
|
from mousehold_domain import FinancialEventStatus, FinancialEventType, RelationType, SourceType
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
|
def test_categories_tags_are_visible_on_event_details(
|
|
session: Session,
|
|
household_setup: dict[str, str],
|
|
) -> None:
|
|
category = taxonomy.create_category(
|
|
CategoryCreate(household_id=household_setup["household_id"], name="Groceries"),
|
|
session=session,
|
|
)
|
|
tag = taxonomy.create_tag(
|
|
TagCreate(household_id=household_setup["household_id"], name="shared"),
|
|
session=session,
|
|
)
|
|
_observation, event = create_observation_with_candidate(
|
|
session,
|
|
ManualObservationCreate(
|
|
household_id=household_setup["household_id"],
|
|
source_type=SourceType.MANUAL,
|
|
owner_user_id=household_setup["user_a_id"],
|
|
amount=Decimal("42.50"),
|
|
currency="EUR",
|
|
event_date=date(2026, 3, 1),
|
|
merchant="REWE",
|
|
description="Weekly groceries",
|
|
status=FinancialEventStatus.CONFIRMED,
|
|
),
|
|
)
|
|
assert event is not None
|
|
session.commit()
|
|
|
|
events_router.update_event(event.id, EventUpdate(category_id=category.id), session=session)
|
|
events_router.update_event_tags(event.id, EventTagsUpdate(tag_ids=[tag.id]), session=session)
|
|
|
|
listed = events_router.list_events(household_setup["household_id"], session=session)
|
|
assert listed[0].category_id == category.id
|
|
assert listed[0].tag_ids == [tag.id]
|
|
|
|
detail = events_router.get_event_details(event.id, session=session)
|
|
assert detail.category is not None
|
|
assert detail.category.id == category.id
|
|
assert [item.id for item in detail.tags] == [tag.id]
|
|
assert len(detail.observations) == 1
|
|
|
|
|
|
def test_event_list_can_hide_linked_confirmation_rows(
|
|
session: Session,
|
|
household_setup: dict[str, str],
|
|
) -> None:
|
|
primary = models.FinancialEvent(
|
|
household_id=household_setup["household_id"],
|
|
event_type=FinancialEventType.EXPENSE,
|
|
status=FinancialEventStatus.CONFIRMED,
|
|
event_date=date(2026, 4, 3),
|
|
amount=Decimal("18.99"),
|
|
currency="EUR",
|
|
merchant="Example Shop",
|
|
)
|
|
confirming = models.FinancialEvent(
|
|
household_id=household_setup["household_id"],
|
|
event_type=FinancialEventType.EXPENSE,
|
|
status=FinancialEventStatus.CONFIRMED,
|
|
event_date=date(2026, 4, 4),
|
|
amount=Decimal("18.99"),
|
|
currency="EUR",
|
|
merchant="PayPal",
|
|
)
|
|
session.add_all([primary, confirming])
|
|
session.flush()
|
|
session.add(
|
|
models.EventRelation(
|
|
from_event_id=primary.id,
|
|
to_event_id=confirming.id,
|
|
relation_type=RelationType.SAME_ECONOMIC_EVENT_AS,
|
|
confidence=Decimal("0.93"),
|
|
created_by="test",
|
|
)
|
|
)
|
|
session.commit()
|
|
|
|
all_events = events_router.list_events(household_setup["household_id"], session=session)
|
|
visible_events = events_router.list_events(
|
|
household_setup["household_id"],
|
|
hide_related_confirmations=True,
|
|
session=session,
|
|
)
|
|
|
|
assert {item.id for item in all_events} == {primary.id, confirming.id}
|
|
assert {item.id for item in visible_events} == {primary.id}
|