Files
netbox-plugin-services/netbox_services/tests/test_api.py
T
2026-08-16 13:10:26 +02:00

112 lines
4.8 KiB
Python

import pytest
from netbox_services.models import Service, ServiceTemplate
@pytest.mark.django_db
class TestServiceTemplateAPI:
def test_list(self, api_client):
ServiceTemplate.objects.create(name="api-tmpl")
resp = api_client.get("/api/plugins/services/service-templates/")
assert resp.status_code == 200
assert resp.data["count"] >= 1
def test_create_with_tree(self, api_client):
resp = api_client.post("/api/plugins/services/service-templates/", {
"name": "api-created-tmpl",
"status": "draft",
"tree": [{"name": "dev", "object_type": "dcim.device", "quantity": 1, "selector": {"type": "netbox_filter", "filters": {}}, "scope": "service", "children": []}],
}, format="json")
assert resp.status_code == 201
assert resp.data["name"] == "api-created-tmpl"
assert len(resp.data["tree"]) == 1
def test_retrieve(self, api_client):
st = ServiceTemplate.objects.create(name="api-retrieve-tmpl")
resp = api_client.get(f"/api/plugins/services/service-templates/{st.pk}/")
assert resp.status_code == 200
def test_delete(self, api_client):
st = ServiceTemplate.objects.create(name="api-delete-tmpl")
resp = api_client.delete(f"/api/plugins/services/service-templates/{st.pk}/")
assert resp.status_code == 204
@pytest.mark.django_db
class TestServiceAPI:
def test_list(self, api_client, service_template, tenant):
Service.objects.create(name="api-svc", service_template=service_template, tenant=tenant)
resp = api_client.get("/api/plugins/services/services/")
assert resp.status_code == 200
assert resp.data["count"] >= 1
def test_create(self, api_client, service_template, tenant):
resp = api_client.post("/api/plugins/services/services/", {
"name": "api-created-svc",
"service_template": service_template.pk,
"tenant": tenant.pk,
"status": "planned",
}, format="json")
assert resp.status_code == 201
def test_resolve_dry_run(self, api_client, db, tenant):
from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site
site = Site.objects.create(name="api-res-site", slug="api-res-site")
mfr = Manufacturer.objects.create(name="api-res-mfr", slug="api-res-mfr")
dt = DeviceType.objects.create(manufacturer=mfr, model="api-model", slug="api-model")
role = DeviceRole.objects.create(name="api-role", slug="api-role")
Device.objects.create(name="api-dev", site=site, device_type=dt, role=role)
tmpl = ServiceTemplate.objects.create(
name="api-res-tmpl",
status="active",
tree=[{
"name": "device",
"object_type": "dcim.device",
"quantity": 1,
"selector": {"type": "netbox_filter", "filters": {"role": ["api-role"]}},
"scope": "service",
"children": [],
}],
)
svc = Service.objects.create(name="api-res-svc", service_template=tmpl, tenant=tenant)
resp = api_client.post(f"/api/plugins/services/services/{svc.pk}/resolve/", {
"mode": "dry_run",
}, format="json")
assert resp.status_code == 200
assert resp.data["mode"] == "dry_run"
assert resp.data["total_planned"] == 1
def test_resolve_commit(self, api_client, db, tenant):
from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site
from netbox_services.models import ServiceResourceBinding
site = Site.objects.create(name="api-commit-site", slug="api-commit-site")
mfr = Manufacturer.objects.create(name="api-commit-mfr", slug="api-commit-mfr")
dt = DeviceType.objects.create(manufacturer=mfr, model="api-commit-model", slug="api-commit-model")
role = DeviceRole.objects.create(name="api-commit-role", slug="api-commit-role")
Device.objects.create(name="api-commit-dev", site=site, device_type=dt, role=role)
tmpl = ServiceTemplate.objects.create(
name="api-commit-tmpl",
status="active",
tree=[{
"name": "device",
"object_type": "dcim.device",
"quantity": 1,
"selector": {"type": "netbox_filter", "filters": {"role": ["api-commit-role"]}},
"scope": "service",
"children": [],
}],
)
svc = Service.objects.create(name="api-commit-svc", service_template=tmpl, tenant=tenant)
resp = api_client.post(f"/api/plugins/services/services/{svc.pk}/resolve/", {
"mode": "commit",
}, format="json")
assert resp.status_code == 200
assert resp.data["mode"] == "commit"
assert ServiceResourceBinding.objects.filter(service=svc).count() == 1