1
0
mirror of https://gitlab.com/MoonTestUse1/AdministrationItDepartmens.git synced 2025-08-14 00:25:46 +02:00

Fix tests

This commit is contained in:
MoonTestUse1
2025-01-06 23:22:21 +06:00
parent f77782dabe
commit 161361609d
4 changed files with 101 additions and 38 deletions

View File

@@ -0,0 +1,36 @@
"""Test settings configuration"""
from pydantic_settings import BaseSettings, SettingsConfigDict
class TestSettings(BaseSettings):
"""Test application settings"""
PROJECT_NAME: str = "Support Service Test"
VERSION: str = "1.0.0"
API_V1_STR: str = "/api"
# Database
DATABASE_URL: str = "sqlite:///:memory:"
# JWT
SECRET_KEY: str = "test-secret-key"
ALGORITHM: str = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
# Redis
REDIS_HOST: str = "redis"
REDIS_PORT: int = 6379
# Admin
ADMIN_USERNAME: str = "admin"
ADMIN_PASSWORD: str = "admin123"
# Telegram
TELEGRAM_BOT_TOKEN: str = "test-bot-token"
TELEGRAM_CHAT_ID: str = "test-chat-id"
model_config = SettingsConfigDict(
env_file=".env.test",
env_file_encoding="utf-8",
case_sensitive=True
)
test_settings = TestSettings()

View File

@@ -8,8 +8,16 @@ from .models.employee import Employee # noqa
from .models.request import Request # noqa
from .models.token import Token # noqa
# Используем разные URL для тестов и продакшена
SQLALCHEMY_DATABASE_URL = settings.DATABASE_URL
def get_database_url():
"""Получение URL базы данных в зависимости от окружения."""
try:
from .core.test_config import test_settings
return test_settings.DATABASE_URL
except ImportError:
return settings.DATABASE_URL
# Используем правильный URL для базы данных
SQLALCHEMY_DATABASE_URL = get_database_url()
# Создаем движок с нужными параметрами
connect_args = {}

View File

@@ -2,6 +2,7 @@
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy.orm import Session
from pydantic_settings import BaseSettings
from .models.base import Base
from .database import engine, SessionLocal
@@ -9,9 +10,11 @@ from .routers import admin, employees, requests, auth, statistics
from .db.init_db import init_db
from .core.config import settings
# Создаем таблицы только если не в тестовом режиме
if not settings.TESTING:
def get_application(app_settings: BaseSettings = settings) -> FastAPI:
"""Создание экземпляра приложения с заданными настройками."""
# Создаем таблицы
Base.metadata.create_all(bind=engine)
# Инициализируем базу данных
db = SessionLocal()
try:
@@ -19,37 +22,41 @@ if not settings.TESTING:
finally:
db.close()
app = FastAPI(
# Включаем автоматическое перенаправление со слэшем
redirect_slashes=True,
# Добавляем описание API
title="Support System API",
description="API для системы поддержки",
version="1.0.0"
)
app = FastAPI(
# Включаем автоматическое перенаправление со слэшем
redirect_slashes=True,
# Добавляем описание API
title="Support System API",
description="API для системы поддержки",
version="1.0.0"
)
# CORS configuration
origins = [
"http://localhost",
"http://localhost:8080",
"http://localhost:5173",
"http://127.0.0.1:5173",
"http://127.0.0.1:8080",
"http://185.139.70.62", # Добавляем ваш production домен
]
# CORS configuration
origins = [
"http://localhost",
"http://localhost:8080",
"http://localhost:5173",
"http://127.0.0.1:5173",
"http://127.0.0.1:8080",
"http://185.139.70.62", # Добавляем ваш production домен
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
expose_headers=["*"]
)
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
expose_headers=["*"]
)
# Include routers
app.include_router(auth.router, prefix="/api/auth", tags=["auth"])
app.include_router(employees.router, prefix="/api/employees", tags=["employees"])
app.include_router(requests.router, prefix="/api/requests", tags=["requests"])
app.include_router(admin.router, prefix="/api/admin", tags=["admin"])
app.include_router(statistics.router, prefix="/api/statistics", tags=["statistics"])
# Include routers
app.include_router(auth.router, prefix="/api/auth", tags=["auth"])
app.include_router(employees.router, prefix="/api/employees", tags=["employees"])
app.include_router(requests.router, prefix="/api/requests", tags=["requests"])
app.include_router(admin.router, prefix="/api/admin", tags=["admin"])
app.include_router(statistics.router, prefix="/api/statistics", tags=["statistics"])
return app
app = get_application()

View File

@@ -2,14 +2,25 @@
import pytest
from typing import Generator
from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
from unittest.mock import patch
from .test_config import engine, TestingSessionLocal
from app.core.test_config import test_settings
from app.database import get_db
from app.models.base import Base
from app.models.employee import Employee
from app.utils.auth import get_password_hash
# Создаем тестовую базу данных в памяти
engine = create_engine(
test_settings.DATABASE_URL,
connect_args={"check_same_thread": False},
poolclass=StaticPool
)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
class MockRedis:
"""Мок для Redis."""
def __init__(self):
@@ -55,14 +66,15 @@ def db() -> Generator:
@pytest.fixture(scope="function")
def client(db: TestingSessionLocal, redis_mock) -> Generator:
"""Фикстура для создания тестового клиента."""
from app.main import app
def override_get_db():
try:
yield db
finally:
db.close()
# Импортируем app здесь, чтобы использовать тестовые настройки
from app.main import get_application
app = get_application(test_settings)
app.dependency_overrides[get_db] = override_get_db
return TestClient(app)