bmc_hub/tests/test_case_mail_templates.py
Christian 4871dd2d9e Add comprehensive test coverage for various modules
- Introduced tests for mail templates including ranking, rendering, and attachment handling.
- Added tests for time billing selection and approval processes, ensuring proper validation and state management.
- Implemented tests for case types in JavaScript, focusing on loading and editing functionality.
- Created tests for contact mail AI integration, ensuring proper parsing and error handling.
- Developed tests for dark theme CSS contrast and loading order.
- Added tests for invoice fee service, covering various scenarios including exemptions and invalid inputs.
- Implemented vendor resource tests, ensuring proper file handling and query validation.
2026-10-08 08:58:02 +02:00

59 lines
3.4 KiB
Python

import asyncio
import json
from io import BytesIO
from unittest.mock import MagicMock
import pytest
from fastapi import HTTPException, UploadFile
from app.modules.sag.backend import mail_templates as mail
CASE={'id':186,'titel':'Router','customer_id':8,'customer_name':'Testkunde'}
def test_tag_ranking_and_customer_scope():
rows=[{'name':'Global','customer_id':None,'match_tags':['MOBIL']},{'name':'Kunde','customer_id':8,'match_tags':['mobil','portering']},{'name':'Andet','customer_id':None,'match_tags':[]}]
result=mail.rank_templates(rows,[' mobil ','portering'])
assert [r['name'] for r in result]==['Kunde','Global','Andet']
assert result[0]['recommended'] and not result[-1]['recommended']
assert mail.available(rows[0],CASE)
assert not mail.available({'customer_id':9},CASE)
def test_variables_and_unknown_placeholder():
assert mail.render_text('{sag_id} {{kunde_navn}} {kontakt_navn} {{customer_name}} {andet}',CASE,{'name':'Anne'})=='186 Testkunde Anne Testkunde {andet}'
def connection(monkeypatch,fetches,rows):
conn=MagicMock();cur=conn.cursor.return_value.__enter__.return_value
cur.fetchone.side_effect=fetches;cur.fetchall.return_value=rows
monkeypatch.setattr(mail,'get_db_connection',lambda:conn)
monkeypatch.setattr(mail,'release_db_connection',lambda c:None)
return conn,cur
@pytest.mark.parametrize('rows',[[],[{'customer_id':9}]])
def test_attachment_cannot_escape_customer(monkeypatch,rows):
conn,_=connection(monkeypatch,[CASE],rows)
with pytest.raises(HTTPException):mail.send_attachments(186,[1])
conn.rollback.assert_called();conn.commit.assert_not_called()
def test_attachment_bytes_for_existing_sender(monkeypatch):
connection(monkeypatch,[CASE],[{'customer_id':8,'filename':'ark.pdf','content_type':'application/pdf','content':memoryview(b'PDF'),'size_bytes':3}])
assert mail.send_attachments(186,[1])==[{'filename':'ark.pdf','content_type':'application/pdf','content':b'PDF','size':3}]
@pytest.mark.parametrize('payload',[{},[],{'request_id':'invalid'}, {'request_id':'11111111-1111-1111-1111-111111111111','name':'','subject':'X','body':'X'}])
def test_invalid_input_rejected_before_db(payload):
with pytest.raises(HTTPException):asyncio.run(mail.create_template(186,json.dumps(payload),[]))
def test_create_template_keeps_scope_and_files(monkeypatch):
conn,cur=connection(monkeypatch,[CASE,None,{'id':123}],[])
payload={'request_id':'11111111-1111-1111-1111-111111111111','name':'Mobil','subject':'Portering','body':'Hej','scope':'customer','match_tags':['mobil']}
assert asyncio.run(mail.create_template(186,json.dumps(payload),[UploadFile(filename='../ark.pdf',file=BytesIO(b'PDF'))]))=={'id':123}
inserts=[call.args for call in cur.execute.call_args_list if 'INSERT INTO' in call.args[0]]
assert inserts[0][1][4]==8
assert inserts[1][1]==(123,'ark.pdf','application/octet-stream',b'PDF',3)
conn.commit.assert_called_once()
def test_replay_rejects_changed_files(monkeypatch):
payload={'request_id':'11111111-1111-1111-1111-111111111111','name':'Mobil','subject':'Portering','body':'Hej','scope':'customer','match_tags':[]}
previous=dict(payload,id=123,customer_id=8)
conn,_=connection(monkeypatch,[CASE,previous],[{'filename':'old','content_type':'x','content':b'old','size_bytes':3}])
with pytest.raises(HTTPException) as exc:asyncio.run(mail.create_template(186,json.dumps(payload),[]))
assert exc.value.status_code==409
conn.commit.assert_not_called()