PyInventory/inventory/tests/test_parent_tree_model.py

140 wiersze
5.2 KiB
Python

from bx_django_utils.test_utils.assert_queries import AssertQueries
from django.db.models import QuerySet
from django.test import TestCase
from inventory.admin import ItemModelAdmin, LocationModelAdmin
from inventory.models import ItemModel, LocationModel
from inventory_project.tests.fixtures import get_normal_user
class TreeModelTests(TestCase):
@classmethod
def setUpTestData(cls):
cls.normaluser = get_normal_user()
def test_parent_tree_model(self):
for main_item_no in range(1, 3):
main_item = ItemModel.objects.create(
user=self.normaluser,
name=f'{main_item_no}.',
)
main_item.full_clean()
for sub_item_no in range(1, 3):
sub_item = ItemModel.objects.create(
parent=main_item,
user=self.normaluser,
name=f'{main_item_no}.{sub_item_no}.',
)
sub_item.full_clean()
for sub_sub_item_no in range(1, 3):
sub_sub_item = ItemModel.objects.create(
parent=sub_item,
user=self.normaluser,
name=f'{main_item_no}.{sub_item_no}.{sub_sub_item_no}.',
)
sub_sub_item.full_clean()
data = list(ItemModel.objects.values_list('level', 'path_str', 'name'))
assert data == [
(1, '1', '1.'),
(2, '1 0 11', '1.1.'),
(3, '1 0 11 0 111', '1.1.1.'),
(3, '1 0 11 0 112', '1.1.2.'),
(2, '1 0 12', '1.2.'),
(3, '1 0 12 0 121', '1.2.1.'),
(3, '1 0 12 0 122', '1.2.2.'),
(1, '2', '2.'),
(2, '2 0 21', '2.1.'),
(3, '2 0 21 0 211', '2.1.1.'),
(3, '2 0 21 0 212', '2.1.2.'),
(2, '2 0 22', '2.2.'),
(3, '2 0 22 0 221', '2.2.1.'),
(3, '2 0 22 0 222', '2.2.2.'),
]
item_2_1 = ItemModel.objects.get(name='2.1.')
related_qs = ItemModel.tree_objects.related_objects(instance=item_2_1)
data = list(related_qs.values_list('name', flat=True))
assert data == ['2.', '2.1.', '2.1.1.', '2.1.2.', '2.2.', '2.2.1.', '2.2.2.']
item_2_1.name = 'NEW 2.1. Name'
with AssertQueries() as queries:
item_2_1.save()
data = list(ItemModel.objects.values_list('level', 'path_str', 'name'))
assert data == [
(1, '1', '1.'),
(2, '1 0 11', '1.1.'),
(3, '1 0 11 0 111', '1.1.1.'),
(3, '1 0 11 0 112', '1.1.2.'),
(2, '1 0 12', '1.2.'),
(3, '1 0 12 0 121', '1.2.1.'),
(3, '1 0 12 0 122', '1.2.2.'),
(1, '2', '2.'),
(2, '2 0 22', '2.2.'),
(3, '2 0 22 0 221', '2.2.1.'),
(3, '2 0 22 0 222', '2.2.2.'),
(2, '2 0 new21name', 'NEW 2.1. Name'),
(3, '2 0 new21name 0 211', '2.1.1.'),
(3, '2 0 new21name 0 212', '2.1.2.'),
]
itemmodel_count = 1 # full_clean(): Check if parent exists
itemmodel_count += 1 # VersionProtectBaseModel: Check version
itemmodel_count += 1 # VersionProtectBaseModel: Save new version
itemmodel_count += 1 # Get info for tree update
itemmodel_count += 1 # Fetch the items to update
itemmodel_count += 1 # Bulk update save
queries.assert_queries(
table_counts={
'inventory_itemmodel': itemmodel_count,
'auth_user': 1, # full_clean(): Check if user exists
},
double_tables=False,
duplicated=True,
similar=True,
)
def test_related_objects(self):
item = ItemModel()
qs = ItemModel.tree_objects.related_objects(instance=item)
assert isinstance(qs, QuerySet)
assert qs.query.is_empty() is True
def test_parent_tree_model_ordering(self):
assert LocationModel._meta.ordering == ('path_str',)
assert LocationModelAdmin.ordering == ('path_str',)
assert ItemModel._meta.ordering == ('path_str',)
assert ItemModelAdmin.ordering == ('path_str',)
def create(name, parent=None):
instance = ItemModel.objects.create(user=self.normaluser, name=name, parent=parent)
instance.full_clean()
return instance
# Create a "Special" case for the correct ordering:
# 1. all "PC-1" entries
# 2. all "PC1640" entries
#
# The correct order depends on the seperator, here: " 0 "
pc1 = create(name='PC-1')
pc1640 = create(name='PC1640 SD')
create(name='FZ-502 Rev A 5.25″ Floppy', parent=pc1)
create(name='1,44MB / 3.5" Floppy FD-235HF- 3800-U', parent=pc1)
create(name='PC 1640ECD', parent=pc1640)
data = list(ItemModel.objects.values_list('level', 'path_str', 'name'))
assert data == [
(1, 'pc1', 'PC-1'),
(2, 'pc1 0 144mb35floppyfd235hf3800u', '1,44MB / 3.5" Floppy FD-235HF- 3800-U'),
(2, 'pc1 0 fz502reva525floppy', 'FZ-502 Rev A 5.25″ Floppy'),
(1, 'pc1640sd', 'PC1640 SD'),
(2, 'pc1640sd 0 pc1640ecd', 'PC 1640ECD'),
]