security: move credentials to .env file

- Remove hardcoded logins/passwords from conftest.py
- Load credentials via python-dotenv from .env (excluded from git)
- Add BASE_URL env variable for easy environment switching
- Add .env.example template for new contributors
- Add validation: clear error message if .env is not filled
- Add python-dotenv to requirements.txt
This commit is contained in:
VolandSZ
2026-08-28 10:39:08 +03:00
parent 365796452f
commit 642ee27588
3 changed files with 63 additions and 18 deletions

19
.env.example Normal file
View File

@ -0,0 +1,19 @@
# ============================================================
# ШАБЛОН .env — скопируй в .env и заполни реальными данными
# Команда: cp .env.example .env
# ============================================================
# Роль: Управление ветеринарии
VETDEPT_LOGIN=
VETDEPT_PASSWORD=
# Роль: Ветеринарная станция
VETSTATION_LOGIN=
VETSTATION_PASSWORD=
# Роль: Администрация (префектура)
PREFECTURE_LOGIN=
PREFECTURE_PASSWORD=
# Базовый URL портала
BASE_URL=https://vet.goznak.ru

View File

@ -1,5 +1,6 @@
playwright
pytest
pytest-playwright
pytest-xdist
pytest-html==3.2.0
playwright
pytest
pytest-playwright
pytest-xdist
pytest-html==3.2.0
python-dotenv

View File

@ -1,41 +1,66 @@
import os
import pytest
from dotenv import load_dotenv
from playwright.sync_api import Page
# Словарь с учетными данными для разных ролей
# Загружаем переменные из .env (файл находится в корне проекта)
load_dotenv()
# Базовый URL портала — берётся из .env или дефолт
BASE_URL = os.getenv("BASE_URL", "https://vet.goznak.ru")
# Словарь с учетными данными для разных ролей — берутся из .env
CREDENTIALS = {
"vetdept": {"login": "gz_vetdept@vet.goznak.ru", "password": "y2pyBAn7zw"},
"vetstation": {"login": "gz_vetstation@vet.goznak.ru", "password": "A6wrpzpD5T"},
"prefecture": {"login": "gz_prefecture@vet.goznak.ru", "password": "sbT9shGsbe"},
"vetdept": {
"login": os.getenv("VETDEPT_LOGIN"),
"password": os.getenv("VETDEPT_PASSWORD"),
},
"vetstation": {
"login": os.getenv("VETSTATION_LOGIN"),
"password": os.getenv("VETSTATION_PASSWORD"),
},
"prefecture": {
"login": os.getenv("PREFECTURE_LOGIN"),
"password": os.getenv("PREFECTURE_PASSWORD"),
},
}
@pytest.fixture(scope="function")
def role_page(page: Page, request):
"""
Фикстура, которая определяет роль теста и автоматически авторизует пользователя.
Учётные данные загружаются из файла .env (не хранятся в коде).
"""
# 2. Выполняем логин
role = None
for marker in request.node.iter_markers():
if marker.name in CREDENTIALS:
role = marker.name
break
# 3. Если маркер не найден, честно говорим об этом (вместо молчаливого NameError)
# Если маркер не найден, честно говорим об этом (вместо молчаливого NameError)
if role is None:
pytest.fail("ОШИБКА: У теста нет маркера роли (например, @pytest.mark.vetstation)!")
print(f"\n[АВТОЛОГИН] Выполняется вход под ролью: {role}")
page.goto("https://vet.goznak.ru")
creds = CREDENTIALS[role]
# Проверяем что .env заполнен
if not creds["login"] or not creds["password"]:
pytest.fail(
f"ОШИБКА: Переменные окружения для роли '{role}' не заданы. "
f"Скопируй .env.example в .env и заполни данные."
)
print(f"\n[АВТОЛОГИН] Выполняется вход под ролью: {role}")
page.goto(BASE_URL)
page.get_by_role("textbox", name="Email").fill(creds["login"])
page.get_by_role("textbox", name="Введите пароль").fill(creds["password"])
page.get_by_role("button", name="Войти в аккаунт").click()
page.wait_for_selector("#app", timeout=10000)
yield page
page.context.clear_cookies()