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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
"""Tests for the enum tools."""
from enum import IntEnum, StrEnum
from typing import Any
import pytest
from asusrouter.tools.enum import FromIntMixin, FromStrMixin
class FakeStrEnum(FromStrMixin, StrEnum):
"""String-based enum for testing."""
UNKNOWN = "unknown_value"
FOO = "foo_value"
BAR = "bar_value"
class FakeStrEnumNoUnknown(FromStrMixin, StrEnum):
"""String-based enum for testing without unknown."""
FOO = "foo_value"
BAR = "bar_value"
class FakeIntEnum(FromIntMixin, IntEnum):
"""Integer-based enum for testing."""
UNKNOWN = -999
ONE = 1
TWO = 2
class FakeIntEnumNoUnknown(FromIntMixin, IntEnum):
"""Integer-based enum for testing without unknown."""
ONE = 1
TWO = 2
@pytest.mark.parametrize(
("value", "member"),
[
(FakeStrEnum.FOO, FakeStrEnum.FOO),
("unknown_value", FakeStrEnum.UNKNOWN),
(" foo_value ", FakeStrEnum.FOO),
("foo", FakeStrEnum.FOO),
(" bar ", FakeStrEnum.BAR),
("none", FakeStrEnum.UNKNOWN),
(None, FakeStrEnum.UNKNOWN),
(123, FakeStrEnum.UNKNOWN),
(object(), FakeStrEnum.UNKNOWN),
],
ids=[
"actual_enum",
"from_correct_value",
"from_parsed_value",
"from_correct_key",
"from_parsed_key",
"not_value_not_key",
"not_a_string",
"wrong_type",
"object",
],
)
def test_fromstr(value: Any, member: FakeStrEnum) -> None:
"""Test string-based enum resolution."""
assert FakeStrEnum.from_value(value) is member
def test_fromstr_no_unknown() -> None:
"""Test string-based enum resolution without unknowns."""
with pytest.raises(ValueError, match="no `UNKNOWN` member is defined"):
FakeStrEnumNoUnknown.from_value("unknown_value")
@pytest.mark.parametrize(
("value", "member"),
[
(FakeIntEnum.ONE, FakeIntEnum.ONE),
(1, FakeIntEnum.ONE),
("2", FakeIntEnum.TWO),
("one", FakeIntEnum.ONE),
(" two ", FakeIntEnum.TWO),
("three", FakeIntEnum.UNKNOWN),
(4, FakeIntEnum.UNKNOWN),
(None, FakeIntEnum.UNKNOWN),
((1,), FakeIntEnum.UNKNOWN),
(object(), FakeIntEnum.UNKNOWN),
],
ids=[
"actual_enum",
"from_correct_value",
"from_parsed_value",
"from_correct_key",
"from_parsed_key",
"value_does_not_exist",
"not_value_not_key",
"not_compatible",
"wrong_type",
"object",
],
)
def test_fromint(value: Any, member: FakeIntEnum) -> None:
"""Test integer-based enum resolution."""
assert FakeIntEnum.from_value(value) is member
def test_fromint_no_unknown() -> None:
"""Test integer-based enum resolution without unknowns."""
with pytest.raises(ValueError, match="no `UNKNOWN` member is defined"):
FakeIntEnumNoUnknown.from_value("unknown_value")
|