63 lines
2.4 KiB
Python
63 lines
2.4 KiB
Python
import unittest
|
|
|
|
import requests
|
|
|
|
from app.services.sync_error_display import (
|
|
friendly_sync_transport_message,
|
|
is_server_connection_error_message,
|
|
is_transient_sync_transport_error,
|
|
sync_error_text_for_display,
|
|
)
|
|
|
|
|
|
class SyncErrorDisplayTests(unittest.TestCase):
|
|
def test_hides_typical_requests_connection_errors(self) -> None:
|
|
samples = [
|
|
"HTTPConnectionPool(host='10.0.0.1', port=5000): Max retries exceeded with url: /api/sync/ping",
|
|
"HTTPSConnectionPool(host='x', port=443): Failed to establish a new connection: [Errno 111] Connection refused",
|
|
"NewConnectionError: connection refused",
|
|
"ConnectTimeoutError",
|
|
"getaddrinfo failed for host",
|
|
]
|
|
for s in samples:
|
|
with self.subTest(msg=s):
|
|
self.assertTrue(is_server_connection_error_message(s), s)
|
|
self.assertIsNone(sync_error_text_for_display(s))
|
|
|
|
def test_shows_logic_and_data_errors(self) -> None:
|
|
samples = [
|
|
"duplicate key value violates unique constraint",
|
|
"ValueError: invalid payload",
|
|
"IntegrityError: NOT NULL constraint failed",
|
|
"conflict on recipe version",
|
|
]
|
|
for s in samples:
|
|
with self.subTest(msg=s):
|
|
self.assertFalse(is_server_connection_error_message(s), s)
|
|
self.assertEqual(sync_error_text_for_display(s), s)
|
|
|
|
def test_empty_none(self) -> None:
|
|
self.assertFalse(is_server_connection_error_message(None))
|
|
self.assertFalse(is_server_connection_error_message(""))
|
|
self.assertIsNone(sync_error_text_for_display(None))
|
|
self.assertIsNone(sync_error_text_for_display(" "))
|
|
|
|
def test_friendly_dns_message(self) -> None:
|
|
exc = requests.ConnectionError(
|
|
"HTTPConnectionPool(host='a1.local', port=80): Failed to resolve 'a1.local'"
|
|
)
|
|
self.assertTrue(is_transient_sync_transport_error(exc))
|
|
msg = friendly_sync_transport_message(exc, server_url="http://a1.local/")
|
|
self.assertIn("a1.local", msg)
|
|
self.assertIn("mDNS", msg)
|
|
|
|
def test_friendly_refused_message(self) -> None:
|
|
exc = requests.ConnectionError("Connection refused")
|
|
msg = friendly_sync_transport_message(exc, server_url="http://192.168.1.10:80/")
|
|
self.assertIn("192.168.1.10", msg)
|
|
self.assertIn("отказ", msg.lower())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|