Files
Netbox-Utilities/netbox_utilities/tests/test_module_installation.py
T

104 lines
3.9 KiB
Python

from types import SimpleNamespace
from unittest.mock import MagicMock, patch
from django.test import SimpleTestCase
from netbox_utilities.module_installation import (
BulkModuleInstallError,
build_module_form_data,
install_modules,
)
class BulkModuleInstallationTest(SimpleTestCase):
def setUp(self):
self.device = SimpleNamespace(pk=10)
self.module_type = SimpleNamespace(pk=20)
self.module_bay = SimpleNamespace(pk=30, device_id=10, enabled=True, name="A1")
def test_builds_core_module_form_data(self):
data = build_module_form_data(
self.device,
self.module_bay,
self.module_type,
"active",
True,
"Patchmodul",
)
self.assertEqual(
data,
{
"device": 10,
"module_bay": 30,
"module_type": 20,
"status": "active",
"replicate_components": True,
"adopt_components": False,
"description": "Patchmodul",
},
)
@patch("netbox_utilities.module_installation.transaction.atomic")
@patch("netbox_utilities.module_installation.ModuleForm")
@patch("netbox_utilities.module_installation.ModuleBay")
def test_installs_module_with_core_form(self, module_bay_model, module_form_class, atomic):
module_bay_model.objects.select_for_update.return_value.filter.return_value = [self.module_bay]
form = module_form_class.return_value
form.is_valid.return_value = True
installed_module = SimpleNamespace(pk=40)
form.save.return_value = installed_module
result = install_modules(
device=self.device,
module_type=self.module_type,
module_bays=[self.module_bay],
status="active",
replicate_components=True,
description="Patchmodul",
)
self.assertEqual(result, [installed_module])
form.save.assert_called_once_with()
atomic.assert_called_once_with()
@patch("netbox_utilities.module_installation.transaction.atomic")
@patch("netbox_utilities.module_installation.ModuleForm")
@patch("netbox_utilities.module_installation.ModuleBay")
def test_reports_bay_and_rolls_back_on_validation_error(self, module_bay_model, module_form_class, _atomic):
module_bay_model.objects.select_for_update.return_value.filter.return_value = [self.module_bay]
form = module_form_class.return_value
form.is_valid.return_value = False
form.errors = {"__all__": ["Eine Komponente existiert bereits."]}
form.fields = {}
with self.assertRaisesMessage(BulkModuleInstallError, 'Fehler bei Modulschacht "A1"'):
install_modules(
device=self.device,
module_type=self.module_type,
module_bays=[self.module_bay],
status="active",
)
form.save.assert_not_called()
@patch("netbox_utilities.module_installation.transaction.atomic")
@patch("netbox_utilities.module_installation.ModuleForm")
@patch("netbox_utilities.module_installation.ModuleBay")
def test_rejects_module_outside_add_permission(self, module_bay_model, module_form_class, _atomic):
module_bay_model.objects.select_for_update.return_value.filter.return_value = [self.module_bay]
form = module_form_class.return_value
form.is_valid.return_value = True
form.save.return_value = SimpleNamespace(pk=40)
permitted_modules = MagicMock()
permitted_modules.filter.return_value.exists.return_value = False
with self.assertRaisesMessage(BulkModuleInstallError, "Keine Berechtigung"):
install_modules(
device=self.device,
module_type=self.module_type,
module_bays=[self.module_bay],
status="active",
permitted_modules=permitted_modules,
)