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
|
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
import sys
import pytest
import cryptography.hazmat.asn1 as asn1
class TestClassAPI:
def test_fail_unsupported_field(self) -> None:
# Not a sequence
class Unsupported:
foo: int
with pytest.raises(TypeError, match="cannot handle type"):
@asn1.sequence
class Example:
foo: Unsupported
def test_fail_init_incorrect_field_name(self) -> None:
@asn1.sequence
class Example:
foo: int
with pytest.raises(
TypeError, match="got an unexpected keyword argument 'bar'"
):
Example(bar=3) # type: ignore[call-arg]
def test_fail_init_missing_field_name(self) -> None:
@asn1.sequence
class Example:
foo: int
expected_err = (
"missing 1 required keyword-only argument: 'foo'"
if sys.version_info >= (3, 10)
else "missing 1 required positional argument: 'foo'"
)
with pytest.raises(TypeError, match=expected_err):
Example() # type: ignore[call-arg]
def test_fail_positional_field_initialization(self) -> None:
@asn1.sequence
class Example:
foo: int
# The kw-only init is only enforced in Python >= 3.10, which is
# when the parameter `kw_only` for `dataclasses.datalass` was
# added.
if sys.version_info < (3, 10):
assert Example(5).foo == 5 # type: ignore[misc]
else:
with pytest.raises(
TypeError,
match="takes 1 positional argument but 2 were given",
):
Example(5) # type: ignore[misc]
def test_fail_malformed_root_type(self) -> None:
@asn1.sequence
class Invalid:
foo: int
setattr(Invalid, "__asn1_root__", int)
with pytest.raises(TypeError, match="unsupported root type"):
@asn1.sequence
class Example:
foo: Invalid
|