""" Player Factory Factory for creating Player test instances following test isolation guidelines. """ import datetime import random from typing import Optional from sqlmodel import Session from app.models.player import Player class PlayerFactory: """Factory for creating Player test data.""" @staticmethod def create( session: Session, name: Optional[str] = None, cost: Optional[int] = None, image: Optional[str] = None, mlbclub: Optional[str] = None, franchise: Optional[str] = None, cardset_id: Optional[int] = None, set_num: Optional[int] = None, rarity_id: Optional[int] = None, pos_1: Optional[str] = None, description: Optional[str] = None, quantity: Optional[int] = None, image2: Optional[str] = None, headshot: Optional[str] = None, **kwargs ) -> Player: """ Create a Player instance with randomized data. Args: session: Database session name: Player name (default: random name) cost: Player cost (default: random 1-50) image: Primary image URL (default: batting card) mlbclub: MLB club (default: random team) franchise: Franchise name (default: matches mlbclub) cardset_id: Cardset ID (default: random) set_num: Set number (default: random) rarity_id: Rarity ID (default: random 1-5) pos_1: Primary position (default: random position) description: Player description (default: random era) quantity: Quantity available (default: 999) image2: Secondary image URL (default: None) headshot: Headshot URL (default: None) **kwargs: Additional fields Returns: Player: Created and committed player instance """ player_id = random.randint(1000000, 9999999) # Generate random MLB clubs mlb_clubs = ["LAD", "NYY", "BOS", "HOU", "ATL", "SF", "STL", "CHC", "NYM", "PHI"] # Generate random positions positions = ["C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "P"] # Generate random eras eras = ["2023", "2022", "2021", "Rookie", "Prime", "Veteran"] # Set defaults actual_name = name or f"Player {player_id}" actual_mlbclub = mlbclub or random.choice(mlb_clubs) actual_pos_1 = pos_1 or random.choice(positions) actual_description = description or random.choice(eras) # Create cardset if cardset_id is not provided if cardset_id is None: from .cardset_factory import CardsetFactory cardset = CardsetFactory.create(session) actual_cardset_id = cardset.id else: actual_cardset_id = cardset_id player_data = { "id": player_id, "name": actual_name, "cost": cost or random.randint(1, 50), "image": image or f"https://example.com/{actual_name.lower().replace(' ', '_')}_batting.jpg", "mlbclub": actual_mlbclub, "franchise": franchise or actual_mlbclub, "cardset_id": actual_cardset_id, "set_num": set_num or random.randint(1, 500), "rarity_id": rarity_id or random.randint(1, 5), "pos_1": actual_pos_1, "description": actual_description, "quantity": quantity if quantity is not None else 999, "image2": image2, "headshot": headshot, "created": datetime.datetime.now(), **kwargs } player = Player(**player_data) session.add(player) session.commit() session.refresh(player) return player @staticmethod def create_with_batting_card(session: Session, **kwargs) -> Player: """Create a player with a batting card URL.""" kwargs.setdefault("image", "https://example.com/player_batting.jpg") kwargs.setdefault("image2", None) return PlayerFactory.create(session, **kwargs) @staticmethod def create_with_pitching_card(session: Session, **kwargs) -> Player: """Create a player with a pitching card URL.""" kwargs.setdefault("image", "https://example.com/player_pitching.jpg") kwargs.setdefault("image2", None) return PlayerFactory.create(session, **kwargs) @staticmethod def create_with_both_cards(session: Session, **kwargs) -> Player: """Create a player with both batting and pitching card URLs.""" kwargs.setdefault("image", "https://example.com/player_batting.jpg") kwargs.setdefault("image2", "https://example.com/player_pitching.jpg") return PlayerFactory.create(session, **kwargs) @staticmethod def create_catcher(session: Session, **kwargs) -> Player: """Create a catcher player.""" kwargs.setdefault("pos_1", "C") kwargs.setdefault("name", f"Catcher {random.randint(1000, 9999)}") return PlayerFactory.create(session, **kwargs) @staticmethod def create_pitcher(session: Session, **kwargs) -> Player: """Create a pitcher player.""" kwargs.setdefault("pos_1", "P") kwargs.setdefault("name", f"Pitcher {random.randint(1000, 9999)}") kwargs.setdefault("image", "https://example.com/pitcher_pitching.jpg") return PlayerFactory.create(session, **kwargs)