From 44824cd6901a2d94af50a875b7f54ce7d3370af1 Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Santos Souza de Miranda Date: Mon, 21 Jul 2025 16:30:54 -0300 Subject: [PATCH] Add the tests for the update photo service and also improved the fixture --- tests/conftest.py | 20 ++++++----- tests/service/test_photo_service.py | 51 ++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 7232c5a..66b44a1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -39,22 +39,26 @@ def session_with_one_diary(db_session): @pytest.fixture 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 + # Usamos a mesma raiz de diretório que o mock do teste espera + diaries_root = "/fake/diaries_root" + photo1 = Photo( - filepath=f"/fake/{diary.directory_name}/p1.jpg", name="Foto 1", - photo_hash="hash1", fk_travel_diary_id=diary.id + # CORREÇÃO: O caminho agora inclui a raiz e a subpasta 'images' + filepath=f"{diaries_root}/{diary.directory_name}/images/p1.jpg", + name="Foto 1", + photo_hash="hash1", + fk_travel_diary_id=diary.id ) photo2 = Photo( - filepath=f"/fake/{diary.directory_name}/p2.jpg", name="Foto 2", - photo_hash="hash2", fk_travel_diary_id=diary.id + filepath=f"{diaries_root}/{diary.directory_name}/images/p2.jpg", + name="Foto 2", + photo_hash="hash2", + fk_travel_diary_id=diary.id ) session.add_all([photo1, photo2]) session.commit() - # Retornamos a sessão e os objetos criados para que os testes possam usá-los return session, [photo1, photo2] \ No newline at end of file diff --git a/tests/service/test_photo_service.py b/tests/service/test_photo_service.py index 4f4ec0a..636dd36 100644 --- a/tests/service/test_photo_service.py +++ b/tests/service/test_photo_service.py @@ -4,6 +4,8 @@ from pilgrim.service.photo_service import PhotoService import hashlib from unittest.mock import patch from pilgrim.models.photo import Photo +from pilgrim.utils import DirectoryManager + @patch.object(PhotoService, '_copy_photo_to_diary') @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 invalid_diary_id = 999 result2 = service.check_photo_by_hash(existing_hash, invalid_diary_id) - assert result2 is None \ No newline at end of file + 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" \ No newline at end of file