test: cover remaining cloud fallback safeguards

This commit is contained in:
2026-07-30 18:11:27 +02:00
parent 141ff2e013
commit a0af15a037
5 changed files with 39 additions and 9 deletions
+8
View File
@@ -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(" "))
+16
View File
@@ -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")