#!/usr/bin/env python3 """ Test script to verify the 2-step asset creation flow. Tests that draft vehicles can be created without VIN. """ import asyncio import sys import os # Add backend to path sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'backend')) from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker from app.db.session import get_db from app.services.asset_service import AssetService from app.models.vehicle.asset import Asset from app.core.config import settings async def test_draft_vehicle_creation(): """Test creating a draft vehicle without VIN""" print("๐Ÿงช Testing 2-step asset creation flow...") # Create async engine engine = create_async_engine(str(settings.SQLALCHEMY_DATABASE_URI)) async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) async with async_session() as db: try: # Test 1: Create draft vehicle without VIN print("1. Testing draft vehicle creation (no VIN)...") draft_vehicle = await AssetService.create_or_claim_vehicle( db=db, user_id=1, # Test user ID org_id=1, # Test org ID vin=None, # No VIN for draft license_plate="DRAFT-001", catalog_id=None ) print(f" โœ… Draft vehicle created with ID: {draft_vehicle.id}") print(f" Status: {draft_vehicle.status}") print(f" VIN: {draft_vehicle.vin}") if draft_vehicle.status != "draft": print(f" โŒ Expected status 'draft', got '{draft_vehicle.status}'") return False if draft_vehicle.vin is not None: print(f" โŒ Expected VIN to be None, got '{draft_vehicle.vin}'") return False # Test 2: Create active vehicle with VIN print("\n2. Testing active vehicle creation (with VIN)...") active_vehicle = await AssetService.create_or_claim_vehicle( db=db, user_id=1, org_id=1, vin="WBA12345678901234", # Valid VIN license_plate="ACTIVE-001", catalog_id=None ) print(f" โœ… Active vehicle created with ID: {active_vehicle.id}") print(f" Status: {active_vehicle.status}") print(f" VIN: {active_vehicle.vin}") if active_vehicle.status != "active": print(f" โŒ Expected status 'active', got '{active_vehicle.status}'") return False if active_vehicle.vin != "WBA12345678901234": print(f" โŒ Expected VIN 'WBA12345678901234', got '{active_vehicle.vin}'") return False # Test 3: Create draft vehicle with draft=True parameter print("\n3. Testing draft vehicle with explicit draft=True...") explicit_draft = await AssetService.create_or_claim_vehicle( db=db, user_id=1, org_id=1, vin="WBA99999999999999", # Has VIN but draft=True license_plate="DRAFT-002", catalog_id=None, draft=True ) print(f" โœ… Explicit draft vehicle created with ID: {explicit_draft.id}") print(f" Status: {explicit_draft.status}") print(f" VIN: {explicit_draft.vin}") if explicit_draft.status != "draft": print(f" โŒ Expected status 'draft', got '{explicit_draft.status}'") return False # VIN should still be stored even for draft if explicit_draft.vin != "WBA99999999999999": print(f" โŒ Expected VIN 'WBA99999999999999', got '{explicit_draft.vin}'") return False print("\n๐ŸŽ‰ All tests passed! 2-step asset creation flow is working correctly.") print(" - Draft vehicles can be created without VIN") print(" - Draft vehicles have status='draft'") print(" - Active vehicles have status='active'") print(" - Explicit draft=True overrides VIN presence") return True except Exception as e: print(f"โŒ Test failed with error: {e}") import traceback traceback.print_exc() return False finally: await db.commit() if __name__ == "__main__": # Run the test success = asyncio.run(test_draft_vehicle_creation()) sys.exit(0 if success else 1)