"""Change-package creation uses dictionary rows throughout its transaction.""" import asyncio from unittest.mock import MagicMock, patch import pytest from fastapi import HTTPException from app.subscriptions.backend import router def test_change_package_creates_case_relation_and_commits(): cursor=MagicMock() cursor.__enter__.return_value=cursor cursor.fetchone.side_effect=[None,{'id':80},{'id':5,'change_sag_id':80},{'id':12,'sag_id':79,'version':1},{'id':6}] conn=MagicMock() conn.cursor.return_value=cursor payload={'main_sag_id':79,'reason':'Ny pris','effective_date':'2026-11-01','proposals':[{'subscription_id':12,'changes':{'price':1200}}]} with patch.object(router,'execute_query_single',return_value={'id':79,'titel':'Udlejning','customer_id':2}), patch.object(router,'get_db_connection',return_value=conn), patch.object(router,'release_db_connection') as release, patch.object(router,'_subscription_snapshot',return_value={'id':12}), patch.object(router,'_normalize_change_proposal',return_value={'price':1200}): result=asyncio.run(router.save_subscription_change_request(payload,{'id':4})) assert result['change_sag_id']==80 and result['status']=='draft' relation=[call for call in cursor.execute.call_args_list if 'INSERT INTO sag_relationer' in call.args[0]] assert relation[0].args[1]==(79,80) conn.commit.assert_called_once() conn.rollback.assert_not_called() release.assert_called_once_with(conn) def test_failed_package_rolls_back_new_case(): cursor=MagicMock() cursor.__enter__.return_value=cursor cursor.fetchone.side_effect=[None,{'id':80},{'id':5,'change_sag_id':80},None] conn=MagicMock() conn.cursor.return_value=cursor with patch.object(router,'execute_query_single',return_value={'id':79,'titel':'Udlejning','customer_id':2}), patch.object(router,'get_db_connection',return_value=conn), patch.object(router,'release_db_connection'): with pytest.raises(HTTPException) as error: asyncio.run(router.save_subscription_change_request({'main_sag_id':79,'proposals':[{'subscription_id':12}]},{'id':4})) assert error.value.status_code==400 conn.rollback.assert_called_once() conn.commit.assert_not_called()