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}