59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
from types import SimpleNamespace
|
|
|
|
from django import forms
|
|
from django.forms.utils import ErrorDict
|
|
from django.test import SimpleTestCase
|
|
|
|
from netbox_utilities.forms import BulkModuleInstallForm
|
|
|
|
|
|
class AvailableModuleBays(list):
|
|
def count(self):
|
|
return len(self)
|
|
|
|
|
|
class BulkModuleInstallFormTest(SimpleTestCase):
|
|
def _form_for_clean(self, *, module_bays=None, quantity=None, available_bays=None):
|
|
form = BulkModuleInstallForm.__new__(BulkModuleInstallForm)
|
|
forms.Form.__init__(form)
|
|
form._errors = ErrorDict()
|
|
form.cleaned_data = {
|
|
"device": SimpleNamespace(pk=10),
|
|
"module_bays": module_bays or [],
|
|
"quantity": quantity,
|
|
}
|
|
form.available_module_bays = AvailableModuleBays(available_bays or [])
|
|
return form
|
|
|
|
def test_quantity_selects_first_available_bays(self):
|
|
available_bays = [SimpleNamespace(pk=1), SimpleNamespace(pk=2), SimpleNamespace(pk=3)]
|
|
form = self._form_for_clean(quantity=2, available_bays=available_bays)
|
|
|
|
cleaned_data = form.clean()
|
|
|
|
self.assertEqual(cleaned_data["module_bays"], available_bays[:2])
|
|
self.assertFalse(form.errors)
|
|
|
|
def test_quantity_cannot_exceed_available_bays(self):
|
|
form = self._form_for_clean(quantity=3, available_bays=[SimpleNamespace(pk=1)])
|
|
|
|
form.clean()
|
|
|
|
self.assertIn("quantity", form.errors)
|
|
self.assertIn("nur ein freier Modulschacht", str(form.errors["quantity"]))
|
|
|
|
def test_quantity_and_manual_selection_are_mutually_exclusive(self):
|
|
module_bay = SimpleNamespace(pk=1, name="A1", device_id=10, enabled=True)
|
|
form = self._form_for_clean(module_bays=[module_bay], quantity=1, available_bays=[module_bay])
|
|
|
|
form.clean()
|
|
|
|
self.assertIn("quantity", form.errors)
|
|
|
|
def test_requires_quantity_or_manual_selection(self):
|
|
form = self._form_for_clean()
|
|
|
|
form.clean()
|
|
|
|
self.assertIn("__all__", form.errors)
|