fix: honor tenant validation during plugin imports
This commit is contained in:
+1
-1
@@ -6,7 +6,7 @@ from django.conf import settings
|
||||
if not settings.configured:
|
||||
settings.configure(
|
||||
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
|
||||
INSTALLED_APPS=["django.contrib.contenttypes"],
|
||||
INSTALLED_APPS=["django.contrib.contenttypes", "netbox_export"],
|
||||
SECRET_KEY="tests",
|
||||
)
|
||||
|
||||
|
||||
@@ -36,6 +36,17 @@ class GraphDetail(models.Model):
|
||||
app_label = "graph_tests"
|
||||
|
||||
|
||||
class PrivateGraphModel(models.Model):
|
||||
_netbox_private = True
|
||||
|
||||
class Meta:
|
||||
app_label = "graph_tests"
|
||||
|
||||
|
||||
def test_private_plugin_models_are_not_exportable():
|
||||
assert graph_module.is_exportable_model(PrivateGraphModel) is False
|
||||
|
||||
|
||||
def test_batched_graph_collects_members_and_dependencies(monkeypatch):
|
||||
graph_models = (GraphParent, GraphReference, GraphChild, GraphDetail)
|
||||
with connection.schema_editor() as schema_editor:
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
from django.db import models
|
||||
|
||||
from netbox_export.services.importer import _field_kwargs
|
||||
from netbox_export.services.references import ReferenceResolver
|
||||
|
||||
|
||||
class Tenant(models.Model):
|
||||
class Meta:
|
||||
app_label = "tenancy"
|
||||
|
||||
|
||||
class TenantManagedObject(models.Model):
|
||||
tenant = models.ForeignKey(Tenant, on_delete=models.PROTECT, null=True)
|
||||
|
||||
class Meta:
|
||||
app_label = "compat_tests"
|
||||
|
||||
|
||||
def tenant_record():
|
||||
return {
|
||||
"fields": {},
|
||||
"relations": {"tenant": {"ref": "tenancy.tenant:23"}},
|
||||
}
|
||||
|
||||
|
||||
def test_unresolved_tenant_blocks_initial_save_when_netbox_utilities_requires_it():
|
||||
resolver = ReferenceResolver({}, [], lambda label: None)
|
||||
|
||||
kwargs, unresolved, unresolved_values, missing_required = _field_kwargs(
|
||||
TenantManagedObject,
|
||||
tenant_record(),
|
||||
resolver,
|
||||
tenant_required=True,
|
||||
)
|
||||
|
||||
assert kwargs is None
|
||||
assert unresolved == []
|
||||
assert unresolved_values == []
|
||||
assert missing_required == []
|
||||
|
||||
|
||||
def test_unresolved_optional_tenant_remains_deferred_without_requirement():
|
||||
resolver = ReferenceResolver({}, [], lambda label: None)
|
||||
|
||||
kwargs, unresolved, unresolved_values, missing_required = _field_kwargs(
|
||||
TenantManagedObject,
|
||||
tenant_record(),
|
||||
resolver,
|
||||
tenant_required=False,
|
||||
)
|
||||
|
||||
assert kwargs == {}
|
||||
assert unresolved == [("tenant", {"ref": "tenancy.tenant:23"})]
|
||||
assert unresolved_values == []
|
||||
assert missing_required == []
|
||||
@@ -0,0 +1,26 @@
|
||||
from types import SimpleNamespace
|
||||
|
||||
from netbox_export.services.plugin_compat import relation_required_before_save
|
||||
|
||||
|
||||
def relation_field(name, related_label):
|
||||
related_model = SimpleNamespace(_meta=SimpleNamespace(label_lower=related_label))
|
||||
return SimpleNamespace(name=name, remote_field=SimpleNamespace(model=related_model))
|
||||
|
||||
|
||||
def test_tenant_relation_is_resolved_before_initial_save_when_required():
|
||||
field = relation_field("tenant", "tenancy.tenant")
|
||||
|
||||
assert relation_required_before_save(field, tenant_required=True) is True
|
||||
|
||||
|
||||
def test_tenant_relation_can_still_be_deferred_when_policy_is_disabled():
|
||||
field = relation_field("tenant", "tenancy.tenant")
|
||||
|
||||
assert relation_required_before_save(field, tenant_required=False) is False
|
||||
|
||||
|
||||
def test_unrelated_relation_is_not_affected_by_tenant_policy():
|
||||
field = relation_field("site", "dcim.site")
|
||||
|
||||
assert relation_required_before_save(field, tenant_required=True) is False
|
||||
Reference in New Issue
Block a user