test: cover remaining cloud fallback safeguards
This commit is contained in:
@@ -14,6 +14,7 @@ from javis.providers.base import (
|
||||
InvalidProviderResponseError,
|
||||
MissingApiKeyError,
|
||||
ProviderRateLimitError,
|
||||
ProviderTimeoutError,
|
||||
)
|
||||
from javis.providers.gemini import GeminiProvider
|
||||
|
||||
@@ -140,6 +141,13 @@ class GeminiProviderTests(unittest.TestCase):
|
||||
with self.assertRaises(CloudNetworkError):
|
||||
provider.chat([ChatMessage("user", "Was ist Python?")])
|
||||
|
||||
def test_timeout_is_a_distinct_fallback_signal(self) -> None:
|
||||
request = httpx.Request("POST", "https://example.invalid")
|
||||
provider, _ = self._provider(httpx.ReadTimeout("timeout", request=request))
|
||||
|
||||
with self.assertRaises(ProviderTimeoutError):
|
||||
provider.chat([ChatMessage("user", "Was ist Python?")])
|
||||
|
||||
def test_empty_response_is_rejected(self) -> None:
|
||||
provider, _ = self._provider(_response(" "))
|
||||
|
||||
|
||||
@@ -8,11 +8,13 @@ from javis.core.provider_router import HybridProvider
|
||||
from javis.memory.usage_store import ProviderEvent, SQLiteUsageStore
|
||||
from javis.providers.base import (
|
||||
ChatMessage,
|
||||
CloudModelUnavailableError,
|
||||
CloudNetworkError,
|
||||
InvalidApiKeyError,
|
||||
LocalModelProvider,
|
||||
MissingApiKeyError,
|
||||
ProviderRateLimitError,
|
||||
ProviderTimeoutError,
|
||||
ProviderUsage,
|
||||
)
|
||||
from javis.security.privacy import CloudPolicy, PrivacyRouter
|
||||
@@ -167,6 +169,20 @@ class HybridProviderTests(unittest.TestCase):
|
||||
self.assertEqual(answer, "Lokal")
|
||||
self.assertTrue(router.last_route.fallback)
|
||||
|
||||
def test_timeout_and_missing_model_fall_back(self) -> None:
|
||||
for error in (
|
||||
ProviderTimeoutError("timeout"),
|
||||
CloudModelUnavailableError("missing model"),
|
||||
):
|
||||
with self.subTest(error=type(error).__name__):
|
||||
self.cloud.error = error
|
||||
router = self._router()
|
||||
|
||||
answer = router.chat([ChatMessage("user", "Wie funktioniert Python?")])
|
||||
|
||||
self.assertEqual(answer, "Lokal")
|
||||
self.assertTrue(router.last_route.fallback)
|
||||
|
||||
def test_missing_key_falls_back(self) -> None:
|
||||
def missing_key() -> _RecordingProvider:
|
||||
raise MissingApiKeyError("missing")
|
||||
|
||||
Reference in New Issue
Block a user