import uuid from datetime import UTC, datetime from fansifter_common.testing.factories import SQLAlchemyFactory from polyfactory import Use from resonance_engine.dsp.enums import DSPClientName, DSPClientStatus, DSPId from resonance_engine.dsp.models import DSPClient from resonance_engine.fandata.enums import FanConnectionStatus from resonance_engine.fandata.models import ( FanCollectionState, FanConnection, FanConnectionFilter, ) from resonance_engine.tasks.enums import FanoutSource, TaskStatus from resonance_engine.tasks.models import CollectTask, FanoutTask # DSP class DSPClientFactory(SQLAlchemyFactory[DSPClient]): dsp_id = DSPId.spotify name = DSPClientName.spotify_songwhip status = DSPClientStatus.active # FanData class FanConnectionFactory(SQLAlchemyFactory[FanConnection]): fan_id = Use(lambda: uuid.uuid4().hex) status = FanConnectionStatus.active connect_rank = None last_connected_at = None last_collected_at = None last_dispatched_at = None consecutive_failures = None class FanCollectionStateFactory(SQLAlchemyFactory[FanCollectionState]): fan_id = Use(lambda: uuid.uuid4().hex) last_collection_error = None profile_collected_at = None top_artists_collected_at = None top_tracks_collected_at = None recently_played_collected_at = None playlists_collected_at = None saved_albums_collected_at = None saved_tracks_collected_at = None followed_artists_collected_at = None # Tasks class FanoutTaskFactory(SQLAlchemyFactory[FanoutTask]): started_at = datetime(2026, 1, 1, tzinfo=UTC) finished_at = None source = FanoutSource.scheduled status = TaskStatus.running finished_reason = None fans_dispatched = 0 messages_sent = 0 filters = FanConnectionFilter() class CollectTaskFactory(SQLAlchemyFactory[CollectTask]): started_at = datetime(2026, 1, 1, tzinfo=UTC) finished_at = None dsp_client_name = DSPClientName.spotify_songwhip status = TaskStatus.running finished_reason = None fans_total = 0 fans_processed = 0 fans_errors = 0 fans_stale_tokens = 0 fans_skipped = 0 requests_rate_limited = 0 requests = 0 requests_skipped = 0