diff --git a/net/xeaf/rack/tests/util/crypto_tests.py b/net/xeaf/rack/tests/util/crypto_tests.py index 4a3dc23..3b9b9b4 100644 --- a/net/xeaf/rack/tests/util/crypto_tests.py +++ b/net/xeaf/rack/tests/util/crypto_tests.py @@ -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) diff --git a/net/xeaf/rack/util/crypto.py b/net/xeaf/rack/util/crypto.py index 198f68f..fe62ca5 100644 --- a/net/xeaf/rack/util/crypto.py +++ b/net/xeaf/rack/util/crypto.py @@ -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)