import asyncio from datetime import datetime import pytest from fastapi import HTTPException import importlib r = importlib.import_module('app.timetracking.backend.router') from app.core.config import settings from app.workflows import integration, settlement def setup(monkeypatch, **changes): entry = dict(id=7, medarbejder_id=2, status='pending', aktiv_timer=False, slut_tid=datetime.now(), work_type='support') entry.update(changes) monkeypatch.setattr(r, 'execute_query_single', lambda *a: entry) monkeypatch.setattr(r, '_resolve_current_user_id', lambda user: 2) monkeypatch.setattr(r, '_can_view_all_team_timers', lambda user: False) monkeypatch.setattr(settings, 'WORKFLOWS_ENABLED', True) monkeypatch.setattr(settings, 'WORKFLOWS_MODE', 'active') monkeypatch.setattr(integration, 'active_for_customer', lambda customer: True) monkeypatch.setattr(settlement, 'workflow_customer', lambda time_id: 17) return entry def test_register_preserves_pending_and_billing(monkeypatch): entry = setup(monkeypatch) calls = [] monkeypatch.setattr(r, 'execute_query', lambda sql, params: calls.append((sql, params)) or [entry]) result = asyncio.run(r.register_workflow_timer_v1(7, {'work_type':'meeting','fakturerbar_tid_min':30}, {'id':2})) sql, params = calls[0] assert params == ('meeting',30,7) assert 'approved_hours' not in sql and 'billing_method' not in sql assert "status='pending'" in sql and "kilde='workflow_registered'" in sql assert result['status'] == 'pending' @pytest.mark.parametrize('changes', [{'medarbejder_id':3}, {'status':'approved'}, {'aktiv_timer':True}, {'economy_order_draft_id':9}]) def test_register_rejects_other_owner_or_processed_timer(monkeypatch, changes): setup(monkeypatch, **changes) monkeypatch.setattr(r, 'execute_query', lambda *a: pytest.fail('Must not write')) with pytest.raises(HTTPException): asyncio.run(r.register_workflow_timer_v1(7, {'fakturerbar_tid_min':30}, {'id':2}))