forked from HSE_team/BetterCallPraskovia
133 lines
5.6 KiB
Python
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
|