Files
ss-tools/backend/src/scripts/create_admin.py
busya 4dce669844 fix(tests): 61 failed backend unit tests — async/await mocks, deadlock fix, SyntaxError repairs
Группы исправлений:
- Группа 1 (async/await misuse): MagicMock → AsyncMock для get_dashboards,
  export_dashboard, import_dashboard, sync_environment, get_run_detail,
  list_all_runs, create_task и др. — 23 теста
- Группа 2 (runner.run deadlock): добавлены моки get_async_job_runner +
  IdMappingService/AsyncSupersetClient в migration plugin + API tests
  для предотвращения вечной блокировки future.result() — 16 тестов
- Группа 3 (SyntaxError): исправлены 7 незакрытых скобок ')' в
  test_validation_tasks_comprehensive.py (QA-агент оставил AsyncMock
  без закрывающих скобок)
- Группа 4 (mock verification): logger mock error→explore, scheduler tests
  skipped (удалён из production), dataset mapper — 11 тестов
- Группа 5 (search/assistant): MagicMock → AsyncMock — 9 тестов
- Группа 6 (extractor parsing): AsyncMock для async методов — 9 тестов

Итого: 61 ранее FAILED → 274 passed, 4 skipped, 0 failed
2026-06-18 14:41:13 +03:00

99 lines
3.4 KiB
Python

# #region CreateAdminScript [C:5] [TYPE Module] [SEMANTICS admin, search, user, cli]
# @defgroup Module Module group.
#
# @BRIEF CLI tool for creating the initial admin user.
# @LAYER Infrastructure
# @RELATION CALLS -> [AuthSecurityModule]
# @RELATION CALLS -> [DatabaseModule]
# @RELATION CALLS -> [AuthModels]
#
# @INVARIANT Admin user must have the "Admin" role.
# @SIDE_EFFECT Writes admin user to database
# @DATA_CONTRACT CLIArgs -> AdminUser
import argparse
from pathlib import Path
import sys
# Add src to path
sys.path.append(str(Path(__file__).parent.parent.parent))
from src.core.auth.security import get_password_hash
from src.core.cot_logger import seed_trace_id
from src.core.database import AuthSessionLocal, init_db
from src.core.logger import belief_scope, logger
from src.models.auth import Role, User
# #region create_admin [TYPE Function]
# @ingroup Module
# @BRIEF Creates an admin user and necessary roles/permissions.
# @PRE username and password provided via CLI.
# @POST Admin user exists in auth.db.
#
def create_admin(username, password, email=None):
seed_trace_id()
with belief_scope("create_admin"):
db = AuthSessionLocal()
try:
normalized_email = (
email.strip() if isinstance(email, str) and email.strip() else None
)
# 1. Ensure Admin role exists
admin_role = db.query(Role).filter(Role.name == "Admin").first()
if not admin_role:
logger.reason("Creating Admin role")
admin_role = Role(name="Admin", description="System Administrator")
db.add(admin_role)
db.commit()
db.refresh(admin_role)
# 2. Check if user already exists
existing_user = db.query(User).filter(User.username == username).first()
if existing_user:
logger.reflect("User already exists", payload={"username": username})
return "exists"
# 3. Create Admin user
logger.reason("Creating admin user", payload={"username": username})
new_user = User(
username=username,
email=normalized_email,
password_hash=get_password_hash(password),
auth_source="LOCAL",
is_active=True,
)
new_user.roles.append(admin_role)
db.add(new_user)
db.commit()
logger.reason("Admin user created successfully", payload={"username": username})
return "created"
except Exception as e:
logger.explore("Failed to create admin user", payload={"username": username}, error=str(e))
db.rollback()
raise
finally:
db.close()
# #endregion create_admin
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Create initial admin user")
parser.add_argument("--username", required=True, help="Admin username")
parser.add_argument("--password", required=True, help="Admin password")
parser.add_argument("--email", required=False, help="Admin email")
args = parser.parse_args()
try:
# Ensure DB is initialized before creating admin
init_db()
create_admin(args.username, args.password, args.email)
sys.exit(0)
except Exception:
sys.exit(1)
# #endregion CreateAdminScript