bmc_hub/tests/test_workflow_resources.py
Christian 85e019783b Add comprehensive test coverage for case creation, assignment, and remote recovery
- Introduced tests for case creation commands, ensuring proper handling of UUIDs and payloads.
- Added tests for v5 assignment functionality, validating employee identification and group assignment.
- Implemented tests for remote recovery scenarios, including handling network failures and response validation.
- Created tests for hardware label generation and validation, ensuring proper URL formatting and QR code generation.
- Developed extensive tests for remote control functionality, covering connection isolation, command execution, and user permissions.
- Added tests for workflow timer registration, ensuring correct handling of timer states and ownership validation.
2026-10-15 12:17:09 +02:00

68 lines
3.5 KiB
Python

from contextlib import contextmanager
from unittest.mock import MagicMock
from decimal import Decimal
import pytest
from fastapi import HTTPException
from app.workflows import resources
def test_card_rejects_monthly_price_before_any_write():
payload=resources.ResourceUpdate(workflow_coverage={},monthly_price=Decimal('10'))
with pytest.raises(HTTPException) as error: resources.update_resource('card',1,payload,{'id':4})
assert error.value.status_code==422
def test_inactive_tag_rejected_without_mutating_resource(monkeypatch):
cursor=MagicMock()
cursor.fetchone.return_value={'id':1,'customer_id':24}
cursor.fetchall.return_value=[]
@contextmanager
def transaction(): yield cursor
monkeypatch.setattr(resources,'transaction',transaction)
payload=resources.ResourceUpdate(workflow_coverage={'tag_ids':[7]})
with pytest.raises(HTTPException) as error: resources.update_resource('agreement',1,payload,{'id':4})
assert error.value.status_code==422
assert all(not call.args[0].startswith(('INSERT','UPDATE','DELETE')) for call in cursor.execute.call_args_list)
def test_resource_audit_and_explicit_null_monthly_price(monkeypatch):
cursor=MagicMock()
original={'id':1,'customer_id':24,'workflow_coverage':{},'monthly_price':Decimal('99')}
updated=dict(original,monthly_price=None,workflow_coverage={'tag_ids':[],'excluded_tag_ids':[],'include_descendants':False})
cursor.fetchone.side_effect=[original,original,updated]
cursor.fetchall.return_value=[]
@contextmanager
def transaction(): yield cursor
monkeypatch.setattr(resources,'transaction',transaction)
result=resources.update_resource('agreement',1,resources.ResourceUpdate(workflow_coverage={},monthly_price=None),{'id':4})
assert result['monthly_price'] is None
update=next(call for call in cursor.execute.call_args_list if call.args[0].startswith('UPDATE customer_fixed'))
assert 'monthly_price=%s' in update.args[0]
assert update.args[1][1] is None
assert update.args[1][0].adapted['auto_billing'] is True
assert any('INSERT INTO bmc_workflow_resource_history' in call.args[0] for call in cursor.execute.call_args_list)
def test_customer_card_coverage_saves_profile_and_audit(monkeypatch):
cursor=MagicMock()
cursor.fetchone.side_effect=[{'id':24}, None]
cursor.fetchall.return_value=[]
@contextmanager
def transaction(): yield cursor
monkeypatch.setattr(resources,'transaction',transaction)
result=resources.update_customer_card_coverage(24,resources.Coverage(),{'id':4})
assert result['workflow_coverage']['auto_billing'] is True
calls=[c.args for c in cursor.execute.call_args_list]
assert any('INSERT INTO bmc_workflow_customer_card_coverage' in c[0] and c[1][0]==24 for c in calls)
assert any('INSERT INTO bmc_workflow_resource_history' in c[0] and c[1][0]=='customer_card' for c in calls)
assert not any('UPDATE tticket_prepaid_cards' in c[0] for c in calls)
def test_customer_card_coverage_rejects_inactive_tags(monkeypatch):
cursor=MagicMock()
cursor.fetchone.return_value={'id':24}
cursor.fetchall.return_value=[]
@contextmanager
def transaction(): yield cursor
monkeypatch.setattr(resources,'transaction',transaction)
with pytest.raises(HTTPException) as error:
resources.update_customer_card_coverage(24,resources.Coverage(tag_ids=[9]),{'id':4})
assert error.value.status_code==422
assert not any(c.args[0].startswith(('INSERT','UPDATE')) for c in cursor.execute.call_args_list)