From 2f81e4ff06a57a03c66be171c3988a11ab174e1a Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Santos Souza de Miranda Date: Mon, 21 Jul 2025 02:28:04 -0300 Subject: [PATCH 1/2] Add the tests for the hash methods and the create methods --- tests/service/test_photo_service.py | 56 +++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 tests/service/test_photo_service.py diff --git a/tests/service/test_photo_service.py b/tests/service/test_photo_service.py new file mode 100644 index 0000000..a3f595f --- /dev/null +++ b/tests/service/test_photo_service.py @@ -0,0 +1,56 @@ +import pytest +from pathlib import Path +from pilgrim.service.photo_service import PhotoService +import hashlib +from unittest.mock import patch +from pilgrim.models.photo import Photo + +@patch.object(PhotoService, '_copy_photo_to_diary') +@patch.object(PhotoService, 'hash_file', return_value="fake_hash_123") +def test_create_photo_successfully(mock_hash, mock_copy, session_with_one_diary): + session, diary = session_with_one_diary + service = PhotoService(session) + fake_source_path = Path("/path/original/imagem.jpg") + fake_copied_path = Path(f"~/.pilgrim/diaries/{diary.directory_name}/images/imagem.jpg") + mock_copy.return_value = fake_copied_path + new_photo = service.create( + filepath=fake_source_path, + name="Foto da Praia", + travel_diary_id=diary.id, + caption="Pôr do sol") + mock_hash.assert_called_once_with(fake_source_path) + mock_copy.assert_called_once_with(fake_source_path, diary) + assert new_photo is not None + assert new_photo.name == "Foto da Praia" + assert new_photo.photo_hash == "fake_hash_123" + assert new_photo.filepath == str(fake_copied_path) + +def test_hash_file_generates_correct_hash(tmp_path: Path): + original_content_bytes = b"um conteudo de teste para o hash" + file_on_disk = tmp_path / "test.jpg" + file_on_disk.write_bytes(original_content_bytes) + hash_from_file = PhotoService.hash_file(file_on_disk) + expected_hash_func = hashlib.new('sha3_384') + expected_hash_func.update(original_content_bytes) + hash_from_memory = expected_hash_func.hexdigest() + assert hash_from_file == hash_from_memory + +@patch.object(PhotoService, '_copy_photo_to_diary') +@patch.object(PhotoService, 'hash_file', return_value="hash_ja_existente") +def test_create_photo_returns_none_if_hash_exists(mock_hash, mock_copy, session_with_one_diary): + session, diary = session_with_one_diary + existing_photo = Photo( + filepath="/path/existente.jpg", name="Foto Antiga", + photo_hash="hash_ja_existente", fk_travel_diary_id=diary.id + ) + session.add(existing_photo) + session.commit() + + service = PhotoService(session) + new_photo = service.create( + filepath=Path("/path/novo/arquivo.jpg"), + name="Foto Nova", + travel_diary_id=diary.id + ) + assert new_photo is None + mock_copy.assert_not_called() From 5f20bd3624d2c9e4c7f8a2d05ff63b6ec8f817ec Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Santos Souza de Miranda Date: Mon, 21 Jul 2025 02:48:04 -0300 Subject: [PATCH 2/2] Add the tests for the read methods for the photo service --- tests/conftest.py | 24 +++++++++++++ tests/service/test_photo_service.py | 52 +++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 0c1ce17..7232c5a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,6 +2,7 @@ import pytest from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker +from pilgrim import Photo from pilgrim.database import Base from pilgrim.models.travel_diary import TravelDiary @@ -34,3 +35,26 @@ def session_with_one_diary(db_session): db_session.commit() db_session.refresh(diary) return db_session, diary + + +@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 + + photo1 = Photo( + filepath=f"/fake/{diary.directory_name}/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 + ) + + 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 a3f595f..4f4ec0a 100644 --- a/tests/service/test_photo_service.py +++ b/tests/service/test_photo_service.py @@ -54,3 +54,55 @@ def test_create_photo_returns_none_if_hash_exists(mock_hash, mock_copy, session_ ) assert new_photo is None mock_copy.assert_not_called() + +def test_read_by_id_successfully(session_with_photos): + session, photos = session_with_photos + service = PhotoService(session) + photo_to_find_id = photos[0].id + found_photo = service.read_by_id(photo_to_find_id) + assert found_photo is not None + assert found_photo.id == photo_to_find_id + assert found_photo.name == "Foto 1" + +def test_read_by_id_returns_none_for_invalid_id(db_session): + service = PhotoService(db_session) + result = service.read_by_id(999) + assert result is None + +def test_read_all_returns_all_photos(session_with_photos): + session, _ = session_with_photos + service = PhotoService(session) + all_photos = service.read_all() + + assert isinstance(all_photos, list) + assert len(all_photos) == 2 + assert all_photos[0].name == "Foto 1" + assert all_photos[1].name == "Foto 2" + +def test_read_all_returns_empty_list_for_empty_db(db_session): + service = PhotoService(db_session) + all_photos = service.read_all() + assert isinstance(all_photos, list) + assert len(all_photos) == 0 + +def test_check_photo_by_hash_finds_existing_photo(session_with_photos): + session, photos = session_with_photos + service = PhotoService(session) + existing_photo = photos[0] + hash_to_find = existing_photo.photo_hash # "hash1" + diary_id = existing_photo.fk_travel_diary_id # 1 + found_photo = service.check_photo_by_hash(hash_to_find, diary_id) + assert found_photo is not None + assert found_photo.id == existing_photo.id + assert found_photo.photo_hash == hash_to_find + +def test_check_photo_by_hash_returns_none_when_not_found(session_with_photos): + session, photos = session_with_photos + service = PhotoService(session) + existing_hash = photos[0].photo_hash # "hash1" + existing_diary_id = photos[0].fk_travel_diary_id # 1 + result1 = service.check_photo_by_hash("hash_inexistente", existing_diary_id) + 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