import pytest from netbox_services.engine.context import Context from netbox_services.engine.selectors import NetBoxFilterSelector, ReferenceSelector @pytest.mark.django_db class TestContext: def test_resolve_service(self, service): ctx = Context(service=service) assert ctx.resolve_path("service") is service def test_resolve_parent_none(self, service): ctx = Context(service=service) assert ctx.resolve_path("parent") is None def test_resolve_dotted_path(self, service, service_template): ctx = Context(service=service) assert ctx.resolve_path("service.service_template") is service_template def test_resolve_deep_path(self, service, service_template): ctx = Context(service=service) assert ctx.resolve_path("service.service_template.name") == service_template.name def test_resolve_missing_attr(self, service): ctx = Context(service=service) assert ctx.resolve_path("service.nonexistent") is None def test_child_context(self, service): ctx = Context(service=service) parent_obj = object() child = ctx.child(parent_obj) assert child.service is service assert child.parent_object is parent_obj @pytest.mark.django_db class TestNetBoxFilterSelector: def test_filter_devices(self, db): from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site site = Site.objects.create(name="sel-site", slug="sel-site") mfr = Manufacturer.objects.create(name="sel-mfr", slug="sel-mfr") dt = DeviceType.objects.create(manufacturer=mfr, model="sel-model", slug="sel-model") role = DeviceRole.objects.create(name="sel-router", slug="sel-router") Device.objects.create(name="r1", site=site, device_type=dt, role=role) Device.objects.create(name="r2", site=site, device_type=dt, role=role) sel = NetBoxFilterSelector({"type": "netbox_filter", "filters": {"role": ["sel-router"]}}) qs = sel.resolve(Context(service=None), Device) assert qs.count() == 2 @pytest.mark.django_db class TestReferenceSelector: def test_resolve_reference(self, db): from dcim.models import Site site = Site.objects.create(name="ref-site", slug="ref-site") ctx = Context(service=None, parent_object=site) sel = ReferenceSelector({"type": "reference", "path": "parent"}) qs = sel.resolve(ctx, Site) assert qs.first() == site @pytest.mark.django_db class TestPrefixSelector: def test_prefix_by_filter(self, db): from ipam.models import Prefix from netbox_services.engine.selectors import PrefixSelector Prefix.objects.create(prefix="10.0.0.0/24") Prefix.objects.create(prefix="10.1.0.0/24") sel = PrefixSelector({"type": "prefix", "filters": {}}) qs = sel.resolve(Context(service=None), Prefix) assert qs.count() == 2