File size: 1,823 Bytes
afd56bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import os
import sys

# Musimy dodać ścieżkę do sys.path przed importami
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../backend")))

import pytest
import asyncio
from dotenv import load_dotenv


# Wczytujemy zmienne
load_dotenv("../backend/.env")


@pytest.mark.asyncio
async def test_llm_fallback_resilience():
    """
    Test weryfikujący poprawność działania llm_router i circuit breakera.
    Wymusza błędy kluczy API, aby sprawdzić czy system bez przerw przełącza się na fallback.
    """

    # Krok 0: Mock autoryzacji (lub użycie realnego tokenu jeśli to możliwe)
    # W testach E2E z appką w pamięci można zmockować `verify_token`.
    # Dla uproszczenia ustawiamy klucz na zepsuty.

    original_grok_key = os.environ.get("GROK_API_KEY")
    os.environ["GROK_API_KEY"] = "INVALID_KEY_FOR_TESTING_FALLBACK"

    try:
        from core.llm_router import get_llm
        from langchain_core.messages import SystemMessage, HumanMessage

        # Wymuszamy model Grok
        llm = get_llm(task_type="default")

        # Zapytanie powinno zawieść na Grok i pójść do Gemini
        res = llm.invoke(
            [
                SystemMessage(content="Jesteś pomocnym asystentem."),
                HumanMessage(content="Odpowiedz słowem 'ZROZUMIANO'"),
            ]
        )

        assert res.content, "Odpowiedź jest pusta, fallback nie zadziałał!"
        print(f"Fallback SUCCESS: Otrzymano odpowiedź: {res.content}")

    except Exception as e:
        pytest.fail(f"Fallback fail! Złapano wyjątek: {e}")

    finally:
        if original_grok_key:
            os.environ["GROK_API_KEY"] = original_grok_key
        else:
            del os.environ["GROK_API_KEY"]


if __name__ == "__main__":
    asyncio.run(test_llm_fallback_resilience())