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
|
import itertools
from enum import Enum
from typing import Optional, TypeVar
import pytest
import strawberry
from strawberry.annotation import StrawberryAnnotation
from strawberry.types.unset import UnsetType
class Bleh:
pass
@strawberry.enum
class NumaNuma(Enum):
MA = "ma"
I = "i" # noqa: E741
A = "a"
HI = "hi"
T = TypeVar("T")
types = [
int,
str,
None,
Optional[str],
UnsetType,
"int",
T,
Bleh,
NumaNuma,
]
@pytest.mark.parametrize(
("type1", "type2"), itertools.combinations_with_replacement(types, 2)
)
def test_annotation_hash(type1: object | str, type2: object | str):
annotation1 = StrawberryAnnotation(type1)
annotation2 = StrawberryAnnotation(type2)
assert (
hash(annotation1) == hash(annotation2)
if annotation1 == annotation2
else hash(annotation1) != hash(annotation2)
), "Equal type must imply equal hash"
def test_eq_on_other_type():
class Foo: # noqa: PLW1641
def __eq__(self, other):
# Anything that is a strawberry annotation is equal to Foo
return isinstance(other, StrawberryAnnotation)
assert Foo() != object()
assert object() != Foo()
assert Foo() != 123 != Foo()
assert Foo() != 123
assert Foo() == StrawberryAnnotation(int)
assert StrawberryAnnotation(int) == Foo()
def test_eq_on_non_annotation():
assert StrawberryAnnotation(int) is not int
assert StrawberryAnnotation(int) != 123
def test_set_anntation():
annotation = StrawberryAnnotation(int)
annotation.annotation = str
assert annotation.annotation is str
|