Добавлен служебный класс Crypto и тесты к нему

This commit is contained in:
2026-07-10 15:08:00 +03:00
parent 8a86b517fc
commit 15cc114656
6 changed files with 173 additions and 0 deletions

View File

@@ -7,3 +7,5 @@
"""
Пакет базовых классов
"""
from .core_test_case import CoreTestCase

View File

@@ -0,0 +1,26 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса CoreTestCase
"""
from django.test import TestCase
class CoreTestCase(TestCase):
"""
Расширяет функции кейса тестирования
"""
def assertLowerHex(self, value: str):
"""
Проверяет, что строка состоит из символов в нижнем регистре и шестнадцатеричных цифр
:param value: Проверяемая строка
"""
self.assertRegex(value, r'^[0-9a-f]+$')

View File

@@ -0,0 +1,11 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Пакет описания классов тестов для служебных классов и утилит
"""
from .crypto_tests import CryptoTests

View File

@@ -0,0 +1,81 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса CryptoTests
"""
from net.xeaf.rack.core import CoreTestCase
from net.xeaf.rack.util import Crypto
class CryptoTests(CoreTestCase):
"""
Тесты для Crypto
"""
def test_gen_token(self):
"""
Тест генерации токена
"""
token = Crypto.gen_token()
self.assertEqual(len(token), Crypto.DEFAULT_TOKEN_LENGTH)
self.assertLowerHex(token)
def test_gen_token_length(self):
"""
Тест генерации токена с указанием длины
"""
token = Crypto.gen_token(length=15)
self.assertEqual(len(token), 15)
def test_gen_token_different(self):
"""
Тест генерации разных токенов
"""
token1 = Crypto.gen_token()
token2 = Crypto.gen_token()
self.assertNotEqual(token1, token2)
def test_gen_pin_code(self):
"""
Тест генерации PIN-кода
"""
pin_code = Crypto.gen_pin_code()
self.assertEqual(len(pin_code), Crypto.DEFAULT_PIN_CODE_LENGTH)
self.assertTrue(all(c in Crypto.DEFAULT_PIN_CODE_ALPHABET for c in pin_code))
def test_gen_pin_code_length(self):
"""
Тест генерации PIN-кода с указанием длины
"""
pin_code = Crypto.gen_pin_code(length=8)
self.assertEqual(len(pin_code), 8)
self.assertTrue(all(c in Crypto.DEFAULT_PIN_CODE_ALPHABET for c in pin_code))
def test_gen_pin_code_alphabet(self):
"""
Тест генерации PIN-кода с указанием алфавита
"""
letters = 'ABCD'
pin_code = Crypto.gen_pin_code(alphabet=letters)
self.assertEqual(len(pin_code), Crypto.DEFAULT_PIN_CODE_LENGTH)
self.assertTrue(all(c in letters for c in pin_code))
def test_gen_pin_code_different(self):
"""
Тест генерации разных PIN-кодов
"""
pin_code_1 = Crypto.gen_pin_code()
pin_code_2 = Crypto.gen_pin_code()
self.assertNotEqual(pin_code_1, pin_code_2)

View File

@@ -7,3 +7,5 @@
"""
Пакет служебных классов и функций
"""
from .crypto import Crypto

View File

@@ -0,0 +1,51 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Работа с криптографией
"""
import secrets
class Crypto:
"""
Реализует методы работы со случайными и криптографическими значениями
"""
DEFAULT_TOKEN_LENGTH = 32
""" Длина токена по умолчанию """
DEFAULT_PIN_CODE_LENGTH = 4
""" Длина PIN-кода по умолчанию """
DEFAULT_PIN_CODE_ALPHABET = "0123456789"
""" Алфавит PIN-кода по умолчанию """
@classmethod
def gen_token(cls, length: int = DEFAULT_TOKEN_LENGTH) -> str:
"""
Генерирует случайный токен
:param length: Длина токена
:return: Сгенерированный токен
"""
bytes_needed = (length + 1) // 2
token = secrets.token_hex(bytes_needed)
return token[:length]
@classmethod
def gen_pin_code(cls, length: int = DEFAULT_PIN_CODE_LENGTH, alphabet: str = DEFAULT_PIN_CODE_ALPHABET):
"""
Генерирует случайный PIN-код
:param length: Длина PIN-кода
:param alphabet: Алфавит PIN-кода
:return: Сгенерированный PIN-код
"""
return "".join(secrets.choice(alphabet) for _ in range(length))