Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
0f65f15
add: In database-connection.md added a block with package installation
Tminww Jul 7, 2025
860119e
fix: rewrite pkg installation
Tminww Jul 7, 2025
c4a6712
fix: Не нашел такого атрибута для кваргов, как application_name.
Tminww Jul 7, 2025
acdcb7b
fix: Переписал параметры подключения списком, чтобы написать что кажд…
Tminww Jul 7, 2025
f82f4ea
add: Установка psycopg_pool
Tminww Jul 7, 2025
2c523b7
Исправил порядок импортов
Tminww Jul 20, 2025
b5e6d37
Опечатка в написании команды pytest -v
Tminww Jul 20, 2025
85583ad
datetime.utcnow() -> datetime.now()
Tminww Jul 20, 2025
890b980
add: Добавил в реализацию функции create_user(dto: dict) вставку поля…
Tminww Jul 20, 2025
ad67d1d
fix: Исправил тест test_create_user_error, который не проходил из-за …
Tminww Jul 20, 2025
d973882
fix: Передавался лишний третий параметр (post_id, user_id, post_id) -…
Tminww Jul 20, 2025
dff6a48
fix: Убрал передачу параметра created_at = NOW() для создания пользов…
Tminww Jul 20, 2025
7551943
add: Добавил требование чтобы created_at проставлялось автоматически
Tminww Jul 23, 2025
4ce9b26
fix
Tminww Jul 23, 2025
6b0dc40
fix: Изменил валидацию в моделях Pydantic так, чтобы она соответствов…
Tminww Sep 9, 2025
a883875
fix: Post controller
Tminww Sep 9, 2025
b153b54
fix: For pydantic V2 orm_mode -> from_attributes
Tminww Sep 9, 2025
fe202e8
try: Попробовал добавить тесты для постов
Tminww Sep 9, 2025
1a11a7a
Merge branch 'main' of github.com:Tminww/shekshuev.github.io
Tminww Sep 9, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,4 @@ class PostReadDTO(BaseModel):
views_count: int

class Config:
orm_mode = True
from_attributes = True
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,4 @@ class ReadUserDTO(BaseModel):
status: int

class Config:
orm_mode = True
from_attributes = True
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
import pytest
from fastapi.testclient import TestClient
from unittest.mock import patch
from app import app

client = TestClient(app)


@pytest.fixture
def mock_token_header():
return {"Authorization": "Bearer mockToken"}

@pytest.fixture
def mock_user_dto():
return {
"id": 1,
"user_name": "test_user",
"first_name": "John",
"last_name": "Doe",
"status": 1
}

@pytest.fixture
def mock_update_dto():
return {
"id": 1,
"user_name": "test_user",
"first_name": "Jane",
"last_name": "Smith",
"status": 1
}


@pytest.fixture
def mock_post_dto():
return {
"id": 1,
"user_id": 1,
"content": "Test post content",
"reply_to_id": None,
"created_at": "2024-01-01T10:00:00",
"likes_count": 0,
"views_count": 0
}


@pytest.fixture
def mock_post_create_dto():
return {
"content": "Test post content",
"reply_to_id": None
}


@pytest.fixture
def mock_posts_list(mock_post_dto):
return [mock_post_dto]


def test_get_all_posts_success(mock_token_header, mock_posts_list, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.get_all_posts", return_value=mock_posts_list):
response = client.get("/api/posts?limit=10&offset=0", headers=mock_token_header)

assert response.status_code == 200
assert response.json() == mock_posts_list


def test_get_all_posts_with_filters_success(mock_token_header, mock_posts_list, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.get_all_posts", return_value=mock_posts_list):
response = client.get(
"/api/posts?limit=5&offset=10&reply_to_id=2&owner_id=3&search=test",
headers=mock_token_header
)

assert response.status_code == 200
assert response.json() == mock_posts_list


def test_get_all_posts_failure(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.get_all_posts", side_effect=Exception("Service error")):
response = client.get("/api/posts", headers=mock_token_header)

assert response.status_code == 400
assert response.json() == {"detail": "Service error"}


def test_create_post_success(mock_token_header, mock_post_create_dto, mock_post_dto, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.create_post", return_value=mock_post_dto):
response = client.post("/api/posts", headers=mock_token_header, json=mock_post_create_dto)

assert response.status_code == 201
assert response.json() == mock_post_dto


def test_create_post_failure(mock_token_header, mock_post_create_dto, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.create_post", side_effect=Exception("Service error")):
response = client.post("/api/posts", headers=mock_token_header, json=mock_post_create_dto)

assert response.status_code == 400
assert response.json() == {"detail": "Service error"}


def test_create_post_validation_failure(mock_token_header, mock_user):
invalid_dto = {"content": ""} # пустой контент
with patch("controllers.post_controller.get_current_user", return_value=mock_user):
response = client.post("/api/posts", headers=mock_token_header, json=invalid_dto)

assert response.status_code == 422


def test_delete_post_success(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.delete_post", return_value=None):
response = client.delete("/api/posts/1", headers=mock_token_header)

assert response.status_code == 204


def test_delete_post_invalid_id(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user):
response = client.delete("/api/posts/abc", headers=mock_token_header)

assert response.status_code == 422


def test_delete_post_not_found(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.delete_post", side_effect=Exception("Post not found")):
response = client.delete("/api/posts/999", headers=mock_token_header)

assert response.status_code == 404
assert response.json() == {"detail": "Post not found"}


def test_delete_post_zero_id(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user):
response = client.delete("/api/posts/0", headers=mock_token_header)

assert response.status_code == 422


def test_view_post_success(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.view_post", return_value=None):
response = client.post("/api/posts/1/view", headers=mock_token_header)

assert response.status_code == 201


def test_view_post_invalid_id(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user):
response = client.post("/api/posts/abc/view", headers=mock_token_header)

assert response.status_code == 422


def test_view_post_not_found(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.view_post", side_effect=Exception("Post not found")):
response = client.post("/api/posts/999/view", headers=mock_token_header)

assert response.status_code == 404
assert response.json() == {"detail": "Post not found"}


def test_like_post_success(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.like_post", return_value=None):
response = client.post("/api/posts/1/like", headers=mock_token_header)

assert response.status_code == 201


def test_like_post_invalid_id(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user):
response = client.post("/api/posts/abc/like", headers=mock_token_header)

assert response.status_code == 422


def test_like_post_not_found(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.like_post", side_effect=Exception("Post not found")):
response = client.post("/api/posts/999/like", headers=mock_token_header)

assert response.status_code == 404
assert response.json() == {"detail": "Post not found"}


def test_dislike_post_success(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.dislike_post", return_value=None):
response = client.delete("/api/posts/1/like", headers=mock_token_header)

assert response.status_code == 204


def test_dislike_post_invalid_id(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user):
response = client.delete("/api/posts/abc/like", headers=mock_token_header)

assert response.status_code == 422


def test_dislike_post_not_found(mock_token_header, mock_user):
with patch("controllers.post_controller.get_current_user", return_value=mock_user), \
patch("services.post_service.dislike_post", side_effect=Exception("Post not found")):
response = client.delete("/api/posts/999/like", headers=mock_token_header)

assert response.status_code == 404
assert response.json() == {"detail": "Post not found"}
Loading