Добавлен служебный класс Crypto и тесты к нему
This commit is contained in:
@@ -7,3 +7,5 @@
|
||||
"""
|
||||
Пакет базовых классов
|
||||
"""
|
||||
|
||||
from .core_test_case import CoreTestCase
|
||||
|
||||
26
net/xeaf/rack/core/core_test_case.py
Normal file
26
net/xeaf/rack/core/core_test_case.py
Normal 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]+$')
|
||||
11
net/xeaf/rack/tests/util/__init__.py
Normal file
11
net/xeaf/rack/tests/util/__init__.py
Normal file
@@ -0,0 +1,11 @@
|
||||
# DRF Rack
|
||||
# Библиотека классов расширений для Django REST Framework
|
||||
#
|
||||
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
||||
# Все права защищены. Лицензия: MIT
|
||||
|
||||
"""
|
||||
Пакет описания классов тестов для служебных классов и утилит
|
||||
"""
|
||||
|
||||
from .crypto_tests import CryptoTests
|
||||
81
net/xeaf/rack/tests/util/crypto_tests.py
Normal file
81
net/xeaf/rack/tests/util/crypto_tests.py
Normal 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)
|
||||
@@ -7,3 +7,5 @@
|
||||
"""
|
||||
Пакет служебных классов и функций
|
||||
"""
|
||||
|
||||
from .crypto import Crypto
|
||||
|
||||
51
net/xeaf/rack/util/crypto.py
Normal file
51
net/xeaf/rack/util/crypto.py
Normal 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))
|
||||
Reference in New Issue
Block a user