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