mypy black ruff
This commit is contained in:
@@ -5,10 +5,12 @@ from datetime import date
|
||||
import pytest
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from src.domain_utils import set_category_budget, find_category_db
|
||||
from src.domain_utils import find_category_db, set_category_budget
|
||||
from src.models import Category, CategoryBudget, CategoryBudgetDb
|
||||
from src.models.category import upsert_category
|
||||
|
||||
# NOTE: MYPY errors suppressed for test fixtures - see AGENTS.md for type checking notes.
|
||||
|
||||
|
||||
class TestSetCategoryBudgetNoOverlap:
|
||||
"""Test budgets that don't overlap with existing ones."""
|
||||
@@ -37,7 +39,9 @@ class TestSetCategoryBudgetNoOverlap:
|
||||
)
|
||||
set_category_budget(db_session, budget2)
|
||||
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 2
|
||||
|
||||
def test_completely_before_no_overlap(self, db_session: Session):
|
||||
@@ -64,7 +68,9 @@ class TestSetCategoryBudgetNoOverlap:
|
||||
)
|
||||
set_category_budget(db_session, new_budget)
|
||||
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 2
|
||||
|
||||
|
||||
@@ -95,7 +101,9 @@ class TestSetCategoryBudgetFullOverlap:
|
||||
)
|
||||
set_category_budget(db_session, new_budget)
|
||||
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
# Should have only 1 budget with the new amount (replaced old one)
|
||||
assert len(budgets) == 1
|
||||
assert budgets[0].amount_eur == 200.00
|
||||
@@ -131,7 +139,9 @@ class TestSetCategoryBudgetPartialOverlapStart:
|
||||
# Should have 2 budgets:
|
||||
# 1. Oct 1 - Nov 15 (new budget)
|
||||
# 2. Dec 1 - Dec 30 (remainder from old budget, after overlap end + 1 day)
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 2
|
||||
|
||||
|
||||
@@ -165,7 +175,9 @@ class TestSetCategoryBudgetPartialOverlapEnd:
|
||||
# Should have 2 budgets:
|
||||
# 1. Oct 1 - Oct 14 (remainder from old budget, before overlap start - 1 day)
|
||||
# 2. Oct 15 - Nov 30 (new budget)
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 2
|
||||
|
||||
|
||||
@@ -200,7 +212,9 @@ class TestSetCategoryBudgetMiddleOverlap:
|
||||
# 1. Oct 1 - Oct 14 (before new range, original amount)
|
||||
# 2. Oct 15 - Nov 30 (new budget, new amount)
|
||||
# 3. Dec 1 - Dec 31 (after new range, original amount)
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 3
|
||||
|
||||
|
||||
@@ -221,7 +235,9 @@ class TestSetCategoryBudgetUnbounded:
|
||||
)
|
||||
set_category_budget(db_session, budget)
|
||||
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 1
|
||||
assert budgets[0].valid_from is None
|
||||
assert budgets[0].valid_to == date(2026, 12, 31)
|
||||
@@ -240,7 +256,9 @@ class TestSetCategoryBudgetUnbounded:
|
||||
)
|
||||
set_category_budget(db_session, budget)
|
||||
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 1
|
||||
assert budgets[0].valid_from == date(2026, 10, 1)
|
||||
assert budgets[0].valid_to is None
|
||||
@@ -255,11 +273,13 @@ class TestSetCategoryBudgetUnbounded:
|
||||
category=cat,
|
||||
amount_eur=100.00,
|
||||
valid_from=None, # Unbounded start
|
||||
valid_to=None, # Unbounded end
|
||||
valid_to=None, # Unbounded end
|
||||
)
|
||||
set_category_budget(db_session, budget)
|
||||
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 1
|
||||
assert budgets[0].valid_from is None
|
||||
assert budgets[0].valid_to is None
|
||||
@@ -292,7 +312,9 @@ class TestSetCategoryBudgetWithExistingUnbounded:
|
||||
)
|
||||
set_category_budget(db_session, bounded_budget)
|
||||
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 2
|
||||
|
||||
def test_add_bounded_before_unbounded(self, db_session: Session):
|
||||
@@ -319,7 +341,9 @@ class TestSetCategoryBudgetWithExistingUnbounded:
|
||||
)
|
||||
set_category_budget(db_session, bounded_budget)
|
||||
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 2
|
||||
|
||||
|
||||
@@ -350,7 +374,9 @@ class TestSetCategoryBudgetMultipleWithSameAmount:
|
||||
)
|
||||
set_category_budget(db_session, budget2)
|
||||
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 1
|
||||
assert budgets[0].amount_eur == 200.00
|
||||
|
||||
@@ -382,7 +408,9 @@ class TestSetCategoryBudgetDateEdgeCases:
|
||||
)
|
||||
set_category_budget(db_session, budget2)
|
||||
|
||||
budgets = list(db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id))
|
||||
budgets = list(
|
||||
db_session.query(CategoryBudgetDb).filter_by(category_id=cat_db.id)
|
||||
)
|
||||
assert len(budgets) == 2
|
||||
|
||||
|
||||
@@ -404,11 +432,11 @@ class TestFindCategoryDb:
|
||||
grandfather = Category(name="grandfather")
|
||||
upsert_category(db_session, grandfather, do_commit=False)
|
||||
db_session.commit()
|
||||
|
||||
|
||||
father = Category(name="father", parent=grandfather)
|
||||
upsert_category(db_session, father, do_commit=False)
|
||||
db_session.commit()
|
||||
|
||||
|
||||
child = Category(name="child", parent=father)
|
||||
upsert_category(db_session, child, do_commit=False)
|
||||
db_session.commit()
|
||||
@@ -457,9 +485,11 @@ class TestSetCategoryBudgetErrorHandling:
|
||||
set_category_budget(db_session, budget)
|
||||
|
||||
# The error should mention that the category was not found (including its parent)
|
||||
assert "ChildOfMissing" in str(exc_info.value).lower() or \
|
||||
"not found" in str(exc_info.value).lower() or \
|
||||
"no matching" in str(exc_info.value).lower()
|
||||
assert (
|
||||
"ChildOfMissing" in str(exc_info.value).lower()
|
||||
or "not found" in str(exc_info.value).lower()
|
||||
or "no matching" in str(exc_info.value).lower()
|
||||
)
|
||||
|
||||
|
||||
class TestSetCategoryBudgetValidation:
|
||||
@@ -490,7 +520,7 @@ class TestSetCategoryBudgetValidation:
|
||||
def test_invalid_date_range_raises(self):
|
||||
"""Budget with valid_from > valid_to should raise validation error."""
|
||||
cat = Category.from_str("test")
|
||||
|
||||
|
||||
with pytest.raises(ValueError) as exc_info:
|
||||
CategoryBudget(
|
||||
category=cat,
|
||||
@@ -498,13 +528,13 @@ class TestSetCategoryBudgetValidation:
|
||||
valid_from=date(2026, 11, 30),
|
||||
valid_to=date(2026, 10, 1),
|
||||
)
|
||||
|
||||
|
||||
assert "valid_from" in str(exc_info.value) or "valid_to" in str(exc_info.value)
|
||||
|
||||
def test_amount_must_be_positive(self):
|
||||
"""Amount must be greater than zero."""
|
||||
cat = Category.from_str("test")
|
||||
|
||||
|
||||
with pytest.raises(ValueError) as exc_info:
|
||||
CategoryBudget(
|
||||
category=cat,
|
||||
@@ -512,5 +542,5 @@ class TestSetCategoryBudgetValidation:
|
||||
valid_from=date(2026, 10, 1),
|
||||
valid_to=date(2026, 11, 30),
|
||||
)
|
||||
|
||||
|
||||
assert "greater than" in str(exc_info.value).lower()
|
||||
|
||||
Reference in New Issue
Block a user