Добавлены тесты для CoreEnum

This commit is contained in:
2026-07-19 23:52:34 +03:00
parent a25b34ab3f
commit 785bf1ba29
10 changed files with 622 additions and 1 deletions

View File

@@ -24,6 +24,7 @@ class CoreEnum(StrEnum):
:return: Список для выбора значения
"""
cls._check_is_empty()
return [(item.value, item.name) for item in cls]
@classmethod
@@ -34,6 +35,7 @@ class CoreEnum(StrEnum):
:return: Список ключей
"""
cls._check_is_empty()
return [item.name for item in cls]
@classmethod
@@ -44,4 +46,34 @@ class CoreEnum(StrEnum):
:return: Список значений
"""
return [item.value for item in cls]
cls._check_is_empty()
return [item.value for item in cls.__members__.values()]
@classmethod
def _check_is_empty(cls):
"""
Проверяет, что перечисление не пустое
:return: True, если перечисление не пустое
"""
count = len(cls)
if count == 0:
raise ValueError(f"The {cls.__name__} enum must not be empty.")
@classmethod
def from_string(cls, value: str) -> CoreEnum:
"""
Возвращает перечисление по строковому значению
:param value: Строковое значение
:return: Перечисление
"""
for item in cls:
if item.value == value:
return item
raise ValueError(f"The {cls.__name__} enum does not contain the value '{value}'")

View File

@@ -7,3 +7,9 @@
"""
Пакет описания тестов классов ядра
"""
from .core_enum_check_is_empty_tests import CoreEnumCheckIsEmptyTests
from .core_enum_choices_tests import CoreEnumChoicesTests
from .core_enum_from_string_tests import CoreEnumFromStringTests
from .core_enum_keys_tests import CoreEnumKeysTests
from .core_enum_values_tests import CoreEnumValuesTests

View File

@@ -0,0 +1,66 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание mock-классов для CoreEnumChoicesTests
"""
from net.xeaf.rack.core import CoreEnum
class TestEnum(CoreEnum):
"""
Тестовое перечисление для проверки методов choices, keys, values
"""
OPTION1 = "value1"
OPTION2 = "value2"
OPTION3 = "value3"
class TestOrderedEnum(CoreEnum):
"""
Тестовое перечисление с упорядоченными элементами
"""
FIRST = "first"
SECOND = "second"
THIRD = "third"
class TestDuplicateEnum(CoreEnum):
"""
Тестовое перечисление с дублирующимися значениями
"""
ONE = "same"
TWO = "same"
THREE = "different"
class TestCaseEnum(CoreEnum):
"""
Тестовое перечисление с элементами разных регистров
"""
LOW = "lower"
UPPER = "UPPER"
class TestSingleEnum(CoreEnum):
"""
Тестовое перечисление с одним элементом
"""
ONLY = "only_value"
class TestEmptyEnum(CoreEnum):
"""
Пустое тестовое перечисление
"""
pass

View File

@@ -0,0 +1,52 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса CoreEnumCheckIsEmptyTests
"""
from net.xeaf.rack.core.testing import CoreSimpleTestCase
from ._core_enum_mocks import TestEmptyEnum
from ._core_enum_mocks import TestEnum
class CoreEnumCheckIsEmptyTests(CoreSimpleTestCase):
"""
Тестовый класс для метода CoreEnum._check_is_empty()
"""
def test_check_is_empty_with_non_empty_enum_does_not_raise_error(self):
"""
Тест проверяет, что _check_is_empty не выбрасывает исключение для непустого перечисления
"""
# Act & Assert
try:
TestEnum._check_is_empty()
except ValueError:
self.fail("_check_is_empty raised ValueError unexpectedly for non-empty enum")
def test_check_is_empty_with_empty_enum_raises_value_error(self):
"""
Тест проверяет, что _check_is_empty выбрасывает ValueError для пустого перечисления"
"""
# Act & Assert
with self.assertRaises(ValueError) as context:
TestEmptyEnum._check_is_empty()
self.assertIn("enum must not be empty", str(context.exception))
def test_check_is_empty_uses_correct_class_name_in_error(self):
"""
Тест проверяет, что в сообщении об ошибке используется правильное имя класса
"""
# Act & Assert
with self.assertRaises(ValueError) as context:
TestEmptyEnum._check_is_empty()
self.assertNotIn("CoreEnum", str(context.exception))

View File

@@ -0,0 +1,77 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса CoreEnumChoicesTests
"""
from net.xeaf.rack.core.testing import CoreSimpleTestCase
from ._core_enum_mocks import TestEmptyEnum
from ._core_enum_mocks import TestEnum
from ._core_enum_mocks import TestOrderedEnum
from ._core_enum_mocks import TestSingleEnum
class CoreEnumChoicesTests(CoreSimpleTestCase):
"""
Тестовый класс для CoreEnum.choices()
"""
def test_choices_returns_list_of_tuples_with_value_and_name(self):
"""
Тест проверяет, что метод choices возвращает список кортежей (значение, имя)
"""
# Arrange
expected = [("value1", "OPTION1"), ("value2", "OPTION2"), ("value3", "OPTION3")]
# Act
result = TestEnum.choices()
# Assert
self.assertEqual(result, expected)
self.assertIsInstance(result, list)
self.assertIsInstance(result[0], tuple)
self.assertEqual(len(result), 3)
def test_choices_returns_empty_list_for_empty_enum(self):
"""
Тест проверяет, что для пустого перечисления метод choices выбрасывает исключение
"""
# Act & Assert
with self.assertRaises(ValueError) as context:
TestEmptyEnum.choices()
self.assertIn("enum must not be empty", str(context.exception))
def test_choices_preserves_enum_member_order(self):
"""
Тест проверяет сохранение порядка элементов перечисления
"""
# Act
result = TestOrderedEnum.choices()
# Assert
self.assertEqual(result[0], ("first", "FIRST"))
self.assertEqual(result[1], ("second", "SECOND"))
self.assertEqual(result[2], ("third", "THIRD"))
def test_choices_handles_single_member_enum(self):
"""
Тест проверяет работу метода choices с перечислением из одного элемента
"""
# Arrange
expected = [("only_value", "ONLY")]
# Act
result = TestSingleEnum.choices()
# Assert
self.assertEqual(result, expected)
self.assertEqual(len(result), 1)

View File

@@ -0,0 +1,123 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса CoreEnumFromStringTests
"""
from net.xeaf.rack.core.testing import CoreSimpleTestCase
from ._core_enum_mocks import TestCaseEnum
from ._core_enum_mocks import TestDuplicateEnum
from ._core_enum_mocks import TestEmptyEnum
from ._core_enum_mocks import TestEnum
from ._core_enum_mocks import TestSingleEnum
class CoreEnumFromStringTests(CoreSimpleTestCase):
"""
Тестовый класс для CoreEnum.from_string()
"""
def test_from_string_returns_correct_enum_member(self):
"""
Тест проверяет, что метод from_string возвращает корректный элемент перечисления
"""
# Act
result = TestEnum.from_string("value2")
# Assert
self.assertEqual(result, TestEnum.OPTION2)
self.assertEqual(result.value, "value2")
self.assertEqual(result.name, "OPTION2")
def test_from_string_returns_first_matching_member_for_duplicate_values(self):
"""
Тест проверяет, что при дублирующихся значениях возвращается первый найденный элемент
"""
# Act
result = TestDuplicateEnum.from_string("same")
# Assert
self.assertEqual(result, TestDuplicateEnum.ONE)
self.assertEqual(result.value, "same")
self.assertEqual(result.name, "ONE")
def test_from_string_raises_error_for_non_existent_value(self):
"""
Тест проверяет, что для несуществующего значения выбрасывается ValueError
"""
# Act & Assert
with self.assertRaises(ValueError) as context:
TestEnum.from_string("non_existent_value")
self.assertIn("enum does not contain the value 'non_existent_value'", str(context.exception))
def test_from_string_raises_error_for_empty_string(self):
"""
Тест проверяет, что для пустой строки выбрасывается ValueError
"""
# Act & Assert
with self.assertRaises(ValueError) as context:
TestEnum.from_string("")
self.assertIn("enum does not contain the value ''", str(context.exception))
def test_from_string_raises_error_for_empty_enum(self):
"""
Тест проверяет, что для пустого перечисления выбрасывается ValueError
"""
# Act & Assert
with self.assertRaises(ValueError) as context:
TestEmptyEnum.from_string("any_value")
self.assertIn("enum does not contain the value 'any_value'", str(context.exception))
def test_from_string_works_with_single_member_enum(self):
"""
Тест проверяет работу метода from_string с перечислением из одного элемента
"""
# Act
result = TestSingleEnum.from_string("only_value")
# Assert
self.assertEqual(result, TestSingleEnum.ONLY)
self.assertEqual(result.value, "only_value")
self.assertEqual(result.name, "ONLY")
def test_from_string_case_sensitive_matching(self):
"""
Тест проверяет, что поиск значения чувствителен к регистру
"""
# Act
result_lower = TestCaseEnum.from_string("lower")
result_upper = TestCaseEnum.from_string("UPPER")
# Assert
self.assertEqual(result_lower, TestCaseEnum.LOW)
self.assertEqual(result_upper, TestCaseEnum.UPPER)
# Проверяем, что поиск с другим регистром вызывает ошибку
with self.assertRaises(ValueError):
TestCaseEnum.from_string("Lower")
def test_from_string_uses_correct_class_name_in_error(self):
"""
Тест проверяет, что в сообщении об ошибке используется правильное имя класса
"""
# Act & Assert
with self.assertRaises(ValueError) as context:
TestEnum.from_string("wrong")
self.assertIn("TestEnum", str(context.exception))
self.assertNotIn("CoreEnum", str(context.exception))

View File

@@ -0,0 +1,69 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса CoreEnumKeysTests
"""
from net.xeaf.rack.core.testing import CoreSimpleTestCase
from ._core_enum_mocks import TestEmptyEnum
from ._core_enum_mocks import TestEnum
from ._core_enum_mocks import TestOrderedEnum
from ._core_enum_mocks import TestSingleEnum
class CoreEnumKeysTests(CoreSimpleTestCase):
"""
Тестовый класс для CoreEnum.keys()
"""
def test_keys_returns_list_of_enum_member_names(self):
"""
Тест проверяет, что метод keys возвращает список имен элементов перечисления
"""
# Arrange
expected = ["OPTION1", "OPTION2", "OPTION3"]
# Act
result = TestEnum.keys()
# Assert
self.assertEqual(result, expected)
self.assertIsInstance(result, list)
self.assertEqual(len(result), 3)
def test_keys_returns_empty_list_for_empty_enum(self):
"""
Тест проверяет, что для пустого перечисления метод keys выбрасывает исключение
"""
# Act & Assert
with self.assertRaises(ValueError) as context:
TestEmptyEnum.keys()
self.assertIn("enum must not be empty", str(context.exception))
def test_keys_returns_names_in_definition_order(self):
"""
Тест проверяет, что метод keys возвращает имена в порядке объявления
"""
# Act
result = TestOrderedEnum.keys()
# Assert
self.assertEqual(result, ["FIRST", "SECOND", "THIRD"])
def test_keys_works_with_single_member_enum(self):
"""
Тест проверяет работу метода keys с перечислением из одного элемента
"""
# Act
result = TestSingleEnum.keys()
# Assert
self.assertEqual(result, ["ONLY"])

View File

@@ -0,0 +1,85 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса CoreEnumValuesTests
"""
from net.xeaf.rack.core.testing import CoreSimpleTestCase
from ._core_enum_mocks import TestDuplicateEnum
from ._core_enum_mocks import TestEmptyEnum
from ._core_enum_mocks import TestEnum
from ._core_enum_mocks import TestOrderedEnum
from ._core_enum_mocks import TestSingleEnum
class CoreEnumValuesTests(CoreSimpleTestCase):
"""
Тестовый класс CoreEnum.values()
"""
def test_values_returns_list_of_enum_member_values(self):
"""
Тест проверяет, что метод values возвращает список значений элементов перечисления
"""
# Arrange
expected = ["value1", "value2", "value3"]
# Act
result = TestEnum.values()
# Assert
self.assertEqual(result, expected)
self.assertIsInstance(result, list)
self.assertEqual(len(result), 3)
def test_values_returns_empty_list_for_empty_enum(self):
"""
Тест проверяет, что для пустого перечисления метод values выбрасывает исключение
"""
# Act & Assert
with self.assertRaises(ValueError) as context:
TestEmptyEnum.values()
self.assertIn("enum must not be empty", str(context.exception))
def test_values_returns_values_in_definition_order(self):
"""
Тест проверяет, что метод values возвращает значения в порядке объявления
"""
# Act
result = TestOrderedEnum.values()
# Assert
self.assertEqual(result, ["first", "second", "third"])
def test_values_handles_duplicate_values_in_enum(self):
"""
Тест проверяет, что метод values корректно обрабатывает дублирующиеся значения
"""
# Arrange
expected = ["same", "same", "different"]
# Act
result = TestDuplicateEnum.values()
# Assert
self.assertEqual(result, expected)
self.assertEqual(len(result), 3)
def test_values_works_with_single_member_enum(self):
"""
Тест проверяет работу метода values с перечислением из одного элемента
"""
# Act
result = TestSingleEnum.values()
# Assert
self.assertEqual(result, ["only_value"])