gendesign/tradein-mvp/backend/tests/test_me_brand.py
bot-backend 5c37fcbfad
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
fix(tradein): praktika brand only under praktika account — drop kopylov mapping (brand leak)
2026-06-18 16:29:18 +03:00

60 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Tests for #657 brand-by-account — UserScope.brand resolution.
Pure-function tests against app.core.auth: brand slug привязывается к аккаунту
(ТОЛЬКО praktika → "praktika"), остальные юзеры — включая kopylov — → None.
get_user_scope прокидывает brand в scope, который /me отдаёт фронту.
Без БД и сети: читается реальный auth/roles.yaml (ancestor-walk внутри репо).
"""
from __future__ import annotations
import os
import sys
from unittest.mock import MagicMock
# DATABASE_URL required by config before any app import (см. test_dadata.py).
os.environ.setdefault("DATABASE_URL", "postgresql+psycopg://test:test@localhost:5432/test")
# WeasyPrint stub — not installed без GTK (consistent с прочими тестами).
_wp_mock = MagicMock()
sys.modules.setdefault("weasyprint", _wp_mock)
import pytest # noqa: E402
from app.core.auth import get_brand_for_user, get_user_scope # noqa: E402
@pytest.mark.parametrize(
("username", "expected"),
[
("praktika", "praktika"),
# kopylov больше НЕ брендируется как Практика (#657 brand leak fix):
# бренд резолвится по created_by при генерации PDF, поэтому утечка лого
# Практики в отчёты под kopylov исправляется тем, что kopylov → generic.
("kopylov", None),
("admin", None),
("user1", None),
("unknown_user", None),
],
)
def test_get_brand_for_user(username: str, expected: str | None) -> None:
assert get_brand_for_user(username) == expected
def test_user_scope_brand_none_for_kopylov() -> None:
# Регресс-гард на #657 brand leak: kopylov-оценки рендерят generic PDF.
scope = get_user_scope("kopylov")
assert scope["brand"] is None
assert scope["username"] == "kopylov"
def test_user_scope_carries_brand_for_praktika() -> None:
scope = get_user_scope("praktika")
assert scope["brand"] == "praktika"
assert scope["username"] == "praktika"
def test_user_scope_brand_none_for_generic_user() -> None:
scope = get_user_scope("user1")
assert scope["brand"] is None