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()