Files
service-finder/tests/active/seed_commission_test_data.py
2026-07-24 09:56:21 +00:00

181 lines
7.8 KiB
Python

"""
Seed test data for Commission Distribution verification.
Creates:
1. Three users with a referral chain: UserC (buyer) -> UserB (Gen1) -> UserA (Gen2)
2. An active L2_COMMISSION rule with commission_percent and upline_commission_percent
Usage:
docker compose exec sf_api python /app/backend/tests/active/seed_commission_test_data.py
"""
import asyncio
import os
import sys
sys.path.insert(0, "/app/backend")
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
from sqlalchemy import text
from datetime import date
async def seed():
database_url = os.getenv(
"DATABASE_URL",
"postgresql+asyncpg://service_finder:service_finder@postgres:5432/service_finder",
)
engine = create_async_engine(database_url, echo=False)
async_session = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async with async_session() as db:
# Check if test users already exist
existing = await db.execute(
text("SELECT id, email FROM identity.users WHERE email LIKE 'commission_test_%' ORDER BY id")
)
existing_users = existing.fetchall()
if existing_users:
print(f"⚠️ Test users already exist: {[u.email for u in existing_users]}")
print(" Skipping user creation.")
# Find the chain
result = await db.execute(
text("""
SELECT u1.id AS buyer_id, u1.email AS buyer_email,
u2.id AS gen1_id, u2.email AS gen1_email,
u3.id AS gen2_id, u3.email AS gen2_email
FROM identity.users u1
JOIN identity.users u2 ON u1.referred_by_id = u2.id
JOIN identity.users u3 ON u2.referred_by_id = u3.id
WHERE u1.email = 'commission_test_buyer@test.com'
""")
)
row = result.fetchone()
if row:
print(f"\n✅ Referral chain intact:")
print(f" Buyer(Gen0): ID={row.buyer_id} < {row.buyer_email}")
print(f" Gen1: ID={row.gen1_id} < {row.gen1_email}")
print(f" Gen2: ID={row.gen2_id} < {row.gen2_email}")
else:
print("Creating test users with referral chain...")
# Create Gen2 (top-level referrer) - UserA
result = await db.execute(
text("""
INSERT INTO identity.users
(email, hashed_password, role, commission_tier, is_active, ui_mode,
subscription_plan, is_vip, is_deleted, preferred_language,
region_code, preferred_currency, scope_level,
custom_permissions, alternative_emails, email_history,
visual_settings, created_at)
VALUES
('commission_test_gen2@test.com', 'abc123', 'USER', 'STANDARD', TRUE, 'personal',
'free', FALSE, FALSE, 'hu',
'HU', 'HUF', 'user',
'{}'::json, '[]'::json, '[]'::json,
'{}'::jsonb, NOW())
RETURNING id
""")
)
gen2_id = result.scalar()
print(f" Created Gen2 (Upline): ID={gen2_id}")
# Create Gen1 (referrer) - UserB, referred by Gen2
result = await db.execute(
text("""
INSERT INTO identity.users
(email, hashed_password, role, commission_tier, is_active, ui_mode,
referred_by_id,
subscription_plan, is_vip, is_deleted, preferred_language,
region_code, preferred_currency, scope_level,
custom_permissions, alternative_emails, email_history,
visual_settings, created_at)
VALUES
('commission_test_gen1@test.com', 'abc123', 'USER', 'STANDARD', TRUE, 'personal',
:gen2_id,
'free', FALSE, FALSE, 'hu',
'HU', 'HUF', 'user',
'{}'::json, '[]'::json, '[]'::json,
'{}'::jsonb, NOW())
RETURNING id
""").bindparams(gen2_id=gen2_id)
)
gen1_id = result.scalar()
print(f" Created Gen1 (Referrer): ID={gen1_id}")
# Create Buyer (Gen0) - UserC, referred by Gen1
result = await db.execute(
text("""
INSERT INTO identity.users
(email, hashed_password, role, commission_tier, is_active, ui_mode,
referred_by_id,
subscription_plan, is_vip, is_deleted, preferred_language,
region_code, preferred_currency, scope_level,
custom_permissions, alternative_emails, email_history,
visual_settings, created_at)
VALUES
('commission_test_buyer@test.com', 'abc123', 'USER', 'STANDARD', TRUE, 'personal',
:gen1_id,
'free', FALSE, FALSE, 'hu',
'HU', 'HUF', 'user',
'{}'::json, '[]'::json, '[]'::json,
'{}'::jsonb, NOW())
RETURNING id
""").bindparams(gen1_id=gen1_id)
)
buyer_id = result.scalar()
print(f" Created Buyer (Gen0): ID={buyer_id}")
print(f"\n✅ Referral chain created:")
print(f" Buyer(Gen0): ID={buyer_id} -> referred_by={gen1_id}")
print(f" Gen1: ID={gen1_id} -> referred_by={gen2_id}")
print(f" Gen2: ID={gen2_id}")
# Check for existing L2_COMMISSION rules
rule_result = await db.execute(
text("""
SELECT id, name, commission_percent, upline_commission_percent,
commission_max_amount, is_active
FROM marketplace.commission_rules
WHERE rule_type = 'L2_COMMISSION'
ORDER BY id
""")
)
existing_rules = rule_result.fetchall()
if existing_rules:
print(f"\n⚠️ L2_COMMISSION rules already exist:")
for r in existing_rules:
print(f" ID={r.id}, Name={r.name}, Active={r.is_active}, "
f"commission={r.commission_percent}%, upline={r.upline_commission_percent}%, "
f"max={r.commission_max_amount}")
else:
print("\nCreating L2_COMMISSION rule...")
result = await db.execute(
text("""
INSERT INTO marketplace.commission_rules
(rule_type, name, description, tier, region_code,
commission_percent, upline_commission_percent,
commission_max_amount, is_campaign, is_active,
start_date, end_date, created_by)
VALUES
('L2_COMMISSION', 'Standard 2-Level Commission', 'Default 2-level MLM commission rule',
'STANDARD', 'HU',
5.00, 2.00,
50000.00, FALSE, TRUE,
:start_date, NULL, 1)
RETURNING id
""").bindparams(start_date=date(2026, 1, 1))
)
rule_id = result.scalar()
print(f" Created L2_COMMISSION rule: ID={rule_id}")
print(f" commission_percent=5.00%, upline_commission_percent=2.00%, max=50000.00")
await db.commit()
print("\n✅ Seed data created successfully!")
await engine.dispose()
if __name__ == "__main__":
asyncio.run(seed())