Skip to content

Commit 6ec7bee

Browse files
rvirani1claude
andcommitted
fix: slim CI tests skip Workspace imports when PIL is missing
The test-slim CI job fails because test_vision_events.py imports Workspace which pulls in PIL via its import chain. Fix by catching ImportError in _make_workspace() and skipping, plus adding adapter-level tests that work without Workspace for slim coverage. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 41e47a5 commit 6ec7bee

1 file changed

Lines changed: 62 additions & 1 deletion

File tree

tests/test_vision_events.py

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ class TestVisionEvents(unittest.TestCase):
1818
WORKSPACE = "test-ws"
1919

2020
def _make_workspace(self):
21-
from roboflow.core.workspace import Workspace
21+
try:
22+
from roboflow.core.workspace import Workspace
23+
except ImportError:
24+
self.skipTest("Workspace requires PIL (not available in slim install)")
2225

2326
info = {
2427
"workspace": {
@@ -434,5 +437,63 @@ def test_upload_image_error(self):
434437
os.unlink(tmp_path)
435438

436439

440+
class TestVisionEventsAdapter(unittest.TestCase):
441+
"""Tests that call the adapter directly (no Workspace). Work in slim installs."""
442+
443+
API_KEY = "test_key"
444+
445+
@responses.activate
446+
def test_adapter_write_event(self):
447+
from roboflow.adapters import vision_events_api
448+
449+
responses.add(responses.POST, _BASE, json={"eventId": "e1", "created": True}, status=201)
450+
result = vision_events_api.write_event(self.API_KEY, {"eventId": "e1", "eventType": "custom", "useCaseId": "uc"})
451+
self.assertEqual(result["eventId"], "e1")
452+
self.assertEqual(responses.calls[0].request.headers["Authorization"], f"Bearer {self.API_KEY}")
453+
454+
@responses.activate
455+
def test_adapter_write_batch(self):
456+
from roboflow.adapters import vision_events_api
457+
458+
responses.add(responses.POST, f"{_BASE}/batch", json={"created": 1, "eventIds": ["e1"]}, status=201)
459+
result = vision_events_api.write_batch(self.API_KEY, [{"eventId": "e1"}])
460+
self.assertEqual(result["created"], 1)
461+
462+
@responses.activate
463+
def test_adapter_query(self):
464+
from roboflow.adapters import vision_events_api
465+
466+
body = {"events": [{"eventId": "e1"}], "nextCursor": None, "hasMore": False, "lookbackDays": 14}
467+
responses.add(responses.POST, f"{_BASE}/query", json=body, status=200)
468+
result = vision_events_api.query(self.API_KEY, {"useCaseId": "uc"})
469+
self.assertEqual(len(result["events"]), 1)
470+
471+
@responses.activate
472+
def test_adapter_list_use_cases(self):
473+
from roboflow.adapters import vision_events_api
474+
475+
body = {"useCases": [{"id": "uc-1", "name": "QA"}], "lookbackDays": 14}
476+
responses.add(responses.GET, f"{_BASE}/use-cases", json=body, status=200)
477+
result = vision_events_api.list_use_cases(self.API_KEY)
478+
self.assertEqual(len(result["useCases"]), 1)
479+
480+
@responses.activate
481+
def test_adapter_get_metadata_schema(self):
482+
from roboflow.adapters import vision_events_api
483+
484+
body = {"useCaseId": "uc-1", "fields": {"temp": {"types": ["number"]}}}
485+
responses.add(responses.GET, f"{_BASE}/custom-metadata-schema/uc-1", json=body, status=200)
486+
result = vision_events_api.get_custom_metadata_schema(self.API_KEY, "uc-1")
487+
self.assertEqual(result["fields"]["temp"]["types"], ["number"])
488+
489+
@responses.activate
490+
def test_adapter_error_raises_roboflow_error(self):
491+
from roboflow.adapters import vision_events_api
492+
493+
responses.add(responses.POST, _BASE, json={"error": "forbidden"}, status=403)
494+
with self.assertRaises(RoboflowError):
495+
vision_events_api.write_event(self.API_KEY, {"eventId": "x"})
496+
497+
437498
if __name__ == "__main__":
438499
unittest.main()

0 commit comments

Comments
 (0)