"""Verify behavior of _instance_to_dict when instance is None.
Conclusion: `if instance else {}` is NECESSARY.
- Without it: None.model_dump() raises AttributeError.
- Call site refresh_instances receives list[Instance] from HTTP; malformed JSON could yield [inst, None].
- get_available_instances uses dict.values() which never yields None, but guard is defensive.
"""
import pytest
from motor.common.resources.instance import Instance
from motor.coordinator.scheduler.runtime.scheduler_client import _instance_to_dict
from motor.coordinator.scheduler.runtime.scheduler_server import _instance_to_dict as _instance_to_dict_server
def test_instance_model_dump_with_none_raises():
"""Without guard: None.model_dump() raises AttributeError."""
instance = None
with pytest.raises(AttributeError, match="'NoneType' object has no attribute 'model_dump'"):
instance.model_dump(mode="json")
def test_instance_to_dict_with_guard_returns_empty():
"""With guard: if instance else {} returns {} for None."""
instance = None
result = instance.model_dump(mode="json") if instance else {}
assert result == {}
def test_instance_to_dict_func_handles_none():
"""_instance_to_dict(None) returns {} (guard is necessary)."""
assert _instance_to_dict(None) == {}
assert _instance_to_dict_server(None) == {}
def test_instance_to_dict_func_with_valid_instance():
"""_instance_to_dict(Instance) returns dict."""
instance = Instance(
job_name="test-job",
model_name="test-model",
id=1,
role="prefill",
)
result = _instance_to_dict(instance)
assert isinstance(result, dict)
assert result["id"] == 1
assert result["role"] == "prefill"
def test_list_comprehension_with_none_without_guard_would_fail():
"""Simulate refresh_instances: list with None would crash without guard."""
instances = [
Instance(job_name="a", model_name="m", id=1, role="prefill"),
None,
Instance(job_name="b", model_name="m", id=2, role="decode"),
]
result = [_instance_to_dict(inst) for inst in instances]
assert len(result) == 3
assert result[0]["id"] == 1
assert result[1] == {}
assert result[2]["id"] == 2