Add the tests for the update photo service and also improved the fixture

This commit is contained in:
Gustavo Henrique Santos Souza de Miranda 2025-07-21 16:30:54 -03:00
parent 32b1c24846
commit 44824cd690
2 changed files with 62 additions and 9 deletions

View File

@ -39,22 +39,26 @@ def session_with_one_diary(db_session):
@pytest.fixture @pytest.fixture
def session_with_photos(session_with_one_diary): def session_with_photos(session_with_one_diary):
"""
Fixture que usa a session_with_one_diary e adiciona duas fotos a ela.
"""
session, diary = session_with_one_diary session, diary = session_with_one_diary
# Usamos a mesma raiz de diretório que o mock do teste espera
diaries_root = "/fake/diaries_root"
photo1 = Photo( photo1 = Photo(
filepath=f"/fake/{diary.directory_name}/p1.jpg", name="Foto 1", # CORREÇÃO: O caminho agora inclui a raiz e a subpasta 'images'
photo_hash="hash1", fk_travel_diary_id=diary.id filepath=f"{diaries_root}/{diary.directory_name}/images/p1.jpg",
name="Foto 1",
photo_hash="hash1",
fk_travel_diary_id=diary.id
) )
photo2 = Photo( photo2 = Photo(
filepath=f"/fake/{diary.directory_name}/p2.jpg", name="Foto 2", filepath=f"{diaries_root}/{diary.directory_name}/images/p2.jpg",
photo_hash="hash2", fk_travel_diary_id=diary.id name="Foto 2",
photo_hash="hash2",
fk_travel_diary_id=diary.id
) )
session.add_all([photo1, photo2]) session.add_all([photo1, photo2])
session.commit() session.commit()
# Retornamos a sessão e os objetos criados para que os testes possam usá-los
return session, [photo1, photo2] return session, [photo1, photo2]

View File

@ -4,6 +4,8 @@ from pilgrim.service.photo_service import PhotoService
import hashlib import hashlib
from unittest.mock import patch from unittest.mock import patch
from pilgrim.models.photo import Photo from pilgrim.models.photo import Photo
from pilgrim.utils import DirectoryManager
@patch.object(PhotoService, '_copy_photo_to_diary') @patch.object(PhotoService, '_copy_photo_to_diary')
@patch.object(PhotoService, 'hash_file', return_value="fake_hash_123") @patch.object(PhotoService, 'hash_file', return_value="fake_hash_123")
@ -105,4 +107,51 @@ def test_check_photo_by_hash_returns_none_when_not_found(session_with_photos):
assert result1 is None assert result1 is None
invalid_diary_id = 999 invalid_diary_id = 999
result2 = service.check_photo_by_hash(existing_hash, invalid_diary_id) result2 = service.check_photo_by_hash(existing_hash, invalid_diary_id)
assert result2 is None assert result2 is None
def test_update_photo_metadata_successfully(session_with_photos):
session, photos = session_with_photos
service = PhotoService(session)
photo_to_update = photos[0]
photo_with_new_data = Photo(
filepath=photo_to_update.filepath,
name="Novo Nome da Foto",
caption="Nova legenda.",
photo_hash=photo_to_update.photo_hash, # Hash não muda
addition_date=photo_to_update.addition_date,
fk_travel_diary_id=photo_to_update.fk_travel_diary_id
)
updated_photo = service.update(photo_to_update, photo_with_new_data)
assert updated_photo is not None
assert updated_photo.name == "Novo Nome da Foto"
assert updated_photo.caption == "Nova legenda."
assert updated_photo.photo_hash == "hash1"
@patch.object(PhotoService, 'hash_file')
@patch('pathlib.Path.unlink')
@patch('pathlib.Path.exists')
@patch.object(PhotoService, '_copy_photo_to_diary')
@patch.object(DirectoryManager, 'get_diaries_root', return_value="/fake/diaries_root")
def test_update_photo_with_new_file_successfully(
mock_get_root, mock_copy, mock_exists, mock_unlink, mock_hash, session_with_photos
):
session, photos = session_with_photos
service = PhotoService(session)
photo_to_update = photos[0]
new_source_path = Path("/path/para/nova_imagem.jpg")
new_copied_path = Path(f"/fake/diaries_root/{photo_to_update.travel_diary.directory_name}/images/nova_imagem.jpg")
mock_copy.return_value = new_copied_path
mock_exists.return_value = True
mock_hash.return_value = "novo_hash_calculado"
photo_with_new_file = Photo(
filepath=new_source_path,
name=photo_to_update.name,
photo_hash="hash_antigo",
fk_travel_diary_id=photo_to_update.fk_travel_diary_id
)
updated_photo = service.update(photo_to_update, photo_with_new_file)
mock_copy.assert_called_once_with(new_source_path, photo_to_update.travel_diary)
mock_unlink.assert_called_once()
mock_hash.assert_called_once_with(new_copied_path)
assert updated_photo.filepath == str(new_copied_path)
assert updated_photo.photo_hash == "novo_hash_calculado"