import asyncio import logging import sys import os # Add parent directory to path so we can import app modules sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from app.database import connect_db, get_db, disconnect_db from app.models.user import User, UserRole from app.core.security import hash_password logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) async def create_test_user(): """Create a test user for development""" try: await connect_db() db = await get_db() users_collection = db["users"] email = "test@example.com" password = "Password123!" existing_user = await users_collection.find_one({"email": email}) if existing_user: logger.info(f"Test user already exists: {email}") # Ensure it is active updates = {} if not existing_user.get("isActive"): updates["isActive"] = True if not existing_user.get("isEmailVerified"): updates["isEmailVerified"] = True if updates: logger.info("Activating existing test user...") await users_collection.update_one( {"_id": existing_user["_id"]}, {"$set": updates} ) logger.info("User activated.") return logger.info(f"Creating test user: {email}") hashed_pw = hash_password(password) user_doc = User.create_document( first_name="Test", last_name="User", email=email, phone=None, hashed_password=hashed_pw, role=UserRole.RENTER, ) # FIX: Remove phone field if None to avoid unique index violation on null if user_doc.get("phone") is None: user_doc.pop("phone", None) # Override default inactive state user_doc["isActive"] = True user_doc["isEmailVerified"] = True result = await users_collection.insert_one(user_doc) logger.info(f"✅ Test user created successfully! ID: {result.inserted_id}") logger.info(f"Email: {email}") logger.info(f"Password: {password}") except Exception as e: logger.error(f"❌ Failed to create test user: {e}") # Print full traceback if needed import traceback traceback.print_exc() finally: await disconnect_db() if __name__ == "__main__": asyncio.run(create_test_user())