# SPDX-License-Identifier: GPLv3
# Copyright © 2025 pygaindalf Rui Pinheiro
"""
Unit tests for HierarchicalMixin and related mixins in pygaindalf.
Tests hierarchy and naming behaviors for custom mixin classes.
"""
import pytest
# Classes under test
from app.util.mixins import HierarchicalMixin, NamedMixin
[docs]
class Hier(HierarchicalMixin):
pass
[docs]
class HierNamed(HierarchicalMixin, NamedMixin):
pass
[docs]
@pytest.mark.mixins
@pytest.mark.hierarchical_mixin
class TestHierarchicalMixins:
[docs]
def test_fails_wrong_mro_order(self):
# Creating NamedHier should fail due to incorrect MRO
with pytest.raises(TypeError):
class NamedHier(NamedMixin, HierarchicalMixin):
pass
NamedHier()
[docs]
def test_construct_no_name(self):
# Construct a root Hier instance
a = Hier()
assert a.instance_parent is None
assert str(a) == "<Hier>"
assert a.instance_hierarchy == "Hier"
# Construct a child Hier instance
b = Hier(instance_parent=a)
assert b.instance_parent is a
assert b.instance_hierarchy == "Hier.Hier"
# Construct another child
c = Hier(instance_parent=b)
assert c.instance_parent is b
assert c.instance_hierarchy == "Hier.Hier.Hier"
# Changing parent to a non-hierarchichal object should fail
with pytest.raises(TypeError):
b.instance_parent = 5 # pyright: ignore as we know this will fail type checking
# Change c's parent to a
c.instance_parent = a
assert c.instance_parent is a
assert c.instance_hierarchy == "Hier.Hier"
[docs]
def test_construct_with_name(self):
# Construct a root HierNamed instance with a name
a = HierNamed(instance_name="name1")
assert a.instance_parent is None
assert str(a) == "<HN name1>"
assert a.instance_hierarchy == "name1"
# Construct a child Hier instance
b = Hier(instance_parent=a)
assert b.instance_parent is a
assert b.instance_hierarchy == "name1.Hier"
# Construct another child with a name
c = HierNamed(instance_parent=b, instance_name="name3")
assert c.instance_parent is b
assert str(c) == "<HN name3>"
assert c.instance_hierarchy == "name1.Hier.name3"
# Changing parent to a non-hierarchic object should fail
with pytest.raises(TypeError):
b.instance_parent = 5 # pyright: ignore as we know this will fail type checking
# Change c's parent to a
c.instance_parent = a
assert c.instance_parent is a
assert c.instance_hierarchy == "name1.name3"