BetterCallPraskovia/tests/unit/test_collection_use_cases.py
2025-12-23 12:08:28 +03:00

133 lines
5.6 KiB
Python

import pytest
from uuid import uuid4
from unittest.mock import AsyncMock
try:
from backend.src.application.use_cases.collection_use_cases import CollectionUseCases
from backend.src.shared.exceptions import NotFoundError, ForbiddenError
from backend.src.domain.repositories.collection_access_repository import ICollectionAccessRepository
except ImportError:
from src.application.use_cases.collection_use_cases import CollectionUseCases
from src.shared.exceptions import NotFoundError, ForbiddenError
from src.domain.repositories.collection_access_repository import ICollectionAccessRepository
class TestCollectionUseCases:
@pytest.fixture
def collection_use_cases(self, mock_collection_repository, mock_user_repository):
mock_access_repository = AsyncMock()
mock_access_repository.get_by_user_and_collection = AsyncMock(return_value=None)
mock_access_repository.create = AsyncMock()
mock_access_repository.delete_by_user_and_collection = AsyncMock(return_value=True)
mock_access_repository.list_by_user = AsyncMock(return_value=[])
return CollectionUseCases(
collection_repository=mock_collection_repository,
access_repository=mock_access_repository,
user_repository=mock_user_repository
)
@pytest.mark.asyncio
async def test_create_collection_success(self, collection_use_cases, mock_user,
mock_collection_repository, mock_user_repository):
owner_id = uuid4()
mock_user_repository.get_by_id = AsyncMock(return_value=mock_user)
mock_collection_repository.create = AsyncMock(return_value=mock_user)
result = await collection_use_cases.create_collection(
name="Тестовая коллекция",
owner_id=owner_id,
description="Описание",
is_public=False
)
assert result is not None
mock_user_repository.get_by_id.assert_called_once_with(owner_id)
mock_collection_repository.create.assert_called_once()
@pytest.mark.asyncio
async def test_create_collection_user_not_found(self, collection_use_cases, mock_user_repository):
owner_id = uuid4()
mock_user_repository.get_by_id = AsyncMock(return_value=None)
with pytest.raises(NotFoundError):
await collection_use_cases.create_collection(
name="Коллекция",
owner_id=owner_id
)
@pytest.mark.asyncio
async def test_get_collection_success(self, collection_use_cases, mock_collection, mock_collection_repository):
collection_id = uuid4()
mock_collection_repository.get_by_id = AsyncMock(return_value=mock_collection)
result = await collection_use_cases.get_collection(collection_id)
assert result == mock_collection
mock_collection_repository.get_by_id.assert_called_once_with(collection_id)
@pytest.mark.asyncio
async def test_get_collection_not_found(self, collection_use_cases, mock_collection_repository):
collection_id = uuid4()
mock_collection_repository.get_by_id = AsyncMock(return_value=None)
with pytest.raises(NotFoundError):
await collection_use_cases.get_collection(collection_id)
@pytest.mark.asyncio
async def test_update_collection_success(self, collection_use_cases, mock_collection, mock_collection_repository):
collection_id = uuid4()
user_id = uuid4()
mock_collection.owner_id = user_id
mock_collection_repository.get_by_id = AsyncMock(return_value=mock_collection)
mock_collection_repository.update = AsyncMock(return_value=mock_collection)
result = await collection_use_cases.update_collection(
collection_id=collection_id,
user_id=user_id,
name="Обновленное название"
)
assert result is not None
assert mock_collection.name == "Обновленное название"
@pytest.mark.asyncio
async def test_update_collection_forbidden(self, collection_use_cases, mock_collection, mock_collection_repository):
collection_id = uuid4()
user_id = uuid4()
owner_id = uuid4()
mock_collection.owner_id = owner_id
mock_collection_repository.get_by_id = AsyncMock(return_value=mock_collection)
with pytest.raises(ForbiddenError):
await collection_use_cases.update_collection(
collection_id=collection_id,
user_id=user_id,
name="Название"
)
@pytest.mark.asyncio
async def test_check_access_owner(self, collection_use_cases, mock_collection, mock_collection_repository):
collection_id = uuid4()
user_id = uuid4()
mock_collection.owner_id = user_id
mock_collection.is_public = False
mock_collection_repository.get_by_id = AsyncMock(return_value=mock_collection)
result = await collection_use_cases.check_access(collection_id, user_id)
assert result is True
@pytest.mark.asyncio
async def test_check_access_public(self, collection_use_cases, mock_collection, mock_collection_repository):
collection_id = uuid4()
user_id = uuid4()
owner_id = uuid4()
mock_collection.owner_id = owner_id
mock_collection.is_public = True
mock_collection_repository.get_by_id = AsyncMock(return_value=mock_collection)
result = await collection_use_cases.check_access(collection_id, user_id)
assert result is True