"""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']