From 9c988310b6eaa0bb084557f81e19b5168879a174 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 9 Sep 2019 08:29:36 +1000 Subject: [PATCH] Add tests for MPTT models --- InvenTree/InvenTree/models.py | 26 ------------------ InvenTree/InvenTree/tests.py | 52 +++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 26 deletions(-) diff --git a/InvenTree/InvenTree/models.py b/InvenTree/InvenTree/models.py index 38539d0118..3b0560030b 100644 --- a/InvenTree/InvenTree/models.py +++ b/InvenTree/InvenTree/models.py @@ -134,32 +134,6 @@ class InvenTreeTree(MPTTModel): """ return '/'.join([item.name for item in self.path]) - def clean(self): - """ Custom cleaning - - Parent: - Setting the parent of an item to its own child results in an infinite loop. - The parent of an item cannot be set to: - a) Its own ID - b) The ID of any child items that exist underneath it - - Name: - Tree node names are limited to a reduced character set - """ - - super().clean() - - # Parent cannot be set to same ID (this would cause looping) - try: - if self.parent.id == self.id: - raise ValidationError("Category cannot set itself as parent") - except: - pass - - # Ensure that the new parent is not already a child - if self.pk is not None and self.id in self.getUniqueChildren(include_self=False): - raise ValidationError("Category cannot set a child as parent") - def __str__(self): """ String representation of a category is the full path to that category """ diff --git a/InvenTree/InvenTree/tests.py b/InvenTree/InvenTree/tests.py index 4e238a6c80..2511cf4318 100644 --- a/InvenTree/InvenTree/tests.py +++ b/InvenTree/InvenTree/tests.py @@ -5,6 +5,10 @@ from django.core.exceptions import ValidationError from .validators import validate_overage, validate_part_name from . import helpers +from mptt.exceptions import InvalidMove + +from stock.models import StockLocation + class ValidatorTest(TestCase): @@ -103,6 +107,54 @@ class TestDownloadFile(TestCase): helpers.DownloadFile(bytes("hello world".encode("utf8")), "out.bin") +class TestMPTT(TestCase): + """ Tests for the MPTT tree models """ + + fixtures = [ + 'location', + ] + + def setUp(self): + super().setUp() + + StockLocation.objects.rebuild() + + def test_self_as_parent(self): + """ Test that we cannot set self as parent """ + + loc = StockLocation.objects.get(pk=4) + loc.parent = loc + + with self.assertRaises(InvalidMove): + loc.save() + + def test_child_as_parent(self): + """ Test that we cannot set a child as parent """ + + parent = StockLocation.objects.get(pk=4) + child = StockLocation.objects.get(pk=5) + + parent.parent = child + + with self.assertRaises(InvalidMove): + parent.save() + + def test_move(self): + """ Move an item to a different tree """ + + drawer = StockLocation.objects.get(name='Drawer_1') + + # Record the tree ID + tree = drawer.tree_id + + home = StockLocation.objects.get(name='Home') + + drawer.parent = home + drawer.save() + + self.assertNotEqual(tree, drawer.tree_id) + + class TestSerialNumberExtraction(TestCase): """ Tests for serial number extraction code """