import asyncio import sys import os # Útvonal beállítása sys.path.append(os.path.join(os.path.dirname(__file__), '..')) # --- JAVÍTÁS 1: A Helyes Aszinkron Session Importálása --- from app.db.session import AsyncSessionLocal # --------------------------------------------------------- from app.models.user import User from app.models.social import ServiceProvider, Competition, ModerationStatus from app.services.social_service import vote_for_provider from sqlalchemy import text from datetime import datetime, timedelta async def run_simulation(): # --- JAVÍTÁS 2: Itt is az AsyncSessionLocal-t használjuk --- async with AsyncSessionLocal() as db: # ----------------------------------------------------------- print("--- 1. TAKARÍTÁS (Előző tesztadatok törlése) ---") # Kaszkádolt törlés a data sémában await db.execute(text("TRUNCATE TABLE data.user_scores, data.votes, data.service_providers, data.competitions, data.users RESTART IDENTITY CASCADE")) await db.commit() print("\n--- 2. SZEREPLŐK LÉTREHOZÁSA ---") # Admin admin = User(email="admin@test.com", password_hash="hash", full_name="Admin", is_superuser=True) # Jófiú (aki valós boltokat tölt fel) good_user = User(email="good@test.com", password_hash="hash", full_name="Good Guy", reputation_score=5) # Rosszfiú (aki fake boltokat tölt fel) bad_user = User(email="bad@test.com", password_hash="hash", full_name="Spammer", reputation_score=-8) # Közel a banhoz # Szavazóközönség voter1 = User(email="voter1@test.com", password_hash="hash", full_name="Voter 1") voter2 = User(email="voter2@test.com", password_hash="hash", full_name="Voter 2") voter3 = User(email="voter3@test.com", password_hash="hash", full_name="Voter 3") voter4 = User(email="voter4@test.com", password_hash="hash", full_name="Voter 4") voter5 = User(email="voter5@test.com", password_hash="hash", full_name="Voter 5") db.add_all([admin, good_user, bad_user, voter1, voter2, voter3, voter4, voter5]) await db.commit() # ID-k lekérése for u in [good_user, bad_user, voter1, voter2, voter3, voter4, voter5]: await db.refresh(u) print("\n--- 3. VERSENY INDÍTÁSA ---") race = Competition( name="Nagy Januári Verseny", description="Töltsd fel a legtöbb boltot!", start_date=datetime.utcnow() - timedelta(days=1), end_date=datetime.utcnow() + timedelta(days=30), is_active=True ) db.add(race) await db.commit() await db.refresh(race) print("\n--- 4. SZCENÁRIÓ A: A JÓ FELHASZNÁLÓ ---") # Good Guy feltölt egy boltot good_shop = ServiceProvider( name="Korrekt Gumiszerviz", address="Fő utca 1.", added_by_user_id=good_user.id, status=ModerationStatus.pending ) db.add(good_shop) await db.commit() await db.refresh(good_shop) # A tömeg megszavazza (Kell 5 pont az elfogadáshoz) print(f"Szavazás a '{good_shop.name}' boltra...") await vote_for_provider(db, voter1.id, good_shop.id, 1) await vote_for_provider(db, voter2.id, good_shop.id, 1) await vote_for_provider(db, voter3.id, good_shop.id, 1) await vote_for_provider(db, voter4.id, good_shop.id, 1) await vote_for_provider(db, voter5.id, good_shop.id, 1) # Itt éri el az 5-öt! # Eredmény ellenőrzése await db.refresh(good_user) print(f"Good Guy Hírneve (Elvárt: 6): {good_user.reputation_score}") # Pontszám ellenőrzése points = await db.execute(text(f"SELECT points FROM data.user_scores WHERE user_id={good_user.id}")) scalar_points = points.scalar() print(f"Good Guy Verseny Pontjai (Elvárt: 10): {scalar_points}") print("\n--- 5. SZCENÁRIÓ B: A ROSSZ FELHASZNÁLÓ (AUTO-BAN TESZT) ---") # Bad Guy feltölt egy fake boltot fake_shop = ServiceProvider( name="KAMU Bolt", address="Nincs ilyen utca", added_by_user_id=bad_user.id, status=ModerationStatus.pending ) db.add(fake_shop) await db.commit() await db.refresh(fake_shop) # A tömeg leszavazza (Kell -3 az elutasításhoz) print(f"Szavazás a '{fake_shop.name}' boltra...") await vote_for_provider(db, voter1.id, fake_shop.id, -1) await vote_for_provider(db, voter2.id, fake_shop.id, -1) await vote_for_provider(db, voter3.id, fake_shop.id, -1) # Itt éri el a -3-at! # Eredmény ellenőrzése await db.refresh(bad_user) print(f"Bad User Hírneve (Elvárt: -10): {bad_user.reputation_score}") print(f"Bad User Aktív? (Elvárt: False/Banned): {bad_user.is_active}") if not bad_user.is_active: print("✅ SIKER: A rendszer automatikusan kitiltotta a csalót!") else: print("❌ HIBA: A felhasználó még mindig aktív.") if __name__ == "__main__": asyncio.run(run_simulation())