bmc_hub/tests/test_internal_messages.py

69 lines
3.4 KiB
Python
Raw Permalink Normal View History

"""Internal message tests use a fake database; no messages are delivered."""
import asyncio
import pytest
from fastapi import HTTPException
from pydantic import ValidationError
from app.modules.bottom_bar.backend import router as messages
@pytest.mark.parametrize('contact_id', [None, 4])
def test_phone_message_stores_optional_contact(monkeypatch, contact_id):
calls = []
monkeypatch.setattr(messages, 'ensure_bottom_bar_messages_schema', lambda: None)
monkeypatch.setattr(messages, '_ensure_user_exists', lambda uid: None)
def query(sql, args):
calls.append((sql, args))
if 'SELECT id FROM contacts' in sql:
return {'id': 4}
return {'id': 8}
monkeypatch.setattr(messages, 'execute_query_single', query)
payload = messages.BottomBarMessageCreatePayload(message=' Ring tilbage ', recipient_user_id=2, contact_id=contact_id, message_kind='phone', caller_name='Navn', callback_phone='12345678')
result = asyncio.run(messages.send_bottom_bar_message(payload, {'id': 1, 'full_name': 'Test'}))
args = next(args for sql, args in calls if 'INSERT' in sql)
assert args == (1, 2, 'Ring tilbage', False, 'phone', contact_id, 'Navn', '12345678')
assert result['item']['message_kind'] == 'phone'
def test_invalid_contact_does_not_send(monkeypatch):
monkeypatch.setattr(messages, 'ensure_bottom_bar_messages_schema', lambda: None)
monkeypatch.setattr(messages, '_ensure_user_exists', lambda uid: None)
def query(sql, args):
assert 'INSERT' not in sql
return None
monkeypatch.setattr(messages, 'execute_query_single', query)
payload = messages.BottomBarMessageCreatePayload(message='Test', recipient_user_id=2, contact_id=999)
with pytest.raises(HTTPException) as error:
asyncio.run(messages.send_bottom_bar_message(payload, {'id': 1}))
assert error.value.status_code == 400
def test_legacy_message_defaults_are_preserved():
payload = messages.BottomBarMessageCreatePayload(message='Almindelig besked')
assert payload.message_kind == 'message'
assert payload.contact_id is None
assert payload.recipient_user_id is None
with pytest.raises(ValidationError):
messages.BottomBarMessageCreatePayload(message='Test', message_kind='unknown')
def test_self_message_is_rejected(monkeypatch):
monkeypatch.setattr(messages, 'ensure_bottom_bar_messages_schema', lambda: None)
monkeypatch.setattr(messages, '_ensure_user_exists', lambda uid: None)
payload = messages.BottomBarMessageCreatePayload(message='Test', recipient_user_id=1)
with pytest.raises(HTTPException):
asyncio.run(messages.send_bottom_bar_message(payload, {'id': 1}))
def test_outgoing_status_uses_recipient_receipt(monkeypatch):
from datetime import datetime
from app.modules.bottom_bar.backend import service
monkeypatch.setattr(service, 'ensure_bottom_bar_messages_schema', lambda: None)
def query(sql, args):
assert 'THEN m.recipient_user_id ELSE %s END' in sql
assert len(args) == 6
return [{'id': 8, 'sender_user_id': 1, 'recipient_user_id': 2, 'message_text': 'Hej', 'created_at': datetime(2026,9,8), 'read_at': datetime(2026,9,8), 'acknowledged_at': None}]
monkeypatch.setattr(service, 'execute_query', query)
monkeypatch.setattr(service, 'execute_query_single', lambda *a: {'count': 0})
item = service.get_user_messages_summary(1)['list'][0]
assert item['is_own'] and item['is_read'] and not item['is_unread']