Codebase list python-graphene-sqlalchemy / 818eac4 graphene_sqlalchemy / tests / test_enums.py
818eac4

Tree @818eac4 (Download .tar.gz)

test_enums.py @818eac4raw · history · blame

from enum import Enum as PyEnum

import pytest
from sqlalchemy.types import Enum as SQLAlchemyEnumType

from graphene import Enum

from ..enums import _convert_sa_to_graphene_enum, enum_for_field
from ..types import SQLAlchemyObjectType
from .models import HairKind, Pet


def test_convert_sa_to_graphene_enum_bad_type():
    re_err = "Expected sqlalchemy.types.Enum, but got: 'foo'"
    with pytest.raises(TypeError, match=re_err):
        _convert_sa_to_graphene_enum("foo")


def test_convert_sa_to_graphene_enum_based_on_py_enum():
    class Color(PyEnum):
        RED = 1
        GREEN = 2
        BLUE = 3

    sa_enum = SQLAlchemyEnumType(Color)
    graphene_enum = _convert_sa_to_graphene_enum(sa_enum, "FallbackName")
    assert isinstance(graphene_enum, type(Enum))
    assert graphene_enum._meta.name == "Color"
    assert graphene_enum._meta.enum is Color


def test_convert_sa_to_graphene_enum_based_on_py_enum_with_bad_names():
    class Color(PyEnum):
        red = 1
        green = 2
        blue = 3

    sa_enum = SQLAlchemyEnumType(Color)
    graphene_enum = _convert_sa_to_graphene_enum(sa_enum, "FallbackName")
    assert isinstance(graphene_enum, type(Enum))
    assert graphene_enum._meta.name == "Color"
    assert graphene_enum._meta.enum is not Color
    assert [
        (key, value.value)
        for key, value in graphene_enum._meta.enum.__members__.items()
    ] == [("RED", 1), ("GREEN", 2), ("BLUE", 3)]


def test_convert_sa_enum_to_graphene_enum_based_on_list_named():
    sa_enum = SQLAlchemyEnumType("red", "green", "blue", name="color_values")
    graphene_enum = _convert_sa_to_graphene_enum(sa_enum, "FallbackName")
    assert isinstance(graphene_enum, type(Enum))
    assert graphene_enum._meta.name == "ColorValues"
    assert [
        (key, value.value)
        for key, value in graphene_enum._meta.enum.__members__.items()
    ] == [("RED", 'red'), ("GREEN", 'green'), ("BLUE", 'blue')]


def test_convert_sa_enum_to_graphene_enum_based_on_list_unnamed():
    sa_enum = SQLAlchemyEnumType("red", "green", "blue")
    graphene_enum = _convert_sa_to_graphene_enum(sa_enum, "FallbackName")
    assert isinstance(graphene_enum, type(Enum))
    assert graphene_enum._meta.name == "FallbackName"
    assert [
        (key, value.value)
        for key, value in graphene_enum._meta.enum.__members__.items()
    ] == [("RED", 'red'), ("GREEN", 'green'), ("BLUE", 'blue')]


def test_convert_sa_enum_to_graphene_enum_based_on_list_without_name():
    sa_enum = SQLAlchemyEnumType("red", "green", "blue")
    re_err = r"No type name specified for Enum\('red', 'green', 'blue'\)"
    with pytest.raises(TypeError, match=re_err):
        _convert_sa_to_graphene_enum(sa_enum)


def test_enum_for_field():
    class PetType(SQLAlchemyObjectType):
        class Meta:
            model = Pet

    enum = enum_for_field(PetType, 'pet_kind')
    assert isinstance(enum, type(Enum))
    assert enum._meta.name == "PetKind"
    assert [
        (key, value.value)
        for key, value in enum._meta.enum.__members__.items()
    ] == [("CAT", 'cat'), ("DOG", 'dog')]
    enum2 = enum_for_field(PetType, 'pet_kind')
    assert enum2 is enum
    enum2 = PetType.enum_for_field('pet_kind')
    assert enum2 is enum

    enum = enum_for_field(PetType, 'hair_kind')
    assert isinstance(enum, type(Enum))
    assert enum._meta.name == "HairKind"
    assert enum._meta.enum is HairKind
    enum2 = PetType.enum_for_field('hair_kind')
    assert enum2 is enum

    re_err = r"Cannot get PetType\.other_kind"
    with pytest.raises(TypeError, match=re_err):
        enum_for_field(PetType, 'other_kind')
    with pytest.raises(TypeError, match=re_err):
        PetType.enum_for_field('other_kind')

    re_err = r"PetType\.name does not map to enum column"
    with pytest.raises(TypeError, match=re_err):
        enum_for_field(PetType, 'name')
    with pytest.raises(TypeError, match=re_err):
        PetType.enum_for_field('name')

    re_err = r"Expected a field name, but got: None"
    with pytest.raises(TypeError, match=re_err):
        enum_for_field(PetType, None)
    with pytest.raises(TypeError, match=re_err):
        PetType.enum_for_field(None)

    re_err = "Expected SQLAlchemyObjectType, but got: None"
    with pytest.raises(TypeError, match=re_err):
        enum_for_field(None, 'other_kind')