import enum from typing import Any, cast from fansifter_common.testing.factories import ( SQLAlchemyFactory as BaseSQLAlchemyFactory, ) from polyfactory import Use from sqlalchemy import Column from preference_center.adapters.db.types import EnumType from preference_center.profile.models import MailingList, Profile, Subscription # Base factories class SQLAlchemyFactory[T](BaseSQLAlchemyFactory[T]): __is_base_factory__ = True @classmethod def get_type_from_column(cls, column: Column[Any]) -> type: if ( isinstance(column.type, EnumType) and isinstance(column.type.choices, type) and issubclass(column.type.choices, enum.Enum) ): return cast(type, column.type.choices) return super().get_type_from_column(column) class ProfileFactory(SQLAlchemyFactory[Profile]): email = Use(SQLAlchemyFactory.__faker__.email) deleted = False delete_reason = None class MailingListFactory(SQLAlchemyFactory[MailingList]): pass class SubscriptionFactory(SQLAlchemyFactory[Subscription]): mailing_list = Use(MailingListFactory.build)