Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

34 back test unitarios User Service con pytest #69

Merged
merged 5 commits into from
Nov 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
19 changes: 4 additions & 15 deletions app/domain/users/repositories/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,13 @@ class UserSQLRepository(BaseSQLRepository[User]):
def __init__(self, session: AsyncSession = Depends(get_async_session)):
super().__init__(User, session)

async def create(self,*, create_req: CreateUserRequest) -> User:
async def create(self, *, create_req: CreateUserRequest) -> User:
new_user = User(username=create_req.username, email=create_req.email, password=create_req.password)
await self.add(model=new_user)
return new_user

async def get_by_username(self, username: str) -> Optional[User]:
return await self.get_one_by("username", username)
return await self.get_one_by("username", username)

async def get_all_users(self):
return await self.get_all()


# async def get_pending_todos(self) -> List[Todo]:
# todos = await self.session.exec(select(Todo).where(Todo.done == False))
# return todos.all()
#
# async def todo_done(self, todo_id: UUID) -> Todo:
# todo = await self.get(uid=todo_id)
# todo.done = True
# await self.save(model=todo, refresh=False)
# return todo
2 changes: 1 addition & 1 deletion poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Empty file removed test/business/__init__.py
Empty file.
Empty file.
32 changes: 0 additions & 32 deletions test/business/services/test_user.py

This file was deleted.

File renamed without changes.
129 changes: 129 additions & 0 deletions tests/test_user_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# tests/test_user_service.py

from unittest.mock import MagicMock
import pytest

from app.business.users.models.user import CreateUserRequest
from app.business.users.services.user import UserService
from app.domain.users.models.user import User
from app.domain.users.repositories.user import UserSQLRepository

SOME_USER_DATA = {"username": "testuser", "email": "[email protected]", "password": "testpassword"}
ANOTHER_USER_DATA = {"username": "anotheruser", "email": "[email protected]", "password": "anotherpassword"}


class TestUserService:

@pytest.fixture
def mock_repository(self):
return MagicMock(spec=UserSQLRepository)

@pytest.fixture
def user_service(self, mock_repository):
return UserService(repository=mock_repository)

@pytest.mark.asyncio
async def test_create_user(self, user_service, mock_repository):
# Given
create_req = CreateUserRequest(**SOME_USER_DATA)
expected_user = User(id=1, **SOME_USER_DATA)
mock_repository.create.return_value = expected_user

# When
actual_user = await user_service.create_user(create_req)

# Then
assert actual_user == expected_user
mock_repository.create.assert_called_once_with(create_req=create_req)

@pytest.mark.asyncio
async def test_authenticate_user_success(self, user_service, mock_repository):
# Given
username = SOME_USER_DATA["username"]
password = SOME_USER_DATA["password"]

mock_repository.get_by_username.return_value = User(id=1, **SOME_USER_DATA)

# When
result = await user_service.authenticate_user(username, password)

# Then
assert result is not None
assert result.username == username
assert result.password == password
mock_repository.get_by_username.assert_called_once_with(username)

@pytest.mark.asyncio
async def test_authenticate_user_failure(self, user_service, mock_repository):
# Given
username = SOME_USER_DATA["username"]
password = "wrong-password"

mock_repository.get_by_username.return_value = User(id=1, **SOME_USER_DATA)

# When
result = await user_service.authenticate_user(username, password)

# Then
assert result is None
mock_repository.get_by_username.assert_called_once_with(username)

@pytest.mark.asyncio
async def test_authenticate_user_user_not_found(self, user_service, mock_repository):
# Given
username = "nonexistentuser"
password = "testpassword"

# Mock the repository's get_by_username method to return None
mock_repository.get_by_username.return_value = None

# When
result = await user_service.authenticate_user(username, password)

# Then
assert result is None
mock_repository.get_by_username.assert_called_once_with(username)

@pytest.mark.asyncio
async def test_get_all_users(self, user_service, mock_repository):
# Given
expected_users = [
User(id=1, **SOME_USER_DATA),
User(id=2, **ANOTHER_USER_DATA)
]
mock_repository.get_all_users.return_value = expected_users

# When
actual_users = await user_service.get_all_users()

# Then
assert actual_users == expected_users
mock_repository.get_all_users.assert_called_once()

@pytest.mark.asyncio
async def test_exists_user_true(self, user_service, mock_repository):
# Given
username = SOME_USER_DATA["username"]

mock_repository.get_by_username.return_value = User(id=1, **SOME_USER_DATA)

# When
result = await user_service.exists_user(username)

# Then
assert result is True
mock_repository.get_by_username.assert_called_once_with(username)

@pytest.mark.asyncio
async def test_exists_user_false(self, user_service, mock_repository):
# Given
username = SOME_USER_DATA["username"]

mock_repository.get_by_username.return_value = None

# When
result = await user_service.exists_user(username)

# Then
assert result is False
mock_repository.get_by_username.assert_called_once_with(username)