Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ pyyaml
requests
python-multipart
python-dotenv
itsdangerous
itsdangerous
pytest
53 changes: 53 additions & 0 deletions test/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Автотесты для FastAPI-приложения

В проекте реализованы модульные тесты с использованием `pytest` для проверки основных эндпоинтов FastAPI-приложения.

## Установка зависимостей

1. Клонируйте репозиторий (если ещё не):
```bash
git clone <URL-репозитория>
cd lab_grader_web
```

2. Активируйте виртуальное окружение (если не создано — создайте):
```bash
python -m venv .venv
source .venv/bin/activate # для Linux/macOS
.venv\Scripts\activate # для Windows
```

3. Установите зависимости:
```bash
pip install -r requirements.txt
```

## .env файл

Перед запуском тестов убедитесь, что в корне проекта существует файл `.env` со следующими переменными:

```
ADMIN_LOGIN=admin
ADMIN_PASSWORD=password
SECRET_KEY=supersecret
GITHUB_TOKEN=dummy
```

## Запуск автотестов

Тесты расположены в директории `test/`.

Для запуска всех тестов:
```bash
pytest -v
```

Для проверки покрытия кода:
```bash
pytest --cov=main --cov-report=term-missing
```

## Структура тестов

- `test/test_auth.py` — тесты авторизации, проверки сессии и выхода
- `test/test_courses.py` — тесты эндпоинтов загрузки, редактирования, получения курсов и регистрации студентов
Empty file added test/__init__.py
Empty file.
99 changes: 99 additions & 0 deletions test/test_auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
from fastapi.testclient import TestClient
from main import app

client = TestClient(app)


def test_admin_login_success():
"""
Проверяет успешную аутентификацию администратора при корректных логине и пароле.
"""
response = client.post("/api/admin/login", json={
"login": "admin",
"password": "password"
})
assert response.status_code == 200
assert response.json() == {"authenticated": True}


def test_admin_login_failure():
"""
Проверяет, что при некорректных логине и пароле возвращается статус 401 (неавторизован)
"""
response = client.post("/api/admin/login", json={
"login": "wrong",
"password": "wrong"
})
assert response.status_code == 401


def test_logout_without_login():
"""
Проверяет, что выход из системы корректно очищает куки, даже если пользователь не был залогинен.
"""
response = client.post("/api/admin/logout")
assert response.status_code == 200
assert response.json() == {"message": "Logged out"}
assert "admin_session" not in response.cookies or not response.cookies.get("admin_session")


def test_check_auth_success():
"""
Проверяет успешную проверку авторизации при наличии действительного токена сессии администратора.
"""
login_response = client.post("/api/admin/login", json={
"login": "admin",
"password": "password"
})
assert login_response.status_code == 200
assert login_response.json()["authenticated"] is True

client.cookies.set("admin_session", login_response.cookies.get("admin_session"))

check_response = client.get("/api/admin/check-auth")
assert check_response.status_code == 200
assert check_response.json()["authenticated"] is True


def test_check_auth_missing_cookie():
"""
Проверяет поведение при отсутствии cookie сессии —
должен вернуться статус 401 и сообщение о её отсутствии.
"""
client.cookies.clear()
response = client.get("/api/admin/check-auth")
assert response.status_code == 401
assert response.json()["detail"] == "Нет сессии"


def test_check_auth_invalid_cookie():
"""
Проверяет реакцию системы на поддельный или недействительный токен авторизации —
ожидается 401 и сообщение об ошибке.
"""
client.cookies.set("admin_session", "fake-invalid-token")
response = client.get("/api/admin/check-auth")
assert response.status_code == 401
assert "Невалидная" in response.json()["detail"]


def test_logout_after_login():
"""
Проверяет, что после логина и последующего выхода из системы куки сессии корректно удаляются.
"""
client.cookies.clear()

login_response = client.post("/api/admin/login", json={
"login": "admin",
"password": "password"
})
assert login_response.status_code == 200

assert any(c.name == "admin_session" for c in client.cookies.jar)

logout_response = client.post("/api/admin/logout")
assert logout_response.status_code == 200
assert logout_response.json()["message"] == "Logged out"

assert not any(c.name == "admin_session" for c in client.cookies.jar)

Loading