1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
from __future__ import annotations
from collections import defaultdict
from itertools import count
from typing import TYPE_CHECKING
import pytest
from streamlink.utils.random import (
CHOICES_ALPHA,
CHOICES_ALPHA_LOWER,
CHOICES_ALPHA_NUM,
CHOICES_ALPHA_UPPER,
CHOICES_HEX_LOWER,
CHOICES_HEX_UPPER,
CHOICES_NUM,
random_token,
)
if TYPE_CHECKING:
from collections.abc import Iterator, Sequence
@pytest.fixture()
def _iterated_choice(monkeypatch: pytest.MonkeyPatch):
choices: dict[Sequence, Iterator[int]] = defaultdict(count)
def fake_choice(seq):
return seq[next(choices[seq]) % len(seq)]
monkeypatch.setattr("streamlink.utils.random.choice", fake_choice)
@pytest.mark.usefixtures("_iterated_choice")
@pytest.mark.parametrize(
("args", "expected"),
[
(
dict(),
"0123456789abcdefghijklmnopqrstuv",
),
(
dict(length=62),
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
),
(
dict(length=20, choices=CHOICES_NUM),
"01234567890123456789",
),
(
dict(length=52, choices=CHOICES_ALPHA_LOWER),
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
),
(
dict(length=52, choices=CHOICES_ALPHA_UPPER),
"ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ",
),
(
dict(length=104, choices=CHOICES_ALPHA),
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
),
(
dict(length=100, choices=CHOICES_ALPHA_NUM),
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzAB",
),
(
dict(length=32, choices=CHOICES_HEX_LOWER),
"0123456789abcdef0123456789abcdef",
),
(
dict(length=32, choices=CHOICES_HEX_UPPER),
"0123456789ABCDEF0123456789ABCDEF",
),
],
)
def test_random_token(args, expected):
assert random_token(**args) == expected
|