From aa699f6675f89c6d5c79f08fefed984830b76e1e Mon Sep 17 00:00:00 2001 From: 491034170 <142008960+491034170@users.noreply.github.com> Date: Wed, 10 Jun 2026 12:27:09 +0800 Subject: [PATCH] Stabilize phone call router tests --- backend/tests/unit/test_phone_calls.py | 44 ++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/backend/tests/unit/test_phone_calls.py b/backend/tests/unit/test_phone_calls.py index 9afdc7577df..3393463321f 100644 --- a/backend/tests/unit/test_phone_calls.py +++ b/backend/tests/unit/test_phone_calls.py @@ -3,6 +3,11 @@ from unittest.mock import MagicMock, patch os.environ.setdefault("ENCRYPTION_SECRET", "omi_ZwB2ZNqB2HHpMK6wStk7sTpavJiPTFg7gXUHnc4tFABPU6pZ2c2DKgehtfgi4RZv") +os.environ.setdefault('TWILIO_ACCOUNT_SID', 'ACtest123') +os.environ.setdefault('TWILIO_AUTH_TOKEN', 'test_auth_token') +os.environ.setdefault('TWILIO_API_KEY_SID', 'SKtest123') +os.environ.setdefault('TWILIO_API_KEY_SECRET', 'test_api_secret') +os.environ.setdefault('TWILIO_TWIML_APP_SID', 'APtest123') # Mock modules that initialize GCP/Firebase clients at import time _mock_firebase = MagicMock() @@ -14,6 +19,11 @@ from fastapi import FastAPI from fastapi.testclient import TestClient +from tests.unit.twilio_stub import install_twilio_stub + +install_twilio_stub() + +import routers.phone_calls as phone_calls_router from routers.phone_calls import router, _redact_phone, E164_PATTERN # --------------------------------------------------------------------------- @@ -24,6 +34,26 @@ TEST_UID_OTHER = 'test-uid-other' +def _make_quota_snapshot(): + snapshot = MagicMock() + snapshot.has_access = True + snapshot.is_paid = True + snapshot.max_duration_seconds = None + snapshot.allowed_countries = [] + return snapshot + + +@pytest.fixture(autouse=True) +def isolate_phone_call_quota(monkeypatch): + snapshot = _make_quota_snapshot() + usage_db = MagicMock() + monkeypatch.setattr(phone_calls_router, 'check_call_access', MagicMock(return_value=snapshot)) + monkeypatch.setattr(phone_calls_router, 'get_quota_snapshot', MagicMock(return_value=snapshot)) + monkeypatch.setattr(phone_calls_router, 'check_destination_allowed', MagicMock(return_value=None)) + monkeypatch.setattr(phone_calls_router, 'phone_call_usage_db', usage_db) + return snapshot, usage_db + + def _make_app(): app = FastAPI() app.include_router(router) @@ -260,3 +290,17 @@ def test_twiml_success(mock_db, mock_check, mock_sig, client): body = resp.text assert '' in body assert '+15559876543' in body + + +@patch('routers.phone_calls.validate_twilio_signature', return_value=True) +@patch('routers.phone_calls.check_caller_id_verified', return_value=True) +@patch('routers.phone_calls.phone_calls_db') +def test_twiml_free_tier_counts_usage(mock_db, mock_check, mock_sig, client, isolate_phone_call_quota): + snapshot, usage_db = isolate_phone_call_quota + snapshot.is_paid = False + mock_db.get_primary_phone_number.return_value = {'phone_number': '+15551234567'} + + resp = client.post('/v1/phone/twiml', data={'To': '+15559876543', 'From': f'client:{TEST_UID}', 'CallId': 'C1'}) + + assert resp.status_code == 200 + usage_db.increment_current_month.assert_called_once_with(TEST_UID)