import unittest
from unittest.mock import MagicMock, patch
from artemis.clients.accessibility_client import AccessibilityClient, DEFAULT_PORT
class TestAccessibilityClient(unittest.TestCase):
def setUp(self):
self.client = AccessibilityClient(device_id="dummy_device", local_port=DEFAULT_PORT)
@patch("artemis.clients.accessibility_client.urllib.request.urlopen")
def test_ping_success(self, mock_urlopen):
mock_resp = MagicMock()
mock_resp.read.return_value = b'{"success": true, "service": "ArtemisAccessibilityService"}'
mock_resp.__enter__.return_value = mock_resp
mock_urlopen.return_value = mock_resp
self.assertTrue(self.client.ping())
@patch("artemis.clients.accessibility_client.urllib.request.urlopen")
def test_get_hierarchy(self, mock_urlopen):
mock_resp = MagicMock()
mock_resp.read.return_value = b'{"success": true, "elements": [{"text": "OK"}]}'
mock_resp.__enter__.return_value = mock_resp
mock_urlopen.return_value = mock_resp
data = self.client.get_hierarchy()
self.assertTrue(data["success"])
self.assertEqual(data["elements"][0]["text"], "OK")
@patch("artemis.clients.accessibility_client.urllib.request.urlopen")
def test_tap_action(self, mock_urlopen):
mock_resp = MagicMock()
mock_resp.read.return_value = b'{"success": true}'
mock_resp.__enter__.return_value = mock_resp
mock_urlopen.return_value = mock_resp
@patch("artemis.clients.accessibility_client.urllib.request.urlopen")
def test_get_hierarchy_xml(self, mock_urlopen):
mock_resp = MagicMock()
mock_resp.read.return_value = b""
mock_resp.__enter__.return_value = mock_resp
mock_urlopen.return_value = mock_resp
xml = self.client.get_hierarchy_xml()
self.assertIn("",
"elements": [{"text": "OK"}],
"width": 1080,
"height": 2400,
}
screen_data = self.client.get_screen_data()
self.assertEqual(screen_data.width, 1080)
self.assertEqual(screen_data.height, 2400)
self.assertEqual(screen_data.base64, "dummy_b64")
self.assertIn("rotation=\"0\"", screen_data.hierarchy_xml)
self.assertEqual(len(screen_data.elements), 1)
@patch.object(AccessibilityClient, "get_atomic_snapshot", return_value=None)
@patch.object(AccessibilityClient, "get_screenshot")
@patch.object(AccessibilityClient, "get_hierarchy")
def test_get_screen_data_fallback(self, mock_get_hierarchy, mock_get_screenshot, _mock_atomic):
from PIL import Image
mock_get_screenshot.return_value = Image.new("RGB", (1080, 2400))
mock_get_hierarchy.return_value = {
"success": True,
"xml": "",
"elements": [{"text": "Fallback"}],
}
screen_data = self.client.get_screen_data()
self.assertEqual(screen_data.width, 1080)
self.assertEqual(screen_data.height, 2400)
self.assertIn("Fallback", screen_data.hierarchy_xml)
self.assertEqual(len(screen_data.elements), 1)
if __name__ == "__main__":
unittest.main()