"""Tests for PersonalDataService — the settings-update path, in particular `min_vacation_days_per_year` (Task 1, PLANNING_ENGINE_SPEC §9.2). """ from datetime import datetime from uuid import uuid4 import pytest from app.entities.personal_data import PersonalData from app.entities.workspace import Workspace from app.repositories_impl.sqlite.personal_data_repository import SQLitePersonalDataRepository from app.repositories_impl.sqlite.workspace_repository import SQLiteWorkspaceRepository from app.services.personal_data_service import PersonalDataService from app.utils.errors import NotFoundError, ValidationError class TestPersonalDataService: async def test_update_min_vacation_days_per_year( self, personal_data_repo: SQLitePersonalDataRepository, workspace_repo: SQLiteWorkspaceRepository, ) -> None: ws = await workspace_repo.create( Workspace(id=uuid4(), name="WS", created_at=datetime.now()) ) pd = await personal_data_repo.create( PersonalData(uuid=uuid4(), workspace_id=ws.id, name="Parent", created_at=datetime.now()) ) service = PersonalDataService(personal_data_repo) updated = await service.update(pd.uuid, min_vacation_days_per_year=25) assert updated.min_vacation_days_per_year == 25 async def test_update_partial_leaves_other_fields_untouched( self, personal_data_repo: SQLitePersonalDataRepository, workspace_repo: SQLiteWorkspaceRepository, ) -> None: ws = await workspace_repo.create( Workspace(id=uuid4(), name="WS", created_at=datetime.now()) ) pd = await personal_data_repo.create( PersonalData( uuid=uuid4(), workspace_id=ws.id, name="Parent", salary_type="hourly", min_vacation_days_per_year=22, created_at=datetime.now(), ) ) service = PersonalDataService(personal_data_repo) updated = await service.update(pd.uuid, employment_status="jobseeking") assert updated.salary_type == "hourly" assert updated.min_vacation_days_per_year == 22 assert updated.employment_status == "jobseeking" async def test_update_rejects_out_of_range_minimum( self, personal_data_repo: SQLitePersonalDataRepository, workspace_repo: SQLiteWorkspaceRepository, ) -> None: ws = await workspace_repo.create( Workspace(id=uuid4(), name="WS", created_at=datetime.now()) ) pd = await personal_data_repo.create( PersonalData(uuid=uuid4(), workspace_id=ws.id, name="Parent", created_at=datetime.now()) ) service = PersonalDataService(personal_data_repo) with pytest.raises(ValidationError, match="min_vacation_days_per_year"): await service.update(pd.uuid, min_vacation_days_per_year=-1) with pytest.raises(ValidationError, match="min_vacation_days_per_year"): await service.update(pd.uuid, min_vacation_days_per_year=61) async def test_update_unknown_parent_raises_not_found( self, personal_data_repo: SQLitePersonalDataRepository, ) -> None: service = PersonalDataService(personal_data_repo) with pytest.raises(NotFoundError): await service.update(uuid4(), min_vacation_days_per_year=25)