Продолжение работы над Crypto

This commit is contained in:
2026-07-10 16:02:22 +03:00
parent 15cc114656
commit 0370f20efd
2 changed files with 57 additions and 0 deletions

View File

@@ -79,3 +79,41 @@ class CryptoTests(CoreTestCase):
pin_code_1 = Crypto.gen_pin_code()
pin_code_2 = Crypto.gen_pin_code()
self.assertNotEqual(pin_code_1, pin_code_2)
def test_gen_slug(self):
"""
Тест генерации slug
"""
pfx = 'test'
slug = Crypto.gen_slug(pfx)
self.assertEqual(len(slug), Crypto.DEFAULT_SLUG_LENGTH)
self.assertEqual(slug[:len(pfx)], pfx)
self.assertLowerHex(slug[len(pfx):])
def test_gen_slug_length(self):
"""
Тест генерации slug с указанием длины
"""
pfx = 'test'
slug = Crypto.gen_slug(pfx, length=16)
self.assertEqual(len(slug), 16)
def test_gen_slug_prefix(self):
"""
Тест генерации slug с длинным префиксом
"""
pfx = 'test_test_test'
slug = Crypto.gen_slug(pfx)
self.assertEqual(slug, pfx)
def test_slug_different(self):
"""
Тест генерации разных slug
"""
slug_1 = Crypto.gen_slug('test')
slug_2 = Crypto.gen_slug('test')
self.assertNotEqual(slug_1, slug_2)

View File

@@ -25,6 +25,9 @@ class Crypto:
DEFAULT_PIN_CODE_ALPHABET = "0123456789"
""" Алфавит PIN-кода по умолчанию """
DEFAULT_SLUG_LENGTH = 8
""" Длина slug по умолчанию """
@classmethod
def gen_token(cls, length: int = DEFAULT_TOKEN_LENGTH) -> str:
"""
@@ -49,3 +52,19 @@ class Crypto:
"""
return "".join(secrets.choice(alphabet) for _ in range(length))
@classmethod
def gen_slug(cls, prefix: str, length: int = DEFAULT_SLUG_LENGTH):
"""
Генерирует случайный slug
:param prefix: Префикс slug
:param length: Длина slug
:return: Сгенерированный slug
"""
l = length - len(prefix)
if l <= 0:
return prefix
return prefix + cls.gen_token(l)