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:
19
.env.example
Normal file
19
.env.example
Normal 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
|
||||
@ -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
|
||||
@ -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()
|
||||
Reference in New Issue
Block a user