first ruggedy draft

This commit is contained in:
2026-06-28 13:48:15 +02:00
parent c916f64fcb
commit 1053f6a2a3
78 changed files with 20905 additions and 2 deletions

View File

@@ -0,0 +1,107 @@
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}