Files
service-finder/backend/app/scripts/test_mlm_payout_simple.py
2026-06-04 07:26:22 +00:00

146 lines
6.4 KiB
Python

#!/usr/bin/env python3
"""
MLM Payout E2E teszt script (egyszerűsített).
Szimulál egy előfizetési fizetést (10,000 HUF) és ellenőrzi a CREDIT Wallet jóváírásokat L1, L2, L3 usereknek.
Futtatás: docker compose exec sf_api python3 /app/app/scripts/test_mlm_payout_simple.py
"""
import asyncio
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import select, update, func
from decimal import Decimal
from app.models.identity import User, Person, Wallet
from app.models.system.system import SystemParameter
from app.core.config import settings
async def test_mlm_payout():
engine = create_async_engine(settings.DATABASE_URL, echo=True)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async with async_session() as session:
print("=== MLM Payout E2E Teszt (Egyszerűsített) ===")
# 1. MLM paraméterek lekérése
print("\n1. MLM paraméterek lekérése...")
params = {}
for key in ["mlm_level1_percent", "mlm_level2_percent", "mlm_level3_percent"]:
stmt = select(SystemParameter).where(SystemParameter.key == key)
param = (await session.execute(stmt)).scalar_one_or_none()
if param:
params[key] = int(param.value.get("value", 0))
print(f" {key}: {params[key]}%")
else:
params[key] = 0
print(f" {key}: NINCS BEÁLLÍTVA!")
# 2. Meglévő teszt userek keresése vagy létrehozása
print("\n2. Teszt userek keresése...")
# L1 user keresése (root meghívó)
l1_stmt = select(User).where(User.email == "test_l1@example.com")
l1_user = (await session.execute(l1_stmt)).scalar_one_or_none()
if not l1_user:
print(" L1 user nem létezik, teszt adatok hiányoznak.")
print(" Futtasd először az init_mlm_parameters_fixed.py-t és regisztrálj néhány teszt usert!")
return
# L2 user keresése (L1 meghívja)
l2_stmt = select(User).where(User.email == "test_l2@example.com")
l2_user = (await session.execute(l2_stmt)).scalar_one_or_none()
# L3 user keresése (L2 meghívja)
l3_stmt = select(User).where(User.email == "test_l3@example.com")
l3_user = (await session.execute(l3_stmt)).scalar_one_or_none()
# L4 user keresése (fizető, L3 meghívja)
l4_stmt = select(User).where(User.email == "test_l4_payer@example.com")
l4_user = (await session.execute(l4_stmt)).scalar_one_or_none()
users = [l1_user, l2_user, l3_user, l4_user]
user_names = ["L1", "L2", "L3", "L4 (fizető)"]
for idx, (user, name) in enumerate(zip(users, user_names)):
if user:
print(f" {name}: {user.email} (ID: {user.id}, referred_by: {user.referred_by_id})")
else:
print(f" {name}: NEM LÉTEZIK")
# 3. Szimulált fizetés (10,000 HUF)
payment_amount = Decimal("10000.00")
print(f"\n3. Szimulált fizetés: {payment_amount} HUF (L4 user fizet)")
# 4. MLM lánc felépítése
print("\n4. MLM lánc felépítése...")
chain = []
if l4_user and l4_user.referred_by_id:
# L3 keresése
if l3_user and l3_user.id == l4_user.referred_by_id:
chain.append(l3_user)
# L2 keresése
if l3_user.referred_by_id:
if l2_user and l2_user.id == l3_user.referred_by_id:
chain.append(l2_user)
# L1 keresése
if l2_user.referred_by_id:
if l1_user and l1_user.id == l2_user.referred_by_id:
chain.append(l1_user)
print(f" Lánc hossza: {len(chain)}")
for idx, user in enumerate(chain):
print(f" L{idx+1}: {user.email} (ID: {user.id})")
# 5. Jutalékok kiszámítása és CREDIT Wallet jóváírás (szimuláció)
print("\n5. Jutalékok kiszámítása (szimuláció)...")
levels = ["mlm_level1_percent", "mlm_level2_percent", "mlm_level3_percent"]
for idx, referrer in enumerate(chain):
if idx >= 3:
break
percent = params[levels[idx]]
commission = (payment_amount * Decimal(percent) / Decimal(100)).quantize(Decimal("0.01"))
print(f" L{idx+1} ({referrer.email}): {percent}% -> {commission} HUF")
# CREDIT Wallet keresése
wallet_stmt = select(Wallet).where(
Wallet.user_id == referrer.id
)
wallet = (await session.execute(wallet_stmt)).scalar_one_or_none()
if wallet:
print(f" Wallet megtalálva: {wallet.balance} {wallet.currency}")
# Szimulált jóváírás
new_balance = wallet.balance + commission
print(f" Új egyenleg: {new_balance} {wallet.currency}")
else:
print(f" NINCS Wallet a usernek!")
# 6. API végpont tesztelése (GET /me/network)
print("\n6. API végpont tesztelése (GET /me/network)...")
if l1_user:
# L1 hálózatának lekérdezése
network_stmt = select(User).where(User.referred_by_id == l1_user.id)
network_result = await session.execute(network_stmt)
network_users = network_result.scalars().all()
print(f" L1 ({l1_user.email}) közvetlen meghívottai: {len(network_users)}")
for u in network_users:
print(f" - {u.email} (kód: {u.referral_code})")
print("\n✅ MLM Payout teszt (szimuláció) sikeresen lefutott!")
print("=== TESZT VÉGE ===")
print("\nJAVASLAT: A teljes teszteléshez:")
print("1. Regisztrálj 4 teszt usert láncolatban (L1 -> L2 -> L3 -> L4)")
print("2. Futtasd a valós billing engine-t a payment success eseménnyel")
print("3. Ellenőrizd a CREDIT Wallet egyenlegeket a pgAdmin-ban")
if __name__ == "__main__":
asyncio.run(test_mlm_payout())