test_finance_service_defaults.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. """Unit tests for finance defaults applied during user creation/update."""
  2. import pytest
  3. from sqlalchemy import select
  4. from backend.app.models.finance import CostCenter, CostCenterMember, UserWallet
  5. from backend.app.models.settings import Settings
  6. from backend.app.models.user import User
  7. from backend.app.services.finance_defaults import ensure_user_finance_defaults
  8. class TestFinanceDefaults:
  9. @pytest.mark.asyncio
  10. async def test_creates_wallet_private_center_and_membership(self, db_session):
  11. db_session.add(Settings(key="currency", value="USD"))
  12. user = User(username="alice", role="user", is_active=True)
  13. db_session.add(user)
  14. await db_session.commit()
  15. await db_session.refresh(user)
  16. changed = await ensure_user_finance_defaults(db_session, user)
  17. await db_session.commit()
  18. assert changed is True
  19. wallet = await db_session.scalar(select(UserWallet).where(UserWallet.user_id == user.id))
  20. assert wallet is not None
  21. assert wallet.balance == 0.0
  22. center = await db_session.scalar(
  23. select(CostCenter).where(CostCenter.owner_user_id == user.id, CostCenter.is_private.is_(True))
  24. )
  25. assert center is not None
  26. assert center.name == "alice"
  27. membership = await db_session.scalar(
  28. select(CostCenterMember).where(
  29. CostCenterMember.cost_center_id == center.id,
  30. CostCenterMember.user_id == user.id,
  31. )
  32. )
  33. assert membership is not None
  34. assert membership.can_print is True
  35. @pytest.mark.asyncio
  36. async def test_updates_private_center_name_and_is_idempotent(self, db_session):
  37. user = User(username="bob", role="user", is_active=True)
  38. db_session.add(user)
  39. await db_session.commit()
  40. await db_session.refresh(user)
  41. initial_changed = await ensure_user_finance_defaults(db_session, user)
  42. await db_session.commit()
  43. assert initial_changed is True
  44. user.username = "bobby"
  45. renamed_changed = await ensure_user_finance_defaults(db_session, user)
  46. await db_session.commit()
  47. assert renamed_changed is True
  48. center = await db_session.scalar(
  49. select(CostCenter).where(CostCenter.owner_user_id == user.id, CostCenter.is_private.is_(True))
  50. )
  51. assert center is not None
  52. assert center.name == "bobby"
  53. idempotent_changed = await ensure_user_finance_defaults(db_session, user)
  54. assert idempotent_changed is False
  55. @pytest.mark.asyncio
  56. async def test_reactivates_existing_private_center(self, db_session):
  57. user = User(username="carol", role="user", is_active=True)
  58. db_session.add(user)
  59. await db_session.flush()
  60. center = CostCenter(
  61. name=user.username,
  62. is_active=False,
  63. is_private=True,
  64. owner_user_id=user.id,
  65. )
  66. db_session.add(center)
  67. await db_session.commit()
  68. changed = await ensure_user_finance_defaults(db_session, user)
  69. await db_session.commit()
  70. assert changed is True
  71. assert center.is_active is True