Добавлены тесты для CoreEnum
This commit is contained in:
@@ -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
|
||||
|
||||
66
net/xeaf/rack/tests/core/_core_enum_mocks.py
Normal file
66
net/xeaf/rack/tests/core/_core_enum_mocks.py
Normal 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
|
||||
52
net/xeaf/rack/tests/core/core_enum_check_is_empty_tests.py
Normal file
52
net/xeaf/rack/tests/core/core_enum_check_is_empty_tests.py
Normal 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))
|
||||
77
net/xeaf/rack/tests/core/core_enum_choices_tests.py
Normal file
77
net/xeaf/rack/tests/core/core_enum_choices_tests.py
Normal 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)
|
||||
123
net/xeaf/rack/tests/core/core_enum_from_string_tests.py
Normal file
123
net/xeaf/rack/tests/core/core_enum_from_string_tests.py
Normal 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))
|
||||
69
net/xeaf/rack/tests/core/core_enum_keys_tests.py
Normal file
69
net/xeaf/rack/tests/core/core_enum_keys_tests.py
Normal 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"])
|
||||
85
net/xeaf/rack/tests/core/core_enum_values_tests.py
Normal file
85
net/xeaf/rack/tests/core/core_enum_values_tests.py
Normal 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"])
|
||||
Reference in New Issue
Block a user