38 lines
2.2 KiB
Python
38 lines
2.2 KiB
Python
|
|
"""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()
|