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

Тесты для бекенда

This commit is contained in:
MoonTestUse1
2025-01-04 03:22:23 +06:00
parent 0d543ed4f6
commit 2bde43c076
28 changed files with 740 additions and 990 deletions

View File

@@ -1,150 +1,72 @@
"""Request CRUD operations"""
"""Requests CRUD operations"""
from sqlalchemy.orm import Session
from sqlalchemy import func, text
from sqlalchemy import func
from typing import Optional, Dict
from ..models.request import Request, RequestStatus
from ..schemas.request import RequestCreate, RequestUpdate
from ..utils.loggers import request_logger
from typing import List, Optional
from enum import Enum
from ..schemas.request import RequestCreate
def create_request(db: Session, request: RequestCreate, employee_id: int):
def create_request(db: Session, request: RequestCreate, employee_id: int) -> Request:
"""Create new request"""
try:
db_request = Request(
title=request.title,
description=request.description,
priority=request.priority.value,
status=request.status.value,
employee_id=employee_id
)
db.add(db_request)
db.commit()
db.refresh(db_request)
request_logger.info(
"Request created",
extra={"request_id": db_request.id}
)
return db_request
except Exception as e:
db.rollback()
request_logger.error(f"Error creating request: {e}", exc_info=True)
raise
def get_request_details(db: Session, request_id: int):
"""Get detailed request information including employee details"""
request = (
db.query(Request)
.join(Request.employee)
.filter(Request.id == request_id)
.first()
db_request = Request(
department=request.department,
request_type=request.request_type,
description=request.description,
priority=request.priority,
status=RequestStatus.NEW,
employee_id=employee_id
)
if not request:
return None
return {
"id": request.id,
"employee_id": request.employee_id,
"employee_last_name": request.employee.last_name,
"employee_first_name": request.employee.first_name,
"title": request.title,
"description": request.description,
"priority": request.priority,
"status": request.status,
"created_at": request.created_at.isoformat()
}
def get_requests(db: Session, skip: int = 0, limit: int = 100) -> List[Request]:
"""Get all requests with pagination"""
return db.query(Request).offset(skip).limit(limit).all()
db.add(db_request)
db.commit()
db.refresh(db_request)
return db_request
def get_request(db: Session, request_id: int) -> Optional[Request]:
"""Get request by ID"""
return db.query(Request).filter(Request.id == request_id).first()
def get_employee_requests(db: Session, employee_id: int, skip: int = 0, limit: int = 100) -> List[Request]:
"""Get requests by employee ID"""
return db.query(Request).filter(Request.employee_id == employee_id).offset(skip).limit(limit).all()
def get_employee_requests(db: Session, employee_id: int) -> list[Request]:
"""Get employee's requests"""
return db.query(Request).filter(Request.employee_id == employee_id).all()
def update_request(db: Session, request_id: int, request: RequestUpdate):
"""Update request"""
db_request = get_request(db, request_id)
if not db_request:
return None
update_data = request.model_dump(exclude_unset=True)
for field, value in update_data.items():
if isinstance(value, Enum):
value = value.value
setattr(db_request, field, value)
db.commit()
db.refresh(db_request)
return db_request
def get_requests(db: Session, status: Optional[RequestStatus] = None, skip: int = 0, limit: int = 100) -> list[Request]:
"""Get all requests with optional status filter"""
query = db.query(Request)
if status:
query = query.filter(Request.status == status)
return query.offset(skip).limit(limit).all()
def delete_request(db: Session, request_id: int):
"""Delete request"""
def update_request_status(db: Session, request_id: int, status: RequestStatus) -> Optional[Request]:
"""Update request status"""
db_request = get_request(db, request_id)
if db_request:
db.delete(db_request)
db_request.status = status
db.commit()
db.refresh(db_request)
return db_request
def get_statistics(db: Session):
"""Get requests statistics"""
# Прямой SQL запрос для проверки таблицы
sql_check = db.execute(text("SELECT * FROM requests")).fetchall()
request_logger.info(f"Direct SQL check - all requests: {sql_check}")
def get_statistics(db: Session) -> Dict:
"""Get request statistics"""
total = db.query(func.count(Request.id)).scalar()
# Проверяем структуру таблицы
table_info = db.execute(text("""
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'requests'
""")).fetchall()
request_logger.info(f"Table structure: {table_info}")
# Получаем количество заявок по статусам
status_counts = db.query(
Request.status,
func.count(Request.id)
).group_by(Request.status).all()
# Проверяем все заявки через ORM
all_requests = db.query(Request).all()
request_logger.info(f"ORM check - Found {len(all_requests)} requests")
for req in all_requests:
request_logger.info(
f"Request #{req.id}: "
f"title='{req.title}', "
f"status='{req.status}', "
f"priority='{req.priority}', "
f"employee_id={req.employee_id}"
)
# Подсчитываем статусы
status_counts = {
RequestStatus.NEW.value: 0,
RequestStatus.IN_PROGRESS.value: 0,
RequestStatus.COMPLETED.value: 0,
RequestStatus.REJECTED.value: 0
# Инициализируем словарь всеми возможными статусами
by_status = {
RequestStatus.NEW: 0,
RequestStatus.IN_PROGRESS: 0,
RequestStatus.COMPLETED: 0,
RequestStatus.REJECTED: 0
}
# Прямой подсчет через SQL
for status in RequestStatus:
count = db.execute(
text(f"SELECT COUNT(*) FROM requests WHERE status = :status"),
{"status": status.value}
).scalar()
status_counts[status.value] = count
request_logger.info(f"SQL count for status {status.value}: {count}")
# Обновляем значения из базы
for status, count in status_counts:
by_status[status] = count
result = {
"total": len(all_requests),
"new": status_counts[RequestStatus.NEW.value],
"in_progress": status_counts[RequestStatus.IN_PROGRESS.value],
"completed": status_counts[RequestStatus.COMPLETED.value],
"rejected": status_counts[RequestStatus.REJECTED.value]
}
request_logger.info(f"Status counts: {status_counts}")
request_logger.info(f"Final statistics: {result}")
return result
return {
"total": total or 0,
"by_status": by_status
}

View File

@@ -1,53 +1,40 @@
"""Statistics CRUD operations"""
from sqlalchemy.orm import Session
from sqlalchemy.sql import func
from sqlalchemy import func
from datetime import datetime, timedelta
from ..models.request import Request, RequestStatus
def get_statistics(db: Session, period: str = "week"):
"""Get statistics for the given period"""
try:
# Calculate date range
end_date = datetime.now()
if period == "week":
start_date = end_date - timedelta(days=7)
elif period == "month":
start_date = end_date - timedelta(days=30)
else:
start_date = end_date - timedelta(days=7) # default to week
def get_request_statistics(db: Session):
"""Get request statistics"""
# Общее количество заявок
total_requests = db.query(func.count(Request.id)).scalar()
# Get total requests
total_requests = db.query(func.count(Request.id)).scalar() or 0
# Количество заявок по статусам
status_counts = {
RequestStatus.NEW: 0,
RequestStatus.IN_PROGRESS: 0,
RequestStatus.COMPLETED: 0,
RequestStatus.REJECTED: 0
}
# Get requests by status
requests_by_status = (
db.query(Request.status, func.count(Request.id))
.group_by(Request.status)
.all()
)
# Получаем количество заявок для каждого статуса
status_query = db.query(
Request.status,
func.count(Request.id)
).group_by(Request.status).all()
# Convert to dictionary
status_counts = {
status.name: 0 for status in RequestStatus
}
for status, count in requests_by_status:
status_counts[status.name] = count
for status, count in status_query:
if status in status_counts:
status_counts[status] = count
# Get recent requests
recent_requests = (
db.query(Request)
.filter(Request.created_at >= start_date)
.order_by(Request.created_at.desc())
.limit(5)
.all()
)
# Статистика за последние 7 дней
week_ago = datetime.now() - timedelta(days=7)
recent_requests = db.query(func.count(Request.id)).filter(
Request.created_at >= week_ago
).scalar()
return {
"total_requests": total_requests,
"status_counts": status_counts,
"recent_requests": recent_requests
}
except Exception as e:
print(f"Error getting statistics: {e}")
raise
return {
"total_requests": total_requests or 0,
"by_status": status_counts,
"recent_requests": recent_requests or 0
}

View File

@@ -0,0 +1,31 @@
"""Token CRUD operations"""
from sqlalchemy.orm import Session
from typing import Optional
from ..models.token import Token
def create_token(db: Session, token: str, user_id: int) -> Token:
"""Create new token"""
db_token = Token(token=token, user_id=user_id)
db.add(db_token)
db.commit()
db.refresh(db_token)
return db_token
def get_token(db: Session, token: str) -> Optional[Token]:
"""Get token by value"""
return db.query(Token).filter(Token.token == token).first()
def delete_token(db: Session, token: str) -> bool:
"""Delete token"""
db_token = get_token(db, token)
if db_token:
db.delete(db_token)
db.commit()
return True
return False
def delete_user_tokens(db: Session, user_id: int) -> bool:
"""Delete all tokens for a user"""
db.query(Token).filter(Token.user_id == user_id).delete()
db.commit()
return True